driftdetect 0.4.7 → 0.6.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 (92) hide show
  1. package/dist/bin/drift.js +37 -1
  2. package/dist/bin/drift.js.map +1 -1
  3. package/dist/commands/approve.d.ts +20 -0
  4. package/dist/commands/approve.d.ts.map +1 -1
  5. package/dist/commands/approve.js +38 -72
  6. package/dist/commands/approve.js.map +1 -1
  7. package/dist/commands/check.d.ts +41 -0
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +21 -11
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/constraints.d.ts +17 -0
  12. package/dist/commands/constraints.d.ts.map +1 -0
  13. package/dist/commands/constraints.js +686 -0
  14. package/dist/commands/constraints.js.map +1 -0
  15. package/dist/commands/coupling.d.ts +17 -0
  16. package/dist/commands/coupling.d.ts.map +1 -0
  17. package/dist/commands/coupling.js +726 -0
  18. package/dist/commands/coupling.js.map +1 -0
  19. package/dist/commands/decisions.d.ts +19 -0
  20. package/dist/commands/decisions.d.ts.map +1 -0
  21. package/dist/commands/decisions.js +771 -0
  22. package/dist/commands/decisions.js.map +1 -0
  23. package/dist/commands/error-handling.d.ts +15 -0
  24. package/dist/commands/error-handling.d.ts.map +1 -0
  25. package/dist/commands/error-handling.js +608 -0
  26. package/dist/commands/error-handling.js.map +1 -0
  27. package/dist/commands/export.d.ts +16 -0
  28. package/dist/commands/export.d.ts.map +1 -1
  29. package/dist/commands/export.js +46 -50
  30. package/dist/commands/export.js.map +1 -1
  31. package/dist/commands/files.d.ts +15 -0
  32. package/dist/commands/files.d.ts.map +1 -1
  33. package/dist/commands/files.js +27 -48
  34. package/dist/commands/files.js.map +1 -1
  35. package/dist/commands/go.d.ts +21 -0
  36. package/dist/commands/go.d.ts.map +1 -0
  37. package/dist/commands/go.js +530 -0
  38. package/dist/commands/go.js.map +1 -0
  39. package/dist/commands/ignore.d.ts +20 -0
  40. package/dist/commands/ignore.d.ts.map +1 -1
  41. package/dist/commands/ignore.js +25 -48
  42. package/dist/commands/ignore.js.map +1 -1
  43. package/dist/commands/index.d.ts +11 -0
  44. package/dist/commands/index.d.ts.map +1 -1
  45. package/dist/commands/index.js +15 -0
  46. package/dist/commands/index.js.map +1 -1
  47. package/dist/commands/migrate-storage.d.ts +23 -0
  48. package/dist/commands/migrate-storage.d.ts.map +1 -0
  49. package/dist/commands/migrate-storage.js +337 -0
  50. package/dist/commands/migrate-storage.js.map +1 -0
  51. package/dist/commands/report.d.ts +22 -0
  52. package/dist/commands/report.d.ts.map +1 -1
  53. package/dist/commands/report.js +19 -10
  54. package/dist/commands/report.js.map +1 -1
  55. package/dist/commands/scan.d.ts +2 -0
  56. package/dist/commands/scan.d.ts.map +1 -1
  57. package/dist/commands/scan.js +134 -3
  58. package/dist/commands/scan.js.map +1 -1
  59. package/dist/commands/simulate.d.ts +17 -0
  60. package/dist/commands/simulate.d.ts.map +1 -0
  61. package/dist/commands/simulate.js +253 -0
  62. package/dist/commands/simulate.js.map +1 -0
  63. package/dist/commands/skills.d.ts +16 -0
  64. package/dist/commands/skills.d.ts.map +1 -0
  65. package/dist/commands/skills.js +409 -0
  66. package/dist/commands/skills.js.map +1 -0
  67. package/dist/commands/status.d.ts +20 -0
  68. package/dist/commands/status.d.ts.map +1 -1
  69. package/dist/commands/status.js +74 -72
  70. package/dist/commands/status.js.map +1 -1
  71. package/dist/commands/test-topology.d.ts +15 -0
  72. package/dist/commands/test-topology.d.ts.map +1 -0
  73. package/dist/commands/test-topology.js +589 -0
  74. package/dist/commands/test-topology.js.map +1 -0
  75. package/dist/commands/where.d.ts +15 -0
  76. package/dist/commands/where.d.ts.map +1 -1
  77. package/dist/commands/where.js +41 -88
  78. package/dist/commands/where.js.map +1 -1
  79. package/dist/commands/wpf.d.ts +21 -0
  80. package/dist/commands/wpf.d.ts.map +1 -0
  81. package/dist/commands/wpf.js +632 -0
  82. package/dist/commands/wpf.js.map +1 -0
  83. package/dist/commands/wrappers.d.ts +16 -0
  84. package/dist/commands/wrappers.d.ts.map +1 -0
  85. package/dist/commands/wrappers.js +181 -0
  86. package/dist/commands/wrappers.js.map +1 -0
  87. package/dist/services/pattern-service-factory.d.ts +37 -0
  88. package/dist/services/pattern-service-factory.d.ts.map +1 -0
  89. package/dist/services/pattern-service-factory.js +41 -0
  90. package/dist/services/pattern-service-factory.js.map +1 -0
  91. package/package.json +35 -23
  92. package/LICENSE +0 -21
