overkill 0.9.0__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. {overkill-0.9.0 → overkill-0.10.0}/.overkillrc.example +7 -0
  2. {overkill-0.9.0 → overkill-0.10.0}/.refactorsuggestrc.example +7 -0
  3. {overkill-0.9.0 → overkill-0.10.0}/PKG-INFO +102 -15
  4. {overkill-0.9.0 → overkill-0.10.0}/README.md +101 -14
  5. overkill-0.10.0/benchmarks/README.md +59 -0
  6. overkill-0.10.0/benchmarks/__init__.py +1 -0
  7. overkill-0.10.0/benchmarks/fixtures/gemini-review-review-only.prompt.md +101 -0
  8. overkill-0.10.0/benchmarks/gemini_prompt_benchmark.py +1110 -0
  9. overkill-0.10.0/benchmarks/results/gemini-171-2026-09-20.json +78 -0
  10. overkill-0.10.0/docs/gemini-review-guidance.md +169 -0
  11. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/gemini-refactor-full.prompt.md +20 -0
  12. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/gemini-refactor-layer.prompt.md +20 -0
  13. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/gemini-refactor-micro.prompt.md +20 -0
  14. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/gemini-refactor-module.prompt.md +20 -0
  15. overkill-0.10.0/prompts/active/gemini-review.prompt.md +126 -0
  16. {overkill-0.9.0 → overkill-0.10.0}/pyproject.toml +1 -1
  17. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/__main__.py +4 -1
  18. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/agents.py +314 -41
  19. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/budget/claude.py +93 -22
  20. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/cli.py +146 -59
  21. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/commit_scope.py +25 -4
  22. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/git_ops.py +2 -1
  23. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/init.py +18 -8
  24. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/loop_engine.py +13 -33
  25. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/models.py +22 -3
  26. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/refactor_suggest.py +15 -25
  27. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/retry.py +94 -11
  28. overkill-0.10.0/src/mr_overkill/review_evidence.py +22 -0
  29. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/self_review.py +42 -16
  30. overkill-0.10.0/src/mr_overkill/two_step_fix.py +156 -0
  31. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/wip_scope.py +3 -3
  32. overkill-0.10.0/src/mr_overkill/workspace_policy.py +103 -0
  33. {overkill-0.9.0 → overkill-0.10.0}/tests/test_agents.py +7 -0
  34. overkill-0.10.0/tests/test_backend_selection.py +471 -0
  35. overkill-0.10.0/tests/test_budget_claude.py +282 -0
  36. {overkill-0.9.0 → overkill-0.10.0}/tests/test_cli.py +5 -5
  37. {overkill-0.9.0 → overkill-0.10.0}/tests/test_commit_scope.py +58 -0
  38. overkill-0.10.0/tests/test_gemini_scope_evidence.py +214 -0
  39. overkill-0.10.0/tests/test_parallel_reviewers.py +408 -0
  40. overkill-0.10.0/tests/test_review_benchmark.py +452 -0
  41. overkill-0.10.0/tests/test_self_review_evidence.py +96 -0
  42. overkill-0.10.0/tests/test_workspace_policy.py +306 -0
  43. {overkill-0.9.0 → overkill-0.10.0}/uv.lock +1 -1
  44. overkill-0.9.0/src/mr_overkill/two_step_fix.py +0 -112
  45. overkill-0.9.0/tests/test_budget_claude.py +0 -91
  46. {overkill-0.9.0 → overkill-0.10.0}/.github/workflows/publish.yml +0 -0
  47. {overkill-0.9.0 → overkill-0.10.0}/.github/workflows/test.yml +0 -0
  48. {overkill-0.9.0 → overkill-0.10.0}/.gitignore +0 -0
  49. {overkill-0.9.0 → overkill-0.10.0}/.python-version +0 -0
  50. {overkill-0.9.0 → overkill-0.10.0}/AGENTS.md +0 -0
  51. {overkill-0.9.0 → overkill-0.10.0}/CLAUDE.md +0 -0
  52. {overkill-0.9.0 → overkill-0.10.0}/GEMINI.md +0 -0
  53. {overkill-0.9.0 → overkill-0.10.0}/LICENSE +0 -0
  54. /overkill-0.9.0/prompts/active/gemini-review.prompt.md → /overkill-0.10.0/benchmarks/fixtures/gemini-review-pre171.prompt.md +0 -0
  55. {overkill-0.9.0 → overkill-0.10.0}/install.sh +0 -0
  56. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-fix-execute.prompt.md +0 -0
  57. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-fix.prompt.md +0 -0
  58. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-fix-execute.prompt.md +0 -0
  59. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-fix.prompt.md +0 -0
  60. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-full.prompt.md +0 -0
  61. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-layer.prompt.md +0 -0
  62. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-micro.prompt.md +0 -0
  63. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-refactor-module.prompt.md +0 -0
  64. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-review.prompt.md +0 -0
  65. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/claude-self-review.prompt.md +0 -0
  66. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/codex-refactor-full.prompt.md +0 -0
  67. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/codex-refactor-layer.prompt.md +0 -0
  68. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/codex-refactor-micro.prompt.md +0 -0
  69. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/codex-refactor-module.prompt.md +0 -0
  70. {overkill-0.9.0 → overkill-0.10.0}/prompts/active/codex-review.prompt.md +0 -0
  71. {overkill-0.9.0 → overkill-0.10.0}/prompts/reference/claude-code-review-plugin.md +0 -0
  72. {overkill-0.9.0 → overkill-0.10.0}/prompts/reference/claude-security-review.md +0 -0
  73. {overkill-0.9.0 → overkill-0.10.0}/prompts/reference/codex-review-original.md +0 -0
  74. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/__init__.py +0 -0
  75. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/budget/__init__.py +0 -0
  76. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/budget/codex.py +0 -0
  77. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/budget/gemini.py +0 -0
  78. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/budget_report.py +0 -0
  79. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/classify.py +0 -0
  80. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/data/__init__.py +0 -0
  81. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/data/review.schema.json +0 -0
  82. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/json_extract.py +0 -0
  83. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/reporting.py +0 -0
  84. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/resume.py +0 -0
  85. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/review_loop.py +0 -0
  86. {overkill-0.9.0 → overkill-0.10.0}/src/mr_overkill/time_utils.py +0 -0
  87. {overkill-0.9.0 → overkill-0.10.0}/tests/__init__.py +0 -0
  88. {overkill-0.9.0 → overkill-0.10.0}/tests/conftest.py +0 -0
  89. {overkill-0.9.0 → overkill-0.10.0}/tests/test_budget_codex.py +0 -0
  90. {overkill-0.9.0 → overkill-0.10.0}/tests/test_budget_gemini.py +0 -0
  91. {overkill-0.9.0 → overkill-0.10.0}/tests/test_budget_policy.py +0 -0
  92. {overkill-0.9.0 → overkill-0.10.0}/tests/test_budget_report.py +0 -0
  93. {overkill-0.9.0 → overkill-0.10.0}/tests/test_classify.py +0 -0
  94. {overkill-0.9.0 → overkill-0.10.0}/tests/test_git_ops.py +0 -0
  95. {overkill-0.9.0 → overkill-0.10.0}/tests/test_init.py +0 -0
  96. {overkill-0.9.0 → overkill-0.10.0}/tests/test_integration.py +0 -0
  97. {overkill-0.9.0 → overkill-0.10.0}/tests/test_json_extract.py +0 -0
  98. {overkill-0.9.0 → overkill-0.10.0}/tests/test_loop_engine.py +0 -0
  99. {overkill-0.9.0 → overkill-0.10.0}/tests/test_refactor_suggest.py +0 -0
  100. {overkill-0.9.0 → overkill-0.10.0}/tests/test_reporting.py +0 -0
  101. {overkill-0.9.0 → overkill-0.10.0}/tests/test_resume.py +0 -0
  102. {overkill-0.9.0 → overkill-0.10.0}/tests/test_retry.py +0 -0
  103. {overkill-0.9.0 → overkill-0.10.0}/tests/test_review_loop.py +0 -0
  104. {overkill-0.9.0 → overkill-0.10.0}/tests/test_self_review.py +0 -0
  105. {overkill-0.9.0 → overkill-0.10.0}/tests/test_time_utils.py +0 -0
  106. {overkill-0.9.0 → overkill-0.10.0}/tests/test_two_step_fix.py +0 -0
  107. {overkill-0.9.0 → overkill-0.10.0}/tests/test_wip_scope.py +0 -0
  108. {overkill-0.9.0 → overkill-0.10.0}/uninstall.sh +0 -0
