* fix(#2825): gsd-code-fixer honors workflow.use_worktrees; never rm -rf a reparse point
gsd-code-fixer was the only writer that hand-rolled a git worktree inside the
agent prompt and the only one that never read workflow.use_worktrees. With the
setting explicitly false, --fix still created worktrees; the fresh worktree had
no node_modules, so runs improvised a teardown whose `rm -rf` followed a Windows
junction into the REAL node_modules (silent data loss, 3x observed).
Defect 1: gate setup_worktree + its cleanup tail on workflow.use_worktrees
(same gsd_run query config-get read the four sibling workflows use). When false:
edit/commit in the main checkout (wt='.', no temp branch, no sentinel, no cleanup).
Defect 2: forbid rm -rf on a possible reparse point in the spec — never fall
through to a destructive remove; on failure, stop and surface the error.
Defect 3: REVIEW-FIX records where verification ran (main checkout vs worktree).
The transactional worktree path (#2839/#2990/#2686) is unchanged when worktrees
are enabled. Docs-parity guards in tests/code-review.test.cjs bind the spec to
the fix.
* chore(#2825): backfill changeset PR 2905
* fix(#2825): drop stale agents/gsd-code-fixer.toml ack + spent entries (emitted-attribution)
gsd-test failed: agents/gsd-code-fixer.toml is a STALE ack here — that TOML was
changed by #2834 (now in next), not this PR. The 4 base-carried acks
(autonomous/discuss-phase-assumptions/next/plan-phase) are spent/inert.
---------
Co-authored-by: Test <test@example.com>
(cherry picked from commit 5d0fd4dc53)
This commit is contained in:
@@ -260,6 +260,39 @@ describe('CR-AGENT: code review agent frontmatter', () => {
|
||||
assert.ok(content.includes('files_reviewed_list'),
|
||||
'gsd-code-reviewer REVIEW.md frontmatter spec must include files_reviewed_list for --auto scope persistence');
|
||||
});
|
||||
|
||||
// #2825: gsd-code-fixer is the only writer that hand-rolls a git worktree; it
|
||||
// must honor workflow.use_worktrees (the documented opt-out) like its four
|
||||
// sibling writer workflows, and never rm -rf a possible Windows reparse point.
|
||||
test('#2825 gsd-code-fixer.md reads workflow.use_worktrees and gates git worktree add on it', () => {
|
||||
const content = fs.readFileSync(path.join(AGENTS_DIR, 'gsd-code-fixer.md'), 'utf-8');
|
||||
assert.ok(
|
||||
content.includes('workflow.use_worktrees'),
|
||||
'gsd-code-fixer setup_worktree must read the workflow.use_worktrees config flag (#2825)',
|
||||
);
|
||||
// The git worktree add must be CONDITIONAL on the flag, not unconditional.
|
||||
// Locate the worktree-add line and confirm a USE_WORKTREES gate precedes it.
|
||||
assert.ok(
|
||||
/USE_WORKTREES=.false./.test(content) || content.includes('if [ "$USE_WORKTREES" = "false" ]'),
|
||||
'gsd-code-fixer must gate worktree creation on USE_WORKTREES=false (skip when opted out) (#2825)',
|
||||
);
|
||||
});
|
||||
|
||||
test('#2825 gsd-code-fixer.md forbids rm -rf on a possible reparse point (Windows junction safety)', () => {
|
||||
const content = fs.readFileSync(path.join(AGENTS_DIR, 'gsd-code-fixer.md'), 'utf-8');
|
||||
assert.ok(
|
||||
/rm -rf.*reparse point|reparse point.*rm -rf|NEVER .rm -rf.|never use .rm -rf/i.test(content),
|
||||
'gsd-code-fixer must forbid rm -rf on a possible reparse point/junction (#2825) — on Windows that is the delete-the-target path',
|
||||
);
|
||||
});
|
||||
|
||||
test('#2825 gsd-code-fixer.md records where verification ran (main checkout vs worktree)', () => {
|
||||
const content = fs.readFileSync(path.join(AGENTS_DIR, 'gsd-code-fixer.md'), 'utf-8');
|
||||
assert.ok(
|
||||
/verification[\s\S]*(main checkout|worktree)|(main checkout|worktree)[\s\S]*verification/i.test(content),
|
||||
'gsd-code-fixer REVIEW-FIX.md must record where verification ran (main checkout vs worktree) so a reader knows if the numbers are reproducible (#2825)',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
// --- CR-CMD: code review command structure ---
|
||||
|
||||
Reference in New Issue
Block a user