Dashboard › craft › Session 1HuF3pPuTo36
1HuF3pPuTo36mTXR0Perform a rigorous, read-only adversarial review of the uncommitted cross-repository workspace-propagation changes in BOTH worktrees:
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:
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.
/home/byk/Code/getsentry/craft /home/byk/Code/getsentry/craft-workspace-action-propagation /home/byk/Code/getsentry/publish-workspace-acceptance
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 ...
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 ...
/home/byk/Code/getsentry/craft-workspace-action-propagation/AGENTS.md
/home/byk/Code/getsentry/publish-workspace-acceptance/AGENTS.md
<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 && ...
<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 ...
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 ...
<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. ...
<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 ...
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. ...
<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. ...
<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 ...
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',
<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: ...
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(
...
<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. ...
<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 ...
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 ...
<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 ...
<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. ...
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(),
<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. ...
<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: ...
> @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... ...
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.
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
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
<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>
> @sentry/craft@2.31.0-dev.0 typecheck /home/byk/Code/getsentry/craft-workspace-action-propagation > tsc --noEmit
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.
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 = '🛫 ...
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 ...
<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: ...
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.
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.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).
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). ...
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…
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…
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…
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.…
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 …
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…
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…