Dashboard › craft › Distillation
a66a11cc-be36-465e-9ea0-6b7763b81570["lore_tm_v1_7PI18-zEYIjArHRtfUBLuP5H1PK2Bpm0EACIxOtFSIM","lore_tm_v1_KJVTedtqboCgi8YYJcoWCGyIko932ZkFwybxuDE8vi8","lore_tm_v1_b_0eykCL6Nvci-SPtE0T0yzzoKPgoDOAT40WRaw5mr4","lore_tm_v1_wdAlPC_LLpK0L1ZsSjiEgG2Q3eQ1UQsNQGjZ4EpABbE","lore_tm_v1_-qZ7iPL_0_bt_foUfwi9O58XUg7ilHgAQXrOGNKCgfQ","lore_tm_v1_RhLrNlP52ZFOsfoShgp_AIkZgL0dCI_wU3VrLCP0Suk","lore_tm_v1_VJTAuQnP0keaK_o00nD46ph0IQA2n5WHI433h7k1c1Q","lore_tm_v1_cqsrI9toTr9lrJwTMzIT3_DY2GJsxpQZZ1Xf4satBkQ"]
Date: Aug 29, 2026
getsentry/craft:2.30.1 locally, digest sha256:9a4a5d5efa44a00c2215078ead39800d4aaa5a97908b94f45a64d7d506d6e14b. Running Craft without a project configuration failed with Error: Cannot find Craft configuration file. Have you added ".craft.yml" to your project?; Node emitted deprecation warnings DEP0040 for punycode and DEP0169 for url.parse().getsentry/craft:2.30.1 is locally available and intended to verify its actual --rev behavior, tightening controller boundaries only if the older image satisfies the CI-pinned-revision contract.AGENTS.md states this is the Sentry Publish Repository: a GitHub Actions-based approval system for publishing releases across Sentry projects using Craft; it is pure CommonJS JavaScript targeting Node.js 24.0.0.1.22.22 via Volta as pinned in package.json; 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 __tests__/ subdirectories.__tests__/; camelCase variables/functions; UPPER_SNAKE_CASE constants/regexes; CommonJS require/module.exports source modules; ES Modules test files; import order is Node built-ins, external packages, then local modules.yarn prettier before committing.default switch branch such as throw new Error(\Unknown status: '${status}'`)`.if (!fs.existsSync(CRAFT_STATE_FILE_PATH)) { return; }.v4.0.0 with globals enabled; mocks auto-clear between tests. Tests may use vi.mock(...), and modules under test should be imported after mocks..github/workflows/publish.yml, docs/publish-issue-format.md, package.json, src/modules/__tests__/publish-workflow.js, src/modules/details-from-context.js, src/modules/post-workflow-details.js, src/publish/inputs.js, and yarn.lock.pnpm-lock.yaml, scripts/, src/modules/__tests__/publish-location.js, src/modules/__tests__/release-revision.js, src/modules/publish-issue-title.js, src/modules/publish-issue-title.peggy, src/modules/publish-location.js, src/modules/release-revision.js, src/publish/resolve-location.js, and src/publish/resolve-release-revision.js..github/workflows/publish.yml (62 lines), docs/publish-issue-format.md (55), package.json (4), src/modules/__tests__/publish-workflow.js (38), src/modules/details-from-context.js (16), src/modules/post-workflow-details.js (2), src/publish/inputs.js (2), and yarn.lock (31).^[A-Za-z0-9_.-]+$; Craft preserves their exact spelling and the controller never normalizes names.View check runs link. If that checkout has root .craft.yml, craft workspace list supplies exact workspace keys; an exact matching suffix is a workspace, every other suffix is a checkout path..craft.yml always means checkout-path behavior; discovery errors when root configuration exists fail the release.] before @; unqualified titles have no space before @.getsentry/ optional for existing issues; paths must not contain a .. segment. Legacy JSON workspace strings must decode to nonempty names without Unicode control (Cc), format (Cf), line-separator (Zl), or paragraph-separator (Zp) characters.src/modules/__tests__/publish-workflow.js changed getSetTargetsScript() to obtain YAML via getWorkflow() and now match controller Craft image docker://getsentry/craft:2.31.0; tests also assert CRAFT_PUBLISH_WORKSPACE: ${{ fromJSON(steps.location.outputs.result).workspace || '' }} and craft publish ${{ fromJSON(steps.inputs.outputs.result).version }} --rev ${{ steps.release-revision.outputs.revision }}.src/modules/details-from-context.js now parses issue titles through parsePublishIssueTitle(context.payload.issue.title), converts parser failures into Invalid publish issue title: '<title>', extracts { workspace: workspaceJson, ...parsedTitleDetails }, and computes path as "." + parsedTitleDetails.path before rejecting paths containing ...