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,268 @@
1
+ /**
2
+ * Check Command - drift check
3
+ *
4
+ * Check for violations against approved patterns.
5
+ *
6
+ * @requirements 29.3
7
+ */
8
+ import { Command } from 'commander';
9
+ import * as fs from 'node:fs/promises';
10
+ import * as path from 'node:path';
11
+ import chalk from 'chalk';
12
+ import { PatternStore, } from 'driftdetect-core';
13
+ import { createSpinner, status } from '../ui/spinner.js';
14
+ import { getStagedFiles } from '../git/staged-files.js';
15
+ import { TextReporter, JsonReporter, GitHubReporter, GitLabReporter, } from '../reporters/index.js';
16
+ /** Directory name for drift configuration */
17
+ const DRIFT_DIR = '.drift';
18
+ /** Severity order for comparison */
19
+ const SEVERITY_ORDER = {
20
+ error: 4,
21
+ warning: 3,
22
+ info: 2,
23
+ hint: 1,
24
+ };
25
+ /**
26
+ * Check if drift is initialized
27
+ */
28
+ async function isDriftInitialized(rootDir) {
29
+ try {
30
+ await fs.access(path.join(rootDir, DRIFT_DIR));
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Get reporter based on format
39
+ */
40
+ function getReporter(format) {
41
+ switch (format) {
42
+ case 'json':
43
+ return new JsonReporter();
44
+ case 'github':
45
+ return new GitHubReporter();
46
+ case 'gitlab':
47
+ return new GitLabReporter();
48
+ case 'text':
49
+ default:
50
+ return new TextReporter();
51
+ }
52
+ }
53
+ /**
54
+ * Determine exit code based on violations and threshold
55
+ */
56
+ export function getExitCode(violations, failOn) {
57
+ if (failOn === 'none') {
58
+ return 0;
59
+ }
60
+ const threshold = SEVERITY_ORDER[failOn];
61
+ const hasViolationsAboveThreshold = violations.some((v) => SEVERITY_ORDER[v.severity] >= threshold);
62
+ return hasViolationsAboveThreshold ? 1 : 0;
63
+ }
64
+ /**
65
+ * Check command implementation
66
+ */
67
+ async function checkAction(options) {
68
+ const rootDir = process.cwd();
69
+ const isCi = options.ci ?? !!process.env['CI'];
70
+ const format = options.format ?? (isCi ? 'json' : 'text');
71
+ const failOn = options.failOn ?? 'error';
72
+ // In CI mode, suppress decorative output
73
+ const showProgress = !isCi && format === 'text';
74
+ if (showProgress) {
75
+ console.log();
76
+ console.log(chalk.bold('🔍 Drift - Checking for Violations'));
77
+ console.log();
78
+ }
79
+ // Check if initialized
80
+ if (!(await isDriftInitialized(rootDir))) {
81
+ if (isCi) {
82
+ console.error(JSON.stringify({ error: 'Drift is not initialized' }));
83
+ }
84
+ else {
85
+ status.error('Drift is not initialized. Run `drift init` first.');
86
+ }
87
+ process.exit(1);
88
+ }
89
+ // Initialize pattern store
90
+ const store = new PatternStore({ rootDir });
91
+ await store.initialize();
92
+ // Get approved patterns
93
+ const approvedPatterns = store.getApproved();
94
+ if (approvedPatterns.length === 0) {
95
+ if (showProgress) {
96
+ status.info('No approved patterns to check against.');
97
+ console.log(chalk.gray('Run `drift scan` to discover patterns, then `drift approve` to approve them.'));
98
+ }
99
+ else if (isCi) {
100
+ console.log(JSON.stringify({ violations: [], summary: { total: 0, errors: 0, warnings: 0 } }));
101
+ }
102
+ process.exit(0);
103
+ }
104
+ // Determine files to check
105
+ let filesToCheck = [];
106
+ if (options.staged) {
107
+ const spinner = showProgress ? createSpinner('Getting staged files...') : null;
108
+ spinner?.start();
109
+ try {
110
+ filesToCheck = await getStagedFiles(rootDir);
111
+ spinner?.succeed(`Found ${filesToCheck.length} staged files`);
112
+ }
113
+ catch (error) {
114
+ spinner?.fail('Failed to get staged files');
115
+ if (!isCi) {
116
+ console.error(chalk.red(error.message));
117
+ }
118
+ process.exit(1);
119
+ }
120
+ if (filesToCheck.length === 0) {
121
+ if (showProgress) {
122
+ status.info('No staged files to check.');
123
+ }
124
+ else if (isCi) {
125
+ console.log(JSON.stringify({ violations: [], summary: { total: 0, errors: 0, warnings: 0 } }));
126
+ }
127
+ process.exit(0);
128
+ }
129
+ }
130
+ else {
131
+ // Get all files from pattern locations
132
+ const allFiles = new Set();
133
+ for (const pattern of approvedPatterns) {
134
+ for (const location of pattern.locations) {
135
+ allFiles.add(location.file);
136
+ }
137
+ for (const outlier of pattern.outliers) {
138
+ allFiles.add(outlier.file);
139
+ }
140
+ }
141
+ filesToCheck = Array.from(allFiles);
142
+ }
143
+ // Run evaluation
144
+ const spinner = showProgress ? createSpinner('Checking for violations...') : null;
145
+ spinner?.start();
146
+ const violations = [];
147
+ try {
148
+ for (const file of filesToCheck) {
149
+ const filePath = path.join(rootDir, file);
150
+ // Check if file exists
151
+ try {
152
+ await fs.access(filePath);
153
+ }
154
+ catch {
155
+ continue; // File doesn't exist, skip
156
+ }
157
+ // Check against each approved pattern
158
+ for (const pattern of approvedPatterns) {
159
+ // Check if this file has outliers for this pattern
160
+ const outliers = pattern.outliers.filter((o) => o.file === file);
161
+ for (const outlier of outliers) {
162
+ // Create violation for each outlier
163
+ const violation = {
164
+ id: `${pattern.id}-${file}-${outlier.line}`,
165
+ patternId: pattern.id,
166
+ severity: pattern.severity,
167
+ file,
168
+ range: {
169
+ start: { line: outlier.line, character: outlier.column },
170
+ end: { line: outlier.endLine ?? outlier.line, character: outlier.endColumn ?? outlier.column },
171
+ },
172
+ message: `Deviation from pattern: ${pattern.name}`,
173
+ explanation: outlier.reason,
174
+ expected: pattern.description,
175
+ actual: `Code at line ${outlier.line} deviates from the established pattern`,
176
+ aiExplainAvailable: true,
177
+ aiFixAvailable: pattern.autoFixable,
178
+ firstSeen: new Date(),
179
+ occurrences: 1,
180
+ };
181
+ violations.push(violation);
182
+ }
183
+ }
184
+ }
185
+ spinner?.succeed(`Checked ${filesToCheck.length} files`);
186
+ }
187
+ catch (error) {
188
+ spinner?.fail('Check failed');
189
+ if (!isCi) {
190
+ console.error(chalk.red(error.message));
191
+ }
192
+ process.exit(1);
193
+ }
194
+ // Calculate summary
195
+ const errorCount = violations.filter((v) => v.severity === 'error').length;
196
+ const warningCount = violations.filter((v) => v.severity === 'warning').length;
197
+ const infoCount = violations.filter((v) => v.severity === 'info').length;
198
+ const hintCount = violations.filter((v) => v.severity === 'hint').length;
199
+ // Prepare report data
200
+ const reportData = {
201
+ violations,
202
+ summary: {
203
+ total: violations.length,
204
+ errors: errorCount,
205
+ warnings: warningCount,
206
+ infos: infoCount,
207
+ hints: hintCount,
208
+ },
209
+ patterns: approvedPatterns,
210
+ timestamp: new Date().toISOString(),
211
+ rootDir,
212
+ };
213
+ // Generate report
214
+ const reporter = getReporter(format);
215
+ const report = reporter.generate(reportData);
216
+ // Output report
217
+ console.log(report);
218
+ // Save report to file in CI mode
219
+ if (isCi) {
220
+ const reportsDir = path.join(rootDir, DRIFT_DIR, 'reports');
221
+ await fs.mkdir(reportsDir, { recursive: true });
222
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
223
+ const reportPath = path.join(reportsDir, `check-${timestamp}.${format === 'json' ? 'json' : 'txt'}`);
224
+ await fs.writeFile(reportPath, report);
225
+ }
226
+ // Show summary in text mode
227
+ if (showProgress && violations.length > 0) {
228
+ console.log();
229
+ console.log(chalk.bold('Summary'));
230
+ console.log(chalk.gray('─'.repeat(40)));
231
+ console.log(` Total violations: ${chalk.cyan(violations.length)}`);
232
+ if (errorCount > 0)
233
+ console.log(` Errors: ${chalk.red(errorCount)}`);
234
+ if (warningCount > 0)
235
+ console.log(` Warnings: ${chalk.yellow(warningCount)}`);
236
+ if (infoCount > 0)
237
+ console.log(` Info: ${chalk.blue(infoCount)}`);
238
+ if (hintCount > 0)
239
+ console.log(` Hints: ${chalk.gray(hintCount)}`);
240
+ console.log();
241
+ }
242
+ // Determine exit code
243
+ const exitCode = getExitCode(violations, failOn);
244
+ if (showProgress) {
245
+ if (exitCode === 0) {
246
+ if (violations.length === 0) {
247
+ status.success('No violations found!');
248
+ }
249
+ else {
250
+ status.success(`Check passed (${violations.length} violations below threshold)`);
251
+ }
252
+ }
253
+ else {
254
+ status.error(`Check failed with ${errorCount} errors`);
255
+ }
256
+ console.log();
257
+ }
258
+ process.exit(exitCode);
259
+ }
260
+ export const checkCommand = new Command('check')
261
+ .description('Check for violations')
262
+ .option('--staged', 'Check only staged files')
263
+ .option('--ci', 'Run in CI mode with machine-readable output')
264
+ .option('-f, --format <format>', 'Output format (text, json, github, gitlab)', 'text')
265
+ .option('--fail-on <level>', 'Fail threshold (error, warning, none)', 'error')
266
+ .option('--verbose', 'Enable verbose output')
267
+ .action(checkAction);
268
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,GAGb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GAGf,MAAM,uBAAuB,CAAC;AA4B/B,6CAA6C;AAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,oCAAoC;AACpC,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;CACR,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,IAAI,YAAY,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,UAAuB,EACvB,MAAoC;IAEpC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,2BAA2B,GAAG,UAAU,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAC/C,CAAC;IAEF,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,OAAqB;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IAEzC,yCAAyC;IACzC,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC;IAEhD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAEzB,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAE7C,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC,CAAC;QAC1G,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,CAAC;QAEjB,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjG,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,uCAAuC;QACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACzC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,EAAE,KAAK,EAAE,CAAC;IAEjB,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAE1C,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,2BAA2B;YACvC,CAAC;YAED,sCAAsC;YACtC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,mDAAmD;gBACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBAEjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,oCAAoC;oBACpC,MAAM,SAAS,GAAc;wBAC3B,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;wBAC3C,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,IAAI;wBACJ,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE;4BACxD,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;yBAC/F;wBACD,OAAO,EAAE,2BAA2B,OAAO,CAAC,IAAI,EAAE;wBAClD,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,QAAQ,EAAE,OAAO,CAAC,WAAW;wBAC7B,MAAM,EAAE,gBAAgB,OAAO,CAAC,IAAI,wCAAwC;wBAC5E,kBAAkB,EAAE,IAAI;wBACxB,cAAc,EAAE,OAAO,CAAC,WAAW;wBACnC,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,WAAW,EAAE,CAAC;qBACf,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,CAAC,WAAW,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAEzE,sBAAsB;IACtB,MAAM,UAAU,GAAe;QAC7B,UAAU;QACV,OAAO,EAAE;YACP,KAAK,EAAE,UAAU,CAAC,MAAM;YACxB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;SACjB;QACD,QAAQ,EAAE,gBAAgB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACR,CAAC;IAEF,kBAAkB;IAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE7C,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpB,iCAAiC;IACjC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,SAAS,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrG,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,4BAA4B;IAC5B,IAAI,YAAY,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,UAAU,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChF,IAAI,YAAY,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvF,IAAI,SAAS,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,SAAS,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEjD,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,iBAAiB,UAAU,CAAC,MAAM,8BAA8B,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,SAAS,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;KAC7C,MAAM,CAAC,MAAM,EAAE,6CAA6C,CAAC;KAC7D,MAAM,CAAC,uBAAuB,EAAE,4CAA4C,EAAE,MAAM,CAAC;KACrF,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,OAAO,CAAC;KAC7E,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;KAC5C,MAAM,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Export Command - Export manifest in various formats
3
+ *
4
+ * Exports the pattern manifest for AI consumption or reporting.
5
+ *
6
+ * Usage:
7
+ * drift export # Export as JSON to stdout
8
+ * drift export --format ai-context # Export optimized for LLMs
9
+ * drift export --format summary # Human-readable summary
10
+ * drift export -o report.md # Write to file
11
+ */
12
+ import { Command } from 'commander';
13
+ export declare const exportCommand: Command;
14
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,aAAa,SA8FtB,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Export Command - Export manifest in various formats
3
+ *
4
+ * Exports the pattern manifest for AI consumption or reporting.
5
+ *
6
+ * Usage:
7
+ * drift export # Export as JSON to stdout
8
+ * drift export --format ai-context # Export optimized for LLMs
9
+ * drift export --format summary # Human-readable summary
10
+ * drift export -o report.md # Write to file
11
+ */
12
+ import { Command } from 'commander';
13
+ import * as fs from 'node:fs/promises';
14
+ import * as path from 'node:path';
15
+ import chalk from 'chalk';
16
+ import { ManifestStore, exportManifest, estimateTokens, } from 'driftdetect-core';
17
+ const VALID_FORMATS = ['json', 'ai-context', 'summary', 'markdown'];
18
+ const VALID_CATEGORIES = [
19
+ 'api', 'auth', 'security', 'errors', 'logging', 'testing',
20
+ 'data-access', 'config', 'types', 'structural', 'components',
21
+ 'styling', 'accessibility', 'documentation', 'performance',
22
+ ];
23
+ export const exportCommand = new Command('export')
24
+ .description('Export manifest in various formats')
25
+ .option('-f, --format <format>', `Output format: ${VALID_FORMATS.join(', ')}`, 'json')
26
+ .option('-o, --output <file>', 'Output file (stdout if not specified)')
27
+ .option('-c, --categories <categories>', 'Categories to include (comma-separated)')
28
+ .option('--status <status>', 'Filter by status: discovered, approved, ignored')
29
+ .option('--min-confidence <number>', 'Minimum confidence threshold (0.0-1.0)')
30
+ .option('--compact', 'Compact output (fewer details)')
31
+ .option('--max-tokens <number>', 'Maximum tokens for AI context format')
32
+ .option('--snippets', 'Include code snippets')
33
+ .action(async (options) => {
34
+ const cwd = process.cwd();
35
+ // Validate format
36
+ if (!VALID_FORMATS.includes(options.format)) {
37
+ console.error(chalk.red(`Invalid format: ${options.format}`));
38
+ console.error(`Valid formats: ${VALID_FORMATS.join(', ')}`);
39
+ process.exit(1);
40
+ }
41
+ // Load manifest
42
+ const manifestStore = new ManifestStore(cwd);
43
+ const manifest = await manifestStore.load();
44
+ if (!manifest) {
45
+ console.error(chalk.red('No manifest found. Run `drift scan` first.'));
46
+ process.exit(1);
47
+ }
48
+ // Parse categories
49
+ let categories;
50
+ if (options.categories) {
51
+ categories = options.categories.split(',').map((c) => c.trim());
52
+ const invalid = categories.filter(c => !VALID_CATEGORIES.includes(c));
53
+ if (invalid.length > 0) {
54
+ console.error(chalk.red(`Invalid categories: ${invalid.join(', ')}`));
55
+ console.error(`Valid categories: ${VALID_CATEGORIES.join(', ')}`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+ // Parse status
60
+ let statuses;
61
+ if (options.status) {
62
+ statuses = options.status.split(',').map((s) => s.trim());
63
+ }
64
+ // Build export options
65
+ const exportOptions = {
66
+ format: options.format,
67
+ };
68
+ if (options.output) {
69
+ exportOptions.output = options.output;
70
+ }
71
+ if (categories) {
72
+ exportOptions.categories = categories;
73
+ }
74
+ if (statuses) {
75
+ exportOptions.statuses = statuses;
76
+ }
77
+ if (options.minConfidence) {
78
+ exportOptions.minConfidence = parseFloat(options.minConfidence);
79
+ }
80
+ if (options.compact) {
81
+ exportOptions.compact = options.compact;
82
+ }
83
+ if (options.maxTokens) {
84
+ exportOptions.maxTokens = parseInt(options.maxTokens, 10);
85
+ }
86
+ if (options.snippets) {
87
+ exportOptions.includeSnippets = options.snippets;
88
+ }
89
+ // Export
90
+ const output = exportManifest(manifest, exportOptions);
91
+ // Estimate tokens for AI context
92
+ if (options.format === 'ai-context') {
93
+ const estimate = estimateTokens(output);
94
+ if (estimate.warning) {
95
+ console.error(chalk.yellow(`⚠️ ${estimate.warning}`));
96
+ }
97
+ console.error(chalk.dim(`Estimated tokens: ~${estimate.tokens}`));
98
+ }
99
+ // Write output
100
+ if (options.output) {
101
+ const outputPath = path.resolve(cwd, options.output);
102
+ await fs.writeFile(outputPath, output, 'utf-8');
103
+ console.error(chalk.green(`✔ Exported to ${options.output}`));
104
+ }
105
+ else {
106
+ console.log(output);
107
+ }
108
+ });
109
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Files Command - Show patterns in a file
3
+ *
4
+ * Show what patterns are found in a specific file.
5
+ *
6
+ * Usage:
7
+ * drift files src/auth/middleware.py
8
+ * drift files 'src/api/*.ts'
9
+ * drift files --json src/api/
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare const filesCommand: Command;
13
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAqFrB,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Files Command - Show patterns in a file
3
+ *
4
+ * Show what patterns are found in a specific file.
5
+ *
6
+ * Usage:
7
+ * drift files src/auth/middleware.py
8
+ * drift files 'src/api/*.ts'
9
+ * drift files --json src/api/
10
+ */
11
+ import { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ import { ManifestStore, } from 'driftdetect-core';
14
+ export const filesCommand = new Command('files')
15
+ .description('Show patterns in a file')
16
+ .argument('<path>', 'File path (supports glob patterns)')
17
+ .option('-c, --category <category>', 'Filter by category')
18
+ .option('--json', 'Output as JSON')
19
+ .action(async (filePath, options) => {
20
+ const cwd = process.cwd();
21
+ // Load manifest
22
+ const manifestStore = new ManifestStore(cwd);
23
+ const manifest = await manifestStore.load();
24
+ if (!manifest) {
25
+ console.error(chalk.red('No manifest found. Run `drift scan` first.'));
26
+ process.exit(1);
27
+ }
28
+ // Build query
29
+ const query = {
30
+ path: filePath,
31
+ };
32
+ if (options.category) {
33
+ query.category = options.category;
34
+ }
35
+ // Query file
36
+ const result = manifestStore.queryFile(query);
37
+ if (!result) {
38
+ console.log(chalk.yellow(`No patterns found in "${filePath}"`));
39
+ // Show available files
40
+ const allFiles = Object.keys(manifest.files).slice(0, 10);
41
+ if (allFiles.length > 0) {
42
+ console.log(chalk.dim('\nAvailable files:'));
43
+ for (const f of allFiles) {
44
+ console.log(chalk.dim(` ${f}`));
45
+ }
46
+ if (Object.keys(manifest.files).length > 10) {
47
+ console.log(chalk.dim(` ... and ${Object.keys(manifest.files).length - 10} more`));
48
+ }
49
+ }
50
+ process.exit(0);
51
+ }
52
+ // Output
53
+ if (options.json) {
54
+ console.log(JSON.stringify(result, null, 2));
55
+ }
56
+ else {
57
+ console.log(chalk.bold(`\n📄 Patterns in ${result.file}:\n`));
58
+ console.log(chalk.dim(` Hash: ${result.metadata.hash}`));
59
+ console.log(chalk.dim(` Last scanned: ${result.metadata.lastScanned}`));
60
+ console.log('');
61
+ if (result.patterns.length === 0) {
62
+ console.log(chalk.yellow(' No patterns found'));
63
+ }
64
+ else {
65
+ // Group by category
66
+ const byCategory = new Map();
67
+ for (const p of result.patterns) {
68
+ if (!byCategory.has(p.category)) {
69
+ byCategory.set(p.category, []);
70
+ }
71
+ byCategory.get(p.category).push(p);
72
+ }
73
+ for (const [category, patterns] of byCategory) {
74
+ console.log(chalk.cyan(` ${category.toUpperCase()}`));
75
+ for (const p of patterns) {
76
+ console.log(` • ${chalk.white(p.name)}`);
77
+ for (const loc of p.locations) {
78
+ const range = `${loc.range.start}-${loc.range.end}`;
79
+ console.log(` ${chalk.dim('lines')} ${chalk.yellow(range)}: ${loc.type} ${chalk.green(loc.name)}`);
80
+ }
81
+ }
82
+ console.log('');
83
+ }
84
+ }
85
+ console.log(chalk.dim(`Total: ${result.patterns.length} patterns`));
86
+ }
87
+ });
88
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ignore Command - drift ignore
3
+ *
4
+ * Ignore a pattern to stop tracking it.
5
+ *
6
+ * @requirements 29.6
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface IgnoreOptions {
10
+ /** Reason for ignoring */
11
+ reason?: string;
12
+ /** Skip confirmation prompt */
13
+ yes?: boolean;
14
+ /** Enable verbose output */
15
+ verbose?: boolean;
16
+ }
17
+ export declare const ignoreCommand: Command;
18
+ //# sourceMappingURL=ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/commands/ignore.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiND,eAAO,MAAM,aAAa,SAMH,CAAC"}