@@ -51,3 +51,10 @@
51
51
  # Save full Claude event stream (tool calls, reasoning) to .stream.jsonl files.
52
52
  # Useful for debugging missed findings. (default: false)
53
53
  # DIAGNOSTIC_LOG=false
54
+
55
+ # Role backends: claude, codex, gemini, or agy (Antigravity).
56
+ # REVIEWER_BACKEND also accepts comma lists for parallel reviewers.
57
+ # REVIEWER_BACKEND="codex"
58
+ # FIXER_BACKEND="claude"
59
+ # Self-review follows FIXER_BACKEND unless explicitly overridden.
60
+ # SELF_REVIEWER_BACKEND="gemini"
@@ -54,3 +54,10 @@
54
54
  # Save full Claude event stream (tool calls, reasoning) to .stream.jsonl files.
55
55
  # Useful for debugging missed findings. (default: false)
56
56
  # DIAGNOSTIC_LOG=false
57
+
58
+ # Role backends: claude, codex, gemini, or agy (Antigravity).
59
+ # REVIEWER_BACKEND also accepts comma lists for parallel reviewers.
60
+ # REVIEWER_BACKEND="codex"
61
+ # FIXER_BACKEND="claude"
62
+ # Self-review follows FIXER_BACKEND unless explicitly overridden.
63
+ # SELF_REVIEWER_BACKEND="gemini"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: overkill
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: AI-powered code review loop — automates Codex/Gemini review + Claude fix cycles
5
5
  Project-URL: Repository, https://github.com/modocai/mr-overkill
6
6
  Project-URL: Issues, https://github.com/modocai/mr-overkill/issues
@@ -141,7 +141,10 @@ Options:
141
141
  --fix-nits Also flag nits and style issues during self-review
142
142
  --context <text> Additional context for the reviewer (design intent,
143
143
  constraints)
144
- --reviewer-backend <be> Reviewer backend: claude|codex|gemini (default: codex)
144
+ --reviewer <be[,be]> Reviewer backend(s): claude|codex|gemini|agy
145
+ (default: codex)
146
+ --fixer-backend <be> Fixer backend: claude|codex|gemini|agy (default: claude)
147
+ --self-reviewer-backend <be> Self-review backend (default: same as fixer)
145
148
  --ci-trigger-mode <m> CI trigger policy: every|last-only|none (default: last-only).
