codeant-cli 0.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeant-cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Code review CLI tool",
5
5
  "type": "module",
6
6
  "bin": {
@@ -107,39 +107,43 @@ export default function Review({ scanType = 'all', lastNCommits = 1, failOn = 'C
107
107
  })
108
108
  );
109
109
 
110
- const allSuggestions = perFileResults
111
- .map(r => r.finalMessage?.content)
112
- .filter(Boolean);
110
+ // Pair each file's suggestions with its own diff — skip files with no real suggestions
111
+ const perFileWithSuggestions = perFileRequests.map((fileReq, i) => ({
112
+ diff_content: fileReq.diff_content,
113
+ suggestions: perFileResults[i].finalMessage?.content,
114
+ output: perFileResults[i].finalOutput,
115
+ })).filter(r => r.output?.code_suggestions?.length > 0);
113
116
 
114
117
  if (cancelled) return;
115
118
 
116
- // ── Reflector loop (on combined suggestions) ───────────────────────
117
- const combinedSuggestions = allSuggestions.join('\n\n');
119
+ // ── Per-file reflector loops (parallel) ─────────────────────────────
118
120
  setCurrentMessage('Running reflector...');
119
- const reflectorPayload = {
120
- diff_content: requestBody.diff_content,
121
- prompt_template_name: 'reflector',
122
- extra_variables: {
123
- suggestion_str: combinedSuggestions,
124
- },
125
- };
126
-
127
- const { finalOutput: reflectorOutput } = await runTurnLoop(
128
- reflectorPayload,
129
- gitRoot,
130
- () => cancelled,
131
- (msg) => { if (!cancelled) setCurrentMessage(msg); },
132
- true
121
+ const reflectorResults = await Promise.all(
122
+ perFileWithSuggestions.map(({ diff_content, suggestions }) =>
123
+ runTurnLoop(
124
+ {
125
+ diff_content,
126
+ prompt_template_name: 'reflector',
127
+ extra_variables: { suggestion_str: suggestions },
128
+ },
129
+ gitRoot,
130
+ () => cancelled,
131
+ () => {},
132
+ true
133
+ )
134
+ )
133
135
  );
134
136
 
135
137
  if (cancelled) return;
136
138
 
137
- const reviewIssues = (reflectorOutput?.code_suggestions || []).map(issue => ({
138
- issue_content: issue.issue_content || '',
139
- relevant_file: issue.relevant_file || 'Unknown',
140
- start_line: issue.start_line || 0,
141
- label: issue.label || 'Code Quality',
142
- }));
139
+ const reviewIssues = reflectorResults.flatMap(r =>
140
+ (r.finalOutput?.code_suggestions || []).map(issue => ({
141
+ issue_content: issue.issue_content || '',
142
+ relevant_file: issue.relevant_file || 'Unknown',
143
+ start_line: issue.start_line || 0,
144
+ label: issue.label || 'Code Quality',
145
+ }))
146
+ );
143
147
  setIssues(reviewIssues);
144
148
  setSummary(null);
145
149
  setStatus('done');
@@ -142,31 +142,38 @@ export async function runReviewHeadless(options = {}) {
142
142
  })
143
143
  );
144
144
 
145
- const allSuggestions = perFileResults
146
- .map((r) => r.finalMessage?.content)
147
- .filter(Boolean);
148
-
149
- // ── Reflector loop ──────────────────────────────────────────────────
150
- const combinedSuggestions = allSuggestions.join('\n\n');
145
+ // Pair each file's suggestions with its own diff — skip files with no real suggestions
146
+ const perFileWithSuggestions = perFileRequests.map((fileReq, i) => ({
147
+ diff_content: fileReq.diff_content,
148
+ suggestions: perFileResults[i].finalMessage?.content,
149
+ output: perFileResults[i].finalOutput,
150
+ })).filter(r => r.output?.code_suggestions?.length > 0);
151
+
152
+ // ── Per-file reflector loops (parallel) ──────────────────────────────
151
153
  onProgress('Running reflector...');
152
-
153
- const reflectorPayload = {
154
- diff_content: requestBody.diff_content,
155
- prompt_template_name: 'reflector',
156
- extra_variables: {
157
- suggestion_str: combinedSuggestions,
158
- },
159
- };
160
-
161
- const { finalOutput: reflectorOutput } = await runTurnLoop(reflectorPayload, gitRoot, true);
154
+ const reflectorResults = await Promise.all(
155
+ perFileWithSuggestions.map(({ diff_content, suggestions }) =>
156
+ runTurnLoop(
157
+ {
158
+ diff_content,
159
+ prompt_template_name: 'reflector',
160
+ extra_variables: { suggestion_str: suggestions },
161
+ },
162
+ gitRoot,
163
+ true
164
+ )
165
+ )
166
+ );
162
167
 
163
168
  // ── Parse results ───────────────────────────────────────────────────
164
- const issues = (reflectorOutput?.code_suggestions || []).map((issue) => ({
165
- issue_content: issue.issue_content || '',
166
- relevant_file: issue.relevant_file || 'Unknown',
167
- start_line: issue.start_line || 0,
168
- label: issue.label || 'Code Quality',
169
- }));
169
+ const issues = reflectorResults.flatMap(r =>
170
+ (r.finalOutput?.code_suggestions || []).map((issue) => ({
171
+ issue_content: issue.issue_content || '',
172
+ relevant_file: issue.relevant_file || 'Unknown',
173
+ start_line: issue.start_line || 0,
174
+ label: issue.label || 'Code Quality',
175
+ }))
176
+ );
170
177
 
171
178
  const labelCounts = {};
172
179
  for (const i of issues) { labelCounts[i.label] = (labelCounts[i.label] || 0) + 1; }