Dashboard › craft › Distillation
d365f7fb-1f80-4e3c-a30c-8cc3d54ab9db["lore_tm_v1_muAFuEI4SFpC1gJLXfYdUaUiz4kbwyYV_mdyt4fzxYM","lore_tm_v1_IMo8O0LO_IqowqCY7aDrWtpCsEbOJPZHq0yTSxiLxJo","lore_tm_v1_-6Bvnj0BNFpRaBZoC6MCrhDal3NNe7uJgjZqZCRRx2o","lore_tm_v1_j6U5lMmDFqnjzVuNlb8RwXbVJZz5AHGZ4oMMoGhMMtQ","lore_tm_v1_SljJI0dQ8pemjRZWOutCloPrnnqfQJLIYmSwAdIuc3I","lore_tm_v1_YxacV_An42ZDzThVQipf9Y7Bg1fJ6mLxFi5XECFpXTE","lore_tm_v1_AoIOM110hBkXaUoAMLB81lp1SCJusbqe0rzQwoqAu-I"]
Date: Aug 28, 2026
ci-ready label after checking CI; waiting-for-ci first removes ci-ready, ensuring a fresh labeled event triggers the publish workflow.src/modules/post-workflow-details.js exports async function postWorkflowDetails({context, octokit}): it obtains publishRepo and runId from context, issue_number from context.payload.issue.number, calls octokit.rest.actions.getWorkflowRun({...publishRepo, run_id}), then creates an issue comment Publishing: [run#${run_id}](${workflowInfo.html_url})..github/workflows/publish.yml is named Publish, runs on issue labeled events, and serializes duplicate publish issues using concurrency.group: ${{ github.event.issue.title }} with cancel-in-progress: false; permissions are contents: read, issues: write, and packages: write..github/workflows/publish.yml job waiting-for-ci runs only for an open issue titled publish: when the added label is accepted; it obtains an internal-app token, removes ci-failed and ci-ready, adds ci-pending, comments either retry-CI or approval/CI-check status, best-effort sets repository variable CI_POLLER_HAS_PENDING=true using a dedicated poller app token, and dispatches ci-poller.yml using the internal app token..github/workflows/publish.yml job publish runs only when an open issue receives a ci-ready label and currently has accepted and ci-ready, but not ci-pending or ci-failed; it has timeout-minutes: 90, checks out the publish repository into .__publish__, uses actions/setup-node@v6 with Node 24 and Yarn caching, then runs yarn install --cwd ".__publish__" and node .__publish__/src/publish/inputs.js.Inform start step runs node .__publish__/src/publish/post-workflow-details.js only after successful input parsing. Its conditional target-checkout branch allowlist includes sentry-migr8/tmp-merge-target; sentry-javascript branches v10, v9, v8, v7, and master; sentry-python/alpha; and sentry-wizard/1.x.Set targets step builds {"published": {...}} from CRAFT_PUBLISH_TARGETS_JSON, validates that realpath -m "/github/workspace/__repo__/$CRAFT_PUBLISH_PATH" remains within /github/workspace/__repo__, hashes the container cwd with SHA-1 truncated to 12 characters, sanitizes owner/repository/version to lowercase [a-z0-9._-], base64url-encodes a nonempty workspace, and writes the Craft state file under $GITHUB_WORKSPACE/.craft-state/craft.docker://getsentry/craft:latest, executes craft publish <version> after changing to __repo__/<path>, pins XDG_STATE_HOME=/github/workspace/.craft-state, passes CRAFT_MERGE_TARGET, CRAFT_DRY_RUN, CRAFT_WORKSPACE, and CRAFT_PUBLISH_STATE_GITHUB_REPO=getsentry/<issue-checkout-repository>; it uses GitHub/Craft/package-publishing credentials via named environment variables including GITHUB_TOKEN, GITHUB_API_TOKEN, NPM_TOKEN, CRATES_IO_TOKEN, and TWINE_PASSWORD (values not recorded).node .__publish__/src/publish/update-issue.js on cancellation or failure with PUBLISH_ARGS and the secure CRAFT_STATE_FILE_PATH; it posts cancellation/failure status with post-result.js cancelled or post-result.js failure, and on success runs post-result.js success to close the issue.github.context: src/publish/update-issue.js, src/publish/post-workflow-details.js, src/publish/post-result.js, and src/publish/inputs.js; inputs.js imports @actions/core, calls the details parser with context: github.context, and uses core.setOutput('result', result).src/modules/__tests__/publish-workflow.js, which reads .github/workflows/publish.yml, extracts its Set targets script, and throws Error("Missing Set targets workflow script") if absent; src/modules/__tests__/update-issue.js documents that the state-file path originates from the workflow’s secure state-file step output; src/modules/__tests__/post-workflow-details.js tests creation of workflow-details comments; and src/modules/__tests__/process-end-state.js includes cancellation-comment expectations..github/workflows/ci-poller.yml parses repository and version from publish: issue titles using sed, with comments describing expected title shape "publish: owner/repo[/path]@version"; .github/workflows/auto-approve.yml similarly extracts REPO from the text between publish: and @.throw new Error(\Unknown status: '${status}'`)`.AGENTS.md describes the repository as the Sentry Publish Repository: a GitHub Actions approval system for Craft-based releases across Sentry projects, implemented as CommonJS JavaScript on Node.js 24.0.0; it requires Yarn classic 1.22.22 and explicitly says not to use npm.AGENTS.md specifies commands: yarn install, yarn test, yarn test:watch, yarn test src/modules/__tests__/update-issue.js, yarn test -t "pattern", yarn lint, and yarn prettier; a file-and-pattern invocation is yarn test src/modules/__tests__/update-issue.js -t "specific test name".AGENTS.md project structure is src/libs/ for shared utilities, src/modules/ for reusable core business logic, and src/publish/ for GitHub Actions entry points; source filenames must be kebab-case, test files belong in __tests__/ and match source names, variables/functions use camelCase, constants/regex patterns use UPPER_SNAKE_CASE, source files use CommonJS, and test files use ES Modules.AGENTS.md coding conventions require import order of Node built-ins, external packages, then local modules; Prettier default formatting with double-quoted strings and required semicolons; and running yarn prettier before commit.AGENTS.md error-handling guidance requires descriptive errors, early guard clauses such as if (!context || !context.payload || !context.payload.issue) { throw new Error("Issue context is not defined"); }, and checking file existence with fs.existsSync(CRAFT_STATE_FILE_PATH) before reading a state file.AGENTS.md testing guidance specifies Vitest v4.0.0 with globals enabled, automatic mock clearing between tests, mocking external dependencies with vi.mock(), and importing the module under test after mocks; key dependencies are @actions/core, @actions/github, and @sentry/node.