Dashboard › craft › Distillation
d353e2c2-540f-4d7e-bf1b-735b417fc961["lore_tm_v1_vy4SFWJ5a7hTEa45LJNzoUm3-Fdb5HUZ503N5KhABTs","lore_tm_v1_8BHVizv_k-KQJNbyn17gd8KVGVraTgVbvFDlbXHGi98","lore_tm_v1_uWxrBc88nHD9-3G_m5Wa4tEtty8Anoh-myYJFsYgVVw","lore_tm_v1_cwZZTFVXI02lyWxEhHj8ukrn6yYLZaGdwxf18Rqjwds","lore_tm_v1_6eCT5tMNmqhe1tsyQT6csI8U6wVtTT0zEFhiuUR_G18","lore_tm_v1_ZqwONnTCP0VZRZjLbYsaIdqrGFJDC0RPdAchufXPZoo","lore_tm_v1_OpGlDeUHPELwtgV-xXMPseqkvyj5smLxKxvkHmE1RK0","lore_tm_v1_g4fpzrLca4eoB8Lxv9DjmUhLJP0jLPSohmM_MkWIUhU","lore_tm_v1_yU7QpP2Ea01zvKnhpg5pmDCXniiYrKSyqFBP6DV79jI","lore_tm_v1_AeKeHYjI2pTHXQGgv0P6ONK5r5FMBik5MMECTmKpEh4"]
Date: Aug 25, 2026
src/config.ts lines 471–514 define cached async getGlobalGitHubConfig(clearCache = false): Promise<GitHubGlobalConfig>: it returns the cached configuration unless cleared; a cached null throws ConfigurationError('GitHub configuration not found in the config file and cannot be determined from Git'); otherwise it reads top-level getConfiguration(clearCache).github, and if absent attempts createGitClient(getConfigFileDir() || '.'), selecting origin or the first remote and parsing its push/fetch URL with GitUrlParse. A github.com remote supplies {owner: remoteUrl.owner, repo: remoteUrl.name}; the result is frozen into _globalGitHubConfigCache, then returned through a recursive cache-read call.src/config.ts lines 527–545 define getGitTagPrefix(), which obtains the first active github target's tagPrefix (default ''). If active GitHub targets have differing prefixes, it warns that the first prefix is used and recommends a top-level workspaces entry per independently versioned monorepo product (or separate .craft.yml), each with one GitHub target and its own tagPrefix.src/utils/__tests__/helpers.test.ts tests extractWorkspaceSelection(argv, env): no flag/environment returns undefined; --workspace cli and --workspace=mcp select values; a leading-dash name works only inline (--workspace=-cli), not as a separate following argument; CLI wins over CRAFT_WORKSPACE; repeated flags select the last valid value; a final/bare --workspace, --workspace --dry-run, or --workspace= falls back to CRAFT_WORKSPACE or undefined; following option flags must not be consumed as workspace names.src/utils/__tests__/helpers.test.ts envToBool parameter cases map undefined, null, false, strings 'undefined', 'null', '', '0', and 'no' to false; map true, 'true', 1, '1', 'yes', and 'dogs are great!' to true..github/workflows/release.yml and action.yml, plus untracked src/__tests__/action.test.ts..github/workflows/publish.yml, src/modules/__tests__/details-from-context.js, src/modules/__tests__/update-issue.js, src/modules/details-from-context.js, and src/modules/update-issue.js.c232c383e26fc1be21ea27342217e1a22acef35c and 42840c7f95205357a9ed1230a9e27f24de92ccc1, with short hash c232c383e26f; workspace cli encodes as Y2xp, workspace cli [preview] "next" encodes as Y2xpIFtwcmV2aWV3XSAibmV4dCI, and workspace --config-from=untrusted encodes as LS1jb25maWctZnJvbT11bnRydXN0ZWQ..github/workflows/publish.yml lines 186–234 Set targets builds payload as checked target IDs mapped to true under {"published": ...}; validates container_cwd="$(realpath -m "/github/workspace/__repo__/$CRAFT_PUBLISH_PATH")" remains /github/workspace/__repo__ or its descendant; hashes that container cwd using sha1sum | cut -c1-12; sanitizes owner/repo/version by lowercasing and replacing non-[a-z0-9._-] runs with _; base64url-encodes a nonempty workspace and writes publish-state-${owner_sanitised}-${repo_sanitised}-${cwd_hash}-${workspace_prefix}${version_sanitised}.json below $GITHUB_WORKSPACE/.craft-state/craft..github/workflows/publish.yml invokes docker://getsentry/craft:latest with XDG_STATE_HOME=/github/workspace/.craft-state, changes directory to __repo__/${{ ...path }}, and executes craft publish <version>. It supplies CRAFT_WORKSPACE from issue input workspace || ''; on cancellation/failure, update-issue.js receives CRAFT_STATE_FILE_PATH from steps.craft-state.outputs.state_file.63 6c 69 202e 64 65 76 (cli + U+202E RIGHT-TO-LEFT OVERRIDE + dev).cli‮dev containing U+202E RIGHT-TO-LEFT OVERRIDE, returning {"workspace":"cli‮dev","codePoints":["63","6c","69","202e","64","65","76"]}.src/modules/details-from-context.js parses approval issue titles using ^publish: (?:getsentry/)?(?<repo>[A-Za-z0-9_.-]+)(?<path>/[\w./-]+)?(?: \[workspace: (?<workspace>"(?:[^"\\]|\\.)*")\] )?@(?<version>[\w.+-]+)$; it JSON-parses an optional workspace, rejects empty workspace values and Unicode Cc, Zl, or Zp characters, sets path to '.' + title path and rejects .. segments, extracts optional merge target ^Merge target: (?<merge_target>[\w.\-/]+)$, and returns workspace only when nonempty.getsentry/<title repo> in .github/workflows/publish.yml, while Craft permits workspace-specific github.owner/repo overrides and keys state from resolved config—so checked targets may be missed and completed targets may not be restored, permitting retries to republish targets; (2) validation in action.yml and src/modules/details-from-context.js rejects only Cc, Zl, and Zp, allowing deceptive Unicode Cf bidi characters such as U+202E in workspace titles that proceed to CRAFT_WORKSPACE; (3) workspace validation at action.yml:171-174 occurs after side-effecting action steps at action.yml:74-158 (workflow query/cancellation, environment mutation, artifact download, Craft installation), while src/__tests__/action.test.ts:56-80,103-110 tests only the isolated Craft Prepare shell step and cannot enforce reject-before-side-effects ordering.publish: repo/path@version; unscoped secure state filename behavior is unchanged; workspace filenames are losslessly base64url encoded; selected workspace propagates through prepare, targets, title parsing, CRAFT_WORKSPACE, and failure handling; option-like workspace values remain passed inline as --workspace=<value>; and only intended source/workflow/test files were uncommitted. Reported test results were Craft: 60 files, 1,129 tests; Publish focused suite: 15 tests.