Dashboard › craft › Distillation
7cc1e84c-cde4-44e1-a6d3-0e3b2ce0da01["lore_tm_v1_2oZ3byb-J4zVZUZhTEMrXSCH_x1lHqtG17mUcO-JKjw","lore_tm_v1_jjiJMBOcUqeGjqmG-ndoLAL-nurBqceyg7IWtJ6FgT0","lore_tm_v1_Q3WgcW4Yvv8V-xgh5ccGuTZajF_6tx0D8Hay5xbBrtQ","lore_tm_v1_tSbHl3SpDGkXqtch7pByRMM0JTv8xKCj29_NFSGx4iA","lore_tm_v1_bYc1icpSMxcJPsa1R1znqeY_viDEdaYntmlAPB6GUgU","lore_tm_v1_tsK_QkT8DMJkfx8CWLjMQ5Akr5GoKgPiczhLKmYffAM","lore_tm_v1_0Vwvxj738Xi2bMZN6KTjNYJrSP8a9mLOvocEgOMEiCU","lore_tm_v1_P2m8x_5u3o0EyQ96c7rDqBlS_F72gPosOFh7kxBwYxU","lore_tm_v1_wakY2lJGY4MEAukpRytzIvWtGeu3Gd8NzCaH7BwrZf8"]
Date: Aug 26, 2026
--workspace --dry-run must never be mistaken for a workspace name.src/utils/helpers.ts: extractWorkspaceSelection(argv, env) uses Node parseArgs() with options: { workspace: { type: 'string } }, allowPositionals: true, strict: false, and tokens: true to resolve --workspace before yargs parsing.extractWorkspaceSelection() supports --workspace foo and --workspace=foo; processes every workspace token so the last occurrence decides; resets selection for a bare/empty final option; accepts a nonempty string only when token.inlineValue is true or it does not begin with -; therefore --workspace=-foo is valid while --workspace --foo is not; falls back to CRAFT_WORKSPACE when no valid CLI value is present.src/index.ts: main() calls sanitizeDynamicLinkerEnv(), printVersion(), warnIfCraftEnvFileExists(), transforms raw args with fixGlobalBooleanFlags(process.argv.slice(2)), then calls setActiveWorkspace(extractWorkspaceSelection(argv)) before yargs command builders/config validation. The workspace option is global, string typed, and documents CRAFT_WORKSPACE.src/index.ts: yargs command builders can read configuration before middleware—for example, publish derives --target choices from config.targets—so resolving the active workspace in middleware would occur too late and can validate config without a selection.(?:\p\{C|\p\{Z|Unicode|control) failed: rg reported regex parse error and invalid Unicode character class.src/config.ts applyWorkspaceSelection(config): no configured workspaces and no active selection returns config unchanged; an active selection without configured workspaces throws ConfigurationError; configured workspaces without an explicit selection throw an error listing available workspace names and requiring --workspace <name> or CRAFT_WORKSPACE; both configured/selected require config.minVersion >= WORKSPACES_MIN_VERSION and then return resolveWorkspaceConfig(config, _activeWorkspaceName).isVersionGteMinVersion(minVersionRaw, requiredVersion) parses both versions and compares them after withoutBuildMetadata() strips SemVer build metadata; invalid/missing versions return false. This permits values such as 2.29.0+linux for compatibility checks even though the comparison helper rejects build metadata.src/schemas/project_config.ts: a Craft workspace is a named, independently-versioned release unit, distinct from an npm target’s workspaces: true, which discovers/publishes npm packages within one target at the same version.WorkspaceSchema consists of optional release-unit fields—github, targets, preReleaseCommand, postReleaseCommand, releaseBranchPrefix, changelog, changelogPolicy, requireNames, statusProvider, artifactProvider, versioning, and noMerge—and uses GitHubGlobalConfigSchema.partial() so a workspace may override only projectPath, owner, or repo while inheriting other GitHub settings.CraftProjectConfigSchema.workspaces is z.record(z.string(), WorkspaceSchema).optional(); selected workspace fields override top-level values, while absent workspaces retain the backward-compatible single implicit release unit.ci-ready label after checking CI; if ci-ready was already present, waiting-for-ci removes it first so adding it creates a fresh labeled event..github/workflows/publish.yml changes: publish job runs only for an open issue’s ci-ready label event when labels include accepted and ci-ready and exclude ci-pending and ci-failed; the job has timeout-minutes: 90, uses ubuntu-latest and production environment, and comments that it intentionally does not trigger on accepted events to avoid racing waiting-for-ci.actions/checkout@v6 at .__publish__; Node setup uses actions/setup-node@v6, Node 24, Yarn cache, and .__publish__/yarn.lock; workflow validates that the publish path remains inside the target checkout and emits ::error::Publish path must remain inside the target checkout. otherwise.CRAFT_PUBLISH_STATE_GITHUB_REPO: getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}.detailsFromContext(inputsArgs) expectation changed from toEqual to toStrictEqual; added context parsing coverage for Unicode workspace cli-日本語, NUL workspace cases, and malformed/missing issue payload scenarios.