Dashboard › craft › Distillation
86c55b13-66d3-40be-852c-da4f19e2c809["lore_tm_v1_GsYUma84hJw1mAFN8zCGxdYBwCa-hkk13ruYQD6ZpEg","lore_tm_v1_7nKbgnk6jEueZbeneVIb1cvFpKJiIbqX0FjQcSma34A","lore_tm_v1_nk-HmsewElggllc0bxH9Zz4i0hnxCKjVyl4BnD-3ICc","lore_tm_v1_vGLCUMKmW9hIVyddXqvzQPEc8akh50rbOBpyncd9zAU","lore_tm_v1_6H05qkv7oMhabv2UgCraCQNE92joWMaie63XJZ9hwm8","lore_tm_v1_O7UJdQeIBGFliHJvtmVW5xj6jheb3vOUgiCHep3UuUE","lore_tm_v1_q3D8-_oCx-4rIxUVmoaqdnKqBkemxg7LvrCSOtDi4JY","lore_tm_v1_GUj4GLPqZJHKSDJufjGS2lB9aLXdGVLHypA8QbpDz9w","lore_tm_v1_VvVsDmTvKyiJqDn7Kz07VWu4YapEkjd6MxK7MKqQOf8","lore_tm_v1_prYv5rjCFxK-yqDWENMQjJBv3nQ8eIpPjTzuXYzmZXU"]
Date: Aug 29, 2026
src/modules/publish-location.js defines needsWorkspaceDiscovery({ path, workspace }) as true only when no explicit workspace exists and path matches ^\\./[A-Za-z0-9_.-]+$; resolvePublishLocation({ path, workspace, workspaceNames }) preserves explicit { path, workspace }, otherwise only performs discovery for that one-segment path form.resolvePublishLocation() validates every discovered workspace name before matching; invalid lists throw Craft workspace discovery returned an invalid workspace list. Exact one-segment matches return { path: ".", workspace: segments[0] }; nonmatches and non-discovery paths return { path }.isWorkspaceName(name) in src/modules/publish-location.js requires a string matching ^[A-Za-z0-9_.-]+$ and explicitly rejects __proto__.src/modules/release-revision.js exports getReleaseRevision({ issueBody, repo }), which extracts the exact lowercase 40-hex revision from a multiline - [View check runs](https://github.com/getsentry/<repo>/commit/<revision>/checks/?) link. It accepts LF or CRLF line endings and throws Expected a View check runs link for getsentry/${repo} in the publish issue body. if no matching repository link exists.src/publish/resolve-release-revision.js parses process.env.PUBLISH_ARGS, calls getReleaseRevision() with repo and process.env.PUBLISH_ISSUE_BODY || "", and writes the result through core.setOutput("revision", ...).src/publish/resolve-location.js parses PUBLISH_ARGS; only if needsWorkspaceDiscovery(input) is true does it parse CRAFT_WORKSPACE_NAMES. It requires that value to be an array or throws Craft workspace discovery returned an invalid workspace list., then writes resolvePublishLocation(...) through core.setOutput("result", ...).scripts/generate-publish-issue-title-parser.js reads src/modules/publish-issue-title.peggy, generates a CommonJS parser using peggy.generate() with grammarSource: "publish-issue-title.peggy" and output: "source", formats it with Prettier using filepath: outputPath, and writes src/modules/publish-issue-title.js prefixed with /* eslint-disable */.src/modules/__tests__/publish-location.js tests needsWorkspaceDiscovery() as true for { path: "./cli" }, false for { path: "./packages/cli" }, { path: "." }, and { path: "./cli", workspace: "cli" }.src/modules/__tests__/publish-location.js verifies exact case-sensitive workspace matching without normalization: path: "./CLI" plus workspaceNames: ["cli", "CLI"] resolves to { path: ".", workspace: "CLI" }; ./packages remains a checkout path when only cli is a workspace, and ./packages/cli remains a checkout path even when cli is a workspace.src/modules/__tests__/publish-location.js verifies root { path: "." } stays root; legacy explicit { path: ".", workspace: "cli/v2" } is preserved even when discovery returns ["invalid/workspace"]; discovered "cli-ζ₯ζ¬θͺ" is rejected with Craft workspace discovery returned an invalid workspace list.src/modules/__tests__/release-revision.js uses revision 7e5ca7ed5581552de066e2a8bc295b8306be38ac; it verifies extraction from LF and CRLF issue bodies, rejects a check-runs link for getsentry/other, rejects a missing link, and rejects uppercase revision 7E5CA7ED5581552DE066E2A8BC295B8306BE38AC.craft-workspace-action-propagation/src/schemas/project_config.ts, named Craft workspaces are explicitly independently-versioned release units, distinct from an npm targetβs workspaces: true, which discovers multiple packages within one target and publishes them at the same version.releaseUnitFields in src/schemas/project_config.ts includes optional github, targets, preReleaseCommand, postReleaseCommand, releaseBranchPrefix, changelog, deprecated changelogPolicy, requireNames, statusProvider, artifactProvider, versioning, and noMerge; workspace values inherit top-level fields and override only declared fields.WorkspaceSchema permits a partial github block so a workspace may override owner and/or repo, but rejects github.projectPath with Workspace github.projectPath is not supported..WorkspaceNameSchema in src/schemas/project_config.ts requires ^[A-Za-z0-9_.-]+$ and rejects __proto__ with Workspace name "__proto__" is not supported. because assigning that key to a regular object mutates its prototype rather than preserving an own workspace entry.CraftProjectConfigSchema supports optional workspaces: z.record(WorkspaceNameSchema, WorkspaceSchema); when any workspace exists, top-level github.projectPath is forbidden with Workspace configurations cannot use github.projectPath. A repository without workspaces retains backward-compatible implicit top-level release-unit behavior; a repository with workspaces requires release selection via --workspace <name> or CRAFT_WORKSPACE.