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.
- package/dist/commands/setup/index.d.ts +17 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +592 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/setup/runners/base.d.ts +34 -0
- package/dist/commands/setup/runners/base.d.ts.map +1 -0
- package/dist/commands/setup/runners/base.js +20 -0
- package/dist/commands/setup/runners/base.js.map +1 -0
- package/dist/commands/setup/runners/callgraph.d.ts +17 -0
- package/dist/commands/setup/runners/callgraph.d.ts.map +1 -0
- package/dist/commands/setup/runners/callgraph.js +91 -0
- package/dist/commands/setup/runners/callgraph.js.map +1 -0
- package/dist/commands/setup/runners/coupling.d.ts +20 -0
- package/dist/commands/setup/runners/coupling.d.ts.map +1 -0
- package/dist/commands/setup/runners/coupling.js +121 -0
- package/dist/commands/setup/runners/coupling.js.map +1 -0
- package/dist/commands/setup/runners/dna.d.ts +17 -0
- package/dist/commands/setup/runners/dna.d.ts.map +1 -0
- package/dist/commands/setup/runners/dna.js +72 -0
- package/dist/commands/setup/runners/dna.js.map +1 -0
- package/dist/commands/setup/runners/index.d.ts +12 -0
- package/dist/commands/setup/runners/index.d.ts.map +1 -0
- package/dist/commands/setup/runners/index.js +12 -0
- package/dist/commands/setup/runners/index.js.map +1 -0
- package/dist/commands/setup/runners/memory.d.ts +17 -0
- package/dist/commands/setup/runners/memory.d.ts.map +1 -0
- package/dist/commands/setup/runners/memory.js +71 -0
- package/dist/commands/setup/runners/memory.js.map +1 -0
- package/dist/commands/setup/runners/test-topology.d.ts +20 -0
- package/dist/commands/setup/runners/test-topology.d.ts.map +1 -0
- package/dist/commands/setup/runners/test-topology.js +137 -0
- package/dist/commands/setup/runners/test-topology.js.map +1 -0
- package/dist/commands/setup/types.d.ts +99 -0
- package/dist/commands/setup/types.d.ts.map +1 -0
- package/dist/commands/setup/types.js +42 -0
- package/dist/commands/setup/types.js.map +1 -0
- package/dist/commands/setup/ui.d.ts +16 -0
- package/dist/commands/setup/ui.d.ts.map +1 -0
- package/dist/commands/setup/ui.js +108 -0
- package/dist/commands/setup/ui.js.map +1 -0
- package/dist/commands/setup/utils.d.ts +20 -0
- package/dist/commands/setup/utils.d.ts.map +1 -0
- package/dist/commands/setup/utils.js +178 -0
- package/dist/commands/setup/utils.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -18
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +2 -883
- package/dist/commands/setup.js.map +1 -1
- 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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"}
|