Dashboard › craft › Distillation
65cca394-e3f4-43ea-87d9-ad4f1d3e8eda["lore_tm_v1_JJ55H9MXh8SfrfLZBVa2g-9Ddew9vhlLhIim9aaMceo","lore_tm_v1_4q8ObEJHa7HO4ehEWmk-DSN4nF-Vcn29H8yQreCemzA","lore_tm_v1_mDXduTRtytfFydltOu-dhu5UBmJOqcEhSy1b-0efPO8","lore_tm_v1_Z5G-NLxAUI6GV6TWjROY4PkPkMltb0kqm6L1u1IpADU","lore_tm_v1_e5nWTdHVGMrY6-svjLNGhu7hPAHNxsOwLnfS6C7JmPk","lore_tm_v1_HfQ5O4RC5jAg0rBCw-FlIYeXsk8794hXeez7WIkmX34"]
Date: Aug 29, 2026
minVersion side.src/commands/workspace.ts defines the workspace <command> yargs command, described as Manage release workspaces; its builder requires a subcommand and registers ./workspace_cmds/list, while its handler is a no-op.src/commands/workspace_cmds/list.ts defines workspace list, described as List defined release workspaces as a JSON array; handler() prints formatJson(getWorkspaceNames()).src/index.ts imports and registers the workspace command alongside prepare, publish, targets, config, artifacts, and changelog.src/index.ts calls setActiveWorkspace(extractWorkspaceSelection(argv)) before yargs parsing because command builders can access configuration before middleware; this makes raw --workspace/CRAFT_WORKSPACE selection available while builders derive and validate configuration.workspace option in src/index.ts is a string, global option described as selecting a named release-unit workspace from configuration; it is required when config defines workspaces, and supports CRAFT_WORKSPACE.fixGlobalBooleanFlags() in src/index.ts injects '1' after standalone global boolean flags from GLOBAL_BOOLEAN_FLAGS; global flags are no-input (default isCI) and dry-run (default process.env.DRY_RUN, with TODO to deprecate it in favor of CRAFT_DRY_RUN).--workspace --dry-run must never be mistaken for a workspace name.extractWorkspaceSelection(argv, env = process.env) in src/utils/helpers.ts uses node:util parseArgs() with { workspace: { type: 'string' } }, allowPositionals: true, strict: false, and tokens: true to select a workspace before yargs parsing.extractWorkspaceSelection() supports --workspace foo and --workspace=foo; it processes all workspace option tokens so the last occurrence decides. A bare or empty final --workspace clears an earlier CLI value and falls back to CRAFT_WORKSPACE; a CLI value overrides CRAFT_WORKSPACE only when it carries a valid value.extractWorkspaceSelection() accepts a token value only when it is a nonempty string and either inline or does not start with -; thus --workspace=-foo is valid, while --workspace --foo is not interpreted as a workspace value.MAX_STEP_OUTPUT_BYTES in src/utils/helpers.ts is 64 * 1024; it is selected to stay below the approximately 2 MB ARG_MAX kernel limit and GitHubβs approximately 65,536-character issue-body limit.envToBool() considers '', 'undefined', 'null', '0', 'false', and 'no' false after lowercasing; all other values are true.setGitHubActionsOutput(name, value) is a no-op without GITHUB_OUTPUT; multiline values use an EOF_${Date.now()}_${Math.random().toString(36).slice(2)} heredoc delimiter, while single-line values use name=value.writeGitHubActionsFile(name, content) is a no-op without RUNNER_TEMP; otherwise it creates ${RUNNER_TEMP}/craft, writes ${name}.md in UTF-8, sets ${name}_file via setGitHubActionsOutput(), and returns the absolute file path.truncateForOutput(value, changelogUrl?) returns unchanged text at or below MAX_STEP_OUTPUT_BYTES; oversized UTF-8 text is sliced to reserve notice bytes, drops a trailing U+FFFD caused by splitting a multibyte codepoint, then appends either \n\n---\n*Changelog truncated.* or \n\n---\n*Changelog truncated. [View full changelog](${changelogUrl}).*.disableChangelogMentions() replaces exact changelog-format occurrences matching / by @(\S+) in /g with by **$1** in, preventing contributor pings in embedded GitHub issue bodies.src/__tests__/action.test.ts creates isolated temporary action environments with stub craft, git, and gh executables; the stub craft targets emits ["github"], and the stub gh issue create records its --title and returns https://github.com/getsentry/publish/issues/1.--config-from=untrusted is forwarded inline to Craft as prepare --workspace=--config-from=untrusted and targets --workspace=--config-from=untrusted, preventing it from being parsed as a separate Craft option.Validate workspace receives PATH_INPUT: ${{ inputs.path }}, while Craft Prepare and Read Craft Targets receive WORKSPACE: ${{ inputs.workspace }}.Validate workspace to be the first action step and to reject workspace inputs containing control tab (cli\tnext), bidi format character (cli\u202enext), line separator (cli\u2028next), paragraph separator (cli\u2029next), or non-ASCII (cli-Γ©) before any git or craft side effect; cli-Γ© is also rejected in en_US.utf8.'' and cli-v2; they reject simultaneous workspace cli with path packages/cli, and reject workspace cli/v2 as outside the compact title grammar, in both cases before git or craft side effects.'' produces publish: getsentry/toolkit@1.2.3; workspace cli produces publish: getsentry/toolkit/cli@1.2.3. Test environment values include repository getsentry/toolkit, version 1.2.3, release branch release/1.2.3, previous tag 1.2.2, and release SHA abc123.