driftdetect 0.4.6 → 0.5.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bin/drift.js +27 -1
  3. package/dist/bin/drift.js.map +1 -1
  4. package/dist/commands/approve.d.ts +20 -0
  5. package/dist/commands/approve.d.ts.map +1 -1
  6. package/dist/commands/approve.js +38 -72
  7. package/dist/commands/approve.js.map +1 -1
  8. package/dist/commands/callgraph.js +4 -4
  9. package/dist/commands/callgraph.js.map +1 -1
  10. package/dist/commands/check.d.ts +41 -0
  11. package/dist/commands/check.d.ts.map +1 -1
  12. package/dist/commands/check.js +21 -11
  13. package/dist/commands/check.js.map +1 -1
  14. package/dist/commands/coupling.d.ts +17 -0
  15. package/dist/commands/coupling.d.ts.map +1 -0
  16. package/dist/commands/coupling.js +726 -0
  17. package/dist/commands/coupling.js.map +1 -0
  18. package/dist/commands/error-handling.d.ts +15 -0
  19. package/dist/commands/error-handling.d.ts.map +1 -0
  20. package/dist/commands/error-handling.js +608 -0
  21. package/dist/commands/error-handling.js.map +1 -0
  22. package/dist/commands/export.d.ts +16 -0
  23. package/dist/commands/export.d.ts.map +1 -1
  24. package/dist/commands/export.js +46 -50
  25. package/dist/commands/export.js.map +1 -1
  26. package/dist/commands/files.d.ts +15 -0
  27. package/dist/commands/files.d.ts.map +1 -1
  28. package/dist/commands/files.js +27 -48
  29. package/dist/commands/files.js.map +1 -1
  30. package/dist/commands/ignore.d.ts +20 -0
  31. package/dist/commands/ignore.d.ts.map +1 -1
  32. package/dist/commands/ignore.js +25 -48
  33. package/dist/commands/ignore.js.map +1 -1
  34. package/dist/commands/index.d.ts +6 -0
  35. package/dist/commands/index.d.ts.map +1 -1
  36. package/dist/commands/index.js +7 -0
  37. package/dist/commands/index.js.map +1 -1
  38. package/dist/commands/migrate-storage.d.ts +23 -0
  39. package/dist/commands/migrate-storage.d.ts.map +1 -0
  40. package/dist/commands/migrate-storage.js +337 -0
  41. package/dist/commands/migrate-storage.js.map +1 -0
  42. package/dist/commands/report.d.ts +22 -0
  43. package/dist/commands/report.d.ts.map +1 -1
  44. package/dist/commands/report.js +19 -10
  45. package/dist/commands/report.js.map +1 -1
  46. package/dist/commands/scan.d.ts +37 -0
  47. package/dist/commands/scan.d.ts.map +1 -1
  48. package/dist/commands/scan.js +233 -8
  49. package/dist/commands/scan.js.map +1 -1
  50. package/dist/commands/skills.d.ts +16 -0
  51. package/dist/commands/skills.d.ts.map +1 -0
  52. package/dist/commands/skills.js +409 -0
  53. package/dist/commands/skills.js.map +1 -0
  54. package/dist/commands/status.d.ts +20 -0
  55. package/dist/commands/status.d.ts.map +1 -1
  56. package/dist/commands/status.js +74 -72
  57. package/dist/commands/status.js.map +1 -1
  58. package/dist/commands/test-topology.d.ts +15 -0
  59. package/dist/commands/test-topology.d.ts.map +1 -0
  60. package/dist/commands/test-topology.js +589 -0
  61. package/dist/commands/test-topology.js.map +1 -0
  62. package/dist/commands/where.d.ts +15 -0
  63. package/dist/commands/where.d.ts.map +1 -1
  64. package/dist/commands/where.js +41 -88
  65. package/dist/commands/where.js.map +1 -1
  66. package/dist/commands/wrappers.d.ts +16 -0
  67. package/dist/commands/wrappers.d.ts.map +1 -0
  68. package/dist/commands/wrappers.js +181 -0
  69. package/dist/commands/wrappers.js.map +1 -0
  70. package/dist/services/pattern-service-factory.d.ts +37 -0
  71. package/dist/services/pattern-service-factory.d.ts.map +1 -0
  72. package/dist/services/pattern-service-factory.js +41 -0
  73. package/dist/services/pattern-service-factory.js.map +1 -0
  74. package/dist/services/scanner-service.d.ts +210 -0
  75. package/dist/services/scanner-service.d.ts.map +1 -1
  76. package/dist/services/scanner-service.js +298 -102
  77. package/dist/services/scanner-service.js.map +1 -1
  78. package/dist/workers/detector-worker.d.ts +107 -0
  79. package/dist/workers/detector-worker.d.ts.map +1 -0
  80. package/dist/workers/detector-worker.js +293 -0
  81. package/dist/workers/detector-worker.js.map +1 -0
  82. package/package.json +18 -17
