Dashboard › craft › Distillation
cdbb52ad-a087-4155-bf5a-6338bff839fa["lore_tm_v1_uP2lXXoL3JgsgUpP39m8eLmKZrCGuJBNnEVtTKJI_ak","lore_tm_v1_Za5Jlf7P-66WImlyK0Z4ie9nSUOyCSPxNZ-oTW7fCEI","lore_tm_v1_f-xFxWrYrVOIWiNo6Y7y7Fo4qyODjsI_NAM5C4dsbvA","lore_tm_v1_jK3JGb65_f3WeN6KXQEb1N5eFhCEy5CzTRwIgxjOs0g","lore_tm_v1_d7yLIOTjjg-Zlx8D2zqgdojPguoJHt5zUlb-H6aiQUk","lore_tm_v1_y3aByLgSabRJ5aK79w_pZuMBy9p_Hpnt7kyfj6M8gyo","lore_tm_v1_eDf3MqgyxexXLr_vRD51abVT5Gm7EsGOHXe2LQd3ZV8","lore_tm_v1_8DInOUhq-UvHE7LQJCn0wSuHOV0PB6-73_tovCz8woI","lore_tm_v1_Ga57qJ9GHT3Fa34yglhEApoLsejhWVTAr8mo7op28ZQ"]
Date: Sep 8, 2026
default branch in switch statements that throws descriptive errors such as Unknown status: '${status}'./home/byk/Code/getsentry/publish-workspace-acceptance/AGENTS.md: Sentry Publish Repository is a GitHub Actions approval system for publishing releases across multiple Sentry projects using Craft; it is pure CommonJS JavaScript on Node.js 24.0.0.yarn install, yarn test, yarn test:watch, yarn test src/modules/__tests__/update-issue.js, yarn test -t "pattern", yarn lint, and yarn prettier.src/libs/ for shared utilities, src/modules/ for reusable business logic, and src/publish/ for GitHub Actions entry points; source files use kebab-case and corresponding tests reside in __tests__/.require/module.exports), test files use ES Modules (import/export); import order is Node built-ins, external packages, then local modules; strings use double quotes and semicolons are required.@actions/core, @actions/github, and @sentry/node; all code is owned by @getsentry/releng..github/workflows/ci-poller.yml, .github/workflows/publish.yml, docs/publish-issue-format.md, src/modules/publish-issue-title.js, and src/modules/release-revision.js.src/modules/publish-issue-title.peggy is the canonical grammar source. PublishIssueTitle accepts publish: , an optional getsentry/ prefix, repo:Repository, optional path:Path, @, and version:Version, then requires end-of-input; it returns { repo, path: path || "", version }.Repository and each PathSegment allow [A-Za-z0-9_.-]+; Path is one or more slash-prefixed segments and preserves the complete suffix; Version allows [A-Za-z0-9_.+-]+. Grammar comments specify that the path suffix is syntactic only and the controller resolves the full suffix as a workspace after checkout of the CI-approved revision.src/modules/publish-issue-title.peggy defines ReleaseRevision, which parses only a RequestHeader at the body start followed by .*; the required header sequence is Requested by: @<non-newline>, blank lines, indented Merge target: <non-newline>, blank lines, indented Quick links:, blank lines, indented - [View changes](<link destination>), then indented - [View check runs](https://github.com/getsentry/<repo>/commit/<revision>/checks/?).ReleaseRevision grammar accepts both \r\n and \n; permits spaces/tabs through Indent; requires check-runs revision to be lowercase [0-9a-f]+ with exactly length 40; returns revision { value, start, end } offsets for precise replacement; check-runs link may end at a newline or EOF.CheckRunsLinkCount grammar parses all body lines and counts lines whose content starts exactly with - [View check runs](, protecting against appended decoy links.src/modules/release-revision.js imports parse from ./publish-issue-title. getReleaseRevisionDetails({ issueBody, repo }) first parses with startRule: "CheckRunsLinkCount" and requires exactly 1, otherwise throws Expected exactly one View check runs link in Quick links for getsentry/${repo}..src/modules/release-revision.js, getReleaseRevisionDetails() then parses issueBody with startRule: "ReleaseRevision"; parse failures and repository mismatches (details.repo !== repo) both throw Expected a View check runs link for getsentry/${repo} in the publish issue body..getReleaseRevision({ issueBody, repo }) returns getReleaseRevisionDetails(...).revision.value; updateReleaseRevision({ issueBody, repo, revision }) validates and updates only the canonical parsed revision span via issueBody.slice(0, currentRevision.start) + revision + issueBody.slice(currentRevision.end).src/publish/resolve-release-revision.js, src/publish/__tests__/resolve-release-revision.js, src/modules/ci-poller-input.js, src/modules/__tests__/release-revision.js, and src/modules/__tests__/publish-workflow.js. ci-poller-input.js uses getReleaseRevision({ issueBody, repo }) and conditionally uses updateReleaseRevision({ issueBody, repo, revision }).scripts/generate-publish-issue-title-parser.js uses src/modules/publish-issue-title.peggy, outputs src/modules/publish-issue-title.js, and references docs/publish-issue-format.md; package.json provides generate: "node scripts/generate-publish-issue-title-parser.js" and check:generated: "node scripts/generate-publish-issue-title-parser.js --check".src/publish/discover-location.js uses resolvePublishLocation from ../modules/publish-location; getWorkspaceNames() returns [] when <repositoryDirectory>/.craft.yml does not exist..craft.yml exists, getWorkspaceNames() runs docker run --rm --volume ${path.resolve(repositoryDirectory)}:/github/workspace/__repo__ --workdir /github/workspace/__repo__ getsentry/craft:latest workspace list with { encoding: "utf8" }, parses its JSON output, and throws Craft workspace discovery returned an invalid workspace list. unless it is an array.discoverLocation({ input, repositoryDirectory, exists, execFile }) resolves input.path against workspace names. main() parses process.env.PUBLISH_ARGS || "{}", requires input.path or throws Publish input must define a path., and serializes the resolved result with JSON.stringify to GitHub Actions output result; repository directory defaults to process.env.PUBLISH_REPOSITORY_DIRECTORY || "__repo__".src/publish/__tests__/ contains discover-location.js, resolve-location.js, and resolve-release-revision.js.