Adds a new ruflo-testgen surface that closes the loop the existing TDD
plugins didn't — we generate tests, this fixes the code to satisfy them.
Inspired by agent-harness-generator/packages/darwin-mode ADR-175 Test-
Driven Repair mode, but implemented via headless `claude -p` instead of
wrapping `metaharness-darwin evolve`. Rationale:
1. `claude -p` already in our stack (no new optional dep)
2. Bounded cost via --max-budget-usd (first-class flag)
3. Capability-restricted via --allowedTools Read,Edit,Bash
4. Test exit code IS the fitness function (no LLM-as-judge)
5. Resumable via --session-id
Surface:
- plugins/ruflo-testgen/scripts/tdd-repair/tdd-repair.mjs (script)
- plugins/ruflo-testgen/skills/tdd-repair/SKILL.md (skill)
- v3/@claude-flow/cli/src/mcp-tools/testgen-tools.ts (MCP tool:
testgen_tdd_repair)
Pipeline (Test-Driven mode):
1. Pre-flight: run the test command. Refuse if already passing.
2. Spawn `claude -p` with focused prompt (read failing test, fix
source, don't touch test, verify by running it).
3. Re-run test to verify the fix; emit per-attempt receipts incl.
usage.cost_usd from claude's --output-format json.
4. If green: success. If red after --max-attempts: emit failure
receipts; workspace left as-modified for review.
Safety (mirrors ADR-153 conventions):
- --confirm REQUIRED (dry-run otherwise)
- --max-budget-usd hard cap (default $5, divided across attempts)
- --allowedTools restricts spawned claude to Read/Edit/Bash
- --permission-mode acceptEdits (auto-accept within the allowed set)
- 15 min hard timeout
- Pre-flight catches --test-command typos before any spend
Conformant mode (--no-test-oracle, agent writes own repro via MCTS)
is scoped for a follow-up ADR — current --no-test-oracle returns
config error with a clear hint.
Smoke verification (docs/benchmarks/tdd-repair/SMOKE-2026-06-22.md):
Built minimal failing-test fixture: add(a,b) returns a-b instead of
a+b. Pre-repair: 2/2 tests fail. After `tdd-repair --confirm`:
source patched to a+b, 2/2 tests pass. Verified by re-running.
Version bump 3.13.3 → 3.14.0 (MINOR per semver — backward-compatible
new MCP tool + new skill). Published with all three dist-tags (latest,
alpha, v3alpha) for @claude-flow/cli, claude-flow, ruflo.
Co-Authored-By: RuFlo <ruv@ruv.net>
full-system-test surfaced 23/32 plugin smoke contracts failing on a
single drifted assertion: the smoke gate greps ADR-0001 for
`status: Proposed`, but those ADRs were long since promoted to
`Accepted` without updating the gate. Flip the assertion (label, grep,
message) Proposed -> Accepted only where the ADR is genuinely Accepted.
ruflo-core additionally had a stale version assertion (0.2.0 -> 0.2.2).
Left untouched: ruflo-adr, ruflo-browser, ruflo-intelligence — their
ADR-0001 is genuinely Proposed, so their smokes correctly assert it.
No plugin source or ADR changed — only the drifted test assertions.
All 32 plugin smoke contracts now pass; full-system-test is 4/4 green.
Co-Authored-By: RuFlo <ruv@ruv.net>