driftdetect 0.9.45 → 0.9.46

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 (49) hide show
  1. package/dist/commands/setup/index.d.ts +17 -0
  2. package/dist/commands/setup/index.d.ts.map +1 -0
  3. package/dist/commands/setup/index.js +592 -0
  4. package/dist/commands/setup/index.js.map +1 -0
  5. package/dist/commands/setup/runners/base.d.ts +34 -0
  6. package/dist/commands/setup/runners/base.d.ts.map +1 -0
  7. package/dist/commands/setup/runners/base.js +20 -0
  8. package/dist/commands/setup/runners/base.js.map +1 -0
  9. package/dist/commands/setup/runners/callgraph.d.ts +17 -0
  10. package/dist/commands/setup/runners/callgraph.d.ts.map +1 -0
  11. package/dist/commands/setup/runners/callgraph.js +91 -0
  12. package/dist/commands/setup/runners/callgraph.js.map +1 -0
  13. package/dist/commands/setup/runners/coupling.d.ts +20 -0
  14. package/dist/commands/setup/runners/coupling.d.ts.map +1 -0
  15. package/dist/commands/setup/runners/coupling.js +121 -0
  16. package/dist/commands/setup/runners/coupling.js.map +1 -0
  17. package/dist/commands/setup/runners/dna.d.ts +17 -0
  18. package/dist/commands/setup/runners/dna.d.ts.map +1 -0
  19. package/dist/commands/setup/runners/dna.js +72 -0
  20. package/dist/commands/setup/runners/dna.js.map +1 -0
  21. package/dist/commands/setup/runners/index.d.ts +12 -0
  22. package/dist/commands/setup/runners/index.d.ts.map +1 -0
  23. package/dist/commands/setup/runners/index.js +12 -0
  24. package/dist/commands/setup/runners/index.js.map +1 -0
  25. package/dist/commands/setup/runners/memory.d.ts +17 -0
  26. package/dist/commands/setup/runners/memory.d.ts.map +1 -0
  27. package/dist/commands/setup/runners/memory.js +71 -0
  28. package/dist/commands/setup/runners/memory.js.map +1 -0
  29. package/dist/commands/setup/runners/test-topology.d.ts +20 -0
  30. package/dist/commands/setup/runners/test-topology.d.ts.map +1 -0
  31. package/dist/commands/setup/runners/test-topology.js +137 -0
  32. package/dist/commands/setup/runners/test-topology.js.map +1 -0
  33. package/dist/commands/setup/types.d.ts +99 -0
  34. package/dist/commands/setup/types.d.ts.map +1 -0
  35. package/dist/commands/setup/types.js +42 -0
  36. package/dist/commands/setup/types.js.map +1 -0
  37. package/dist/commands/setup/ui.d.ts +16 -0
  38. package/dist/commands/setup/ui.d.ts.map +1 -0
  39. package/dist/commands/setup/ui.js +108 -0
  40. package/dist/commands/setup/ui.js.map +1 -0
  41. package/dist/commands/setup/utils.d.ts +20 -0
  42. package/dist/commands/setup/utils.d.ts.map +1 -0
  43. package/dist/commands/setup/utils.js +178 -0
  44. package/dist/commands/setup/utils.js.map +1 -0
  45. package/dist/commands/setup.d.ts +2 -18
  46. package/dist/commands/setup.d.ts.map +1 -1
  47. package/dist/commands/setup.js +2 -883
  48. package/dist/commands/setup.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Setup Command - drift setup
