DashboardcraftSession 1HuF3pPuTo36

Session 1HuF3pPuTo36

Full ID: 1HuF3pPuTo36mTXR0
Messages: 36
Distillations: 7
Time range: 2026-08-26 13:16:45 — 2026-08-26 13:24:59

Conversation (36 messages)

Perform a rigorous, read-only adversarial review of the uncommitted cross-repository workspace-propagation changes in BOTH worktrees:

  • /home/byk/Code/getsentry/craft-workspace-action-propagation (branch feat/workspace-action-propagation, base 21270a1)
  • /home/byk/Code/getsentry/publish-workspace-acceptance (branch feat/workspace-acceptance, base 83d210b)

Do NOT modify files or run formatters. Inspect the complete working diffs and relevant source/tests. Focus on the three prior blockers and any regression:

  1. A workspace may override github.owner/repo: Publish prepopulates resume state by title checkout repository; Craft must read exactly that file without changing the resolved GitHub config it uses to publish.
  2. Workspace values displayed in issue titles must reject empty and Unicode Cc, Cf (including bidi overrides), Zl, and Zp characters on BOTH action ingress and Publish parsing; preserve valid non-control Unicode.
  3. The Craft composite action must reject invalid workspace input before EVERY side effect (GitHub API calls, git writes/calls, artifact download, installation, Craft invocation).

Also check legacy no-workspace compatibility, action argv option injection behavior, state-file security (must remain XDG outside checkout), workflow YAML/expression correctness, parser failure behavior, and test quality. Report findings first by severity with exact file:line evidence. For each prior blocker give PASS/FAIL and explain. End with MERGE or DO-NOT-MERGE. Return no general praise and no code changes.

gateway · 2026-08-26 13:16:45
result
/home/byk/Code/getsentry/craft
/home/byk/Code/getsentry/craft-workspace-action-propagation
/home/byk/Code/getsentry/publish-workspace-acceptance
gateway · 2026-08-26 13:17:12
result
 M .github/workflows/release.yml
 M action.yml
 M src/commands/__tests__/publish.test.ts
 M src/commands/publish.ts
?? src/__tests__/action.test.ts
 .github/workflows/release.yml          |  9 +++++++
 action.yml                             | 35 ++++++++++++++++++++++---
 src/commands/__tests__/publish.test.ts | 47 ++++++++++++++++++++++++++++++++++
 src/commands/publish.ts                | 33 ++++++++++++++++++++++--
 4 files changed, 119 insertions(+), 5 deletions(-)
