@claude-flow/cli 3.0.0-alpha.14 → 3.0.0-alpha.16

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 (66) hide show
  1. package/dist/src/commands/analyze.d.ts +19 -0
  2. package/dist/src/commands/analyze.d.ts.map +1 -0
  3. package/dist/src/commands/analyze.js +1819 -0
  4. package/dist/src/commands/analyze.js.map +1 -0
  5. package/dist/src/commands/doctor.d.ts.map +1 -1
  6. package/dist/src/commands/doctor.js +75 -2
  7. package/dist/src/commands/doctor.js.map +1 -1
  8. package/dist/src/commands/hooks.d.ts.map +1 -1
  9. package/dist/src/commands/hooks.js +325 -1
  10. package/dist/src/commands/hooks.js.map +1 -1
  11. package/dist/src/commands/index.d.ts +2 -0
  12. package/dist/src/commands/index.d.ts.map +1 -1
  13. package/dist/src/commands/index.js +12 -0
  14. package/dist/src/commands/index.js.map +1 -1
  15. package/dist/src/commands/route.d.ts +16 -0
  16. package/dist/src/commands/route.d.ts.map +1 -0
  17. package/dist/src/commands/route.js +597 -0
  18. package/dist/src/commands/route.js.map +1 -0
  19. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  20. package/dist/src/init/claudemd-generator.js +218 -362
  21. package/dist/src/init/claudemd-generator.js.map +1 -1
  22. package/dist/src/mcp-client.d.ts.map +1 -1
  23. package/dist/src/mcp-client.js +2 -0
  24. package/dist/src/mcp-client.js.map +1 -1
  25. package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
  26. package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -0
  27. package/dist/src/mcp-tools/analyze-tools.js +317 -0
  28. package/dist/src/mcp-tools/analyze-tools.js.map +1 -0
  29. package/dist/src/mcp-tools/index.d.ts +2 -0
  30. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  31. package/dist/src/mcp-tools/index.js +2 -0
  32. package/dist/src/mcp-tools/index.js.map +1 -1
  33. package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  34. package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
  35. package/dist/src/ruvector/ast-analyzer.js +277 -0
  36. package/dist/src/ruvector/ast-analyzer.js.map +1 -0
  37. package/dist/src/ruvector/coverage-router.d.ts +145 -0
  38. package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
  39. package/dist/src/ruvector/coverage-router.js +451 -0
  40. package/dist/src/ruvector/coverage-router.js.map +1 -0
  41. package/dist/src/ruvector/coverage-tools.d.ts +33 -0
  42. package/dist/src/ruvector/coverage-tools.d.ts.map +1 -0
  43. package/dist/src/ruvector/coverage-tools.js +157 -0
  44. package/dist/src/ruvector/coverage-tools.js.map +1 -0
  45. package/dist/src/ruvector/diff-classifier.d.ts +154 -0
  46. package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
  47. package/dist/src/ruvector/diff-classifier.js +508 -0
  48. package/dist/src/ruvector/diff-classifier.js.map +1 -0
  49. package/dist/src/ruvector/graph-analyzer.d.ts +174 -0
  50. package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
  51. package/dist/src/ruvector/graph-analyzer.js +878 -0
  52. package/dist/src/ruvector/graph-analyzer.js.map +1 -0
  53. package/dist/src/ruvector/index.d.ts +27 -0
  54. package/dist/src/ruvector/index.d.ts.map +1 -0
  55. package/dist/src/ruvector/index.js +47 -0
  56. package/dist/src/ruvector/index.js.map +1 -0
  57. package/dist/src/ruvector/q-learning-router.d.ts +211 -0
  58. package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
  59. package/dist/src/ruvector/q-learning-router.js +681 -0
  60. package/dist/src/ruvector/q-learning-router.js.map +1 -0
  61. package/dist/src/ruvector/vector-db.d.ts +69 -0
  62. package/dist/src/ruvector/vector-db.d.ts.map +1 -0
  63. package/dist/src/ruvector/vector-db.js +243 -0
  64. package/dist/src/ruvector/vector-db.js.map +1 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -1
  66. package/package.json +13 -1
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Coverage Router for Test Routing
3
+ */
4
+ const DEFAULT_CONFIG = {
5
+ minCoverage: 70,
6
+ targetCoverage: 85,
7
+ incremental: true,
8
+ coverageTypes: ['line', 'branch', 'function', 'statement'],
9
+ };
10
+ export class CoverageRouter {
11
+ config;
12
+ ruvectorEngine = null;
13
+ useNative = false;
14
+ coverageHistory = [];
15
+ constructor(config = {}) {
16
+ this.config = { ...DEFAULT_CONFIG, ...config };
17
+ }
18
+ async initialize() {
19
+ try {
20
+ // @ruvector/coverage is optional - gracefully fallback if not installed
21
+ const ruvector = await import('@ruvector/coverage').catch(() => null);
22
+ if (ruvector) {
23
+ this.ruvectorEngine = ruvector.createCoverageRouter?.(this.config);
24
+ this.useNative = !!this.ruvectorEngine;
25
+ }
26
+ }
27
+ catch {
28
+ this.useNative = false;
29
+ }
30
+ }
31
+ parseCoverage(data, format = 'json') {
32
+ switch (format) {
33
+ case 'lcov': return this.parseLcov(data);
34
+ case 'istanbul': return this.parseIstanbul(data);
35
+ case 'cobertura': return this.parseCobertura(data);
36
+ default: return this.parseJson(data);
37
+ }
38
+ }
39
+ route(coverage, changedFiles) {
40
+ const gaps = this.calculateGaps(coverage);
41
+ const targetFiles = this.prioritizeFiles(coverage, changedFiles);
42
+ const action = this.determineAction(coverage, gaps);
43
+ const priority = this.calculatePriority(coverage, changedFiles);
44
+ const testTypes = this.recommendTestTypes(gaps);
45
+ const estimatedEffort = this.estimateEffort(gaps);
46
+ const impactScore = this.calculateImpact(coverage, targetFiles);
47
+ return { action, priority, targetFiles, testTypes, gaps, estimatedEffort, impactScore };
48
+ }
49
+ getTrend() {
50
+ if (this.coverageHistory.length < 2)
51
+ return { direction: 'stable', change: 0 };
52
+ const recent = this.coverageHistory[this.coverageHistory.length - 1];
53
+ const previous = this.coverageHistory[this.coverageHistory.length - 2];
54
+ const change = recent.overall - previous.overall;
55
+ return { direction: change > 0.5 ? 'up' : change < -0.5 ? 'down' : 'stable', change };
56
+ }
57
+ addToHistory(report) {
58
+ this.coverageHistory.push(report);
59
+ if (this.coverageHistory.length > 10)
60
+ this.coverageHistory.shift();
61
+ }
62
+ getStats() {
63
+ return { useNative: this.useNative, historySize: this.coverageHistory.length, minCoverage: this.config.minCoverage, targetCoverage: this.config.targetCoverage };
64
+ }
65
+ parseLcov(data) {
66
+ const files = [];
67
+ let currentFile = null;
68
+ const lines = data.split('\n');
69
+ for (const line of lines) {
70
+ if (line.startsWith('SF:')) {
71
+ if (currentFile?.path)
72
+ files.push(this.finalizeFileCoverage(currentFile));
73
+ currentFile = { path: line.substring(3), uncoveredLines: [], totalLines: 0, coveredLines: 0 };
74
+ }
75
+ else if (line.startsWith('LF:')) {
76
+ if (currentFile)
77
+ currentFile.totalLines = parseInt(line.substring(3), 10);
78
+ }
79
+ else if (line.startsWith('LH:')) {
80
+ if (currentFile)
81
+ currentFile.coveredLines = parseInt(line.substring(3), 10);
82
+ }
83
+ else if (line.startsWith('DA:')) {
84
+ const [lineNum, hits] = line.substring(3).split(',').map(Number);
85
+ if (currentFile && hits === 0)
86
+ currentFile.uncoveredLines?.push(lineNum);
87
+ }
88
+ else if (line === 'end_of_record') {
89
+ if (currentFile?.path)
90
+ files.push(this.finalizeFileCoverage(currentFile));
91
+ currentFile = null;
92
+ }
93
+ }
94
+ return this.buildReport(files);
95
+ }
96
+ parseIstanbul(data) {
97
+ const files = [];
98
+ for (const [path, coverage] of Object.entries(data)) {
99
+ const cov = coverage;
100
+ const statements = cov.s;
101
+ const functions = cov.f;
102
+ const branches = cov.b;
103
+ const statementCovered = Object.values(statements).filter(v => v > 0).length;
104
+ const statementTotal = Object.values(statements).length;
105
+ const functionCovered = Object.values(functions).filter(v => v > 0).length;
106
+ const functionTotal = Object.values(functions).length;
107
+ const branchCovered = Object.values(branches).flat().filter(v => v > 0).length;
108
+ const branchTotal = Object.values(branches).flat().length;
109
+ files.push({
110
+ path, lineCoverage: statementTotal > 0 ? (statementCovered / statementTotal) * 100 : 100,
111
+ branchCoverage: branchTotal > 0 ? (branchCovered / branchTotal) * 100 : 100,
112
+ functionCoverage: functionTotal > 0 ? (functionCovered / functionTotal) * 100 : 100,
113
+ statementCoverage: statementTotal > 0 ? (statementCovered / statementTotal) * 100 : 100,
114
+ uncoveredLines: [], totalLines: statementTotal, coveredLines: statementCovered,
115
+ });
116
+ }
117
+ return this.buildReport(files);
118
+ }
119
+ parseCobertura(data) {
120
+ const files = [];
121
+ const classMatches = data.matchAll(/<class[^>]*filename="([^"]+)"[^>]*line-rate="([^"]+)"[^>]*branch-rate="([^"]+)"[^>]*>/g);
122
+ for (const match of classMatches) {
123
+ files.push({
124
+ path: match[1], lineCoverage: parseFloat(match[2]) * 100, branchCoverage: parseFloat(match[3]) * 100,
125
+ functionCoverage: parseFloat(match[2]) * 100, statementCoverage: parseFloat(match[2]) * 100,
126
+ uncoveredLines: [], totalLines: 0, coveredLines: 0,
127
+ });
128
+ }
129
+ return this.buildReport(files);
130
+ }
131
+ parseJson(data) {
132
+ if (Array.isArray(data))
133
+ return this.buildReport(data);
134
+ const files = [];
135
+ for (const [path, coverage] of Object.entries(data)) {
136
+ const cov = coverage;
137
+ files.push({
138
+ path, lineCoverage: cov.lineCoverage || 0, branchCoverage: cov.branchCoverage || 0,
139
+ functionCoverage: cov.functionCoverage || 0, statementCoverage: cov.statementCoverage || 0,
140
+ uncoveredLines: cov.uncoveredLines || [], totalLines: cov.totalLines || 0, coveredLines: cov.coveredLines || 0,
141
+ });
142
+ }
143
+ return this.buildReport(files);
144
+ }
145
+ finalizeFileCoverage(partial) {
146
+ const lineCoverage = partial.totalLines && partial.totalLines > 0 ? (partial.coveredLines || 0) / partial.totalLines * 100 : 100;
147
+ return { path: partial.path || 'unknown', lineCoverage, branchCoverage: lineCoverage, functionCoverage: lineCoverage, statementCoverage: lineCoverage, uncoveredLines: partial.uncoveredLines || [], totalLines: partial.totalLines || 0, coveredLines: partial.coveredLines || 0 };
148
+ }
149
+ buildReport(files) {
150
+ const totalLines = files.reduce((sum, f) => sum + f.totalLines, 0);
151
+ const coveredLines = files.reduce((sum, f) => sum + f.coveredLines, 0);
152
+ const overall = totalLines > 0 ? (coveredLines / totalLines) * 100 : 100;
153
+ const avgLine = files.length > 0 ? files.reduce((sum, f) => sum + f.lineCoverage, 0) / files.length : 100;
154
+ const avgBranch = files.length > 0 ? files.reduce((sum, f) => sum + f.branchCoverage, 0) / files.length : 100;
155
+ const avgFunction = files.length > 0 ? files.reduce((sum, f) => sum + f.functionCoverage, 0) / files.length : 100;
156
+ const avgStatement = files.length > 0 ? files.reduce((sum, f) => sum + f.statementCoverage, 0) / files.length : 100;
157
+ const sortedByLine = [...files].sort((a, b) => a.lineCoverage - b.lineCoverage);
158
+ return { overall, byType: { line: avgLine, branch: avgBranch, function: avgFunction, statement: avgStatement }, byFile: files, lowestCoverage: sortedByLine.slice(0, 5), highestCoverage: sortedByLine.slice(-5).reverse(), uncoveredCritical: this.findCriticalUncovered(files), timestamp: Date.now() };
159
+ }
160
+ findCriticalUncovered(files) {
161
+ const critical = [];
162
+ const criticalPatterns = [/auth/, /security/, /payment/, /core/, /main/, /index/];
163
+ for (const file of files) {
164
+ if (file.lineCoverage < this.config.minCoverage) {
165
+ for (const pattern of criticalPatterns) {
166
+ if (pattern.test(file.path)) {
167
+ critical.push(file.path);
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ }
173
+ return critical.slice(0, 10);
174
+ }
175
+ calculateGaps(coverage) {
176
+ const gaps = [];
177
+ for (const file of coverage.byFile) {
178
+ if (file.lineCoverage < this.config.targetCoverage) {
179
+ const gap = this.config.targetCoverage - file.lineCoverage;
180
+ gaps.push({ file: file.path, currentCoverage: file.lineCoverage, targetCoverage: this.config.targetCoverage, gap, suggestedTests: this.suggestTests(file) });
181
+ }
182
+ }
183
+ return gaps.sort((a, b) => b.gap - a.gap).slice(0, 10);
184
+ }
185
+ suggestTests(file) {
186
+ const suggestions = [];
187
+ if (file.uncoveredLines.length > 10)
188
+ suggestions.push('Add unit tests for uncovered code paths');
189
+ if (file.branchCoverage < 50)
190
+ suggestions.push('Add branch coverage tests (if/else paths)');
191
+ if (file.functionCoverage < 80)
192
+ suggestions.push('Add tests for untested functions');
193
+ if (/api|endpoint|route|handler/.test(file.path))
194
+ suggestions.push('Add integration tests for API endpoints');
195
+ return suggestions.slice(0, 3);
196
+ }
197
+ prioritizeFiles(coverage, changedFiles) {
198
+ let targetFiles = coverage.lowestCoverage.map(f => f.path);
199
+ if (changedFiles && changedFiles.length > 0) {
200
+ const changedWithLowCoverage = coverage.byFile.filter(f => changedFiles.some(cf => f.path.includes(cf))).filter(f => f.lineCoverage < this.config.targetCoverage).map(f => f.path);
201
+ targetFiles = [...new Set([...changedWithLowCoverage, ...targetFiles])];
202
+ }
203
+ return targetFiles.slice(0, 10);
204
+ }
205
+ determineAction(coverage, gaps) {
206
+ if (coverage.overall < this.config.minCoverage)
207
+ return 'prioritize';
208
+ if (gaps.length > 5)
209
+ return 'add-tests';
210
+ if (coverage.overall < this.config.targetCoverage)
211
+ return 'review-coverage';
212
+ return 'skip';
213
+ }
214
+ calculatePriority(coverage, changedFiles) {
215
+ let priority = 5;
216
+ if (coverage.overall < 50)
217
+ priority += 4;
218
+ else if (coverage.overall < 70)
219
+ priority += 2;
220
+ else if (coverage.overall < 85)
221
+ priority += 1;
222
+ priority += Math.min(3, coverage.uncoveredCritical.length);
223
+ if (changedFiles && changedFiles.length > 0) {
224
+ const changedLowCoverage = coverage.byFile.filter(f => changedFiles.some(cf => f.path.includes(cf))).filter(f => f.lineCoverage < this.config.minCoverage);
225
+ priority += Math.min(2, changedLowCoverage.length);
226
+ }
227
+ return Math.min(10, priority);
228
+ }
229
+ recommendTestTypes(gaps) {
230
+ const types = new Set(['unit']);
231
+ for (const gap of gaps) {
232
+ if (/api|endpoint|route|handler|service/.test(gap.file))
233
+ types.add('integration');
234
+ if (/page|component|view|ui/.test(gap.file))
235
+ types.add('e2e');
236
+ }
237
+ return Array.from(types);
238
+ }
239
+ estimateEffort(gaps) {
240
+ let effort = 0;
241
+ for (const gap of gaps)
242
+ effort += (gap.gap / 10) * 0.5;
243
+ return Math.round(effort * 10) / 10;
244
+ }
245
+ calculateImpact(coverage, targetFiles) {
246
+ const potentialGain = targetFiles.reduce((sum, file) => {
247
+ const fileCov = coverage.byFile.find(f => f.path === file);
248
+ return fileCov ? sum + (this.config.targetCoverage - fileCov.lineCoverage) : sum;
249
+ }, 0);
250
+ return Math.min(100, Math.round(potentialGain / targetFiles.length || 0));
251
+ }
252
+ }
253
+ export function createCoverageRouter(config) {
254
+ return new CoverageRouter(config);
255
+ }
256
+ /**
257
+ * Route a task based on coverage analysis
258
+ */
259
+ export async function coverageRoute(task, options = {}) {
260
+ const router = new CoverageRouter({
261
+ targetCoverage: options.threshold || 80,
262
+ });
263
+ // Try to load coverage data
264
+ const coverage = await loadProjectCoverage(options.projectRoot);
265
+ if (!coverage) {
266
+ return {
267
+ action: 'skip',
268
+ priority: 1,
269
+ targetFiles: [],
270
+ testTypes: ['unit'],
271
+ gaps: [],
272
+ estimatedEffort: 0,
273
+ impactScore: 0,
274
+ };
275
+ }
276
+ return router.route(coverage);
277
+ }
278
+ /**
279
+ * Suggest coverage improvements for a path
280
+ */
281
+ export async function coverageSuggest(path, options = {}) {
282
+ const limit = options.limit || 20;
283
+ const threshold = options.threshold || 80;
284
+ const coverage = await loadProjectCoverage(options.projectRoot);
285
+ if (!coverage) {
286
+ return {
287
+ path,
288
+ suggestions: [],
289
+ totalGap: 0,
290
+ estimatedEffort: 0,
291
+ };
292
+ }
293
+ // Filter files matching the path
294
+ const matchingFiles = coverage.byFile.filter(f => f.path.includes(path));
295
+ const belowThreshold = matchingFiles.filter(f => f.lineCoverage < threshold);
296
+ const suggestions = belowThreshold
297
+ .map(f => ({
298
+ file: f.path,
299
+ currentCoverage: f.lineCoverage,
300
+ targetCoverage: threshold,
301
+ gap: threshold - f.lineCoverage,
302
+ priority: calculateFilePriority(f.path, f.lineCoverage, threshold),
303
+ suggestedTests: suggestTestsForFile(f),
304
+ }))
305
+ .sort((a, b) => b.priority - a.priority)
306
+ .slice(0, limit);
307
+ const totalGap = suggestions.reduce((sum, s) => sum + s.gap, 0);
308
+ const estimatedEffort = totalGap * 0.1; // Rough estimate: 0.1 hours per % gap
309
+ return { path, suggestions, totalGap, estimatedEffort };
310
+ }
311
+ /**
312
+ * List all coverage gaps with agent assignments
313
+ */
314
+ export async function coverageGaps(options = {}) {
315
+ const threshold = options.threshold || 80;
316
+ const groupByAgent = options.groupByAgent !== false;
317
+ const coverage = await loadProjectCoverage(options.projectRoot);
318
+ if (!coverage) {
319
+ return {
320
+ totalGaps: 0,
321
+ gaps: [],
322
+ byAgent: {},
323
+ summary: 'No coverage data found',
324
+ };
325
+ }
326
+ const belowThreshold = coverage.byFile.filter(f => f.lineCoverage < threshold);
327
+ const gaps = belowThreshold.map(f => ({
328
+ file: f.path,
329
+ currentCoverage: f.lineCoverage,
330
+ targetCoverage: threshold,
331
+ gap: threshold - f.lineCoverage,
332
+ priority: calculateFilePriority(f.path, f.lineCoverage, threshold),
333
+ suggestedAgent: suggestAgentForFile(f.path),
334
+ }));
335
+ const byAgent = {};
336
+ if (groupByAgent) {
337
+ for (const gap of gaps) {
338
+ if (!byAgent[gap.suggestedAgent]) {
339
+ byAgent[gap.suggestedAgent] = [];
340
+ }
341
+ byAgent[gap.suggestedAgent].push(gap.file);
342
+ }
343
+ }
344
+ return {
345
+ totalGaps: gaps.length,
346
+ gaps,
347
+ byAgent,
348
+ summary: `${gaps.length} files below ${threshold}% coverage threshold`,
349
+ };
350
+ }
351
+ /**
352
+ * Load project coverage data (stub - implement based on project setup)
353
+ */
354
+ async function loadProjectCoverage(projectRoot) {
355
+ const { existsSync, readFileSync } = require('fs');
356
+ const { join } = require('path');
357
+ const root = projectRoot || process.cwd();
358
+ // Try common coverage locations
359
+ const coveragePaths = [
360
+ join(root, 'coverage', 'coverage-final.json'),
361
+ join(root, 'coverage', 'lcov.info'),
362
+ join(root, '.nyc_output', 'coverage.json'),
363
+ join(root, 'coverage.json'),
364
+ ];
365
+ for (const coveragePath of coveragePaths) {
366
+ if (existsSync(coveragePath)) {
367
+ try {
368
+ const content = readFileSync(coveragePath, 'utf-8');
369
+ const router = new CoverageRouter();
370
+ if (coveragePath.endsWith('.json')) {
371
+ return router.parseCoverage(JSON.parse(content), 'istanbul');
372
+ }
373
+ else if (coveragePath.endsWith('.info')) {
374
+ return router.parseCoverage(content, 'lcov');
375
+ }
376
+ }
377
+ catch {
378
+ // Continue to next path
379
+ }
380
+ }
381
+ }
382
+ return null;
383
+ }
384
+ /**
385
+ * Calculate priority for a file based on path and coverage
386
+ */
387
+ function calculateFilePriority(path, coverage, threshold) {
388
+ let priority = 5;
389
+ // Gap-based priority
390
+ const gap = threshold - coverage;
391
+ if (gap > 50)
392
+ priority += 3;
393
+ else if (gap > 30)
394
+ priority += 2;
395
+ else if (gap > 15)
396
+ priority += 1;
397
+ // Path-based priority
398
+ const lowerPath = path.toLowerCase();
399
+ if (/core|main|index/.test(lowerPath))
400
+ priority += 2;
401
+ if (/auth|security|payment/.test(lowerPath))
402
+ priority += 3;
403
+ if (/api|service|controller/.test(lowerPath))
404
+ priority += 1;
405
+ if (/util|helper/.test(lowerPath))
406
+ priority -= 1;
407
+ if (/test|spec|mock/.test(lowerPath))
408
+ priority -= 2;
409
+ return Math.max(1, Math.min(10, priority));
410
+ }
411
+ /**
412
+ * Suggest tests for a file based on its coverage
413
+ */
414
+ function suggestTestsForFile(file) {
415
+ const suggestions = [];
416
+ if (file.uncoveredLines.length > 10) {
417
+ suggestions.push('Add unit tests for uncovered code paths');
418
+ }
419
+ if (file.branchCoverage < 50) {
420
+ suggestions.push('Add branch coverage tests (if/else paths)');
421
+ }
422
+ if (file.functionCoverage < 80) {
423
+ suggestions.push('Add tests for untested functions');
424
+ }
425
+ const lowerPath = file.path.toLowerCase();
426
+ if (/api|endpoint|route|handler/.test(lowerPath)) {
427
+ suggestions.push('Add integration tests for API endpoints');
428
+ }
429
+ if (/component|view|ui/.test(lowerPath)) {
430
+ suggestions.push('Add component tests with user interactions');
431
+ }
432
+ return suggestions.slice(0, 3);
433
+ }
434
+ /**
435
+ * Suggest an agent type for a file
436
+ */
437
+ function suggestAgentForFile(path) {
438
+ const lowerPath = path.toLowerCase();
439
+ if (/api|endpoint|route|controller/.test(lowerPath))
440
+ return 'api-tester';
441
+ if (/component|view|ui|page/.test(lowerPath))
442
+ return 'ui-tester';
443
+ if (/service|repository|model/.test(lowerPath))
444
+ return 'unit-tester';
445
+ if (/integration|e2e/.test(lowerPath))
446
+ return 'e2e-tester';
447
+ if (/util|helper|lib/.test(lowerPath))
448
+ return 'unit-tester';
449
+ return 'tester';
450
+ }
451
+ //# sourceMappingURL=coverage-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-router.js","sourceRoot":"","sources":["../../../src/ruvector/coverage-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Coverage Router MCP Tools
3
+ *
4
+ * MCP tool implementations for coverage-aware routing.
5
+ * Integrates with hooks_coverage_route and hooks_coverage_suggest from ruvector.
6
+ */
7
+ import type { MCPTool } from '../mcp-tools/types.js';
8
+ /**
9
+ * Coverage-aware routing MCP tool
10
+ *
11
+ * Routes tasks to optimal agents based on test coverage gaps.
12
+ * Uses ruvector's hooks_coverage_route when available.
13
+ */
14
+ export declare const hooksCoverageRoute: MCPTool;
15
+ /**
16
+ * Coverage suggestions MCP tool
17
+ *
18
+ * Suggests which files need better coverage in a given path.
19
+ * Uses ruvector's hooks_coverage_suggest when available.
20
+ */
21
+ export declare const hooksCoverageSuggest: MCPTool;
22
+ /**
23
+ * Coverage gaps MCP tool
24
+ *
25
+ * Lists all coverage gaps in the project with agent assignments.
26
+ */
27
+ export declare const hooksCoverageGaps: MCPTool;
28
+ /**
29
+ * All coverage router MCP tools
30
+ */
31
+ export declare const coverageRouterTools: MCPTool[];
32
+ export default coverageRouterTools;
33
+ //# sourceMappingURL=coverage-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-tools.d.ts","sourceRoot":"","sources":["../../../src/ruvector/coverage-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAUrD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,OAuChC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,OA6ClC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAuC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,OAAO,EAIxC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}