Dashboard › craft › Distillation
22b85362-b391-48ff-b58b-1b7c7a851254["lore_tm_v1_alYFUsh11dpDMashrxPHxkef_TaZomCp2l7qIl9UOYo","lore_tm_v1_1WlcYp40KYaWTIGYp1gyZ9OGKw_syx-1NNIwNIl1-Fc","lore_tm_v1_n4co_l1MNYWL-01XCF6aJnOhOOHyrzZ2ws3_c9r9EcM","lore_tm_v1_ib6jdEMfzPb7AgAnik52tAbQ6nFDc0Sjde8hhFwi31Q","lore_tm_v1_CyTWbOLZNTGIvADKmF0AHUyGlE2JhOYVZX2mXyNgk70","lore_tm_v1_WvjR7FP7jiXYj3XSImz9LlnWRbK5pyzOBhjLTDOKXvw","lore_tm_v1_nzBaWniBSX5k3sO738Yge7hLQo0uArq2PjRHL_6-f1k","lore_tm_v1_TQVj-1T5ZnWlZsRGezRzokn8ihNoCLPKRy4ZR5DIqm8","lore_tm_v1_kZJWe0hYprWSFzuIf7e2-a6Gfn-OndImOM6bIz-RaK8","lore_tm_v1_z1wRDZnhozR6VJWbL_4VY-yRdGVAEXbxR0Ih8UTkpuM"]
Date: Aug 29, 2026
src/commands/workspace.ts: yargs command workspace <command> (“Manage release workspaces”) requires a subcommand via yargs.demandCommand().command(list) and has a no-op handler; it imports ./workspace_cmds/list.src/commands/workspace_cmds/list.ts: workspace list (“List defined release workspaces as a JSON array”) calls console.log(formatJson(getWorkspaceNames())).minVersion side.src/schemas/project_config.ts: WorkspaceSchema represents named independently-versioned release units, inherits optional releaseUnitFields from top-level config, permits partial github overrides but rejects github.projectPath; WorkspaceNameSchema accepts only /^[A-Za-z0-9_.-]+$/ and rejects "__proto__" to prevent prototype mutation. CraftProjectConfigSchema.workspaces is z.record(WorkspaceNameSchema, WorkspaceSchema).optional(), requires a selected workspace when nonempty, remains backward-compatible when absent, and rejects top-level github.projectPath when workspaces exist.src/index.ts: CLI imports/registers workspace, declares global string --workspace with CRAFT_WORKSPACE documentation, and calls setActiveWorkspace(extractWorkspaceSelection(argv)) before yargs parsing because command builders can access/validate config before middleware. CLI precedence is delegated to extractWorkspaceSelection; middleware remains setGlobals.--workspace --dry-run must never be mistaken for a workspace name.src/utils/helpers.ts: extractWorkspaceSelection(argv, env) uses node:util parseArgs with options: { workspace: { type: 'string' } }, allowPositionals: true, strict: false, and tokens: true; supports --workspace foo and --workspace=foo; last occurrence controls selection; a bare/empty final workspace option clears an earlier CLI value and falls back to env.CRAFT_WORKSPACE; inline option-looking values such as --workspace=-foo are valid, while separated --workspace --foo is invalid.src/__tests__/action.test.ts: action tests verify Craft Prepare and Read Craft Targets pass option-looking workspace input inline as --workspace=--config-from=untrusted; both steps receive ${{ inputs.workspace }} and Validate workspace receives ${{ inputs.path }}. Validation is the first action step and rejects control/tab, Unicode RTL-format (\u202e), line-separator (\u2028), paragraph-separator (\u2029), and non-ASCII (cli-é) workspace values before git/Craft side effects, including UTF-8 locale; accepts '' and cli-v2; rejects simultaneous workspace cli plus path packages/cli, and rejects cli/v2. Publish issue titles are publish: getsentry/toolkit@1.2.3 without workspace and publish: getsentry/toolkit/cli@1.2.3 with workspace cli.src/utils/publishState.ts: publish-resume state was moved from repository-local .craft-publish-<version>.json to $XDG_STATE_HOME/craft/ or fallback $HOME/.local/state/craft/ to prevent committed repository files/earlier CI steps from pre-populating completed targets. getPublishStateFilename() uses sanitized owner/repo, 12-character SHA-1 cwd hash, sanitized version, and optional losslessly Base64url-encoded workspace-<name>- prefix; without GitHub config it uses a 16-character SHA-256 cwd hash. getPublishStatePath() joins this filename under getCraftStateDir(), isolating same-repository/same-version workspace publish state./home/byk/Code/getsentry/publish-workspace-acceptance/scripts/generate-publish-issue-title-parser.js.