Dashboard › craft › Distillation
ac71a794-ce96-4057-a9c3-62c00a90e79a["lore_tm_v1_2L8WjY6LgYFh5tjE9pGjU-8sstfDHdIpTU5YycE0Atc","lore_tm_v1_at-x0DD5enF7LDKp_qO4bwUQ9OOIM9y9B1lPf736RpY","lore_tm_v1_SW3LJJBKmLcUTMFPOez3YJQVWggIbB2Y3F5wdoptYkA","lore_tm_v1_qhm5xErSXIir0g_eeNL_cIKuPUf7dCiY0fQKByx4XBU","lore_tm_v1_71pov2CVN7nqaIk6D-7FTGNc_xB7zbh4ic4I9TKQ4nQ","lore_tm_v1_jtpgldd7PCZ31vPIRoLsBhSJDrl6rNql87WFkBD8p18","lore_tm_v1_0DCff5pEHqkd7PIZ5xTOBtbU9B4fhe3QbIVyTXkF1F4"]
Date: Aug 29, 2026
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/publishState.ts: module moves Craft publish-state files out of the published repository checkout to $XDG_STATE_HOME/craft/, falling back to $HOME/.local/state/craft/, preventing committed .craft-publish-<version>.json files or earlier CI steps from pre-populating completed targets and causing Craft to skip targets.getCraftStateDir() in /home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/publishState.ts returns join(process.env.XDG_STATE_HOME, 'craft') when XDG_STATE_HOME is nonempty; otherwise returns join(homedir(), '.local', 'state', 'craft').getPublishStateFilename(version, githubConfig, cwd = process.cwd(), workspace?) in /home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/publishState.ts lowercases filename components, replaces runs of characters outside [a-z0-9._-] with _, trims leading/trailing _, and hashes cwd using SHA-1 truncated to 12 hex characters when GitHub configuration is available.githubConfig, getPublishStateFilename() emits publish-state-<owner>-<repo>-<sha1(cwd)[:12]>-<workspacePrefix><version>.json; without GitHub configuration, it emits publish-state-<sha256(cwd)[:16]>-<workspacePrefix><version>.json. The optional workspace prefix is lossless Base64URL without padding: workspace-${Buffer.from(workspace).toString('base64url')}-.getPublishStatePath(version, githubConfig, cwd = process.cwd(), workspace?) joins getCraftStateDir() with getPublishStateFilename(...); workspace state isolation prevents same-repository, same-version independent release workspaces from sharing completed-target state./home/byk/Code/getsentry/publish-workspace-acceptance/.github: contains CODEOWNERS and workflows/./home/byk/Code/getsentry/publish-workspace-acceptance/.github/workflows: contains auto-approve.yml, ci-poller.yml, cocoapods-keepalive.yml, publish.yml, and test.yml..github/workflows/test.yml defines workflow Test, triggered on pushes to main and all pull requests; grants contents: read; defaults run shell to Bash; its unit-test job runs on ubuntu-latest..github/workflows/test.yml unit-test steps use actions/checkout@v6, actions/setup-node@v6 with node-version: 24, and actions/cache@v4 for node_modules keyed ${{ runner.os }}-node_modules-${{ hashFiles('package.json', 'yarn.lock') }}; runs yarn install --frozen-lockfile only on cache miss, then runs yarn test.src/modules/update-issue.js: updateTargets({ octokit, stateFilePath, publishRepo, issue_number }) returns without state-file reading when stateFilePath is absent or fs.existsSync(stateFilePath) is false; otherwise concurrently fetches the issue and JSON-parses fs.promises.readFile(stateFilePath, { encoding: "utf-8" }), transforms its body, and updates the issue.transformIssueBody(craftState, issueBody) in src/modules/update-issue.js replaces checked-state markers for declared ### Targets entries using craftState.published[targetId]; appends published targets not already declared as - [x] <target> or - [ ] <target>, with target section matching via TARGETS_SECTION_PARSER_REGEX and target parsing via TARGETS_PARSER_REGEX.updateIssue({ context, octokit }) in src/modules/update-issue.js uses context.repo and context.payload.issue.number, concurrently invokes updateTargets() with stateFilePath: process.env.CRAFT_STATE_FILE_PATH and removes the issue label accepted; module exports { updateIssue, transformIssueBody }.src/publish/inputs.js: its inputs() function calls detailsFromContext({ context: github.context }) from ../modules/details-from-context and exposes the result as the GitHub Actions output result using core.setOutput('result', result); inputs() executes immediately.