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,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Drift CLI Entry Point
4
+ *
5
+ * Main entry point for the Drift command-line interface.
6
+ * Sets up Commander.js with all available commands.
7
+ *
8
+ * @requirements 29.1
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/bin/drift.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Drift CLI Entry Point
4
+ *
5
+ * Main entry point for the Drift command-line interface.
6
+ * Sets up Commander.js with all available commands.
7
+ *
8
+ * @requirements 29.1
9
+ */
10
+ import { Command } from 'commander';
11
+ import { VERSION } from '../index.js';
12
+ import { initCommand, scanCommand, checkCommand, statusCommand, approveCommand, ignoreCommand, reportCommand, exportCommand, whereCommand, filesCommand, } from '../commands/index.js';
13
+ /**
14
+ * Create and configure the main CLI program
15
+ */
16
+ function createProgram() {
17
+ const program = new Command();
18
+ program
19
+ .name('drift')
20
+ .description('Architectural drift detection - learn and enforce codebase patterns')
21
+ .version(VERSION, '-v, --version', 'Output the current version')
22
+ .option('--verbose', 'Enable verbose output')
23
+ .option('--no-color', 'Disable colored output');
24
+ // Register all commands
25
+ program.addCommand(initCommand);
26
+ program.addCommand(scanCommand);
27
+ program.addCommand(checkCommand);
28
+ program.addCommand(statusCommand);
29
+ program.addCommand(approveCommand);
30
+ program.addCommand(ignoreCommand);
31
+ program.addCommand(reportCommand);
32
+ program.addCommand(exportCommand);
33
+ program.addCommand(whereCommand);
34
+ program.addCommand(filesCommand);
35
+ // Add help examples
36
+ program.addHelpText('after', `
37
+ Examples:
38
+ $ drift init Initialize Drift in current directory
39
+ $ drift init --from-scaffold Initialize with Cheatcode2026 presets
40
+ $ drift scan Scan codebase for patterns
41
+ $ drift scan --manifest Generate manifest with semantic locations
42
+ $ drift check Check for violations
43
+ $ drift check --staged Check only staged files
44
+ $ drift check --ci Run in CI mode
45
+ $ drift status Show current drift status
46
+ $ drift approve <pattern-id> Approve a discovered pattern
47
+ $ drift ignore <pattern-id> Ignore a pattern
48
+ $ drift report Generate a report
49
+ $ drift report --format json Generate JSON report
50
+ $ drift export Export manifest as JSON
51
+ $ drift export --format ai-context Export for AI consumption
52
+ $ drift where <pattern> Find pattern locations
53
+ $ drift files <path> Show patterns in a file
54
+
55
+ Documentation:
56
+ https://github.com/drift/drift
57
+ `);
58
+ return program;
59
+ }
60
+ /**
61
+ * Main entry point
62
+ */
63
+ async function main() {
64
+ const program = createProgram();
65
+ try {
66
+ await program.parseAsync(process.argv);
67
+ }
68
+ catch (error) {
69
+ if (error instanceof Error) {
70
+ console.error(`Error: ${error.message}`);
71
+ if (process.env['DEBUG']) {
72
+ console.error(error.stack);
73
+ }
74
+ }
75
+ else {
76
+ console.error('An unexpected error occurred');
77
+ }
78
+ process.exit(1);
79
+ }
80
+ }
81
+ // Run the CLI
82
+ main();
83
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/bin/drift.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,qEAAqE,CAAC;SAClF,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAElD,wBAAwB;IACxB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEjC,oBAAoB;IACpB,OAAO,CAAC,WAAW,CACjB,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;CAqBH,CACE,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,cAAc;AACd,IAAI,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Approve Command - drift approve
3
+ *
4
+ * Approve a discovered pattern to enforce it.
5
+ *
6
+ * @requirements 29.5
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface ApproveOptions {
10
+ /** Approve all patterns matching a category */
11
+ category?: string;
12
+ /** Skip confirmation prompt */
13
+ yes?: boolean;
14
+ /** Enable verbose output */
15
+ verbose?: boolean;
16
+ }
17
+ export declare const approveCommand: Command;
18
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoSD,eAAO,MAAM,cAAc,SAMH,CAAC"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Approve Command - drift approve
3
+ *
4
+ * Approve a discovered pattern to enforce it.
5
+ *
6
+ * @requirements 29.5
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, InvalidStateTransitionError, } from 'driftdetect-core';
13
+ import { createSpinner, status } from '../ui/spinner.js';
14
+ import { confirmPrompt, promptBatchPatternApproval } from '../ui/prompts.js';
15
+ import { createPatternsTable } from '../ui/table.js';
16
+ /** Directory name for drift configuration */
17
+ const DRIFT_DIR = '.drift';
18
+ /**
19
+ * Check if drift is initialized
20
+ */
21
+ async function isDriftInitialized(rootDir) {
22
+ try {
23
+ await fs.access(path.join(rootDir, DRIFT_DIR));
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Approve command implementation
32
+ */
33
+ async function approveAction(patternId, options) {
34
+ const rootDir = process.cwd();
35
+ const verbose = options.verbose ?? false;
36
+ console.log();
37
+ console.log(chalk.bold('🔍 Drift - Approve Pattern'));
38
+ console.log();
39
+ // Check if initialized
40
+ if (!(await isDriftInitialized(rootDir))) {
41
+ status.error('Drift is not initialized. Run `drift init` first.');
42
+ process.exit(1);
43
+ }
44
+ // Initialize pattern store
45
+ const spinner = createSpinner('Loading patterns...');
46
+ spinner.start();
47
+ const store = new PatternStore({ rootDir });
48
+ await store.initialize();
49
+ spinner.succeed('Patterns loaded');
50
+ // Handle category-based approval
51
+ if (options.category) {
52
+ const category = options.category;
53
+ const discovered = store.getDiscovered().filter((p) => p.category === category);
54
+ if (discovered.length === 0) {
55
+ status.info(`No discovered patterns in category: ${category}`);
56
+ return;
57
+ }
58
+ console.log();
59
+ console.log(chalk.bold(`Discovered patterns in ${category}:`));
60
+ console.log();
61
+ const rows = discovered.map((p) => ({
62
+ id: p.id.slice(0, 13),
63
+ name: p.name.slice(0, 28),
64
+ category: p.category,
65
+ confidence: p.confidence.score,
66
+ locations: p.locations.length,
67
+ outliers: p.outliers.length,
68
+ }));
69
+ console.log(createPatternsTable(rows));
70
+ console.log();
71
+ // Confirm approval
72
+ if (!options.yes) {
73
+ const confirm = await confirmPrompt(`Approve all ${discovered.length} patterns in ${category}?`, false);
74
+ if (!confirm) {
75
+ status.info('Approval cancelled');
76
+ return;
77
+ }
78
+ }
79
+ // Approve all patterns in category
80
+ const approveSpinner = createSpinner('Approving patterns...');
81
+ approveSpinner.start();
82
+ let approvedCount = 0;
83
+ for (const pattern of discovered) {
84
+ try {
85
+ store.approve(pattern.id);
86
+ approvedCount++;
87
+ if (verbose) {
88
+ console.log(chalk.gray(` Approved: ${pattern.name}`));
89
+ }
90
+ }
91
+ catch (error) {
92
+ if (error instanceof InvalidStateTransitionError) {
93
+ if (verbose) {
94
+ console.log(chalk.yellow(` Skipped (already approved): ${pattern.name}`));
95
+ }
96
+ }
97
+ else {
98
+ throw error;
99
+ }
100
+ }
101
+ }
102
+ await store.saveAll();
103
+ approveSpinner.succeed(`Approved ${approvedCount} patterns`);
104
+ console.log();
105
+ return;
106
+ }
107
+ // Handle single pattern approval
108
+ // Check for special pattern IDs
109
+ if (patternId === 'all') {
110
+ const discovered = store.getDiscovered();
111
+ if (discovered.length === 0) {
112
+ status.info('No discovered patterns to approve');
113
+ return;
114
+ }
115
+ // Interactive batch approval
116
+ if (!options.yes) {
117
+ const choices = discovered.map((p) => ({
118
+ id: p.id,
119
+ name: p.name,
120
+ category: p.category,
121
+ confidence: p.confidence.score,
122
+ }));
123
+ const selectedIds = await promptBatchPatternApproval(choices);
124
+ if (selectedIds.length === 0) {
125
+ status.info('No patterns selected');
126
+ return;
127
+ }
128
+ const approveSpinner = createSpinner('Approving patterns...');
129
+ approveSpinner.start();
130
+ let approvedCount = 0;
131
+ for (const id of selectedIds) {
132
+ try {
133
+ store.approve(id);
134
+ approvedCount++;
135
+ }
136
+ catch {
137
+ // Skip errors
138
+ }
139
+ }
140
+ await store.saveAll();
141
+ approveSpinner.succeed(`Approved ${approvedCount} patterns`);
142
+ console.log();
143
+ return;
144
+ }
145
+ // Non-interactive: approve all
146
+ const approveSpinner = createSpinner('Approving all patterns...');
147
+ approveSpinner.start();
148
+ let approvedCount = 0;
149
+ for (const pattern of discovered) {
150
+ try {
151
+ store.approve(pattern.id);
152
+ approvedCount++;
153
+ }
154
+ catch {
155
+ // Skip errors
156
+ }
157
+ }
158
+ await store.saveAll();
159
+ approveSpinner.succeed(`Approved ${approvedCount} patterns`);
160
+ console.log();
161
+ return;
162
+ }
163
+ // Approve single pattern by ID
164
+ const pattern = store.get(patternId);
165
+ if (!pattern) {
166
+ // Try to find by partial ID match
167
+ const allPatterns = store.getAll();
168
+ const matches = allPatterns.filter((p) => p.id.includes(patternId) || p.name.toLowerCase().includes(patternId.toLowerCase()));
169
+ if (matches.length === 0) {
170
+ status.error(`Pattern not found: ${patternId}`);
171
+ console.log();
172
+ console.log(chalk.gray('Use `drift status -d` to see available patterns'));
173
+ process.exit(1);
174
+ }
175
+ if (matches.length === 1) {
176
+ // Single match, use it
177
+ const match = matches[0];
178
+ console.log(chalk.gray(`Found pattern: ${match.id}`));
179
+ console.log();
180
+ if (!options.yes) {
181
+ const confirm = await confirmPrompt(`Approve pattern "${match.name}"?`, true);
182
+ if (!confirm) {
183
+ status.info('Approval cancelled');
184
+ return;
185
+ }
186
+ }
187
+ try {
188
+ store.approve(match.id);
189
+ await store.saveAll();
190
+ status.success(`Approved pattern: ${match.name}`);
191
+ }
192
+ catch (error) {
193
+ if (error instanceof InvalidStateTransitionError) {
194
+ status.warning(`Pattern is already approved: ${match.name}`);
195
+ }
196
+ else {
197
+ throw error;
198
+ }
199
+ }
200
+ console.log();
201
+ return;
202
+ }
203
+ // Multiple matches, show them
204
+ console.log(chalk.yellow(`Multiple patterns match "${patternId}":`));
205
+ console.log();
206
+ const rows = matches.slice(0, 10).map((p) => ({
207
+ id: p.id.slice(0, 13),
208
+ name: p.name.slice(0, 28),
209
+ category: p.category,
210
+ confidence: p.confidence.score,
211
+ locations: p.locations.length,
212
+ outliers: p.outliers.length,
213
+ }));
214
+ console.log(createPatternsTable(rows));
215
+ if (matches.length > 10) {
216
+ console.log(chalk.gray(` ... and ${matches.length - 10} more`));
217
+ }
218
+ console.log();
219
+ console.log(chalk.gray('Please specify a more specific pattern ID'));
220
+ process.exit(1);
221
+ }
222
+ // Show pattern details
223
+ console.log(chalk.bold('Pattern Details'));
224
+ console.log(chalk.gray('─'.repeat(40)));
225
+ console.log(` ID: ${pattern.id}`);
226
+ console.log(` Name: ${pattern.name}`);
227
+ console.log(` Category: ${pattern.category}`);
228
+ console.log(` Status: ${pattern.status}`);
229
+ console.log(` Confidence: ${(pattern.confidence.score * 100).toFixed(0)}% (${pattern.confidence.level})`);
230
+ console.log(` Locations: ${pattern.locations.length}`);
231
+ console.log(` Outliers: ${pattern.outliers.length}`);
232
+ console.log(` Severity: ${pattern.severity}`);
233
+ console.log();
234
+ // Check if already approved
235
+ if (pattern.status === 'approved') {
236
+ status.warning('Pattern is already approved');
237
+ console.log();
238
+ return;
239
+ }
240
+ // Confirm approval
241
+ if (!options.yes) {
242
+ const confirm = await confirmPrompt(`Approve pattern "${pattern.name}"?`, true);
243
+ if (!confirm) {
244
+ status.info('Approval cancelled');
245
+ return;
246
+ }
247
+ }
248
+ // Approve the pattern
249
+ try {
250
+ store.approve(patternId);
251
+ await store.saveAll();
252
+ status.success(`Approved pattern: ${pattern.name}`);
253
+ }
254
+ catch (error) {
255
+ if (error instanceof InvalidStateTransitionError) {
256
+ status.error(`Cannot approve pattern from status: ${pattern.status}`);
257
+ }
258
+ else {
259
+ throw error;
260
+ }
261
+ }
262
+ console.log();
263
+ }
264
+ export const approveCommand = new Command('approve')
265
+ .description('Approve a pattern by ID')
266
+ .argument('<pattern-id>', 'Pattern ID to approve (or "all" for batch approval)')
267
+ .option('-c, --category <category>', 'Approve all patterns in category')
268
+ .option('-y, --yes', 'Skip confirmation prompt')
269
+ .option('--verbose', 'Enable verbose output')
270
+ .action(approveAction);
271
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
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 { type Violation } from 'driftdetect-core';
10
+ export interface CheckOptions {
11
+ /** Check only staged files */
12
+ staged?: boolean;
13
+ /** Run in CI mode */
14
+ ci?: boolean;
15
+ /** Output format */
16
+ format?: 'text' | 'json' | 'github' | 'gitlab';
17
+ /** Fail threshold (error, warning, none) */
18
+ failOn?: 'error' | 'warning' | 'none';
19
+ /** Enable verbose output */
20
+ verbose?: boolean;
21
+ }
22
+ export interface CheckResult {
23
+ /** Number of violations */
24
+ violationCount: number;
25
+ /** Number of errors */
26
+ errorCount: number;
27
+ /** Number of warnings */
28
+ warningCount: number;
29
+ /** Exit code */
30
+ exitCode: number;
31
+ /** Violations found */
32
+ violations: Violation[];
33
+ }
34
+ /**
35
+ * Determine exit code based on violations and threshold
36
+ */
37
+ export declare function getExitCode(violations: Violation[], failOn: 'error' | 'warning' | 'none'): number;
38
+ export declare const checkCommand: Command;
39
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAEL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAC;AAY1B,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;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;IACjB,uBAAuB;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AA0CD;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GACnC,MAAM,CAWR;AAqND,eAAO,MAAM,YAAY,SAOH,CAAC"}