dino-spec 13.6.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.
Files changed (231) hide show
  1. package/README.md +118 -5
  2. package/dist/commands/hud.d.ts +1 -8
  3. package/dist/commands/hud.d.ts.map +1 -1
  4. package/dist/commands/hud.js +4 -18
  5. package/dist/commands/hud.js.map +1 -1
  6. package/dist/core/agents/ambiguity-resolver.d.ts +118 -0
  7. package/dist/core/agents/ambiguity-resolver.d.ts.map +1 -0
  8. package/dist/core/agents/ambiguity-resolver.js +327 -0
  9. package/dist/core/agents/ambiguity-resolver.js.map +1 -0
  10. package/dist/core/agents/confidence-gate.d.ts +99 -0
  11. package/dist/core/agents/confidence-gate.d.ts.map +1 -0
  12. package/dist/core/agents/confidence-gate.js +295 -0
  13. package/dist/core/agents/confidence-gate.js.map +1 -0
  14. package/dist/core/agents/feedback-collector.d.ts +108 -0
  15. package/dist/core/agents/feedback-collector.d.ts.map +1 -0
  16. package/dist/core/agents/feedback-collector.js +313 -0
  17. package/dist/core/agents/feedback-collector.js.map +1 -0
  18. package/dist/core/agents/parallel-reviewer.d.ts +88 -0
  19. package/dist/core/agents/parallel-reviewer.d.ts.map +1 -0
  20. package/dist/core/agents/parallel-reviewer.js +459 -0
  21. package/dist/core/agents/parallel-reviewer.js.map +1 -0
  22. package/dist/core/agents/reviewer-loop.d.ts +102 -0
  23. package/dist/core/agents/reviewer-loop.d.ts.map +1 -0
  24. package/dist/core/agents/reviewer-loop.js +373 -0
  25. package/dist/core/agents/reviewer-loop.js.map +1 -0
  26. package/dist/core/agents/skill-auditor.d.ts +82 -0
  27. package/dist/core/agents/skill-auditor.d.ts.map +1 -0
  28. package/dist/core/agents/skill-auditor.js +278 -0
  29. package/dist/core/agents/skill-auditor.js.map +1 -0
  30. package/dist/core/config/feature-flags.d.ts +25 -1
  31. package/dist/core/config/feature-flags.d.ts.map +1 -1
  32. package/dist/core/config/feature-flags.js +7 -1
  33. package/dist/core/config/feature-flags.js.map +1 -1
  34. package/dist/core/context/__tests__/budget-thresholds.test.d.ts +5 -0
  35. package/dist/core/context/__tests__/budget-thresholds.test.d.ts.map +1 -0
  36. package/dist/core/context/__tests__/budget-thresholds.test.js +223 -0
  37. package/dist/core/context/__tests__/budget-thresholds.test.js.map +1 -0
  38. package/dist/core/context/__tests__/compaction-engine.test.d.ts +5 -0
  39. package/dist/core/context/__tests__/compaction-engine.test.d.ts.map +1 -0
  40. package/dist/core/context/__tests__/compaction-engine.test.js +474 -0
  41. package/dist/core/context/__tests__/compaction-engine.test.js.map +1 -0
  42. package/dist/core/context/__tests__/output-persistence.test.d.ts +5 -0
  43. package/dist/core/context/__tests__/output-persistence.test.d.ts.map +1 -0
  44. package/dist/core/context/__tests__/output-persistence.test.js +246 -0
  45. package/dist/core/context/__tests__/output-persistence.test.js.map +1 -0
  46. package/dist/core/context/auto-injection-engine.d.ts +10 -1
  47. package/dist/core/context/auto-injection-engine.d.ts.map +1 -1
  48. package/dist/core/context/auto-injection-engine.js +45 -2
  49. package/dist/core/context/auto-injection-engine.js.map +1 -1
  50. package/dist/core/context/budget-thresholds.d.ts +167 -0
  51. package/dist/core/context/budget-thresholds.d.ts.map +1 -0
  52. package/dist/core/context/budget-thresholds.js +234 -0
  53. package/dist/core/context/budget-thresholds.js.map +1 -0
  54. package/dist/core/context/compaction-engine.d.ts +193 -0
  55. package/dist/core/context/compaction-engine.d.ts.map +1 -0
  56. package/dist/core/context/compaction-engine.js +376 -0
  57. package/dist/core/context/compaction-engine.js.map +1 -0
  58. package/dist/core/context/context-health.d.ts +27 -2
  59. package/dist/core/context/context-health.d.ts.map +1 -1
  60. package/dist/core/context/context-health.js +98 -12
  61. package/dist/core/context/context-health.js.map +1 -1
  62. package/dist/core/context/focus-resource-loader.d.ts +143 -0
  63. package/dist/core/context/focus-resource-loader.d.ts.map +1 -0
  64. package/dist/core/context/focus-resource-loader.js +305 -0
  65. package/dist/core/context/focus-resource-loader.js.map +1 -0
  66. package/dist/core/context/index.d.ts +10 -5
  67. package/dist/core/context/index.d.ts.map +1 -1
  68. package/dist/core/context/index.js +40 -5
  69. package/dist/core/context/index.js.map +1 -1
  70. package/dist/core/context/lazy-loader.d.ts +44 -1
  71. package/dist/core/context/lazy-loader.d.ts.map +1 -1
  72. package/dist/core/context/lazy-loader.js +59 -1
  73. package/dist/core/context/lazy-loader.js.map +1 -1
  74. package/dist/core/context/output-persistence.d.ts +142 -0
  75. package/dist/core/context/output-persistence.d.ts.map +1 -0
  76. package/dist/core/context/output-persistence.js +242 -0
  77. package/dist/core/context/output-persistence.js.map +1 -0
  78. package/dist/core/context-repl/__tests__/repl-environment.test.d.ts +7 -0
  79. package/dist/core/context-repl/__tests__/repl-environment.test.d.ts.map +1 -0
  80. package/dist/core/context-repl/__tests__/repl-environment.test.js +335 -0
  81. package/dist/core/context-repl/__tests__/repl-environment.test.js.map +1 -0
  82. package/dist/core/context-repl/context-window-monitor.d.ts +181 -0
  83. package/dist/core/context-repl/context-window-monitor.d.ts.map +1 -0
  84. package/dist/core/context-repl/context-window-monitor.js +309 -0
  85. package/dist/core/context-repl/context-window-monitor.js.map +1 -0
  86. package/dist/core/context-repl/index.d.ts +8 -3
  87. package/dist/core/context-repl/index.d.ts.map +1 -1
  88. package/dist/core/context-repl/index.js +11 -3
  89. package/dist/core/context-repl/index.js.map +1 -1
  90. package/dist/core/context-repl/repl-environment.d.ts +66 -0
  91. package/dist/core/context-repl/repl-environment.d.ts.map +1 -0
  92. package/dist/core/context-repl/repl-environment.js +795 -0
  93. package/dist/core/context-repl/repl-environment.js.map +1 -0
  94. package/dist/core/context-repl/types.d.ts +277 -1
  95. package/dist/core/context-repl/types.d.ts.map +1 -1
  96. package/dist/core/context-repl/types.js +52 -1
  97. package/dist/core/context-repl/types.js.map +1 -1
  98. package/dist/core/environment/__tests__/pre-verify.test.d.ts +5 -0
  99. package/dist/core/environment/__tests__/pre-verify.test.d.ts.map +1 -0
  100. package/dist/core/environment/__tests__/pre-verify.test.js +343 -0
  101. package/dist/core/environment/__tests__/pre-verify.test.js.map +1 -0
  102. package/dist/core/environment/index.d.ts +8 -0
  103. package/dist/core/environment/index.d.ts.map +1 -0
  104. package/dist/core/environment/index.js +7 -0
  105. package/dist/core/environment/index.js.map +1 -0
  106. package/dist/core/environment/pre-verify.d.ts +63 -0
  107. package/dist/core/environment/pre-verify.d.ts.map +1 -0
  108. package/dist/core/environment/pre-verify.js +221 -0
  109. package/dist/core/environment/pre-verify.js.map +1 -0
  110. package/dist/core/environment/types.d.ts +37 -0
  111. package/dist/core/environment/types.d.ts.map +1 -0
  112. package/dist/core/environment/types.js +5 -0
  113. package/dist/core/environment/types.js.map +1 -0
  114. package/dist/core/generator/claude-md.js +1 -1
  115. package/dist/core/intelligence/context-budget.d.ts +10 -5
  116. package/dist/core/intelligence/context-budget.d.ts.map +1 -1
  117. package/dist/core/intelligence/context-budget.js +12 -5
  118. package/dist/core/intelligence/context-budget.js.map +1 -1
  119. package/dist/core/provider/storage.d.ts.map +1 -1
  120. package/dist/core/provider/storage.js +1 -2
  121. package/dist/core/provider/storage.js.map +1 -1
  122. package/dist/hooks/post-edit.js +73 -0
  123. package/dist/hooks/post-edit.js.map +1 -1
  124. package/dist/hooks/session-start.js +115 -0
  125. package/dist/hooks/session-start.js.map +1 -1
  126. package/dist/hooks/types.js +1 -1
  127. package/dist/hooks/user-prompt-submit.js +100 -0
  128. package/dist/hooks/user-prompt-submit.js.map +1 -1
  129. package/dist/hud/config.d.ts +3 -28
  130. package/dist/hud/config.d.ts.map +1 -1
  131. package/dist/hud/config.js +8 -60
  132. package/dist/hud/config.js.map +1 -1
  133. package/dist/hud/index.d.ts.map +1 -1
  134. package/dist/hud/index.js +0 -1
  135. package/dist/hud/index.js.map +1 -1
  136. package/dist/hud/render/budget-bar.d.ts +0 -2
  137. package/dist/hud/render/budget-bar.d.ts.map +1 -1
  138. package/dist/hud/render/budget-bar.js +5 -8
  139. package/dist/hud/render/budget-bar.js.map +1 -1
  140. package/dist/hud/stdin.d.ts +0 -3
  141. package/dist/hud/stdin.d.ts.map +1 -1
  142. package/dist/hud/stdin.js +2 -29
  143. package/dist/hud/stdin.js.map +1 -1
  144. package/dist/hud/types.d.ts +0 -2
  145. package/dist/hud/types.d.ts.map +1 -1
  146. package/dist/mcp/__tests__/dynamic-updates.test.d.ts +5 -0
  147. package/dist/mcp/__tests__/dynamic-updates.test.d.ts.map +1 -0
  148. package/dist/mcp/__tests__/dynamic-updates.test.js +314 -0
  149. package/dist/mcp/__tests__/dynamic-updates.test.js.map +1 -0
  150. package/dist/mcp/dynamic-updates.d.ts +167 -0
  151. package/dist/mcp/dynamic-updates.d.ts.map +1 -0
  152. package/dist/mcp/dynamic-updates.js +313 -0
  153. package/dist/mcp/dynamic-updates.js.map +1 -0
  154. package/dist/mcp/focus-filter.d.ts +74 -0
  155. package/dist/mcp/focus-filter.d.ts.map +1 -0
  156. package/dist/mcp/focus-filter.js +229 -0
  157. package/dist/mcp/focus-filter.js.map +1 -0
  158. package/dist/mcp/index.d.ts +4 -2
  159. package/dist/mcp/index.d.ts.map +1 -1
  160. package/dist/mcp/index.js +5 -2
  161. package/dist/mcp/index.js.map +1 -1
  162. package/dist/mcp/registry.d.ts +4 -4
  163. package/dist/mcp/registry.d.ts.map +1 -1
  164. package/dist/mcp/registry.js +17 -16
  165. package/dist/mcp/registry.js.map +1 -1
  166. package/dist/mcp/server.d.ts +2 -1
  167. package/dist/mcp/server.d.ts.map +1 -1
  168. package/dist/mcp/server.js +12 -3
  169. package/dist/mcp/server.js.map +1 -1
  170. package/dist/mcp/tool-tiers.d.ts.map +1 -1
  171. package/dist/mcp/tool-tiers.js +5 -0
  172. package/dist/mcp/tool-tiers.js.map +1 -1
  173. package/dist/mcp/tools/__tests__/environment.test.d.ts +5 -0
  174. package/dist/mcp/tools/__tests__/environment.test.d.ts.map +1 -0
  175. package/dist/mcp/tools/__tests__/environment.test.js +219 -0
  176. package/dist/mcp/tools/__tests__/environment.test.js.map +1 -0
  177. package/dist/mcp/tools/auto-inject.d.ts +36 -0
  178. package/dist/mcp/tools/auto-inject.d.ts.map +1 -0
  179. package/dist/mcp/tools/auto-inject.js +143 -0
  180. package/dist/mcp/tools/auto-inject.js.map +1 -0
  181. package/dist/mcp/tools/auto-unload.d.ts +29 -0
  182. package/dist/mcp/tools/auto-unload.d.ts.map +1 -0
  183. package/dist/mcp/tools/auto-unload.js +151 -0
  184. package/dist/mcp/tools/auto-unload.js.map +1 -0
  185. package/dist/mcp/tools/context-repl.d.ts +48 -0
  186. package/dist/mcp/tools/context-repl.d.ts.map +1 -0
  187. package/dist/mcp/tools/context-repl.js +290 -0
  188. package/dist/mcp/tools/context-repl.js.map +1 -0
  189. package/dist/mcp/tools/environment.d.ts +27 -0
  190. package/dist/mcp/tools/environment.d.ts.map +1 -0
  191. package/dist/mcp/tools/environment.js +97 -0
  192. package/dist/mcp/tools/environment.js.map +1 -0
  193. package/dist/mcp/tools/feedback.d.ts +63 -0
  194. package/dist/mcp/tools/feedback.d.ts.map +1 -0
  195. package/dist/mcp/tools/feedback.js +255 -0
  196. package/dist/mcp/tools/feedback.js.map +1 -0
  197. package/dist/mcp/tools/health.d.ts +29 -0
  198. package/dist/mcp/tools/health.d.ts.map +1 -0
  199. package/dist/mcp/tools/health.js +171 -0
  200. package/dist/mcp/tools/health.js.map +1 -0
  201. package/dist/mcp/tools/index.d.ts +9 -2
  202. package/dist/mcp/tools/index.d.ts.map +1 -1
  203. package/dist/mcp/tools/index.js +37 -2
  204. package/dist/mcp/tools/index.js.map +1 -1
  205. package/dist/mcp/tools/output-persistence.d.ts +44 -0
  206. package/dist/mcp/tools/output-persistence.d.ts.map +1 -0
  207. package/dist/mcp/tools/output-persistence.js +208 -0
  208. package/dist/mcp/tools/output-persistence.js.map +1 -0
  209. package/dist/mcp-server.d.ts +2 -1
  210. package/dist/mcp-server.d.ts.map +1 -1
  211. package/dist/mcp-server.js +36 -7
  212. package/dist/mcp-server.js.map +1 -1
  213. package/dist/rules/index.js +2 -2
  214. package/dist/utils/exec.js +2 -2
  215. package/dist/utils/exec.js.map +1 -1
  216. package/dist/utils/gitignore.d.ts.map +1 -1
  217. package/dist/utils/gitignore.js +5 -0
  218. package/dist/utils/gitignore.js.map +1 -1
  219. package/package.json +76 -77
  220. package/dist/hud/config-tui.d.ts +0 -25
  221. package/dist/hud/config-tui.d.ts.map +0 -1
  222. package/dist/hud/config-tui.js +0 -199
  223. package/dist/hud/config-tui.js.map +0 -1
  224. package/dist/hud/models.d.ts +0 -58
  225. package/dist/hud/models.d.ts.map +0 -1
  226. package/dist/hud/models.js +0 -124
  227. package/dist/hud/models.js.map +0 -1
  228. package/dist/hud/token-estimator.d.ts +0 -79
  229. package/dist/hud/token-estimator.d.ts.map +0 -1
  230. package/dist/hud/token-estimator.js +0 -126
  231. package/dist/hud/token-estimator.js.map +0 -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"}