Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 0 additions & 31 deletions .claude/agents/implementer.md

This file was deleted.

38 changes: 0 additions & 38 deletions .claude/agents/orchestrator.md

This file was deleted.

36 changes: 0 additions & 36 deletions .claude/agents/reviewer.md

This file was deleted.

27 changes: 0 additions & 27 deletions .claude/agents/test-runner.md

This file was deleted.

9 changes: 8 additions & 1 deletion .claude/gates.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,20 @@
"lint": "pnpm -r lint && pnpm exec solhint 'contracts/src/**/*.sol' 'contracts/test/**/*.sol' && (cd contracts && forge fmt --check)",
"typecheck": "pnpm -r build && pnpm -r typecheck",
"test": "pnpm -r build && pnpm -r test && (cd contracts && forge test)",
"test_affected": "pnpm -r build && pnpm -r test && (cd contracts && forge test)",
"_note_test_affected": "LOOP-ONLY (deliberate). test_affected is the gate the Stop hook fires, so an unguarded version ran the whole monorepo build+test after EVERY assistant turn — including pure planning turns in a `claude remote-control` session, since claude-rc.service runs with WorkingDirectory=<repo> and therefore loads these same hooks. The guard below no-ops it unless the turn belongs to the autonomous loop. Detection: loop-daemon.sh exports CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS into every `claude -p` it spawns (scripts/loop-daemon.sh:565, and again via --setenv= for the sandboxed path); interactive sessions do not have it. REDEPLOY_LOOP=1 is an explicit manual override. Fail-open risk is bounded: if detection ever breaks, the loop merely skips this belt-and-braces layer — .github/workflows/gates.yml still runs build/lint/typecheck/test/coverage on every PR and is the authoritative merge gate. The skip is printed, not silent, so a misdetection is visible in the loop log. NOTE: test_affected is hook-only — it is NOT in the CI matrix — so this guard cannot weaken CI.",
"test_affected": "if [ -z \"${REDEPLOY_LOOP:-}${CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS:-}\" ]; then echo 'gate test_affected: skipped — interactive session (not the autonomous loop). Force with REDEPLOY_LOOP=1.'; exit 0; fi; pnpm -r build && pnpm -r test && (cd contracts && forge test)",
"coverage": "pnpm -r build && pnpm -r coverage",
"coverage_threshold": 80,
"e2e": "pnpm -F @redeploy/core build && (cd contracts && forge build) && pnpm -F @redeploy/core test:e2e",
"security": ""
},

"worktree": {
"_note": "Per-worktree lifecycle, run by .claude/scripts/worktree.sh. `setup` runs right after an isolated implementer/reviewer worktree is created and bootstraps the toolchain state that lives OUTSIDE the tree — node_modules (pnpm) and contracts/lib (Foundry deps, gitignored) — so EVERY gate is runnable in-worktree, not just in the main checkout. Without it, in-worktree gates fail for missing deps rather than for real defects. Mirrors gates.install deliberately: same idempotent guards, so re-running is cheap and a fresh worktree needs no manual step. `teardown` is unused (pnpm's store is shared and forge libs are per-worktree; nothing to free).",
"setup": "pnpm install && (cd contracts && { [ -d lib/forge-std ] || forge install --no-git foundry-rs/forge-std@v1.16.1; } && { [ -d lib/openzeppelin-contracts ] || forge install --no-git OpenZeppelin/openzeppelin-contracts@v5.1.0; })",
"teardown": ""
},

"review": {
"lenses": ["correctness", "tests", "security", "performance"],
"consensus": "all",
Expand Down
Loading
Loading