dino-spec 14.0.1 → 14.1.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 +37 -1
- package/dist/core/agents/ambiguity-resolver.d.ts +118 -0
- package/dist/core/agents/ambiguity-resolver.d.ts.map +1 -0
- package/dist/core/agents/ambiguity-resolver.js +327 -0
- package/dist/core/agents/ambiguity-resolver.js.map +1 -0
- package/dist/core/agents/confidence-gate.d.ts +99 -0
- package/dist/core/agents/confidence-gate.d.ts.map +1 -0
- package/dist/core/agents/confidence-gate.js +295 -0
- package/dist/core/agents/confidence-gate.js.map +1 -0
- package/dist/core/agents/feedback-collector.d.ts +108 -0
- package/dist/core/agents/feedback-collector.d.ts.map +1 -0
- package/dist/core/agents/feedback-collector.js +313 -0
- package/dist/core/agents/feedback-collector.js.map +1 -0
- package/dist/core/agents/parallel-reviewer.d.ts +88 -0
- package/dist/core/agents/parallel-reviewer.d.ts.map +1 -0
- package/dist/core/agents/parallel-reviewer.js +459 -0
- package/dist/core/agents/parallel-reviewer.js.map +1 -0
- package/dist/core/agents/reviewer-loop.d.ts +102 -0
- package/dist/core/agents/reviewer-loop.d.ts.map +1 -0
- package/dist/core/agents/reviewer-loop.js +373 -0
- package/dist/core/agents/reviewer-loop.js.map +1 -0
- package/dist/core/agents/skill-auditor.d.ts +82 -0
- package/dist/core/agents/skill-auditor.d.ts.map +1 -0
- package/dist/core/agents/skill-auditor.js +278 -0
- package/dist/core/agents/skill-auditor.js.map +1 -0
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +1 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/tools/feedback.d.ts +63 -0
- package/dist/mcp/tools/feedback.d.ts.map +1 -0
- package/dist/mcp/tools/feedback.js +255 -0
- package/dist/mcp/tools/feedback.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Reviewer - v14.1.0
|
|
3
|
+
*
|
|
4
|
+
* Runs multiple reviewer aspects in parallel (style, security, tests).
|
|
5
|
+
* Merges results into unified review summary.
|
|
6
|
+
*
|
|
7
|
+
* @see Parallel review for comprehensive code analysis
|
|
8
|
+
*/
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Constants
|
|
11
|
+
// =============================================================================
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
enabled: process.env.DINO_PARALLEL_REVIEW === 'true',
|
|
14
|
+
aspects: [
|
|
15
|
+
{ aspect: 'style', enabled: true, budgetPercent: 40, maxTokens: 1200 },
|
|
16
|
+
{ aspect: 'security', enabled: true, budgetPercent: 30, maxTokens: 900 },
|
|
17
|
+
{ aspect: 'tests', enabled: true, budgetPercent: 30, maxTokens: 900 },
|
|
18
|
+
],
|
|
19
|
+
maxConcurrency: 3,
|
|
20
|
+
timeoutMs: 30000,
|
|
21
|
+
failFast: false,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Aspect-specific review prompts
|
|
25
|
+
*/
|
|
26
|
+
const ASPECT_PROMPTS = {
|
|
27
|
+
style: `# Style Review
|
|
28
|
+
|
|
29
|
+
Review code for style and quality:
|
|
30
|
+
- Code formatting and consistency
|
|
31
|
+
- Naming conventions
|
|
32
|
+
- Code organization
|
|
33
|
+
- Comments and documentation
|
|
34
|
+
- Complexity and readability
|
|
35
|
+
- Dead code and unused variables
|
|
36
|
+
|
|
37
|
+
Focus on maintainability and readability.`,
|
|
38
|
+
security: `# Security Review
|
|
39
|
+
|
|
40
|
+
Review code for security issues:
|
|
41
|
+
- Hardcoded credentials or secrets
|
|
42
|
+
- Injection vulnerabilities (SQL, XSS, command)
|
|
43
|
+
- Authentication/authorization issues
|
|
44
|
+
- Data exposure risks
|
|
45
|
+
- Input validation gaps
|
|
46
|
+
- Unsafe operations (eval, exec)
|
|
47
|
+
|
|
48
|
+
Focus on OWASP Top 10 vulnerabilities.`,
|
|
49
|
+
tests: `# Test Review
|
|
50
|
+
|
|
51
|
+
Review code for test quality:
|
|
52
|
+
- Test coverage for new code
|
|
53
|
+
- Edge case handling
|
|
54
|
+
- Error scenario testing
|
|
55
|
+
- Test naming and organization
|
|
56
|
+
- Mock usage appropriateness
|
|
57
|
+
- Test isolation
|
|
58
|
+
|
|
59
|
+
Focus on confidence in changes.`,
|
|
60
|
+
};
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Core Functions
|
|
63
|
+
// =============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Check if parallel review is enabled
|
|
66
|
+
*/
|
|
67
|
+
export function isParallelReviewEnabled(config = DEFAULT_CONFIG) {
|
|
68
|
+
return config.enabled || process.env.DINO_PARALLEL_REVIEW === 'true';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Run parallel reviews across all aspects
|
|
72
|
+
*
|
|
73
|
+
* This is the main entry point for parallel review.
|
|
74
|
+
* Returns merged result from all aspects.
|
|
75
|
+
*/
|
|
76
|
+
export async function parallelReview(changes, config = DEFAULT_CONFIG) {
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
// Filter to enabled aspects
|
|
79
|
+
const enabledAspects = config.aspects.filter((a) => a.enabled);
|
|
80
|
+
if (enabledAspects.length === 0) {
|
|
81
|
+
return createEmptyResult();
|
|
82
|
+
}
|
|
83
|
+
// Run reviews in parallel
|
|
84
|
+
const results = await Promise.all(enabledAspects.map((aspectConfig) => reviewAspect(changes, aspectConfig, config)));
|
|
85
|
+
// Merge results
|
|
86
|
+
return mergeReviewResults(results, Date.now() - startTime);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Review a single aspect
|
|
90
|
+
*/
|
|
91
|
+
export async function reviewAspect(changes, aspectConfig, config) {
|
|
92
|
+
const startTime = Date.now();
|
|
93
|
+
try {
|
|
94
|
+
// Build aspect-specific prompt
|
|
95
|
+
const prompt = buildAspectPrompt(changes, aspectConfig);
|
|
96
|
+
// Execute review (would spawn subagent in practice)
|
|
97
|
+
const findings = await executeAspectReview(changes, aspectConfig);
|
|
98
|
+
// Calculate aspect score
|
|
99
|
+
const score = calculateAspectScore(findings);
|
|
100
|
+
return {
|
|
101
|
+
aspect: aspectConfig.aspect,
|
|
102
|
+
findings,
|
|
103
|
+
score,
|
|
104
|
+
tokensUsed: estimateTokens(prompt),
|
|
105
|
+
duration: Date.now() - startTime,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return {
|
|
110
|
+
aspect: aspectConfig.aspect,
|
|
111
|
+
findings: [],
|
|
112
|
+
score: 0,
|
|
113
|
+
tokensUsed: 0,
|
|
114
|
+
duration: Date.now() - startTime,
|
|
115
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Build prompt for aspect review
|
|
121
|
+
*/
|
|
122
|
+
export function buildAspectPrompt(changes, aspectConfig) {
|
|
123
|
+
const sections = [];
|
|
124
|
+
// Aspect-specific instructions
|
|
125
|
+
sections.push(ASPECT_PROMPTS[aspectConfig.aspect]);
|
|
126
|
+
sections.push('');
|
|
127
|
+
// Budget info
|
|
128
|
+
sections.push(`**Budget:** ${aspectConfig.maxTokens} tokens max`);
|
|
129
|
+
sections.push('');
|
|
130
|
+
// Changes to review
|
|
131
|
+
sections.push('## Changes');
|
|
132
|
+
for (const change of changes) {
|
|
133
|
+
sections.push(`### ${change.path} (${change.operation})`);
|
|
134
|
+
if (change.diff) {
|
|
135
|
+
sections.push('```diff');
|
|
136
|
+
sections.push(change.diff.slice(0, 500));
|
|
137
|
+
sections.push('```');
|
|
138
|
+
}
|
|
139
|
+
sections.push('');
|
|
140
|
+
}
|
|
141
|
+
// Output format
|
|
142
|
+
sections.push('## Output');
|
|
143
|
+
sections.push('Return findings as JSON array:');
|
|
144
|
+
sections.push('```json');
|
|
145
|
+
sections.push('[');
|
|
146
|
+
sections.push(' {');
|
|
147
|
+
sections.push(' "type": "issue|suggestion|positive",');
|
|
148
|
+
sections.push(' "severity": "critical|major|minor|info",');
|
|
149
|
+
sections.push(` "category": "${aspectConfig.aspect}",`);
|
|
150
|
+
sections.push(' "file": "path",');
|
|
151
|
+
sections.push(' "line": 42,');
|
|
152
|
+
sections.push(' "message": "description"');
|
|
153
|
+
sections.push(' }');
|
|
154
|
+
sections.push(']');
|
|
155
|
+
sections.push('```');
|
|
156
|
+
return sections.join('\n');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Execute aspect review (placeholder for subagent)
|
|
160
|
+
*/
|
|
161
|
+
async function executeAspectReview(changes, aspectConfig) {
|
|
162
|
+
const findings = [];
|
|
163
|
+
for (const change of changes) {
|
|
164
|
+
const content = change.content || change.diff || '';
|
|
165
|
+
switch (aspectConfig.aspect) {
|
|
166
|
+
case 'style':
|
|
167
|
+
findings.push(...checkStyleIssues(change.path, content));
|
|
168
|
+
break;
|
|
169
|
+
case 'security':
|
|
170
|
+
findings.push(...checkSecurityIssues(change.path, content));
|
|
171
|
+
break;
|
|
172
|
+
case 'tests':
|
|
173
|
+
findings.push(...checkTestIssues(change.path, content));
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return findings;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Check for style issues
|
|
181
|
+
*/
|
|
182
|
+
function checkStyleIssues(path, content) {
|
|
183
|
+
const findings = [];
|
|
184
|
+
// Long lines
|
|
185
|
+
const lines = content.split('\n');
|
|
186
|
+
const longLines = lines.filter((l) => l.length > 120);
|
|
187
|
+
if (longLines.length > 0) {
|
|
188
|
+
findings.push({
|
|
189
|
+
type: 'suggestion',
|
|
190
|
+
severity: 'minor',
|
|
191
|
+
file: path,
|
|
192
|
+
message: `${longLines.length} line(s) exceed 120 characters`,
|
|
193
|
+
category: 'style',
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// console.log (if not test file)
|
|
197
|
+
if (!path.includes('test') && /console\.log\(/.test(content)) {
|
|
198
|
+
findings.push({
|
|
199
|
+
type: 'suggestion',
|
|
200
|
+
severity: 'minor',
|
|
201
|
+
file: path,
|
|
202
|
+
message: 'console.log() found - consider using proper logging',
|
|
203
|
+
category: 'style',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// TODO comments
|
|
207
|
+
if (/\/\/\s*TODO/i.test(content)) {
|
|
208
|
+
findings.push({
|
|
209
|
+
type: 'suggestion',
|
|
210
|
+
severity: 'info',
|
|
211
|
+
file: path,
|
|
212
|
+
message: 'TODO comment found',
|
|
213
|
+
category: 'style',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return findings;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Check for security issues
|
|
220
|
+
*/
|
|
221
|
+
function checkSecurityIssues(path, content) {
|
|
222
|
+
const findings = [];
|
|
223
|
+
// Hardcoded secrets
|
|
224
|
+
if (/(?:password|secret|api_?key|apiKey|token)\s*[:=]\s*['"][^'"]+['"]/i.test(content)) {
|
|
225
|
+
findings.push({
|
|
226
|
+
type: 'issue',
|
|
227
|
+
severity: 'critical',
|
|
228
|
+
file: path,
|
|
229
|
+
message: 'Potential hardcoded secret detected',
|
|
230
|
+
category: 'security',
|
|
231
|
+
suggestion: 'Use environment variables',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// eval usage
|
|
235
|
+
if (/\beval\s*\(/.test(content)) {
|
|
236
|
+
findings.push({
|
|
237
|
+
type: 'issue',
|
|
238
|
+
severity: 'critical',
|
|
239
|
+
file: path,
|
|
240
|
+
message: 'eval() usage detected - code injection risk',
|
|
241
|
+
category: 'security',
|
|
242
|
+
suggestion: 'Avoid eval() - use safer alternatives',
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// innerHTML
|
|
246
|
+
if (/\.innerHTML\s*=/.test(content)) {
|
|
247
|
+
findings.push({
|
|
248
|
+
type: 'issue',
|
|
249
|
+
severity: 'major',
|
|
250
|
+
file: path,
|
|
251
|
+
message: 'innerHTML assignment - XSS risk',
|
|
252
|
+
category: 'security',
|
|
253
|
+
suggestion: 'Use textContent or sanitize input',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return findings;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Check for test issues
|
|
260
|
+
*/
|
|
261
|
+
function checkTestIssues(path, content) {
|
|
262
|
+
const findings = [];
|
|
263
|
+
// Only check test files
|
|
264
|
+
if (!path.includes('test') && !path.includes('spec')) {
|
|
265
|
+
return findings;
|
|
266
|
+
}
|
|
267
|
+
// Empty test
|
|
268
|
+
if (/it\(['"][^'"]*['"]\s*,\s*\(\)\s*=>\s*\{\s*\}\)/.test(content)) {
|
|
269
|
+
findings.push({
|
|
270
|
+
type: 'issue',
|
|
271
|
+
severity: 'major',
|
|
272
|
+
file: path,
|
|
273
|
+
message: 'Empty test found',
|
|
274
|
+
category: 'test',
|
|
275
|
+
suggestion: 'Add assertions to the test',
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Test without assertion
|
|
279
|
+
if (/it\([^)]+\)/.test(content) && !/expect\(/.test(content)) {
|
|
280
|
+
findings.push({
|
|
281
|
+
type: 'suggestion',
|
|
282
|
+
severity: 'minor',
|
|
283
|
+
file: path,
|
|
284
|
+
message: 'Test may be missing assertions',
|
|
285
|
+
category: 'test',
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return findings;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Calculate score for aspect (0-100)
|
|
292
|
+
*/
|
|
293
|
+
function calculateAspectScore(findings) {
|
|
294
|
+
let score = 100;
|
|
295
|
+
for (const finding of findings) {
|
|
296
|
+
if (finding.type !== 'issue')
|
|
297
|
+
continue;
|
|
298
|
+
switch (finding.severity) {
|
|
299
|
+
case 'critical':
|
|
300
|
+
score -= 30;
|
|
301
|
+
break;
|
|
302
|
+
case 'major':
|
|
303
|
+
score -= 15;
|
|
304
|
+
break;
|
|
305
|
+
case 'minor':
|
|
306
|
+
score -= 5;
|
|
307
|
+
break;
|
|
308
|
+
case 'info':
|
|
309
|
+
score -= 1;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return Math.max(0, score);
|
|
314
|
+
}
|
|
315
|
+
// =============================================================================
|
|
316
|
+
// Result Merging
|
|
317
|
+
// =============================================================================
|
|
318
|
+
/**
|
|
319
|
+
* Merge results from all aspects
|
|
320
|
+
*/
|
|
321
|
+
export function mergeReviewResults(results, totalDuration) {
|
|
322
|
+
// Collect all findings
|
|
323
|
+
const allFindings = [];
|
|
324
|
+
for (const result of results) {
|
|
325
|
+
allFindings.push(...result.findings);
|
|
326
|
+
}
|
|
327
|
+
// Calculate totals
|
|
328
|
+
const totalTokens = results.reduce((sum, r) => sum + r.tokensUsed, 0);
|
|
329
|
+
// Determine verdict
|
|
330
|
+
const hasCritical = allFindings.some((f) => f.type === 'issue' && f.severity === 'critical');
|
|
331
|
+
const hasMajor = allFindings.some((f) => f.type === 'issue' && f.severity === 'major');
|
|
332
|
+
let verdict = 'approve';
|
|
333
|
+
if (hasCritical) {
|
|
334
|
+
verdict = 'request-changes';
|
|
335
|
+
}
|
|
336
|
+
else if (hasMajor) {
|
|
337
|
+
verdict = 'needs-discussion';
|
|
338
|
+
}
|
|
339
|
+
// Build summary
|
|
340
|
+
const summary = buildMergedSummary(results, allFindings, verdict);
|
|
341
|
+
return {
|
|
342
|
+
verdict,
|
|
343
|
+
approved: verdict === 'approve',
|
|
344
|
+
blocking: hasCritical,
|
|
345
|
+
aspects: results,
|
|
346
|
+
findings: allFindings,
|
|
347
|
+
summary,
|
|
348
|
+
totalTokens,
|
|
349
|
+
totalDuration,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Build summary from merged results
|
|
354
|
+
*/
|
|
355
|
+
function buildMergedSummary(results, findings, verdict) {
|
|
356
|
+
const parts = [];
|
|
357
|
+
// Verdict
|
|
358
|
+
switch (verdict) {
|
|
359
|
+
case 'approve':
|
|
360
|
+
parts.push('All aspects approved');
|
|
361
|
+
break;
|
|
362
|
+
case 'request-changes':
|
|
363
|
+
parts.push('Critical issues found - changes required');
|
|
364
|
+
break;
|
|
365
|
+
case 'needs-discussion':
|
|
366
|
+
parts.push('Major issues found - discussion needed');
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
// Per-aspect scores
|
|
370
|
+
const aspectScores = results.map((r) => `${r.aspect}: ${r.score}`);
|
|
371
|
+
parts.push(`Scores: ${aspectScores.join(', ')}`);
|
|
372
|
+
// Finding counts
|
|
373
|
+
const criticalCount = findings.filter((f) => f.type === 'issue' && f.severity === 'critical').length;
|
|
374
|
+
const majorCount = findings.filter((f) => f.type === 'issue' && f.severity === 'major').length;
|
|
375
|
+
const minorCount = findings.filter((f) => f.type === 'issue' && f.severity === 'minor').length;
|
|
376
|
+
if (criticalCount + majorCount + minorCount > 0) {
|
|
377
|
+
parts.push(`Issues: ${criticalCount} critical, ${majorCount} major, ${minorCount} minor`);
|
|
378
|
+
}
|
|
379
|
+
return parts.join('. ') + '.';
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Create empty result for no aspects
|
|
383
|
+
*/
|
|
384
|
+
function createEmptyResult() {
|
|
385
|
+
return {
|
|
386
|
+
verdict: 'approve',
|
|
387
|
+
approved: true,
|
|
388
|
+
blocking: false,
|
|
389
|
+
aspects: [],
|
|
390
|
+
findings: [],
|
|
391
|
+
summary: 'No review aspects enabled',
|
|
392
|
+
totalTokens: 0,
|
|
393
|
+
totalDuration: 0,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Estimate tokens from text
|
|
398
|
+
*/
|
|
399
|
+
function estimateTokens(text) {
|
|
400
|
+
return Math.ceil(text.length / 4);
|
|
401
|
+
}
|
|
402
|
+
// =============================================================================
|
|
403
|
+
// Formatting
|
|
404
|
+
// =============================================================================
|
|
405
|
+
/**
|
|
406
|
+
* Format merged result for display
|
|
407
|
+
*/
|
|
408
|
+
export function formatMergedResult(result) {
|
|
409
|
+
const lines = [];
|
|
410
|
+
// Header
|
|
411
|
+
const verdictEmoji = result.verdict === 'approve'
|
|
412
|
+
? '✅'
|
|
413
|
+
: result.verdict === 'request-changes'
|
|
414
|
+
? '🚫'
|
|
415
|
+
: '💬';
|
|
416
|
+
lines.push('## Parallel Review Results');
|
|
417
|
+
lines.push('');
|
|
418
|
+
lines.push(`**Verdict:** ${verdictEmoji} ${result.verdict}`);
|
|
419
|
+
lines.push(`**Duration:** ${result.totalDuration}ms`);
|
|
420
|
+
lines.push(`**Tokens Used:** ${result.totalTokens}`);
|
|
421
|
+
lines.push('');
|
|
422
|
+
// Per-aspect results
|
|
423
|
+
lines.push('### Aspect Scores');
|
|
424
|
+
lines.push('| Aspect | Score | Findings | Duration |');
|
|
425
|
+
lines.push('|--------|-------|----------|----------|');
|
|
426
|
+
for (const aspect of result.aspects) {
|
|
427
|
+
const statusEmoji = aspect.score >= 80 ? '✅' : aspect.score >= 50 ? '⚠️' : '🚫';
|
|
428
|
+
lines.push(`| ${aspect.aspect} | ${statusEmoji} ${aspect.score}/100 | ${aspect.findings.length} | ${aspect.duration}ms |`);
|
|
429
|
+
}
|
|
430
|
+
lines.push('');
|
|
431
|
+
// All findings grouped by aspect
|
|
432
|
+
if (result.findings.length > 0) {
|
|
433
|
+
lines.push('### All Findings');
|
|
434
|
+
for (const aspect of result.aspects) {
|
|
435
|
+
if (aspect.findings.length === 0)
|
|
436
|
+
continue;
|
|
437
|
+
lines.push(`#### ${aspect.aspect.charAt(0).toUpperCase() + aspect.aspect.slice(1)}`);
|
|
438
|
+
for (const finding of aspect.findings) {
|
|
439
|
+
const severityEmoji = {
|
|
440
|
+
critical: '🔴',
|
|
441
|
+
major: '🟠',
|
|
442
|
+
minor: '🟡',
|
|
443
|
+
info: '🔵',
|
|
444
|
+
}[finding.severity];
|
|
445
|
+
lines.push(`- ${severityEmoji} **[${finding.severity}]** \`${finding.file}\`: ${finding.message}`);
|
|
446
|
+
}
|
|
447
|
+
lines.push('');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
lines.push(`**Summary:** ${result.summary}`);
|
|
451
|
+
return lines.join('\n');
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Get default aspect configs
|
|
455
|
+
*/
|
|
456
|
+
export function getDefaultAspectConfigs() {
|
|
457
|
+
return DEFAULT_CONFIG.aspects.map((a) => ({ ...a }));
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=parallel-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-reviewer.js","sourceRoot":"","sources":["../../../src/core/agents/parallel-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reviewer Loop - v14.1.0
|
|
3
|
+
*
|
|
4
|
+
* Mandatory review integration for all Edit/Write operations.
|
|
5
|
+
* Spawns reviewer subagent to check code changes before commit.
|
|
6
|
+
*
|
|
7
|
+
* @see .claude/rules/dino/mandatory-review.md
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* File change to be reviewed
|
|
11
|
+
*/
|
|
12
|
+
export interface FileChange {
|
|
13
|
+
path: string;
|
|
14
|
+
operation: 'create' | 'modify' | 'delete';
|
|
15
|
+
content?: string;
|
|
16
|
+
diff?: string;
|
|
17
|
+
linesAdded: number;
|
|
18
|
+
linesRemoved: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Review finding from reviewer agent
|
|
22
|
+
*/
|
|
23
|
+
export interface ReviewFinding {
|
|
24
|
+
type: 'issue' | 'suggestion' | 'positive';
|
|
25
|
+
severity: 'critical' | 'major' | 'minor' | 'info';
|
|
26
|
+
file: string;
|
|
27
|
+
line?: number;
|
|
28
|
+
message: string;
|
|
29
|
+
category: 'security' | 'quality' | 'style' | 'performance' | 'test' | 'other';
|
|
30
|
+
suggestion?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Review result from reviewer agent
|
|
34
|
+
*/
|
|
35
|
+
export interface ReviewResult {
|
|
36
|
+
verdict: 'approve' | 'request-changes' | 'needs-discussion';
|
|
37
|
+
approved: boolean;
|
|
38
|
+
blocking: boolean;
|
|
39
|
+
findings: ReviewFinding[];
|
|
40
|
+
summary: string;
|
|
41
|
+
reviewerId: string;
|
|
42
|
+
timestamp: Date;
|
|
43
|
+
tokensUsed: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Review context for reviewer agent
|
|
47
|
+
*/
|
|
48
|
+
export interface ReviewContext {
|
|
49
|
+
changes: FileChange[];
|
|
50
|
+
focus?: string;
|
|
51
|
+
previousLearnings?: string[];
|
|
52
|
+
iteration?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reviewer loop configuration
|
|
56
|
+
*/
|
|
57
|
+
export interface ReviewerLoopConfig {
|
|
58
|
+
enabled: boolean;
|
|
59
|
+
blockOnCritical: boolean;
|
|
60
|
+
blockOnMajor: boolean;
|
|
61
|
+
includeStyle: boolean;
|
|
62
|
+
includeSecurity: boolean;
|
|
63
|
+
includeTests: boolean;
|
|
64
|
+
maxReviewTokens: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if mandatory review is enabled
|
|
68
|
+
*/
|
|
69
|
+
export declare function isReviewEnabled(config?: ReviewerLoopConfig): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Review changes using reviewer agent
|
|
72
|
+
*
|
|
73
|
+
* This is the main entry point for code review.
|
|
74
|
+
* Returns review result with findings and verdict.
|
|
75
|
+
*/
|
|
76
|
+
export declare function reviewChanges(changes: FileChange[], context: ReviewContext, config?: ReviewerLoopConfig): Promise<ReviewResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Build review prompt for subagent
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildReviewPrompt(changes: FileChange[], context: ReviewContext, config?: ReviewerLoopConfig): string;
|
|
81
|
+
/**
|
|
82
|
+
* Build Task tool spawn parameters for reviewer subagent
|
|
83
|
+
*/
|
|
84
|
+
export declare function buildReviewerSpawnParams(changes: FileChange[], context: ReviewContext, config?: ReviewerLoopConfig): {
|
|
85
|
+
description: string;
|
|
86
|
+
prompt: string;
|
|
87
|
+
subagent_type: string;
|
|
88
|
+
model: string;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Format review result for session.md
|
|
92
|
+
*/
|
|
93
|
+
export declare function formatReviewForSession(result: ReviewResult): string;
|
|
94
|
+
/**
|
|
95
|
+
* Extract learnings from review for next iteration
|
|
96
|
+
*/
|
|
97
|
+
export declare function extractLearningsFromReview(result: ReviewResult): string[];
|
|
98
|
+
/**
|
|
99
|
+
* Check if changes need review
|
|
100
|
+
*/
|
|
101
|
+
export declare function needsReview(changes: FileChange[], config?: ReviewerLoopConfig): boolean;
|
|
102
|
+
//# sourceMappingURL=reviewer-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer-loop.d.ts","sourceRoot":"","sources":["../../../src/core/agents/reviewer-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;IAC1C,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAyBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,qBAAiB,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,qBAAiB,GACtB,OAAO,CAAC,YAAY,CAAC,CAmCvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,qBAAiB,GACtB,MAAM,CAiFR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,qBAAiB,GACtB;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAOA;AAwMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyCnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAazE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,qBAAiB,GACtB,OAAO,CAcT"}
|