opencode-review-helper 0.2.0 → 0.3.1
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.
- package/README.md +85 -32
- package/dist/agents/impact-explorer.d.ts +13 -0
- package/dist/agents/impact-explorer.d.ts.map +1 -0
- package/dist/agents/impact-explorer.js +36 -0
- package/dist/agents/impact-explorer.js.map +1 -0
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/review-helper.d.ts +12 -0
- package/dist/agents/review-helper.d.ts.map +1 -0
- package/dist/agents/review-helper.js +71 -0
- package/dist/agents/review-helper.js.map +1 -0
- package/dist/agents/review-order.d.ts +13 -0
- package/dist/agents/review-order.d.ts.map +1 -0
- package/dist/agents/review-order.js +31 -0
- package/dist/agents/review-order.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -116
- package/dist/index.js.map +1 -1
- package/dist/tools/review-order.d.ts.map +1 -1
- package/dist/tools/review-order.js +97 -4
- package/dist/tools/review-order.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,13 +21,88 @@ Restart opencode after setup to load the plugin. The plugin uses `@latest` so it
|
|
|
21
21
|
|
|
22
22
|
## Usage
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
**Direct Slash Command Use**
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
Run the slash command:
|
|
27
|
+
```
|
|
28
|
+
/review-order
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This runs the full workflow:
|
|
32
|
+
1. Analyzes changed files and determines initial review order
|
|
33
|
+
2. Finds external files impacted by the changes
|
|
34
|
+
3. Merges everything into a single prioritized list
|
|
35
|
+
|
|
36
|
+
Output is a unified table showing all files to review, with changed files first (prioritized by dependencies and impact) followed by external files that may need attention.
|
|
37
|
+
|
|
38
|
+
**Agent Use**
|
|
39
|
+
|
|
40
|
+
Tab twice to go to Review-Helper mode:
|
|
41
|
+
<img width="1968" height="188" alt="image" src="https://github.com/user-attachments/assets/1a548c1a-b81d-4982-a2db-c2a1525a6d7a" />
|
|
42
|
+
|
|
43
|
+
Enter your prompt:
|
|
44
|
+
```
|
|
45
|
+
Take a look at everything since the 0.2.0 release as if it were a single PR. Guide me through how to review it.
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Output:
|
|
49
|
+
```
|
|
50
|
+
Review Order for v0.2.0 → HEAD
|
|
51
|
+
| # | File | Reason | Score |
|
|
52
|
+
|---|------|--------|-------|
|
|
53
|
+
| 1 | src/tools/review-order.ts | Core scoring/sorting logic; foundation for all agents | 80 |
|
|
54
|
+
| 2 | src/agents/review-order.ts | Sub-agent wrapping review_order tool | 70 |
|
|
55
|
+
| 3 | src/agents/impact-explorer.ts | Sub-agent wrapping impact_analysis tool | 70 |
|
|
56
|
+
| 4 | src/agents/review-helper.ts | Orchestrator coordinating sub-agents | 60 |
|
|
57
|
+
| 5 | src/agents/index.ts | Barrel export for agent definitions | 50 |
|
|
58
|
+
| 6 | src/index.ts | Plugin entry point; command registration | 40 |
|
|
59
|
+
| 7 | package.json | Version bump 0.2.0 → 0.3.0 | 30 |
|
|
60
|
+
| 8 | AGENTS.md | Local testing/release docs | 20 |
|
|
61
|
+
| 9 | README.md | User-facing docs reorganization | 10 |
|
|
62
|
+
| 10 | agents/*.md (deleted) | Removed markdown agent files | 5 |
|
|
63
|
+
---
|
|
64
|
+
Summary of Changes
|
|
65
|
+
Theme: Subagent architecture for /review-order slash command
|
|
66
|
+
Structural Changes
|
|
67
|
+
- Added: src/agents/ directory with 4 new files
|
|
68
|
+
- Deleted: agents/*.md files (agent prompts moved to TypeScript)
|
|
69
|
+
- Refactored: src/index.ts significantly simplified (136 lines → ~30 lines of logic)
|
|
70
|
+
Key Review Points
|
|
71
|
+
| File | What to Check |
|
|
72
|
+
|------|---------------|
|
|
73
|
+
| src/tools/review-order.ts | +139 lines. New scoring algorithm? Dependency detection? |
|
|
74
|
+
| src/agents/review-helper.ts | Orchestration flow: review-order → impact → merge |
|
|
75
|
+
| src/index.ts | Verify plugin registration still works after major trim |
|
|
76
|
+
| agents/*.md deletion | Confirm prompts weren't lost, just moved to .ts |
|
|
77
|
+
Testing Gaps
|
|
78
|
+
⚠️ No test files for any changed code. Manual testing via /review-order command required.
|
|
79
|
+
---
|
|
80
|
+
Want me to read specific files for deeper analysis?
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Agents
|
|
84
|
+
|
|
85
|
+
Three agents available for direct use or extension:
|
|
86
|
+
|
|
87
|
+
| Agent | Purpose |
|
|
88
|
+
|-------|---------|
|
|
89
|
+
| `review-helper` | Orchestrator - runs full `/review-order` workflow |
|
|
90
|
+
| `review-helper:review-order` | Determines optimal file review order |
|
|
91
|
+
| `review-helper:impact-explorer` | Finds external impacted code |
|
|
92
|
+
|
|
93
|
+
The orchestrator does NOT make up its own recommendations—it only presents what the subagents return. It also does NOT automatically run tests or apply fixes.
|
|
29
94
|
|
|
30
|
-
|
|
95
|
+
### Examples
|
|
96
|
+
|
|
97
|
+
Run impact analysis only:
|
|
98
|
+
```bash
|
|
99
|
+
opencode run --agent review-helper:impact-explorer "Analyze impact of current changes"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Get review order without impact merge:
|
|
103
|
+
```bash
|
|
104
|
+
opencode run --agent review-helper:review-order "Get review order for changed files"
|
|
105
|
+
```
|
|
31
106
|
|
|
32
107
|
## Configuration
|
|
33
108
|
|
|
@@ -41,12 +116,10 @@ Create `~/.config/opencode/review-helper.json` or `.opencode/review-helper.json`
|
|
|
41
116
|
"review_order": {
|
|
42
117
|
"type_priority": [
|
|
43
118
|
"migration",
|
|
44
|
-
"schema",
|
|
119
|
+
"schema",
|
|
45
120
|
"model",
|
|
46
121
|
"service",
|
|
47
|
-
"
|
|
48
|
-
"component",
|
|
49
|
-
"test"
|
|
122
|
+
"..."
|
|
50
123
|
],
|
|
51
124
|
"instructions": "Always review database changes before business logic"
|
|
52
125
|
},
|
|
@@ -58,39 +131,19 @@ Create `~/.config/opencode/review-helper.json` or `.opencode/review-helper.json`
|
|
|
58
131
|
}
|
|
59
132
|
```
|
|
60
133
|
|
|
134
|
+
*Default `type_priority` includes 18 keywords. See [src/config.ts](src/config.ts) for full list.*
|
|
135
|
+
|
|
61
136
|
### Configuration Options
|
|
62
137
|
|
|
63
138
|
| Option | Description | Default |
|
|
64
139
|
|--------|-------------|---------|
|
|
65
140
|
| `models.explorer` | Model for sub-agent exploration | `google/gemini-3-flash` |
|
|
66
|
-
| `review_order.type_priority` | File type keywords in priority order | See
|
|
141
|
+
| `review_order.type_priority` | File type keywords in priority order | See config.ts |
|
|
67
142
|
| `review_order.instructions` | Custom ordering instructions | - |
|
|
68
143
|
| `impact_analysis.max_depth` | Transitive analysis depth (1-3) | `2` |
|
|
69
144
|
| `impact_analysis.max_results_per_level` | Max results per category | `50` |
|
|
70
145
|
| `impact_analysis.exclude_patterns` | Glob patterns to skip | Test files |
|
|
71
146
|
|
|
72
|
-
## Tools
|
|
73
|
-
|
|
74
|
-
The plugin also exposes two tools directly:
|
|
75
|
-
|
|
76
|
-
### `review_order`
|
|
77
|
-
|
|
78
|
-
Suggests optimal order to review changed files.
|
|
79
|
-
|
|
80
|
-
Output:
|
|
81
|
-
- Prioritized file list with rationale
|
|
82
|
-
- Dependency graph showing import relationships
|
|
83
|
-
- Scores based on: type priority, dependents count, complexity
|
|
84
|
-
|
|
85
|
-
### `impact_analysis`
|
|
86
|
-
|
|
87
|
-
Finds code outside the changeset that could break.
|
|
88
|
-
|
|
89
|
-
Output:
|
|
90
|
-
- Direct consumers (files that import changed code)
|
|
91
|
-
- Transitive impact (files that use files that use changed code)
|
|
92
|
-
- Test coverage gaps (changed files without tests)
|
|
93
|
-
|
|
94
147
|
## License
|
|
95
148
|
|
|
96
149
|
MIT
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const IMPACT_EXPLORER_DESCRIPTION = "Subagent that analyzes external impact using the impact_analysis tool.";
|
|
2
|
+
export declare const IMPACT_EXPLORER_PROMPT = "You run the impact_analysis tool and return its output.\n\n## Usage\nCall the impact_analysis tool. It will:\n- Find all git-changed files\n- Identify external files that import/use the changed code\n- Report direct consumers and transitive dependencies\n\n## Output\nReturn the tool output verbatim. Do not add commentary.\n\n## Structured Output for Orchestrator\nWhen the orchestrator needs structured data for merging, extract and return:\n\n```json\n{\n \"direct\": [\n { \"file\": \"path/to/consumer.ts\", \"line\": 15, \"type\": \"import\" }\n ],\n \"transitive\": [\n { \"file\": \"path/to/indirect.ts\", \"line\": 42, \"type\": \"via path/to/consumer.ts\" }\n ]\n}\n```";
|
|
3
|
+
export declare const createImpactExplorerAgent: (model: string) => {
|
|
4
|
+
description: string;
|
|
5
|
+
mode: "subagent";
|
|
6
|
+
model: string;
|
|
7
|
+
color: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
tools: {
|
|
10
|
+
impact_analysis: boolean;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=impact-explorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-explorer.d.ts","sourceRoot":"","sources":["../../src/agents/impact-explorer.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,2EAA2E,CAAC;AAEpH,eAAO,MAAM,sBAAsB,qrBAuB5B,CAAC;AAER,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM;;;;;;;;;CASrD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const IMPACT_EXPLORER_DESCRIPTION = `Subagent that analyzes external impact using the impact_analysis tool.`;
|
|
2
|
+
export const IMPACT_EXPLORER_PROMPT = `You run the impact_analysis tool and return its output.
|
|
3
|
+
|
|
4
|
+
## Usage
|
|
5
|
+
Call the impact_analysis tool. It will:
|
|
6
|
+
- Find all git-changed files
|
|
7
|
+
- Identify external files that import/use the changed code
|
|
8
|
+
- Report direct consumers and transitive dependencies
|
|
9
|
+
|
|
10
|
+
## Output
|
|
11
|
+
Return the tool output verbatim. Do not add commentary.
|
|
12
|
+
|
|
13
|
+
## Structured Output for Orchestrator
|
|
14
|
+
When the orchestrator needs structured data for merging, extract and return:
|
|
15
|
+
|
|
16
|
+
\`\`\`json
|
|
17
|
+
{
|
|
18
|
+
"direct": [
|
|
19
|
+
{ "file": "path/to/consumer.ts", "line": 15, "type": "import" }
|
|
20
|
+
],
|
|
21
|
+
"transitive": [
|
|
22
|
+
{ "file": "path/to/indirect.ts", "line": 42, "type": "via path/to/consumer.ts" }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
\`\`\``;
|
|
26
|
+
export const createImpactExplorerAgent = (model) => ({
|
|
27
|
+
description: IMPACT_EXPLORER_DESCRIPTION,
|
|
28
|
+
mode: "subagent",
|
|
29
|
+
model,
|
|
30
|
+
color: "#00CED1",
|
|
31
|
+
prompt: IMPACT_EXPLORER_PROMPT,
|
|
32
|
+
tools: {
|
|
33
|
+
impact_analysis: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=impact-explorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-explorer.js","sourceRoot":"","sources":["../../src/agents/impact-explorer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,wEAAwE,CAAC;AAEpH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;OAuB/B,CAAC;AAER,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;IAC3D,WAAW,EAAE,2BAA2B;IACxC,IAAI,EAAE,UAAmB;IACzB,KAAK;IACL,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,sBAAsB;IAC9B,KAAK,EAAE;QACL,eAAe,EAAE,IAAI;KACtB;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const REVIEW_HELPER_DESCRIPTION = "Comprehensive code reviewer for AI-generated changes. Analyzes:\n- Optimal review order based on file dependencies\n- Impact on code outside the changeset (transitive)\n\nDoes NOT automatically run tests or fix code. For debugging help, explicitly ask.\n\nExamples:\n<example>\nContext: User completed AI-assisted implementation\nuser: \"Review the changes Claude just made\"\nassistant: \"I'll analyze the changes for review order and impact.\"\n</example>\n\n<example>\nContext: Large PR review\nuser: \"What should I look at first in this PR?\"\nassistant: \"I'll determine the optimal review order based on dependencies.\"\n</example>\n\n<example>\nContext: Concern about breaking changes\nuser: \"What else might this break?\"\nassistant: \"I'll analyze transitive impact on code outside these changes.\"\n</example>";
|
|
2
|
+
export declare const REVIEW_HELPER_PROMPT = "You are a code review orchestrator that coordinates subagents to produce a unified review order.\n\n## Workflow\n\nWhen invoked (especially via /review-order), execute this sequence:\n\n### Step 1: Get Initial Review Order\nSpawn the `review-helper:review-order` subagent:\n- It runs the review_order tool on changed files\n- Returns a prioritized file list\n\n### Step 2: Get Impact Analysis\nSpawn the `review-helper:impact-explorer` subagent:\n- It runs the impact_analysis tool\n- Returns external files that depend on the changed code\n\n### Step 3: Get Final Merged Order\nSpawn `review-helper:review-order` again, passing the impact data:\n- Provide the impact analysis results as impact_data argument\n- It merges external files into the list\n- It boosts priority for files with high external impact\n- Returns the final unified review order\n\n### Step 4: Present Results\nOutput ONLY the final merged review order table. Do not add commentary.\n\n## Output Format\n\nPresent a single table:\n\n| # | File | Reason | Score |\n|---|------|--------|-------|\n| 1 | `path/to/file.ts` | Foundation file; 3 external consumers | 85 |\n| 2 | `path/to/other.ts` | Type priority: 7 | 70 |\n| 3 | `external/consumer.ts` *(external)* | External: imports changed code | 25 |\n\nThat's it. One unified table with all files to review.";
|
|
3
|
+
export declare const reviewHelperAgent: {
|
|
4
|
+
description: string;
|
|
5
|
+
mode: "primary";
|
|
6
|
+
color: string;
|
|
7
|
+
prompt: string;
|
|
8
|
+
tools: {
|
|
9
|
+
task: boolean;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=review-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-helper.d.ts","sourceRoot":"","sources":["../../src/agents/review-helper.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,0zBAuB3B,CAAC;AAEZ,eAAO,MAAM,oBAAoB,uzCAoCsB,CAAC;AAExD,eAAO,MAAM,iBAAiB;;;;;;;;CAQ7B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export const REVIEW_HELPER_DESCRIPTION = `Comprehensive code reviewer for AI-generated changes. Analyzes:
|
|
2
|
+
- Optimal review order based on file dependencies
|
|
3
|
+
- Impact on code outside the changeset (transitive)
|
|
4
|
+
|
|
5
|
+
Does NOT automatically run tests or fix code. For debugging help, explicitly ask.
|
|
6
|
+
|
|
7
|
+
Examples:
|
|
8
|
+
<example>
|
|
9
|
+
Context: User completed AI-assisted implementation
|
|
10
|
+
user: "Review the changes Claude just made"
|
|
11
|
+
assistant: "I'll analyze the changes for review order and impact."
|
|
12
|
+
</example>
|
|
13
|
+
|
|
14
|
+
<example>
|
|
15
|
+
Context: Large PR review
|
|
16
|
+
user: "What should I look at first in this PR?"
|
|
17
|
+
assistant: "I'll determine the optimal review order based on dependencies."
|
|
18
|
+
</example>
|
|
19
|
+
|
|
20
|
+
<example>
|
|
21
|
+
Context: Concern about breaking changes
|
|
22
|
+
user: "What else might this break?"
|
|
23
|
+
assistant: "I'll analyze transitive impact on code outside these changes."
|
|
24
|
+
</example>`;
|
|
25
|
+
export const REVIEW_HELPER_PROMPT = `You are a code review orchestrator that coordinates subagents to produce a unified review order.
|
|
26
|
+
|
|
27
|
+
## Workflow
|
|
28
|
+
|
|
29
|
+
When invoked (especially via /review-order), execute this sequence:
|
|
30
|
+
|
|
31
|
+
### Step 1: Get Initial Review Order
|
|
32
|
+
Spawn the \`review-helper:review-order\` subagent:
|
|
33
|
+
- It runs the review_order tool on changed files
|
|
34
|
+
- Returns a prioritized file list
|
|
35
|
+
|
|
36
|
+
### Step 2: Get Impact Analysis
|
|
37
|
+
Spawn the \`review-helper:impact-explorer\` subagent:
|
|
38
|
+
- It runs the impact_analysis tool
|
|
39
|
+
- Returns external files that depend on the changed code
|
|
40
|
+
|
|
41
|
+
### Step 3: Get Final Merged Order
|
|
42
|
+
Spawn \`review-helper:review-order\` again, passing the impact data:
|
|
43
|
+
- Provide the impact analysis results as impact_data argument
|
|
44
|
+
- It merges external files into the list
|
|
45
|
+
- It boosts priority for files with high external impact
|
|
46
|
+
- Returns the final unified review order
|
|
47
|
+
|
|
48
|
+
### Step 4: Present Results
|
|
49
|
+
Output ONLY the final merged review order table. Do not add commentary.
|
|
50
|
+
|
|
51
|
+
## Output Format
|
|
52
|
+
|
|
53
|
+
Present a single table:
|
|
54
|
+
|
|
55
|
+
| # | File | Reason | Score |
|
|
56
|
+
|---|------|--------|-------|
|
|
57
|
+
| 1 | \`path/to/file.ts\` | Foundation file; 3 external consumers | 85 |
|
|
58
|
+
| 2 | \`path/to/other.ts\` | Type priority: 7 | 70 |
|
|
59
|
+
| 3 | \`external/consumer.ts\` *(external)* | External: imports changed code | 25 |
|
|
60
|
+
|
|
61
|
+
That's it. One unified table with all files to review.`;
|
|
62
|
+
export const reviewHelperAgent = {
|
|
63
|
+
description: REVIEW_HELPER_DESCRIPTION,
|
|
64
|
+
mode: "primary",
|
|
65
|
+
color: "#FF6B6B",
|
|
66
|
+
prompt: REVIEW_HELPER_PROMPT,
|
|
67
|
+
tools: {
|
|
68
|
+
task: true,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=review-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-helper.js","sourceRoot":"","sources":["../../src/agents/review-helper.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;WAuB9B,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAoCmB,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,yBAAyB;IACtC,IAAI,EAAE,SAAkB;IACxB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,IAAI;KACX;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const REVIEW_ORDER_DESCRIPTION = "Subagent that determines optimal file review order using the review_order tool.";
|
|
2
|
+
export declare const REVIEW_ORDER_PROMPT = "You run the review_order tool and return its output.\n\n## Basic Usage\nCall the review_order tool with no arguments to analyze git diff.\n\n## With Impact Data\nIf you receive impact_data in your prompt, pass it to the review_order tool:\n\n```\nreview_order({ impact_data: { direct: [...], transitive: [...] } })\n```\n\nThe tool will:\n- Merge external impacted files into the review list\n- Boost priority for files with many external consumers\n- Mark external files appropriately\n\n## Output\nReturn the tool output verbatim. Do not add commentary.";
|
|
3
|
+
export declare const createReviewOrderAgent: (model: string) => {
|
|
4
|
+
description: string;
|
|
5
|
+
mode: "subagent";
|
|
6
|
+
model: string;
|
|
7
|
+
color: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
tools: {
|
|
10
|
+
review_order: boolean;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=review-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-order.d.ts","sourceRoot":"","sources":["../../src/agents/review-order.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,oFAAoF,CAAC;AAE1H,eAAO,MAAM,mBAAmB,gjBAkBwB,CAAC;AAEzD,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM;;;;;;;;;CASlD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const REVIEW_ORDER_DESCRIPTION = `Subagent that determines optimal file review order using the review_order tool.`;
|
|
2
|
+
export const REVIEW_ORDER_PROMPT = `You run the review_order tool and return its output.
|
|
3
|
+
|
|
4
|
+
## Basic Usage
|
|
5
|
+
Call the review_order tool with no arguments to analyze git diff.
|
|
6
|
+
|
|
7
|
+
## With Impact Data
|
|
8
|
+
If you receive impact_data in your prompt, pass it to the review_order tool:
|
|
9
|
+
|
|
10
|
+
\`\`\`
|
|
11
|
+
review_order({ impact_data: { direct: [...], transitive: [...] } })
|
|
12
|
+
\`\`\`
|
|
13
|
+
|
|
14
|
+
The tool will:
|
|
15
|
+
- Merge external impacted files into the review list
|
|
16
|
+
- Boost priority for files with many external consumers
|
|
17
|
+
- Mark external files appropriately
|
|
18
|
+
|
|
19
|
+
## Output
|
|
20
|
+
Return the tool output verbatim. Do not add commentary.`;
|
|
21
|
+
export const createReviewOrderAgent = (model) => ({
|
|
22
|
+
description: REVIEW_ORDER_DESCRIPTION,
|
|
23
|
+
mode: "subagent",
|
|
24
|
+
model,
|
|
25
|
+
color: "#4ECDC4",
|
|
26
|
+
prompt: REVIEW_ORDER_PROMPT,
|
|
27
|
+
tools: {
|
|
28
|
+
review_order: true,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=review-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-order.js","sourceRoot":"","sources":["../../src/agents/review-order.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,iFAAiF,CAAC;AAE1H,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;wDAkBqB,CAAC;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;IACxD,WAAW,EAAE,wBAAwB;IACrC,IAAI,EAAE,UAAmB;IACzB,KAAK;IACL,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,YAAY,EAAE,IAAI;KACnB;CACF,CAAC,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAUlD,eAAO,MAAM,kBAAkB,EAAE,MA4BhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,97 +1,7 @@
|
|
|
1
1
|
import { reviewOrderTool } from "./tools/review-order.js";
|
|
2
2
|
import { impactAnalysisTool } from "./tools/impact-analysis.js";
|
|
3
3
|
import { loadConfig } from "./config.js";
|
|
4
|
-
|
|
5
|
-
- Optimal review order based on file dependencies
|
|
6
|
-
- Impact on code outside the changeset (transitive)
|
|
7
|
-
|
|
8
|
-
Does NOT automatically run tests or fix code. For debugging help, explicitly ask.
|
|
9
|
-
|
|
10
|
-
Examples:
|
|
11
|
-
<example>
|
|
12
|
-
Context: User completed AI-assisted implementation
|
|
13
|
-
user: "Review the changes Claude just made"
|
|
14
|
-
assistant: "I'll analyze the changes for review order and impact."
|
|
15
|
-
</example>
|
|
16
|
-
|
|
17
|
-
<example>
|
|
18
|
-
Context: Large PR review
|
|
19
|
-
user: "What should I look at first in this PR?"
|
|
20
|
-
assistant: "I'll determine the optimal review order based on dependencies."
|
|
21
|
-
</example>
|
|
22
|
-
|
|
23
|
-
<example>
|
|
24
|
-
Context: Concern about breaking changes
|
|
25
|
-
user: "What else might this break?"
|
|
26
|
-
assistant: "I'll analyze transitive impact on code outside these changes."
|
|
27
|
-
</example>`;
|
|
28
|
-
const REVIEW_HELPER_PROMPT = `You are a code review assistant that runs two tools and reports their output.
|
|
29
|
-
|
|
30
|
-
## CRITICAL CONSTRAINT
|
|
31
|
-
|
|
32
|
-
You are a **relay agent**. Your ONLY job is to:
|
|
33
|
-
1. Run the \`review_order\` tool
|
|
34
|
-
2. Run the \`impact_analysis\` tool
|
|
35
|
-
3. Present their outputs verbatim
|
|
36
|
-
|
|
37
|
-
DO NOT:
|
|
38
|
-
- Add your own analysis, observations, or recommendations
|
|
39
|
-
- Summarize or interpret the results
|
|
40
|
-
- Read files to add context
|
|
41
|
-
- Suggest next steps
|
|
42
|
-
- Add sections beyond what the tools return
|
|
43
|
-
|
|
44
|
-
## Workflow
|
|
45
|
-
|
|
46
|
-
### Step 1: Run review_order
|
|
47
|
-
Call the \`review_order\` tool. It returns a prioritized file list.
|
|
48
|
-
|
|
49
|
-
### Step 2: Run impact_analysis
|
|
50
|
-
Call the \`impact_analysis\` tool. It returns affected code outside the changeset.
|
|
51
|
-
|
|
52
|
-
### Step 3: Output results
|
|
53
|
-
Present ONLY what the tools returned. Use this exact format:
|
|
54
|
-
|
|
55
|
-
## Review Order
|
|
56
|
-
[paste review_order output here]
|
|
57
|
-
|
|
58
|
-
## Impact Analysis
|
|
59
|
-
[paste impact_analysis output here]
|
|
60
|
-
|
|
61
|
-
That's it. Nothing else.`;
|
|
62
|
-
const IMPACT_EXPLORER_DESCRIPTION = `Sub-agent for transitive reference exploration. Called by impact_analysis tool for deep dependency crawling.`;
|
|
63
|
-
const IMPACT_EXPLORER_PROMPT = `You explore references to symbols transitively.
|
|
64
|
-
|
|
65
|
-
## Input
|
|
66
|
-
|
|
67
|
-
You receive:
|
|
68
|
-
- \`symbol\`: Name to find references for
|
|
69
|
-
- \`source_file\`: Where symbol is defined
|
|
70
|
-
- \`exclude_files\`: Files already in changeset (skip these)
|
|
71
|
-
- \`depth\`: Current depth level
|
|
72
|
-
|
|
73
|
-
## Process
|
|
74
|
-
|
|
75
|
-
1. Find all references to \`symbol\`:
|
|
76
|
-
- Search for import statements containing the symbol
|
|
77
|
-
- Search for direct usage of the symbol name
|
|
78
|
-
2. Filter out files in \`exclude_files\`
|
|
79
|
-
3. For each reference, note:
|
|
80
|
-
- File path
|
|
81
|
-
- Line number
|
|
82
|
-
- Usage type (import, call, extends, etc.)
|
|
83
|
-
|
|
84
|
-
## Output
|
|
85
|
-
|
|
86
|
-
Return structured list:
|
|
87
|
-
\`\`\`
|
|
88
|
-
References to \`UserModel\`:
|
|
89
|
-
- src/api/auth.ts:15 (import)
|
|
90
|
-
- src/api/orders.ts:42 (call)
|
|
91
|
-
- src/services/email.ts:8 (import)
|
|
92
|
-
\`\`\`
|
|
93
|
-
|
|
94
|
-
Be fast and focused. Find references, don't analyze the code deeply.`;
|
|
4
|
+
import { reviewHelperAgent, createReviewOrderAgent, createImpactExplorerAgent, } from "./agents/index.js";
|
|
95
5
|
export const ReviewHelperPlugin = async ({ project, client, $, directory }) => {
|
|
96
6
|
return {
|
|
97
7
|
tool: {
|
|
@@ -103,31 +13,16 @@ export const ReviewHelperPlugin = async ({ project, client, $, directory }) => {
|
|
|
103
13
|
const explorerModel = pluginConfig.models?.explorer ?? "google/gemini-3-flash";
|
|
104
14
|
openCodeConfig.agent = {
|
|
105
15
|
...openCodeConfig.agent,
|
|
106
|
-
"review-helper":
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
Glob: true,
|
|
117
|
-
task: true,
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
"review-helper:impact-explorer": {
|
|
121
|
-
description: IMPACT_EXPLORER_DESCRIPTION,
|
|
122
|
-
mode: "subagent",
|
|
123
|
-
model: explorerModel,
|
|
124
|
-
color: "#00CED1",
|
|
125
|
-
prompt: IMPACT_EXPLORER_PROMPT,
|
|
126
|
-
tools: {
|
|
127
|
-
Read: true,
|
|
128
|
-
Grep: true,
|
|
129
|
-
Glob: true,
|
|
130
|
-
},
|
|
16
|
+
"review-helper": reviewHelperAgent,
|
|
17
|
+
"review-helper:review-order": createReviewOrderAgent(explorerModel),
|
|
18
|
+
"review-helper:impact-explorer": createImpactExplorerAgent(explorerModel),
|
|
19
|
+
};
|
|
20
|
+
openCodeConfig.command = {
|
|
21
|
+
...openCodeConfig.command,
|
|
22
|
+
"review-order": {
|
|
23
|
+
template: "Run the review-order workflow: get initial file order, analyze impact, then produce final prioritized review order with external impacted files merged in.",
|
|
24
|
+
description: "Get optimal file review order with impact analysis",
|
|
25
|
+
agent: "review-helper",
|
|
131
26
|
},
|
|
132
27
|
};
|
|
133
28
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,kBAAkB,GAAW,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IACpF,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,eAAe;YAC7B,eAAe,EAAE,kBAAkB;SACpC;QAED,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YAC/B,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,IAAI,uBAAuB,CAAC;YAE/E,cAAc,CAAC,KAAK,GAAG;gBACrB,GAAG,cAAc,CAAC,KAAK;gBACvB,eAAe,EAAE,iBAAiB;gBAClC,4BAA4B,EAAE,sBAAsB,CAAC,aAAa,CAAC;gBACnE,+BAA+B,EAAE,yBAAyB,CAAC,aAAa,CAAC;aAC1E,CAAC;YAEF,cAAc,CAAC,OAAO,GAAG;gBACvB,GAAG,cAAc,CAAC,OAAO;gBACzB,cAAc,EAAE;oBACd,QAAQ,EAAE,4JAA4J;oBACtK,WAAW,EAAE,oDAAoD;oBACjE,KAAK,EAAE,eAAe;iBACvB;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-order.d.ts","sourceRoot":"","sources":["../../src/tools/review-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"review-order.d.ts","sourceRoot":"","sources":["../../src/tools/review-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAiNrE,eAAO,MAAM,eAAe,EAAE,cAkI5B,CAAC"}
|
|
@@ -81,6 +81,62 @@ function generateReason(fileScore) {
|
|
|
81
81
|
const topReasons = fileScore.reasons.slice(0, 2);
|
|
82
82
|
return topReasons.join("; ");
|
|
83
83
|
}
|
|
84
|
+
function countExternalConsumers(impactData) {
|
|
85
|
+
const counts = new Map();
|
|
86
|
+
const allImpacts = [...(impactData.direct || []), ...(impactData.transitive || [])];
|
|
87
|
+
for (const impact of allImpacts) {
|
|
88
|
+
if (impact.type) {
|
|
89
|
+
const viaMatch = impact.type.match(/via (.+)/);
|
|
90
|
+
if (viaMatch) {
|
|
91
|
+
const viaFile = viaMatch[1];
|
|
92
|
+
counts.set(viaFile, (counts.get(viaFile) || 0) + 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return counts;
|
|
97
|
+
}
|
|
98
|
+
function boostScoresForExternalConsumers(scores, externalConsumerCount) {
|
|
99
|
+
const MAX_BOOST = 50;
|
|
100
|
+
const BOOST_PER_CONSUMER = 10;
|
|
101
|
+
for (const score of scores) {
|
|
102
|
+
const consumerCount = externalConsumerCount.get(score.file) || 0;
|
|
103
|
+
if (consumerCount > 0) {
|
|
104
|
+
const boost = Math.min(consumerCount * BOOST_PER_CONSUMER, MAX_BOOST);
|
|
105
|
+
score.score += boost;
|
|
106
|
+
score.reasons.push(`${consumerCount} external consumer(s)`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function addExternalFilesToScores(impactData, changedFileSet, externalScores) {
|
|
111
|
+
const BASE_EXTERNAL_SCORE = 25;
|
|
112
|
+
const seenExternals = new Set();
|
|
113
|
+
const directFiles = impactData.direct || [];
|
|
114
|
+
for (const impact of directFiles) {
|
|
115
|
+
if (changedFileSet.has(impact.file) || seenExternals.has(impact.file))
|
|
116
|
+
continue;
|
|
117
|
+
seenExternals.add(impact.file);
|
|
118
|
+
const directImportCount = directFiles.filter((d) => d.file === impact.file).length;
|
|
119
|
+
const transitiveCount = (impactData.transitive || []).filter((t) => t.file === impact.file).length;
|
|
120
|
+
let score = BASE_EXTERNAL_SCORE;
|
|
121
|
+
const reasons = ["External: imports changed code"];
|
|
122
|
+
if (directImportCount > 1) {
|
|
123
|
+
score += directImportCount * 5;
|
|
124
|
+
reasons.push(`${directImportCount} direct imports`);
|
|
125
|
+
}
|
|
126
|
+
if (transitiveCount > 0) {
|
|
127
|
+
score += 10;
|
|
128
|
+
reasons.push("Also has transitive impact");
|
|
129
|
+
}
|
|
130
|
+
externalScores.push({
|
|
131
|
+
file: impact.file,
|
|
132
|
+
score,
|
|
133
|
+
reasons,
|
|
134
|
+
dependencies: [],
|
|
135
|
+
dependents: [],
|
|
136
|
+
isExternal: true,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
84
140
|
export const reviewOrderTool = tool({
|
|
85
141
|
description: "Analyze changed files and suggest optimal review order based on dependencies, file type priority, and complexity. Returns a prioritized list with rationale for reviewing each file.",
|
|
86
142
|
args: {
|
|
@@ -92,6 +148,27 @@ export const reviewOrderTool = tool({
|
|
|
92
148
|
.string()
|
|
93
149
|
.optional()
|
|
94
150
|
.describe("Additional ordering instructions (e.g., 'review migrations before models')"),
|
|
151
|
+
impact_data: tool.schema
|
|
152
|
+
.object({
|
|
153
|
+
direct: tool.schema
|
|
154
|
+
.array(tool.schema.object({
|
|
155
|
+
file: tool.schema.string(),
|
|
156
|
+
line: tool.schema.number().optional(),
|
|
157
|
+
type: tool.schema.string().optional(),
|
|
158
|
+
}))
|
|
159
|
+
.optional()
|
|
160
|
+
.describe("Direct consumers of changed files"),
|
|
161
|
+
transitive: tool.schema
|
|
162
|
+
.array(tool.schema.object({
|
|
163
|
+
file: tool.schema.string(),
|
|
164
|
+
line: tool.schema.number().optional(),
|
|
165
|
+
type: tool.schema.string().optional(),
|
|
166
|
+
}))
|
|
167
|
+
.optional()
|
|
168
|
+
.describe("Transitive consumers of changed files"),
|
|
169
|
+
})
|
|
170
|
+
.optional()
|
|
171
|
+
.describe("Impact analysis results to merge into review order. External files will be added to the list."),
|
|
95
172
|
},
|
|
96
173
|
async execute(args, ctx) {
|
|
97
174
|
const cwd = process.cwd();
|
|
@@ -108,7 +185,7 @@ export const reviewOrderTool = tool({
|
|
|
108
185
|
else {
|
|
109
186
|
filesToAnalyze = await getChangedFiles(cwd);
|
|
110
187
|
}
|
|
111
|
-
if (filesToAnalyze.length === 0) {
|
|
188
|
+
if (filesToAnalyze.length === 0 && !args.impact_data) {
|
|
112
189
|
return JSON.stringify({
|
|
113
190
|
order: [],
|
|
114
191
|
dependency_graph: {},
|
|
@@ -117,8 +194,19 @@ export const reviewOrderTool = tool({
|
|
|
117
194
|
}
|
|
118
195
|
const dependencyGraph = await buildDependencyGraph(filesToAnalyze.map((f) => f.file), cwd);
|
|
119
196
|
const scores = computeScores(filesToAnalyze, dependencyGraph, config.review_order.type_priority);
|
|
197
|
+
const impactData = args.impact_data;
|
|
198
|
+
const externalScores = [];
|
|
199
|
+
const changedFileSet = new Set(filesToAnalyze.map((f) => f.file));
|
|
200
|
+
if (impactData) {
|
|
201
|
+
const externalConsumerCount = countExternalConsumers(impactData);
|
|
202
|
+
boostScoresForExternalConsumers(scores, externalConsumerCount);
|
|
203
|
+
addExternalFilesToScores(impactData, changedFileSet, externalScores);
|
|
204
|
+
scores.sort((a, b) => b.score - a.score);
|
|
205
|
+
externalScores.sort((a, b) => b.score - a.score);
|
|
206
|
+
}
|
|
207
|
+
const allScores = [...scores, ...externalScores];
|
|
120
208
|
const result = {
|
|
121
|
-
order:
|
|
209
|
+
order: allScores.map((s, i) => ({
|
|
122
210
|
rank: i + 1,
|
|
123
211
|
file: s.file,
|
|
124
212
|
reason: generateReason(s),
|
|
@@ -127,10 +215,15 @@ export const reviewOrderTool = tool({
|
|
|
127
215
|
dependency_graph: Object.fromEntries(dependencyGraph),
|
|
128
216
|
};
|
|
129
217
|
let output = "## Review Order\n\n";
|
|
218
|
+
if (impactData) {
|
|
219
|
+
output += "_Includes external files impacted by changes_\n\n";
|
|
220
|
+
}
|
|
130
221
|
output += "| # | File | Reason | Score |\n";
|
|
131
222
|
output += "|---|------|--------|-------|\n";
|
|
132
|
-
for (
|
|
133
|
-
|
|
223
|
+
for (let i = 0; i < allScores.length; i++) {
|
|
224
|
+
const score = allScores[i];
|
|
225
|
+
const marker = score.isExternal ? " *(external)*" : "";
|
|
226
|
+
output += `| ${i + 1} | \`${score.file}\`${marker} | ${generateReason(score)} | ${score.score} |\n`;
|
|
134
227
|
}
|
|
135
228
|
if (Object.keys(result.dependency_graph).length > 0) {
|
|
136
229
|
output += "\n## Dependency Graph\n\n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-order.js","sourceRoot":"","sources":["../../src/tools/review-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAW,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"review-order.js","sourceRoot":"","sources":["../../src/tools/review-order.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED