Dashboard › craft › Distillation
2e7fdbb6-0577-4762-89c3-c7ea51100f6e["lore_tm_v1_WEAWr0s0WAmzw5crBivxJ81XSEYJFPj-xe9iaXLYojo","lore_tm_v1_uALuc8l3TXq40IyEYd1BTvtWPQ1OXiZUiX9v-GmAnnk"]
Date: Sep 3, 2026
.craft.yml always means checkout-path behavior.pnpm for package management; never use npm or yarn.pnpm install --frozen-lockfile..github/workflows/publish.yml changed workspace discovery to run whenever __repo__/.craft.yml exists, removing the needsWorkspaceDiscovery(input) Node check and its requires_workspace_discovery conditional; workspace_names still defaults to '[]'.docs/publish-issue-format.md canonical title EBNF removed legacy-workspace = " [workspace: ", json-string, "] "; titles are now publish: , optional getsentry/, repository, optional slash path, @, version. Workspace releases use full concrete path suffixes, e.g. publish: getsentry/toolkit/packages/cli@1.2.3, rather than compact publish: getsentry/toolkit/cli@1.2.3.docs/publish-issue-format.md specifies title workspace-path segments match [A-Za-z0-9_.-]+; after checkout of the CI-approved revision, craft workspace list supplies exact concrete workspace paths; an exact suffix match is classified as a workspace and any other suffix remains a checkout path. Legacy JSON-qualified workspace titles were removed from compatibility documentation.src/modules/publish-issue-title.peggy and generated src/modules/publish-issue-title.js removed parsing and returned fields for legacy [workspace: "<JSON>"] title syntax, including LegacyWorkspace, JsonString, and JsonCharacter; grammar now parses only repository, optional path, and version.src/modules/details-from-context.js removed legacy workspace JSON parsing, JSON error handling, Unicode-control/format/separator workspace validation, and the prohibition on explicit workspaces with non-root checkout paths. It now derives path as "." + titleDetails.path, still rejects paths containing .., and returns ...titleDetails, dry_run, merge_target, path, and targets.src/modules/publish-location.js removed needsWorkspaceDiscovery() and explicit workspace handling. resolvePublishLocation({ path, workspaceNames }) keeps root path === "." as root; otherwise strips ./ and classifies the entire remaining path as a workspace only if exactly present in workspaceNames, returning { path: ".", workspace }; nonmatches remain checkout paths.src/modules/publish-location.js isWorkspaceName() now accepts slash-delimited ASCII segments using /^(?:[A-Za-z0-9_.-]+\/)*[A-Za-z0-9_.-]+$/, still rejects empty names, __proto__, ., .., and any path containing a .. segment.src/publish/resolve-location.js now always parses CRAFT_WORKSPACE_NAMES (default "") as JSON and passes it with input.path to resolvePublishLocation; it no longer conditionally discovers names or passes input.workspace.src/modules/__tests__/ci-poller-input.js renamed coverage from “compact and legacy workspace publish titles” to “root and full-path publish titles”; it now parses publish: toolkit/packages/cli/v2@1.2.3.src/modules/__tests__/details-from-context.js now verifies publish: getsentry/toolkit/packages/cli@1.2.3 yields repo: "toolkit", version: "1.2.3", and path: "./packages/cli"; removed tests for legacy workspace parsing, root-only legacy workspaces, JSON escapes, safe Unicode workspaces, malformed JSON, and unsafe Unicode workspace values.src/modules/__tests__/publish-location.js changed classification coverage to exact full workspace path ./packages/CLI matched against ["packages/cli", "packages/CLI"], returning { path: ".", workspace: "packages/CLI" }; it verifies an inexact multi-segment suffix remains a checkout path and rejects invalid discovered workspace names cli-日本語, ., .., and packages/../cli.src/modules/__tests__/publish-workflow.js now expects workflow discovery conditional if [[ -f __repo__/.craft.yml ]]; then; monorepo state-file coverage uses path: "./packages/cli" and workspaceNames: ["packages/cli"], expecting workspace state filename suffix workspace-cGFja2FnZXMvY2xp-1\.2\.3\.json (base64 for packages/cli).src/modules/post-workflow-details.js and src/publish/inputs.js: standardized spacing/quotes and restored trailing newlines; functional behavior remains postWorkflowDetails export and inputs() calling detailsFromContext, then core.setOutput("result", result).src/__tests__/ with *.test.ts; run tests via pnpm test; use vi.fn(), vi.mock(), and vi.spyOn() for mocks. Build/run command: pnpm build && ./dist/craft.--dry-run prevents destructive operations through a centralized abstraction layer; ESLint no-restricted-imports blocks direct simple-git imports and no-restricted-syntax blocks new Octokit() instantiation.