Dashboard › craft › Distillation
83b4f853-4388-4ff2-ad0d-bb8744c686ec["lore_tm_v1_XK4aYfWMJzFaL4EF-reNGh48g0HLTd5GYnxa3pGB8o4","lore_tm_v1_ARwNEBtxQp5B5JSPWiC0YCTzfX7MuBGwOUHDHlP8Irg","lore_tm_v1_k3eAAizxG5quNZ0ttoHApU0XXiyG82fqv2LokbkAdLo","lore_tm_v1_2XUzi-hlUzOvnpSn_5kuXgxg_3PaoybKVhZVRjZk8rU","lore_tm_v1_jPCMaQy1-FpMS18GucSII39wW52sEJ9Gi5waZfwa1UE","lore_tm_v1_6YEWvbCmza2bnXIyGpTIwdQAcBSb6CvQrZZMa17d8aI","lore_tm_v1_0QFZYPDi9rhzBrtSIXMFXMSs58zCVoGBjpnfPlvpQ0o","lore_tm_v1_BJQ5z8tTSAbNZHLLbOTH7j7hDtG8iFDu0itQU-gX_y8","lore_tm_v1_H5gPSyhQvCQsVCzvgt_msbOqtNZ0HCU-BaegkyvD15U","lore_tm_v1_xS_EDzj-MIom_znQ2TyTEzi3jmN7SyGhUZJrkmEwNKk","lore_tm_v1_tG9jsx-r4RdYFG9XQmHCfbfzM6pRpAi4VfPGe_HPr6s","lore_tm_v1_2sXSw69jFmq8hYv-uQ0KBB2Gn2GCpktgHM_IqroGSfY","lore_tm_v1_TSbevQgAZm6B9bK3f1La7Aft64FS1rn8lc0Xdq8h55s","lore_tm_v1_imriINOG02ci7B1CrRiPwqfcsEpYPWnfKLnEt71yJj4","lore_tm_v1_G7N0rGApfFdfGKViS15ag3bZq_zDqRknCc5GcjBytNs","lore_tm_v1_AZ4Z9y5cTJxrp7oq0lAYvRVIUwpTbdMxeTnnK4Dwxx4","lore_tm_v1_QkOFNsuwAcrPIDXNlrAXUoupLrtrmnln996b3hKIbPM","lore_tm_v1_qrnR24d3XsyMtOZd8COJEj8yuiHC76AWOzYiXLySyTc","lore_tm_v1_rUuUOZgptbFpqPJZzAVljmYU8-02eLSzWRZrcUktI24","lore_tm_v1_rxgPKbeGZY8ecm_hX271Q8TrkYn8YgDzoNUXRfiqjeM","lore_tm_v1_03BorMCbV_MLdZPgM3G_X65DOsztO-Hf9GeAHXziwJc","lore_tm_v1_xn4Yd4mnGsI7J5eudY6daohWhgHIxHgoH-PGjD0LT50"]
Date: Sep 8, 2026
src/modules/__tests__/release-revision.js tests getReleaseRevision() and updateReleaseRevision() using canonical request-header Quick links for getsentry/toolkit and SHA 7e5ca7ed5581552de066e2a8bc295b8306be38ac.release-revision.js test coverage requires getReleaseRevision() to accept CRLF bodies and a View check runs URL with or without trailing /, while rejecting URLs missing /checks, links for another repository, decoy/embedded check-runs links outside the canonical header, a Quick links block outside the request header, and a complete request header not at issue start.release-revision.js test coverage requires updateReleaseRevision() to replace only the canonical request-header check-runs SHA and reject replacement SHAs that are uppercase, 39 characters, or 41 characters with error Release revision must be a lowercase 40-character SHA..src/modules/__tests__/details-from-context.js verifies detailsFromContext() parses publish issue publish: getsentry/sentry@21.3.1 with Merge target: custom-branch, returning dry_run: "", merge_target: "custom-branch", path: ".", repo: "sentry", selected targets ["github", "npm[@sentry/node]", "docker[latest]"], and version: "21.3.1".details-from-context.js tests that build-metadata version 4.2.6+sentry1 is accepted; (default) merge target resolves to merge_target: ""; only the canonical request headerβs merge target is used rather than a trailing decoy; and title publish: getsentry/toolkit/packages/cli@1.2.3 resolves to repo: "toolkit", path: "./packages/cli", and version: "1.2.3".details-from-context.js rejects invalid publish titles/inputs: an unexpected space before @version, escaping path ../other, current-directory path segment ./other, unsafe repository identities -toolkit, ., .., __proto__, invalid versions --config and 1.2, a version containing path syntax 1.2.3/other, and missing issue payload (Issue context is not defined).src/publish/__tests__/ contains exactly 3 test files: discover-location.js, resolve-location.js, and resolve-release-revision.js.src/publish/__tests__/discover-location.js requires discoverLocation() to retain input checkout-path { path: "./packages/cli" } when root config is absent (exists: () => false), and, when root config exists, to invoke docker ... getsentry/craft:latest workspace list and resolve exact workspace path ./packages/CLI as { path: ".", workspace: "packages/CLI" }.getWorkspaceNames() must fail closed with Craft workspace discovery returned an invalid workspace list. when Craft returns non-array JSON {} or no output ("\n").src/publish/__tests__/resolve-location.js verifies resolve-location.js rejects empty PUBLISH_ARGS with Invalid publish path., rather than leaking Unexpected end of JSON input; test environment sets CRAFT_WORKSPACE_NAMES: "[]".src/publish/__tests__/resolve-release-revision.js verifies resolve-release-revision.js rejects empty PUBLISH_ARGS and PUBLISH_ISSUE_BODY with Publish input must define a repository., rather than leaking Unexpected end of JSON input..craft.yml always means checkout-path behavior.scripts/generate-publish-issue-title-parser.js generates src/modules/publish-issue-title.js from src/modules/publish-issue-title.peggy with Peggy 5.1.0, CommonJS output, grammar source publish-issue-title.peggy, and allowed start rules PublishIssueTitle, ReleaseRevision, and CheckRunsLinkCount; it formats output with Prettier and regenerates the marked title-grammar block in docs/publish-issue-format.md.node scripts/generate-publish-issue-title-parser.js --check compares generated parser and documentation against current files and errors with The generated publish issue title parser is stale. Run \yarn generate`.orThe generated publish issue title documentation is stale. Run `yarn generate`.` when stale.docs/publish-issue-format.md documents title grammar: publish: , optional getsentry/, repository and optional path suffix using [A-Za-z0-9_.-], and versions using [A-Za-z0-9_.+-]+; title examples are publish: getsentry/sentry@21.3.1 and publish: getsentry/toolkit/packages/cli@1.2.3.., .., __proto__, and segments/identities beginning with -; getsentry/ remains optional for existing issue parsing; build metadata such as 4.2.6+sentry1 is valid.View check runs, then run craft workspace list if root .craft.yml exists; a suffix exactly matching a returned concrete workspace path is a workspace, all other suffixes are checkout paths, and discovery errors with root configuration fail the release.docs/publish-issue-format.md documents that the body must begin with Requested by, required Merge target, and Quick links containing exactly one View changes line followed by exactly one View check runs line for the checkout repository; checked ### Targets entries are skipped, accepted begins CI waiting, ci-ready begins publishing only for open accepted issues with neither ci-pending nor ci-failed, and dry-run enables dry-run mode.package.json defines package publish version 0.0.1, Node 24.0.0, Yarn 1.22.22, generate: node scripts/generate-publish-issue-title-parser.js, check:generated: node scripts/generate-publish-issue-title-parser.js --check, test: yarn check:generated && vitest run, lint: eslint src .github --ignore-pattern '!.github'; dependencies include @actions/core ^2.0.0, @actions/github ^7.0.0, and @sentry/node ^10.0.0.yarn check:generated ran node scripts/generate-publish-issue-title-parser.js --check successfully in 0.58s.yarn check:generated && vitest run --runInBand failed because Vitest v4.1.0 rejects Jest-style option --runInBand (CACError: Unknown option \--runInBand`), under Node v24.0.0`; this was not a test failure.yarn check:generated && vitest run succeeded: 13 test files passed and 86 tests passed; Vitest duration was 2.19s (transform 256ms, import 1.30s, tests 905ms).eslint src .github --ignore-pattern '!.github' in 1.07s.src/modules/publish-issue-title.js is a generated CommonJS parser marked @generated by Peggy 5.1.0; shown file length is 1,417 lines.src/modules/update-issue.js updateTargets() returns if CRAFT_STATE_FILE_PATH is unset or nonexistent; otherwise it concurrently fetches the publish issue and parses the Craft state JSON, uses transformIssueBody() to synchronize target checkboxes from craftState.published, and updates the issue body.transformIssueBody() updates declared targets in TARGETS_SECTION_PARSER_REGEX using TARGETS_PARSER_REGEX, marks each - [x] when craftState.published[targetId] is true, and appends state-file targets absent from the issue body; updateIssue() concurrently updates targets and removes the accepted label.craft/src/utils/publishState.ts security design moved Craftβs resumable publish-state JSON from repository-local .craft-publish-<version>.json to $XDG_STATE_HOME/craft/, falling back to $HOME/.local/state/craft/, because repository-controlled contents or earlier CI steps could prepopulate the old fileβs published set and silently skip publish targets.getPublishStateFilename(version, githubConfig, cwd) used sanitized/lowercased version, owner, and repository fields; with GitHub config it produced publish-state-<owner>-<repo>-<sha1(cwd)[:12]>-<version>.json, while without config it produced publish-state-<sha256(cwd)[:16]>-<version>.json..lore.md, untracked .craft-issue-842-plan.md and .opencode/; current commit was b06435e4f20ff8cb0470de98ee113051978b3d63 (b06435e fix(commit-on-git): Use proper username and pass for) on branch byk/fix/commit-on-repo.d48b906 feat: support concrete release workspaces, 21270a1 feat(config): add release workspaces, ab63572 fix(publish): isolate workspace release state, 98052d9 security(publish): move publish-state file out of repo cwd (#797), and 4e2d8f4 feat(config): add top-level workspaces schema + --workspace selector.craft/src/utils/publishState.ts adds encodeVersionForFilename(version): it retains the sanitized version only when unchanged; otherwise it uses lossless version-${Buffer.from(version).toString('base64url')} encoding.getPublishStateFilename() and getPublishStatePath() add optional workspace?: string; when present, state filenames include workspace-${Buffer.from(workspace).toString('base64url')}- before the encoded version, isolating completed-target state for same-repository, same-version workspace releases.d48b906 feat: support concrete release workspaces reported 9 changed files and 684 insertions/44 deletions: action.yml, docs/src/content/docs/targets/github.md, src/__tests__/action.test.ts, src/__tests__/config.test.ts, src/commands/prepare.ts, src/config.ts, src/schemas/project_config.ts, src/utils/__tests__/publishState.test.ts, and src/utils/publishState.ts.