opencode-review-helper 0.2.0 → 0.3.0

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 CHANGED
@@ -21,11 +21,27 @@ Restart opencode after setup to load the plugin. The plugin uses `@latest` so it
21
21
 
22
22
  ## Usage
23
23
 
24
- The plugin provides a `review-helper` agent that combines both tools. It:
24
+ ### Slash Command: `/review-order`
25
25
 
26
- 1. Runs `review_order` to determine file review sequence
27
- 2. Runs `impact_analysis` to find affected external code
28
- 3. Formats the tool outputs into a combined report
26
+ The quickest way to use this plugin:
27
+
28
+ ```
29
+ /review-order
30
+ ```
31
+
32
+ This runs the full workflow:
33
+ 1. Analyzes changed files and determines initial review order
34
+ 2. Finds external files impacted by the changes
35
+ 3. Merges everything into a single prioritized list
36
+
37
+ 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.
38
+
39
+ ### Agent: `review-helper`
40
+
41
+ The plugin provides a `review-helper` agent that orchestrates two subagents:
42
+
43
+ - `review-helper:review-order` - Determines optimal file review order
44
+ - `review-helper:impact-explorer` - Finds external code impacted by changes
29
45
 
30
46
  The agent does NOT make up its own recommendations or analysis—it only presents what the tools return. It also does NOT automatically run tests or apply fixes.
31
47
 
@@ -77,10 +93,15 @@ The plugin also exposes two tools directly:
77
93
 
78
94
  Suggests optimal order to review changed files.
79
95
 
96
+ Arguments:
97
+ - `files` (optional): Specific files to analyze. If omitted, uses git diff.
98
+ - `instructions` (optional): Custom ordering instructions
99
+ - `impact_data` (optional): Impact analysis results to merge external files into the list
100
+
80
101
  Output:
81
102
  - Prioritized file list with rationale
82
103
  - Dependency graph showing import relationships
83
- - Scores based on: type priority, dependents count, complexity
104
+ - Scores based on: type priority, dependents count, complexity, external impact
84
105
 
85
106
  ### `impact_analysis`
86
107
 
@@ -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,4 @@
1
+ export { reviewHelperAgent } from "./review-helper.js";
2
+ export { createReviewOrderAgent } from "./review-order.js";
3
+ export { createImpactExplorerAgent } from "./impact-explorer.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { reviewHelperAgent } from "./review-helper.js";
2
+ export { createReviewOrderAgent } from "./review-order.js";
3
+ export { createImpactExplorerAgent } from "./impact-explorer.js";
4
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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;AAoGlD,eAAO,MAAM,kBAAkB,EAAE,MA0ChC,CAAC;AAEF,eAAe,kBAAkB,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
- const REVIEW_HELPER_DESCRIPTION = `Comprehensive code reviewer for AI-generated changes. Analyzes:
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
- description: REVIEW_HELPER_DESCRIPTION,
108
- mode: "primary",
109
- color: "#FF6B6B",
110
- prompt: REVIEW_HELPER_PROMPT,
111
- tools: {
112
- review_order: true,
113
- impact_analysis: true,
114
- Read: true,
115
- Grep: true,
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;AAEzC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;WAuBvB,CAAC;AAEZ,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCJ,CAAC;AAE1B,MAAM,2BAA2B,GAAG,8GAA8G,CAAC;AAEnJ,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEA+BsC,CAAC;AAEtE,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;oBACf,WAAW,EAAE,yBAAyB;oBACtC,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,oBAAoB;oBAC5B,KAAK,EAAE;wBACL,YAAY,EAAE,IAAI;wBAClB,eAAe,EAAE,IAAI;wBACrB,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;qBACX;iBACF;gBACD,+BAA+B,EAAE;oBAC/B,WAAW,EAAE,2BAA2B;oBACxC,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,aAAa;oBACpB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,sBAAsB;oBAC9B,KAAK,EAAE;wBACL,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;qBACX;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,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;AA2HrE,eAAO,MAAM,eAAe,EAAE,cAmF5B,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: scores.map((s, i) => ({
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 (const item of result.order) {
133
- output += `| ${item.rank} | \`${item.file}\` | ${item.reason} | ${item.score} |\n`;
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":"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"}
1
+ {"version":3,"file":"review-order.js","sourceRoot":"","sources":["../../src/tools/review-order.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-review-helper",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "OpenCode plugin for reviewing AI-generated code changes - suggests review order and analyzes impact",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",