Dashboard › craft › Distillation
aaf5c0e6-9332-4fff-8915-8a52ae159f35["lore_tm_v1_XLxvaj8MApVbcBTaOKwnB-l7RJR-zQNcQdSOQRYOmIo","lore_tm_v1_7tL0rnnCETjl61aQmShdh9eYjx7Y3_AaSg4qeTl-rl0","lore_tm_v1_NucVFYh1GtIkafqDYtTHcGepsTwLGIdDrgP3ADRUoHs","lore_tm_v1_rV3FMOt4EYBl5390cC7KPHFyNLJVqqgyH7va40dVdrA","lore_tm_v1_s6VAUdJN9_Sg5UQFDFM6HAC9pQlXvDY4SKBrY97Dgg4","lore_tm_v1_rKWBeWESV-czvVmTbrmxB_7LNXgr3mDMc_xV20D8RVM","lore_tm_v1_CVHn9-F6uJX7REIimHQNN7Z-urRV_PDYH84gTddKQqY","lore_tm_v1_AWdLnF15OfdU2hRCTmewDCeYF_hgE3GVekBQ7RlA2sA","lore_tm_v1_TLsO2F4UIcbbiJPDBOLW5pi_8pgr5aqGvubwJWx7z2Y","lore_tm_v1_qapP5Xg4oFkuUH7wFSIkuewz8Ylf3itHlffuxHOYB7g","lore_tm_v1_maaO0O6aBt2vkvU_wK6yyZ0JEYUX16cOinaQCwhBljU"]
Date: Aug 26, 2026
craft-workspace-action-propagation test suite passed with Vitest v4.1.8: 60 test files passed; 1138 tests passed, 1 skipped (1139 total); duration 43.22s (transform 3.91s, import 71.00s, tests 34.76s). Test logs exercised GitHub-release edge cases: orphaned draft v1.0.0 deletion, cleanup failure handling, published-release detection after createRelease HTTP 422, leftover draft release deletion with id=789, floating-tag update failure warnings, oversized release-body truncation at GitHubβs 125000-character limit, dry-run release deletion, and fallback to cached refs when remote fetch/list branches fails.publish-workspace-acceptance test suite passed with Vitest v4.1.11: 6 test files and 25 tests passed; Vitest duration 2.26s (transform 416ms, import 2.04s, tests 442ms); Yarn v1.22.22 completed in 3.61s. Vite warned that ESM syntax in CommonJS-loaded vitest.config.js:1:1 is incompatible with future default configLoader: 'native'; remedies are .mjs, "type": "module" in the nearest package.json, or VITE_CONFIG_NATIVE_IGNORE_WARNING=true.src/targets/__tests__/symbolCollector.test.ts at lines 58 and 68: assignments to imported checkExecutableIsPresent will throw because imports are immutable.craft-workspace-action-propagation/.github/workflows/release.yml (151 lines). workflow_dispatch accepts required version (default 'auto'), optional force, and optional workspace; reusable workflow_call adds optional string inputs version, force (default 'false'), merge_target, blocker_label (default 'release-blocker'), publish_repo, git_user_name, git_user_email, path (default '.'), workspace, and craft_config_from_merge_target (default 'false').release.yml exposes reusable-workflow outputs version, branch, sha, previous_tag, and changelog, sourced from jobs.release.outputs; each release-job output prefers steps.craft-local.outputs.* then steps.craft-action.outputs.*.release.yml build/release design: build runs only when github.repository == 'getsentry/craft', calls ./.github/workflows/build.yml, and has contents: read; release needs build, runs when it succeeded or was skipped (always() && (needs.build.result == 'success' || needs.build.result == 'skipped')), uses ubuntu-latest, and has contents: write.release.yml uses actions/create-github-app-token@v3 for Craft-repository workflow_dispatch releases, with vars.SENTRY_RELEASE_BOT_CLIENT_ID and secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY; actions/checkout@v6 uses the release-bot token or inherited github.token, with fetch-depth: 0.release.yml dogfoods the local action for getsentry/craft via uses: ./, passing GITHUB_TOKEN: ${{ steps.token.outputs.token }} and github.event.inputs.version, force, and workspace; external repositories use getsentry/craft@v2, pass GITHUB_TOKEN: ${{ github.token }}, and forward all reusable inputs including workspace and craft_config_from_merge_target.craft-workspace-action-propagation/src/commands/publish.ts lines 135β204. PublishOptions defines remote: string, optional rev, optional mergeTarget, optional target: string | string[], required newVersion: string, plus booleans noMerge, keepDownloads, noStatusCheck, keepBranch, and noGitChecks; PublishState stores published as { [targetId: string]: boolean }.getPublishStateGitHubConfig(githubConfig, stateRepository = process.env.CRAFT_PUBLISH_STATE_GITHUB_REPO) in src/commands/publish.ts preserves githubConfig if no state-repository override exists; otherwise it validates CRAFT_PUBLISH_STATE_GITHUB_REPO against ^(?<owner>[A-Za-z0-9_.-]+)\/(?<repo>[A-Za-z0-9_.-]+)$, throws ConfigurationError('CRAFT_PUBLISH_STATE_GITHUB_REPO must be a GitHub owner/repository pair.') for invalid input, and returns the parsed { owner, repo }.src/commands/publish.ts lines 680β774. Publishing resolves HEAD with git.revparse('HEAD'), obtains status/artifact providers, runs checkRevisionStatus, printRevisionSummary, and checkRequiredArtifacts; target selection initializes from argv.target or SpecialTarget.All, rejects mixing all/none with other targets, and expands npm workspace targets via expandWorkspaceTargets(config.targets || []).src/commands/publish.ts: it attempts getGlobalGitHubConfig() and falls back to null if unavailable; calls getPublishStatePath(newVersion, getPublishStateGitHubConfig(publishStateGithubConfig), process.cwd(), getActiveWorkspace()); checks legacy .craft-publish-${newVersion}.json only to warn and never reads it because repository content can be attacker-influenced; new state is stored under $XDG_STATE_HOME/craft/.src/commands/publish.ts parses it, resets targetsToPublish to all configured target IDs, and skips each target already marked successful in publishState.published; otherwise it initializes publishState = { published: Object.create(null) }.realpath invocation was made without a valid required FILE argument and printed GNU realpath usage/help.publish-workspace-acceptance/src/modules/details-from-context.js. detailsFromContext({ context }) requires context.payload.issue, otherwise throws Error("Issue context is not defined"); it parses titles matching publish: (getsentry/)?<repo><optional-path>(optional [workspace: "<JSON string>"] )@<version>.detailsFromContext.js workspace parsing JSON-decodes the titleβs optional workspace name; it rejects empty values and Unicode control (\p{Cc}), format (\p{Cf}), line-separator (\p{Zl}), or paragraph-separator (\p{Zp}) characters with Workspace names must be nonempty and cannot contain Unicode control, format, or separator characters; it includes workspace in returned details only when nonempty.detailsFromContext.js returns repo, version, dry_run ("1" only when an issue label is named "dry-run"), merge_target, path, targets, and optional workspace; it derives path as "." + (titleDetails.path || "") and rejects any path containing a .. component with Invalid publish issue path: '<path>'.detailsFromContext.js parses a merge target only from body lines matching Merge target: <[\w.\-/]+>; it extracts checked target IDs from the issueβs targets section using TARGETS_SECTION_PARSER_REGEX and CHECKED_TARGETS_PARSER_REGEX, while unchecked targets are excluded.publish-workspace-acceptance/src/modules/__tests__/details-from-context.js: accepts publish: getsentry/toolkit [workspace: "cli/v2"] @1.2.3 as workspace cli/v2; accepts escaped characters in cli [preview] \"next\"; accepts Unicode cli-ζ₯ζ¬θͺ; rejects legacy title publish: getsentry/toolkit @1.2.3 because of the unexpected space before @1.2.3.details-from-context.js tests verify rejection of workspace values that are empty, newline ("cli\\nnext"), NUL ("\\u0000"), tab ("cli\\tnext"), bidirectional format character ("cli\\u202enext"), line separator ("cli\\u2028next"), or paragraph separator ("cli\\u2029next"); tests also reject publish: getsentry/toolkit/../other@1.2.3 and missing issue payload.