@@ -0,0 +1,589 @@
1
+ /**
2
+ * Test Topology Command - drift test-topology
3
+ *
4
+ * Analyze test-to-code mappings, mock patterns, and test quality.
5
+ * Answers: "Which tests cover this code?" and "What's the minimum test set?"
6
+ */
7
+ import { Command } from 'commander';
8
+ import * as fs from 'node:fs/promises';
9
+ import * as path from 'node:path';
10
+ import chalk from 'chalk';
11
+ import { createTestTopologyAnalyzer, createCallGraphAnalyzer, } from 'driftdetect-core';
12
+ import { createSpinner } from '../ui/spinner.js';
13
+ const DRIFT_DIR = '.drift';
14
+ const TEST_TOPOLOGY_DIR = 'test-topology';
15
+ /**
16
+ * Test file patterns (regex)
17
+ */
18
+ const TEST_FILE_PATTERNS = [
19
+ /\.test\.[jt]sx?$/,
20
+ /\.spec\.[jt]sx?$/,
21
+ /_test\.py$/,
22
+ /test_.*\.py$/,
23
+ /Test\.java$/,
24
+ /Tests\.java$/,
25
+ /Test\.cs$/,
26
+ /Tests\.cs$/,
27
+ /Test\.php$/,
28
+ ];
29
+ /**
30
+ * Directories to skip
31
+ */
32
+ const SKIP_DIRS = new Set([
33
+ 'node_modules', 'vendor', 'dist', 'build', '.git', '.drift',
34
+ '__pycache__', '.venv', 'venv', 'target', 'bin', 'obj',
35
+ ]);
36
+ /**
37
+ * Check if a filename matches test file patterns
38
+ */
39
+ function isTestFile(filename) {
40
+ return TEST_FILE_PATTERNS.some(pattern => pattern.test(filename));
41
+ }
42
+ /**
43
+ * Recursively find test files
44
+ */
45
+ async function findTestFiles(rootDir, subDir = '') {
46
+ const testFiles = [];
47
+ const currentDir = path.join(rootDir, subDir);
48
+ try {
49
+ const entries = await fs.readdir(currentDir, { withFileTypes: true });
50
+ for (const entry of entries) {
51
+ if (SKIP_DIRS.has(entry.name))
52
+ continue;
53
+ const relativePath = path.join(subDir, entry.name);
54
+ if (entry.isDirectory()) {
55
+ const subFiles = await findTestFiles(rootDir, relativePath);
56
+ testFiles.push(...subFiles);
57
+ }
58
+ else if (entry.isFile() && isTestFile(entry.name)) {
59
+ testFiles.push(relativePath);
60
+ }
61
+ }
62
+ }
63
+ catch {
64
+ // Directory not readable, skip
65
+ }
66
+ return testFiles;
67
+ }
68
+ /**
69
+ * Check if test topology data exists
70
+ */
71
+ async function topologyExists(rootDir) {
72
+ try {
73
+ await fs.access(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'));
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * Show helpful message when topology not built
82
+ */
83
+ function showNotBuiltMessage() {
84
+ console.log();
85
+ console.log(chalk.yellow('⚠️ No test topology built yet.'));
86
+ console.log();
87
+ console.log(chalk.gray('Build test topology to analyze test coverage:'));
88
+ console.log();
89
+ console.log(chalk.cyan(' drift test-topology build'));
90
+ console.log();
91
+ }
92
+ /**
93
+ * Build subcommand - analyze test files and build mappings
94
+ */
95
+ async function buildAction(options) {
96
+ const rootDir = process.cwd();
97
+ const format = options.format ?? 'text';
98
+ const isTextFormat = format === 'text';
99
+ try {
100
+ if (isTextFormat) {
101
+ console.log();
102
+ console.log(chalk.bold('🧪 Building Test Topology'));
103
+ console.log(chalk.gray('═'.repeat(50)));
104
+ }
105
+ const spinner = isTextFormat ? createSpinner('Initializing...') : null;
106
+ spinner?.start();
107
+ // Initialize analyzer with available parsers
108
+ spinner?.text('Loading parsers...');
109
+ const analyzer = createTestTopologyAnalyzer({});
110
+ // Try to load call graph for transitive analysis
111
+ spinner?.text('Loading call graph...');
112
+ try {
113
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
114
+ await callGraphAnalyzer.initialize();
115
+ const graph = callGraphAnalyzer.getGraph();
116
+ if (graph) {
117
+ analyzer.setCallGraph(graph);
118
+ if (isTextFormat) {
119
+ spinner?.text('Call graph loaded for transitive analysis');
120
+ }
121
+ }
122
+ }
123
+ catch {
124
+ if (isTextFormat) {
125
+ spinner?.text('No call graph found, using direct analysis only');
126
+ }
127
+ }
128
+ // Find test files
129
+ spinner?.text('Finding test files...');
130
+ const testFiles = await findTestFiles(rootDir);
131
+ if (testFiles.length === 0) {
132
+ spinner?.stop();
133
+ if (format === 'json') {
134
+ console.log(JSON.stringify({ error: 'No test files found' }));
135
+ }
136
+ else {
137
+ console.log(chalk.yellow('\n⚠️ No test files found matching common patterns.'));
138
+ }
139
+ return;
140
+ }
141
+ // Extract tests from each file
142
+ spinner?.text(`Extracting tests from ${testFiles.length} files...`);
143
+ let extractedCount = 0;
144
+ let errorCount = 0;
145
+ for (const testFile of testFiles) {
146
+ try {
147
+ const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
148
+ const extraction = analyzer.extractFromFile(content, testFile);
149
+ if (extraction) {
150
+ extractedCount++;
151
+ }
152
+ }
153
+ catch (err) {
154
+ errorCount++;
155
+ if (options.verbose) {
156
+ console.error(`Error extracting ${testFile}:`, err);
157
+ }
158
+ }
159
+ }
160
+ // Build mappings
161
+ spinner?.text('Building test-to-code mappings...');
162
+ analyzer.buildMappings();
163
+ // Get results
164
+ const summary = analyzer.getSummary();
165
+ const mockAnalysis = analyzer.analyzeMocks();
166
+ // Save results
167
+ spinner?.text('Saving results...');
168
+ const topologyDir = path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR);
169
+ await fs.mkdir(topologyDir, { recursive: true });
170
+ await fs.writeFile(path.join(topologyDir, 'summary.json'), JSON.stringify({ summary, mockAnalysis, generatedAt: new Date().toISOString() }, null, 2));
171
+ spinner?.stop();
172
+ // Output
173
+ if (format === 'json') {
174
+ console.log(JSON.stringify({
175
+ success: true,
176
+ filesScanned: testFiles.length,
177
+ filesExtracted: extractedCount,
178
+ errors: errorCount,
179
+ summary,
180
+ mockAnalysis,
181
+ }, null, 2));
182
+ return;
183
+ }
184
+ // Text output
185
+ console.log();
186
+ console.log(chalk.green.bold('✓ Test topology built successfully'));
187
+ console.log();
188
+ formatSummary(summary);
189
+ formatMockAnalysis(mockAnalysis);
190
+ console.log(chalk.gray('─'.repeat(50)));
191
+ console.log(chalk.bold('📌 Next Steps:'));
192
+ console.log(chalk.gray(` • drift test-topology status ${chalk.white('View test coverage summary')}`));
193
+ console.log(chalk.gray(` • drift test-topology uncovered ${chalk.white('Find untested functions')}`));
194
+ console.log(chalk.gray(` • drift test-topology mocks ${chalk.white('Analyze mock patterns')}`));
195
+ console.log(chalk.gray(` • drift test-topology affected ${chalk.white('Get minimum test set for changes')}`));
196
+ console.log();
197
+ }
198
+ catch (error) {
199
+ if (format === 'json') {
200
+ console.log(JSON.stringify({ error: String(error) }));
201
+ }
202
+ else {
203
+ console.log(chalk.red(`\n❌ Error: ${error}`));
204
+ }
205
+ }
206
+ }
207
+ /**
208
+ * Status subcommand - show test topology overview
209
+ */
210
+ async function statusAction(options) {
211
+ const rootDir = process.cwd();
212
+ const format = options.format ?? 'text';
213
+ if (!(await topologyExists(rootDir))) {
214
+ if (format === 'json') {
215
+ console.log(JSON.stringify({ error: 'No test topology found' }));
216
+ }
217
+ else {
218
+ showNotBuiltMessage();
219
+ }
220
+ return;
221
+ }
222
+ try {
223
+ const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'), 'utf-8'));
224
+ if (format === 'json') {
225
+ console.log(JSON.stringify(data, null, 2));
226
+ return;
227
+ }
228
+ console.log();
229
+ console.log(chalk.bold('🧪 Test Topology Status'));
230
+ console.log(chalk.gray('─'.repeat(60)));
231
+ console.log();
232
+ formatSummary(data.summary);
233
+ formatMockAnalysis(data.mockAnalysis);
234
+ }
235
+ catch (error) {
236
+ if (format === 'json') {
237
+ console.log(JSON.stringify({ error: String(error) }));
238
+ }
239
+ else {
240
+ console.log(chalk.red(`Error: ${error}`));
241
+ }
242
+ }
243
+ }
244
+ /**
245
+ * Uncovered subcommand - find untested functions
246
+ */
247
+ async function uncoveredAction(options) {
248
+ const rootDir = process.cwd();
249
+ const format = options.format ?? 'text';
250
+ const limit = options.limit ?? 20;
251
+ const minRisk = options.minRisk ?? 'medium';
252
+ const spinner = format === 'text' ? createSpinner('Analyzing uncovered functions...') : null;
253
+ spinner?.start();
254
+ try {
255
+ // Re-run analysis to get uncovered functions
256
+ const analyzer = createTestTopologyAnalyzer({});
257
+ // Load call graph
258
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
259
+ await callGraphAnalyzer.initialize();
260
+ const graph = callGraphAnalyzer.getGraph();
261
+ if (!graph) {
262
+ spinner?.stop();
263
+ if (format === 'json') {
264
+ console.log(JSON.stringify({ error: 'Call graph required for uncovered analysis' }));
265
+ }
266
+ else {
267
+ console.log(chalk.yellow('\n⚠️ Call graph required. Run: drift callgraph build'));
268
+ }
269
+ return;
270
+ }
271
+ analyzer.setCallGraph(graph);
272
+ // Extract tests
273
+ const testFiles = await findTestFiles(rootDir);
274
+ for (const testFile of testFiles) {
275
+ try {
276
+ const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
277
+ analyzer.extractFromFile(content, testFile);
278
+ }
279
+ catch {
280
+ // Skip files that can't be read
281
+ }
282
+ }
283
+ analyzer.buildMappings();
284
+ const uncovered = analyzer.getUncoveredFunctions({
285
+ minRisk,
286
+ limit,
287
+ includeReasons: true,
288
+ });
289
+ spinner?.stop();
290
+ if (format === 'json') {
291
+ console.log(JSON.stringify({ uncovered }, null, 2));
292
+ return;
293
+ }
294
+ console.log();
295
+ console.log(chalk.bold('🔍 Uncovered Functions'));
296
+ console.log(chalk.gray('─'.repeat(60)));
297
+ console.log();
298
+ if (uncovered.length === 0) {
299
+ console.log(chalk.green('✓ All functions have test coverage!'));
300
+ console.log();
301
+ return;
302
+ }
303
+ formatUncoveredFunctions(uncovered);
304
+ }
305
+ catch (error) {
306
+ spinner?.stop();
307
+ if (format === 'json') {
308
+ console.log(JSON.stringify({ error: String(error) }));
309
+ }
310
+ else {
311
+ console.log(chalk.red(`Error: ${error}`));
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Mocks subcommand - analyze mock patterns
317
+ */
318
+ async function mocksAction(options) {
319
+ const rootDir = process.cwd();
320
+ const format = options.format ?? 'text';
321
+ if (!(await topologyExists(rootDir))) {
322
+ if (format === 'json') {
323
+ console.log(JSON.stringify({ error: 'No test topology found' }));
324
+ }
325
+ else {
326
+ showNotBuiltMessage();
327
+ }
328
+ return;
329
+ }
330
+ try {
331
+ const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'), 'utf-8'));
332
+ if (format === 'json') {
333
+ console.log(JSON.stringify({ mockAnalysis: data.mockAnalysis }, null, 2));
334
+ return;
335
+ }
336
+ console.log();
337
+ console.log(chalk.bold('🎭 Mock Analysis'));
338
+ console.log(chalk.gray('─'.repeat(60)));
339
+ console.log();
340
+ formatMockAnalysisDetailed(data.mockAnalysis);
341
+ }
342
+ catch (error) {
343
+ if (format === 'json') {
344
+ console.log(JSON.stringify({ error: String(error) }));
345
+ }
346
+ else {
347
+ console.log(chalk.red(`Error: ${error}`));
348
+ }
349
+ }
350
+ }
351
+ /**
352
+ * Affected subcommand - get minimum test set for changed files
353
+ */
354
+ async function affectedAction(files, options) {
355
+ const rootDir = process.cwd();
356
+ const format = options.format ?? 'text';
357
+ if (files.length === 0) {
358
+ if (format === 'json') {
359
+ console.log(JSON.stringify({ error: 'No files specified' }));
360
+ }
361
+ else {
362
+ console.log(chalk.yellow('Usage: drift test-topology affected <file1> [file2] ...'));
363
+ }
364
+ return;
365
+ }
366
+ const spinner = format === 'text' ? createSpinner('Calculating affected tests...') : null;
367
+ spinner?.start();
368
+ try {
369
+ const analyzer = createTestTopologyAnalyzer({});
370
+ // Load call graph
371
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
372
+ await callGraphAnalyzer.initialize();
373
+ const graph = callGraphAnalyzer.getGraph();
374
+ if (graph) {
375
+ analyzer.setCallGraph(graph);
376
+ }
377
+ // Extract tests
378
+ const testFiles = await findTestFiles(rootDir);
379
+ for (const testFile of testFiles) {
380
+ try {
381
+ const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
382
+ analyzer.extractFromFile(content, testFile);
383
+ }
384
+ catch {
385
+ // Skip
386
+ }
387
+ }
388
+ analyzer.buildMappings();
389
+ const result = analyzer.getMinimumTestSet(files);
390
+ spinner?.stop();
391
+ if (format === 'json') {
392
+ console.log(JSON.stringify(result, null, 2));
393
+ return;
394
+ }
395
+ console.log();
396
+ console.log(chalk.bold('🎯 Minimum Test Set'));
397
+ console.log(chalk.gray('─'.repeat(60)));
398
+ console.log();
399
+ formatMinimumTestSet(result, files);
400
+ }
401
+ catch (error) {
402
+ spinner?.stop();
403
+ if (format === 'json') {
404
+ console.log(JSON.stringify({ error: String(error) }));
405
+ }
406
+ else {
407
+ console.log(chalk.red(`Error: ${error}`));
408
+ }
409
+ }
410
+ }
411
+ // ============================================================================
412
+ // Formatters
413
+ // ============================================================================
414
+ function formatSummary(summary) {
415
+ console.log(chalk.bold('📊 Test Summary'));
416
+ console.log(chalk.gray('─'.repeat(50)));
417
+ console.log(` Test Files: ${chalk.cyan.bold(summary.testFiles)}`);
418
+ console.log(` Test Cases: ${chalk.cyan.bold(summary.testCases)}`);
419
+ console.log(` Avg Quality: ${getQualityColor(summary.avgQualityScore)}`);
420
+ console.log();
421
+ if (summary.totalFiles > 0) {
422
+ console.log(chalk.bold('📈 Coverage'));
423
+ console.log(chalk.gray('─'.repeat(50)));
424
+ console.log(` Files: ${chalk.cyan(summary.coveredFiles)}/${summary.totalFiles} (${getCoverageColor(summary.coveragePercent)})`);
425
+ console.log(` Functions: ${chalk.cyan(summary.coveredFunctions)}/${summary.totalFunctions} (${getCoverageColor(summary.functionCoveragePercent)})`);
426
+ console.log();
427
+ }
428
+ // Framework breakdown
429
+ const frameworks = Object.entries(summary.byFramework)
430
+ .filter(([, count]) => count > 0)
431
+ .sort((a, b) => b[1] - a[1]);
432
+ if (frameworks.length > 0) {
433
+ console.log(chalk.bold('🔧 By Framework'));
434
+ console.log(chalk.gray('─'.repeat(50)));
435
+ for (const [framework, count] of frameworks) {
436
+ const icon = getFrameworkIcon(framework);
437
+ console.log(` ${icon} ${framework.padEnd(12)} ${chalk.cyan(count)} tests`);
438
+ }
439
+ console.log();
440
+ }
441
+ }
442
+ function formatMockAnalysis(analysis) {
443
+ if (analysis.totalMocks === 0)
444
+ return;
445
+ console.log(chalk.bold('🎭 Mock Summary'));
446
+ console.log(chalk.gray('─'.repeat(50)));
447
+ console.log(` Total Mocks: ${chalk.cyan(analysis.totalMocks)}`);
448
+ console.log(` External: ${chalk.green(analysis.externalMocks)} (${analysis.externalPercent}%)`);
449
+ console.log(` Internal: ${chalk.yellow(analysis.internalMocks)} (${analysis.internalPercent}%)`);
450
+ console.log(` Avg Mock Ratio: ${getMockRatioColor(analysis.avgMockRatio)}`);
451
+ console.log();
452
+ }
453
+ function formatMockAnalysisDetailed(analysis) {
454
+ formatMockAnalysis(analysis);
455
+ if (analysis.topMockedModules.length > 0) {
456
+ console.log(chalk.bold('📦 Most Mocked Modules'));
457
+ console.log(chalk.gray('─'.repeat(50)));
458
+ for (const { module, count } of analysis.topMockedModules.slice(0, 10)) {
459
+ const bar = '█'.repeat(Math.min(20, Math.ceil(count / analysis.topMockedModules[0].count * 20)));
460
+ console.log(` ${module.padEnd(25)} ${chalk.cyan(bar)} ${count}`);
461
+ }
462
+ console.log();
463
+ }
464
+ if (analysis.highMockRatioTests.length > 0) {
465
+ console.log(chalk.bold.yellow('⚠️ High Mock Ratio Tests'));
466
+ console.log(chalk.gray('─'.repeat(50)));
467
+ for (const { file, testName, mockRatio } of analysis.highMockRatioTests.slice(0, 10)) {
468
+ console.log(` ${chalk.yellow('●')} ${testName}`);
469
+ console.log(chalk.gray(` ${file} (${Math.round(mockRatio * 100)}% mocked)`));
470
+ }
471
+ console.log();
472
+ }
473
+ }
474
+ function formatUncoveredFunctions(uncovered) {
475
+ for (const func of uncovered) {
476
+ const riskColor = func.riskScore >= 60 ? chalk.red :
477
+ func.riskScore >= 30 ? chalk.yellow : chalk.gray;
478
+ console.log(`${riskColor('●')} ${chalk.white(func.qualifiedName)}`);
479
+ console.log(chalk.gray(` ${func.file}:${func.line}`));
480
+ console.log(` Risk: ${riskColor(func.riskScore + '/100')}`);
481
+ if (func.isEntryPoint) {
482
+ console.log(chalk.magenta(' 🚪 Entry point'));
483
+ }
484
+ if (func.accessesSensitiveData) {
485
+ console.log(chalk.yellow(' 💾 Accesses data'));
486
+ }
487
+ if (func.possibleReasons.length > 0) {
488
+ console.log(chalk.gray(` Possible reasons: ${func.possibleReasons.join(', ')}`));
489
+ }
490
+ console.log();
491
+ }
492
+ }
493
+ function formatMinimumTestSet(result, changedFiles) {
494
+ console.log(`Changed Files: ${chalk.cyan(changedFiles.length)}`);
495
+ console.log(`Changed Code Coverage: ${getCoverageColor(result.changedCodeCoverage)}`);
496
+ console.log();
497
+ console.log(`Tests to Run: ${chalk.cyan.bold(result.selectedTests)}/${result.totalTests}`);
498
+ console.log(`Time Saved: ${chalk.green('~' + result.timeSaved)}`);
499
+ console.log();
500
+ if (result.tests.length > 0) {
501
+ console.log(chalk.bold('Selected Tests:'));
502
+ for (const test of result.tests.slice(0, 20)) {
503
+ console.log(` ${chalk.green('✓')} ${test.name}`);
504
+ console.log(chalk.gray(` ${test.file}`));
505
+ }
506
+ if (result.tests.length > 20) {
507
+ console.log(chalk.gray(` ... and ${result.tests.length - 20} more`));
508
+ }
509
+ }
510
+ else {
511
+ console.log(chalk.yellow('No tests found covering the changed files.'));
512
+ }
513
+ console.log();
514
+ }
515
+ // ============================================================================
516
+ // Helpers
517
+ // ============================================================================
518
+ function getQualityColor(score) {
519
+ if (score >= 70)
520
+ return chalk.green(`${score}/100`);
521
+ if (score >= 50)
522
+ return chalk.yellow(`${score}/100`);
523
+ return chalk.red(`${score}/100`);
524
+ }
525
+ function getCoverageColor(percent) {
526
+ if (percent >= 80)
527
+ return chalk.green(`${percent}%`);
528
+ if (percent >= 50)
529
+ return chalk.yellow(`${percent}%`);
530
+ return chalk.red(`${percent}%`);
531
+ }
532
+ function getMockRatioColor(ratio) {
533
+ if (ratio <= 0.3)
534
+ return chalk.green(`${Math.round(ratio * 100)}%`);
535
+ if (ratio <= 0.5)
536
+ return chalk.yellow(`${Math.round(ratio * 100)}%`);
537
+ return chalk.red(`${Math.round(ratio * 100)}%`);
538
+ }
539
+ function getFrameworkIcon(framework) {
540
+ const icons = {
541
+ jest: '🃏',
542
+ vitest: '⚡',
543
+ mocha: '☕',
544
+ pytest: '🐍',
545
+ unittest: '🐍',
546
+ junit4: '☕',
547
+ junit5: '☕',
548
+ testng: '☕',
549
+ xunit: '🟣',
550
+ nunit: '🟣',
551
+ mstest: '🟣',
552
+ phpunit: '🐘',
553
+ pest: '🐘',
554
+ };
555
+ return icons[framework] ?? '📋';
556
+ }
557
+ // ============================================================================
558
+ // Command Registration
559
+ // ============================================================================
560
+ export function createTestTopologyCommand() {
561
+ const cmd = new Command('test-topology')
562
+ .description('Analyze test-to-code mappings and test quality')
563
+ .option('-f, --format <format>', 'Output format (text, json)', 'text')
564
+ .option('-v, --verbose', 'Enable verbose output');
565
+ cmd
566
+ .command('build')
567
+ .description('Build test topology from test files')
568
+ .action(() => buildAction(cmd.opts()));
569
+ cmd
570
+ .command('status')
571
+ .description('Show test topology overview')
572
+ .action(() => statusAction(cmd.opts()));
573
+ cmd
574
+ .command('uncovered')
575
+ .description('Find functions without test coverage')
576
+ .option('-l, --limit <number>', 'Maximum results', '20')
577
+ .option('-r, --min-risk <level>', 'Minimum risk level (low, medium, high)', 'medium')
578
+ .action((opts) => uncoveredAction({ ...cmd.opts(), ...opts }));
579
+ cmd
580
+ .command('mocks')
581
+ .description('Analyze mock patterns')
582
+ .action(() => mocksAction(cmd.opts()));
583
+ cmd
584
+ .command('affected <files...>')
585
+ .description('Get minimum test set for changed files')
586
+ .action((files) => affectedAction(files, cmd.opts()));
587
+ return cmd;
588
+ }
589
+ //# sourceMappingURL=test-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-topology.js","sourceRoot":"","sources":["../../src/commands/test-topology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Where Command - Find pattern locations
3
+ *
4
+ * Quickly find where patterns are located in the codebase.
5
+ *
6
+ * MIGRATION: Now uses IPatternService for pattern operations.
7
+ *
8
+ * Usage:
9
+ * drift where auth # Find patterns matching "auth"
10
+ * drift where middleware # Find middleware patterns
11
+ * drift where --json # Output as JSON
12
+ */
13
+ import { Command } from 'commander';
14
+ export declare const whereCommand: Command;
15
+ //# sourceMappingURL=where.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/commands/where.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SA6LrB,CAAC"}
1
+ {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/commands/where.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SA4HrB,CAAC"}