146
149
  'last-only' tags each iteration commit with [skip ci]
147
150
  and pushes a single empty trigger commit on PASS —
@@ -157,7 +160,8 @@ Examples:
157
160
  overkill review-loop -n 1 --dry-run # single review, no fixes
158
161
  overkill review-loop -n 3 --no-self-review # disable self-review sub-loop
159
162
  overkill review-loop --resume # resume an interrupted run
160
- overkill review-loop -n 2 --reviewer-backend claude # use Claude as reviewer
163
+ overkill review-loop -n 2 --reviewer claude # use Claude as reviewer
164
+ overkill review-loop -n 2 --reviewer codex,gemini # parallel reviewers
161
165
  overkill review-loop -n 10 --ci-trigger-mode last-only # CI fires once on PASS
162
166
 
163
167
  # Review only what landed after a given commit, before opening a PR
@@ -281,7 +285,10 @@ Options:
281
285
  --resume Resume from a previously interrupted run (reuses existing logs)
282
286
  --with-review Run review-loop after PR creation (default: 4 iterations)
283
287
  --with-review-loops <N> Set review-loop iteration count (implies --with-review)
284
- --reviewer-backend <be> Reviewer backend: claude|codex|gemini (default: codex)
288
+ --reviewer <be[,be]> Reviewer backend(s): claude|codex|gemini|agy
289
+ (default: codex)
290
+ --fixer-backend <be> Fixer backend: claude|codex|gemini|agy (default: claude)
291
+ --self-reviewer-backend <be> Self-review backend (default: same as fixer)
285
292
  --diagnostic-log Save full Claude event stream to sidecar files
286
293
  --no-budget-gate Skip token-budget checks and run regardless
287
294
  (same as OVERKILL_SKIP_BUDGET=1)
@@ -294,6 +301,7 @@ Examples:
294
301
  overkill refactor-suggest --scope full -n 1 --create-pr # architecture redesign + PR
295
302
  overkill refactor-suggest -n 2 --with-review # auto scope + auto review
296
303
  overkill refactor-suggest --scope module -n 3 --with-review-loops 6 # custom review
304
+ overkill refactor-suggest -n 1 --reviewer codex,claude # parallel analysis
297
305
  ```
298
306
 
299
307
  ## Usage: overkill init
@@ -330,10 +338,10 @@ Creates:
330
338
 
331
339
  ```
332
340
  1. Collect source file list (git ls-files)
333
- 2. Reviewer (Codex or Claude) analyzes the full codebase for scope-specific refactoring opportunities
341
+ 2. Reviewer(s) analyze the full codebase for scope-specific refactoring opportunities
334
342
  3. (layer/full) Display refactoring plan and wait for confirmation
335
- 4. Claude applies refactoring (two-step: opinion → execute)
336
- 5. Claude self-reviews changes, re-fixes if needed
343
+ 4. The selected fixer applies refactoring (two-step: opinion → execute)
344
+ 5. The selected self-reviewer checks changes, re-fixes if needed
337
345
  6. Auto-commit & push to refactoring branch
338
346
  7. Repeat until clean or max iterations reached
339
347
  8. (--create-pr) Create draft PR
@@ -353,7 +361,9 @@ TARGET_BRANCH="main"
353
361
  MAX_LOOP=5
354
362
  MAX_SUBLOOP=4
355
363
  AUTO_COMMIT=true
356
- REVIEWER_BACKEND="codex" # or "claude"
364
+ REVIEWER_BACKEND="codex" # comma list: claude | codex | gemini | agy
365
+ FIXER_BACKEND="claude" # claude | codex | gemini | agy
366
+ # SELF_REVIEWER_BACKEND="gemini" # omitted: follows FIXER_BACKEND
357
367
  PROMPTS_DIR="./custom-prompts"
358
368
  ```
359
369
 
@@ -372,7 +382,9 @@ AUTO_APPROVE=false
372
382
  CREATE_PR=false
373
383
  WITH_REVIEW=false
374
384
  REVIEW_LOOPS=4
375
- REVIEWER_BACKEND="codex" # or "claude"
385
+ REVIEWER_BACKEND="codex" # comma list: claude | codex | gemini | agy
386
+ FIXER_BACKEND="claude" # claude | codex | gemini | agy
387
+ # SELF_REVIEWER_BACKEND="gemini" # omitted: follows FIXER_BACKEND
376
388
  PROMPTS_DIR="./custom-prompts"
377
389
  ```
378
390
 
@@ -384,13 +396,13 @@ PROMPTS_DIR="./custom-prompts"
384
396
  3. Loop (iteration 1..N):
385
397
  a. Generate diff: git diff $TARGET...$CURRENT
386
398
  b. Empty diff → exit
387
- c. Reviewer (Codex or Claude, via --reviewer-backend) reviews the diff → JSON with findings
399
+ c. Reviewer(s), via --reviewer, review the diff → JSON with findings
388
400
  d. No findings + "patch is correct" → exit
389
- e. Claude fixes all issues (P0-P3)
401
+ e. The selected fixer fixes all issues (P0-P3)
390
402
  f. Sub-loop (1..MAX_SUBLOOP):
391
- - Claude self-reviews the uncommitted fixes (git diff)
403
+ - The selected self-reviewer checks the uncommitted fixes (git diff)
392
404
  - If clean → break
