Dashboard › craft › Session 0oRfvuTfUX4Y
0oRfvuTfUX4YBbPyZPerform a rigorous read-only adversarial correctness review of the current worktree changes for PR #848 (workspaces schema/resolver/selector plus uncommitted review fixes). Do not edit files. Inspect git diff against origin/master and relevant source/tests. Focus on configuration resolution, CLI parsing order/yargs interaction, SemVer edge cases, cache invalidation, backwards compatibility, release behavior. Report findings only, ordered Critical/Major/Minor, with file:line citations. End with PASS/FAIL per major concern and MERGE/DO-NOT-MERGE. Do not assume prior claims are correct.
<path>/home/byk/Code/getsentry/craft</path> <type>directory</type> <entries> .craft-issue-842-plan.md .craft.yml .dockerignore .eslintcache .git/ .github/ .gitignore .lore.md .nojekyll .npmignore .opencode/ .prettierignore .prettierrc.yml .tsbuildinfo .vscode/ action.yml AGENTS.md blog-post-draft.md build.mjs CHANGELOG.md CONTRIBUTING.md dist/ Dockerfile docs/ eslint.config.mjs img/ LICENSE node_modules/ package.json pnpm-lock.yaml README.md src/ tsconfig.build.json tsconfig.json vitest.config.mts (35 entries) </entries>
M .lore.md ?? .craft-issue-842-plan.md ?? .opencode/ byk/fix/commit-on-repo b06435e (HEAD -> byk/fix/commit-on-repo, origin/byk/fix/commit-on-repo) fix(commit-on-git): Use proper username and pass for 0652969 meta: Bump new development version 4f1b8e4 Merge branch 'release/2.27.1' e0c36c1 (tag: 2.27.1) release: 2.27.1 d61cb8f fix(crates): Recognize more already-published error messages (#859) c35b90a meta: Bump new development version 11baa7f Merge branch 'release/2.27.0' 667b5f5 (tag: 2.27.0) release: 2.27.0 d28b0e6 fix(crates): Ignore dev dependencies when ordering packages (#858) 9668a4b fix: bump postcss to ^8.5.18 to resolve high-severity ...
worktree /home/byk/Code/getsentry/craft HEAD b06435e4f20ff8cb0470de98ee113051978b3d63 branch refs/heads/byk/fix/commit-on-repo worktree /home/byk/.local/share/opencode/worktree/55fa901aca64a01fa4b5c2abce1c85c1c27475e7/calm-circuit HEAD 5d533c854ad481c31162c4e003cabe23ac5e900a branch refs/heads/feat/ci-ready-signal worktree /home/byk/.local/share/opencode/worktree/55fa901aca64a01fa4b5c2abce1c85c1c27475e7/calm-squid HEAD 347ade0345dc9f46bce480600ca2beef66100c8f branch refs/heads/fix/postcss-security-alert worktree /home/byk/.local/share/opencode/worktree/55fa901aca64a01fa4b5c2abce1c85c1c27475e7/stellar-falcon HEAD fc4c1d00d721eb76d9ccc46f841cb2b4b03ed665 branch refs/heads/byk/fix/dependabot-alerts-865 worktree /home/byk/.local/share/opencode/worktree/55fa901aca64a01fa4b5c2abce1c85c1c27475e7/swift-squid HEAD 752a693b6ddc3d9b855ddb921e3f91d6e3a847b8 branch refs/heads/fix/flaky-zip-test worktree /home/byk/Code/getsentry/craft-vercel-prebuilt-output HEAD ...
## feat/workspaces-schema...origin/feat/workspaces-schema M src/__tests__/config.test.ts M src/config.ts M src/utils/__tests__/helpers.test.ts M src/utils/helpers.ts c099bbf (HEAD -> feat/workspaces-schema, origin/feat/workspaces-schema) Merge branch 'master' into feat/workspaces-schema 42d17f0 (feat/workspaces-threading) fix(config): address Bugbot findings on workspaces selector 4e2d8f4 feat(config): add top-level workspaces schema + --workspace selector M src/__tests__/config.test.ts M src/commands/publish.ts M src/config.ts M src/index.ts M src/schemas/project_config.ts M src/utils/__tests__/helpers.test.ts M src/utils/helpers.ts M src/__tests__/config.test.ts M src/config.ts M src/utils/__tests__/helpers.test.ts M src/utils/helpers.ts src/__tests__/config.test.ts | 198 +++++++++++++++++++++++++++++++ src/commands/publish.ts | 21 +++- src/config.ts | 230 +++++++++++++++++++++++++++++++----- src/index.ts | 23 ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/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 ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/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/craft-workspaces-schema/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: import * as ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/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-workspaces-schema/src/commands/publish.ts</path>
<type>file</type>
<content>
1: import { Arguments, Argv, CommandBuilder } from 'yargs';
2: import chalk from 'chalk';
3: import { existsSync, mkdirSync, readFileSync } from 'fs';
4:
5: import { safeFs } from '../utils/dryRun';
6: import { dirname, join } from 'path';
7: import * as shellQuote from 'shell-quote';
8: import stringLength from 'string-length';
9:
10: import {
11: getConfiguration,
12: getStatusProviderFromConfig,
13: getArtifactProviderFromConfig,
14: DEFAULT_RELEASE_BRANCH_NAME,
15: getGlobalGitHubConfig,
16: expandWorkspaceTargets,
17: getNoMergeConfig,
18: } from '../config';
19: import { formatTable, logger } from '../logger';
20: import { TargetConfig } from '../schemas/project_config';
21: import { getAllTargetNames, getTargetByName, SpecialTarget } from '../targets';
22: import { BaseTarget } from '../targets/base';
23: import {
24: ConfigurationError,
25: ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/__tests__/config.test.ts</path>
<type>file</type>
<content>
1: import { describe, test, expect, vi, afterEach } from 'vitest';
2: /**
3: * Tests of our ability to read craft config files. (This is NOT general test
4: * configuration).
5: */
6:
7: import {
8: getGitTagPrefix,
9: loadConfigurationFromString,
10: validateConfiguration,
11: setActiveWorkspace,
12: getActiveWorkspace,
13: getVersioningPolicy,
14: WORKSPACES_MIN_VERSION,
15: } from '../config';
16: import { CraftProjectConfigSchema } from '../schemas/project_config';
17: import { logger } from '../logger';
18:
19: describe('validateConfiguration', () => {
20: test('parses minimal configuration', () => {
21: const data = { github: { owner: 'getsentry', repo: 'craft' } };
22:
23: expect(validateConfiguration(data)).toEqual(data);
24: });
25:
26: test('parses configuration with targets', () => {
27: const data = {
28: ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/__tests__/helpers.test.ts</path>
<type>file</type>
<content>
1: import { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';
2: import path from 'path';
3: import { tmpdir } from 'os';
4:
5: import { afterEach, beforeEach, describe, expect, test } from 'vitest';
6:
7: import {
8: disableChangelogMentions,
9: envToBool,
10: extractWorkspaceSelection,
11: MAX_STEP_OUTPUT_BYTES,
12: setGitHubActionsOutput,
13: truncateForOutput,
14: writeGitHubActionsFile,
15: } from '../helpers';
16:
17: describe('envToBool', () =>
18: test.each([
19: [undefined, false],
20: [null, false],
21: [false, false],
22: ['undefined', false],
23: ['null', false],
24: ['', false],
25: ['0', false],
26: ['no', false],
27: [true, true],
28: ['true', true],
29: [1, true],
30: ['1', true],
31: ['yes', true],
32: ['dogs are great!', true],
33: ])('From %j we should get ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/version.ts</path>
<type>file</type>
<content>
1: import { getGitTagPrefix } from '../config';
2:
3: /**
4: * Regular expression for matching semver versions.
5: *
6: * Modified to match version components
7: * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
8: * @see https://github.com/sindresorhus/semver-regex
9: */
10: const semverRegex = () =>
11: /\bv?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-?([\da-z-]+(?:\.[\da-z-]+)*))?(?:\+([\da-z-]+(?:\.[\da-z-]+)*))?\b/gi;
12:
13: /**
14: * Extracts a version number from the given text.
15: *
16: * In case the version contains a leading "v", it is stripped from the result.
17: * All semantic versions are supported. See {@link http://semver.org/} for
18: * more information. ...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_034a9918b001f9I87vjYOe70vD
'are defined in the configuration file.',
);
}
return config;
}
// Workspaces are defined: require an explicit selection (no implicit first).
if (!_activeWorkspaceName) {
const available = Object.keys(config.workspaces || {}).join(', ');
throw new ConfigurationError(
'This configuration defines workspaces; select one with ' +
`--workspace <name> (or the CRAFT_WORKSPACE env var). ` +
`Available workspaces: ${available}.`,
);
}
// Gate the feature behind minVersion, mirroring auto-versioning.
if (!isVersionGteMinVersion(config.minVersion, WORKSPACES_MIN_VERSION)) {
throw new ConfigurationError(
`Using "workspaces" requires minVersion >= ${WORKSPACES_MIN_VERSION} ` +
'in the configuration file.',
);
}
return resolveWorkspaceConfig(config, ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "@sentry/craft",
3: "version": "2.29.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: ...
Found 23 matches
/home/byk/Code/getsentry/craft-workspaces-schema/src/config.ts:
Line 106: * - `github` is shallow-merged (owner/repo/projectPath) so a workspace can
Line 107: * override just `projectPath` while inheriting owner/repo.
Line 139: // (e.g. just projectPath) while inheriting owner/repo from the base.
Line 148: // sets projectPath without a base github relies on git detection for
/home/byk/Code/getsentry/craft-workspaces-schema/src/targets/pypi.ts:
Line 65: const pyprojectPath = join(rootDir, 'pyproject.toml');
Line 66: if (!existsSync(pyprojectPath)) {
Line 70: const content = readFileSync(pyprojectPath, 'utf-8');
Line 87: return PypiTarget.bumpDirectToml(pyprojectPath, content, newVersion);
Line 139: pyprojectPath: string,
Line 161: logger.debug(`Updating version in ${pyprojectPath} to ${newVersion}`);
Line 162: writeFileSync(pyprojectPath, ...
Found 19 matches
/home/byk/Code/getsentry/craft-workspaces-schema/src/targets/github.ts:
Line 113: const configChangelog = getConfiguration().changelog;
Line 722: const config = getConfiguration();
/home/byk/Code/getsentry/craft-workspaces-schema/src/config.ts:
Line 331: export function getConfiguration(clearCache = false): CraftProjectConfig {
Line 431: const config = getConfiguration();
Line 454: const config = getConfiguration();
Line 486: let repoGitHubConfig = getConfiguration(clearCache).github || null;
Line 528: const targets = getConfiguration().targets || [];
Line 555: const projectConfig = getConfiguration();
Line 590: const config = getConfiguration();
Line 639: const config = getConfiguration();
Line 706: const config = getConfiguration();
/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/targets.ts:
Line 10: let definedTargets = getConfiguration().targets || ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/targets.ts</path>
<type>file</type>
<content>
1: import { getConfiguration, expandWorkspaceTargets } from '../config';
2: import { formatJson } from '../utils/strings';
3: import { getAllTargetNames } from '../targets';
4: import { BaseTarget } from '../targets/base';
5:
6: export const command = ['targets'];
7: export const description = 'List defined targets as JSON array';
8:
9: export async function handler(): Promise<any> {
10: let definedTargets = getConfiguration().targets || [];
11:
12: // Expand workspace targets (e.g., npm workspaces)
13: definedTargets = await expandWorkspaceTargets(definedTargets);
14:
15: const possibleTargetNames = new Set(getAllTargetNames());
16: const allowedTargetNames = definedTargets
17: .filter(target => target.name && possibleTargetNames.has(target.name))
18: .map(BaseTarget.getId);
19:
20: console.log(formatJson(allowedTargetNames));
21: }
(End of file ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/prepare.ts</path>
<type>file</type>
<content>
650: // Trim trailing blank lines
651: while (endIdx > startIdx + 1 && lines[endIdx - 1].trim() === '') {
652: endIdx--;
653: }
654:
655: return `#L${startIdx + 1}-L${endIdx}`;
656: } catch {
657: return '';
658: }
659: }
660:
661: /**
662: * Switches to the default branch of the repo
663: *
664: * @param git Local git client
665: * @param defaultBranch Default branch of the remote repository
666: */
667: async function switchToDefaultBranch(
668: git: SimpleGit,
669: defaultBranch: string,
670: ): Promise<void> {
671: const repoStatus = await git.status();
672: if (repoStatus.current === defaultBranch) {
673: return;
674: }
675: logger.info(`Switching back to the default branch (${defaultBranch})...`);
676: await git.checkout(defaultBranch);
677: }
678:
679: interface ResolveVersionOptions {
680: /** The raw ...
["publish","--workspace","--dry-run","1"] {"values":{"workspace":"--dry-run"},"positionals":["publish","1"],"tokens":[{"kind":"positional","index":0,"value":"publish"},{"kind":"option","name":"workspace","rawName":"--workspace","index":1,"value":"--dry-run","inlineValue":false},{"kind":"positional","index":3,"value":"1"}]}
["publish","--workspace"] {"values":{"workspace":true},"positionals":["publish"],"tokens":[{"kind":"positional","index":0,"value":"publish"},{"kind":"option","name":"workspace","rawName":"--workspace","index":1}]}
["--workspace="] {"values":{"workspace":""},"positionals":[],"tokens":[{"kind":"option","name":"workspace","rawName":"--workspace","index":0,"value":"","inlineValue":true}]}
["--workspace","cli","--workspace=mcp"] ...
toString false function true constructor false function true hasOwnProperty false function true __proto__ false object true
["publish","1.0.0","--","--workspace","cli"] [{"kind":"positional","index":0,"value":"publish"},{"kind":"positional","index":1,"value":"1.0.0"},{"kind":"option-terminator","index":2},{"kind":"positional","index":3,"value":"--workspace"},{"kind":"positional","index":4,"value":"cli"}]
["publish","1.0.0","--workspace","cli","--","--workspace","mcp"] [{"kind":"positional","index":0,"value":"publish"},{"kind":"positional","index":1,"value":"1.0.0"},{"kind":"option","name":"workspace","rawName":"--workspace","index":2,"value":"cli","inlineValue":false},{"kind":"option-terminator","index":4},{"kind":"positional","index":5,"value":"--workspace"},{"kind":"positional","index":6,"value":"mcp"}]
["publish","1.0.0","--workspace","cli","--workspace","--dry-run"] ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/config.ts</path>
<type>file</type>
<content>
1: import { getConfiguration, getGlobalGitHubConfig } from '../config';
2: import { formatJson } from '../utils/strings';
3:
4: export const command = ['config'];
5: export const description =
6: 'Print the parsed, processed, and validated Craft config for the current project in pretty-JSON.';
7:
8: export async function handler(): Promise<void> {
9: const github = await getGlobalGitHubConfig();
10: const config = {
11: ...getConfiguration(),
12: github,
13: };
14: console.log(formatJson(config));
15: }
(End of file - total 15 lines)
</content>
[{"url":"https://api.github.com/repos/getsentry/craft/pulls/comments/3629713433","pull_request_review_id":4753734295,"id":3629713433,"node_id":"PRRC_kwDOCDHbwM7YWQgZ","diff_hunk":"@@ -55,6 +57,164 @@ let _configPathCache: string;\n */\n let _configCache: CraftProjectConfig;\n \n+/**\n+ * The minimum craft version required to use the top-level `workspaces` config.\n+ *\n+ * This is the release the workspaces feature ships in. A dev build of that\n+ * release (e.g. `2.27.0-dev.0`) satisfies it via the pre-release relaxation in\n+ * `checkMinimalConfigVersion`.\n+ */\n+export const WORKSPACES_MIN_VERSION = '2.27.0';\n+\n+/**\n+ * The name of the currently-selected workspace, or undefined for the default\n+ * (single implicit release unit). Set once via `setActiveWorkspace` from the\n+ * `--workspace` CLI option / `CRAFT_WORKSPACE` env before any config access.\n+ */\n+let _activeWorkspaceName: string | undefined;\n+\n+/**\n+ * Selects the active workspace for subsequent configuration ...
<path>/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/releaseCommandEnv.ts</path> <type>file</type> <content> 1: /** 2: * Allowlist-based environment construction for user-defined release 3: * commands (`preReleaseCommand` / `postReleaseCommand` from `.craft.yml`). 4: * 5: * `.craft.yml` is attacker-influenceable via untrusted PRs: a malicious 6: * contributor can set `preReleaseCommand` to any shell command, and if we 7: * forward the full `process.env` to the subprocess, they gain access to 8: * every secret in the CI environment (GitHub tokens, npm tokens, GPG 9: * keys, etc.) and can exfiltrate them. 10: * 11: * The mitigation is to forward only a small, explicit allowlist of 12: * environment variables to the subprocess. Scripts that need additional 13: * variables should be updated to read them from a secrets file, or to 14: * use the `CRAFT_` prefix (which yargs surfaces as explicit CLI options). ...
Found 5 matches
/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/releaseCommandEnv.ts:
Line 92: export function buildReleaseCommandEnv(
/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/publish.ts:
Line 49: import { buildReleaseCommandEnv } from '../utils/releaseCommandEnv';
Line 562: env: buildReleaseCommandEnv({ CRAFT_RELEASED_VERSION: newVersion }),
/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/prepare.ts:
Line 64: import { buildReleaseCommandEnv } from '../utils/releaseCommandEnv';
Line 421: env: buildReleaseCommandEnv({
Date: Aug 24, 2026 * 🟡 (16:54) Tool comparison of CLI parsing for `workspace`: custom token parser treats `["publish","--workspace","--dry-run","1"]` as `workspace: "--dry-run"` with `"1"` positional, whereas `yargs-parser` yields `workspace: ""`, `"dry-run": "1"`, `dryRun: "1"`. For `["publish","--workspace"]`, custom parser yields `workspace: true`; `yargs-parser` yields `workspace: ""`. For `…
Date: Aug 24, 2026 * 🟡 (16:53) Inspected `/home/byk/Code/getsentry/craft-workspaces-schema/src/commands/prepare.ts:667-785`. `switchToDefaultBranch(git, defaultBranch)` checks `git.status().current`, returns if already on `defaultBranch`, otherwise logs and runs `git.checkout(defaultBranch)`. * 🟡 (16:53) `resolveVersion(git, options)` gets configuration via `getConfiguration()` and resolves `op…
Date: Aug 24, 2026 * 🔴 (16:46) User stated that prerelease-version relaxation applies only to the current Craft version side, never the configured `minVersion` side. * 🔴 (16:46) User stated that a following CLI flag (for example, in `--workspace --dry-run`) must never be mistaken for a workspace name. * 🟡 (16:46) Inspected a truncated diff/output for workspace configuration support. `getConfig…
Date: Aug 24, 2026 * 🟡 (16:45) Inspected `/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/version.ts` (170 lines). * 🟡 (16:45) `src/utils/version.ts:10-11` defines `semverRegex()` as `/\bv?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-?([\da-z-]+(?:\.[\da-z-]+)*))?(?:\+([\da-z-]+(?:\.[\da-z-]+)*))?\b/gi`, matching optional leading `v`, numeric major/minor/patch components with…
Date: Aug 24, 2026 * 🔴 (16:40) User stated that a following option such as `--workspace --dry-run` must never be mistaken for a workspace name. * 🟡 (16:40) Inspected `/home/byk/Code/getsentry/craft-workspaces-schema/src/utils/helpers.ts` (238 lines). * 🟡 (16:40) `src/utils/helpers.ts:16` exports `MAX_STEP_OUTPUT_BYTES = 64 * 1024` (64 KB), selected to remain under the approximately 2 MB `ARG_M…
Date: Aug 24, 2026 * 🟡 (16:40) Inspected `/home/byk/Code/getsentry/craft-workspaces-schema/src/index.ts` (137 lines). CLI imports `extractWorkspaceSelection` from `./utils/helpers` and `setActiveWorkspace` from `./config`. * 🟡 (16:40) `src/index.ts:66-75` defines `fixGlobalBooleanFlags(argv: string[]): string[]`, which appends `'1'` immediately after standalone arguments whose `arg.slice(2)` is…
Date: Aug 24, 2026 * 🔴 [requested-review] (16:27) User requested a rigorous read-only adversarial correctness review of current worktree changes for PR #848, compared against `origin/master` and relevant source/tests; explicitly instructed not to edit files. * 🔴 [requested-review] (16:27) User requested findings only, ordered Critical/Major/Minor with `file:line` citations, focused on configura…