Dashboard › craft › Session 0tbx5cYYn9wc
0tbx5cYYn9wcx3EYwYour prior review returned empty. Retry now as a STRICT read-only review. Do not edit, format, commit, or change git state. You MUST return substantive evidence or begin exactly BLOCKED with the exact tool/error. Inspect the full current diffs and relevant code/tests in both worktrees. Report severity-prioritized findings with exact file:line citations, then PASS/CONCERN/MUST-FIX for every contract point from my prior prompt, and end exactly MERGE or DO-NOT-MERGE. Do not return a generic summary or empty output.
<path>/home/byk/Code/getsentry</path> <type>directory</type> <entries> cli-api-1423/ cli-wt/ cli/ codecov-action/ craft-vercel-prebuilt-output/ craft-vercel-project-config/ craft-workspace-action-propagation/ craft-workspaces-schema/ craft/ devinfra-coder-infra/ devinfra-deployment-service/ getsentry/ ops/ package_grant_publish_repo/ publish-workspace-acceptance/ publish/ security-as-code/ self-hosted/ sentry-api-schema/ sentry-docs/ sentry-forge/ sentry-go/ sentry-javascript/ sentry-orbital/ sentry-python/ sentry-release-registry/ sentry-wizard/ sentry/ snuba/ spotlight/ sqlish/ static-sites/ stripe-app/ symbolic/ (34 entries) </entries>
No files found
No files found
M action.yml M docs/src/content/docs/targets/github.md M src/__tests__/action.test.ts M src/__tests__/config.test.ts M src/config.ts action.yml | 4 +- docs/src/content/docs/targets/github.md | 19 ++++--- src/__tests__/action.test.ts | 55 +++++++++++++------ src/__tests__/config.test.ts | 52 +++++++++++++++++- src/config.ts | 94 +++++++++++++++++++++++++++++---- 5 files changed, 187 insertions(+), 37 deletions(-) action.yml docs/src/content/docs/targets/github.md src/__tests__/action.test.ts src/__tests__/config.test.ts src/config.ts /home/byk/Code/getsentry/craft-workspace-action-propagation feat/workspace-action-propagation
M .github/workflows/publish.yml M docs/publish-issue-format.md M src/modules/__tests__/ci-poller-input.js M src/modules/__tests__/details-from-context.js M src/modules/__tests__/publish-location.js M src/modules/__tests__/publish-workflow.js M src/modules/details-from-context.js M src/modules/post-workflow-details.js M src/modules/publish-issue-title.js M src/modules/publish-issue-title.peggy M src/modules/publish-location.js M src/publish/inputs.js M src/publish/resolve-location.js .github/workflows/publish.yml | 7 +- docs/publish-issue-format.md | 40 ++--- src/modules/__tests__/ci-poller-input.js | 4 +- src/modules/__tests__/details-from-context.js | 198 +---------------------- src/modules/__tests__/publish-location.js | 61 ++----- src/modules/__tests__/publish-workflow.js | 8 +- src/modules/details-from-context.js | 24 +-- src/modules/post-workflow-details.js | 2 +- ...
diff --git a/action.yml b/action.yml
index 94f3158..84377a8 100644
--- a/action.yml
+++ b/action.yml
@@ -81,8 +81,8 @@ runs:
echo "::error::The path and workspace inputs cannot be used together."
exit 1
fi
- if [[ -n "$WORKSPACE" ]] && ! node -e 'process.exit(/^(?!\.{1,2}$)(?!__proto__$)(?!-)[A-Za-z0-9_.-]+$/.test(process.env.WORKSPACE) ? 0 : 1)'; then
- echo "::error::Workspace names must use only ASCII letters, digits, periods, underscores, and hyphens."
+ if [[ -n "$WORKSPACE" ]] && ! node -e 'const workspace = process.env.WORKSPACE; const segment = /^[A-Za-z0-9_.-]+$/; process.exit(workspace.split("/").every(name => segment.test(name) && ![".", "..", "__proto__"].includes(name) && !name.startsWith("-")) ? 0 : 1)'; then
+ echo "::error::Workspace names must use ASCII path segments containing only letters, digits, periods, underscores, and hyphens."
exit 1
fi
diff --git ...
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index f6dc96a..c72068a 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -172,12 +172,7 @@ jobs:
PUBLISH_ARGS: ${{ steps.inputs.outputs.result }}
run: |
workspace_names='[]'
- requires_workspace_discovery="$(node -e '
- const { needsWorkspaceDiscovery } = require("./.__publish__/src/modules/publish-location");
- const input = JSON.parse(process.env.PUBLISH_ARGS || "");
- process.stdout.write(String(needsWorkspaceDiscovery(input)));
- ')"
- if [[ "$requires_workspace_discovery" == "true" && -f __repo__/.craft.yml ]]; then
+ if [[ -f __repo__/.craft.yml ]]; then
workspace_names="$(docker run --rm \
--volume "$GITHUB_WORKSPACE/__repo__:/github/workspace/__repo__" \
--workdir /github/workspace/__repo__ \
diff --git ...
<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/action.yml</path>
<type>file</type>
<content>
225: - name: Request publish
226: id: request-publish
227: shell: bash
228: env:
229: # NOTE: CHANGELOG is read from a file to avoid E2BIG errors.
230: # Large changelogs (e.g. sentry's monthly releases) can exceed the ~2 MB
231: # Linux ARG_MAX limit when passed as an environment variable.
232: CHANGELOG_FILE: ${{ steps.craft.outputs.changelog_file }}
233: TARGETS: ${{ steps.craft-targets.outputs.targets }}
234: RESOLVED_VERSION: ${{ steps.craft.outputs.version }}
235: RELEASE_BRANCH: ${{ steps.craft.outputs.branch }}
236: RELEASE_SHA: ${{ steps.craft.outputs.sha }}
237: RELEASE_PREVIOUS_TAG: ${{ steps.craft.outputs.previous_tag || 'HEAD' }}
238: SUBDIRECTORY: ${{ inputs.path != '.' && format('/{0}', inputs.path) || '' }}
239: MERGE_TARGET: ${{ inputs.merge_target ...
<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: import { globSync, hasMagic } from 'glob';
4:
5: import { load } from 'js-yaml';
6: import GitUrlParse from 'git-url-parse';
7: import { createGitClient } from './utils/git';
8: import { ZodError } from 'zod';
9:
10: import { logger } from './logger';
11: import {
12: CraftProjectConfig,
13: CraftProjectConfigSchema,
14: GitHubGlobalConfig,
15: ArtifactProviderName,
16: StatusProviderName,
17: TargetConfig,
18: ChangelogPolicy,
19: VersioningPolicy,
20: Workspace,
21: } from './schemas/project_config';
22: import { ConfigurationError } from './utils/errors';
23: import { isCompiledGitHubAction } from './utils/detection';
24: import {
25: getPackageVersion,
26: parseVersion,
27: versionGreaterOrEqualThan,
28: SemVer,
29: } from './utils/version';
30: // ...
<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 ...
<path>/home/byk/Code/getsentry/publish-workspace-acceptance</path> <type>directory</type> <entries> .eslintrc.js .git .github/ .gitignore AGENTS.md auto-approve-repos.txt docs/ LICENSE node_modules/ package.json README.md scripts/ src/ vitest.config.js yarn.lock (15 entries) </entries>
Found 25 matches
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/workspace_cmds/__tests__/list.test.ts:
Line 4: getWorkspaceNames: vi.fn(),
Line 10: import { getWorkspaceNames } from '../../../config';
Line 13: describe('workspace list command', () => {
Line 14: test('prints exact configured workspace names', () => {
Line 15: vi.mocked(getWorkspaceNames).mockReturnValue(['cli', 'mcp.v2']);
Line 23: test('prints an empty array when no workspaces are configured', () => {
Line 24: vi.mocked(getWorkspaceNames).mockReturnValue([]);
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/workspace_cmds/list.ts:
Line 1: import { getWorkspaceNames } from '../../config';
Line 5: export const description = 'List defined release workspaces as a JSON array';
Line 8: console.log(formatJson(getWorkspaceNames()));
/home/byk/Code/getsentry/craft-workspace-action-propagation/src/commands/workspace.ts:
Line 3: ...
<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: ...
<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/schemas/project_config.ts</path>
<type>file</type>
<content>
1: import { z } from 'zod';
2:
3: /**
4: * DEPRECATED: Use changelog.policy instead. Different policies for changelog management
5: */
6: export const enum ChangelogPolicy {
7: Auto = 'auto',
8: Simple = 'simple',
9: None = 'none',
10: }
11:
12: /**
13: * Name of the status provider
14: */
15: export const enum StatusProviderName {
16: GitHub = 'github',
17: }
18:
19: /**
20: * Name of the artifact provider
21: */
22: export const enum ArtifactProviderName {
23: GCS = 'gcs',
24: GitHub = 'github',
25: None = 'none',
26: }
27:
28: /**
29: * Default versioning policy when no version argument is provided. ...
<path>/home/byk/Code/getsentry/publish-workspace-acceptance/src/modules/publish-location.js</path>
<type>file</type>
<content>
1: function resolvePublishLocation({ path, workspaceNames }) {
2: if (path === ".") {
3: return { path };
4: }
5:
6: if (!workspaceNames.every(isWorkspaceName)) {
7: throw new Error(
8: "Craft workspace discovery returned an invalid workspace list."
9: );
10: }
11:
12: const workspace = path.slice(2);
13: if (workspaceNames.includes(workspace)) {
14: return { path: ".", workspace };
15: }
16:
17: return { path };
18: }
19:
20: function isWorkspaceName(name) {
21: return (
22: typeof name === "string" &&
23: name !== "__proto__" &&
24: name !== "." &&
25: name !== ".." &&
26: !name.split("/").includes("..") &&
27: /^(?:[A-Za-z0-9_.-]+\/)*[A-Za-z0-9_.-]+$/.test(name)
28: );
29: }
30:
31: module.exports = { resolvePublishLocation };
(End of file - total 31 lines)
</content>
Date: Sep 3, 2026 * 🔴 (23:32) User stated that a following option such as `--workspace --dry-run` must never be mistaken for a workspace name. * 🟡 (23:32) In `/home/byk/Code/getsentry/craft-workspace-action-propagation/src/utils/helpers.ts`, `MAX_STEP_OUTPUT_BYTES = 64 * 1024` limits GitHub Actions step outputs to avoid `E2BIG` when outputs become environment variables in later steps; 64 KB is …
Date: Sep 3, 2026 * 🔴 (23:24) User stated the CI poller always adds `ci-ready` after checking CI. * 🟡 (23:24) `.github/workflows/publish.yml` is a `Publish` workflow triggered by `issues` `labeled` events. It uses concurrency group `${{ github.event.issue.title }}` with `cancel-in-progress: false`, and permissions `contents: read`, `issues: write`, `packages: write`. * 🟡 (23:24) `.github/workf…
Date: Sep 3, 2026 * 🔴 (23:19) User directive/preference: when relaxing prerelease version compatibility, relax only the CURRENT Craft version side, never the configured `minVersion` side. * 🟡 (23:19) `action.yml` Request publish step constructs issue titles as `publish: ${GITHUB_REPOSITORY}${SUBDIRECTORY}${WORKSPACE:+/$WORKSPACE}@${RESOLVED_VERSION}`; it receives `WORKSPACE: ${{ inputs.workspac…
Date: Sep 3, 2026 * 🔴 (23:18) User directive/preference: publish requests always include the checkout repository identity. * 🔴 (23:18) User directive/preference: missing root `.craft.yml` always means checkout-path behavior. * 🔴 (23:18) User directive/preference: controller never normalizes names. * 🔴 (23:18) User directive/preference: always use `pnpm` for package management; never use `npm`…
Date: Sep 3, 2026 * 🔴 (23:18) User directive/preference: action publish titles should always carry the full concrete workspace path (“always carry the full concrete”). * 🟡 (22:36) Tool inspection identified two modified worktrees under `/home/byk/Code/getsentry`: `craft-workspace-action-propagation` on branch `feat/workspace-action-propagation` with 5 modified files (`action.yml`, `docs/src/con…
Date: Sep 3, 2026 * 🔴 [requested-review] (22:33) User requested a retry of a prior empty code review as a STRICT read-only review. They require no editing, formatting, commits, or git-state changes; inspection of full current diffs and relevant code/tests in both worktrees; substantive evidence or an output beginning exactly `BLOCKED` with the exact tool/error; severity-prioritized findings with…