driftdetect 0.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 (117) hide show
  1. package/dist/bin/drift.d.ts +11 -0
  2. package/dist/bin/drift.d.ts.map +1 -0
  3. package/dist/bin/drift.js +83 -0
  4. package/dist/bin/drift.js.map +1 -0
  5. package/dist/commands/approve.d.ts +18 -0
  6. package/dist/commands/approve.d.ts.map +1 -0
  7. package/dist/commands/approve.js +271 -0
  8. package/dist/commands/approve.js.map +1 -0
  9. package/dist/commands/check.d.ts +39 -0
  10. package/dist/commands/check.d.ts.map +1 -0
  11. package/dist/commands/check.js +268 -0
  12. package/dist/commands/check.js.map +1 -0
  13. package/dist/commands/export.d.ts +14 -0
  14. package/dist/commands/export.d.ts.map +1 -0
  15. package/dist/commands/export.js +109 -0
  16. package/dist/commands/export.js.map +1 -0
  17. package/dist/commands/files.d.ts +13 -0
  18. package/dist/commands/files.d.ts.map +1 -0
  19. package/dist/commands/files.js +88 -0
  20. package/dist/commands/files.js.map +1 -0
  21. package/dist/commands/ignore.d.ts +18 -0
  22. package/dist/commands/ignore.d.ts.map +1 -0
  23. package/dist/commands/ignore.js +200 -0
  24. package/dist/commands/ignore.js.map +1 -0
  25. package/dist/commands/index.d.ts +16 -0
  26. package/dist/commands/index.d.ts.map +1 -0
  27. package/dist/commands/index.js +16 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/init.d.ts +19 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +320 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/report.d.ts +20 -0
  34. package/dist/commands/report.d.ts.map +1 -0
  35. package/dist/commands/report.js +202 -0
  36. package/dist/commands/report.js.map +1 -0
  37. package/dist/commands/scan.d.ts +27 -0
  38. package/dist/commands/scan.d.ts.map +1 -0
  39. package/dist/commands/scan.js +444 -0
  40. package/dist/commands/scan.js.map +1 -0
  41. package/dist/commands/status.d.ts +18 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +199 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/commands/where.d.ts +13 -0
  46. package/dist/commands/where.d.ts.map +1 -0
  47. package/dist/commands/where.js +80 -0
  48. package/dist/commands/where.js.map +1 -0
  49. package/dist/git/hooks.d.ts +108 -0
  50. package/dist/git/hooks.d.ts.map +1 -0
  51. package/dist/git/hooks.js +389 -0
  52. package/dist/git/hooks.js.map +1 -0
  53. package/dist/git/index.d.ts +6 -0
  54. package/dist/git/index.d.ts.map +1 -0
  55. package/dist/git/index.js +6 -0
  56. package/dist/git/index.js.map +1 -0
  57. package/dist/git/staged-files.d.ts +41 -0
  58. package/dist/git/staged-files.d.ts.map +1 -0
  59. package/dist/git/staged-files.js +118 -0
  60. package/dist/git/staged-files.js.map +1 -0
  61. package/dist/index.d.ts +17 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +21 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/reporters/github-reporter.d.ts +13 -0
  66. package/dist/reporters/github-reporter.d.ts.map +1 -0
  67. package/dist/reporters/github-reporter.js +59 -0
  68. package/dist/reporters/github-reporter.js.map +1 -0
  69. package/dist/reporters/gitlab-reporter.d.ts +16 -0
  70. package/dist/reporters/gitlab-reporter.d.ts.map +1 -0
  71. package/dist/reporters/gitlab-reporter.js +62 -0
  72. package/dist/reporters/gitlab-reporter.js.map +1 -0
  73. package/dist/reporters/index.d.ts +9 -0
  74. package/dist/reporters/index.d.ts.map +1 -0
  75. package/dist/reporters/index.js +9 -0
  76. package/dist/reporters/index.js.map +1 -0
  77. package/dist/reporters/json-reporter.d.ts +13 -0
  78. package/dist/reporters/json-reporter.d.ts.map +1 -0
  79. package/dist/reporters/json-reporter.js +44 -0
  80. package/dist/reporters/json-reporter.js.map +1 -0
  81. package/dist/reporters/text-reporter.d.ts +13 -0
  82. package/dist/reporters/text-reporter.d.ts.map +1 -0
  83. package/dist/reporters/text-reporter.js +96 -0
  84. package/dist/reporters/text-reporter.js.map +1 -0
  85. package/dist/reporters/types.d.ts +42 -0
  86. package/dist/reporters/types.d.ts.map +1 -0
  87. package/dist/reporters/types.js +5 -0
  88. package/dist/reporters/types.js.map +1 -0
  89. package/dist/services/scanner-service.d.ts +166 -0
  90. package/dist/services/scanner-service.d.ts.map +1 -0
  91. package/dist/services/scanner-service.js +453 -0
  92. package/dist/services/scanner-service.js.map +1 -0
  93. package/dist/types/index.d.ts +24 -0
  94. package/dist/types/index.d.ts.map +1 -0
  95. package/dist/types/index.js +5 -0
  96. package/dist/types/index.js.map +1 -0
  97. package/dist/ui/index.d.ts +11 -0
  98. package/dist/ui/index.d.ts.map +1 -0
  99. package/dist/ui/index.js +15 -0
  100. package/dist/ui/index.js.map +1 -0
  101. package/dist/ui/progress.d.ts +115 -0
  102. package/dist/ui/progress.d.ts.map +1 -0
  103. package/dist/ui/progress.js +232 -0
  104. package/dist/ui/progress.js.map +1 -0
  105. package/dist/ui/prompts.d.ts +91 -0
  106. package/dist/ui/prompts.d.ts.map +1 -0
  107. package/dist/ui/prompts.js +160 -0
  108. package/dist/ui/prompts.js.map +1 -0
  109. package/dist/ui/spinner.d.ts +109 -0
  110. package/dist/ui/spinner.d.ts.map +1 -0
  111. package/dist/ui/spinner.js +179 -0
  112. package/dist/ui/spinner.js.map +1 -0
  113. package/dist/ui/table.d.ts +118 -0
  114. package/dist/ui/table.d.ts.map +1 -0
  115. package/dist/ui/table.js +235 -0
  116. package/dist/ui/table.js.map +1 -0
  117. package/package.json +57 -0
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Scanner Service - Enterprise-grade pattern detection
3
+ *
4
+ * Uses the real detectors from driftdetect-detectors to find
5
+ * high-value architectural patterns and violations.
6
+ *
7
+ * Now includes manifest generation for pattern location discovery.
8
+ */
9
+ import * as fs from 'node:fs/promises';
10
+ import * as path from 'node:path';
11
+ import { createAllDetectorsArray, getDetectorCounts, } from 'driftdetect-detectors';
12
+ import { ManifestStore, hashContent, } from 'driftdetect-core';
13
+ // ============================================================================
14
+ // Language Detection
15
+ // ============================================================================
16
+ const EXTENSION_TO_LANGUAGE = {
17
+ ts: 'typescript',
18
+ tsx: 'typescript',
19
+ js: 'javascript',
20
+ jsx: 'javascript',
21
+ mjs: 'javascript',
22
+ cjs: 'javascript',
23
+ py: 'python',
24
+ pyw: 'python',
25
+ css: 'css',
26
+ scss: 'css',
27
+ sass: 'css',
28
+ less: 'css',
29
+ json: 'json',
30
+ yaml: 'yaml',
31
+ yml: 'yaml',
32
+ md: 'markdown',
33
+ mdx: 'markdown',
34
+ };
35
+ function getLanguage(filePath) {
36
+ const ext = path.extname(filePath).slice(1).toLowerCase();
37
+ return EXTENSION_TO_LANGUAGE[ext] || null;
38
+ }
39
+ function isDetectorApplicable(detector, language) {
40
+ if (!language)
41
+ return false;
42
+ const info = detector.getInfo();
43
+ return info.supportedLanguages.includes(language);
44
+ }
45
+ // ============================================================================
46
+ // Critical Detectors (highest value)
47
+ // ============================================================================
48
+ const CRITICAL_DETECTOR_IDS = new Set([
49
+ // Security - CRITICAL
50
+ 'security/sql-injection',
51
+ 'security/xss-prevention',
52
+ 'security/secret-management',
53
+ 'security/input-sanitization',
54
+ 'security/csrf-protection',
55
+ // Auth - CRITICAL
56
+ 'auth/middleware-usage',
57
+ 'auth/token-handling',
58
+ // API - HIGH
59
+ 'api/route-structure',
60
+ 'api/error-format',
61
+ 'api/response-envelope',
62
+ // Data Access - HIGH
63
+ 'data-access/n-plus-one',
64
+ 'data-access/query-patterns',
65
+ // Structural - HIGH
66
+ 'structural/circular-deps',
67
+ 'structural/module-boundaries',
68
+ // Errors - HIGH
69
+ 'errors/exception-hierarchy',
70
+ 'errors/try-catch-placement',
71
+ // Logging - HIGH
72
+ 'logging/pii-redaction',
73
+ ]);
74
+ // ============================================================================
75
+ // Scanner Service
76
+ // ============================================================================
77
+ /**
78
+ * Scanner Service
79
+ *
80
+ * Orchestrates pattern detection across files using real detectors
81
+ * from driftdetect-detectors package.
82
+ */
83
+ export class ScannerService {
84
+ config;
85
+ detectors = [];
86
+ initialized = false;
87
+ manifestStore = null;
88
+ constructor(config) {
89
+ this.config = config;
90
+ if (config.generateManifest) {
91
+ this.manifestStore = new ManifestStore(config.rootDir);
92
+ }
93
+ }
94
+ /**
95
+ * Initialize the scanner service - loads all detectors
96
+ */
97
+ async initialize() {
98
+ if (this.initialized)
99
+ return;
100
+ // Create all detectors
101
+ this.detectors = createAllDetectorsArray();
102
+ // Filter by category if specified
103
+ if (this.config.categories && this.config.categories.length > 0) {
104
+ const categories = new Set(this.config.categories);
105
+ this.detectors = this.detectors.filter(d => {
106
+ const info = d.getInfo();
107
+ return categories.has(info.category);
108
+ });
109
+ }
110
+ // Filter to critical only if specified
111
+ if (this.config.criticalOnly) {
112
+ this.detectors = this.detectors.filter(d => CRITICAL_DETECTOR_IDS.has(d.id));
113
+ }
114
+ // Load existing manifest for incremental scanning
115
+ if (this.manifestStore) {
116
+ await this.manifestStore.load();
117
+ }
118
+ this.initialized = true;
119
+ }
120
+ /**
121
+ * Get detector count
122
+ */
123
+ getDetectorCount() {
124
+ return this.detectors.length;
125
+ }
126
+ /**
127
+ * Get detector counts by category
128
+ */
129
+ getDetectorCounts() {
130
+ return getDetectorCounts();
131
+ }
132
+ /**
133
+ * Scan files for patterns using real detectors
134
+ */
135
+ async scanFiles(files, projectContext) {
136
+ const startTime = Date.now();
137
+ const fileResults = [];
138
+ const errors = [];
139
+ // Aggregation maps
140
+ const patternMap = new Map();
141
+ const allViolations = [];
142
+ // Manifest pattern aggregation
143
+ const manifestPatternMap = new Map();
144
+ let detectorsRan = 0;
145
+ let detectorsSkipped = 0;
146
+ // Filter to changed files if incremental
147
+ let filesToScan = files;
148
+ if (this.config.incremental && this.manifestStore) {
149
+ const fullPaths = files.map(f => path.join(this.config.rootDir, f));
150
+ const changedPaths = await this.manifestStore.getChangedFiles(fullPaths);
151
+ filesToScan = changedPaths.map(f => path.relative(this.config.rootDir, f));
152
+ // Clear patterns for changed files
153
+ for (const file of filesToScan) {
154
+ this.manifestStore.clearFilePatterns(path.join(this.config.rootDir, file));
155
+ }
156
+ }
157
+ for (const file of filesToScan) {
158
+ const fileStart = Date.now();
159
+ const filePath = path.join(this.config.rootDir, file);
160
+ const language = getLanguage(file);
161
+ // Skip files we can't detect language for
162
+ if (!language) {
163
+ fileResults.push({
164
+ file,
165
+ patterns: [],
166
+ violations: [],
167
+ duration: Date.now() - fileStart,
168
+ });
169
+ continue;
170
+ }
171
+ try {
172
+ const content = await fs.readFile(filePath, 'utf-8');
173
+ const contentHash = hashContent(content);
174
+ const filePatterns = [];
175
+ const fileViolations = [];
176
+ // Create detection context
177
+ const context = {
178
+ file,
179
+ content,
180
+ language,
181
+ ast: null, // AST parsing is optional
182
+ imports: [], // Will be populated by detectors that need it
183
+ exports: [], // Will be populated by detectors that need it
184
+ extension: path.extname(file),
185
+ isTestFile: /\.(test|spec)\.[jt]sx?$/.test(file) || file.includes('__tests__'),
186
+ isTypeDefinition: file.endsWith('.d.ts'),
187
+ projectContext: {
188
+ rootDir: projectContext.rootDir,
189
+ files: projectContext.files,
190
+ config: projectContext.config,
191
+ },
192
+ };
193
+ // Run applicable detectors
194
+ for (const detector of this.detectors) {
195
+ if (!isDetectorApplicable(detector, language)) {
196
+ detectorsSkipped++;
197
+ continue;
198
+ }
199
+ detectorsRan++;
200
+ try {
201
+ const result = await detector.detect(context);
202
+ const info = detector.getInfo();
203
+ // Process patterns
204
+ for (const match of result.patterns) {
205
+ filePatterns.push({
206
+ patternId: match.patternId,
207
+ detectorId: detector.id,
208
+ confidence: match.confidence,
209
+ location: match.location,
210
+ });
211
+ // Aggregate pattern
212
+ const key = match.patternId;
213
+ const existing = patternMap.get(key);
214
+ if (existing) {
215
+ existing.locations.push(match.location);
216
+ existing.occurrences++;
217
+ existing.confidence = Math.max(existing.confidence, match.confidence);
218
+ }
219
+ else {
220
+ patternMap.set(key, {
221
+ patternId: match.patternId,
222
+ detectorId: detector.id,
223
+ category: info.category,
224
+ subcategory: info.subcategory,
225
+ name: info.name,
226
+ description: info.description,
227
+ locations: [match.location],
228
+ confidence: match.confidence,
229
+ occurrences: 1,
230
+ });
231
+ }
232
+ // Build manifest pattern with semantic location
233
+ if (this.config.generateManifest) {
234
+ const semanticLoc = this.createSemanticLocation(match.location, content, contentHash, language);
235
+ const manifestKey = `${info.category}/${info.subcategory}/${match.patternId}`;
236
+ const existingManifest = manifestPatternMap.get(manifestKey);
237
+ if (existingManifest) {
238
+ existingManifest.locations.push(semanticLoc);
239
+ existingManifest.confidence = Math.max(existingManifest.confidence, match.confidence);
240
+ existingManifest.lastSeen = new Date().toISOString();
241
+ }
242
+ else {
243
+ manifestPatternMap.set(manifestKey, {
244
+ id: manifestKey,
245
+ name: info.name,
246
+ category: info.category,
247
+ subcategory: info.subcategory,
248
+ status: 'discovered',
249
+ confidence: match.confidence,
250
+ locations: [semanticLoc],
251
+ outliers: [],
252
+ description: info.description,
253
+ firstSeen: new Date().toISOString(),
254
+ lastSeen: new Date().toISOString(),
255
+ });
256
+ }
257
+ }
258
+ }
259
+ // Process violations
260
+ for (const violation of result.violations) {
261
+ const aggViolation = {
262
+ patternId: violation.patternId,
263
+ detectorId: detector.id,
264
+ category: info.category,
265
+ severity: violation.severity,
266
+ file: violation.file,
267
+ line: violation.range.start.line + 1,
268
+ column: violation.range.start.character + 1,
269
+ message: violation.message,
270
+ explanation: violation.explanation,
271
+ suggestedFix: violation.expected,
272
+ };
273
+ fileViolations.push(aggViolation);
274
+ allViolations.push(aggViolation);
275
+ // Add violation as outlier to manifest
276
+ if (this.config.generateManifest) {
277
+ const outlierLoc = this.createSemanticLocation({
278
+ file: violation.file,
279
+ line: violation.range.start.line + 1,
280
+ column: violation.range.start.character + 1,
281
+ }, content, contentHash, language, violation.message);
282
+ const manifestKey = `${info.category}/${info.subcategory}/${violation.patternId}`;
283
+ const existingManifest = manifestPatternMap.get(manifestKey);
284
+ if (existingManifest) {
285
+ existingManifest.outliers.push(outlierLoc);
286
+ }
287
+ else {
288
+ manifestPatternMap.set(manifestKey, {
289
+ id: manifestKey,
290
+ name: info.name,
291
+ category: info.category,
292
+ subcategory: info.subcategory,
293
+ status: 'discovered',
294
+ confidence: 0.5,
295
+ locations: [],
296
+ outliers: [outlierLoc],
297
+ description: info.description,
298
+ firstSeen: new Date().toISOString(),
299
+ lastSeen: new Date().toISOString(),
300
+ });
301
+ }
302
+ }
303
+ }
304
+ }
305
+ catch (detectorError) {
306
+ if (this.config.verbose) {
307
+ errors.push(`Detector ${detector.id} failed on ${file}: ${detectorError.message}`);
308
+ }
309
+ }
310
+ }
311
+ fileResults.push({
312
+ file,
313
+ patterns: filePatterns,
314
+ violations: fileViolations,
315
+ duration: Date.now() - fileStart,
316
+ });
317
+ }
318
+ catch (e) {
319
+ const error = `Failed to scan ${file}: ${e instanceof Error ? e.message : e}`;
320
+ errors.push(error);
321
+ fileResults.push({
322
+ file,
323
+ patterns: [],
324
+ violations: [],
325
+ duration: Date.now() - fileStart,
326
+ error,
327
+ });
328
+ }
329
+ }
330
+ // Convert pattern map to array
331
+ const patterns = Array.from(patternMap.values());
332
+ // Build and save manifest
333
+ let manifest;
334
+ if (this.config.generateManifest && this.manifestStore) {
335
+ const manifestPatterns = Array.from(manifestPatternMap.values());
336
+ this.manifestStore.updatePatterns(manifestPatterns);
337
+ await this.manifestStore.save();
338
+ manifest = await this.manifestStore.get();
339
+ }
340
+ const result = {
341
+ files: fileResults,
342
+ patterns,
343
+ violations: allViolations,
344
+ totalPatterns: patterns.reduce((sum, p) => sum + p.occurrences, 0),
345
+ totalViolations: allViolations.length,
346
+ totalFiles: files.length,
347
+ duration: Date.now() - startTime,
348
+ errors,
349
+ detectorStats: {
350
+ total: this.detectors.length,
351
+ ran: detectorsRan,
352
+ skipped: detectorsSkipped,
353
+ },
354
+ };
355
+ if (manifest) {
356
+ result.manifest = manifest;
357
+ }
358
+ return result;
359
+ }
360
+ /**
361
+ * Create a semantic location from a basic location
362
+ */
363
+ createSemanticLocation(location, content, hash, language, name) {
364
+ const lines = content.split('\n');
365
+ const lineContent = lines[location.line - 1] || '';
366
+ // Try to extract semantic info from the line
367
+ const semanticInfo = this.extractSemanticInfo(lineContent, language);
368
+ const result = {
369
+ file: location.file,
370
+ hash,
371
+ range: {
372
+ start: location.line,
373
+ end: location.line,
374
+ },
375
+ type: semanticInfo.type,
376
+ name: name || semanticInfo.name || `line-${location.line}`,
377
+ confidence: 0.9,
378
+ snippet: lineContent.trim().substring(0, 100),
379
+ language,
380
+ };
381
+ if (semanticInfo.signature) {
382
+ result.signature = semanticInfo.signature;
383
+ }
384
+ return result;
385
+ }
386
+ /**
387
+ * Extract semantic information from a line of code
388
+ */
389
+ extractSemanticInfo(line, language) {
390
+ const trimmed = line.trim();
391
+ // TypeScript/JavaScript patterns
392
+ if (language === 'typescript' || language === 'javascript') {
393
+ // Class
394
+ const classMatch = trimmed.match(/^(?:export\s+)?(?:abstract\s+)?class\s+(\w+)/);
395
+ if (classMatch && classMatch[1]) {
396
+ return { type: 'class', name: classMatch[1], signature: trimmed.substring(0, 80) };
397
+ }
398
+ // Function
399
+ const funcMatch = trimmed.match(/^(?:export\s+)?(?:async\s+)?function\s+(\w+)/);
400
+ if (funcMatch && funcMatch[1]) {
401
+ return { type: 'function', name: funcMatch[1], signature: trimmed.substring(0, 80) };
402
+ }
403
+ // Arrow function / const
404
+ const arrowMatch = trimmed.match(/^(?:export\s+)?const\s+(\w+)\s*=/);
405
+ if (arrowMatch && arrowMatch[1]) {
406
+ return { type: 'function', name: arrowMatch[1], signature: trimmed.substring(0, 80) };
407
+ }
408
+ // Interface
409
+ const interfaceMatch = trimmed.match(/^(?:export\s+)?interface\s+(\w+)/);
410
+ if (interfaceMatch && interfaceMatch[1]) {
411
+ return { type: 'interface', name: interfaceMatch[1], signature: trimmed.substring(0, 80) };
412
+ }
413
+ // Type
414
+ const typeMatch = trimmed.match(/^(?:export\s+)?type\s+(\w+)/);
415
+ if (typeMatch && typeMatch[1]) {
416
+ return { type: 'type', name: typeMatch[1], signature: trimmed.substring(0, 80) };
417
+ }
418
+ }
419
+ // Python patterns
420
+ if (language === 'python') {
421
+ // Class
422
+ const classMatch = trimmed.match(/^class\s+(\w+)/);
423
+ if (classMatch && classMatch[1]) {
424
+ return { type: 'class', name: classMatch[1], signature: trimmed.substring(0, 80) };
425
+ }
426
+ // Function/method
427
+ const defMatch = trimmed.match(/^(?:async\s+)?def\s+(\w+)/);
428
+ if (defMatch && defMatch[1]) {
429
+ return { type: 'function', name: defMatch[1], signature: trimmed.substring(0, 80) };
430
+ }
431
+ // Decorator
432
+ const decoratorMatch = trimmed.match(/^@(\w+)/);
433
+ if (decoratorMatch && decoratorMatch[1]) {
434
+ return { type: 'decorator', name: decoratorMatch[1], signature: trimmed };
435
+ }
436
+ }
437
+ // Default to block
438
+ return { type: 'block' };
439
+ }
440
+ /**
441
+ * Get the manifest store (for external access)
442
+ */
443
+ getManifestStore() {
444
+ return this.manifestStore;
445
+ }
446
+ }
447
+ /**
448
+ * Create a scanner service
449
+ */
450
+ export function createScannerService(config) {
451
+ return new ScannerService(config);
452
+ }
453
+ //# sourceMappingURL=scanner-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner-service.js","sourceRoot":"","sources":["../../src/services/scanner-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * CLI type exports
3
+ */
4
+ export interface CLIOptions {
5
+ /** Enable verbose output */
6
+ verbose?: boolean;
7
+ /** Output format */
8
+ format?: 'text' | 'json' | 'github' | 'gitlab';
9
+ /** CI mode */
10
+ ci?: boolean;
11
+ /** Check only staged files */
12
+ staged?: boolean;
13
+ }
14
+ export interface CheckResult {
15
+ /** Number of violations */
16
+ violationCount: number;
17
+ /** Number of errors */
18
+ errorCount: number;
19
+ /** Number of warnings */
20
+ warningCount: number;
21
+ /** Exit code */
22
+ exitCode: number;
23
+ }
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,cAAc;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI type exports
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * UI module exports
3
+ *
4
+ * Provides CLI UI components for interactive prompts, spinners,
5
+ * tables, and progress bars.
6
+ */
7
+ export { confirmPrompt, inputPrompt, selectPrompt, multiSelectPrompt, promptPatternAction, promptBatchPatternApproval, promptSeverity, promptVariantReason, promptVariantScope, promptInitOptions, promptIgnoreReason, promptReportFormat, promptCategorySelection, type PatternChoice, type PatternAction, type VariantScope, type InitPromptResult, type ReportFormat, } from './prompts.js';
8
+ export { Spinner, createSpinner, withSpinner, spinners, status, type SpinnerOptions, } from './spinner.js';
9
+ export { createTable, formatSeverity, formatConfidence, formatCount, formatPath, createPatternsTable, createViolationsTable, createSummaryTable, createStatusTable, createCategoryTable, type TableStyle, type TableOptions, type PatternRow, type ViolationRow, type SummaryRow, type StatusSummary, type CategoryBreakdown, } from './table.js';
10
+ export { Progress, MultiProgress, createScanProgress, createAnalysisProgress, createDetectionProgress, withProgress, logProgress, type ProgressOptions, } from './progress.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EACX,QAAQ,EACR,MAAM,EACN,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * UI module exports
3
+ *
4
+ * Provides CLI UI components for interactive prompts, spinners,
5
+ * tables, and progress bars.
6
+ */
7
+ // Prompts
8
+ export { confirmPrompt, inputPrompt, selectPrompt, multiSelectPrompt, promptPatternAction, promptBatchPatternApproval, promptSeverity, promptVariantReason, promptVariantScope, promptInitOptions, promptIgnoreReason, promptReportFormat, promptCategorySelection, } from './prompts.js';
9
+ // Spinner
10
+ export { Spinner, createSpinner, withSpinner, spinners, status, } from './spinner.js';
11
+ // Table
12
+ export { createTable, formatSeverity, formatConfidence, formatCount, formatPath, createPatternsTable, createViolationsTable, createSummaryTable, createStatusTable, createCategoryTable, } from './table.js';
13
+ // Progress
14
+ export { Progress, MultiProgress, createScanProgress, createAnalysisProgress, createDetectionProgress, withProgress, logProgress, } from './progress.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU;AACV,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GAMxB,MAAM,cAAc,CAAC;AAEtB,UAAU;AACV,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EACX,QAAQ,EACR,MAAM,GAEP,MAAM,cAAc,CAAC;AAEtB,QAAQ;AACR,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GAQpB,MAAM,YAAY,CAAC;AAEpB,WAAW;AACX,OAAO,EACL,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,YAAY,EACZ,WAAW,GAEZ,MAAM,eAAe,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Progress - Progress bars for scanning
3
+ *
4
+ * Provides progress bars for long-running operations like scanning.
5
+ *
6
+ * @requirements 29.1
7
+ */
8
+ import { SingleBar } from 'cli-progress';
9
+ /**
10
+ * Progress bar configuration options
11
+ */
12
+ export interface ProgressOptions {
13
+ /** Total number of items */
14
+ total: number;
15
+ /** Format string for the progress bar */
16
+ format?: string;
17
+ /** Whether to show ETA */
18
+ showEta?: boolean;
19
+ /** Whether to show percentage */
20
+ showPercentage?: boolean;
21
+ /** Whether to show value/total */
22
+ showValue?: boolean;
23
+ /** Whether progress is enabled (false in CI mode) */
24
+ enabled?: boolean;
25
+ /** Clear the bar on complete */
26
+ clearOnComplete?: boolean;
27
+ /** Hide cursor during progress */
28
+ hideCursor?: boolean;
29
+ }
30
+ /**
31
+ * Progress bar wrapper for consistent CLI feedback
32
+ */
33
+ export declare class Progress {
34
+ private bar;
35
+ private enabled;
36
+ private currentValue;
37
+ constructor(options: ProgressOptions);
38
+ /**
39
+ * Update progress with current value
40
+ */
41
+ update(value: number, payload?: Record<string, string | number>): this;
42
+ /**
43
+ * Increment progress by amount
44
+ */
45
+ increment(amount?: number, payload?: Record<string, string | number>): this;
46
+ /**
47
+ * Set the current task description
48
+ */
49
+ task(description: string): this;
50
+ /**
51
+ * Set the total value
52
+ */
53
+ setTotal(total: number): this;
54
+ /**
55
+ * Stop the progress bar
56
+ */
57
+ stop(): this;
58
+ /**
59
+ * Get current value
60
+ */
61
+ get value(): number;
62
+ }
63
+ /**
64
+ * Multi-progress bar for parallel operations
65
+ */
66
+ export declare class MultiProgress {
67
+ private multiBar;
68
+ private bars;
69
+ private enabled;
70
+ constructor(enabled?: boolean);
71
+ /**
72
+ * Create a new progress bar
73
+ */
74
+ create(name: string, total: number): SingleBar | null;
75
+ /**
76
+ * Update a specific bar
77
+ */
78
+ update(name: string, value: number, payload?: Record<string, string | number>): this;
79
+ /**
80
+ * Increment a specific bar
81
+ */
82
+ increment(name: string, amount?: number, payload?: Record<string, string | number>): this;
83
+ /**
84
+ * Remove a specific bar
85
+ */
86
+ remove(name: string): this;
87
+ /**
88
+ * Stop all progress bars
89
+ */
90
+ stop(): this;
91
+ }
92
+ /**
93
+ * Create a progress bar for scanning operations
94
+ */
95
+ export declare function createScanProgress(totalFiles: number): Progress;
96
+ /**
97
+ * Create a progress bar for analysis operations
98
+ */
99
+ export declare function createAnalysisProgress(totalItems: number): Progress;
100
+ /**
101
+ * Create a progress bar for pattern detection
102
+ */
103
+ export declare function createDetectionProgress(totalDetectors: number): Progress;
104
+ /**
105
+ * Run an operation with progress tracking
106
+ */
107
+ export declare function withProgress<T>(items: T[], operation: (item: T, index: number) => Promise<void>, options?: {
108
+ format?: string;
109
+ getTaskName?: (item: T) => string;
110
+ }): Promise<void>;
111
+ /**
112
+ * Simple percentage display for CI mode
113
+ */
114
+ export declare function logProgress(current: number, total: number, message?: string): void;
115
+ //# sourceMappingURL=progress.d.ts.map