M	.github/workflows/release.yml
M	action.yml
M	src/commands/__tests__/publish.test.ts
M	src/commands/publish.ts
21270a1 (HEAD -> feat/workspace-action-propagation, origin/master, origin/HEAD) feat(config): add release workspaces
32f5462 fix(git): prevent fatal error for missing 'origin' remote (#871)
5d0ec43 fix(registry): retry registry push with backoff on concurrent updates (#870)
35e8063 meta: Bump new development version
b2524ef Merge branch 'release/2.30.1'
cd1e829 release: 2.30.1
06180e3 fix(vercel): pass ...
gateway · 2026-08-26 13:17:16
result
 M .github/workflows/publish.yml
 M src/modules/__tests__/details-from-context.js
 M src/modules/__tests__/update-issue.js
 M src/modules/details-from-context.js
 M src/modules/update-issue.js
 .github/workflows/publish.yml                 |  27 +++--
 src/modules/__tests__/details-from-context.js | 161 +++++++++++++++++++++++++-
 src/modules/__tests__/update-issue.js         |  15 ++-
 src/modules/details-from-context.js           |  27 ++++-
 src/modules/update-issue.js                   |  54 +++++----
 5 files changed, 244 insertions(+), 40 deletions(-)
M	.github/workflows/publish.yml
M	src/modules/__tests__/details-from-context.js
M	src/modules/__tests__/update-issue.js
M	src/modules/details-from-context.js
M	src/modules/update-issue.js
83d210b (HEAD -> feat/workspace-acceptance, origin/main, origin/HEAD) build(deps): bump js-yaml from 4.3.0 to 4.3.1 (#9174)
5268a23 feat: Add Vercel creds
92eba3f feat: Add CLOUDFLARE_API_TOKEN (#9122)
ada6147 build(deps): bump js-yaml from 4.1.1 ...
gateway · 2026-08-26 13:17:22
result
/home/byk/Code/getsentry/craft-workspace-action-propagation/AGENTS.md
gateway · 2026-08-26 13:17:29
result
/home/byk/Code/getsentry/publish-workspace-acceptance/AGENTS.md
gateway · 2026-08-26 13:17:33
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/AGENTS.md</path>
<type>file</type>
<content>
1: # AGENTS.md
2: 
3: This file provides guidance for AI coding assistants working with the Craft codebase.
4: 
5: ## Package Management
6: 
7: - **Always use `pnpm`** for package management. Never use `npm` or `yarn`.
8: - Node.js version is managed by [Volta](https://volta.sh/) (currently v22.12.0).
9: - Install dependencies with `pnpm install --frozen-lockfile`.
10: 
11: ## Development Commands
12: 
13: | Command      | Description                                 |
14: | ------------ | ------------------------------------------- |
15: | `pnpm build` | Build the project (outputs to `dist/craft`) |
16: | `pnpm test`  | Run tests                                   |
17: | `pnpm lint`  | Run ESLint                                  |
18: | `pnpm fix`   | Auto-fix lint issues                        |
19: 
20: To manually test changes:
21: 
22: ```bash
23: pnpm build && ...
gateway · 2026-08-26 13:17:40
result
<path>/home/byk/Code/getsentry/publish-workspace-acceptance/AGENTS.md</path>
<type>file</type>
<content>
1: # AGENTS.md - Coding Agent Guidelines
2: 
3: This document provides guidelines for AI coding agents working in this repository.
4: 
5: ## Project Overview
6: 
7: This is the **Sentry Publish Repository** - a GitHub Actions-based approval system for publishing releases across multiple Sentry projects using [Craft](https://github.com/getsentry/craft). It's a pure JavaScript (Node.js 24.0.0) project using CommonJS modules.
8: 
9: ## Build/Lint/Test Commands
10: 
11: ### Package Manager
12: 
13: - **Yarn 1.22.22** (classic) - Do NOT use npm
14: - Version management via Volta (pinned in package.json)
15: 
16: ### Commands
17: 
18: ```bash
19: # Install dependencies
20: yarn install
21: 
22: # Run all tests
23: yarn test
24: 
25: # Run tests in watch mode
26: yarn test:watch
27: 
28: # Run a single test file
29: yarn test src/modules/__tests__/update-issue.js
30: 
31: # Run tests ...
gateway · 2026-08-26 13:17:47
result
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 4e6c11e..323e8ba 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,142 +1,151 @@
 name: Release
 concurrency: ${{ github.workflow }}-${{ github.ref }}
 
 on:
   # For Craft's own releases (dogfooding)
   workflow_dispatch:
     inputs:
       version:
         description: Version to release
         required: true
         default: 'auto'
       force:
         description: Force a release even when there are release-blockers (optional)
         required: false
+      workspace:
+        description: Named Craft release workspace to prepare and publish
+        required: false
 
   # For external repos to call this workflow
   workflow_call:
     inputs:
       version:
         description: Version to release (semver, bump type, or "auto")
         type: string
         required: false
       force:
         description: Force a release even when there are ...
gateway · 2026-08-26 13:17:58
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/action.yml</path>
<type>file</type>
<content>
1: name: 'Craft Prepare Release'
2: description: 'Prepare a new release using Craft'
3: 
4: inputs:
5:   version:
6:     description: >
7:       Version to release. Can be a semver string (e.g., "1.2.3"),
8:       a bump type ("major", "minor", "patch"), or "auto" for automatic detection.
9:     required: false
10:   merge_target:
11:     description: Target branch to merge into. Uses the default branch as a fallback. ...
gateway · 2026-08-26 13:18:08
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/__tests__/action.test.ts</path>
<type>file</type>
<content>
1: import {
2:   chmodSync,
3:   mkdtempSync,
4:   mkdirSync,
5:   readFileSync,
6:   rmSync,
7:   writeFileSync,
8: } from 'fs';
9: import { tmpdir } from 'os';
10: import { join } from 'path';
11: import { spawnSync } from 'child_process';
12: 
13: import { load } from 'js-yaml';
14: import { afterEach, expect, test } from 'vitest';
15: 
16: interface ActionStep {
17:   name?: string;
18:   run?: string;
19: }
20: 
21: function getActionSteps(): ActionStep[] {
22:   const action = load(
23:     readFileSync(join(__dirname, '../../action.yml'), 'utf8'),
24:   ) as {
25:     runs?: { steps?: ActionStep[] };
26:   };
27:   return action.runs?.steps || [];
28: }
29: 
30: function getActionStep(name: string): string {
31:   const step = getActionSteps().find(step => step.name === name);
32:   if (!step?.run) {
33:     throw new Error(`Missing ${name} action ...
gateway · 2026-08-26 13:18:16
result
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index cff6bc3..c283b79 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -87,226 +87,237 @@ jobs:
         run: |
           gh variable set CI_POLLER_HAS_PENDING -R "$GITHUB_REPOSITORY" -b "true"
 
       # Trigger the CI poller immediately instead of waiting for the next cron tick.
       # Uses the app token — GITHUB_TOKEN workflow_dispatch events are suppressed.
       - name: Trigger CI poller
         env:
           GH_TOKEN: ${{ steps.token.outputs.token }}
         run: |
           gh workflow run ci-poller.yml -R "$GITHUB_REPOSITORY"
 
   publish:
     runs-on: ubuntu-latest
     environment: production
     name: Publish a new version
     # Publish when ci-ready is present (added by the poller after CI passes).
     # Fires ONLY on ci-ready label events — not accepted — to avoid racing
     # with waiting-for-ci on the same event. ...
gateway · 2026-08-26 13:18:23
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/publishState.ts</path>
<type>file</type>
<content>
1: /**
2:  * Helpers for locating Craft's publish-state file in a path that is NOT
3:  * writable by the repository being published.
4:  *
5:  * Background: `craft publish` writes a small JSON file listing targets
6:  * that have completed so a resumed run can skip them. Before this module
7:  * existed, the file lived at `.craft-publish-<version>.json` in the
8:  * project's cwd. That path is inside the repository checkout, so any
9:  * committed file at the same path (or any earlier CI step) could
10:  * pre-populate the "published" set and trick Craft into silently
11:  * skipping targets.
12:  *
13:  * The file now lives under `$XDG_STATE_HOME/craft/` (falling back to
14:  * `$HOME/.local/state/craft/`). The filename is keyed on
15:  * owner, repo, a hash of cwd (to disambiguate monorepo subpaths), and
16:  * the version being published. ...
gateway · 2026-08-26 13:18:40
result
<path>/home/byk/Code/getsentry/publish-workspace-acceptance/.github/workflows/publish.yml</path>
<type>file</type>
<content>
1: name: Publish
2: on:
3:   issues:
4:     types: [labeled]
5: 
6: concurrency:
7:   # Use the issue title (e.g. "publish: getsentry/foo@1.2.3") so duplicate
8:   # issues for the same repo@version share a concurrency group.
9:   group: ${{ github.event.issue.title }}
10:   cancel-in-progress: false
11: 
12: permissions:
13:   contents: read
14:   issues: write
15:   packages: write
16: 
17: jobs:
18:   # When accepted is added to a publish issue:
19:   #   - Add ci-pending (and remove ci-failed if retrying)
20:   #   - Enable the poller via CI_POLLER_HAS_PENDING=true
21:   #   - Comment on the issue
22:   #   - Trigger the poller immediately so we don't wait for the next cron tick
23:   # The publish job below requires ci-ready, so it will not fire until the
24:   # poller flips ci-pending → ci-ready (which also prevents publishing without
25:   # CI ...
gateway · 2026-08-26 13:18:46
result
Found 10 matches
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/index.ts:
  Line 16:   extractWorkspaceSelection,

  Line 91:   // Resolve the active workspace BEFORE parsing. yargs runs command `builder`s

  Line 93:   // choices from config.targets) *before* middleware, so setting the workspace

  Line 95:   // config without a selection and fail. We therefore extract --workspace (or

  Line 96:   // CRAFT_WORKSPACE) from the raw argv/env up front, which is the single source

  Line 97:   // of truth for the selection (see extractWorkspaceSelection for precedence).

  Line 98:   setActiveWorkspace(extractWorkspaceSelection(argv));

  Line 124:     .option('workspace', {

  Line 127:         'Select a named workspace (release unit) from the configuration. ' +

  Line 128:         'Required when the config defines "workspaces". Env: CRAFT_WORKSPACE',
gateway · 2026-08-26 13:18:50
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/index.ts</path>
<type>file</type>
<content>
1: #!/usr/bin/env node
2: // Import Sentry instrumentation first, before any other code
3: import './instrument';
4: 
5: import isCI from 'is-ci';
6: import yargs from 'yargs';
7: 
8: import { logger, LogLevel } from './logger';
9: import {
10:   sanitizeDynamicLinkerEnv,
11:   warnIfCraftEnvFileExists,
12: } from './utils/env';
13: import {
14:   envToBool,
15:   setGlobals,
16:   extractWorkspaceSelection,
17: } from './utils/helpers';
18: import { getPackageVersion } from './utils/version';
19: import { withTracing } from './utils/tracing';
20: import { setActiveWorkspace } from './config';
21: 
22: // Commands
23: import * as prepare from './commands/prepare';
24: import * as publish from './commands/publish';
25: import * as targets from './commands/targets';
26: import * as config from './commands/config';
27: import * as artifacts from './commands/artifacts';
28: ...
gateway · 2026-08-26 13:18:57
result
Found 27 matches
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/workspaces.ts:
  Line 111: async function resolveWorkspaceGlobs(

  Line 181:   const packages = await resolveWorkspaceGlobs(rootDir, workspacesGlobs);

  Line 216:   const packages = await resolveWorkspaceGlobs(rootDir, patterns);


/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/helpers.ts:
  Line 42: export function extractWorkspaceSelection(


/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/__tests__/helpers.test.ts:
  Line 10:   extractWorkspaceSelection,

  Line 37: describe('extractWorkspaceSelection', () => {

  Line 42:       extractWorkspaceSelection(['publish', '1.0.0'], NO_ENV),

  Line 48:       extractWorkspaceSelection(['publish', '--workspace', 'cli'], NO_ENV),

  Line 53:     expect(extractWorkspaceSelection(['--workspace=mcp'], NO_ENV)).toBe('mcp');

  Line 57:     expect(extractWorkspaceSelection(['--workspace=-cli'], NO_ENV)).toBe(

  ...
gateway · 2026-08-26 13:19:01
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/helpers.ts</path>
<type>file</type>
<content>
1: import { appendFileSync, mkdirSync, writeFileSync } from 'fs';
2: import path from 'path';
3: import { parseArgs } from 'node:util';
4: 
5: import prompts from 'prompts';
6: import { logger, LogLevel, setLevel } from '../logger';
7: 
8: /**
9:  * Maximum size (in bytes) for step output values passed through GITHUB_OUTPUT.
10:  * Values exceeding this are truncated to avoid E2BIG errors when GitHub Actions
11:  * expands them into environment variables for subsequent steps.
12:  *
13:  * 64 KB is well under the ~2 MB ARG_MAX kernel limit and also under GitHub's
14:  * ~65 536-character issue body limit, so truncated changelogs still render. ...
gateway · 2026-08-26 13:19:08
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/config.ts</path>
<type>file</type>
<content>
1: import { existsSync, lstatSync, readFileSync } from 'fs';
2: import path from 'path';
3: 
4: import { load } from 'js-yaml';
5: import GitUrlParse from 'git-url-parse';
6: import { createGitClient } from './utils/git';
7: import { ZodError } from 'zod';
8: 
9: import { logger } from './logger';
10: import {
11:   CraftProjectConfig,
12:   CraftProjectConfigSchema,
13:   GitHubGlobalConfig,
14:   ArtifactProviderName,
15:   StatusProviderName,
16:   TargetConfig,
17:   ChangelogPolicy,
18:   VersioningPolicy,
19:   Workspace,
20: } from './schemas/project_config';
21: import { ConfigurationError } from './utils/errors';
22: import { isCompiledGitHubAction } from './utils/detection';
23: import {
24:   getPackageVersion,
25:   parseVersion,
26:   versionGreaterOrEqualThan,
27:   SemVer,
28: } from './utils/version';
29: // Note: We import getTargetByName lazily in ...
gateway · 2026-08-26 13:19:13
result
Found 13 matches
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/config.ts:
  Line 87:   _globalGitHubConfigCache = undefined;

  Line 145:       // Otherwise leave `github` unset so getGlobalGitHubConfig() can still

  Line 470: let _globalGitHubConfigCache: GitHubGlobalConfig | null | undefined;

  Line 471: export async function getGlobalGitHubConfig(

  Line 474:   if (!clearCache && _globalGitHubConfigCache !== undefined) {

  Line 475:     if (_globalGitHubConfigCache === null) {

  Line 481:     return _globalGitHubConfigCache;

  Line 511:   _globalGitHubConfigCache = Object.freeze(repoGitHubConfig);

  Line 513:   return getGlobalGitHubConfig();

  Line 562:   const githubRepo = await getGlobalGitHubConfig();

  Line 591:   const githubConfig = await getGlobalGitHubConfig();


/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/config.ts:
  Line 1: import { getConfiguration, getGlobalGitHubConfig } from '../config';

  Line 9:   const ...
gateway · 2026-08-26 13:19:19
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/config.ts</path>
<type>file</type>
<content>
450:  *
451:  * @returns The versioning policy
452:  */
453: export function getVersioningPolicy(): VersioningPolicy {
454:   const config = getConfiguration();
455: 
456:   // Use explicitly configured policy if available
457:   if (config.versioning?.policy) {
458:     return config.versioning.policy as VersioningPolicy;
459:   }
460: 
461:   // Default based on minVersion
462:   return requiresMinVersion(AUTO_VERSION_MIN_VERSION)
463:     ? VersioningPolicy.Auto
464:     : VersioningPolicy.Manual;
465: }
466: 
467: /**
468:  * Return the parsed global GitHub configuration
469:  */
470: let _globalGitHubConfigCache: GitHubGlobalConfig | null | undefined;
471: export async function getGlobalGitHubConfig(
472:   clearCache = false,
473: ): Promise<GitHubGlobalConfig> {
474:   if (!clearCache && _globalGitHubConfigCache !== undefined) {
475:     if ...
gateway · 2026-08-26 13:19:27
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/publish.ts</path>
<type>file</type>
<content>
540:   // Stage 2: Push — merge succeeded, any error here is auth/network
541:   try {
542:     await git.push(remoteName, mergeTarget);
543:   } catch (pushError) {
544:     throw new PushError(
545:       pushError instanceof Error ? pushError.message : String(pushError),
546:     );
547:   }
548: 
549:   if (keepBranch) {
550:     logger.info('Not deleting the release branch.');
551:   } else {
552:     logger.debug(`Deleting the release branch: ${branch}`);
553:     await git.branch(['-D', branch]).push([remoteName, '--delete', branch]);
554:     logger.info(`Removed the remote branch: "${branch}"`);
555:   }
556: }
557: 
558: /**
559:  * Run an external post-release command
560:  *
561:  * The command is usually for bumping the development version on master or
562:  * cleanup tasks. ...
gateway · 2026-08-26 13:20:07
result
Found 5 matches
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/schemas/project_config.ts:
  Line 171:  * unit) and each entry under the top-level `workspaces` map (an explicit,

  Line 176:  * different concept from the `npm` target's `workspaces: true` field, which

  Line 208: export const WorkspaceSchema = z.object({

  Line 213: export type Workspace = z.infer<typeof WorkspaceSchema>;

  Line 232:   workspaces: z.record(z.string(), WorkspaceSchema).optional(),
gateway · 2026-08-26 13:20:11
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/src/schemas/project_config.ts</path>
<type>file</type>
<content>
150:   calver: CalVerConfigSchema.optional(),
151: });
152: 
153: export type VersioningConfig = z.infer<typeof VersioningConfigSchema>;
154: 
155: /**
156:  * Changelog configuration
157:  */
158: export const ChangelogConfigSchema = z.union([
159:   z.string(),
160:   z.object({
161:     filePath: z.string().optional(),
162:     policy: z.enum(['auto', 'simple', 'none']).optional(),
163:     scopeGrouping: z.boolean().optional(),
164:   }),
165: ]);
166: 
167: /**
168:  * Fields that describe how a single release unit is built and published.
169:  *
170:  * These are shared between the top-level config (the implicit/default release
171:  * unit) and each entry under the top-level `workspaces` map (an explicit,
172:  * independently-versioned release unit). A workspace inherits the top-level
173:  * values as defaults and overrides the fields it declares. ...
gateway · 2026-08-26 13:20:25
result
<path>/home/byk/Code/getsentry/craft-workspace-action-propagation/package.json</path>
<type>file</type>
<content>
1: {
2:   "name": "@sentry/craft",
3:   "version": "2.31.0-dev.0",
4:   "description": "The universal sentry workflow CLI",
5:   "main": "dist/craft",
6:   "repository": "https://github.com/getsentry/craft",
7:   "author": "Sentry",
8:   "license": "MIT",
9:   "bin": {
10:     "craft": "dist/craft",
11:     "sentry-craft": "dist/craft"
12:   },
13:   "devDependencies": {
14:     "@aws-sdk/client-lambda": "^3.984.0",
15:     "@eslint/js": "^9.17.0",
16:     "@google-cloud/storage": "^7.14.0",
17:     "@octokit/plugin-retry": "^7.1.2",
18:     "@octokit/request-error": "^7.0.0",
19:     "@octokit/rest": "^21.0.2",
20:     "@sentry/esbuild-plugin": "^2.23.0",
21:     "@sentry/node": "^10.27.0",
22:     "@types/async": "^3.0.1",
23:     "@types/aws4": "^1.5.1",
24:     "@types/cli-table": "^0.3.0",
25:     "@types/git-url-parse": "^9.0.0",
26:     "@types/is-ci": "^2.0.0",
27: ...
gateway · 2026-08-26 13:20:32
result
> @sentry/craft@2.31.0-dev.0 test /home/byk/Code/getsentry/craft-workspace-action-propagation
> vitest run -- src/__tests__/action.test.ts src/commands/__tests__/publish.test.ts


 RUN  v4.1.8 /home/byk/Code/getsentry/craft-workspace-action-propagation

[info] [[target/github]] No previous release found
[info] [[target/github]] Deleted orphaned draft release: v1.0.0
[info] [[target/github]] No previous release found
[warn] [[target/github]] Failed to clean up release "v1.0.0": Error: Cleanup failed
[info] [[target/github]] No previous release found
[info] [[target/github]] No previous release found
[info] [[target/github]] Release for tag "1.0.0" already exists and is published. Skipping GitHub release creation (likely from a previous run).
[info] [[target/github]] No previous release found
[info] [[target/github]] createRelease returned 422 for tag "1.0.0". Looking for a leftover draft release to clean up... ...
gateway · 2026-08-26 13:21:07
result
yarn run v1.22.22
$ vitest run src/modules/__tests__/details-from-context.js src/modules/__tests__/update-issue.js
(!) Your Vite config uses features that are unsupported by `configLoader: 'native'`, which is planned to become the default in a future major version of Vite:
  - ESM syntax in a file loaded as CommonJS (vitest.config.js:1:1). Use a `.mjs` extension or set `"type": "module"` in the closest package.json
Set `VITE_CONFIG_NATIVE_IGNORE_WARNING=true` to suppress this warning.

 RUN  v4.1.11 /home/byk/Code/getsentry/publish-workspace-acceptance


 Test Files  2 passed (2)
      Tests  15 passed (15)
   Start at  13:21:08
   Duration  273ms (transform 87ms, setup 0ms, import 125ms, tests 27ms, environment 0ms)

Done in 0.82s.
gateway · 2026-08-26 13:21:16
result
 M .github/workflows/release.yml
 M action.yml
 M src/commands/__tests__/publish.test.ts
 M src/commands/publish.ts
?? src/__tests__/action.test.ts
gateway · 2026-08-26 13:21:20
result
 M .github/workflows/publish.yml
 M src/modules/__tests__/details-from-context.js
 M src/modules/__tests__/update-issue.js
 M src/modules/details-from-context.js
 M src/modules/update-issue.js
gateway · 2026-08-26 13:21:54
result
<path>/home/byk/Code/getsentry/publish-workspace-acceptance/src/publish/inputs.js</path>
<type>file</type>
<content>
1: const github = require('@actions/github');
2: const core = require('@actions/core');
3: const { detailsFromContext } = require('../modules/details-from-context');
4: 
5: async function inputs() {
6:     const result = await detailsFromContext({
7:       context: github.context,
8:     });
9:     core.setOutput('result', result);
10: }
11: 
12: 
13: inputs();

(End of file - total 13 lines)
</content>
gateway · 2026-08-26 13:22:28
result
> @sentry/craft@2.31.0-dev.0 typecheck /home/byk/Code/getsentry/craft-workspace-action-propagation
> tsc --noEmit

gateway · 2026-08-26 13:22:42
result
yarn run v1.22.22
$ vitest run
(!) Your Vite config uses features that are unsupported by `configLoader: 'native'`, which is planned to become the default in a future major version of Vite:
  - ESM syntax in a file loaded as CommonJS (vitest.config.js:1:1). Use a `.mjs` extension or set `"type": "module"` in the closest package.json
Set `VITE_CONFIG_NATIVE_IGNORE_WARNING=true` to suppress this warning.

 RUN  v4.1.11 /home/byk/Code/getsentry/publish-workspace-acceptance


 Test Files  5 passed (5)
      Tests  22 passed (22)
   Start at  13:22:43
   Duration  963ms (transform 224ms, setup 0ms, import 894ms, tests 126ms, environment 1ms)

Done in 1.49s.
gateway · 2026-08-26 13:23:17
result
33-import {
34-  catchKeyboardInterrupt,
35-  hasExecutable,
36-  spawnProcess,
37-} from '../utils/system';
38-import { isValidVersion } from '../utils/version';
39-import { BaseStatusProvider } from '../status_providers/base';
40-import { BaseArtifactProvider } from '../artifact_providers/base';
41-import { captureException } from '@sentry/node';
42-import { SimpleGit } from 'simple-git';
43-import {
44-  getGitClient,
45-  getDefaultBranch,
46-  isRepoDirty,
47-  findReleaseBranches,
48-} from '../utils/git';
49-import { withTracing } from '../utils/tracing';
50-import { buildReleaseCommandEnv } from '../utils/releaseCommandEnv';
51:import { getPublishStatePath } from '../utils/publishState';
52-
53-/** Default path to post-release script, relative to project root */
54-const DEFAULT_POST_RELEASE_SCRIPT_PATH = join('scripts', 'post-release.sh');
55-
56-export const command = ['publish NEW-VERSION'];
57-export const aliases = ['pp', 'publish'];
58-export const description = '🛫 ...
gateway · 2026-08-26 13:23:37
result
154-          fromJSON(steps.inputs.outputs.result).repo == 'sentry-javascript' && fromJSON(steps.inputs.outputs.result).merge_target == 'v8' ||
155-          fromJSON(steps.inputs.outputs.result).repo == 'sentry-javascript' && fromJSON(steps.inputs.outputs.result).merge_target == 'v7' ||
156-          fromJSON(steps.inputs.outputs.result).repo == 'sentry-javascript' && fromJSON(steps.inputs.outputs.result).merge_target == 'master' ||
157-          fromJSON(steps.inputs.outputs.result).repo == 'sentry-python' && fromJSON(steps.inputs.outputs.result).merge_target == 'alpha' ||
158-          fromJSON(steps.inputs.outputs.result).repo == 'sentry-wizard' && fromJSON(steps.inputs.outputs.result).merge_target == '1.x' ||
159-          false
160-        id: target-repo-branch
161-        env:
162-          MERGE_TARGET: ${{ fromJSON(steps.inputs.outputs.result).merge_target }}
163-          REPO: ${{ fromJSON(steps.inputs.outputs.result).repo }}
164-        run: |
165-          echo "taking ...
gateway · 2026-08-26 13:24:15
result
<path>/home/byk/Code/getsentry/publish-workspace-acceptance/src/modules/__tests__/details-from-context.js</path>
<type>file</type>
<content>
105:   const result = await detailsFromContext({
106:     context: {
107:       repo: { owner: "getsentry", repo: "publish" },
108:       payload: {
109:         issue: {
110:           number: "123",
111:           title: 'publish: getsentry/toolkit [workspace: "cli/v2"] @1.2.3',
112:           body: "Requested by: @example",
113:           labels: [],
114:         },
115:       },
116:     },
117:   });
118: 
119:   expect(result).toMatchObject({
120:     repo: "toolkit",
121:     version: "1.2.3",
122:     workspace: "cli/v2",
123:   });
124: });
125: 
126: test("parses escaped workspace characters from the title", async () => {
127:   const result = await detailsFromContext({
128:     context: {
129:       repo: { owner: "getsentry", repo: "publish" },
130:       payload: {
131:         issue: {
132:           number: "123",
133:           ...
gateway · 2026-08-26 13:24:59

CRITICAL

  • craft/action.yml:173-179 places WORKSPACE beside env, not inside it. Composite-action steps do not allow that key, so GitHub rejects the action metadata. Even if it were ignored, craft prepare would not receive the workspace. Workspace-based releases cannot run.

    src/__tests__/action.test.ts:65-83 masks this by injecting WORKSPACE directly while executing only the shell snippet; it never verifies the parsed action-step env.

MEDIUM

  • Required regression coverage is incomplete:
    • src/__tests__/action.test.ts:106-115 tests only a Cf bidi character, not Cc, Zl, Zp, empty-title behavior, or valid non-control Unicode.
    • publish/src/modules/__tests__/details-from-context.js:162-242 covers empty, Cc, and Cf, but not Zl, Zp, or valid non-control Unicode.
    • craft/src/commands/__tests__/publish.test.ts tests getPublishStateGitHubConfig in isolation, not that publishMain reads the exact prepopulated file. The workflow’s filename calculation has no executable regression test.

Prior blockers

  1. State identity with workspace GitHub overrides: PASS in source.
    Publish derives the state filename from the title checkout repo, container cwd, and workspace encoding (publish/.github/workflows/publish.yml:214-230) and exports CRAFT_PUBLISH_STATE_GITHUB_REPO separately (:255-258). Craft applies that override only to getPublishStatePath (craft/src/commands/publish.ts:715-731); getPublishStateGitHubConfig returns a new state-only config and does not alter the resolved configuration. Status/artifact providers still use the workspace-resolved GitHub config (:685-686).

  2. Empty/control Unicode workspace titles: PASS in source.
    The action validates Cc, Cf, Zl, and Zp before title construction (craft/action.yml:74-82), and only emits a workspace title segment for a nonempty value (:263-270). ...

gpt-5.6-terra · 2026-08-26 13:24:59 · ~722 tokens

Distillations (7)

Gen 0 2026-08-26 13:26:36 · 2088 tokens

Date: Aug 26, 2026 * 🟡 (13:21) Git status in `/home/byk/Code/getsentry/craft-workspace-action-propagation`: modified `.github/workflows/release.yml`, `action.yml`, `src/commands/__tests__/publish.test.ts`, and `src/commands/publish.ts`; untracked `src/__tests__/action.test.ts`. * 🟡 (13:21) Git status in `/home/byk/Code/getsentry/publish-workspace-acceptance`: modified `.github/workflows/publish…

Gen 0 2026-08-26 13:23:09 · 1367 tokens

Date: Aug 26, 2026 * 🟡 (13:20) In `/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/publish.ts`, `runPostReleaseCommand(newVersion, postReleaseCommand?)` returns `false` without running when `postReleaseCommand === ''`; otherwise parses a specified command with `shellQuote.parse()`, or runs executable `DEFAULT_POST_RELEASE_SCRIPT_PATH` using `/bin/bash`; it appends `''` a…

Gen 0 2026-08-26 13:22:43 · 833 tokens

Date: Aug 26, 2026 * 🔴 (13:19) User stated that a following option such as `--workspace --dry-run` must never be mistaken for a workspace name. * 🟡 (13:19) `src/utils/helpers.ts` implements `extractWorkspaceSelection(argv, env = process.env)`, which reads `CRAFT_WORKSPACE`, parses raw arguments with Node `parseArgs({ options: { workspace: { type: 'string' } }, allowPositionals: true, strict: fa…

Gen 0 2026-08-26 13:22:25 · 1060 tokens

Date: Aug 26, 2026 * 🟡 (13:18) `src/__tests__/action.test.ts` defines an action-step test harness that loads `action.yml` with `js-yaml`, runs named steps through `bash -e -c`, and creates temporary fake `craft`/`git` binaries recording calls in `CRAFT_CALLS` and `GIT_CALLS`; `afterEach` recursively removes all `craft-action-test-*` temporary directories. * 🟡 (13:18) `src/__tests__/action.test.…

Gen 0 2026-08-26 13:21:09 · 542 tokens

Date: Aug 26, 2026 * 🔴 (13:18) User reaffirmed Craft package-management convention: always use `pnpm`; never use `npm` or `yarn`. * 🟡 (13:18) Craft `action.yml` shown includes a `workspace` input that is validated in a “Validate workspace” step; it also includes inputs `version` and `git_user_name`, and outputs including `sha` (`${{ steps.craft.outputs.sha }}`) and a changelog-file path output …

Gen 0 2026-08-26 13:19:53 · 1361 tokens

Date: Aug 26, 2026 * 🟡 (13:17) Read-only review workspace locations confirmed: `/home/byk/Code/getsentry/craft`, `/home/byk/Code/getsentry/craft-workspace-action-propagation`, and `/home/byk/Code/getsentry/publish-workspace-acceptance`. * 🟡 (13:17) Craft worktree `feat/workspace-action-propagation` is based at `21270a1` (`feat(config): add release workspaces`); uncommitted changes: `.github/wor…

Gen 0 2026-08-26 13:18:19 · 462 tokens

Date: Aug 26, 2026 * 🟡 [requested-review] (13:16) User requested a rigorous, read-only adversarial review of uncommitted cross-repository workspace-propagation changes in both worktrees: `/home/byk/Code/getsentry/craft-workspace-action-propagation` on branch `feat/workspace-action-propagation` with base `21270a1`; and `/home/byk/Code/getsentry/publish-workspace-acceptance` on branch `feat/worksp…