Dashboard › cli › Distillation
b6f2b840-61f9-4f0b-9126-cc17563e7e45["lore_tm_v1_dKJYwF3a5-2zczQ81ie7ponk23opKk5YqUAd6ryGGMU","lore_tm_v1_EriLDfLcwyhBfgMIOOYi9vrodhYHxi2tAMHtyl_Dgd4","lore_tm_v1_otAnK1ka_DSIjyGIzcqbTnbBmHr0NSJf2v4hNc2qy6I","lore_tm_v1_sM0YmsnsLuv-v_aI-uv2YdAm4rN0-D6H_vB_FReve6U","lore_tm_v1_lwYiJF_qbKejeDneo_Cq7lt1fRbDrPQW5upKzDXsk7U","lore_tm_v1_7jH6HRgaac_dvn7uMpgzHjSbBOiYe2YKRGOXNsTFXic","lore_tm_v1_KL132qb4vQ6NfPyz9aMcnA_pKqzMbotr-l-n9GuM594","lore_tm_v1_vIwMEd66NYHVyhTE-OI62Wkf7J3etd7_1lj7ZzmMe2Q","lore_tm_v1_L_LjRNM83wRkXliUHXAszsT3KAwS9eUNYRqK0NYVsDk","lore_tm_v1_XvwxOufsEYbr-QGz-6GEbemzKeT0hfaLndk83wDObA4","lore_tm_v1_fpr9g0N5CNQ4MEAJUMHaINS8nvsfbxY4R0HHhadLsag","lore_tm_v1_g77dwyCq7VDsoB9bjxNWHNrpPR1YHGL3dQZXChsQmhM","lore_tm_v1_1JQozvQRpOzEPKDMWYxRbv-sDYKZYZKMuhXHEfROC1g","lore_tm_v1_wv6WHin2oGnTS3YgUTv3sIfdtWvrTqS6OqCf7eh2xYM","lore_tm_v1_Ju8d6CV9LT3JiyIV_omnWq5YryU2Px74x4ldb_rFLtc","lore_tm_v1_tf0IHF8VkX9nKK07Uny9cJyIxiwvIZxdIRpvTwsSCb8","lore_tm_v1_sTCwfASv4PXuXl-6x4elXiuq8cjMcTdw2M_iezyijqQ","lore_tm_v1_Cc1SetGe2O9jimgJBWxrApIvb625MDkv1emiBWTkr-Y"]
docs/src/content/docs/github-actions.md documents two release automation options in order: 1. reusable workflow (recommended for quick setup and standard flow, low flexibility), 2. composite action (for custom workflows and pre/post steps, high flexibility). Reusable-workflow inputs include version, merge_target, force, blocker_label, publish_repo, git_user_name, git_user_email, path, and craft_config_from_merge_target; outputs include version, branch, sha, previous_tag, and changelog.craft changelog --pr <number> --format json, 2. fetch PR title/body/labels/base branch, 3. categorize from labels and commit patterns, 4. suggest major/minor/patch from category semver fields, 5. render the current PR as a blockquote, 6. post a PR comment or a neutral check run plus job summary when comment: false, 7. auto-update on pushed commits, edited title/description, or label changes. Supported PR events are opened, synchronize, reopened, edited, and labeled..craft.yml has minVersion: '2.21.1', automatic changelog and versioning policies, preReleaseCommand: bash -c 'cd packages/cli && node --experimental-strip-types script/bump-version.ts --pre', and the analogous --post command as postReleaseCommand..craft.yml uses GitHub as artifactProvider; its Build artifact patterns are '/^sentry-.*$/', 'npm-package', and 'vercel'. Configured targets, in order, are: 1. npm, 2. github, 3. vercel with projectId: prj_wVkOnIwI3eIQbGD1Gw7qS1MqFFIK, 4. registry for 'app:sentry', and 5. brew..craft.yml registry target identifies 'app:sentry' as Sentry CLI, uses npm package URL https://www.npmjs.com/package/sentry, docs URL https://cli.sentry.dev, release URL template https://github.com/getsentry/cli/releases/download/{{version}}/{{file}}, includes /^sentry-.*\.gz$/, and emits SHA-256 checksums in hex..craft.yml Homebrew target publishes to tap getsentry/tools, formula sentry, path Formula, and includes /^sentry-(darwin|linux)-(arm64|x64)\.gz$/. Its formula supports macOS arm64/x64 and 64-bit Linux arm/x86_64 archives, installs the first sentry-* file as sentry, runs sentry cli setup --method brew --no-modify-path after installation, and tests sentry --version.src/commands/workspace_cmds/list.ts defines command = ['list'], description List defined release workspaces as a JSON array, and prints formatJson(getWorkspaceNames()); src/commands/workspace.ts defines command = ['workspace <command>'], description Manage release workspaces, and registers the list subcommand through yargs.demandCommand().command(list).getsentry/publish repository is public, uses default branch main, and is available at https://github.com/getsentry/publish.getsentry/publish/.github/workflows/publish.yml gates publishing through labels: accepting an open publish: issue resets it by removing ci-failed and ci-ready, then adding ci-pending; the poller checks CI and flips ci-pending to ci-ready.ci-ready after checking CI; waiting-for-ci first removes any existing ci-ready, ensuring a fresh labeled event fires.publish job runs only for an open issue whose triggering label is ci-ready, with accepted and ci-ready present and neither ci-pending nor ci-failed; it has a 90-minute timeout.getsentry/publish/.github/workflows/publish.yml checks out the controller repository to .__publish__, sets up Node 24 with Yarn caching from .__publish__/yarn.lock, parses inputs using .__publish__/src/publish/inputs.js, and resolves the CI-approved revision using .__publish__/src/publish/resolve-release-revision.js.actions/checkout@v7, path __repo__, repository getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, the revision emitted by release-revision, a Release Bot token, and fetch-depth: 0; publish-location discovery runs through .__publish__/src/publish/discover-location.js.$GITHUB_WORKSPACE/.craft-state/craft, with XDG_STATE_HOME: /github/workspace/.craft-state, and verifies the resolved container working directory remains under /github/workspace/__repo__.publish-state-${owner_sanitised}-${repo_sanitised}-${cwd_hash}-${workspace_prefix}${version_component}.json; cwd_hash is the first 12 characters of the SHA-1 of Craftβs container working directory. Workspace names are base64url-encoded into workspace-${workspace_encoded}-, and versions whose sanitized form differs from the original are base64url-encoded as version-${version_encoded}.CRAFT_PUBLISH_STATE_GITHUB_REPO is explicitly set from the publish issueβs checkout identity, getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, rather than from an optional workspace-level GitHub release-repository override.docker://getsentry/craft:latest, changes to __repo__/${{ fromJSON(steps.location.outputs.result).path }}, and executes craft publish <version> --rev <CI-approved revision> with CRAFT_WORKSPACE set from the discovered location.docs/publish-issue-format.md defines canonical titles with Peggy grammar publish: followed by optional getsentry/, a safe repository token, optional slash-separated path suffix, @, and a version; examples are publish: getsentry/sentry@21.3.1 and publish: getsentry/toolkit/packages/cli@1.2.3.[A-Za-z0-9_.-]+, excluding ., .., __proto__, and segments beginning with -; versions permit [A-Za-z0-9_.+-]+, including build metadata such as 4.2.6+sentry1.View check runs link. If the checkout has a root .craft.yml, craft workspace list supplies concrete names and only an exact match is treated as a workspace; every other suffix is treated as a checkout path..craft.yml always means checkout-path behavior. Discovery errors when a root configuration exists fail the release.getsentry/ prefix when parsed, although new Craft requests always include the repository identity..github/workflows/release.yml exposes optional workspace inputs for both workflow_dispatch and workflow_call, described as Named Craft release workspace to prepare and publish, and passes the input to both the local dogfooding action and getsentry/craft@v2.path and workspace as mutually exclusive unless path is .. Both inputs are validated as slash-separated ASCII segments matching /^[A-Za-z0-9_.-]+$/, excluding ., .., __proto__, and hyphen-prefixed names.CRAFT_WORKSPACE before invoking Craft and passes an explicit selected workspace as --workspace=$WORKSPACE to both craft prepare and craft targets.Request publish step constructs titles exactly as publish: ${GITHUB_REPOSITORY}${SUBDIRECTORY}${WORKSPACE:+/$WORKSPACE}@${RESOLVED_VERSION}, where SUBDIRECTORY comes from a non-. path; it resolves publish_repo: self to $GITHUB_REPOSITORY.jq, preserving checked target states when refreshing an existing issue. New issues contain View changes, View check runs, target checkboxes, and instructions to assign the accepted label.steps.craft.outputs.changelog_file to avoid Linux E2BIG; the action truncates changelog content above exactly 60000 characters and appends *Changelog truncated for issue body.*.2.31.0 was published at 2026-09-08T18:17:54Z. (meaning Sep 8, 2026)c8a878c53d937a62124796b39ac00f4d73212fe0, titled feat: support concrete release workspaces, added pre-side-effect workspace validation and threaded workspace selection through prepare, target discovery, publish issue identity, and controller execution; validation reported 60 test files with 1,138 passed and 1 skipped, lint with 0 errors and 7 existing unused-variable warnings, plus passing Prettier and build. It depended on deployment of getsentry/publish#9339. (meaning Sep 8, 2026)21270a1d12a60b461c51fba93bd076b90d9cf4af, titled feat(config): add release workspaces, added selected top-level release workspaces with isolated publish state and safe workspace selection. (meaning Aug 25, 2026)f70d5a83ea63b513de7094071ff63e3ee07f20c6, titled feat: prefix-aware read paths for monorepo multi-product releases (#847), made getLatestTag(git, tagPrefix='') use --match '<prefix>*', taught getVersion/parseVersion to extract versions from tags such as cli@1.2.3, added a configuration-error fallback for standalone craft changelog, and made findReleaseBranches treat release-branch prefixes as opaque strings. Its test result was 1,067 passed and 1 skipped. (meaning Jul 21, 2026)4f9e44769b7a19ef60f4361aa14f24db26f7bb65 (Merge remote-tracking branch 'remotes/origin/release/2.31.0'), 2. 4ff132802394ce7b9418d56d92f85238ffbaad3d (meta: Bump new development version, with #skip-changelog).