Dashboard › craft › Distillation
713a93eb-e213-40da-aeeb-2b88ad1bddb2["lore_tm_v1_nHXtfS6EE3foFMoMbruDNJ-63lwgbQ1JQB506dA1O0s","lore_tm_v1_JSPEzGqMJsIZEPJgSh0MpwDF0TgrnNjCSBpDk01StIA","lore_tm_v1_p2lVindWZilTVHF0lpyZKVwaD6kbD3rYQLzZ4t_eVsI","lore_tm_v1_8Z33jzYW1rsUjM-fWy0qWh28JOBtW0ETR7OSEfVXNQo","lore_tm_v1_RbveNKJlnCCGXVliqm9xqNFGiyibyXW6bbIH0DkDX80","lore_tm_v1_6nNK2bfgHaIR0RvCpT88yRErY6cCRaGFsEEF-nOePoQ"]
Date: Aug 28, 2026
default switch case such as throw new Error(\Unknown status: '${status}'`)`.AGENTS.md: Sentry Publish Repository is a GitHub Actions approval system for multi-project releases using Craft; pure CommonJS JavaScript on Node.js 24.0.0.1.22.22 managed through Volta; do not use npm. Commands are 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/ holds shared utilities, src/modules/ reusable core business logic, and src/publish/ GitHub Actions entry points; tests reside in corresponding __tests__/ directories.require/module.exports, while tests use ES Modules import/export; imports are ordered Node built-ins, external packages, then local modules.yarn prettier before committing; use descriptive errors and early guard clauses; check file existence with fs.existsSync(CRAFT_STATE_FILE_PATH) before reading.v4.0.0 with globals enabled and mocks auto-cleared between tests; mock dependencies using vi.mock(...) before requiring the module under test; inline snapshots may use toMatchInlineSnapshot.AGENTS.md: @actions/core, @actions/github, and @sentry/node; parallel async work via await Promise.all([operation1(), operation2()]), object destructuring, spread-object merging, template literals, and named-group regular expressions..github/workflows/ci-poller.yml identified CI polling logic that extracts a 40-character SHA from issue-body check-run links, retrieves check suites and paginated check runs, adds ci-ready on passing CI, and posts failure comments instructing users to re-add accepted after fixing CI..github/workflows/ci-poller.yml parses a publish issue title into repo (only the first owner/repo segments, intentionally excluding monorepo path suffixes) and version; malformed values emit a warning and skip the issue.issue_sha from a https://github.com/{owner}/{repo}/commit/{SHA}/checks/ issue-body link. If absent, it warns and skips the issue.repos/${repo}/commits/${issue_sha}/check-suites using .check_suites[0].head_branch // empty, then resolves the branch HEAD from repos/${repo}/git/ref/heads/${branch} using .object.sha; both failures are non-fatal and fall back to issue_sha.issue_sha with resolved sha throughout the issue body via updated_body="${body//${issue_sha}/${sha}}" and updates the issue with gh issue edit "$number" -R "$GITHUB_REPOSITORY" --body "$updated_body".repos/${repo}/commits/${sha}/status and all check runs from repos/${repo}/commits/${sha}/check-runs using gh_api_release --paginate ... --jq '.check_runs[]'; API failures skip the issue rather than deriving state from partial data.total_statuses, total_checks, pending_checks, and unsuccessful_checks. Successful check conclusions are success, neutral, and skipped; other completed conclusionsβincluding failure, cancelled, timed_out, action_required, stale, and startup_failureβare unsuccessful.total_checks and total_statuses are 0. CI is ready only when commit status is success or there are no commit statuses, all check runs are completed, and there are no unsuccessful check runs.ci-pending, adds ci-ready, and comments: CI checks passed for ${repo}@${version}. Publishing is starting now. It polls only issues carrying both ci-pending and accepted, so adding ci-ready starts publishing.ci-pending and accepted, adds ci-failed, and comments with failed check names, a check-runs URL for ${sha}, and instructions to re-add accepted once CI is fixed. A separate branch handles failed combined commit statuses when all check runs passed.package.json; untracked pnpm-lock.yaml, src/modules/__tests__/publish-location.js, src/modules/publish-issue-title.js, src/modules/publish-issue-title.peggy, src/modules/publish-location.js, and src/publish/resolve-location.js.package.json defines package publish version 0.0.1, private, Apache-2.0, description Approval-based publishing system for Sentry, repository git@github.com:getsentry/publish.git, author Sentry Open Source <oss@sentry.io>.package.json Volta pins Node.js 24.0.0 and Yarn 1.22.22; resolution undici: "^6.23.0"; scripts are test: "vitest run", test:watch: "vitest", lint: "eslint src .github --ignore-pattern '!.github'", and prettier: "prettier --write src".package.json devDependencies are eslint "^8.9.0", eslint-config-prettier "^8.3.0", eslint-plugin-yml "^0.13.0", peggy "5.1.0", prettier "^2.2.1", and vitest "^4.1.0"; dependencies are @actions/core "^2.0.0", @actions/github "^7.0.0", and @sentry/node "^10.0.0".src/modules/details-from-context.js parses issue titles with titleParser, accepting publish: titles for an optional getsentry/ prefix, repo [A-Za-z0-9_.-]+, optional path \/[\w./-]+, optional workspace syntax [workspace: "<JSON string>"], and version [\w.+-]+; invalid titles throw Invalid publish issue title: '${context.payload.issue.title}'.detailsFromContext({ context }), absent context.payload.issue throws Issue context is not defined. Workspace JSON is parsed from the title; malformed JSON throws Invalid publish workspace JSON in title: '${context.payload.issue.title}', and empty workspaces or those containing Unicode Cc, Cf, Zl, or Zp characters throw Workspace names must be nonempty and cannot contain Unicode control, format, or separator characters.detailsFromContext determines dry_run as "1" when an issue label is named dry-run, otherwise ""; sets path to "." + (titleDetails.path || ""); and rejects paths whose /-split segments include .. with Invalid publish issue path: '${path}'.detailsFromContext parses optional body line Merge target: (?<merge_target>[\w.\-/]+) into merge_target, extracts checked target IDs from the issue-body Targets section using TARGETS_SECTION_PARSER_REGEX and CHECKED_TARGETS_PARSER_REGEX, and returns repo, optional title path, version, dry_run, merge_target, normalized path, targets, plus workspace only when nonempty.