Dashboard › craft › Distillation
30a3294b-d39c-4993-aa3b-18df6154a295["lore_tm_v1_HuxyAeP1MVUOF1vZfIorHaezF52ArXL9njw8nEENORw","lore_tm_v1_S787L2xcsWHJ9PgKYvQHUJewBuxnC1HLoXGClfmW52k","lore_tm_v1_Zr29TrGUSpjQta_oVMXCOKkU8qpplXDL1ggUyuc7szo","lore_tm_v1_qLvxV23ab2usqSyrQ47Nsotpn3PlAptrT_kj7pifTj8","lore_tm_v1_nEVOGeae57VuMkLoDCplENXS_FZTXSHeJnK8pqww5IE"]
Date: Sep 3, 2026
src/modules/__tests__/details-from-context.js completes unsafe legacy-workspace coverage: paragraph separator title publish: getsentry/toolkit [workspace: "cli\\u2029next"] @1.2.3, along with empty, multiline, NUL, tab, bidi-format, and line-separator workspace cases, must each reject with "Workspace names must be nonempty and cannot contain Unicode control, format, or separator characters".details-from-context.js tests that title publish: getsentry/toolkit/../other@1.2.3 rejects with "Invalid publish issue path"; calling detailsFromContext({ context: {} }) rejects with "Issue context is not defined".src/modules/__tests__/publish-location.js tests needsWorkspaceDiscovery(input): { path: "./cli" } → true; { path: "./packages/cli" } → false; { path: "." } → false; { path: "./cli", workspace: "cli" } → false.publish-location.js tests exact, case-sensitive one-segment workspace resolution without normalization: resolvePublishLocation({ path: "./CLI", workspaceNames: ["cli", "CLI"] }) returns { path: ".", workspace: "CLI" }.publish-location.js tests that non-workspace suffix { path: "./packages", workspaceNames: ["cli"] } remains { path: "./packages" }; multi-segment { path: "./packages/cli", workspaceNames: ["cli"] } remains { path: "./packages/cli" }; and root { path: ".", workspaceNames: ["cli"] } remains { path: "." }.publish-location.js preserves legacy explicit workspace resolution: { path: ".", workspace: "cli/v2", workspaceNames: [] } returns { path: ".", workspace: "cli/v2" }; legacy explicit workspace discovery results are not validated, so the same input with workspaceNames: ["invalid/workspace"] still returns { path: ".", workspace: "cli/v2" }.publish-location.js tests that explicit workspace { path: "./packages/cli", workspace: "cli/v2", workspaceNames: [] } throws "A publish workspace must use the repository root path.".publish-location.js tests invalid discovered workspace names: { path: "./cli", workspaceNames: ["cli-日本語"] } throws "Craft workspace discovery returned an invalid workspace list"; traversal workspace names "." and ".." each throw "Craft workspace discovery returned an invalid workspace list.".scripts/generate-publish-issue-title-parser.js reads src/modules/publish-issue-title.peggy, generates CommonJS source with peggy.generate() using grammarSource: "publish-issue-title.peggy" and output: "source", prepends /* eslint-disable */, formats with Prettier using filepath: src/modules/publish-issue-title.js, and writes that generated parser to src/modules/publish-issue-title.js.--check: it compares the generated source with src/modules/publish-issue-title.js and throws "The generated publish issue title parser is stale. Run \yarn generate`."` if they differ.docs/publish-issue-format.md defines canonical title EBNF: title = "publish: ", [ "getsentry/" ], repository, [ path ], [ legacy-workspace ], "@", version; repository/path segments use ASCII letters, digits, ., _, or -; versions additionally allow +; legacy workspace syntax is " [workspace: ", json-string, "] ".publish: getsentry/sentry@21.3.1 for a root release and publish: getsentry/toolkit/cli@1.2.3 for a root-workspace release. New-title workspace names must match ^[A-Za-z0-9_.-]+$ and preserve exact spelling.View check runs link. If checkout root has .craft.yml, craft workspace list provides exact workspace keys; only an exact one-segment suffix match becomes a workspace, otherwise it remains a checkout path. Missing root .craft.yml always means checkout-path behavior; discovery errors with root configuration fail the release.publish: getsentry/toolkit [workspace: "cli/v2"] @1.2.3 and publish: getsentry/toolkit [workspace: "cli [preview] \"next\""] @1.2.3; they must use repository root path. Decoded names must be nonempty and exclude Unicode categories Cc, Cf, Zl, and Zp; legacy titles require one space between ] and @, while unqualified titles have none.getsentry/ is optional when parsing existing publish issues, and paths cannot contain a .. segment.Requested by: @<actor>, optional Merge target: <branch-or-(default)>, and Quick links: containing exactly one [View changes](compare-url) followed by exactly one [View check runs](checks-url) for the checkout repository. (default) selects the target repository default branch; permitted explicit branch characters are letters, digits, _, ., /, and -.- [x] <target-id> entries in ### Targets; Craft preserves checked entries when refreshing requests. After failure, controller updates checkboxes from the secure Craft publish-state file; checked targets are skipped on retry unless manually unchecked.accepted starts publishing and dry-run enables dry-run mode.README.md match at line 49: calendar versioning is enabled by adding specified configuration to .craft.yml.