overkill 0.3.0__tar.gz → 0.4.1__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.
- {overkill-0.3.0 → overkill-0.4.1}/.github/workflows/publish.yml +2 -2
- {overkill-0.3.0 → overkill-0.4.1}/.github/workflows/test.yml +3 -3
- {overkill-0.3.0 → overkill-0.4.1}/AGENTS.md +1 -1
- {overkill-0.3.0 → overkill-0.4.1}/PKG-INFO +1 -6
- {overkill-0.3.0 → overkill-0.4.1}/README.md +0 -5
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-full.prompt.md +4 -4
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-layer.prompt.md +4 -4
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-micro.prompt.md +3 -3
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-module.prompt.md +3 -3
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/codex-refactor-full.prompt.md +4 -4
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/codex-refactor-layer.prompt.md +4 -4
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/codex-refactor-micro.prompt.md +3 -3
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/codex-refactor-module.prompt.md +3 -3
- overkill-0.4.1/prompts/active/gemini-refactor-full.prompt.md +115 -0
- overkill-0.4.1/prompts/active/gemini-refactor-layer.prompt.md +115 -0
- overkill-0.4.1/prompts/active/gemini-refactor-micro.prompt.md +116 -0
- overkill-0.4.1/prompts/active/gemini-refactor-module.prompt.md +114 -0
- overkill-0.4.1/prompts/active/gemini-review.prompt.md +90 -0
- {overkill-0.3.0 → overkill-0.4.1}/pyproject.toml +1 -1
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/agents.py +102 -0
- overkill-0.4.1/src/mr_overkill/budget/gemini.py +23 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/classify.py +1 -4
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/cli.py +8 -6
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/loop_engine.py +20 -12
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/models.py +3 -1
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/refactor_suggest.py +5 -6
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/retry.py +93 -4
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/review_loop.py +1 -5
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/self_review.py +0 -1
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_agents.py +107 -0
- overkill-0.4.1/tests/test_budget_gemini.py +20 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_cli.py +38 -1
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_init.py +1 -1
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_retry.py +57 -0
- overkill-0.3.0/bin/lib/check-claude-limit.sh +0 -256
- overkill-0.3.0/bin/lib/check-codex-limit.sh +0 -202
- overkill-0.3.0/bin/lib/common.sh +0 -511
- overkill-0.3.0/bin/lib/retry.sh +0 -306
- overkill-0.3.0/bin/lib/self-review.sh +0 -527
- overkill-0.3.0/bin/refactor-suggest.sh +0 -748
- overkill-0.3.0/bin/review-loop.sh +0 -593
- overkill-0.3.0/test/refactor-suggest.bats +0 -159
- overkill-0.3.0/test/test_helper.bash +0 -117
- {overkill-0.3.0 → overkill-0.4.1}/.gitignore +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/.overkillrc.example +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/.python-version +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/.refactorsuggestrc.example +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/CLAUDE.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/GEMINI.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/LICENSE +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/install.sh +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-fix-execute.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-fix.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-fix-execute.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-refactor-fix.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-review.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/claude-self-review.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/active/codex-review.prompt.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/reference/claude-code-review-plugin.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/reference/claude-security-review.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/prompts/reference/codex-review-original.md +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/__init__.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/__main__.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/budget/__init__.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/budget/claude.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/budget/codex.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/budget_report.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/data/__init__.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/git_ops.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/init.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/json_extract.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/reporting.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/resume.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/time_utils.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/src/mr_overkill/two_step_fix.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/__init__.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/conftest.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_budget_claude.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_budget_codex.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_budget_policy.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_budget_report.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_classify.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_git_ops.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_integration.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_json_extract.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_loop_engine.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_refactor_suggest.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_reporting.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_resume.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_review_loop.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_self_review.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_time_utils.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/tests/test_two_step_fix.py +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/uninstall.sh +0 -0
- {overkill-0.3.0 → overkill-0.4.1}/uv.lock +0 -0
|
@@ -14,9 +14,9 @@ jobs:
|
|
|
14
14
|
python-version: ["3.12", "3.13"]
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@v6
|
|
18
18
|
|
|
19
|
-
- uses: astral-sh/setup-uv@
|
|
19
|
+
- uses: astral-sh/setup-uv@v7
|
|
20
20
|
with:
|
|
21
21
|
python-version: ${{ matrix.python-version }}
|
|
22
22
|
|
|
@@ -30,4 +30,4 @@ jobs:
|
|
|
30
30
|
run: uv run mypy src
|
|
31
31
|
|
|
32
32
|
- name: Pytest
|
|
33
|
-
run: uv run pytest
|
|
33
|
+
run: uv run pytest --cov=mr_overkill --cov-report=term-missing --cov-fail-under=70
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
## Pull Request Rules
|
|
11
11
|
|
|
12
|
-
Every PR must pass the review loop (`review-loop
|
|
12
|
+
Every PR must pass the review loop (`overkill review-loop --dry-run`) before merging. No exceptions. We eat our own dog food — if Mr. Overkill can't approve it, neither can you.
|
|
13
13
|
|
|
14
14
|
## Branch Rules
|
|
15
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: overkill
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: AI-powered code review loop — automates Codex 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
|
|
@@ -392,12 +392,7 @@ uv run mypy src/
|
|
|
392
392
|
## Testing
|
|
393
393
|
|
|
394
394
|
```bash
|
|
395
|
-
# Python tests
|
|
396
395
|
uv run pytest --tb=short
|
|
397
|
-
|
|
398
|
-
# Bash integration tests (requires bats-core)
|
|
399
|
-
brew install bats-core # one-time setup
|
|
400
|
-
bats test/ # run all tests
|
|
401
396
|
```
|
|
402
397
|
|
|
403
398
|
## License
|
|
@@ -370,12 +370,7 @@ uv run mypy src/
|
|
|
370
370
|
## Testing
|
|
371
371
|
|
|
372
372
|
```bash
|
|
373
|
-
# Python tests
|
|
374
373
|
uv run pytest --tb=short
|
|
375
|
-
|
|
376
|
-
# Bash integration tests (requires bats-core)
|
|
377
|
-
brew install bats-core # one-time setup
|
|
378
|
-
bats test/ # run all tests
|
|
379
374
|
```
|
|
380
375
|
|
|
381
376
|
## License
|
|
@@ -35,11 +35,11 @@ You are a refactoring advisor analyzing an entire codebase for **architecture-le
|
|
|
35
35
|
|
|
36
36
|
```json
|
|
37
37
|
{
|
|
38
|
-
"title": "[P1] Invert dependency:
|
|
39
|
-
"body": "Currently `
|
|
38
|
+
"title": "[P1] Invert dependency: loop_engine hardcodes AI provider details",
|
|
39
|
+
"body": "Currently `src/mr_overkill/loop_engine.py` directly calls AI CLI tools with provider-specific logic scattered across lines 150-220, 340-380, and 450-490. This means:\n- Adding a new AI provider requires modifying 3 sections of a 700-line file\n- Testing with a mock provider is impossible without editing production code\n- Provider-specific retry/error logic is interleaved with review orchestration\n\n**Suggested structure**: Extract a Protocol-based `AIProvider` interface with `call()` that encapsulates provider selection, API calls, and retries. `loop_engine.py` calls only the Protocol and doesn't know which provider is behind it.\n\n**Rollback**: If the Protocol abstraction causes issues, revert the single file and restore inline calls — the orchestration logic in loop_engine.py doesn't change.",
|
|
40
40
|
"confidence_score": 0.8,
|
|
41
41
|
"priority": 1,
|
|
42
|
-
"code_location": { "file_path": "
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 150, "end": 220} }
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -51,7 +51,7 @@ You are a refactoring advisor analyzing an entire codebase for **architecture-le
|
|
|
51
51
|
"body": "The codebase would benefit from separating concerns into Model-View-Controller layers for better organization.",
|
|
52
52
|
"confidence_score": 0.5,
|
|
53
53
|
"priority": 2,
|
|
54
|
-
"code_location": { "file_path": "
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
Why this is bad: no concrete impact statement, no evidence of current pain, suggests a pattern without demonstrating need, no phased migration.
|
|
@@ -35,11 +35,11 @@ You are a refactoring advisor analyzing an entire codebase for **layer-level** (
|
|
|
35
35
|
|
|
36
36
|
```json
|
|
37
37
|
{
|
|
38
|
-
"title": "[P1] Unify error
|
|
39
|
-
"body": "Error
|
|
38
|
+
"title": "[P1] Unify error handling pattern across orchestration modules",
|
|
39
|
+
"body": "Error handling is done 3 different ways:\n1. `src/mr_overkill/review_loop.py` raises `SystemExit` (lines 30-35) with stderr logging\n2. `src/mr_overkill/refactor_suggest.py` uses `logger.error` + bare `sys.exit(1)` (lines 88, 142, 201)\n3. `src/mr_overkill/retry.py` raises `RuntimeError` directly (lines 45, 78)\n\nThis makes it easy to miss cleanup (temp file removal) on error paths. A coordinated change to use a shared exception hierarchy with cleanup hooks would prevent resource leaks across all modules.",
|
|
40
40
|
"confidence_score": 0.85,
|
|
41
41
|
"priority": 1,
|
|
42
|
-
"code_location": { "file_path": "
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/review_loop.py", "line_range": {"start": 30, "end": 35} }
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -51,7 +51,7 @@ You are a refactoring advisor analyzing an entire codebase for **layer-level** (
|
|
|
51
51
|
"body": "The codebase could benefit from more consistent error handling patterns.",
|
|
52
52
|
"confidence_score": 0.5,
|
|
53
53
|
"priority": 2,
|
|
54
|
-
"code_location": { "file_path": "
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
Why this is bad: no specific examples of inconsistency, no file/line citations, doesn't explain why a coordinated change is needed.
|
|
@@ -37,10 +37,10 @@ You are a refactoring advisor analyzing an entire codebase for **micro-level** i
|
|
|
37
37
|
```json
|
|
38
38
|
{
|
|
39
39
|
"title": "[P1] Extract duplicated validation into shared helper in process_input()",
|
|
40
|
-
"body": "Lines
|
|
40
|
+
"body": "Lines 55-70 and 130-145 of `src/mr_overkill/loop_engine.py` contain identical iteration-result validation logic (same 3 conditions, same error messages). Extracting into a `_validate_iteration()` helper eliminates the duplication and ensures future validation changes are applied consistently.",
|
|
41
41
|
"confidence_score": 0.9,
|
|
42
42
|
"priority": 1,
|
|
43
|
-
"code_location": { "file_path": "
|
|
43
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 55, "end": 70} }
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -52,7 +52,7 @@ You are a refactoring advisor analyzing an entire codebase for **micro-level** i
|
|
|
52
52
|
"body": "This code could benefit from the Strategy pattern for better flexibility.",
|
|
53
53
|
"confidence_score": 0.5,
|
|
54
54
|
"priority": 3,
|
|
55
|
-
"code_location": { "file_path": "
|
|
55
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 200} }
|
|
56
56
|
}
|
|
57
57
|
```
|
|
58
58
|
Why this is bad: vague, no specific code reference, no measurable benefit, suggests an architecture-level change.
|
|
@@ -35,10 +35,10 @@ You are a refactoring advisor analyzing an entire codebase for **module-level**
|
|
|
35
35
|
```json
|
|
36
36
|
{
|
|
37
37
|
"title": "[P1] Extract repeated JSON validation into shared validate_json()",
|
|
38
|
-
"body": "The same
|
|
38
|
+
"body": "The same JSON validation logic appears in `src/example/ingest.py` (lines 12-27), `src/example/export.py` (lines 50-65), and `src/example/validate.py` (lines 8-20). All three copies parse review JSON, extract `findings`, and handle parse errors — but the error messages have already diverged. Extracting to `src/example/json_utils.py:parse_review_json()` eliminates the duplication and unifies error handling.",
|
|
39
39
|
"confidence_score": 0.85,
|
|
40
40
|
"priority": 1,
|
|
41
|
-
"code_location": { "file_path": "
|
|
41
|
+
"code_location": { "file_path": "src/example/ingest.py", "line_range": {"start": 12, "end": 27} }
|
|
42
42
|
}
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -50,7 +50,7 @@ You are a refactoring advisor analyzing an entire codebase for **module-level**
|
|
|
50
50
|
"body": "Several files handle errors similarly. Consider creating a shared error handler.",
|
|
51
51
|
"confidence_score": 0.6,
|
|
52
52
|
"priority": 2,
|
|
53
|
-
"code_location": { "file_path": "
|
|
53
|
+
"code_location": { "file_path": "src/mr_overkill/review_loop.py", "line_range": {"start": 1, "end": 500} }
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
Why this is bad: doesn't specify which files, doesn't cite line numbers, doesn't explain what's duplicated or how copies have diverged.
|
|
@@ -35,11 +35,11 @@ You are a refactoring advisor analyzing an entire codebase for **architecture-le
|
|
|
35
35
|
|
|
36
36
|
```json
|
|
37
37
|
{
|
|
38
|
-
"title": "[P1] Invert dependency:
|
|
39
|
-
"body": "Currently `
|
|
38
|
+
"title": "[P1] Invert dependency: loop_engine hardcodes AI provider details",
|
|
39
|
+
"body": "Currently `src/mr_overkill/loop_engine.py` directly calls AI CLI tools with provider-specific logic scattered across lines 150-220, 340-380, and 450-490. This means:\n- Adding a new AI provider requires modifying 3 sections of a 700-line file\n- Testing with a mock provider is impossible without editing production code\n- Provider-specific retry/error logic is interleaved with review orchestration\n\n**Suggested structure**: Extract a Protocol-based `AIProvider` interface with `call()` that encapsulates provider selection, API calls, and retries. `loop_engine.py` calls only the Protocol and doesn't know which provider is behind it.\n\n**Rollback**: If the Protocol abstraction causes issues, revert the single file and restore inline calls — the orchestration logic in loop_engine.py doesn't change.",
|
|
40
40
|
"confidence_score": 0.8,
|
|
41
41
|
"priority": 1,
|
|
42
|
-
"code_location": { "file_path": "
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 150, "end": 220} }
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -51,7 +51,7 @@ You are a refactoring advisor analyzing an entire codebase for **architecture-le
|
|
|
51
51
|
"body": "The codebase would benefit from separating concerns into Model-View-Controller layers for better organization.",
|
|
52
52
|
"confidence_score": 0.5,
|
|
53
53
|
"priority": 2,
|
|
54
|
-
"code_location": { "file_path": "
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
Why this is bad: no concrete impact statement, no evidence of current pain, suggests a pattern without demonstrating need, no phased migration.
|
|
@@ -35,11 +35,11 @@ You are a refactoring advisor analyzing an entire codebase for **layer-level** (
|
|
|
35
35
|
|
|
36
36
|
```json
|
|
37
37
|
{
|
|
38
|
-
"title": "[P1] Unify error
|
|
39
|
-
"body": "Error
|
|
38
|
+
"title": "[P1] Unify error handling pattern across orchestration modules",
|
|
39
|
+
"body": "Error handling is done 3 different ways:\n1. `src/mr_overkill/review_loop.py` raises `SystemExit` (lines 30-35) with stderr logging\n2. `src/mr_overkill/refactor_suggest.py` uses `logger.error` + bare `sys.exit(1)` (lines 88, 142, 201)\n3. `src/mr_overkill/retry.py` raises `RuntimeError` directly (lines 45, 78)\n\nThis makes it easy to miss cleanup (temp file removal) on error paths. A coordinated change to use a shared exception hierarchy with cleanup hooks would prevent resource leaks across all modules.",
|
|
40
40
|
"confidence_score": 0.85,
|
|
41
41
|
"priority": 1,
|
|
42
|
-
"code_location": { "file_path": "
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/review_loop.py", "line_range": {"start": 30, "end": 35} }
|
|
43
43
|
}
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -51,7 +51,7 @@ You are a refactoring advisor analyzing an entire codebase for **layer-level** (
|
|
|
51
51
|
"body": "The codebase could benefit from more consistent error handling patterns.",
|
|
52
52
|
"confidence_score": 0.5,
|
|
53
53
|
"priority": 2,
|
|
54
|
-
"code_location": { "file_path": "
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
55
|
}
|
|
56
56
|
```
|
|
57
57
|
Why this is bad: no specific examples of inconsistency, no file/line citations, doesn't explain why a coordinated change is needed.
|
|
@@ -37,10 +37,10 @@ You are a refactoring advisor analyzing an entire codebase for **micro-level** i
|
|
|
37
37
|
```json
|
|
38
38
|
{
|
|
39
39
|
"title": "[P1] Extract duplicated validation into shared helper in process_input()",
|
|
40
|
-
"body": "Lines
|
|
40
|
+
"body": "Lines 55-70 and 130-145 of `src/mr_overkill/loop_engine.py` contain identical iteration-result validation logic (same 3 conditions, same error messages). Extracting into a `_validate_iteration()` helper eliminates the duplication and ensures future validation changes are applied consistently.",
|
|
41
41
|
"confidence_score": 0.9,
|
|
42
42
|
"priority": 1,
|
|
43
|
-
"code_location": { "file_path": "
|
|
43
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 55, "end": 70} }
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -52,7 +52,7 @@ You are a refactoring advisor analyzing an entire codebase for **micro-level** i
|
|
|
52
52
|
"body": "This code could benefit from the Strategy pattern for better flexibility.",
|
|
53
53
|
"confidence_score": 0.5,
|
|
54
54
|
"priority": 3,
|
|
55
|
-
"code_location": { "file_path": "
|
|
55
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 200} }
|
|
56
56
|
}
|
|
57
57
|
```
|
|
58
58
|
Why this is bad: vague, no specific code reference, no measurable benefit, suggests an architecture-level change.
|
|
@@ -35,10 +35,10 @@ You are a refactoring advisor analyzing an entire codebase for **module-level**
|
|
|
35
35
|
```json
|
|
36
36
|
{
|
|
37
37
|
"title": "[P1] Extract repeated JSON validation into shared validate_json()",
|
|
38
|
-
"body": "The same
|
|
38
|
+
"body": "The same JSON validation logic appears in `src/example/ingest.py` (lines 12-27), `src/example/export.py` (lines 50-65), and `src/example/validate.py` (lines 8-20). All three copies parse review JSON, extract `findings`, and handle parse errors — but the error messages have already diverged. Extracting to `src/example/json_utils.py:parse_review_json()` eliminates the duplication and unifies error handling.",
|
|
39
39
|
"confidence_score": 0.85,
|
|
40
40
|
"priority": 1,
|
|
41
|
-
"code_location": { "file_path": "
|
|
41
|
+
"code_location": { "file_path": "src/example/ingest.py", "line_range": {"start": 12, "end": 27} }
|
|
42
42
|
}
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -50,7 +50,7 @@ You are a refactoring advisor analyzing an entire codebase for **module-level**
|
|
|
50
50
|
"body": "Several files handle errors similarly. Consider creating a shared error handler.",
|
|
51
51
|
"confidence_score": 0.6,
|
|
52
52
|
"priority": 2,
|
|
53
|
-
"code_location": { "file_path": "
|
|
53
|
+
"code_location": { "file_path": "src/mr_overkill/review_loop.py", "line_range": {"start": 1, "end": 500} }
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
Why this is bad: doesn't specify which files, doesn't cite line numbers, doesn't explain what's duplicated or how copies have diverged.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
You are a refactoring advisor analyzing an entire codebase for **architecture-level** redesign opportunities.
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
- **Target branch**: ${TARGET_BRANCH}
|
|
6
|
+
- **Scope**: full (architecture redesign)
|
|
7
|
+
- **Blast radius**: high-critical — changes may restructure the entire project
|
|
8
|
+
- **Iteration**: ${ITERATION}
|
|
9
|
+
- **Source files list**: ${SOURCE_FILES_PATH}
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
1. Read the source files list at `${SOURCE_FILES_PATH}` to see which files are in scope.
|
|
14
|
+
2. Read the files and identify architecture-level refactoring opportunities — **structural problems only**:
|
|
15
|
+
- Wrong abstractions: code is organized around the wrong concepts, forcing workarounds
|
|
16
|
+
- Inverted dependencies: high-level modules depend on low-level implementation details
|
|
17
|
+
- Layer violations: business logic in presentation layer, I/O in pure-logic modules, etc.
|
|
18
|
+
- Missing architectural boundaries the codebase has outgrown not having
|
|
19
|
+
- Scalability bottlenecks baked into the current structure
|
|
20
|
+
3. Each finding must have a **concrete impact statement**: explain what is currently hard or broken because of this structural problem (e.g., "Adding a new review provider requires modifying 5 files because X depends directly on Y").
|
|
21
|
+
4. **Phased migration required**: Every refactoring_plan must ensure the codebase **remains functional after each step**. No "big bang" rewrites.
|
|
22
|
+
5. **Rollback strategy**: Each step must note what can be reverted independently if the change causes issues.
|
|
23
|
+
6. **Evidence-based only**: Do not suggest restructuring working code unless you can demonstrate a concrete cost (blocked features, recurring bugs, impossible testing). "This would be cleaner" is not sufficient justification.
|
|
24
|
+
7. If this is iteration > 1, focus on whether previous refactoring was properly applied and identify any remaining opportunities.
|
|
25
|
+
|
|
26
|
+
## Anti-patterns (DO NOT flag these)
|
|
27
|
+
|
|
28
|
+
- Micro-optimizations (rename variable, split function) — this is micro scope
|
|
29
|
+
- "Trendy" pattern adoption (rewrite in a new framework, adopt microservices) without demonstrated need
|
|
30
|
+
- Suggesting patterns because they exist in other projects, not because this codebase needs them
|
|
31
|
+
- Proposing changes with high blast radius but only cosmetic benefit
|
|
32
|
+
- Restructuring that would break the project's existing CI/CD or deployment model without justification
|
|
33
|
+
|
|
34
|
+
## Example: Good Finding
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"title": "[P1] Invert dependency: loop_engine hardcodes AI provider details",
|
|
39
|
+
"body": "Currently `src/mr_overkill/loop_engine.py` directly calls AI CLI tools with provider-specific logic scattered across lines 150-220, 340-380, and 450-490. This means:\n- Adding a new AI provider requires modifying 3 sections of a 700-line file\n- Testing with a mock provider is impossible without editing production code\n- Provider-specific retry/error logic is interleaved with review orchestration\n\n**Suggested structure**: Extract a Protocol-based `AIProvider` interface with `call()` that encapsulates provider selection, API calls, and retries. `loop_engine.py` calls only the Protocol and doesn't know which provider is behind it.\n\n**Rollback**: If the Protocol abstraction causes issues, revert the single file and restore inline calls — the orchestration logic in loop_engine.py doesn't change.",
|
|
40
|
+
"confidence_score": 0.8,
|
|
41
|
+
"priority": 1,
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 150, "end": 220} }
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Example: Bad Finding (DO NOT produce)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"title": "[P2] Consider adopting MVC pattern",
|
|
51
|
+
"body": "The codebase would benefit from separating concerns into Model-View-Controller layers for better organization.",
|
|
52
|
+
"confidence_score": 0.5,
|
|
53
|
+
"priority": 2,
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
Why this is bad: no concrete impact statement, no evidence of current pain, suggests a pattern without demonstrating need, no phased migration.
|
|
58
|
+
|
|
59
|
+
## Priority Levels
|
|
60
|
+
|
|
61
|
+
- **P0** — The architecture actively prevents correctness or causes data loss.
|
|
62
|
+
- **P1** — The architecture blocks important feature work or causes systematic bugs.
|
|
63
|
+
- **P2** — Normal improvement: restructuring significantly improves maintainability.
|
|
64
|
+
- **P3** — Strategic: long-term structural improvement.
|
|
65
|
+
|
|
66
|
+
## Output Format
|
|
67
|
+
|
|
68
|
+
Output **only** valid JSON matching this schema exactly. Do NOT wrap in markdown fences or add any text outside the JSON.
|
|
69
|
+
|
|
70
|
+
{
|
|
71
|
+
"findings": [
|
|
72
|
+
{
|
|
73
|
+
"title": "<P-tag + imperative description, max 80 chars>",
|
|
74
|
+
"body": "<Markdown explaining the structural problem, concrete impact, and migration strategy; cite files/modules>",
|
|
75
|
+
"confidence_score": <float 0.0-1.0>,
|
|
76
|
+
"priority": <int 0-3>,
|
|
77
|
+
"code_location": {
|
|
78
|
+
"file_path": "<repo-relative file path>",
|
|
79
|
+
"line_range": {"start": <int>, "end": <int>}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"refactoring_plan": {
|
|
84
|
+
"scope": "full",
|
|
85
|
+
"summary": "<1-3 sentence overview of the architectural change>",
|
|
86
|
+
"estimated_files_affected": <int>,
|
|
87
|
+
"steps": [
|
|
88
|
+
{
|
|
89
|
+
"order": <int>,
|
|
90
|
+
"description": "<what to do in this phase; must leave codebase functional; include rollback note>",
|
|
91
|
+
"files": ["<file1>", "<file2>"]
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"estimated_blast_radius": "high-critical"
|
|
95
|
+
},
|
|
96
|
+
"overall_correctness": "needs refactoring" | "code is clean",
|
|
97
|
+
"overall_explanation": "<1-3 sentence justification>",
|
|
98
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
If there are no findings, return:
|
|
102
|
+
|
|
103
|
+
{
|
|
104
|
+
"findings": [],
|
|
105
|
+
"refactoring_plan": {
|
|
106
|
+
"scope": "full",
|
|
107
|
+
"summary": "No refactoring needed.",
|
|
108
|
+
"estimated_files_affected": 0,
|
|
109
|
+
"steps": [],
|
|
110
|
+
"estimated_blast_radius": "none"
|
|
111
|
+
},
|
|
112
|
+
"overall_correctness": "code is clean",
|
|
113
|
+
"overall_explanation": "<brief justification>",
|
|
114
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
115
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
You are a refactoring advisor analyzing an entire codebase for **layer-level** (cross-cutting) improvements.
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
- **Target branch**: ${TARGET_BRANCH}
|
|
6
|
+
- **Scope**: layer (cross-cutting concerns across modules)
|
|
7
|
+
- **Blast radius**: medium-high — changes span multiple modules or layers
|
|
8
|
+
- **Iteration**: ${ITERATION}
|
|
9
|
+
- **Source files list**: ${SOURCE_FILES_PATH}
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
1. Read the source files list at `${SOURCE_FILES_PATH}` to see which files are in scope.
|
|
14
|
+
2. Read the files and identify cross-cutting refactoring opportunities:
|
|
15
|
+
- Inconsistent error handling patterns across the codebase
|
|
16
|
+
- Logging/observability concerns scattered without a clear strategy
|
|
17
|
+
- Configuration management that should be centralized
|
|
18
|
+
- Security patterns applied inconsistently (input validation, auth checks)
|
|
19
|
+
- Cross-cutting concerns (retry logic, caching, rate limiting) duplicated across layers
|
|
20
|
+
3. **Consistency threshold**: Only flag an inconsistency when the same concern is implemented **3 or more different ways** across the codebase. Two slightly different approaches may be intentional.
|
|
21
|
+
4. **Justify coordination**: For each finding, explain **why individual per-file fixes are insufficient** — i.e., why a coordinated cross-cutting change is needed.
|
|
22
|
+
5. **Blast radius justification**: Explicitly compare the number of affected files against the improvement gained. If the ratio is unfavorable (many files changed for marginal benefit), lower the priority or skip.
|
|
23
|
+
6. Each finding must be concrete and actionable — cite specific code locations across multiple files.
|
|
24
|
+
7. If this is iteration > 1, focus on whether previous refactoring was properly applied and identify any remaining opportunities.
|
|
25
|
+
|
|
26
|
+
## Anti-patterns (DO NOT flag these)
|
|
27
|
+
|
|
28
|
+
- Architecture redesign (moving modules, changing project structure) — this is full scope
|
|
29
|
+
- Single-file local improvements (renaming, splitting functions) — this is micro scope
|
|
30
|
+
- Suggesting a logging framework when simple stderr output is sufficient for the project's scale
|
|
31
|
+
- Proposing middleware/interceptor patterns when the codebase has < 5 files
|
|
32
|
+
- Flagging minor formatting inconsistencies as cross-cutting concerns
|
|
33
|
+
|
|
34
|
+
## Example: Good Finding
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"title": "[P1] Unify error handling pattern across orchestration modules",
|
|
39
|
+
"body": "Error handling is done 3 different ways:\n1. `src/mr_overkill/review_loop.py` raises `SystemExit` (lines 30-35) with stderr logging\n2. `src/mr_overkill/refactor_suggest.py` uses `logger.error` + bare `sys.exit(1)` (lines 88, 142, 201)\n3. `src/mr_overkill/retry.py` raises `RuntimeError` directly (lines 45, 78)\n\nThis makes it easy to miss cleanup (temp file removal) on error paths. A coordinated change to use a shared exception hierarchy with cleanup hooks would prevent resource leaks across all modules.",
|
|
40
|
+
"confidence_score": 0.85,
|
|
41
|
+
"priority": 1,
|
|
42
|
+
"code_location": { "file_path": "src/mr_overkill/review_loop.py", "line_range": {"start": 30, "end": 35} }
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Example: Bad Finding (DO NOT produce)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"title": "[P2] Improve error handling",
|
|
51
|
+
"body": "The codebase could benefit from more consistent error handling patterns.",
|
|
52
|
+
"confidence_score": 0.5,
|
|
53
|
+
"priority": 2,
|
|
54
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 700} }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
Why this is bad: no specific examples of inconsistency, no file/line citations, doesn't explain why a coordinated change is needed.
|
|
58
|
+
|
|
59
|
+
## Priority Levels
|
|
60
|
+
|
|
61
|
+
- **P0** — Security or reliability gap: inconsistent application of a critical concern.
|
|
62
|
+
- **P1** — Systematic debt: the inconsistency actively causes bugs or makes them likely.
|
|
63
|
+
- **P2** — Normal improvement: unifying a pattern improves maintainability.
|
|
64
|
+
- **P3** — Nice-to-have: consistency improvement with low immediate impact.
|
|
65
|
+
|
|
66
|
+
## Output Format
|
|
67
|
+
|
|
68
|
+
Output **only** valid JSON matching this schema exactly. Do NOT wrap in markdown fences or add any text outside the JSON.
|
|
69
|
+
|
|
70
|
+
{
|
|
71
|
+
"findings": [
|
|
72
|
+
{
|
|
73
|
+
"title": "<P-tag + imperative description, max 80 chars>",
|
|
74
|
+
"body": "<Markdown explaining the problem and suggested change; cite files/lines/functions>",
|
|
75
|
+
"confidence_score": <float 0.0-1.0>,
|
|
76
|
+
"priority": <int 0-3>,
|
|
77
|
+
"code_location": {
|
|
78
|
+
"file_path": "<repo-relative file path>",
|
|
79
|
+
"line_range": {"start": <int>, "end": <int>}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"refactoring_plan": {
|
|
84
|
+
"scope": "layer",
|
|
85
|
+
"summary": "<1-3 sentence overview of all proposed changes>",
|
|
86
|
+
"estimated_files_affected": <int>,
|
|
87
|
+
"steps": [
|
|
88
|
+
{
|
|
89
|
+
"order": <int>,
|
|
90
|
+
"description": "<what to do>",
|
|
91
|
+
"files": ["<file1>", "<file2>"]
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"estimated_blast_radius": "medium-high"
|
|
95
|
+
},
|
|
96
|
+
"overall_correctness": "needs refactoring" | "code is clean",
|
|
97
|
+
"overall_explanation": "<1-3 sentence justification>",
|
|
98
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
If there are no findings, return:
|
|
102
|
+
|
|
103
|
+
{
|
|
104
|
+
"findings": [],
|
|
105
|
+
"refactoring_plan": {
|
|
106
|
+
"scope": "layer",
|
|
107
|
+
"summary": "No refactoring needed.",
|
|
108
|
+
"estimated_files_affected": 0,
|
|
109
|
+
"steps": [],
|
|
110
|
+
"estimated_blast_radius": "none"
|
|
111
|
+
},
|
|
112
|
+
"overall_correctness": "code is clean",
|
|
113
|
+
"overall_explanation": "<brief justification>",
|
|
114
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
115
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
You are a refactoring advisor analyzing an entire codebase for **micro-level** improvements.
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
- **Target branch**: ${TARGET_BRANCH}
|
|
6
|
+
- **Scope**: micro (function/file-level improvements)
|
|
7
|
+
- **Blast radius**: low — changes are confined to individual functions or files
|
|
8
|
+
- **Iteration**: ${ITERATION}
|
|
9
|
+
- **Source files list**: ${SOURCE_FILES_PATH}
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
1. Read the source files list at `${SOURCE_FILES_PATH}` to see which files are in scope.
|
|
14
|
+
2. Read the files and identify micro-level refactoring opportunities:
|
|
15
|
+
- Overly complex functions (cyclomatic complexity > 10)
|
|
16
|
+
- Functions exceeding ~50 lines that could be split into focused helpers
|
|
17
|
+
- Deeply nested logic (3+ levels of nesting)
|
|
18
|
+
- Dead code — but **only** for file-private (non-exported) symbols, and only after confirming no callers exist within the file
|
|
19
|
+
- Misleading names or unclear parameter contracts for **internal** symbols only
|
|
20
|
+
- Copy-paste duplication within a single file
|
|
21
|
+
3. Each finding must be concrete and actionable — cite specific lines and explain the measurable benefit.
|
|
22
|
+
4. **Scope boundary**: Do NOT suggest changes that require modifying other files. If a rename would break callers in other files, it is out of scope.
|
|
23
|
+
5. Name changes apply only to file-internal (non-exported, non-public-API) symbols.
|
|
24
|
+
6. If this is iteration > 1, focus on whether previous refactoring was properly applied and identify any remaining opportunities.
|
|
25
|
+
|
|
26
|
+
## Anti-patterns (DO NOT flag these)
|
|
27
|
+
|
|
28
|
+
- "Convert this function to a class" — this is an architecture-level change
|
|
29
|
+
- Adding type annotations, docstrings, or JSDoc — this is a style preference
|
|
30
|
+
- Renaming exported/public-API symbols that would require changes in other files
|
|
31
|
+
- Suggesting a different framework, library, or language idiom with no measurable benefit
|
|
32
|
+
- Flagging functions under 30 lines as "too long"
|
|
33
|
+
- Suggesting extraction when the resulting helper would only be called once
|
|
34
|
+
|
|
35
|
+
## Example: Good Finding
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"title": "[P1] Extract duplicated validation into shared helper in process_input()",
|
|
40
|
+
"body": "Lines 55-70 and 130-145 of `src/mr_overkill/loop_engine.py` contain identical iteration-result validation logic (same 3 conditions, same error messages). Extracting into a `_validate_iteration()` helper eliminates the duplication and ensures future validation changes are applied consistently.",
|
|
41
|
+
"confidence_score": 0.9,
|
|
42
|
+
"priority": 1,
|
|
43
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 55, "end": 70} }
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Example: Bad Finding (DO NOT produce)
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"title": "[P3] Consider using a design pattern",
|
|
52
|
+
"body": "This code could benefit from the Strategy pattern for better flexibility.",
|
|
53
|
+
"confidence_score": 0.5,
|
|
54
|
+
"priority": 3,
|
|
55
|
+
"code_location": { "file_path": "src/mr_overkill/loop_engine.py", "line_range": {"start": 1, "end": 200} }
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
Why this is bad: vague, no specific code reference, no measurable benefit, suggests an architecture-level change.
|
|
59
|
+
|
|
60
|
+
## Priority Levels
|
|
61
|
+
|
|
62
|
+
- **P0** — Correctness risk: the current code has a latent bug or data-loss path.
|
|
63
|
+
- **P1** — Readability blocker: the function is effectively unreviewable.
|
|
64
|
+
- **P2** — Normal improvement: measurably simplifies the code.
|
|
65
|
+
- **P3** — Nice-to-have: minor naming or style improvement.
|
|
66
|
+
|
|
67
|
+
## Output Format
|
|
68
|
+
|
|
69
|
+
Output **only** valid JSON matching this schema exactly. Do NOT wrap in markdown fences or add any text outside the JSON.
|
|
70
|
+
|
|
71
|
+
{
|
|
72
|
+
"findings": [
|
|
73
|
+
{
|
|
74
|
+
"title": "<P-tag + imperative description, max 80 chars>",
|
|
75
|
+
"body": "<Markdown explaining the problem and suggested change; cite files/lines/functions>",
|
|
76
|
+
"confidence_score": <float 0.0-1.0>,
|
|
77
|
+
"priority": <int 0-3>,
|
|
78
|
+
"code_location": {
|
|
79
|
+
"file_path": "<repo-relative file path>",
|
|
80
|
+
"line_range": {"start": <int>, "end": <int>}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"refactoring_plan": {
|
|
85
|
+
"scope": "micro",
|
|
86
|
+
"summary": "<1-3 sentence overview of all proposed changes>",
|
|
87
|
+
"estimated_files_affected": <int>,
|
|
88
|
+
"steps": [
|
|
89
|
+
{
|
|
90
|
+
"order": <int>,
|
|
91
|
+
"description": "<what to do>",
|
|
92
|
+
"files": ["<file1>", "<file2>"]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"estimated_blast_radius": "low"
|
|
96
|
+
},
|
|
97
|
+
"overall_correctness": "needs refactoring" | "code is clean",
|
|
98
|
+
"overall_explanation": "<1-3 sentence justification>",
|
|
99
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
If there are no findings, return:
|
|
103
|
+
|
|
104
|
+
{
|
|
105
|
+
"findings": [],
|
|
106
|
+
"refactoring_plan": {
|
|
107
|
+
"scope": "micro",
|
|
108
|
+
"summary": "No refactoring needed.",
|
|
109
|
+
"estimated_files_affected": 0,
|
|
110
|
+
"steps": [],
|
|
111
|
+
"estimated_blast_radius": "none"
|
|
112
|
+
},
|
|
113
|
+
"overall_correctness": "code is clean",
|
|
114
|
+
"overall_explanation": "<brief justification>",
|
|
115
|
+
"overall_confidence_score": <float 0.0-1.0>
|
|
116
|
+
}
|