393
- - Claude re-fixes based on self-review findings
405
+ - The selected fixer re-fixes based on self-review findings
394
406
  g. Auto-commit all fixes + re-fixes to branch
395
407
  h. Push to remote (updates PR)
396
408
  i. Post review/fix/self-review summary as PR comment
@@ -406,7 +418,8 @@ All logs are git-ignored by default (inside `.overkill/`).
406
418
 
407
419
  | File | Description |
408
420
  |------|-------------|
409
- | `review-N.json` | Codex review output for iteration N |
421
+ | `review-N.json` | Combined review output for iteration N |
422
+ | `reviewers/<backend>/review-N.json` | Individual reviewer output for iteration N when multiple reviewers run |
410
423
  | `opinion-N.md` | Claude's opinion on review findings (iteration N) |
411
424
  | `fix-N.md` | Claude fix log for iteration N |
412
425
  | `self-review-N-M.json` | Claude self-review output (iteration N, sub-iteration M) |
@@ -419,7 +432,8 @@ All logs are git-ignored by default (inside `.overkill/`).
419
432
  | File | Description |
420
433
  |------|-------------|
421
434
  | `source-files.txt` | List of files analyzed (from `git ls-files`) |
422
- | `review-N.json` | Codex refactoring analysis for iteration N |
435
+ | `review-N.json` | Combined refactoring analysis for iteration N |
436
+ | `reviewers/<backend>/review-N.json` | Individual reviewer output for iteration N when multiple reviewers run |
423
437
  | `opinion-N.md` | Claude's opinion on refactoring findings (iteration N) |
424
438
  | `fix-N.md` | Claude fix log for iteration N |
425
439
  | `self-review-N-M.json` | Claude self-review (iteration N, sub-iteration M) |
@@ -554,3 +568,76 @@ uv run pytest --tb=short
554
568
  ## License
555
569
 
556
570
  [MIT](LICENSE) &copy; 2026 ModocAI
