Dashboard › craft › Distillation
c77ff864-f3eb-4119-be2b-88d49d076ce5["lore_tm_v1_zhlw7P2CzJH3_-TkTJ5GXIt1UqaoSinmEQlEeGltYxw","lore_tm_v1_gnfYlvdHki2-pfja6KiUlsxmhitobihKUs1vH9qcOgA","lore_tm_v1_6mPI4qpXfzmTn0maqB043OT6V0lIl-BtsDVPQ6vXdgc","lore_tm_v1_iGyMF5EUMUhmUOX0Pn1SZ6nXHuhCwr5a0Qfn03dPiJU","lore_tm_v1_xmqqcGxj-tf1SNmdSn6lukSjszRLaTCuZ4N3s5_nQXk","lore_tm_v1_E2hcKEM8mZlJafW1FLpoloqzJOIxuhMVGe4WIFmV_Nk","lore_tm_v1_pnpw2XN4bko38U8SSbSU_oaRPQvkdg6whD-3FQ0GdEU","lore_tm_v1_ub1Jq7zapUzkIO6Z5T3RNndUNbEBPB5iihF0frk6fdw","lore_tm_v1_XhC_OPzHoTkjlWe_qztsukqUzNG6Efyr8oRtpzvdY5A","lore_tm_v1_o9jloYXP82jDygCvMEzXyxt_2vZ8prMSQTo6l1LKR_o","lore_tm_v1_H04sDlfKJB3PeWFy8o_c7YPXRym7oRxtaAcyNQ7hhZg","lore_tm_v1_k9hlZtpeKn8AWciSE6ZGiZlc10dzww9PqBV458YqCHU","lore_tm_v1_M1I4J68evco4cSoJ-xIwpruAvobYfyQ44t4O5EL3qt0"]
Date: Sep 8, 2026
src/modules/publish-location.js defines resolvePublishLocation({ path, workspaceNames }): validates path via isPublishPath() and every workspace name via isWorkspaceName(); path "." resolves to { path: "." }; a ./<workspace> path exactly included in workspaceNames resolves to { path: ".", workspace }; other valid paths remain checkout paths. Invalid paths throw "Invalid publish path."; invalid discovery results throw "Craft workspace discovery returned an invalid workspace list."src/modules/publish-location.js accepts publish paths only as "." or "./" plus slash-separated safe workspace segments. Safe workspace segments match /^[A-Za-z0-9_.-]+$/, cannot be ., .., or __proto__, and cannot begin with -; the same segment rules apply to discovered workspace names.src/modules/publish-issue-validation.js defines isPublishRepository(name) with safe-token validation /^[A-Za-z0-9_.-]+$/, excluding ., .., __proto__, and names beginning -. isReleaseVersion(version) validates semantic versions using ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-?([0-9a-z-]+(?:\.[0-9a-z-]+)*))?(?:\+([0-9a-z-]+(?:\.[0-9a-z-]+)*))?$ case-insensitively..github/workflows/test.yml uses actions/checkout@v6 at line 19; .github/workflows/publish.yml uses actions/checkout@v7 at lines 120 and 159; .github/workflows/ci-poller.yml uses actions/checkout@v7 at line 52; .github/workflows/auto-approve.yml uses actions/checkout@v4 at line 16.src/modules/__tests__/publish-workflow.js tests workflow ordering: "Resolve CI-approved release revision" precedes "Inform start", "Check out target repo", "Resolve publish location", "Set targets", and "Publish using Craft"; target checkout uses ref: ${{ steps.release-revision.outputs.revision }}; exactly 2 actions/checkout@v7 occurrences; publish invokes node .__publish__/src/publish/discover-location.js, uses PUBLISH_REPOSITORY_DIRECTORY: __repo__, and does not use getsentry/craft:2.31.0.publish-workflow.js verifies Craft handoffs use CRAFT_PUBLISH_PATH: ${{ fromJSON(steps.location.outputs.result).path }}, CRAFT_PUBLISH_WORKSPACE: ${{ fromJSON(steps.location.outputs.result).workspace || '' }}, and craft publish ${{ fromJSON(steps.inputs.outputs.result).version }} --rev ${{ steps.release-revision.outputs.revision }}.publish-workflow.js verifies publishing triggers only on a fresh ci-ready label event with accepted and ci-ready labels present and neither ci-pending nor ci-failed present.publish-workflow.js executable Set targets harness runs its extracted Bash script with CRAFT_PUBLISH_PATH, CRAFT_PUBLISH_REPO, CRAFT_PUBLISH_TARGETS_JSON='["github"]', CRAFT_PUBLISH_VERSION, optional CRAFT_PUBLISH_WORKSPACE, GITHUB_OUTPUT, and a temporary GITHUB_WORKSPACE; cleanup recursively deletes all test temporary directories after each test.publish-workflow.js verifies root releases use legacy Craft state filename .craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json and state {"published":{"github":true}}.publish-workflow.js verifies monorepo workspace ./packages/cli, resolved from workspace list ["packages/cli"], uses .craft-state/craft/publish-state-getsentry-toolkit-c232c383e26f-workspace-cGFja2FnZXMvY2xp-1.2.3.json and state {"published":{"github":true}}.publish-workflow.js verifies case-distinct versions 4.2.6+sentry1 and 4.2.6+Sentry1 do not collide: their paths end respectively -version-NC4yLjYrc2VudHJ5MQ.json and -version-NC4yLjYrU2VudHJ5MQ.json..github/workflows/ci-poller.yml, .github/workflows/publish.yml, docs/publish-issue-format.md, scripts/generate-publish-issue-title-parser.js, src/modules/__tests__/details-from-context.js, src/modules/__tests__/publish-workflow.js, src/modules/__tests__/release-revision.js, src/modules/details-from-context.js, src/modules/publish-issue-title.js, src/modules/publish-issue-title.peggy, src/modules/release-revision.js, src/publish/inputs.js, src/publish/resolve-ci-poller-input.js, src/publish/resolve-location.js; untracked additions were src/modules/__tests__/ci-poller-workflow.js, src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/, and src/publish/discover-location.js.vitest.config.js uses defineConfig with Node environment, globals: true, clearMocks: true, and includes tests matching src/**/__tests__/**/*.js.src/modules/__tests__/ci-poller-input.js tests getCiPollerInput() against revision 7e5ca7ed5581552de066e2a8bc295b8306be38ac and a canonical issue body with Requested by: @byk, Merge target: (default), a toolkit compare link, and exactly one check-runs URL https://github.com/getsentry/toolkit/commit/<REVISION>/checks/.ci-poller-input.js verifies root and full-path titles resolve to { repo: "getsentry/toolkit", revision: "7e5ca7ed5581552de066e2a8bc295b8306be38ac", version: "1.2.3" }: publish: getsentry/toolkit/cli@1.2.3 and publish: toolkit/packages/cli/v2@1.2.3.ci-poller-input.js verifies .github/workflows/ci-poller.yml checks out the publish controller at path: .__publish__ and invokes node .__publish__/src/publish/resolve-ci-poller-input.js; it must not contain grep -oP '(?<=commit/.ci-poller-input.js verifies unsafe repository identities -toolkit, ., .., and __proto__ throw "Invalid publish issue repository" before CI API calls; invalid versions --config and 1.2 throw "Invalid publish issue version"; malformed titles publish: getsentry/@1.2.3 and publish: getsentry/toolkit$@1.2.3 throw "Invalid publish issue title"; unsafe paths containing .., ., __proto__, or --config throw "Invalid publish issue path".resolve-location.js is referenced by src/publish/__tests__/resolve-location.js and defines and invokes resolveLocation() in src/publish/resolve-location.js.scripts/generate-publish-issue-title-parser.js reads grammar src/modules/publish-issue-title.peggy, generates CommonJS parser src/modules/publish-issue-title.js with Peggy 5.1.0, and updates generated grammar documentation in docs/publish-issue-format.md."PublishIssueTitle", "ReleaseRevision", and "CheckRunsLinkCount", uses grammarSource: "publish-issue-title.peggy" and output: "source", then formats generated parser output with Prettier.// BEGIN TITLE GRAMMAR and // END TITLE GRAMMAR, requires exactly one <!-- BEGIN GENERATED TITLE GRAMMAR --> / <!-- END GENERATED TITLE GRAMMAR --> marker pair, and replaces its contents with a peggy code block. Missing or invalid markers throw "Could not find the generated title grammar in the documentation."; missing grammar throws "Could not find the publish issue title grammar."--check, scripts/generate-publish-issue-title-parser.js compares generated parser and documentation against committed files; stale parser throws "The generated publish issue title parser is stale. Run \yarn generate`."; stale documentation throws "The generated publish issue title documentation is stale. Run `yarn generate`."; without --check, it writes both artifacts. The module exports generateDocumentation`.src/modules/publish-issue-title.peggy:38-48, with regression coverage in src/modules/__tests__/release-revision.js:116-125./checks/ slash, and exactly one check-runs link in src/modules/release-revision.js:7-29 and src/modules/publish-issue-title.peggy:46-62; regressions are in src/modules/__tests__/release-revision.js:42-113.src/modules/details-from-context.js:54-72 takes the header value rather than a later decoy; regression coverage is src/modules/__tests__/details-from-context.js:108-121.src/modules/publish-issue-title.peggy:50-56 and src/modules/release-revision.js:38-45; regression coverage is src/modules/__tests__/release-revision.js:127-137.jq -e requires a nonempty string before --body-file; per-issue traps clean all temporary files. Relevant workflow locations are .github/workflows/ci-poller.yml:96-103,150-163; executable harness coverage is src/modules/__tests__/ci-poller-workflow.js:152-196.fromJSON consumption in src/publish/inputs.js:5-10, src/publish/discover-location.js:57-71, and .github/workflows/publish.yml:141-185.actions/checkout@v7: .github/workflows/publish.yml:120-123,159-167 and .github/workflows/ci-poller.yml:51-54..github/workflows/publish.yml:108-114,138-174,231-241 and .github/workflows/ci-poller.yml:3-24,308-324.git diff --check a81ab03 passed and there were no staged changes. It did not run full Vitest because workflow tests create and delete temporary files in src/modules/__tests__/ci-poller-workflow.js:40-49,146-150, which the assistant considered incompatible with its read-only audit; it reported passing read-only generated-artifact validation, ESLint, direct parser assertions, and final diff/status verification.