* test(#1995): regression test for agent-<id> branch namespace Add failing-first tests proving that normalizeCleanupManifestEntry and planWorktreeRecordAgent reject Claude Code's current agent-<id> isolation branches (only worktree-agent-<id> is accepted). Boundary tests cover both namespaces plus rejection cases. * fix(#1995): widen worktree branch regex to accept agent-<id> namespace Claude Code's isolation="worktree" branch naming changed from worktree-agent-<id> to agent-<id>. Widen the regex in all 7 locations from ^worktree-agent-[A-Za-z0-9._/-]+$ to ^(worktree-)?agent-[A-Za-z0-9._/-]+$ so both namespaces are accepted. Introduce a shared WORKTREE_AGENT_BRANCH_RE constant in src/worktree-safety.cts to prevent future drift. Closes #1995 * fix(#1995): update workflow guards, test assertions, and baselines Widen the branch-check regex in execute-phase.md and execute-plan.md. Update all test assertions that checked for ^worktree-agent- to expect the widened ^(worktree-)?agent- pattern. Regenerate golden-install-parity fixtures, agent-size-baseline, and workflow-size-baseline. Closes #1995 * fix(#1995): update extractCwdGuardBash sanity check for widened regex The e2e test's sanity check verified the extracted bash block contained 'worktree-agent-'. After widening to '(worktree-)?agent-', update the check to match the new pattern. * fix(#1995): widen missed workflow-guard branch check + changeset + lint fixes - hooks/gsd-workflow-guard.js: widen startsWith('worktree-agent-') to /^(worktree-)?agent-/ regex — same defect class, was missed in prior commit - tests/worktree.test.cjs: fix indentation regression from prior edit - Add .changeset/1995-worktree-agent-branch-namespace.md (pr:0 placeholder) Found by orthogonal code review (Step 4). * fix(#1995): regenerate golden + size baselines for workflow-guard change * docs(#1995): backfill changeset PR number (2548)
This commit is contained in:
5
.changeset/1995-worktree-agent-branch-namespace.md
Normal file
5
.changeset/1995-worktree-agent-branch-namespace.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 2548
|
||||
---
|
||||
**Worktree branch guards now accept Claude Code's `agent-<id>` namespace** — the `worktree record-agent` command, the spawn-time branch check, the cleanup-wave manifest reader, and the force-add/path/workflow guards all accept both the current `agent-<id>` and the legacy `worktree-agent-<id>` branch naming. Previously, Claude Code's rename from `worktree-agent-<id>` to `agent-<id>` caused every executor sub-agent to fail its branch check (false-positive FATAL / exit 42) and silently dropped valid cleanup-manifest entries (`empty_manifest`), blocking merge-back. (#1995)
|
||||
@@ -495,11 +495,11 @@ if [ -f .git ]; then # worktree
|
||||
echo "DO NOT use 'git update-ref' to rewind the protected branch — surface as blocker (#2924)." >&2
|
||||
exit 1
|
||||
fi
|
||||
# Positive allow-list: HEAD must be on the canonical Claude Code worktree-agent
|
||||
# branch namespace (`worktree-agent-<id>`). This catches feature/* and any other
|
||||
# arbitrary branch that the deny-list would silently allow (#2924).
|
||||
if ! echo "$ACTUAL_BRANCH" | grep -Eq '^worktree-agent-[A-Za-z0-9._/-]+$'; then
|
||||
echo "FATAL: refusing to commit — worktree HEAD '$ACTUAL_BRANCH' is not in the worktree-agent-* namespace." >&2
|
||||
# Positive allow-list: HEAD must be on a per-agent branch (`agent-<id>` or
|
||||
# legacy `worktree-agent-<id>`). This catches feature/* and any other
|
||||
# arbitrary branch that the deny-list would silently allow (#2924, #1995).
|
||||
if ! echo "$ACTUAL_BRANCH" | grep -Eq '^(worktree-)?agent-[A-Za-z0-9._/-]+$'; then
|
||||
echo "FATAL: refusing to commit — worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* namespace." >&2
|
||||
echo "Agent commits must live on per-agent branches; surface as blocker (#2924)." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -612,7 +612,7 @@ node gsd-tools.cjs worktree record-agent \
|
||||
--manifest <path> --agent-id <id> --path <worktree> --branch <branch> --base <sha>
|
||||
```
|
||||
|
||||
**`worktree record-agent`** appends one `{agent_id, worktree_path, branch, expected_base}` entry to an already-initialized manifest, validating every field **at write time using the same rules the `cleanup-wave` reader enforces** — `--branch` must match the disposable `^worktree-agent-[A-Za-z0-9._/-]+$` namespace, and `--path`/`--branch`/`--base` must be non-empty. `--agent-id` is required (write-strict), even though the reader treats it as optional. A missing or garbled field — or a duplicate `(worktree_path, branch)` the reader would dedup away — fails loudly with a recovery hint and a non-zero exit **without** writing, instead of appending an under-populated or silently-dropped entry. Whitespace-only `--path`/`--base` are rejected (values are trimmed). The on-disk manifest shape is unchanged (the reader re-derives `allowed_bases`); the orchestrator still initializes the empty `{orchestrator_root, worktrees: []}` shell inline before any agent is recorded.
|
||||
**`worktree record-agent`** appends one `{agent_id, worktree_path, branch, expected_base}` entry to an already-initialized manifest, validating every field **at write time using the same rules the `cleanup-wave` reader enforces** — `--branch` must match the disposable `^(worktree-)?agent-[A-Za-z0-9._/-]+$` namespace (accepts both `agent-<id>` and legacy `worktree-agent-<id>`), and `--path`/`--branch`/`--base` must be non-empty. `--agent-id` is required (write-strict), even though the reader treats it as optional. A missing or garbled field — or a duplicate `(worktree_path, branch)` the reader would dedup away — fails loudly with a recovery hint and a non-zero exit **without** writing, instead of appending an under-populated or silently-dropped entry. Whitespace-only `--path`/`--base` are rejected (values are trimmed). The on-disk manifest shape is unchanged (the reader re-derives `allowed_bases`); the orchestrator still initializes the empty `{orchestrator_root, worktrees: []}` shell inline before any agent is recorded.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ did not create (#48).
|
||||
<worktree_branch_check>
|
||||
FIRST ACTION: HEAD assertion MUST run before anything else, and this block is
|
||||
VERIFY-ONLY. Worktrees spawned by Claude Code's `isolation="worktree"` use the
|
||||
`worktree-agent-<id>` namespace. The orchestrator owns this worktree's lifecycle;
|
||||
`agent-<id>` namespace (previously `worktree-agent-<id>`; both are accepted). The orchestrator owns this worktree's lifecycle;
|
||||
a sub-agent MUST NOT hold state-correction primitives (hard-reset, update-ref,
|
||||
force-move, index-discard) on a worktree it did not create (#48, #2924). If ANY
|
||||
assertion below fails, HALT immediately — print the FATAL line, `exit 42`, and let
|
||||
@@ -27,11 +27,11 @@ commit.
|
||||
HEAD_REF=$(git symbolic-ref --quiet HEAD || echo "DETACHED")
|
||||
ACTUAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [ "$HEAD_REF" = "DETACHED" ] || echo "$ACTUAL_BRANCH" | grep -Eq '^(main|master|develop|trunk|release/.*)$'; then
|
||||
echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected worktree-agent-*); refusing to commit or self-recover via 'git update-ref' (#2924)." >&2
|
||||
echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected agent-* or worktree-agent-*); refusing to commit or self-recover via 'git update-ref' (#2924)." >&2
|
||||
exit 42
|
||||
fi
|
||||
if ! echo "$ACTUAL_BRANCH" | grep -Eq '^worktree-agent-[A-Za-z0-9._/-]+$'; then
|
||||
echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the worktree-agent-* namespace; refusing to commit (#2924)." >&2
|
||||
if ! echo "$ACTUAL_BRANCH" | grep -Eq '^(worktree-)?agent-[A-Za-z0-9._/-]+$'; then
|
||||
echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* namespace; refusing to commit (#2924)." >&2
|
||||
exit 42
|
||||
fi
|
||||
ACTUAL_BASE=$(git rev-parse HEAD)
|
||||
|
||||
@@ -445,7 +445,7 @@ cwd inside an agent worktree (or a subdirectory of one). Every subsequent
|
||||
orchestrator-side git call would then target the wrong tree — this is how a wrong-base
|
||||
merge nearly shipped ~1000 files. Resolve the *worktree root* (so a subdirectory cwd
|
||||
cannot skew the check) and refuse if it is an agent worktree. The discriminator is the
|
||||
per-agent branch namespace `worktree-agent-*`, NOT the `.claude/worktrees/` path: the
|
||||
per-agent branch namespace `agent-*` / `worktree-agent-*`, NOT the `.claude/worktrees/` path: the
|
||||
orchestrator may itself be legitimately invoked from a feature worktree under
|
||||
`.claude/worktrees/`, so a path-substring refusal would break legitimate runs. Do NOT
|
||||
pin to `git worktree list`'s first entry — that is the main worktree, the wrong target
|
||||
@@ -455,7 +455,7 @@ when the orchestrator legitimately runs from a feature worktree.
|
||||
ORCHESTRATOR_WT=$(git rev-parse --show-toplevel 2>/dev/null) || {
|
||||
echo "FATAL: execute_waves entry is not inside a git worktree (#48)." >&2; exit 1; }
|
||||
ORCH_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^worktree-agent-'; then
|
||||
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^(worktree-)?agent-'; then
|
||||
echo "FATAL: orchestrator cwd is inside an agent worktree (branch '$ORCH_BRANCH', root '$ORCHESTRATOR_WT') — refusing to execute waves (#48). A prior isolation=\"worktree\" dispatch drifted the cwd; re-run from the orchestrator's own worktree." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -113,7 +113,7 @@ Otherwise: Apply checkpoint-based routing below.
|
||||
|
||||
> **Runtime-aware dispatch (#2508 Phase 4).** GSD workflows dispatch specialized subagents by role. Before dispatching on a built-in-only runtime (kimi-code — three built-ins only), resolve the role to a built-in via `gsd_run query resolve-dispatch-type --requested <role> --raw`. On named-dispatch runtimes (Claude/OpenCode/…) the role is returned unchanged; on kimi-code it maps to `coder`/`explore`/`plan` by role-suffix. The persona rides `${AGENT_SKILLS_<ROLE>}` (Phase 3) regardless. See @gsd-core/references/runtime-aware-dispatch.md.
|
||||
|
||||
**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `isolation="worktree"` only if `workflow.use_worktrees` is not `false`** (read via `config-get workflow.use_worktrees`). **When using `isolation="worktree"`, embed the `<worktree_branch_check>` block from `gsd-core/references/worktree-branch-check.md` into the prompt, substituting `{EXPECTED_BASE}` with the captured base SHA.** That guard is **verify-only and fail-closed** (#48): it asserts a per-agent `worktree-agent-*` branch and the exact base, forbids `git update-ref` self-recovery (#2924), and on any mismatch prints `FATAL:` and `exit 42` so the orchestrator can recover — the sub-agent never rewrites a worktree it did not create. This supersedes the former self-recovery (#2015), whose destructive base rewrite could fail silently under a deny rule; the base-drift it addressed affects all platforms, and base correction is now the orchestrator's responsibility.
|
||||
**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `isolation="worktree"` only if `workflow.use_worktrees` is not `false`** (read via `config-get workflow.use_worktrees`). **When using `isolation="worktree"`, embed the `<worktree_branch_check>` block from `gsd-core/references/worktree-branch-check.md` into the prompt, substituting `{EXPECTED_BASE}` with the captured base SHA.** That guard is **verify-only and fail-closed** (#48): it asserts a per-agent `agent-*` / `worktree-agent-*` branch and the exact base, forbids `git update-ref` self-recovery (#2924), and on any mismatch prints `FATAL:` and `exit 42` so the orchestrator can recover — the sub-agent never rewrites a worktree it did not create. This supersedes the former self-recovery (#2015), whose destructive base rewrite could fail silently under a deny rule; the base-drift it addressed affects all platforms, and base correction is now the orchestrator's responsibility.
|
||||
|
||||
**Pattern B:** Execute segment-by-segment. Autonomous segments: spawn subagent for assigned tasks only (no SUMMARY/commit). Checkpoints: main context. After all segments: aggregate, create SUMMARY, commit. See segment_execution.
|
||||
|
||||
|
||||
@@ -143,11 +143,11 @@ process.stdin.on('end', () => {
|
||||
const command = data.tool_input?.command || '';
|
||||
for (const gitCwd of forceGitAddCwds(command, cwd)) {
|
||||
const branch = currentBranch(gitCwd);
|
||||
if (branch.startsWith('worktree-agent-')) {
|
||||
if (/^(worktree-)?agent-/.test(branch)) {
|
||||
const output = {
|
||||
decision: 'block',
|
||||
code: 'WORKTREE_AGENT_FORCE_ADD_FORBIDDEN',
|
||||
reason: 'worktree-agent branches must not run git add -f or git add --force. Respect the SDK skipped_gitignored/skipped_commit_docs_false contract and leave gitignored files untracked.',
|
||||
reason: 'agent/worktree-agent branches must not run git add -f or git add --force. Respect the SDK skipped_gitignored/skipped_commit_docs_false contract and leave gitignored files untracked.',
|
||||
};
|
||||
process.stdout.write(JSON.stringify(output));
|
||||
// Kimi CLI's exit-2 protocol feeds stderr back to the model (#2304)
|
||||
|
||||
@@ -118,13 +118,14 @@ process.stdin.on('end', () => {
|
||||
}
|
||||
|
||||
// #1342: Only enforce inside a GSD-managed isolated executor worktree. Those
|
||||
// are always on a `worktree-agent-*` branch (the positive allow-list enforced
|
||||
// by worktree-branch-check.md, #2924). A manually-created linked worktree (plain
|
||||
// non-GSD work, e.g. Claude Code plan-mode) is on the user's own branch, so the
|
||||
// guard must be a no-op there. Detached HEAD / error → not GSD-managed → no-op.
|
||||
// are always on an `agent-*` or legacy `worktree-agent-*` branch (the positive
|
||||
// allow-list enforced by worktree-branch-check.md, #2924, #1995). A manually-
|
||||
// created linked worktree (plain non-GSD work, e.g. Claude Code plan-mode) is
|
||||
// on the user's own branch, so the guard must be a no-op there. Detached HEAD
|
||||
// / error → not GSD-managed → no-op.
|
||||
const branchResult = git(['symbolic-ref', '--short', 'HEAD'], cwd);
|
||||
const branch = branchResult.status === 0 && branchResult.stdout ? branchResult.stdout.trim() : '';
|
||||
if (!/^worktree-agent-[A-Za-z0-9._/-]+$/.test(branch)) {
|
||||
if (!/^(worktree-)?agent-[A-Za-z0-9._/-]+$/.test(branch)) {
|
||||
process.exit(0); // not a GSD-managed executor worktree — no-op
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ import { execGit as execGitSeam, posixNormalize } from './shell-command-projecti
|
||||
// remote, stalled NFS mount, etc.). Callers can override via deps.timeout.
|
||||
const DEFAULT_GIT_TIMEOUT_MS = 10000;
|
||||
|
||||
const WORKTREE_AGENT_BRANCH_RE = /^(worktree-)?agent-[A-Za-z0-9._/-]+$/;
|
||||
const WORKTREE_AGENT_BRANCH_PATTERN = WORKTREE_AGENT_BRANCH_RE.source;
|
||||
|
||||
interface GitResult {
|
||||
exitCode: number;
|
||||
stdout: string;
|
||||
@@ -428,7 +431,7 @@ function normalizeCleanupManifestEntry(entry: unknown): CleanupManifestEntry | n
|
||||
const branch = typeof e.branch === 'string' ? e.branch : '';
|
||||
const expectedBase = typeof e.expected_base === 'string' ? e.expected_base : '';
|
||||
if (!worktreePath || !branch || !expectedBase) return null;
|
||||
if (!/^worktree-agent-[A-Za-z0-9._/-]+$/.test(branch)) return null;
|
||||
if (!WORKTREE_AGENT_BRANCH_RE.test(branch)) return null;
|
||||
const rawAllowedBases = Array.isArray(e.allowed_bases) ? e.allowed_bases : [];
|
||||
const allowedBases = Array.from(new Set(
|
||||
[expectedBase, ...rawAllowedBases.filter((base): base is string => typeof base === 'string' && base.length > 0)]
|
||||
@@ -939,7 +942,7 @@ function planWorktreeRecordAgent(manifestRaw: string, fields: RecordAgentFields)
|
||||
return {
|
||||
ok: false,
|
||||
reason: 'invalid_entry',
|
||||
hint: `Entry failed cleanup-manifest validation: --path/--branch/--base must be non-empty and --branch must match ^worktree-agent-[A-Za-z0-9._/-]+$ (got branch="${branch}"). Fix the field and re-run.`,
|
||||
hint: `Entry failed cleanup-manifest validation: --path/--branch/--base must be non-empty and --branch must match ${WORKTREE_AGENT_BRANCH_PATTERN} (accepts both agent-<id> and worktree-agent-<id> namespaces; got branch="${branch}"). Fix the field and re-run.`,
|
||||
entry: null,
|
||||
manifest: null,
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"gsd-domain-researcher.md": 7032,
|
||||
"gsd-eval-auditor.md": 12496,
|
||||
"gsd-eval-planner.md": 7008,
|
||||
"gsd-executor.md": 47951,
|
||||
"gsd-executor.md": 47955,
|
||||
"gsd-framework-selector.md": 6778,
|
||||
"gsd-integration-checker.md": 15238,
|
||||
"gsd-intel-updater.md": 18166,
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "1db46cac3f4d9889",
|
||||
"agents/gsd-eval-auditor.md": "1b8391f1aafb067f",
|
||||
"agents/gsd-eval-planner.md": "3d10fd11147f6857",
|
||||
"agents/gsd-executor.md": "707f7f26bc2c1c59",
|
||||
"agents/gsd-executor.md": "041c6d658e8e1002",
|
||||
"agents/gsd-framework-selector.md": "daa62c79619c76bf",
|
||||
"agents/gsd-integration-checker.md": "0643cd2d779b131c",
|
||||
"agents/gsd-intel-updater.md": "26c1f1e028c6346a",
|
||||
@@ -161,7 +161,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "de7ebb43dea1d20f",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "72e93b7f650d9bae",
|
||||
@@ -247,13 +247,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "0b3023a3caa2123f",
|
||||
"gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a",
|
||||
"gsd-core/workflows/eval-review.md": "9e8b169c05098b57",
|
||||
"gsd-core/workflows/execute-phase.md": "87fd9a5228df564c",
|
||||
"gsd-core/workflows/execute-phase.md": "881c9be0dec7dbb8",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1832b97d0923fa67",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "13aa54f8279960ae",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "476f88892510a09e",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "d096e946db209caa",
|
||||
"gsd-core/workflows/execute-plan.md": "5c6fcb36e16f5bf7",
|
||||
"gsd-core/workflows/explore.md": "965e1c0ede05f40c",
|
||||
"gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496",
|
||||
"gsd-core/workflows/fast.md": "568e6c3ec00b6e00",
|
||||
@@ -347,8 +347,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "4a3e534f4c6589e8",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "5f64275e48fb8284",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "82a4121cbcb82756",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "671c9ea949889c4a",
|
||||
"agents/gsd-eval-auditor.md": "fcaec7b00f94c435",
|
||||
"agents/gsd-eval-planner.md": "a4a5b4b3f7828ba3",
|
||||
"agents/gsd-executor.md": "28fbb5fa6eb49c65",
|
||||
"agents/gsd-executor.md": "00d887a16c249765",
|
||||
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
|
||||
"agents/gsd-integration-checker.md": "fa53e2d78be1de74",
|
||||
"agents/gsd-intel-updater.md": "fa40e685d7441ace",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "3f76c286e9cccb0b",
|
||||
"gsd-core/workflows/execute-phase.md": "f3a37602243681f9",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "1d378cb25720667a",
|
||||
"gsd-core/workflows/execute-plan.md": "334bb2053908a049",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
@@ -418,8 +418,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "48e04fd7cb10834b",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "97c2f736d085fe8e",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "29a8d4fa81378d7d",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"agents/gsd-domain-researcher.md": "f1e03df842ddfb95",
|
||||
"agents/gsd-eval-auditor.md": "d0f45fff7370bb0b",
|
||||
"agents/gsd-eval-planner.md": "9cc049b82897daa4",
|
||||
"agents/gsd-executor.md": "a140ad7b13e4af95",
|
||||
"agents/gsd-executor.md": "406dfda62f0f8428",
|
||||
"agents/gsd-framework-selector.md": "85005d716f9d98f7",
|
||||
"agents/gsd-integration-checker.md": "17a8ee731986564d",
|
||||
"agents/gsd-intel-updater.md": "4953a465db9dadc1",
|
||||
@@ -231,7 +231,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "cfaf338f42b1111e",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -317,13 +317,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "7aef1019ce141558",
|
||||
"gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e",
|
||||
"gsd-core/workflows/eval-review.md": "11620e0dc4a003dd",
|
||||
"gsd-core/workflows/execute-phase.md": "cf74d39bfaa359a7",
|
||||
"gsd-core/workflows/execute-phase.md": "2604b9cb7dc66920",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9a1f3deffb4dab14",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a7f9b9a45303382f",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "b14d7fa2c4ec2406",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "4a7e699e43c71691",
|
||||
"gsd-core/workflows/execute-plan.md": "724d726833e222ed",
|
||||
"gsd-core/workflows/explore.md": "fabe8e5553de16c0",
|
||||
"gsd-core/workflows/extract-learnings.md": "fd75072c339b58bd",
|
||||
"gsd-core/workflows/fast.md": "7f7687b920d79b29",
|
||||
@@ -417,8 +417,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "46b287c75153458a",
|
||||
"hooks/gsd-worktree-path-guard.js": "0e236bf8ac797ee3",
|
||||
"hooks/gsd-workflow-guard.js": "41c59d9765ac36ae",
|
||||
"hooks/gsd-worktree-path-guard.js": "f65356c80c9805b2",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "1d955ec5d64e8a5f",
|
||||
|
||||
12
tests/fixtures/golden-install-parity/claude.json
vendored
12
tests/fixtures/golden-install-parity/claude.json
vendored
@@ -15,7 +15,7 @@
|
||||
"agents/gsd-domain-researcher.md": "5f7d366251b957fe",
|
||||
"agents/gsd-eval-auditor.md": "fea2759beff0a642",
|
||||
"agents/gsd-eval-planner.md": "112f6730f23854e3",
|
||||
"agents/gsd-executor.md": "a3c5bd2940dcf7c6",
|
||||
"agents/gsd-executor.md": "16391af53f8922bb",
|
||||
"agents/gsd-framework-selector.md": "c350ee693cb1aa4e",
|
||||
"agents/gsd-integration-checker.md": "c8b4e65dee89c8ea",
|
||||
"agents/gsd-intel-updater.md": "5b41e05f90ce89d9",
|
||||
@@ -160,7 +160,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -246,13 +246,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "ea47bd2d5a0d1d85",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "7c2f5ff8cc4d06e5",
|
||||
"gsd-core/workflows/execute-phase.md": "78c6f46e37db9a0b",
|
||||
"gsd-core/workflows/execute-phase.md": "100b55c147922978",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "d0f2cba6b8356cac",
|
||||
"gsd-core/workflows/execute-plan.md": "da0c2286b1aed11d",
|
||||
"gsd-core/workflows/explore.md": "9348b54b526b8938",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "41a6568b873aef99",
|
||||
@@ -346,8 +346,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "46b287c75153458a",
|
||||
"hooks/gsd-worktree-path-guard.js": "0e236bf8ac797ee3",
|
||||
"hooks/gsd-workflow-guard.js": "41c59d9765ac36ae",
|
||||
"hooks/gsd-worktree-path-guard.js": "f65356c80c9805b2",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "1d955ec5d64e8a5f",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"agents/gsd-domain-researcher.md": "0fecdaea86466a56",
|
||||
"agents/gsd-eval-auditor.md": "36c44303085df2f8",
|
||||
"agents/gsd-eval-planner.md": "3ddea88a69b4da3f",
|
||||
"agents/gsd-executor.md": "8443c52fc864d84e",
|
||||
"agents/gsd-executor.md": "a20e280c9e648f5b",
|
||||
"agents/gsd-framework-selector.md": "564669d479433f15",
|
||||
"agents/gsd-integration-checker.md": "1bbbdd3d420b994e",
|
||||
"agents/gsd-intel-updater.md": "42c40fffbc720d0b",
|
||||
@@ -164,7 +164,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "19340c1a3be74ad2",
|
||||
"gsd-core/references/worktree-branch-check.md": "46882ad61f3f9075",
|
||||
"gsd-core/references/worktree-branch-check.md": "f99ec1acb76014f5",
|
||||
"gsd-core/references/worktree-path-safety.md": "8e5b4d542d2d9853",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -250,13 +250,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "7eb7095ca86d506f",
|
||||
"gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74",
|
||||
"gsd-core/workflows/eval-review.md": "17fc9b4c4f7e1c74",
|
||||
"gsd-core/workflows/execute-phase.md": "91a820d8ba3531fe",
|
||||
"gsd-core/workflows/execute-phase.md": "a5af949ed1092448",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1b3558cb8f41b65a",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "35612890c1173577",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "26825e1aacf224d0",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "1d9f62898cb0e848",
|
||||
"gsd-core/workflows/execute-plan.md": "204a0ac94a4bb545",
|
||||
"gsd-core/workflows/explore.md": "db9e1a79dbe88090",
|
||||
"gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9",
|
||||
"gsd-core/workflows/fast.md": "e4f74a454b6ca5e8",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "1c1a800108a2b225",
|
||||
"agents/gsd-eval-auditor.md": "99012004b14ea602",
|
||||
"agents/gsd-eval-planner.md": "4ebdd7fe9cbb0cfe",
|
||||
"agents/gsd-executor.md": "87ae9188c389bde8",
|
||||
"agents/gsd-executor.md": "d9dca78de04bdc1c",
|
||||
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
|
||||
"agents/gsd-integration-checker.md": "2d8339790bbb2dc3",
|
||||
"agents/gsd-intel-updater.md": "c51339956197cbd3",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "5c048b5144519998",
|
||||
"gsd-core/workflows/execute-phase.md": "9bc9511ebd40b7cc",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "fb4e3f846505b6a5",
|
||||
"gsd-core/workflows/execute-plan.md": "874689d8678e6186",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
@@ -418,8 +418,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "f198bb60674e9972",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "a1a3d4618b41a804",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "9c0d837594c7b772",
|
||||
|
||||
10
tests/fixtures/golden-install-parity/codex.json
vendored
10
tests/fixtures/golden-install-parity/codex.json
vendored
@@ -102,8 +102,8 @@
|
||||
"agents/gsd-eval-auditor.toml": "9b81d61b3c5f722d",
|
||||
"agents/gsd-eval-planner.md": "73f2ad2ff2797a51",
|
||||
"agents/gsd-eval-planner.toml": "09468ad1a34ac468",
|
||||
"agents/gsd-executor.md": "45442cc002be7052",
|
||||
"agents/gsd-executor.toml": "bfb08e9397bcc358",
|
||||
"agents/gsd-executor.md": "697b7ed099fff17d",
|
||||
"agents/gsd-executor.toml": "9a8aa31bbde42448",
|
||||
"agents/gsd-framework-selector.md": "ebae32430887d2e0",
|
||||
"agents/gsd-framework-selector.toml": "637e4e021b7ec380",
|
||||
"agents/gsd-integration-checker.md": "9cc875676cf7d741",
|
||||
@@ -267,7 +267,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "ac45d99076067f17",
|
||||
"gsd-core/references/verify-mvp-mode.md": "78faa99df1668aab",
|
||||
"gsd-core/references/workstream-flag.md": "c764d9cbdf6faff4",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "6411a4789f481c15",
|
||||
"gsd-core/templates/DEBUG.md": "0be1256352e79375",
|
||||
@@ -353,13 +353,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "bf32efe90219d3dd",
|
||||
"gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f",
|
||||
"gsd-core/workflows/eval-review.md": "c89a63285ead961e",
|
||||
"gsd-core/workflows/execute-phase.md": "4528ce2e8ac92566",
|
||||
"gsd-core/workflows/execute-phase.md": "e5b9fb391a90d7fb",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "cd8678d082d6e191",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "13bc99f22bc5ec10",
|
||||
"gsd-core/workflows/execute-plan.md": "e4723e1669f7c508",
|
||||
"gsd-core/workflows/explore.md": "d12f68770c65093a",
|
||||
"gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da",
|
||||
"gsd-core/workflows/fast.md": "e4ed60f96a7b3ac8",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.agent.md": "d603239b3e9fe428",
|
||||
"agents/gsd-eval-auditor.agent.md": "3c03009564de55c8",
|
||||
"agents/gsd-eval-planner.agent.md": "14751876fc2b5f16",
|
||||
"agents/gsd-executor.agent.md": "bca7d1ab12392956",
|
||||
"agents/gsd-executor.agent.md": "6bf98b78fd75c347",
|
||||
"agents/gsd-framework-selector.agent.md": "cafeec0b3489be45",
|
||||
"agents/gsd-integration-checker.agent.md": "30439b804927acc7",
|
||||
"agents/gsd-intel-updater.agent.md": "238c1a886f35a25c",
|
||||
@@ -162,7 +162,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "a8e13ea38218638b",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "72e93b7f650d9bae",
|
||||
@@ -248,13 +248,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "f64b067d0d729f04",
|
||||
"gsd-core/workflows/edit-phase.md": "8667c28b22b1599f",
|
||||
"gsd-core/workflows/eval-review.md": "1ae2d3d3fbf72893",
|
||||
"gsd-core/workflows/execute-phase.md": "474608ed923207f1",
|
||||
"gsd-core/workflows/execute-phase.md": "ac3229160d3a3fda",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ca37f91f7bd6f05c",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "25bebed74e645109",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "dc0b96d285327b18",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "1750549f91a86340",
|
||||
"gsd-core/workflows/execute-plan.md": "c82c959f78a1917d",
|
||||
"gsd-core/workflows/explore.md": "35431c40bb1b245a",
|
||||
"gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18",
|
||||
"gsd-core/workflows/fast.md": "66821090b6b8ed3b",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
|
||||
"agents/gsd-eval-auditor.md": "ad2840fd5cd76172",
|
||||
"agents/gsd-eval-planner.md": "2049dac060d00eda",
|
||||
"agents/gsd-executor.md": "e568f8171c7d12f1",
|
||||
"agents/gsd-executor.md": "026606d319f6c338",
|
||||
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
|
||||
"agents/gsd-integration-checker.md": "5da30584d06b878c",
|
||||
"agents/gsd-intel-updater.md": "b8971c5d96e63b38",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "19c02b83bd1692bf",
|
||||
"gsd-core/references/worktree-branch-check.md": "ab004404d028cc0d",
|
||||
"gsd-core/references/worktree-branch-check.md": "46f222a2e2c2edd7",
|
||||
"gsd-core/references/worktree-path-safety.md": "66de0b35266c807d",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "215b0122c4d2b1e5",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "9389c58f7384972d",
|
||||
"gsd-core/workflows/execute-phase.md": "24b8e6ea6456e8f3",
|
||||
"gsd-core/workflows/execute-phase.md": "80a4fb2d23642cd8",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "46de8e5e07946509",
|
||||
"gsd-core/workflows/execute-plan.md": "09ea0688882eb30e",
|
||||
"gsd-core/workflows/explore.md": "9348b54b526b8938",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "77b49793e26b3323",
|
||||
|
||||
12
tests/fixtures/golden-install-parity/hermes.json
vendored
12
tests/fixtures/golden-install-parity/hermes.json
vendored
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "412cdbb05ba252ea",
|
||||
"agents/gsd-eval-auditor.md": "4ffb265063c318e5",
|
||||
"agents/gsd-eval-planner.md": "03448fc9c5774b56",
|
||||
"agents/gsd-executor.md": "e39b2cd4ec6b3afd",
|
||||
"agents/gsd-executor.md": "3ec54684a756e830",
|
||||
"agents/gsd-framework-selector.md": "ea9981d65d6b3429",
|
||||
"agents/gsd-integration-checker.md": "35b4f2969d279871",
|
||||
"agents/gsd-intel-updater.md": "5fe5edfae2719cb8",
|
||||
@@ -161,7 +161,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "50ddf79d58950730",
|
||||
"gsd-core/references/worktree-branch-check.md": "5d79e26e3b51d9ae",
|
||||
"gsd-core/references/worktree-branch-check.md": "ecfbf0e65dd8ccac",
|
||||
"gsd-core/references/worktree-path-safety.md": "fa79fcdff2aaa5f0",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -247,13 +247,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "02811dd7aa32d5ba",
|
||||
"gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8",
|
||||
"gsd-core/workflows/eval-review.md": "e7cd5dfcf18e2458",
|
||||
"gsd-core/workflows/execute-phase.md": "b3d289801e4fff03",
|
||||
"gsd-core/workflows/execute-phase.md": "5adf286f7ec99a59",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9b2193de25506b3b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "362123fdf99e9980",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "a691e3afe88031b8",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "212856ac5c291c3c",
|
||||
"gsd-core/workflows/execute-plan.md": "0c5e0455252b5a46",
|
||||
"gsd-core/workflows/explore.md": "843e66f101a56dfa",
|
||||
"gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b",
|
||||
"gsd-core/workflows/fast.md": "c801145115755524",
|
||||
@@ -347,8 +347,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "46b287c75153458a",
|
||||
"hooks/gsd-worktree-path-guard.js": "7797e5fe2474ee88",
|
||||
"hooks/gsd-workflow-guard.js": "41c59d9765ac36ae",
|
||||
"hooks/gsd-worktree-path-guard.js": "37dd85a1591a4d8c",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "bc58c3a7609d7eae",
|
||||
|
||||
12
tests/fixtures/golden-install-parity/kilo.json
vendored
12
tests/fixtures/golden-install-parity/kilo.json
vendored
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "a3874d80bcbc7380",
|
||||
"agents/gsd-eval-auditor.md": "630d4cd3bd6ea195",
|
||||
"agents/gsd-eval-planner.md": "3db12cde12aeb2c1",
|
||||
"agents/gsd-executor.md": "14c1681bb5f7214f",
|
||||
"agents/gsd-executor.md": "bea8102bf46ddb7a",
|
||||
"agents/gsd-framework-selector.md": "ad5f2c6b9bec6270",
|
||||
"agents/gsd-integration-checker.md": "c503e2f4a3d8ec05",
|
||||
"agents/gsd-intel-updater.md": "231393da62a45b2e",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "ac45d99076067f17",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "72e93b7f650d9bae",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "3c0d5ef72202d246",
|
||||
"gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a",
|
||||
"gsd-core/workflows/eval-review.md": "35be91cd22a9bc11",
|
||||
"gsd-core/workflows/execute-phase.md": "7daf5ebd7eabcda8",
|
||||
"gsd-core/workflows/execute-phase.md": "3ddae43ba8ad5081",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b1e6588cd32a6f08",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "48782aa1a714de9a",
|
||||
"gsd-core/workflows/execute-plan.md": "731d2947b623be4f",
|
||||
"gsd-core/workflows/explore.md": "e6c94f8b6f083109",
|
||||
"gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee",
|
||||
"gsd-core/workflows/fast.md": "41a6568b873aef99",
|
||||
@@ -418,8 +418,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "4998235bdf3f64a2",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "9734e43bee1d7d2e",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "b63a879b8b3436bf",
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
".kimi/hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
".kimi/hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js": "b49b03fa9de7df3b",
|
||||
".kimi/hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js": "d00a75505429355c",
|
||||
".kimi/hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
".kimi/hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
".kimi/hooks/managed-hooks-registry.cjs": "08ec2585a3f8f132",
|
||||
@@ -44,7 +44,7 @@
|
||||
"agents/gsd-domain-researcher.md": "049f588663814fa2",
|
||||
"agents/gsd-eval-auditor.md": "54870d3b07433525",
|
||||
"agents/gsd-eval-planner.md": "552e9fa164c51ce8",
|
||||
"agents/gsd-executor.md": "1154cdd7b22f9754",
|
||||
"agents/gsd-executor.md": "98424ccf4346c9d1",
|
||||
"agents/gsd-framework-selector.md": "8a795f230436ad2e",
|
||||
"agents/gsd-integration-checker.md": "c1760a0bbd4f7bf5",
|
||||
"agents/gsd-intel-updater.md": "944f1d903e2e9e09",
|
||||
@@ -189,7 +189,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -275,13 +275,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "f6eae507bb465c5f",
|
||||
"gsd-core/workflows/execute-phase.md": "73ffb4f5d915e410",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ca13ab9c31682a09",
|
||||
"gsd-core/workflows/execute-plan.md": "74de71f01739f7ac",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
|
||||
12
tests/fixtures/golden-install-parity/kimi.json
vendored
12
tests/fixtures/golden-install-parity/kimi.json
vendored
@@ -23,8 +23,8 @@
|
||||
".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
".kimi/hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
".kimi/hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js": "b49b03fa9de7df3b",
|
||||
".kimi/hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js": "d00a75505429355c",
|
||||
".kimi/hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
".kimi/hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
".kimi/hooks/managed-hooks-registry.cjs": "08ec2585a3f8f132",
|
||||
@@ -61,7 +61,7 @@
|
||||
"agents/subagents/gsd-eval-auditor.yaml": "e3d868bd5fefe938",
|
||||
"agents/subagents/gsd-eval-planner.md": "70f8c5727bfb9876",
|
||||
"agents/subagents/gsd-eval-planner.yaml": "df8499f7af297ec2",
|
||||
"agents/subagents/gsd-executor.md": "e37a910127d9ca5c",
|
||||
"agents/subagents/gsd-executor.md": "8fdf9332233a66bd",
|
||||
"agents/subagents/gsd-executor.yaml": "e29422986636fd64",
|
||||
"agents/subagents/gsd-framework-selector.md": "a15b7aa1e0576e16",
|
||||
"agents/subagents/gsd-framework-selector.yaml": "fb52c31cde27b0e3",
|
||||
@@ -225,7 +225,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -311,13 +311,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "5166a4c16dce3465",
|
||||
"gsd-core/workflows/execute-phase.md": "157a97e0978bd5df",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ca13ab9c31682a09",
|
||||
"gsd-core/workflows/execute-plan.md": "74de71f01739f7ac",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "71250e759ca9e723",
|
||||
"agents/gsd-eval-auditor.md": "c88890105f32ace6",
|
||||
"agents/gsd-eval-planner.md": "60bddb70a937f796",
|
||||
"agents/gsd-executor.md": "4946be74860ea68e",
|
||||
"agents/gsd-executor.md": "14423bfb4dee14b8",
|
||||
"agents/gsd-framework-selector.md": "1c0a10355e787675",
|
||||
"agents/gsd-integration-checker.md": "a9de5928e5a5c649",
|
||||
"agents/gsd-intel-updater.md": "493e07482fa6198a",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "3bd98d30eee6c5a1",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "225910640adbb76d",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "72e93b7f650d9bae",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "f6210dc8ff7776d5",
|
||||
"gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39",
|
||||
"gsd-core/workflows/eval-review.md": "1973f08d0eb34159",
|
||||
"gsd-core/workflows/execute-phase.md": "4e19bf9ead5fbafc",
|
||||
"gsd-core/workflows/execute-phase.md": "b59b9993b1da7bb8",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a15993affd62f4bf",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "c4cba01539f0368a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "21f4d9b3abc334ce",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "a2e611fff6af9c29",
|
||||
"gsd-core/workflows/execute-plan.md": "bb0ce725dcf12aa2",
|
||||
"gsd-core/workflows/explore.md": "a514b88e98609441",
|
||||
"gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0",
|
||||
"gsd-core/workflows/fast.md": "12187b242e6af970",
|
||||
@@ -418,8 +418,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "c8f6c980305ae6fd",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "bfef1802d491bdab",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "bd57cc72f482a14f",
|
||||
|
||||
10
tests/fixtures/golden-install-parity/pi.json
vendored
10
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -128,7 +128,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -214,13 +214,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "042978dd27ab0637",
|
||||
"gsd-core/workflows/execute-phase.md": "6779316ccf03982c",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "5063fc252c479892",
|
||||
"gsd-core/workflows/execute-plan.md": "3168b13c3758ed84",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
@@ -314,8 +314,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
"hooks/gsd-worktree-path-guard.js": "933eefc31e3b0407",
|
||||
"hooks/gsd-workflow-guard.js": "56414206bc13b3dc",
|
||||
"hooks/gsd-worktree-path-guard.js": "ea37324fe8dfaf12",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "ac720a2b548ba200",
|
||||
|
||||
12
tests/fixtures/golden-install-parity/qwen.json
vendored
12
tests/fixtures/golden-install-parity/qwen.json
vendored
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "bd054bb27beed2a7",
|
||||
"agents/gsd-eval-auditor.md": "57cc7458ab5de6b7",
|
||||
"agents/gsd-eval-planner.md": "01b665728dde4ccf",
|
||||
"agents/gsd-executor.md": "a6dd5b7da329d8f2",
|
||||
"agents/gsd-executor.md": "b6baf92a0d0ab516",
|
||||
"agents/gsd-framework-selector.md": "82ba6abea84226b7",
|
||||
"agents/gsd-integration-checker.md": "90835dbc7dfa1691",
|
||||
"agents/gsd-intel-updater.md": "3cc4f6ddd04676ec",
|
||||
@@ -161,7 +161,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "59804937da1ddaa9",
|
||||
"gsd-core/references/worktree-branch-check.md": "3fc21ae9462c35c8",
|
||||
"gsd-core/references/worktree-branch-check.md": "ea7fc76177f3e50d",
|
||||
"gsd-core/references/worktree-path-safety.md": "b4111595eabec186",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -247,13 +247,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "226550a6d556b09f",
|
||||
"gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36",
|
||||
"gsd-core/workflows/eval-review.md": "88431952699d9fa6",
|
||||
"gsd-core/workflows/execute-phase.md": "8e8fc94fd3071a79",
|
||||
"gsd-core/workflows/execute-phase.md": "69c5e8a42ea9c331",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "0e0949db56deebeb",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0b04cc2dcab61107",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "9cbf100b17f4bcb1",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "ec9026ede61e5cb9",
|
||||
"gsd-core/workflows/execute-plan.md": "ea93d7a5c3d483e8",
|
||||
"gsd-core/workflows/explore.md": "c412905fb86f3f12",
|
||||
"gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a",
|
||||
"gsd-core/workflows/fast.md": "93ed453edddd8c0c",
|
||||
@@ -347,8 +347,8 @@
|
||||
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
"hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
"hooks/gsd-workflow-guard.js": "46b287c75153458a",
|
||||
"hooks/gsd-worktree-path-guard.js": "112c3293a5baabeb",
|
||||
"hooks/gsd-workflow-guard.js": "41c59d9765ac36ae",
|
||||
"hooks/gsd-worktree-path-guard.js": "d55016621969e923",
|
||||
"hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
"hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
"hooks/managed-hooks-registry.cjs": "08741ed76f1d8970",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "b80f76874c04e515",
|
||||
"agents/gsd-eval-auditor.md": "470bf16303ec4d2e",
|
||||
"agents/gsd-eval-planner.md": "22334fde85723c9d",
|
||||
"agents/gsd-executor.md": "a611d34bf51e6aec",
|
||||
"agents/gsd-executor.md": "00768988ee91ad9f",
|
||||
"agents/gsd-framework-selector.md": "7726fccc86bfeb50",
|
||||
"agents/gsd-integration-checker.md": "7cd2072984411c7f",
|
||||
"agents/gsd-intel-updater.md": "83de6ba9172891c3",
|
||||
@@ -161,7 +161,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "77d0e004039fb480",
|
||||
"gsd-core/references/worktree-branch-check.md": "8de8075d76ff71cd",
|
||||
"gsd-core/references/worktree-branch-check.md": "d20c16a7b42cceee",
|
||||
"gsd-core/references/worktree-path-safety.md": "34689482908229bc",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -247,13 +247,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "89e760e665ff99f8",
|
||||
"gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad",
|
||||
"gsd-core/workflows/eval-review.md": "90a29a4fa0cdd947",
|
||||
"gsd-core/workflows/execute-phase.md": "8f095f3cf2fb8f35",
|
||||
"gsd-core/workflows/execute-phase.md": "7d9ad2344ede3966",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "296b812e8d0e9ce8",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7d30384e9bf82664",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "90efedae3decaffe",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "f42ffe9e77df0bce",
|
||||
"gsd-core/workflows/execute-plan.md": "3abba98d19b31036",
|
||||
"gsd-core/workflows/explore.md": "f4d0db08c11545a8",
|
||||
"gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6",
|
||||
"gsd-core/workflows/fast.md": "0f05b1e008ac2fc2",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "56395dbdabf076f6",
|
||||
"agents/gsd-eval-auditor.md": "fb64fc5acf359747",
|
||||
"agents/gsd-eval-planner.md": "2049dac060d00eda",
|
||||
"agents/gsd-executor.md": "067a4f846f4e020c",
|
||||
"agents/gsd-executor.md": "10341df8e1f390bb",
|
||||
"agents/gsd-framework-selector.md": "4b77eebbe9288d80",
|
||||
"agents/gsd-integration-checker.md": "4ffb37fb230c2b90",
|
||||
"agents/gsd-intel-updater.md": "a81d77c143c02108",
|
||||
@@ -161,7 +161,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "481ec11fe3e22236",
|
||||
"gsd-core/references/worktree-branch-check.md": "f6018dddf15bc1cb",
|
||||
"gsd-core/references/worktree-branch-check.md": "6a28b79d092173dd",
|
||||
"gsd-core/references/worktree-path-safety.md": "0e8a26b9b3424974",
|
||||
"gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367",
|
||||
"gsd-core/templates/DEBUG.md": "0944156249103c16",
|
||||
@@ -247,13 +247,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "6bd25d0123ee6c73",
|
||||
"gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789",
|
||||
"gsd-core/workflows/eval-review.md": "713de00ea5326988",
|
||||
"gsd-core/workflows/execute-phase.md": "bbeb787a4e0969f0",
|
||||
"gsd-core/workflows/execute-phase.md": "b28e4d8cffeb2944",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "3194ecd382690755",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fb4497767cdf73a3",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "c54d55fad3ab5263",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "d7bc64b2d3fcff84",
|
||||
"gsd-core/workflows/execute-plan.md": "2ff04f06b000fe26",
|
||||
"gsd-core/workflows/explore.md": "e5ff3269f8ee77b6",
|
||||
"gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a",
|
||||
"gsd-core/workflows/fast.md": "b03b9f595892479a",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"agents/gsd-domain-researcher.md": "049f588663814fa2",
|
||||
"agents/gsd-eval-auditor.md": "54870d3b07433525",
|
||||
"agents/gsd-eval-planner.md": "552e9fa164c51ce8",
|
||||
"agents/gsd-executor.md": "1154cdd7b22f9754",
|
||||
"agents/gsd-executor.md": "98424ccf4346c9d1",
|
||||
"agents/gsd-framework-selector.md": "8a795f230436ad2e",
|
||||
"agents/gsd-integration-checker.md": "c1760a0bbd4f7bf5",
|
||||
"agents/gsd-intel-updater.md": "944f1d903e2e9e09",
|
||||
@@ -232,7 +232,7 @@
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-branch-check.md": "161547f45f78c2bd",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
@@ -318,13 +318,13 @@
|
||||
"gsd-core/workflows/docs-update.md": "a320371be70f43d8",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "479ea9fcfe74e8f8",
|
||||
"gsd-core/workflows/execute-phase.md": "0e1e8e5e3fa63587",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "beedb5ddff997b5a",
|
||||
"gsd-core/workflows/execute-plan.md": "4f43b65cf80d8f2e",
|
||||
"gsd-core/workflows/explore.md": "3f3b4f83e23349bc",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
"docs-update.md": 56494,
|
||||
"edit-phase.md": 12927,
|
||||
"eval-review.md": 10332,
|
||||
"execute-phase.md": 93368,
|
||||
"execute-plan.md": 35131,
|
||||
"execute-phase.md": 93383,
|
||||
"execute-plan.md": 35143,
|
||||
"explore.md": 11127,
|
||||
"extract-learnings.md": 12893,
|
||||
"fast.md": 7613,
|
||||
|
||||
@@ -187,10 +187,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => {
|
||||
const scripts = codeBlocks.map(({ body }) => body).join('\n');
|
||||
// Allow-list must reference the canonical Claude Code worktree-agent-<id>
|
||||
// namespace via a regex assertion (grep -Eq '^worktree-agent-...').
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/;
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/;
|
||||
assert.ok(
|
||||
allowListRe.test(scripts),
|
||||
'worktree_branch_check must enforce a positive allow-list matching ^worktree-agent-* (#2924 hardening)'
|
||||
'worktree_branch_check must enforce a positive allow-list matching ^(worktree-)?agent-* (#2924 hardening)'
|
||||
);
|
||||
});
|
||||
|
||||
@@ -322,10 +322,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => {
|
||||
});
|
||||
|
||||
test('block enforces positive worktree-agent-* allow-list (#2924 hardening)', () => {
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/;
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/;
|
||||
assert.ok(
|
||||
allowListRe.test(block),
|
||||
'quick.md worktree_branch_check must enforce a positive allow-list matching ^worktree-agent-* (#2924 hardening)'
|
||||
'quick.md worktree_branch_check must enforce a positive allow-list matching ^(worktree-)?agent-* (#2924 hardening)'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -404,10 +404,10 @@ describe('bug #2924: worktree HEAD attachment + destructive recovery', () => {
|
||||
test('step 0 enforces positive worktree-agent-* allow-list (#2924 hardening)', () => {
|
||||
const codeBlocks = extractFencedCodeBlocks(block);
|
||||
const scripts = codeBlocks.map(({ body }) => body).join('\n');
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/;
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/;
|
||||
assert.ok(
|
||||
allowListRe.test(scripts),
|
||||
'task_commit_protocol step 0 must enforce a positive allow-list matching ^worktree-agent-* in addition to the protected-ref deny-list (#2924 hardening)'
|
||||
'task_commit_protocol step 0 must enforce a positive allow-list matching ^(worktree-)?agent-* in addition to the protected-ref deny-list (#2924 hardening)'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1531,8 +1531,8 @@ function extractCwdGuardBash() {
|
||||
if (!guardBash.includes('git rev-parse --show-toplevel')) {
|
||||
throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "git rev-parse --show-toplevel"');
|
||||
}
|
||||
if (!guardBash.includes('worktree-agent-')) {
|
||||
throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "worktree-agent-"');
|
||||
if (!guardBash.includes('(worktree-)?agent-')) {
|
||||
throw new Error('extractCwdGuardBash: sanity check failed — extracted block does not contain "(worktree-)?agent-"');
|
||||
}
|
||||
|
||||
return guardBash;
|
||||
|
||||
@@ -662,6 +662,16 @@ describe('planWorktreeRecordAgent', () => {
|
||||
assert.equal(readBack.reason, 'empty_manifest');
|
||||
});
|
||||
|
||||
test('accepts the current agent-<id> namespace (#1995)', () => {
|
||||
const plan = planWorktreeRecordAgent('{"worktrees":[]}', { ...VALID, branch: 'agent-a1' });
|
||||
assert.equal(plan.ok, true);
|
||||
assert.equal(plan.entry.branch, 'agent-a1');
|
||||
const readBack = planWorktreeWaveCleanup('/repo/main', JSON.parse(plan.manifest));
|
||||
assert.equal(readBack.ok, true);
|
||||
assert.equal(readBack.entries.length, 1);
|
||||
assert.equal(readBack.entries[0].branch, 'agent-a1');
|
||||
});
|
||||
|
||||
test('fails loudly on malformed manifest JSON instead of clobbering it', () => {
|
||||
const plan = planWorktreeRecordAgent('{not valid json', VALID);
|
||||
assert.equal(plan.ok, false);
|
||||
@@ -749,7 +759,9 @@ describe('planWorktreeRecordAgent', () => {
|
||||
|
||||
describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () => {
|
||||
const seg = fc.stringMatching(/^[A-Za-z0-9._/-]+$/); // include '/' — the namespace allows it
|
||||
const agentBranch = seg.map((s) => `worktree-agent-${s}`);
|
||||
const legacyAgentBranch = seg.map((s) => `worktree-agent-${s}`);
|
||||
const currentAgentBranch = seg.map((s) => `agent-${s}`);
|
||||
const agentBranch = fc.oneof(legacyAgentBranch, currentAgentBranch);
|
||||
const nonEmpty = fc.stringMatching(/^\S[\S ]*$/); // no leading whitespace, not blank
|
||||
|
||||
test('any writer-accepted entry round-trips through the cleanup reader unchanged', () => {
|
||||
@@ -776,7 +788,7 @@ describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () =
|
||||
agentId: nonEmpty,
|
||||
worktreePath: nonEmpty,
|
||||
// Any branch that does NOT match the disposable namespace.
|
||||
branch: fc.string({ minLength: 1 }).filter((b) => !/^worktree-agent-[A-Za-z0-9._/-]+$/.test(b.trim())),
|
||||
branch: fc.string({ minLength: 1 }).filter((b) => !/^(worktree-)?agent-[A-Za-z0-9._/-]+$/.test(b.trim())),
|
||||
base: nonEmpty,
|
||||
}),
|
||||
(fields) => {
|
||||
@@ -788,6 +800,79 @@ describe('planWorktreeRecordAgent — fast-check parity invariant (#1298)', () =
|
||||
});
|
||||
});
|
||||
|
||||
// ─── branch namespace boundary tests (#1995) ─────────────────────────────────
|
||||
// Claude Code's isolation="worktree" branch naming changed from worktree-agent-<id>
|
||||
// to agent-<id>. Both namespaces must be accepted; non-agent branches rejected.
|
||||
|
||||
describe('worktree branch namespace boundaries (#1995)', () => {
|
||||
const ACCEPTED_BRANCHES = [
|
||||
'agent-a1',
|
||||
'agent-abc123',
|
||||
'agent-session.42',
|
||||
'worktree-agent-a1',
|
||||
'worktree-agent-abc123',
|
||||
'worktree-agent-session.42',
|
||||
];
|
||||
const REJECTED_BRANCHES = [
|
||||
'feature-x',
|
||||
'main',
|
||||
'agent',
|
||||
'worktree-agent',
|
||||
'xagent-y',
|
||||
'worktree-foo',
|
||||
'worktree-agent-',
|
||||
'agent-',
|
||||
'',
|
||||
];
|
||||
|
||||
for (const branch of ACCEPTED_BRANCHES) {
|
||||
test(`planWorktreeRecordAgent accepts branch "${branch}"`, () => {
|
||||
const plan = planWorktreeRecordAgent('{"worktrees":[]}', {
|
||||
agentId: 'a1', worktreePath: '/repo/wt', branch, base: 'abc123',
|
||||
});
|
||||
assert.equal(plan.ok, true, `expected branch "${branch}" to be accepted`);
|
||||
assert.equal(plan.entry.branch, branch);
|
||||
});
|
||||
}
|
||||
|
||||
for (const branch of REJECTED_BRANCHES) {
|
||||
test(`planWorktreeRecordAgent rejects branch "${branch}"`, () => {
|
||||
const plan = planWorktreeRecordAgent('{"worktrees":[]}', {
|
||||
agentId: 'a1', worktreePath: '/repo/wt', branch, base: 'abc123',
|
||||
});
|
||||
if (branch === '') {
|
||||
assert.equal(plan.reason, 'missing_field');
|
||||
} else {
|
||||
assert.equal(plan.ok, false, `expected branch "${branch}" to be rejected`);
|
||||
assert.equal(plan.reason, 'invalid_entry');
|
||||
assert.match(plan.hint, /\(worktree-\)\?agent-/);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
test('cleanup-wave retains agent-<id> entries alongside worktree-agent-<id> entries', () => {
|
||||
const manifest = {
|
||||
orchestrator_root: '/repo/main',
|
||||
worktrees: [
|
||||
{ agent_id: 'a1', worktree_path: '/repo/wt-a1', branch: 'agent-a1', expected_base: 'abc' },
|
||||
{ agent_id: 'a2', worktree_path: '/repo/wt-a2', branch: 'worktree-agent-a2', expected_base: 'def' },
|
||||
],
|
||||
};
|
||||
const result = planWorktreeWaveCleanup('/repo/main', manifest);
|
||||
assert.equal(result.ok, true);
|
||||
assert.equal(result.entries.length, 2);
|
||||
assert.deepEqual(result.entries.map((e) => e.branch), ['agent-a1', 'worktree-agent-a2']);
|
||||
});
|
||||
|
||||
test('hint string names the widened accepted pattern', () => {
|
||||
const plan = planWorktreeRecordAgent('{"worktrees":[]}', {
|
||||
agentId: 'a1', worktreePath: '/repo/wt', branch: 'feature-x', base: 'abc123',
|
||||
});
|
||||
assert.equal(plan.ok, false);
|
||||
assert.match(plan.hint, /\(worktree-\)\?agent-\[A-Za-z0-9\._\/-\]\+/);
|
||||
});
|
||||
});
|
||||
|
||||
// ─── cmdWorktreeRecordAgent (#1298 CLI wrapper) ───────────────────────────────
|
||||
|
||||
describe('cmdWorktreeRecordAgent', () => {
|
||||
@@ -824,6 +909,26 @@ describe('cmdWorktreeRecordAgent', () => {
|
||||
assert.match(out.join(''), /"ok": true/);
|
||||
});
|
||||
|
||||
test('accepts the current agent-<id> namespace via CLI (#1995)', () => {
|
||||
let writtenContent = null;
|
||||
const agentArgs = [
|
||||
'--manifest', 'manifest.json',
|
||||
'--agent-id', 'a1',
|
||||
'--path', '/repo/.claude/worktrees/agent-a1',
|
||||
'--branch', 'agent-a1',
|
||||
'--base', 'abc123',
|
||||
];
|
||||
const result = cmdWorktreeRecordAgent('/repo/main', agentArgs, {
|
||||
readFile: () => '{"orchestrator_root":"/repo/main","worktrees":[]}',
|
||||
writeFile: (_p, c) => { writtenContent = c; },
|
||||
write: () => {},
|
||||
writeErr: () => {},
|
||||
});
|
||||
assert.equal(result.ok, true);
|
||||
const written = JSON.parse(writtenContent);
|
||||
assert.equal(written.worktrees[0].branch, 'agent-a1');
|
||||
});
|
||||
|
||||
test('exits 2 with usage when --manifest is missing', () => {
|
||||
withExitCode(() => {
|
||||
const errs = [];
|
||||
@@ -2620,10 +2725,10 @@ describe('bug #3384: adjacent worktree data-loss guards', () => {
|
||||
|
||||
const fragmentSource = fs.readFileSync(WORKTREE_BRANCH_CHECK_FRAGMENT, 'utf8');
|
||||
const branchCheck = fragmentSource.indexOf('HEAD_REF=$(git symbolic-ref --quiet HEAD || echo');
|
||||
const namespaceCheck = fragmentSource.indexOf('^worktree-agent-');
|
||||
const namespaceCheck = fragmentSource.indexOf('(worktree-)?agent-');
|
||||
|
||||
assert.ok(branchCheck > 0, 'canonical fragment must assert HEAD before any work');
|
||||
assert.ok(namespaceCheck > branchCheck, 'canonical fragment must require disposable worktree-agent branch');
|
||||
assert.ok(namespaceCheck > branchCheck, 'canonical fragment must require disposable agent/worktree-agent branch');
|
||||
// #48: verify-only — the destructive self-recovery is gone; the fragment fails closed instead.
|
||||
assert.ok(!fragmentSource.includes('git reset --hard {EXPECTED_BASE}'), 'canonical fragment must not self-recover via reset --hard — orchestrator owns recovery (#48)');
|
||||
assert.ok(fragmentSource.includes('exit 42'), 'canonical fragment must fail closed with exit 42 on base mismatch (#48)');
|
||||
|
||||
@@ -167,9 +167,9 @@ describe('canonical worktree-branch-check fragment is the single source of truth
|
||||
assert.ok(/\brelease\b/.test(block), 'fragment protected-ref alternation must include release');
|
||||
});
|
||||
|
||||
test('fragment block positive allow-list matches ^worktree-agent- pattern', () => {
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^worktree-agent-/;
|
||||
assert.ok(allowListRe.test(block), 'fragment block must enforce a positive allow-list matching ^worktree-agent-');
|
||||
test('fragment block positive allow-list matches ^(worktree-)?agent- pattern', () => {
|
||||
const allowListRe = /grep\s+-Eq?\s+'\^\(worktree-\)\?agent-/;
|
||||
assert.ok(allowListRe.test(block), 'fragment block must enforce a positive allow-list matching ^(worktree-)?agent-');
|
||||
});
|
||||
|
||||
test('fragment block contains update-ref prohibition text', () => {
|
||||
|
||||
Reference in New Issue
Block a user