3
+ *
4
+ * Enterprise-grade guided onboarding that creates a Source of Truth
5
+ * for your codebase. Every feature runs REAL analysis.
6
+ *
7
+ * Architecture:
8
+ * - types.ts: Shared type definitions
9
+ * - utils.ts: File system and helper utilities
10
+ * - ui.ts: Console output formatting
11
+ * - runners/: Individual feature runners (single responsibility)
12
+ *
13
+ * @module commands/setup
14
+ */
15
+ import { Command } from 'commander';
16
+ export declare const setupCommand: Command;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/setup/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0uBpC,eAAO,MAAM,YAAY,SAKH,CAAC"}
@@ -0,0 +1,592 @@
1
+ /**
2
+ * Setup Command - drift setup
3
+ *
4
+ * Enterprise-grade guided onboarding that creates a Source of Truth
5
+ * for your codebase. Every feature runs REAL analysis.
6
+ *
7
+ * Architecture:
8
+ * - types.ts: Shared type definitions
9
+ * - utils.ts: File system and helper utilities
10
+ * - ui.ts: Console output formatting
11
+ * - runners/: Individual feature runners (single responsibility)
12
+ *
13
+ * @module commands/setup
14
+ */
15
+ import * as crypto from 'node:crypto';
16
+ import * as fs from 'node:fs/promises';
17
+ import * as path from 'node:path';
18
+ import { EventEmitter } from 'node:events';
19
+ // Increase max listeners to avoid warnings with multiple prompts
20
+ EventEmitter.defaultMaxListeners = 50;
21
+ import chalk from 'chalk';
22
+ import { Command } from 'commander';
23
+ import { confirm, select } from '@inquirer/prompts';
24
+ import { PatternStore, getProjectRegistry, FileWalker, getDefaultIgnorePatterns, mergeIgnorePatterns, createWorkspaceManager, } from 'driftdetect-core';
25
+ import { createSpinner } from '../../ui/spinner.js';
26
+ import { createCLIPatternService } from '../../services/pattern-service-factory.js';
27
+ import { createScannerService } from '../../services/scanner-service.js';
28
+ import { VERSION } from '../../index.js';
29
+ import { DRIFT_DIR, SCHEMA_VERSION, } from './types.js';
30
+ import { isDriftInitialized, createDriftDirectory, createDefaultConfig, createDriftignore, loadSourceOfTruth, saveSourceOfTruth, loadSetupState, saveSetupState, clearSetupState, countSourceFiles, computeChecksum, isScannableFile, } from './utils.js';
31
+ import { printWelcome, printPhase, printFeature, printSuccess, printSkip, printInfo, printSummary, } from './ui.js';
32
+ import { CallGraphRunner, TestTopologyRunner, CouplingRunner, DNARunner, MemoryRunner, } from './runners/index.js';
33
+ // ═══════════════════════════════════════════════════════════════════════════
34
+ // HELPER FUNCTIONS
35
+ // ═══════════════════════════════════════════════════════════════════════════
36
+ async function loadIgnorePatterns(rootDir) {
37
+ try {
38
+ const content = await fs.readFile(path.join(rootDir, '.driftignore'), 'utf-8');
39
+ const userPatterns = content.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
40
+ return mergeIgnorePatterns(userPatterns);
41
+ }
42
+ catch {
43
+ return getDefaultIgnorePatterns();
44
+ }
45
+ }
46
+ function mapToPatternCategory(category) {
47
+ const mapping = {
48
+ 'api': 'api', 'auth': 'auth', 'security': 'security', 'errors': 'errors',
49
+ 'structural': 'structural', 'components': 'components', 'styling': 'styling',
50
+ 'logging': 'logging', 'testing': 'testing', 'data-access': 'data-access',
51
+ 'config': 'config', 'types': 'types', 'performance': 'performance',
52
+ 'accessibility': 'accessibility', 'documentation': 'documentation',
53
+ };
54
+ return mapping[category] || 'structural';
55
+ }
56
+ function createDefaultState() {
57
+ return {
58
+ phase: 0,
59
+ completed: [],
60
+ choices: {
61
+ autoApprove: false,
62
+ approveThreshold: 0.85,
63
+ buildCallGraph: false,
64
+ buildTestTopology: false,
65
+ buildCoupling: false,
66
+ scanDna: false,
67
+ initMemory: false,
68
+ },
69
+ startedAt: new Date().toISOString(),
70
+ };
71
+ }
72
+ // ═══════════════════════════════════════════════════════════════════════════
73
+ // PHASE 0: DETECT EXISTING
74
+ // ═══════════════════════════════════════════════════════════════════════════
75
+ async function phaseDetectExisting(rootDir, autoYes) {
76
+ printPhase(0, 'Detection', 'Checking for existing Drift installation');
77
+ const initialized = await isDriftInitialized(rootDir);
78
+ const sot = initialized ? await loadSourceOfTruth(rootDir) : null;
79
+ if (!initialized) {
80
+ printInfo('No existing installation found. Starting fresh setup.');
81
+ return { isNew: true, sot: null, shouldContinue: true };
82
+ }
83
+ if (sot) {
84
+ console.log(chalk.yellow(' ⚡ Existing Source of Truth detected!'));
85
+ console.log();
86
+ console.log(chalk.gray(` Project: ${sot.project.name}`));
87
+ console.log(chalk.gray(` Created: ${new Date(sot.createdAt).toLocaleDateString()}`));
88
+ console.log(chalk.gray(` Patterns: ${sot.baseline.patternCount} (${sot.baseline.approvedCount} approved)`));
89
+ console.log();
90
+ if (autoYes) {
91
+ printInfo('Using existing Source of Truth (--yes flag)');
92
+ return { isNew: false, sot, shouldContinue: true };
93
+ }
94
+ const choice = await select({
95
+ message: 'What would you like to do?',
96
+ choices: [
97
+ { value: 'use', name: 'Use existing Source of Truth (recommended)' },
98
+ { value: 'rescan', name: 'Rescan and update baseline (keeps approved patterns)' },
99
+ { value: 'fresh', name: 'Start fresh (creates backup first)' },
100
+ { value: 'cancel', name: 'Cancel setup' },
101
+ ],
102
+ });
103
+ if (choice === 'cancel') {
104
+ return { isNew: false, sot, shouldContinue: false };
105
+ }
106
+ if (choice === 'use') {
107
+ printSuccess('Using existing Source of Truth');
108
+ return { isNew: false, sot, shouldContinue: true };
109
+ }
110
+ if (choice === 'fresh') {
111
+ const spinner = createSpinner('Creating backup...');
112
+ spinner.start();
113
+ try {
114
+ const manager = createWorkspaceManager(rootDir);
115
+ await manager.initialize({ driftVersion: VERSION });
116
+ await manager.createBackup('pre_destructive_operation');
117
+ spinner.succeed('Backup created');
118
+ }
119
+ catch (error) {
120
+ spinner.fail(`Backup failed: ${error.message}`);
121
+ if (!autoYes) {
122
+ const proceed = await confirm({ message: 'Continue without backup?', default: false });
123
+ if (!proceed) {
124
+ return { isNew: false, sot, shouldContinue: false };
125
+ }
126
+ }
127
+ }
128
+ return { isNew: true, sot: null, shouldContinue: true };
129
+ }
130
+ return { isNew: false, sot, shouldContinue: true };
131
+ }
132
+ console.log(chalk.yellow(' ⚠ Legacy installation detected (no Source of Truth)'));
133
+ printInfo('Will create Source of Truth from existing data.');
134
+ return { isNew: false, sot: null, shouldContinue: true };
135
+ }
136
+ // ═══════════════════════════════════════════════════════════════════════════
137
+ // PHASE 1: INITIALIZE
138
+ // ═══════════════════════════════════════════════════════════════════════════
139
+ async function phaseInitialize(rootDir, isNew) {
140
+ printPhase(1, 'Initialize', 'Setting up project structure');
141
+ const projectId = crypto.randomUUID();
142
+ if (isNew) {
143
+ const spinner = createSpinner('Creating .drift directory...');
144
+ spinner.start();
145
+ await createDriftDirectory(rootDir);
146
+ await createDefaultConfig(rootDir, projectId);
147
+ await createDriftignore(rootDir);
148
+ spinner.succeed('Project structure created');
149
+ }
150
+ else {
151
+ printInfo('Using existing project structure');
152
+ }
153
+ try {
154
+ const registry = await getProjectRegistry();
155
+ const existing = registry.findByPath(rootDir);
156
+ if (existing) {
157
+ await registry.setActive(existing.id);
158
+ printSuccess(`Project registered: ${chalk.cyan(existing.name)}`);
159
+ return existing.id;
160
+ }
161
+ else {
162
+ const project = await registry.register(rootDir);
163
+ await registry.setActive(project.id);
164
+ printSuccess(`Project registered: ${chalk.cyan(project.name)}`);
165
+ return project.id;
166
+ }
167
+ }
168
+ catch {
169
+ printInfo('Global registry unavailable (single-project mode)');
170
+ return projectId;
171
+ }
172
+ }
173
+ // ═══════════════════════════════════════════════════════════════════════════
174
+ // PHASE 2: PATTERN SCAN
175
+ // ═══════════════════════════════════════════════════════════════════════════
176
+ async function phaseScan(rootDir, autoYes, verbose, state) {
177
+ printPhase(2, 'Pattern Discovery', 'Scanning your codebase for patterns');
178
+ console.log(chalk.gray(' Drift analyzes your code to discover:'));
179
+ console.log(chalk.gray(' • API patterns (routes, endpoints, middleware)'));
180
+ console.log(chalk.gray(' • Auth patterns (authentication, authorization)'));
181
+ console.log(chalk.gray(' • Error handling patterns'));
182
+ console.log(chalk.gray(' • Data access patterns (queries, ORM usage)'));
183
+ console.log(chalk.gray(' • Structural patterns (naming, organization)'));
184
+ console.log(chalk.gray(' • And 10+ more categories...'));
185
+ console.log();
186
+ const fileCount = await countSourceFiles(rootDir);
187
+ console.log(` Found ${chalk.cyan(fileCount.toLocaleString())} source files.`);
188
+ console.log();
189
+ const shouldScan = autoYes || await confirm({ message: 'Run pattern scan?', default: true });
190
+ if (!shouldScan) {
191
+ printSkip('Skipping scan. Run `drift scan` later.');
192
+ return { success: false, patternCount: 0, categories: {} };
193
+ }
194
+ const spinner = createSpinner(`Scanning ${fileCount.toLocaleString()} files...`);
195
+ spinner.start();
196
+ try {
197
+ const store = new PatternStore({ rootDir });
198
+ await store.initialize();
199
+ const ignorePatterns = await loadIgnorePatterns(rootDir);
200
+ const walker = new FileWalker();
201
+ const scanOptions = {
202
+ rootDir,
203
+ ignorePatterns,
204
+ respectGitignore: true,
205
+ respectDriftignore: true,
206
+ followSymlinks: false,
207
+ maxDepth: 50,
208
+ maxFileSize: 1048576,
209
+ };
210
+ const result = await walker.walk(scanOptions);
211
+ const files = result.files.map(f => f.relativePath).filter(isScannableFile);
212
+ const scannerService = createScannerService({
213
+ rootDir,
214
+ verbose,
215
+ criticalOnly: false,
216
+ categories: [],
217
+ generateManifest: false,
218
+ incremental: false,
219
+ });
220
+ await scannerService.initialize();
221
+ const projectContext = { rootDir, files, config: {} };
222
+ const scanResults = await scannerService.scanFiles(files, projectContext);
223
+ const now = new Date().toISOString();
224
+ const categories = {};
225
+ for (const aggPattern of scanResults.patterns) {
226
+ const cat = aggPattern.category;
227
+ categories[cat] = (categories[cat] ?? 0) + aggPattern.occurrences;
228
+ const id = crypto.createHash('sha256')
229
+ .update(`${aggPattern.patternId}-${rootDir}`)
230
+ .digest('hex')
231
+ .slice(0, 16);
232
+ const spread = new Set(aggPattern.locations.map((l) => l.file)).size;
233
+ const confidenceScore = Math.min(0.95, aggPattern.confidence);
234
+ const confidenceInfo = {
235
+ frequency: Math.min(1, aggPattern.occurrences / 100),
236
+ consistency: 0.9,
237
+ age: 0,
238
+ spread,
239
+ score: confidenceScore,
240
+ level: confidenceScore >= 0.85 ? 'high' : confidenceScore >= 0.65 ? 'medium' : confidenceScore >= 0.45 ? 'low' : 'uncertain',
241
+ };
242
+ const locations = aggPattern.locations.slice(0, 100).map((l) => ({
243
+ file: l.file,
244
+ line: l.line,
245
+ column: l.column ?? 0,
246
+ snippet: l.snippet,
247
+ }));
248
+ const pattern = {
249
+ id,
250
+ category: mapToPatternCategory(aggPattern.category),
251
+ subcategory: aggPattern.subcategory,
252
+ name: aggPattern.name,
253
+ description: aggPattern.description,
254
+ detector: { type: 'regex', config: { detectorId: aggPattern.detectorId, patternId: aggPattern.patternId } },
255
+ confidence: confidenceInfo,
256
+ locations,
257
+ outliers: [],
258
+ metadata: { firstSeen: now, lastSeen: now },
259
+ severity: 'warning',
260
+ autoFixable: false,
261
+ status: 'discovered',
262
+ };
263
+ if (!store.has(pattern.id)) {
264
+ store.add(pattern);
265
+ }
266
+ }
267
+ await store.saveAll();
268
+ const patternCount = scanResults.patterns.length;
269
+ spinner.succeed(`Discovered ${chalk.cyan(patternCount)} patterns across ${chalk.cyan(Object.keys(categories).length)} categories`);
270
+ if (Object.keys(categories).length > 0) {
271
+ console.log();
272
+ const sorted = Object.entries(categories).sort((a, b) => b[1] - a[1]).slice(0, 6);
273
+ for (const [cat, count] of sorted) {
274
+ console.log(chalk.gray(` ${cat}: ${count} occurrences`));
275
+ }
276
+ if (Object.keys(categories).length > 6) {
277
+ console.log(chalk.gray(` ... and ${Object.keys(categories).length - 6} more categories`));
278
+ }
279
+ }
280
+ state.completed.push('scan');
281
+ return { success: true, patternCount, categories };
282
+ }
283
+ catch (error) {
284
+ spinner.fail('Scan failed');
285
+ if (verbose)
286
+ console.error(chalk.red(` ${error.message}`));
287
+ return { success: false, patternCount: 0, categories: {} };
288
+ }
289
+ }
290
+ // ═══════════════════════════════════════════════════════════════════════════
291
+ // PHASE 3: PATTERN APPROVAL
292
+ // ═══════════════════════════════════════════════════════════════════════════
293
+ async function phaseApproval(rootDir, autoYes, patternCount, state) {
294
+ if (patternCount === 0) {
295
+ return { approved: 0, threshold: 0.85 };
296
+ }
297
+ printPhase(3, 'Pattern Approval', 'Establish your coding standards');
298
+ console.log(chalk.gray(' Patterns define your coding conventions.'));
299
+ console.log(chalk.gray(' Approved patterns become your "golden standard".'));
300
+ console.log();
301
+ console.log(chalk.bold(' Why approve patterns?'));
302
+ console.log(chalk.green(' → AI follows approved patterns when generating code'));
303
+ console.log(chalk.green(' → Violations are flagged in CI/CD pipelines'));
304
+ console.log(chalk.green(' → New code is checked against your standards'));
305
+ console.log();
306
+ const choice = autoYes ? 'auto-85' : await select({
307
+ message: 'How would you like to handle pattern approval?',
308
+ choices: [
309
+ { value: 'auto-85', name: '✓ Auto-approve high confidence (≥85%) - Recommended' },
310
+ { value: 'auto-90', name: '✓ Auto-approve very high confidence (≥90%) - Conservative' },
311
+ { value: 'all', name: '✓ Approve all discovered patterns - Trust the scan' },
312
+ { value: 'skip', name: '○ Skip - Review manually with `drift approve all`' },
313
+ ],
314
+ });
315
+ if (choice === 'skip') {
316
+ printSkip('Skipping approval. Review with `drift approve all` or `drift dashboard`.');
317
+ state.choices.autoApprove = false;
318
+ return { approved: 0, threshold: 0 };
319
+ }
320
+ const threshold = choice === 'auto-90' ? 0.90 : choice === 'auto-85' ? 0.85 : 0;
321
+ state.choices.autoApprove = true;
322
+ state.choices.approveThreshold = threshold;
323
+ const spinner = createSpinner('Approving patterns...');
324
+ spinner.start();
325
+ try {
326
+ const service = createCLIPatternService(rootDir);
327
+ const discovered = await service.listByStatus('discovered', { limit: 5000 });
328
+ const eligible = choice === 'all'
329
+ ? discovered.items
330
+ : discovered.items.filter(p => p.confidence >= threshold);
331
+ let approved = 0;
332
+ for (const pattern of eligible) {
333
+ try {
334
+ await service.approvePattern(pattern.id);
335
+ approved++;
336
+ }
337
+ catch { /* skip */ }
338
+ }
339
+ spinner.succeed(`Approved ${chalk.cyan(approved)} patterns`);
340
+ const remaining = discovered.items.length - approved;
341
+ if (remaining > 0 && choice !== 'all') {
342
+ printInfo(`${remaining} patterns below threshold - review with \`drift approve all\``);
343
+ }
344
+ state.completed.push('approval');
345
+ return { approved, threshold };
346
+ }
347
+ catch {
348
+ spinner.fail('Approval failed');
349
+ return { approved: 0, threshold };
350
+ }
351
+ }
352
+ // ═══════════════════════════════════════════════════════════════════════════
353
+ // PHASE 4: DEEP ANALYSIS (using runners)
354
+ // ═══════════════════════════════════════════════════════════════════════════
355
+ async function phaseDeepAnalysis(rootDir, autoYes, verbose, state) {
356
+ printPhase(4, 'Deep Analysis', 'Build advanced analysis features');
357
+ console.log(chalk.gray(' These features provide deeper insights into your codebase.'));
358
+ console.log(chalk.gray(' Each runs REAL analysis using native Rust or TypeScript.'));
359
+ console.log();
360
+ const ctx = { rootDir, verbose };
361
+ const results = {};
362
+ // Call Graph
363
+ const callGraphRunner = new CallGraphRunner(ctx);
364
+ printFeature(callGraphRunner);
365
+ state.choices.buildCallGraph = autoYes || await confirm({ message: 'Build call graph?', default: true });
366
+ if (state.choices.buildCallGraph) {
367
+ results.callGraph = await callGraphRunner.run();
368
+ state.completed.push('callgraph');
369
+ }
370
+ else {
371
+ printSkip(`Run \`${callGraphRunner.manualCommand}\` later`);
372
+ }
373
+ // Test Topology
374
+ const testTopologyRunner = new TestTopologyRunner(ctx);
375
+ printFeature(testTopologyRunner);
376
+ state.choices.buildTestTopology = autoYes || await confirm({ message: 'Build test topology?', default: true });
377
+ if (state.choices.buildTestTopology) {
378
+ results.testTopology = await testTopologyRunner.run();
379
+ state.completed.push('test-topology');
380
+ }
381
+ else {
382
+ printSkip(`Run \`${testTopologyRunner.manualCommand}\` later`);
383
+ }
384
+ // Coupling
385
+ const couplingRunner = new CouplingRunner(ctx);
386
+ printFeature(couplingRunner);
387
+ state.choices.buildCoupling = autoYes || await confirm({ message: 'Build coupling analysis?', default: true });
388
+ if (state.choices.buildCoupling) {
389
+ results.coupling = await couplingRunner.run();
390
+ state.completed.push('coupling');
391
+ }
392
+ else {
393
+ printSkip(`Run \`${couplingRunner.manualCommand}\` later`);
394
+ }
395
+ // DNA
396
+ const dnaRunner = new DNARunner(ctx);
397
+ printFeature(dnaRunner);
398
+ state.choices.scanDna = autoYes || await confirm({ message: 'Scan styling DNA?', default: true });
399
+ if (state.choices.scanDna) {
400
+ results.dna = await dnaRunner.run();
401
+ state.completed.push('dna');
402
+ }
403
+ else {
404
+ printSkip(`Run \`${dnaRunner.manualCommand}\` later`);
405
+ }
406
+ return results;
407
+ }
408
+ // ═══════════════════════════════════════════════════════════════════════════
409
+ // PHASE 5: MEMORY
410
+ // ═══════════════════════════════════════════════════════════════════════════
411
+ async function phaseMemory(rootDir, autoYes, verbose, state) {
412
+ printPhase(5, 'Cortex Memory', 'Living knowledge system');
413
+ console.log(chalk.gray(' Cortex Memory replaces static AGENTS.md/CLAUDE.md files.'));
414
+ console.log(chalk.gray(' It\'s a living system that learns and adapts.'));
415
+ console.log();
416
+ const ctx = { rootDir, verbose };
417
+ const memoryRunner = new MemoryRunner(ctx);
418
+ printFeature(memoryRunner);
419
+ console.log(chalk.gray(' Examples:'));
420
+ console.log(chalk.gray(' • "Always use bcrypt for password hashing"'));
421
+ console.log(chalk.gray(' • "Deploy process: 1. Run tests 2. Build 3. Push"'));
422
+ console.log(chalk.gray(' • Corrections AI learns from your feedback'));
423
+ console.log();
424
+ state.choices.initMemory = autoYes || await confirm({ message: 'Initialize Cortex memory system?', default: true });
425
+ if (state.choices.initMemory) {
426
+ const result = await memoryRunner.run();
427
+ state.completed.push('memory');
428
+ printInfo('Add memories: `drift memory add tribal "your knowledge"`');
429
+ return result;
430
+ }
431
+ else {
432
+ printSkip(`Run \`${memoryRunner.manualCommand}\` later`);
433
+ return undefined;
434
+ }
435
+ }
436
+ // ═══════════════════════════════════════════════════════════════════════════
437
+ // PHASE 6: FINALIZE
438
+ // ═══════════════════════════════════════════════════════════════════════════
439
+ async function phaseFinalize(rootDir, projectId, scanResult, approvalResult, analysisResults, state) {
440
+ printPhase(6, 'Finalize', 'Creating Source of Truth');
441
+ const spinner = createSpinner('Creating Source of Truth...');
442
+ spinner.start();
443
+ const now = new Date().toISOString();
444
+ const scanId = crypto.randomUUID().slice(0, 8);
445
+ // Build feature configs from results
446
+ const buildFeatureConfig = (enabled, result) => {
447
+ if (!enabled || !result) {
448
+ return { enabled };
449
+ }
450
+ const config = { enabled };
451
+ if (result.timestamp) {
452
+ config.builtAt = result.timestamp;
453
+ }
454
+ if (result.stats) {
455
+ config.stats = result.stats;
456
+ }
457
+ return config;
458
+ };
459
+ const sot = {
460
+ version: VERSION,
461
+ schemaVersion: SCHEMA_VERSION,
462
+ createdAt: now,
463
+ updatedAt: now,
464
+ project: {
465
+ id: projectId,
466
+ name: path.basename(rootDir),
467
+ rootPath: rootDir,
468
+ },
469
+ baseline: {
470
+ scanId,
471
+ scannedAt: now,
472
+ fileCount: await countSourceFiles(rootDir),
473
+ patternCount: scanResult.patternCount,
474
+ approvedCount: approvalResult.approved,
475
+ categories: scanResult.categories,
476
+ checksum: computeChecksum({
477
+ patterns: scanResult.patternCount,
478
+ categories: scanResult.categories,
479
+ approved: approvalResult.approved,
480
+ }),
481
+ },
482
+ features: {
483
+ callGraph: buildFeatureConfig(state.choices.buildCallGraph, analysisResults.callGraph),
484
+ testTopology: buildFeatureConfig(state.choices.buildTestTopology, analysisResults.testTopology),
485
+ coupling: buildFeatureConfig(state.choices.buildCoupling, analysisResults.coupling),
486
+ dna: buildFeatureConfig(state.choices.scanDna, analysisResults.dna),
487
+ memory: buildFeatureConfig(state.choices.initMemory, analysisResults.memory),
488
+ },
489
+ settings: {
490
+ autoApproveThreshold: state.choices.approveThreshold,
491
+ autoApproveEnabled: state.choices.autoApprove,
492
+ },
493
+ history: [
494
+ {
495
+ action: 'setup_complete',
496
+ timestamp: now,
497
+ details: `Initial setup: ${scanResult.patternCount} patterns, ${approvalResult.approved} approved`,
498
+ },
499
+ ],
500
+ };
501
+ await saveSourceOfTruth(rootDir, sot);
502
+ await clearSetupState(rootDir);
503
+ // Update manifest
504
+ const manifestPath = path.join(rootDir, DRIFT_DIR, 'manifest.json');
505
+ const manifest = {
506
+ version: SCHEMA_VERSION,
507
+ driftVersion: VERSION,
508
+ lastUpdatedAt: now,
509
+ sourceOfTruthId: scanId,
510
+ };
511
+ await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));
512
+ // Pre-compute views
513
+ const viewsDir = path.join(rootDir, DRIFT_DIR, 'views');
514
+ await fs.mkdir(viewsDir, { recursive: true });
515
+ await fs.writeFile(path.join(viewsDir, 'status.json'), JSON.stringify({
516
+ lastUpdated: now,
517
+ patterns: {
518
+ total: scanResult.patternCount,
519
+ byStatus: {
520
+ discovered: scanResult.patternCount - approvalResult.approved,
521
+ approved: approvalResult.approved,
522
+ ignored: 0,
523
+ },
524
+ byCategory: scanResult.categories,
525
+ },
526
+ }, null, 2));
527
+ spinner.succeed('Source of Truth created');
528
+ return sot;
529
+ }
530
+ // ═══════════════════════════════════════════════════════════════════════════
531
+ // MAIN SETUP ACTION
532
+ // ═══════════════════════════════════════════════════════════════════════════
533
+ async function setupAction(options) {
534
+ const rootDir = process.cwd();
535
+ const verbose = options.verbose ?? false;
536
+ const autoYes = options.yes ?? false;
537
+ printWelcome();
538
+ let state = createDefaultState();
539
+ // Check for resume
540
+ if (options.resume) {
541
+ const savedState = await loadSetupState(rootDir);
542
+ if (savedState) {
543
+ console.log(chalk.yellow(' Resuming previous setup...'));
544
+ state = savedState;
545
+ }
546
+ }
547
+ // Phase 0: Detect existing
548
+ const { isNew, sot: existingSot, shouldContinue } = await phaseDetectExisting(rootDir, autoYes);
549
+ if (!shouldContinue) {
550
+ console.log(chalk.gray(' Setup cancelled.'));
551
+ return;
552
+ }
553
+ // If using existing SOT, just show summary
554
+ if (existingSot && !isNew) {
555
+ printSummary(existingSot);
556
+ return;
557
+ }
558
+ // Phase 1: Initialize
559
+ const projectId = await phaseInitialize(rootDir, isNew);
560
+ state.phase = 1;
561
+ await saveSetupState(rootDir, state);
562
+ // Phase 2: Scan
563
+ const scanResult = await phaseScan(rootDir, autoYes, verbose, state);
564
+ state.phase = 2;
565
+ await saveSetupState(rootDir, state);
566
+ // Phase 3: Approval
567
+ const approvalResult = await phaseApproval(rootDir, autoYes, scanResult.patternCount, state);
568
+ state.phase = 3;
569
+ await saveSetupState(rootDir, state);
570
+ // Phase 4: Deep Analysis
571
+ const analysisResults = await phaseDeepAnalysis(rootDir, autoYes, verbose, state);
572
+ state.phase = 4;
573
+ await saveSetupState(rootDir, state);
574
+ // Phase 5: Memory
575
+ const memoryResult = await phaseMemory(rootDir, autoYes, verbose, state);
576
+ if (memoryResult) {
577
+ analysisResults.memory = memoryResult;
578
+ }
579
+ state.phase = 5;
580
+ await saveSetupState(rootDir, state);
581
+ // Phase 6: Finalize
582
+ const sot = await phaseFinalize(rootDir, projectId, scanResult, approvalResult, analysisResults, state);
583
+ // Summary
584
+ printSummary(sot);
585
+ }
586
+ export const setupCommand = new Command('setup')
587
+ .description('Guided setup wizard - create your codebase Source of Truth')
588
+ .option('-y, --yes', 'Skip prompts and use recommended defaults')
589
+ .option('--verbose', 'Enable verbose output')
590
+ .option('--resume', 'Resume interrupted setup')
591
+ .action(setupAction);
592
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/setup/index.ts"],"names":[],"mappings":"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"}