571
+
572
+ ### Selecting role backends
573
+
574
+ Both `review-loop` and `refactor-suggest` accept independent reviewer and fixer
575
+ backends. `--reviewer` selects one or more review backends; `--reviewer-backend`
576
+ remains a compatible alias. The rc key `REVIEWER_BACKEND` is unchanged.
577
+ Defaults remain Codex review and Claude fix. Self-review follows the
578
+ fixer unless `--self-reviewer-backend` / `SELF_REVIEWER_BACKEND` is set.
579
+
580
+ ```sh
581
+ overkill review-loop -n 3 --reviewer gemini --fixer-backend codex
582
+ overkill review-loop -n 3 --reviewer codex,claude,gemini
583
+ # Optional independent verification of the fix:
584
+ overkill review-loop -n 3 --fixer-backend codex --self-reviewer-backend claude
585
+ ```
586
+
587
+ Reviewer lists are comma-separated, whitespace is ignored, and duplicates are
588
+ collapsed while preserving the first occurrence. When multiple reviewers are
589
+ selected, they run in parallel once per iteration. Their findings are combined
590
+ into a single review for the normal fixer path, and all selected reviewers must
591
+ succeed before fixing begins. Exact duplicate findings are collapsed only by
592
+ exact match; Mr. Overkill does not semantically merge similar findings. Each
593
+ individual review is written to `reviewers/<backend>/review-N.json`, while the
594
+ combined result remains `review-N.json`. The fixer and self-reviewer behavior is
595
+ unchanged.
596
+
597
+ Install and authenticate each selected CLI before running. Codex fixes use
598
+ `workspace-write`; Gemini fixes use sandboxed `yolo` mode. Opinion and self-review
599
+ use Codex `read-only` or Gemini `plan` mode (requires a Gemini CLI supporting that
600
+ mode). Claude retains its existing two-step session. Codex and Gemini receive the
601
+ opinion and original findings explicitly in the editing step. Existing
602
+ `claude-*-fix*` and `claude-self-review` prompt filenames remain shared templates
603
+ for compatibility with custom prompt directories.
604
+
605
+ Gemini reviewers (including refactoring analysis) also use sandboxed `plan` mode,
606
+ never `yolo`. Overkill supplies the requested diff directly because plan mode may
607
+ disable shell tools; commit/WIP scope remains authoritative. The bundled Gemini
608
+ prompts include evidence-driven review guidance without invoking an installed
609
+ `/code-review` command, changing the target to `origin/HEAD`, or replacing the
610
+ JSON/P0-P3 contract. Refresh existing local prompt copies with `overkill init`
611
+ after inspecting any customizations. Permission failures are not code defects;
612
+ there is no automatic fallback to editing mode.
613
+
614
+ Plan mode is a CLI permission policy, not a guarantee against every possible
615
+ side effect (for example, Gemini permits its own plan-directory writes). See
616
+ [`docs/gemini-review-guidance.md`](docs/gemini-review-guidance.md) for provenance,
617
+ headless verification limits, and the reproducible prompt benchmark.
618
+
619
+ CLI options override rc settings. `--resume` restores saved role selections unless
620
+ explicitly overridden on the command line; an inherited self-review selection
621
+ continues to follow the fixer. `--no-self-review` still disables this stage.
622
+
623
+ Antigravity CLI is supported explicitly as `agy` for all three roles:
624
+
625
+ ```sh
626
+ overkill review-loop -n 3 --reviewer agy --fixer-backend codex
627
+ overkill refactor-suggest --scope module --fixer-backend agy
628
+ ```
629
+
630
+ Google announced the consumer transition from Gemini CLI on May 19, 2026, with
631
+ free/Pro/Ultra access ending June 18; enterprise and paid API-key access remain.
632
+ See the [official announcement](https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/).
633
+ Existing `gemini` selections continue to invoke `gemini`; no automatic executable
634
+ or account switching occurs. Authenticate `agy` separately before use.
635
+
636
+ Antigravity uses `--mode plan` for review/opinion and `--mode accept-edits` for
637
+ fixes, with `--sandbox` in both. It does not bypass permissions: shell commands
638
+ may be denied in headless mode unless your Antigravity policy permits them.
639
+ Use an up-to-date CLI that applies `--mode` to headless runs. Antigravity shares
640
+ the existing `gemini-*` review prompts. Local Antigravity quota preflight data is
641
+ not available; runtime errors go through the retry/error handling path.
642
+ See [headless mode](https://antigravity.google/docs/cli/headless/) and
643
+ [execution modes](https://www.antigravity.google/docs/cli/modes/).
@@ -118,7 +118,10 @@ Options:
118
118
  --fix-nits Also flag nits and style issues during self-review
119
119
  --context <text> Additional context for the reviewer (design intent,
120
120
  constraints)
121
- --reviewer-backend <be> Reviewer backend: claude|codex|gemini (default: codex)
121
+ --reviewer <be[,be]> Reviewer backend(s): claude|codex|gemini|agy
122
+ (default: codex)
123
+ --fixer-backend <be> Fixer backend: claude|codex|gemini|agy (default: claude)
124
+ --self-reviewer-backend <be> Self-review backend (default: same as fixer)
122
125
  --ci-trigger-mode <m> CI trigger policy: every|last-only|none (default: last-only).
123
126
  'last-only' tags each iteration commit with [skip ci]
124
127
  and pushes a single empty trigger commit on PASS —
@@ -134,7 +137,8 @@ Examples:
134
137
  overkill review-loop -n 1 --dry-run # single review, no fixes
135
138
  overkill review-loop -n 3 --no-self-review # disable self-review sub-loop
136
139
  overkill review-loop --resume # resume an interrupted run
137
- overkill review-loop -n 2 --reviewer-backend claude # use Claude as reviewer
140
+ overkill review-loop -n 2 --reviewer claude # use Claude as reviewer
141
+ overkill review-loop -n 2 --reviewer codex,gemini # parallel reviewers
138
142
  overkill review-loop -n 10 --ci-trigger-mode last-only # CI fires once on PASS
139
143
 
140
144
  # Review only what landed after a given commit, before opening a PR
@@ -258,7 +262,10 @@ Options:
258
262
  --resume Resume from a previously interrupted run (reuses existing logs)
259
263
  --with-review Run review-loop after PR creation (default: 4 iterations)
260
264
  --with-review-loops <N> Set review-loop iteration count (implies --with-review)
261
- --reviewer-backend <be> Reviewer backend: claude|codex|gemini (default: codex)
265
+ --reviewer <be[,be]> Reviewer backend(s): claude|codex|gemini|agy
266
+ (default: codex)
267
+ --fixer-backend <be> Fixer backend: claude|codex|gemini|agy (default: claude)
268
+ --self-reviewer-backend <be> Self-review backend (default: same as fixer)
262
269
  --diagnostic-log Save full Claude event stream to sidecar files
263
270
  --no-budget-gate Skip token-budget checks and run regardless
264
271
  (same as OVERKILL_SKIP_BUDGET=1)
@@ -271,6 +278,7 @@ Examples:
271
278
  overkill refactor-suggest --scope full -n 1 --create-pr # architecture redesign + PR
272
279
  overkill refactor-suggest -n 2 --with-review # auto scope + auto review
273
280
  overkill refactor-suggest --scope module -n 3 --with-review-loops 6 # custom review
281
+ overkill refactor-suggest -n 1 --reviewer codex,claude # parallel analysis
274
282
  ```
275
283
 
276
284
  ## Usage: overkill init
@@ -307,10 +315,10 @@ Creates:
307
315
 
308
316
  ```
309
317
  1. Collect source file list (git ls-files)
310
- 2. Reviewer (Codex or Claude) analyzes the full codebase for scope-specific refactoring opportunities
318
+ 2. Reviewer(s) analyze the full codebase for scope-specific refactoring opportunities
311
319
  3. (layer/full) Display refactoring plan and wait for confirmation
312
- 4. Claude applies refactoring (two-step: opinion → execute)
313
- 5. Claude self-reviews changes, re-fixes if needed
320
+ 4. The selected fixer applies refactoring (two-step: opinion → execute)
321
+ 5. The selected self-reviewer checks changes, re-fixes if needed
314
322
  6. Auto-commit & push to refactoring branch
315
323
  7. Repeat until clean or max iterations reached
316
324
  8. (--create-pr) Create draft PR
@@ -330,7 +338,9 @@ TARGET_BRANCH="main"
330
338
  MAX_LOOP=5
331
339
  MAX_SUBLOOP=4
332
340
  AUTO_COMMIT=true
333
- REVIEWER_BACKEND="codex" # or "claude"
341
+ REVIEWER_BACKEND="codex" # comma list: claude | codex | gemini | agy
342
+ FIXER_BACKEND="claude" # claude | codex | gemini | agy
343
+ # SELF_REVIEWER_BACKEND="gemini" # omitted: follows FIXER_BACKEND
334
344
  PROMPTS_DIR="./custom-prompts"
335
345
  ```
336
346
 
@@ -349,7 +359,9 @@ AUTO_APPROVE=false
349
359
  CREATE_PR=false
350
360
  WITH_REVIEW=false
351
361
  REVIEW_LOOPS=4
352
- REVIEWER_BACKEND="codex" # or "claude"
362
+ REVIEWER_BACKEND="codex" # comma list: claude | codex | gemini | agy
363
+ FIXER_BACKEND="claude" # claude | codex | gemini | agy
364
+ # SELF_REVIEWER_BACKEND="gemini" # omitted: follows FIXER_BACKEND
353
365
  PROMPTS_DIR="./custom-prompts"
354
366
  ```
355
367
 
@@ -361,13 +373,13 @@ PROMPTS_DIR="./custom-prompts"
361
373
  3. Loop (iteration 1..N):
362
374
  a. Generate diff: git diff $TARGET...$CURRENT
363
375
  b. Empty diff → exit
364
- c. Reviewer (Codex or Claude, via --reviewer-backend) reviews the diff → JSON with findings
376
+ c. Reviewer(s), via --reviewer, review the diff → JSON with findings
365
377
  d. No findings + "patch is correct" → exit
366
- e. Claude fixes all issues (P0-P3)
378
+ e. The selected fixer fixes all issues (P0-P3)
367
379
  f. Sub-loop (1..MAX_SUBLOOP):
368
- - Claude self-reviews the uncommitted fixes (git diff)
380
+ - The selected self-reviewer checks the uncommitted fixes (git diff)
369
381
  - If clean → break
370
- - Claude re-fixes based on self-review findings
382
+ - The selected fixer re-fixes based on self-review findings
371
383
  g. Auto-commit all fixes + re-fixes to branch
372
384
  h. Push to remote (updates PR)
373
385
  i. Post review/fix/self-review summary as PR comment
@@ -383,7 +395,8 @@ All logs are git-ignored by default (inside `.overkill/`).
383
395
 
384
396
  | File | Description |
385
397
  |------|-------------|
386
- | `review-N.json` | Codex review output for iteration N |
398
+ | `review-N.json` | Combined review output for iteration N |
399
+ | `reviewers/<backend>/review-N.json` | Individual reviewer output for iteration N when multiple reviewers run |
387
400
  | `opinion-N.md` | Claude's opinion on review findings (iteration N) |
388
401
  | `fix-N.md` | Claude fix log for iteration N |
389
402
  | `self-review-N-M.json` | Claude self-review output (iteration N, sub-iteration M) |
@@ -396,7 +409,8 @@ All logs are git-ignored by default (inside `.overkill/`).
396
409
  | File | Description |
397
410
  |------|-------------|
398
411
  | `source-files.txt` | List of files analyzed (from `git ls-files`) |
399
- | `review-N.json` | Codex refactoring analysis for iteration N |
412
+ | `review-N.json` | Combined refactoring analysis for iteration N |
413
+ | `reviewers/<backend>/review-N.json` | Individual reviewer output for iteration N when multiple reviewers run |
400
414
  | `opinion-N.md` | Claude's opinion on refactoring findings (iteration N) |
401
415
  | `fix-N.md` | Claude fix log for iteration N |
402
416
  | `self-review-N-M.json` | Claude self-review (iteration N, sub-iteration M) |
@@ -531,3 +545,76 @@ uv run pytest --tb=short
531
545
  ## License
532
546
 
533
547
  [MIT](LICENSE) &copy; 2026 ModocAI
548
+
549
+ ### Selecting role backends
550
+
551
+ Both `review-loop` and `refactor-suggest` accept independent reviewer and fixer
552
+ backends. `--reviewer` selects one or more review backends; `--reviewer-backend`
553
+ remains a compatible alias. The rc key `REVIEWER_BACKEND` is unchanged.
554
+ Defaults remain Codex review and Claude fix. Self-review follows the
555
+ fixer unless `--self-reviewer-backend` / `SELF_REVIEWER_BACKEND` is set.
556
+
557
+ ```sh
558
+ overkill review-loop -n 3 --reviewer gemini --fixer-backend codex
559
+ overkill review-loop -n 3 --reviewer codex,claude,gemini
560
+ # Optional independent verification of the fix:
561
+ overkill review-loop -n 3 --fixer-backend codex --self-reviewer-backend claude
562
+ ```
563
+
564
+ Reviewer lists are comma-separated, whitespace is ignored, and duplicates are
565
+ collapsed while preserving the first occurrence. When multiple reviewers are
566
+ selected, they run in parallel once per iteration. Their findings are combined
567
+ into a single review for the normal fixer path, and all selected reviewers must
568
+ succeed before fixing begins. Exact duplicate findings are collapsed only by
569
+ exact match; Mr. Overkill does not semantically merge similar findings. Each
570
+ individual review is written to `reviewers/<backend>/review-N.json`, while the
571
+ combined result remains `review-N.json`. The fixer and self-reviewer behavior is
572
+ unchanged.
573
+
574
+ Install and authenticate each selected CLI before running. Codex fixes use
575
+ `workspace-write`; Gemini fixes use sandboxed `yolo` mode. Opinion and self-review
576
+ use Codex `read-only` or Gemini `plan` mode (requires a Gemini CLI supporting that
577
+ mode). Claude retains its existing two-step session. Codex and Gemini receive the
578
+ opinion and original findings explicitly in the editing step. Existing
579
+ `claude-*-fix*` and `claude-self-review` prompt filenames remain shared templates
580
+ for compatibility with custom prompt directories.
581
+
582
+ Gemini reviewers (including refactoring analysis) also use sandboxed `plan` mode,
583
+ never `yolo`. Overkill supplies the requested diff directly because plan mode may
584
+ disable shell tools; commit/WIP scope remains authoritative. The bundled Gemini
585
+ prompts include evidence-driven review guidance without invoking an installed
586
+ `/code-review` command, changing the target to `origin/HEAD`, or replacing the
587
+ JSON/P0-P3 contract. Refresh existing local prompt copies with `overkill init`
588
+ after inspecting any customizations. Permission failures are not code defects;
589
+ there is no automatic fallback to editing mode.
590
+
591
+ Plan mode is a CLI permission policy, not a guarantee against every possible
592
+ side effect (for example, Gemini permits its own plan-directory writes). See
593
+ [`docs/gemini-review-guidance.md`](docs/gemini-review-guidance.md) for provenance,
594
+ headless verification limits, and the reproducible prompt benchmark.
595
+
596
+ CLI options override rc settings. `--resume` restores saved role selections unless
597
+ explicitly overridden on the command line; an inherited self-review selection
598
+ continues to follow the fixer. `--no-self-review` still disables this stage.
599
+
600
+ Antigravity CLI is supported explicitly as `agy` for all three roles:
601
+
602
+ ```sh
603
+ overkill review-loop -n 3 --reviewer agy --fixer-backend codex
604
+ overkill refactor-suggest --scope module --fixer-backend agy
605
+ ```
606
+
607
+ Google announced the consumer transition from Gemini CLI on May 19, 2026, with
608
+ free/Pro/Ultra access ending June 18; enterprise and paid API-key access remain.
609
+ See the [official announcement](https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli/).
610
+ Existing `gemini` selections continue to invoke `gemini`; no automatic executable
611
+ or account switching occurs. Authenticate `agy` separately before use.
612
+
613
+ Antigravity uses `--mode plan` for review/opinion and `--mode accept-edits` for
614
+ fixes, with `--sandbox` in both. It does not bypass permissions: shell commands
615
+ may be denied in headless mode unless your Antigravity policy permits them.
616
+ Use an up-to-date CLI that applies `--mode` to headless runs. Antigravity shares
617
+ the existing `gemini-*` review prompts. Local Antigravity quota preflight data is
618
+ not available; runtime errors go through the retry/error handling path.
619
+ See [headless mode](https://antigravity.google/docs/cli/headless/) and
620
+ [execution modes](https://www.antigravity.google/docs/cli/modes/).
@@ -0,0 +1,59 @@
1
+ # Gemini Prompt Benchmark
2
+
3
+ Stdlib-only harness for issue #171. It creates tiny temporary Git repos, renders
4
+ Gemini review prompt variants, runs the Gemini CLI in bounded read-only plan mode,
5
+ and writes prompts, raw CLI output, snapshots, `results.json`, `report.json`, and
6
+ `report.md` to the selected output directory.
7
+
8
+ Variants:
9
+ - `baseline`: vendored pre-171 Gemini review prompt fixture.
10
+ - `review-only`: vendored prompt fixture with the review-only constraint.
11
+ - `adapted`: exact current production `prompts/active/gemini-review.prompt.md`.
12
+
13
+ Run all variants/cases:
14
+
15
+ ```sh
16
+ uv run python -m benchmarks.gemini_prompt_benchmark \
17
+ --output-dir /tmp/overkill-171-benchmark \
18
+ --workers 3 \
19
+ --timeout 240
20
+ ```
21
+
22
+ Run a smaller slice:
23
+
24
+ ```sh
25
+ uv run python -m benchmarks.gemini_prompt_benchmark \
26
+ --variants adapted \
27
+ --cases seeded-bug,wip-scope \
28
+ --output-dir /tmp/overkill-171-slice
29
+ ```
30
+
31
+ Notes:
32
+ - The harness sets `GEMINI_CLI_TRUST_WORKSPACE=true` only for the Gemini child process because its generated fixture repos are known-safe.
33
+ - Do not commit raw output directories; keep them under `/tmp` or another external archive path.
34
+ - The harness references captured diff evidence files for every variant so prompt comparisons do not depend on Gemini shell availability.
35
+
36
+ ## Fixture Provenance and Limits
37
+
38
+ `fixtures/gemini-review-review-only.prompt.md` is the Overkill Gemini template from commit
39
+ `4dc4b45083a022a2daaf72fe316d6c74e6c68bc0` (MIT); the baseline removes only its
40
+ `Review-only constraint` section. These are not copied Google extension assets.
41
+ The adapted variant is loaded directly from the working production template.
42
+
43
+ All variants share the same read-only command and captured diff file, so this measures
44
+ prompt differences, not historical write-enabled execution. Seeded regressions
45
+ have existing callers/tests. The non-default target includes an `origin/HEAD`
46
+ decoy; WIP changes are deliberately uncommitted. The sandbox case contains a
47
+ synthetic recorded PermissionError so the scenario is reproducible everywhere.
48
+
49
+ Precision/recall use location overlap plus defect terms, not a semantic judge;
50
+ scope accuracy checks allowed files, not every changed line. Scores on empty
51
+ clean reviews are vacuous. Small samples do not establish statistical superiority.
52
+ Cost is unknown (`null`), not free. Raw prompts and outputs are kept in the output
53
+ directory for manual audit. Global CLI session/cache writes are outside the
54
+ fixture snapshot; this measurement is not a security sandbox.
55
+
56
+ Live CLI runs require POSIX process groups (Linux, macOS, or WSL). Native Windows
57
+ is rejected before spawning: terminating only the wrapper cannot reliably bound
58
+ children holding output pipes. Unit-only fixture/scoring checks do not launch a
59
+ provider. The harness kills the entire POSIX process group on timeout.
@@ -0,0 +1 @@
1
+ """Benchmark harnesses for mr-overkill."""
@@ -0,0 +1,101 @@
1
+ You are a code reviewer analyzing a proposed change.
2
+ ${REVIEW_SCOPE_NOTE}
3
+ ## Context
4
+
5
+ - **Current branch**: ${CURRENT_BRANCH}
6
+ - **Target branch**: ${TARGET_BRANCH}
7
+ - **Review iteration**: ${ITERATION}
8
+
9
+ ${REVIEWER_CONTEXT}
10
+
11
+ ## Review-only constraint
12
+
13
+ This invocation is review-only. Do NOT modify, create, delete, or format files,
14
+ apply fixes, or run commands that change the working tree or Git history.
15
+ Report proposed changes only as findings in the required JSON output; a separate
16
+ fixer will apply them. Repository instructions about implementing fixes or
17
+ committing changes do not apply to this reviewer role. If a check fails because
18
+ of sandbox restrictions, report that limitation rather than changing the code.
19
+
20
+ ## Instructions
21
+
22
+ Start by running the following command to get the diff:
23
+
24
+ ```
25
+ git diff ${TARGET_BRANCH}...${CURRENT_BRANCH}
26
+ ```
27
+
28
+ Then **actively explore the codebase** to understand context before flagging issues:
29
+
30
+ - Read surrounding code when a change touches a function or module.
31
+ - Search for patterns, variables, or functions elsewhere before calling them dead code or flagging a naming issue.
32
+ - Find related files (e.g. tests, configs) that may clarify intent.
33
+
34
+ Review the diff according to the guidelines below.
35
+
36
+ ## Review Guidelines — HIGH SIGNAL ONLY
37
+
38
+ We only want findings where you are confident the issue is real. **If you are not certain an issue is real, do not flag it.** False positives erode trust and waste reviewer time.
39
+
40
+ 1. Only flag issues the original author would fix if they knew about them.
41
+ 2. The issue must be **introduced by this diff** — do not flag pre-existing problems.
42
+ 3. The issue must be discrete, actionable, and concretely provable.
43
+ 4. Do not flag trivial style issues unless they obscure meaning or violate documented standards.
44
+ 5. Do not speculate — you must identify the exact code location and explain why it is a problem.
45
+ 6. If this is iteration > 1, focus on whether issues from prior reviews have been properly fixed, and identify any new issues introduced by the fixes.
46
+ 7. **Only flag issues where your confidence is >= 0.85.** If you cannot reach that threshold after investigating, do not include the finding.
47
+
48
+ ### Do NOT flag (false positive filter)
49
+
50
+ - Pre-existing issues not introduced by this diff.
51
+ - Something that appears to be a bug but is actually correct when you read the surrounding code.
52
+ - Pedantic nitpicks that a senior engineer would not flag in a real review.
53
+ - Issues that a linter or formatter will catch — do not run the linter to verify.
54
+ - Potential issues that depend on specific inputs or state that are not demonstrated in the diff.
55
+ - General code quality concerns (e.g. lack of test coverage, general security hygiene) unless they are concretely exploitable.
56
+
57
+ ## Priority Levels
58
+
59
+ - **P0** — Drop everything. Blocking release, operations, or major usage. Universal issues not dependent on assumptions.
60
+ - **P1** — Urgent. Should be addressed in the next cycle.
61
+ - **P2** — Normal. To be fixed eventually.
62
+ - **P3** — Low. Nice to have.
63
+
64
+ ## Comment Guidelines
65
+
66
+ - One comment per distinct issue.
67
+ - Brief (at most 1 paragraph body).
68
+ - Clearly state the scenarios/inputs required for the bug to manifest.
69
+ - Matter-of-fact tone, no flattery.
70
+ - Code snippets max 3 lines, wrapped in markdown code tags.
71
+
72
+ ## Output Format
73
+
74
+ Output **only** valid JSON matching this schema exactly. Do NOT wrap in markdown fences or add any text outside the JSON. Begin your response with the `{` character — no prose, no commentary, no preamble.
75
+
76
+ {
77
+ "findings": [
78
+ {
79
+ "title": "<P-tag + imperative description, max 80 chars>",
80
+ "body": "<Markdown explaining why this is a problem; cite files/lines/functions>",
81
+ "confidence_score": <float 0.0-1.0>,
82
+ "priority": <int 0-3>,
83
+ "code_location": {
84
+ "file_path": "<repo-relative file path, e.g. src/main.ts>",
85
+ "line_range": {"start": <int>, "end": <int>}
86
+ }
87
+ }
88
+ ],
89
+ "overall_correctness": "patch is correct" | "patch is incorrect",
90
+ "overall_explanation": "<1-3 sentence justification>",
91
+ "overall_confidence_score": <float 0.0-1.0>
92
+ }
93
+
94
+ If there are no findings, return:
95
+
96
+ {
97
+ "findings": [],
98
+ "overall_correctness": "patch is correct",
99
+ "overall_explanation": "<brief justification>",
100
+ "overall_confidence_score": <float 0.0-1.0>
101
+ }