@@ -0,0 +1,608 @@
1
+ /**
2
+ * Error Handling Command - drift error-handling
3
+ *
4
+ * Analyze error handling patterns, detect gaps, and find unhandled error paths.
5
+ */
6
+ import { Command } from 'commander';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import chalk from 'chalk';
10
+ import { createErrorHandlingAnalyzer, createCallGraphAnalyzer, } from 'driftdetect-core';
11
+ import { createSpinner } from '../ui/spinner.js';
12
+ const DRIFT_DIR = '.drift';
13
+ const ERROR_HANDLING_DIR = 'error-handling';
14
+ /**
15
+ * Check if error handling data exists
16
+ */
17
+ async function dataExists(rootDir) {
18
+ try {
19
+ await fs.access(path.join(rootDir, DRIFT_DIR, ERROR_HANDLING_DIR, 'topology.json'));
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * Show helpful message when data not built
28
+ */
29
+ function showNotBuiltMessage() {
30
+ console.log();
31
+ console.log(chalk.yellow('⚠️ No error handling analysis built yet.'));
32
+ console.log();
33
+ console.log(chalk.gray('Build error handling analysis:'));
34
+ console.log();
35
+ console.log(chalk.cyan(' drift error-handling build'));
36
+ console.log();
37
+ }
38
+ /**
39
+ * Build subcommand - analyze error handling patterns
40
+ */
41
+ async function buildAction(options) {
42
+ const rootDir = process.cwd();
43
+ const format = options.format ?? 'text';
44
+ const isTextFormat = format === 'text';
45
+ try {
46
+ if (isTextFormat) {
47
+ console.log();
48
+ console.log(chalk.bold('🛡️ Building Error Handling Analysis'));
49
+ console.log(chalk.gray('═'.repeat(50)));
50
+ }
51
+ const spinner = isTextFormat ? createSpinner('Initializing...') : null;
52
+ spinner?.start();
53
+ // Load call graph (required)
54
+ spinner?.text('Loading call graph...');
55
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
56
+ await callGraphAnalyzer.initialize();
57
+ const callGraph = callGraphAnalyzer.getGraph();
58
+ if (!callGraph) {
59
+ spinner?.stop();
60
+ if (format === 'json') {
61
+ console.log(JSON.stringify({ error: 'Call graph required. Run: drift callgraph build' }));
62
+ }
63
+ else {
64
+ console.log(chalk.yellow('\n⚠️ Call graph required. Run: drift callgraph build'));
65
+ }
66
+ return;
67
+ }
68
+ // Initialize error handling analyzer
69
+ spinner?.text('Analyzing error handling patterns...');
70
+ const analyzer = createErrorHandlingAnalyzer({ rootDir });
71
+ analyzer.setCallGraph(callGraph);
72
+ // Build the topology
73
+ spinner?.text('Building error handling topology...');
74
+ const topology = analyzer.build();
75
+ // Get summary
76
+ const summary = analyzer.getSummary();
77
+ const metrics = analyzer.getMetrics();
78
+ // Save results
79
+ spinner?.text('Saving results...');
80
+ const errorDir = path.join(rootDir, DRIFT_DIR, ERROR_HANDLING_DIR);
81
+ await fs.mkdir(errorDir, { recursive: true });
82
+ // Serialize the topology (convert Map to object)
83
+ const serializedTopology = {
84
+ functions: Object.fromEntries(topology.functions),
85
+ boundaries: topology.boundaries,
86
+ unhandledPaths: topology.unhandledPaths,
87
+ propagationChains: topology.propagationChains,
88
+ generatedAt: topology.generatedAt,
89
+ projectRoot: topology.projectRoot,
90
+ };
91
+ await fs.writeFile(path.join(errorDir, 'topology.json'), JSON.stringify({ topology: serializedTopology, summary, metrics }, null, 2));
92
+ spinner?.stop();
93
+ // Output
94
+ if (format === 'json') {
95
+ console.log(JSON.stringify({
96
+ success: true,
97
+ functions: topology.functions.size,
98
+ boundaries: topology.boundaries.length,
99
+ unhandledPaths: topology.unhandledPaths.length,
100
+ summary,
101
+ metrics,
102
+ }, null, 2));
103
+ return;
104
+ }
105
+ // Text output
106
+ console.log();
107
+ console.log(chalk.green.bold('✓ Error handling analysis built successfully'));
108
+ console.log();
109
+ if (summary) {
110
+ formatSummary(summary);
111
+ }
112
+ console.log(chalk.gray('─'.repeat(50)));
113
+ console.log(chalk.bold('📌 Next Steps:'));
114
+ console.log(chalk.gray(` • drift error-handling status ${chalk.white('View error handling overview')}`));
115
+ console.log(chalk.gray(` • drift error-handling gaps ${chalk.white('Find error handling gaps')}`));
116
+ console.log(chalk.gray(` • drift error-handling boundaries ${chalk.white('List error boundaries')}`));
117
+ console.log(chalk.gray(` • drift error-handling unhandled ${chalk.white('Find unhandled error paths')}`));
118
+ console.log();
119
+ }
120
+ catch (error) {
121
+ if (format === 'json') {
122
+ console.log(JSON.stringify({ error: String(error) }));
123
+ }
124
+ else {
125
+ console.log(chalk.red(`\n❌ Error: ${error}`));
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Status subcommand - show error handling overview
131
+ */
132
+ async function statusAction(options) {
133
+ const rootDir = process.cwd();
134
+ const format = options.format ?? 'text';
135
+ if (!(await dataExists(rootDir))) {
136
+ if (format === 'json') {
137
+ console.log(JSON.stringify({ error: 'No error handling analysis found' }));
138
+ }
139
+ else {
140
+ showNotBuiltMessage();
141
+ }
142
+ return;
143
+ }
144
+ try {
145
+ const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, ERROR_HANDLING_DIR, 'topology.json'), 'utf-8'));
146
+ if (format === 'json') {
147
+ console.log(JSON.stringify({ summary: data.summary, metrics: data.metrics }, null, 2));
148
+ return;
149
+ }
150
+ console.log();
151
+ console.log(chalk.bold('🛡️ Error Handling Status'));
152
+ console.log(chalk.gray('─'.repeat(60)));
153
+ console.log();
154
+ formatSummary(data.summary);
155
+ formatMetrics(data.metrics);
156
+ }
157
+ catch (error) {
158
+ if (format === 'json') {
159
+ console.log(JSON.stringify({ error: String(error) }));
160
+ }
161
+ else {
162
+ console.log(chalk.red(`Error: ${error}`));
163
+ }
164
+ }
165
+ }
166
+ /**
167
+ * Gaps subcommand - find error handling gaps
168
+ */
169
+ async function gapsAction(options) {
170
+ const rootDir = process.cwd();
171
+ const format = options.format ?? 'text';
172
+ const limit = options.limit ?? 20;
173
+ const minSeverity = options.minSeverity ?? 'medium';
174
+ const spinner = format === 'text' ? createSpinner('Finding error handling gaps...') : null;
175
+ spinner?.start();
176
+ try {
177
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
178
+ await callGraphAnalyzer.initialize();
179
+ const callGraph = callGraphAnalyzer.getGraph();
180
+ if (!callGraph) {
181
+ spinner?.stop();
182
+ if (format === 'json') {
183
+ console.log(JSON.stringify({ error: 'Call graph required' }));
184
+ }
185
+ else {
186
+ console.log(chalk.yellow('\n⚠️ Call graph required. Run: drift callgraph build'));
187
+ }
188
+ return;
189
+ }
190
+ const analyzer = createErrorHandlingAnalyzer({ rootDir });
191
+ analyzer.setCallGraph(callGraph);
192
+ analyzer.build();
193
+ const gaps = analyzer.getGaps({ limit, minSeverity, includeSuggestions: true });
194
+ spinner?.stop();
195
+ if (format === 'json') {
196
+ console.log(JSON.stringify({ gaps, total: gaps.length }, null, 2));
197
+ return;
198
+ }
199
+ console.log();
200
+ console.log(chalk.bold('🔍 Error Handling Gaps'));
201
+ console.log(chalk.gray('─'.repeat(60)));
202
+ console.log();
203
+ if (gaps.length === 0) {
204
+ console.log(chalk.green('✓ No error handling gaps found!'));
205
+ console.log();
206
+ return;
207
+ }
208
+ formatGaps(gaps);
209
+ }
210
+ catch (error) {
211
+ spinner?.stop();
212
+ if (format === 'json') {
213
+ console.log(JSON.stringify({ error: String(error) }));
214
+ }
215
+ else {
216
+ console.log(chalk.red(`Error: ${error}`));
217
+ }
218
+ }
219
+ }
220
+ /**
221
+ * Boundaries subcommand - list error boundaries
222
+ */
223
+ async function boundariesAction(options) {
224
+ const rootDir = process.cwd();
225
+ const format = options.format ?? 'text';
226
+ if (!(await dataExists(rootDir))) {
227
+ if (format === 'json') {
228
+ console.log(JSON.stringify({ error: 'No error handling analysis found' }));
229
+ }
230
+ else {
231
+ showNotBuiltMessage();
232
+ }
233
+ return;
234
+ }
235
+ try {
236
+ const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, ERROR_HANDLING_DIR, 'topology.json'), 'utf-8'));
237
+ const boundaries = data.topology.boundaries;
238
+ if (format === 'json') {
239
+ console.log(JSON.stringify({ boundaries, total: boundaries.length }, null, 2));
240
+ return;
241
+ }
242
+ console.log();
243
+ console.log(chalk.bold('🛡️ Error Boundaries'));
244
+ console.log(chalk.gray('─'.repeat(60)));
245
+ console.log();
246
+ if (boundaries.length === 0) {
247
+ console.log(chalk.yellow('⚠️ No error boundaries found.'));
248
+ console.log(chalk.gray('Consider adding try/catch blocks to protect critical paths.'));
249
+ console.log();
250
+ return;
251
+ }
252
+ formatBoundaries(boundaries);
253
+ }
254
+ catch (error) {
255
+ if (format === 'json') {
256
+ console.log(JSON.stringify({ error: String(error) }));
257
+ }
258
+ else {
259
+ console.log(chalk.red(`Error: ${error}`));
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * Unhandled subcommand - find unhandled error paths
265
+ */
266
+ async function unhandledAction(options) {
267
+ const rootDir = process.cwd();
268
+ const format = options.format ?? 'text';
269
+ const minSeverity = options.minSeverity ?? 'medium';
270
+ if (!(await dataExists(rootDir))) {
271
+ if (format === 'json') {
272
+ console.log(JSON.stringify({ error: 'No error handling analysis found' }));
273
+ }
274
+ else {
275
+ showNotBuiltMessage();
276
+ }
277
+ return;
278
+ }
279
+ try {
280
+ const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, ERROR_HANDLING_DIR, 'topology.json'), 'utf-8'));
281
+ let paths = data.topology.unhandledPaths;
282
+ // Filter by severity
283
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
284
+ const minOrder = severityOrder[minSeverity];
285
+ paths = paths.filter(p => severityOrder[p.severity] <= minOrder);
286
+ if (format === 'json') {
287
+ console.log(JSON.stringify({ paths, total: paths.length }, null, 2));
288
+ return;
289
+ }
290
+ console.log();
291
+ console.log(chalk.bold('⚠️ Unhandled Error Paths'));
292
+ console.log(chalk.gray('─'.repeat(60)));
293
+ console.log();
294
+ if (paths.length === 0) {
295
+ console.log(chalk.green('✓ No unhandled error paths found!'));
296
+ console.log();
297
+ return;
298
+ }
299
+ formatUnhandledPaths(paths);
300
+ }
301
+ catch (error) {
302
+ if (format === 'json') {
303
+ console.log(JSON.stringify({ error: String(error) }));
304
+ }
305
+ else {
306
+ console.log(chalk.red(`Error: ${error}`));
307
+ }
308
+ }
309
+ }
310
+ /**
311
+ * Analyze subcommand - analyze specific function
312
+ */
313
+ async function analyzeAction(funcPath, options) {
314
+ const rootDir = process.cwd();
315
+ const format = options.format ?? 'text';
316
+ const spinner = format === 'text' ? createSpinner('Analyzing function...') : null;
317
+ spinner?.start();
318
+ try {
319
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
320
+ await callGraphAnalyzer.initialize();
321
+ const callGraph = callGraphAnalyzer.getGraph();
322
+ if (!callGraph) {
323
+ spinner?.stop();
324
+ if (format === 'json') {
325
+ console.log(JSON.stringify({ error: 'Call graph required' }));
326
+ }
327
+ else {
328
+ console.log(chalk.yellow('\n⚠️ Call graph required. Run: drift callgraph build'));
329
+ }
330
+ return;
331
+ }
332
+ const analyzer = createErrorHandlingAnalyzer({ rootDir });
333
+ analyzer.setCallGraph(callGraph);
334
+ analyzer.build();
335
+ const analysis = analyzer.getFunctionAnalysis(funcPath);
336
+ spinner?.stop();
337
+ if (!analysis) {
338
+ if (format === 'json') {
339
+ console.log(JSON.stringify({ error: `Function not found: ${funcPath}` }));
340
+ }
341
+ else {
342
+ console.log(chalk.yellow(`\n⚠️ Function not found: ${funcPath}`));
343
+ }
344
+ return;
345
+ }
346
+ if (format === 'json') {
347
+ console.log(JSON.stringify(analysis, null, 2));
348
+ return;
349
+ }
350
+ console.log();
351
+ console.log(chalk.bold(`🔍 Function Analysis: ${funcPath}`));
352
+ console.log(chalk.gray('─'.repeat(60)));
353
+ console.log();
354
+ formatFunctionAnalysis(analysis);
355
+ }
356
+ catch (error) {
357
+ spinner?.stop();
358
+ if (format === 'json') {
359
+ console.log(JSON.stringify({ error: String(error) }));
360
+ }
361
+ else {
362
+ console.log(chalk.red(`Error: ${error}`));
363
+ }
364
+ }
365
+ }
366
+ // ============================================================================
367
+ // Formatters
368
+ // ============================================================================
369
+ function formatSummary(summary) {
370
+ console.log(chalk.bold('📊 Summary'));
371
+ console.log(chalk.gray('─'.repeat(50)));
372
+ console.log(` Functions: ${chalk.cyan.bold(summary.totalFunctions)}`);
373
+ console.log(` Coverage: ${getCoverageColor(summary.coveragePercent)}`);
374
+ console.log(` Avg Quality: ${getQualityColor(summary.avgQuality)}`);
375
+ console.log(` Unhandled Paths: ${getUnhandledColor(summary.unhandledPaths)}`);
376
+ if (summary.criticalUnhandled > 0) {
377
+ console.log(` Critical: ${chalk.red.bold(summary.criticalUnhandled)}`);
378
+ }
379
+ console.log();
380
+ // Quality distribution
381
+ console.log(chalk.bold('📈 Quality Distribution'));
382
+ console.log(chalk.gray('─'.repeat(50)));
383
+ console.log(` ${chalk.green('●')} Excellent: ${summary.qualityDistribution.excellent}`);
384
+ console.log(` ${chalk.cyan('●')} Good: ${summary.qualityDistribution.good}`);
385
+ console.log(` ${chalk.yellow('●')} Fair: ${summary.qualityDistribution.fair}`);
386
+ console.log(` ${chalk.red('●')} Poor: ${summary.qualityDistribution.poor}`);
387
+ console.log();
388
+ // Top issues
389
+ if (summary.topIssues.length > 0) {
390
+ console.log(chalk.bold.yellow('⚠️ Top Issues'));
391
+ console.log(chalk.gray('─'.repeat(50)));
392
+ for (const issue of summary.topIssues) {
393
+ const icon = getSeverityIcon(issue.severity);
394
+ const label = getIssueLabel(issue.type);
395
+ console.log(` ${icon} ${label}: ${chalk.bold(issue.count)}`);
396
+ }
397
+ console.log();
398
+ }
399
+ }
400
+ function formatMetrics(metrics) {
401
+ console.log(chalk.bold('📊 Detailed Metrics'));
402
+ console.log(chalk.gray('─'.repeat(50)));
403
+ console.log(` With try/catch: ${chalk.cyan(metrics.functionsWithTryCatch)}`);
404
+ console.log(` Can throw: ${chalk.cyan(metrics.functionsThatThrow)}`);
405
+ console.log(` Error boundaries: ${chalk.cyan(metrics.boundaryCount)}`);
406
+ console.log(` Framework bounds: ${chalk.cyan(metrics.frameworkBoundaries)}`);
407
+ console.log(` Swallowed errors: ${metrics.swallowedErrorCount > 0 ? chalk.yellow(metrics.swallowedErrorCount) : chalk.green('0')}`);
408
+ console.log(` Unhandled async: ${metrics.unhandledAsyncCount > 0 ? chalk.yellow(metrics.unhandledAsyncCount) : chalk.green('0')}`);
409
+ console.log();
410
+ }
411
+ function formatGaps(gaps) {
412
+ for (const gap of gaps) {
413
+ const icon = getSeverityIcon(gap.severity);
414
+ const riskColor = gap.riskScore >= 70 ? chalk.red : gap.riskScore >= 50 ? chalk.yellow : chalk.gray;
415
+ console.log(`${icon} ${chalk.white(gap.name)}`);
416
+ console.log(chalk.gray(` ${gap.file}:${gap.line}`));
417
+ console.log(` Type: ${getGapTypeLabel(gap.gapType)}`);
418
+ console.log(` Risk: ${riskColor(gap.riskScore + '/100')}`);
419
+ console.log(chalk.gray(` ${gap.description}`));
420
+ if (gap.suggestion) {
421
+ console.log(chalk.cyan(` → ${gap.suggestion}`));
422
+ }
423
+ console.log();
424
+ }
425
+ }
426
+ function formatBoundaries(boundaries) {
427
+ for (const boundary of boundaries) {
428
+ const icon = boundary.isFrameworkBoundary ? '🏗️' : '🛡️';
429
+ const coverageColor = boundary.coverage >= 80 ? chalk.green :
430
+ boundary.coverage >= 50 ? chalk.yellow : chalk.red;
431
+ console.log(`${icon} ${chalk.white(boundary.name)}`);
432
+ console.log(chalk.gray(` ${boundary.file}:${boundary.line}`));
433
+ console.log(` Coverage: ${coverageColor(boundary.coverage + '%')}`);
434
+ console.log(` Catches from: ${chalk.cyan(boundary.catchesFrom.length)} functions`);
435
+ console.log(` Handles: ${boundary.handledTypes.join(', ') || 'all errors'}`);
436
+ if (boundary.frameworkType) {
437
+ console.log(chalk.magenta(` Framework: ${boundary.frameworkType}`));
438
+ }
439
+ console.log();
440
+ }
441
+ }
442
+ function formatUnhandledPaths(paths) {
443
+ for (const path of paths) {
444
+ const icon = getSeverityIcon(path.severity);
445
+ console.log(`${icon} ${chalk.white(path.entryPoint)}`);
446
+ console.log(chalk.gray(` ${path.reason}`));
447
+ console.log(` Path length: ${chalk.cyan(path.path.length)} functions`);
448
+ console.log(` Error type: ${path.errorType}`);
449
+ console.log(chalk.cyan(` → Suggested boundary: ${path.suggestedBoundary}`));
450
+ console.log();
451
+ }
452
+ }
453
+ function formatFunctionAnalysis(analysis) {
454
+ const { profile, incomingErrors, outgoingErrors, isProtected, issues, suggestions } = analysis;
455
+ // Profile
456
+ console.log(chalk.bold('Function Info'));
457
+ console.log(chalk.gray('─'.repeat(50)));
458
+ console.log(` Has try/catch: ${profile.hasTryCatch ? chalk.green('Yes') : chalk.red('No')}`);
459
+ console.log(` Can throw: ${profile.canThrow ? chalk.yellow('Yes') : chalk.green('No')}`);
460
+ console.log(` Is async: ${profile.isAsync ? 'Yes' : 'No'}`);
461
+ console.log(` Quality: ${getQualityColor(profile.qualityScore)}`);
462
+ console.log(` Protected: ${isProtected ? chalk.green('Yes') : chalk.yellow('No')}`);
463
+ console.log();
464
+ // Catch clauses
465
+ if (profile.catchClauses.length > 0) {
466
+ console.log(chalk.bold('Catch Clauses'));
467
+ console.log(chalk.gray('─'.repeat(50)));
468
+ for (const clause of profile.catchClauses) {
469
+ const actionColor = clause.action === 'swallow' ? chalk.red :
470
+ clause.action === 'rethrow' ? chalk.yellow :
471
+ clause.action === 'recover' ? chalk.green : chalk.gray;
472
+ console.log(` Line ${clause.line}: catches ${clause.errorType} → ${actionColor(clause.action)}`);
473
+ }
474
+ console.log();
475
+ }
476
+ // Error flow
477
+ if (incomingErrors.length > 0) {
478
+ console.log(chalk.bold('Incoming Errors'));
479
+ console.log(chalk.gray('─'.repeat(50)));
480
+ for (const err of incomingErrors.slice(0, 5)) {
481
+ console.log(` ← ${err.from} (${err.errorType})`);
482
+ }
483
+ if (incomingErrors.length > 5) {
484
+ console.log(chalk.gray(` ... and ${incomingErrors.length - 5} more`));
485
+ }
486
+ console.log();
487
+ }
488
+ if (outgoingErrors.length > 0) {
489
+ console.log(chalk.bold('Outgoing Errors'));
490
+ console.log(chalk.gray('─'.repeat(50)));
491
+ for (const err of outgoingErrors.slice(0, 5)) {
492
+ const status = err.caught ? chalk.green('caught') : chalk.red('uncaught');
493
+ console.log(` → ${err.to} (${status})`);
494
+ }
495
+ if (outgoingErrors.length > 5) {
496
+ console.log(chalk.gray(` ... and ${outgoingErrors.length - 5} more`));
497
+ }
498
+ console.log();
499
+ }
500
+ // Issues
501
+ if (issues.length > 0) {
502
+ console.log(chalk.bold.yellow('⚠️ Issues'));
503
+ console.log(chalk.gray('─'.repeat(50)));
504
+ for (const issue of issues) {
505
+ const icon = getSeverityIcon(issue.severity);
506
+ console.log(` ${icon} ${issue.message}`);
507
+ }
508
+ console.log();
509
+ }
510
+ // Suggestions
511
+ if (suggestions.length > 0) {
512
+ console.log(chalk.bold('💡 Suggestions'));
513
+ console.log(chalk.gray('─'.repeat(50)));
514
+ for (const suggestion of suggestions) {
515
+ console.log(` ${chalk.cyan('→')} ${suggestion}`);
516
+ }
517
+ console.log();
518
+ }
519
+ }
520
+ // ============================================================================
521
+ // Helpers
522
+ // ============================================================================
523
+ function getCoverageColor(percent) {
524
+ if (percent >= 80)
525
+ return chalk.green(`${percent}%`);
526
+ if (percent >= 50)
527
+ return chalk.yellow(`${percent}%`);
528
+ return chalk.red(`${percent}%`);
529
+ }
530
+ function getQualityColor(score) {
531
+ if (score >= 70)
532
+ return chalk.green(`${score}/100`);
533
+ if (score >= 50)
534
+ return chalk.yellow(`${score}/100`);
535
+ return chalk.red(`${score}/100`);
536
+ }
537
+ function getUnhandledColor(count) {
538
+ if (count === 0)
539
+ return chalk.green.bold('0');
540
+ if (count <= 5)
541
+ return chalk.yellow.bold(String(count));
542
+ return chalk.red.bold(String(count));
543
+ }
544
+ function getSeverityIcon(severity) {
545
+ switch (severity) {
546
+ case 'critical': return chalk.red('🔴');
547
+ case 'high': return chalk.yellow('🟡');
548
+ case 'medium': return chalk.cyan('🔵');
549
+ case 'low': return chalk.gray('⚪');
550
+ }
551
+ }
552
+ function getIssueLabel(type) {
553
+ switch (type) {
554
+ case 'swallowed': return 'Swallowed errors';
555
+ case 'unhandled-async': return 'Unhandled async';
556
+ case 'no-boundary': return 'Missing boundaries';
557
+ case 'bare-catch': return 'Bare catch clauses';
558
+ default: return type;
559
+ }
560
+ }
561
+ function getGapTypeLabel(type) {
562
+ switch (type) {
563
+ case 'no-try-catch': return chalk.red('No error handling');
564
+ case 'swallowed-error': return chalk.yellow('Swallowed error');
565
+ case 'unhandled-async': return chalk.yellow('Unhandled async');
566
+ case 'bare-catch': return chalk.gray('Bare catch');
567
+ case 'missing-boundary': return chalk.red('Missing boundary');
568
+ default: return type;
569
+ }
570
+ }
571
+ // ============================================================================
572
+ // Command Registration
573
+ // ============================================================================
574
+ export function createErrorHandlingCommand() {
575
+ const cmd = new Command('error-handling')
576
+ .description('Analyze error handling patterns and gaps')
577
+ .option('-f, --format <format>', 'Output format (text, json)', 'text')
578
+ .option('-v, --verbose', 'Enable verbose output');
579
+ cmd
580
+ .command('build')
581
+ .description('Build error handling analysis')
582
+ .action(() => buildAction(cmd.opts()));
583
+ cmd
584
+ .command('status')
585
+ .description('Show error handling overview')
586
+ .action(() => statusAction(cmd.opts()));
587
+ cmd
588
+ .command('gaps')
589
+ .description('Find error handling gaps')
590
+ .option('-l, --limit <number>', 'Maximum results', '20')
591
+ .option('-s, --min-severity <level>', 'Minimum severity (low, medium, high, critical)', 'medium')
592
+ .action((opts) => gapsAction({ ...cmd.opts(), ...opts }));
593
+ cmd
594
+ .command('boundaries')
595
+ .description('List error boundaries')
596
+ .action(() => boundariesAction(cmd.opts()));
597
+ cmd
598
+ .command('unhandled')
599
+ .description('Find unhandled error paths')
600
+ .option('-s, --min-severity <level>', 'Minimum severity (low, medium, high, critical)', 'medium')
601
+ .action((opts) => unhandledAction({ ...cmd.opts(), ...opts }));
602
+ cmd
603
+ .command('analyze <function>')
604
+ .description('Analyze specific function error handling')
605
+ .action((func) => analyzeAction(func, cmd.opts()));
606
+ return cmd;
607
+ }
608
+ //# sourceMappingURL=error-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/commands/error-handling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Export Command - Export manifest in various formats
3
+ *
4
+ * Exports the pattern manifest for AI consumption or reporting.
5
+ *
6
+ * MIGRATION: Now uses IPatternService for pattern operations.
7
+ *
8
+ * Usage:
9
+ * drift export # Export as JSON to stdout
10
+ * drift export --format ai-context # Export optimized for LLMs
11
+ * drift export --format summary # Human-readable summary
12
+ * drift export -o report.md # Write to file
13
+ */
14
+ import { Command } from 'commander';
15
+ export declare const exportCommand: Command;
16
+ //# sourceMappingURL=export.d.ts.map