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,200 @@
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
+ 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, promptIgnoreReason } 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
+ * Ignore command implementation
32
+ */
33
+ async function ignoreAction(patternId, options) {
34
+ const rootDir = process.cwd();
35
+ console.log();
36
+ console.log(chalk.bold('🔍 Drift - Ignore Pattern'));
37
+ console.log();
38
+ // Check if initialized
39
+ if (!(await isDriftInitialized(rootDir))) {
40
+ status.error('Drift is not initialized. Run `drift init` first.');
41
+ process.exit(1);
42
+ }
43
+ // Initialize pattern store
44
+ const spinner = createSpinner('Loading patterns...');
45
+ spinner.start();
46
+ const store = new PatternStore({ rootDir });
47
+ await store.initialize();
48
+ spinner.succeed('Patterns loaded');
49
+ // Find the pattern
50
+ const pattern = store.get(patternId);
51
+ if (!pattern) {
52
+ // Try to find by partial ID match
53
+ const allPatterns = store.getAll();
54
+ const matches = allPatterns.filter((p) => p.id.includes(patternId) ||
55
+ p.name.toLowerCase().includes(patternId.toLowerCase()));
56
+ if (matches.length === 0) {
57
+ status.error(`Pattern not found: ${patternId}`);
58
+ console.log();
59
+ console.log(chalk.gray('Use `drift status -d` to see available patterns'));
60
+ process.exit(1);
61
+ }
62
+ if (matches.length === 1) {
63
+ // Single match, use it
64
+ const match = matches[0];
65
+ console.log(chalk.gray(`Found pattern: ${match.id}`));
66
+ console.log();
67
+ // Get reason if not provided
68
+ let reason = options.reason;
69
+ if (!reason && !options.yes) {
70
+ reason = await promptIgnoreReason();
71
+ }
72
+ if (!options.yes) {
73
+ const confirm = await confirmPrompt(`Ignore pattern "${match.name}"?`, false);
74
+ if (!confirm) {
75
+ status.info('Ignore cancelled');
76
+ return;
77
+ }
78
+ }
79
+ try {
80
+ // Update pattern with reason in metadata
81
+ if (reason) {
82
+ store.update(match.id, {
83
+ metadata: {
84
+ ...match.metadata,
85
+ custom: {
86
+ ...match.metadata.custom,
87
+ ignoreReason: reason,
88
+ },
89
+ },
90
+ });
91
+ }
92
+ store.ignore(match.id);
93
+ await store.saveAll();
94
+ status.success(`Ignored pattern: ${match.name}`);
95
+ if (reason) {
96
+ console.log(chalk.gray(` Reason: ${reason}`));
97
+ }
98
+ }
99
+ catch (error) {
100
+ if (error instanceof InvalidStateTransitionError) {
101
+ status.warning(`Pattern is already ignored: ${match.name}`);
102
+ }
103
+ else {
104
+ throw error;
105
+ }
106
+ }
107
+ console.log();
108
+ return;
109
+ }
110
+ // Multiple matches, show them
111
+ console.log(chalk.yellow(`Multiple patterns match "${patternId}":`));
112
+ console.log();
113
+ const rows = matches.slice(0, 10).map((p) => ({
114
+ id: p.id.slice(0, 13),
115
+ name: p.name.slice(0, 28),
116
+ category: p.category,
117
+ confidence: p.confidence.score,
118
+ locations: p.locations.length,
119
+ outliers: p.outliers.length,
120
+ }));
121
+ console.log(createPatternsTable(rows));
122
+ if (matches.length > 10) {
123
+ console.log(chalk.gray(` ... and ${matches.length - 10} more`));
124
+ }
125
+ console.log();
126
+ console.log(chalk.gray('Please specify a more specific pattern ID'));
127
+ process.exit(1);
128
+ }
129
+ // Show pattern details
130
+ console.log(chalk.bold('Pattern Details'));
131
+ console.log(chalk.gray('─'.repeat(40)));
132
+ console.log(` ID: ${pattern.id}`);
133
+ console.log(` Name: ${pattern.name}`);
134
+ console.log(` Category: ${pattern.category}`);
135
+ console.log(` Status: ${pattern.status}`);
136
+ console.log(` Confidence: ${(pattern.confidence.score * 100).toFixed(0)}% (${pattern.confidence.level})`);
137
+ console.log(` Locations: ${pattern.locations.length}`);
138
+ console.log(` Outliers: ${pattern.outliers.length}`);
139
+ console.log();
140
+ // Check if already ignored
141
+ if (pattern.status === 'ignored') {
142
+ status.warning('Pattern is already ignored');
143
+ console.log();
144
+ return;
145
+ }
146
+ // Get reason if not provided
147
+ let reason = options.reason;
148
+ if (!reason && !options.yes) {
149
+ reason = await promptIgnoreReason();
150
+ }
151
+ // Confirm ignore
152
+ if (!options.yes) {
153
+ const confirmMsg = pattern.status === 'approved'
154
+ ? `This pattern is currently approved. Ignore "${pattern.name}"?`
155
+ : `Ignore pattern "${pattern.name}"?`;
156
+ const confirm = await confirmPrompt(confirmMsg, false);
157
+ if (!confirm) {
158
+ status.info('Ignore cancelled');
159
+ return;
160
+ }
161
+ }
162
+ // Ignore the pattern
163
+ try {
164
+ // Update pattern with reason in metadata
165
+ if (reason) {
166
+ store.update(pattern.id, {
167
+ metadata: {
168
+ ...pattern.metadata,
169
+ custom: {
170
+ ...pattern.metadata.custom,
171
+ ignoreReason: reason,
172
+ },
173
+ },
174
+ });
175
+ }
176
+ store.ignore(patternId);
177
+ await store.saveAll();
178
+ status.success(`Ignored pattern: ${pattern.name}`);
179
+ if (reason) {
180
+ console.log(chalk.gray(` Reason: ${reason}`));
181
+ }
182
+ }
183
+ catch (error) {
184
+ if (error instanceof InvalidStateTransitionError) {
185
+ status.error(`Cannot ignore pattern from status: ${pattern.status}`);
186
+ }
187
+ else {
188
+ throw error;
189
+ }
190
+ }
191
+ console.log();
192
+ }
193
+ export const ignoreCommand = new Command('ignore')
194
+ .description('Ignore a pattern by ID')
195
+ .argument('<pattern-id>', 'Pattern ID to ignore')
196
+ .option('-r, --reason <reason>', 'Reason for ignoring the pattern')
197
+ .option('-y, --yes', 'Skip confirmation prompt')
198
+ .option('--verbose', 'Enable verbose output')
199
+ .action(ignoreAction);
200
+ //# sourceMappingURL=ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/commands/ignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Commands module exports
3
+ *
4
+ * Exports all CLI commands for registration with Commander.js
5
+ */
6
+ export { initCommand } from './init.js';
7
+ export { scanCommand } from './scan.js';
8
+ export { checkCommand } from './check.js';
9
+ export { statusCommand } from './status.js';
10
+ export { approveCommand } from './approve.js';
11
+ export { ignoreCommand } from './ignore.js';
12
+ export { reportCommand } from './report.js';
13
+ export { exportCommand } from './export.js';
14
+ export { whereCommand } from './where.js';
15
+ export { filesCommand } from './files.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Commands module exports
3
+ *
4
+ * Exports all CLI commands for registration with Commander.js
5
+ */
6
+ export { initCommand } from './init.js';
7
+ export { scanCommand } from './scan.js';
8
+ export { checkCommand } from './check.js';
9
+ export { statusCommand } from './status.js';
10
+ export { approveCommand } from './approve.js';
11
+ export { ignoreCommand } from './ignore.js';
12
+ export { reportCommand } from './report.js';
13
+ export { exportCommand } from './export.js';
14
+ export { whereCommand } from './where.js';
15
+ export { filesCommand } from './files.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Init Command - drift init
3
+ *
4
+ * Initialize Drift in a project by creating the .drift/ directory
5
+ * and running an initial scan.
6
+ *
7
+ * @requirements 29.1, 38.1
8
+ */
9
+ import { Command } from 'commander';
10
+ export interface InitOptions {
11
+ /** Initialize from Cheatcode2026 scaffold */
12
+ fromScaffold?: boolean;
13
+ /** Skip interactive prompts */
14
+ yes?: boolean;
15
+ /** Enable verbose output */
16
+ verbose?: boolean;
17
+ }
18
+ export declare const initCommand: Command;
19
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA4UD,eAAO,MAAM,WAAW,SAKH,CAAC"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Init Command - drift init
3
+ *
4
+ * Initialize Drift in a project by creating the .drift/ directory
5
+ * and running an initial scan.
6
+ *
7
+ * @requirements 29.1, 38.1
8
+ */
9
+ import { Command } from 'commander';
10
+ import * as fs from 'node:fs/promises';
11
+ import * as path from 'node:path';
12
+ import chalk from 'chalk';
13
+ import { PatternStore } from 'driftdetect-core';
14
+ import { createSpinner, status } from '../ui/spinner.js';
15
+ import { promptInitOptions, confirmPrompt } from '../ui/prompts.js';
16
+ /** Directory name for drift configuration */
17
+ const DRIFT_DIR = '.drift';
18
+ /** Subdirectories to create */
19
+ const DRIFT_SUBDIRS = [
20
+ 'patterns/discovered',
21
+ 'patterns/approved',
22
+ 'patterns/ignored',
23
+ 'patterns/variants',
24
+ 'history',
25
+ 'cache',
26
+ 'reports',
27
+ ];
28
+ /**
29
+ * Check if drift is already initialized
30
+ */
31
+ async function isDriftInitialized(rootDir) {
32
+ try {
33
+ await fs.access(path.join(rootDir, DRIFT_DIR));
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ /**
41
+ * Create the .drift directory structure
42
+ */
43
+ async function createDriftDirectory(rootDir, verbose) {
44
+ const driftDir = path.join(rootDir, DRIFT_DIR);
45
+ // Create main .drift directory
46
+ await fs.mkdir(driftDir, { recursive: true });
47
+ // Create subdirectories
48
+ for (const subdir of DRIFT_SUBDIRS) {
49
+ const subdirPath = path.join(driftDir, subdir);
50
+ await fs.mkdir(subdirPath, { recursive: true });
51
+ if (verbose) {
52
+ status.info(`Created ${path.relative(rootDir, subdirPath)}`);
53
+ }
54
+ }
55
+ // Create default config file
56
+ const configPath = path.join(driftDir, 'config.json');
57
+ const defaultConfig = {
58
+ version: '1.0.0',
59
+ severity: {},
60
+ ignore: [
61
+ 'node_modules/**',
62
+ 'dist/**',
63
+ 'build/**',
64
+ '.git/**',
65
+ 'coverage/**',
66
+ '*.min.js',
67
+ '*.bundle.js',
68
+ ],
69
+ ci: {
70
+ failOn: 'error',
71
+ reportFormat: 'text',
72
+ },
73
+ learning: {
74
+ autoApproveThreshold: 0.95,
75
+ minOccurrences: 3,
76
+ },
77
+ performance: {
78
+ maxWorkers: 4,
79
+ cacheEnabled: true,
80
+ incrementalAnalysis: true,
81
+ },
82
+ };
83
+ await fs.writeFile(configPath, JSON.stringify(defaultConfig, null, 2));
84
+ if (verbose) {
85
+ status.info(`Created ${path.relative(rootDir, configPath)}`);
86
+ }
87
+ // Create .driftignore file
88
+ const driftignorePath = path.join(rootDir, '.driftignore');
89
+ const driftignoreContent = `# Drift ignore patterns
90
+ # Add files and directories to ignore during scanning
91
+
92
+ # Dependencies
93
+ node_modules/
94
+ .pnpm-store/
95
+
96
+ # Build outputs
97
+ dist/
98
+ build/
99
+ out/
100
+ .next/
101
+
102
+ # Test coverage
103
+ coverage/
104
+
105
+ # IDE and editor files
106
+ .idea/
107
+ .vscode/
108
+ *.swp
109
+ *.swo
110
+
111
+ # OS files
112
+ .DS_Store
113
+ Thumbs.db
114
+
115
+ # Logs
116
+ *.log
117
+ logs/
118
+
119
+ # Temporary files
120
+ tmp/
121
+ temp/
122
+ `;
123
+ try {
124
+ await fs.access(driftignorePath);
125
+ // File exists, don't overwrite
126
+ }
127
+ catch {
128
+ await fs.writeFile(driftignorePath, driftignoreContent);
129
+ if (verbose) {
130
+ status.info(`Created .driftignore`);
131
+ }
132
+ }
133
+ }
134
+ /**
135
+ * Detect Cheatcode2026 scaffold markers
136
+ */
137
+ async function detectCheatcode2026(rootDir) {
138
+ // Check for common Cheatcode2026 markers
139
+ const markers = [
140
+ '2026cheatcode/scaffolding/00-MANIFEST.md',
141
+ 'apps/web/lib/resilience',
142
+ 'packages/backend/src',
143
+ ];
144
+ for (const marker of markers) {
145
+ try {
146
+ await fs.access(path.join(rootDir, marker));
147
+ return true;
148
+ }
149
+ catch {
150
+ // Continue checking other markers
151
+ }
152
+ }
153
+ return false;
154
+ }
155
+ /**
156
+ * Load Cheatcode2026 presets
157
+ */
158
+ async function loadCheatcode2026Presets(store, verbose) {
159
+ // Cheatcode2026 enterprise patterns to auto-approve
160
+ const cheatcodePatterns = [
161
+ { id: 'cc2026-exception-taxonomy', name: 'Exception Taxonomy', category: 'errors' },
162
+ { id: 'cc2026-circuit-breaker', name: 'Circuit Breaker Pattern', category: 'errors' },
163
+ { id: 'cc2026-auth-middleware', name: 'Auth Middleware', category: 'auth' },
164
+ { id: 'cc2026-structured-logging', name: 'Structured Logging', category: 'logging' },
165
+ { id: 'cc2026-design-tokens', name: 'Design Tokens', category: 'styling' },
166
+ { id: 'cc2026-job-state-machine', name: 'Job State Machine', category: 'data-access' },
167
+ { id: 'cc2026-response-helpers', name: 'Response Helpers', category: 'api' },
168
+ { id: 'cc2026-input-sanitization', name: 'Input Sanitization', category: 'security' },
169
+ { id: 'cc2026-csp-headers', name: 'CSP Headers', category: 'security' },
170
+ { id: 'cc2026-rate-limiting', name: 'Rate Limiting', category: 'security' },
171
+ { id: 'cc2026-env-validation', name: 'Environment Validation', category: 'config' },
172
+ { id: 'cc2026-feature-flags', name: 'Feature Flags', category: 'config' },
173
+ { id: 'cc2026-test-structure', name: 'Test Structure (AAA)', category: 'testing' },
174
+ { id: 'cc2026-api-routes', name: 'API Route Structure', category: 'api' },
175
+ { id: 'cc2026-error-responses', name: 'Error Response Format', category: 'api' },
176
+ { id: 'cc2026-rbac', name: 'Role-Based Access Control', category: 'auth' },
177
+ { id: 'cc2026-correlation-ids', name: 'Correlation IDs', category: 'logging' },
178
+ { id: 'cc2026-health-checks', name: 'Health Check Patterns', category: 'logging' },
179
+ ];
180
+ let loadedCount = 0;
181
+ for (const preset of cheatcodePatterns) {
182
+ // Create a pattern entry for each preset
183
+ const now = new Date().toISOString();
184
+ const pattern = {
185
+ id: preset.id,
186
+ category: preset.category,
187
+ subcategory: 'cheatcode2026',
188
+ name: preset.name,
189
+ description: `Cheatcode2026 enterprise pattern: ${preset.name}`,
190
+ detector: {
191
+ type: 'custom',
192
+ config: { source: 'cheatcode2026' },
193
+ },
194
+ confidence: {
195
+ frequency: 1.0,
196
+ consistency: 1.0,
197
+ age: 0,
198
+ spread: 1,
199
+ score: 1.0,
200
+ level: 'high',
201
+ },
202
+ locations: [],
203
+ outliers: [],
204
+ metadata: {
205
+ firstSeen: now,
206
+ lastSeen: now,
207
+ approvedAt: now,
208
+ source: 'cheatcode2026',
209
+ tags: ['cheatcode2026', 'enterprise', 'preset'],
210
+ },
211
+ severity: 'warning',
212
+ autoFixable: false,
213
+ status: 'approved',
214
+ };
215
+ try {
216
+ store.add(pattern);
217
+ loadedCount++;
218
+ if (verbose) {
219
+ status.info(`Loaded preset: ${preset.name}`);
220
+ }
221
+ }
222
+ catch {
223
+ // Pattern might already exist
224
+ if (verbose) {
225
+ status.warning(`Skipped existing preset: ${preset.name}`);
226
+ }
227
+ }
228
+ }
229
+ return loadedCount;
230
+ }
231
+ /**
232
+ * Init command implementation
233
+ */
234
+ async function initAction(options) {
235
+ const rootDir = process.cwd();
236
+ const verbose = options.verbose ?? false;
237
+ console.log();
238
+ console.log(chalk.bold('🔍 Drift - Architectural Drift Detection'));
239
+ console.log();
240
+ // Check if already initialized
241
+ if (await isDriftInitialized(rootDir)) {
242
+ if (!options.yes) {
243
+ const overwrite = await confirmPrompt('Drift is already initialized. Reinitialize?', false);
244
+ if (!overwrite) {
245
+ status.info('Initialization cancelled');
246
+ return;
247
+ }
248
+ }
249
+ }
250
+ // Create directory structure
251
+ const spinner = createSpinner('Creating .drift directory structure...');
252
+ spinner.start();
253
+ try {
254
+ await createDriftDirectory(rootDir, verbose);
255
+ spinner.succeed('Created .drift directory structure');
256
+ }
257
+ catch (error) {
258
+ spinner.fail('Failed to create .drift directory');
259
+ console.error(chalk.red(error.message));
260
+ process.exit(1);
261
+ }
262
+ // Initialize pattern store
263
+ const store = new PatternStore({ rootDir });
264
+ await store.initialize();
265
+ // Handle Cheatcode2026 scaffold
266
+ let isCheatcode = false;
267
+ if (options.fromScaffold) {
268
+ isCheatcode = true;
269
+ }
270
+ else {
271
+ // Auto-detect Cheatcode2026
272
+ isCheatcode = await detectCheatcode2026(rootDir);
273
+ if (isCheatcode && !options.yes) {
274
+ const usePresets = await confirmPrompt('Cheatcode2026 scaffold detected. Load enterprise presets?', true);
275
+ isCheatcode = usePresets;
276
+ }
277
+ }
278
+ if (isCheatcode) {
279
+ const presetSpinner = createSpinner('Loading Cheatcode2026 presets...');
280
+ presetSpinner.start();
281
+ try {
282
+ const count = await loadCheatcode2026Presets(store, verbose);
283
+ await store.saveAll();
284
+ presetSpinner.succeed(`Loaded ${count} Cheatcode2026 enterprise patterns`);
285
+ }
286
+ catch (error) {
287
+ presetSpinner.fail('Failed to load presets');
288
+ console.error(chalk.red(error.message));
289
+ }
290
+ }
291
+ // Get init options
292
+ let initOpts = { scanNow: true, autoApprove: false };
293
+ if (!options.yes) {
294
+ initOpts = await promptInitOptions();
295
+ }
296
+ // Run initial scan if requested
297
+ if (initOpts.scanNow) {
298
+ console.log();
299
+ console.log(chalk.gray('To run an initial scan, use:'));
300
+ console.log(chalk.cyan(' drift scan'));
301
+ console.log();
302
+ console.log(chalk.gray('To check for violations:'));
303
+ console.log(chalk.cyan(' drift check'));
304
+ }
305
+ // Summary
306
+ console.log();
307
+ status.success('Drift initialized successfully!');
308
+ console.log();
309
+ console.log(chalk.gray('Configuration: .drift/config.json'));
310
+ console.log(chalk.gray('Patterns: .drift/patterns/'));
311
+ console.log(chalk.gray('Ignore rules: .driftignore'));
312
+ console.log();
313
+ }
314
+ export const initCommand = new Command('init')
315
+ .description('Initialize Drift in the current directory')
316
+ .option('--from-scaffold', 'Initialize with Cheatcode2026 presets')
317
+ .option('-y, --yes', 'Skip interactive prompts and use defaults')
318
+ .option('--verbose', 'Enable verbose output')
319
+ .action(initAction);
320
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Report Command - drift report
3
+ *
4
+ * Generate reports in various formats.
5
+ *
6
+ * @requirements 29.7
7
+ */
8
+ import { Command } from 'commander';
9
+ export interface ReportOptions {
10
+ /** Output format */
11
+ format?: 'text' | 'json' | 'github' | 'gitlab';
12
+ /** Output file path */
13
+ output?: string;
14
+ /** Include only specific categories */
15
+ categories?: string[];
16
+ /** Enable verbose output */
17
+ verbose?: boolean;
18
+ }
19
+ export declare const reportCommand: Command;
20
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA8MD,eAAO,MAAM,aAAa,SAMH,CAAC"}