driftdetect 0.9.45 โ†’ 0.9.47

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 +5 -5
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Test Topology Runner - Analyzes test-to-code mappings
3
+ *
4
+ * Uses the same analysis flow as `drift test-topology build` to ensure
5
+ * the saved format is compatible with `drift test-topology status`.
6
+ *
7
+ * @module commands/setup/runners/test-topology
8
+ */
9
+ import * as fs from 'node:fs/promises';
10
+ import * as path from 'node:path';
11
+ import { BaseRunner } from './base.js';
12
+ import { createSpinner } from '../../../ui/spinner.js';
13
+ import { DRIFT_DIR } from '../types.js';
14
+ import { findSourceFiles } from '../utils.js';
15
+ import { createTestTopologyAnalyzer, createCallGraphAnalyzer, } from 'driftdetect-core';
16
+ /**
17
+ * Test file patterns (regex) - matches common test file naming conventions
18
+ */
19
+ const TEST_FILE_PATTERNS = [
20
+ /\.test\.[jt]sx?$/,
21
+ /\.spec\.[jt]sx?$/,
22
+ /_test\.py$/,
23
+ /test_.*\.py$/,
24
+ /Test\.java$/,
25
+ /Tests\.java$/,
26
+ /Test\.cs$/,
27
+ /Tests\.cs$/,
28
+ /Test\.php$/,
29
+ ];
30
+ function isTestFile(filename) {
31
+ return TEST_FILE_PATTERNS.some(pattern => pattern.test(filename));
32
+ }
33
+ export class TestTopologyRunner extends BaseRunner {
34
+ constructor(ctx) {
35
+ super(ctx);
36
+ }
37
+ get name() {
38
+ return 'Test Topology';
39
+ }
40
+ get icon() {
41
+ return '๐Ÿงช';
42
+ }
43
+ get description() {
44
+ return 'Maps tests to code, finds untested functions.';
45
+ }
46
+ get benefit() {
47
+ return 'Answer: "Which tests cover this?" and "What\'s untested?"';
48
+ }
49
+ get manualCommand() {
50
+ return 'drift test-topology build';
51
+ }
52
+ async run() {
53
+ const spinner = createSpinner('Building test topology...');
54
+ spinner.start();
55
+ try {
56
+ spinner.text('Finding source files...');
57
+ const allFiles = await findSourceFiles(this.rootDir);
58
+ const testFiles = allFiles.filter(f => isTestFile(f));
59
+ if (testFiles.length === 0) {
60
+ spinner.succeed('No test files found');
61
+ return {
62
+ enabled: true,
63
+ success: true,
64
+ timestamp: new Date().toISOString(),
65
+ stats: { totalTests: 0, testFiles: 0, filesAnalyzed: allFiles.length },
66
+ };
67
+ }
68
+ // Initialize analyzer (same as drift test-topology build)
69
+ spinner.text('Loading parsers...');
70
+ const analyzer = createTestTopologyAnalyzer({});
71
+ // Try to load call graph for transitive analysis
72
+ spinner.text('Loading call graph...');
73
+ try {
74
+ const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir: this.rootDir });
75
+ await callGraphAnalyzer.initialize();
76
+ const graph = callGraphAnalyzer.getGraph();
77
+ if (graph) {
78
+ analyzer.setCallGraph(graph);
79
+ }
80
+ }
81
+ catch {
82
+ // Continue without call graph
83
+ }
84
+ // Extract tests from each file
85
+ spinner.text(`Extracting tests from ${testFiles.length} files...`);
86
+ let extractedCount = 0;
87
+ for (const testFile of testFiles) {
88
+ try {
89
+ const content = await fs.readFile(path.join(this.rootDir, testFile), 'utf-8');
90
+ const extraction = analyzer.extractFromFile(content, testFile);
91
+ if (extraction) {
92
+ extractedCount++;
93
+ }
94
+ }
95
+ catch {
96
+ // Skip unreadable files
97
+ }
98
+ }
99
+ // Build mappings
100
+ spinner.text('Building test-to-code mappings...');
101
+ analyzer.buildMappings();
102
+ // Get results
103
+ const summary = analyzer.getSummary();
104
+ const mockAnalysis = analyzer.analyzeMocks();
105
+ // Save results in the SAME FORMAT as `drift test-topology build`
106
+ // This ensures `drift test-topology status` works correctly
107
+ const topologyDir = path.join(this.rootDir, DRIFT_DIR, 'test-topology');
108
+ await fs.mkdir(topologyDir, { recursive: true });
109
+ await fs.writeFile(path.join(topologyDir, 'summary.json'), JSON.stringify({ summary, mockAnalysis, generatedAt: new Date().toISOString() }, null, 2));
110
+ spinner.succeed(`Test topology built: ${summary.testCases} tests in ${summary.testFiles} files`);
111
+ return {
112
+ enabled: true,
113
+ success: true,
114
+ timestamp: new Date().toISOString(),
115
+ stats: {
116
+ totalTests: summary.testCases,
117
+ testFiles: summary.testFiles,
118
+ filesAnalyzed: allFiles.length,
119
+ extractedFiles: extractedCount,
120
+ },
121
+ };
122
+ }
123
+ catch (error) {
124
+ const msg = error instanceof Error ? error.message : String(error);
125
+ spinner.fail(`Test topology failed: ${msg}`);
126
+ if (this.verbose && error instanceof Error) {
127
+ console.error(error.stack);
128
+ }
129
+ return {
130
+ enabled: true,
131
+ success: false,
132
+ error: msg,
133
+ };
134
+ }
135
+ }
136
+ }
137
+ //# sourceMappingURL=test-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-topology.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/test-topology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Setup Types - Shared types for the setup wizard
3
+ *
4
+ * @module commands/setup/types
5
+ */
6
+ export interface SetupOptions {
7
+ yes?: boolean;
8
+ verbose?: boolean;
9
+ resume?: boolean;
10
+ }
11
+ export interface FeatureStats {
12
+ [key: string]: number;
13
+ }
14
+ export interface FeatureResult {
15
+ enabled: boolean;
16
+ success: boolean;
17
+ timestamp?: string;
18
+ stats?: FeatureStats;
19
+ error?: string;
20
+ }
21
+ export interface SetupChoices {
22
+ autoApprove: boolean;
23
+ approveThreshold: number;
24
+ buildCallGraph: boolean;
25
+ buildTestTopology: boolean;
26
+ buildCoupling: boolean;
27
+ scanDna: boolean;
28
+ initMemory: boolean;
29
+ }
30
+ export interface SetupState {
31
+ phase: number;
32
+ completed: string[];
33
+ choices: SetupChoices;
34
+ startedAt: string;
35
+ }
36
+ export interface ScanResult {
37
+ success: boolean;
38
+ patternCount: number;
39
+ categories: Record<string, number>;
40
+ }
41
+ export interface ApprovalResult {
42
+ approved: number;
43
+ threshold: number;
44
+ }
45
+ export interface AnalysisResults {
46
+ callGraph?: FeatureResult;
47
+ testTopology?: FeatureResult;
48
+ coupling?: FeatureResult;
49
+ dna?: FeatureResult;
50
+ memory?: FeatureResult;
51
+ }
52
+ export interface SourceOfTruth {
53
+ version: string;
54
+ schemaVersion: string;
55
+ createdAt: string;
56
+ updatedAt: string;
57
+ project: {
58
+ id: string;
59
+ name: string;
60
+ rootPath: string;
61
+ };
62
+ baseline: {
63
+ scanId: string;
64
+ scannedAt: string;
65
+ fileCount: number;
66
+ patternCount: number;
67
+ approvedCount: number;
68
+ categories: Record<string, number>;
69
+ checksum: string;
70
+ };
71
+ features: {
72
+ callGraph: FeatureConfig;
73
+ testTopology: FeatureConfig;
74
+ coupling: FeatureConfig;
75
+ dna: FeatureConfig;
76
+ memory: FeatureConfig;
77
+ };
78
+ settings: {
79
+ autoApproveThreshold: number;
80
+ autoApproveEnabled: boolean;
81
+ };
82
+ history: HistoryEntry[];
83
+ }
84
+ export interface FeatureConfig {
85
+ enabled: boolean;
86
+ builtAt?: string;
87
+ stats?: FeatureStats;
88
+ }
89
+ export interface HistoryEntry {
90
+ action: string;
91
+ timestamp: string;
92
+ details: string;
93
+ }
94
+ export declare const DRIFT_DIR = ".drift";
95
+ export declare const SOURCE_OF_TRUTH_FILE = "source-of-truth.json";
96
+ export declare const SETUP_STATE_FILE = ".setup-state.json";
97
+ export declare const SCHEMA_VERSION = "2.0.0";
98
+ export declare const DRIFT_SUBDIRS: string[];
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/setup/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Setup Types - Shared types for the setup wizard
3
+ *
4
+ * @module commands/setup/types
5
+ */
6
+ export const DRIFT_DIR = '.drift';
7
+ export const SOURCE_OF_TRUTH_FILE = 'source-of-truth.json';
8
+ export const SETUP_STATE_FILE = '.setup-state.json';
9
+ export const SCHEMA_VERSION = '2.0.0';
10
+ export const DRIFT_SUBDIRS = [
11
+ 'patterns/discovered',
12
+ 'patterns/approved',
13
+ 'patterns/ignored',
14
+ 'patterns/variants',
15
+ 'history/snapshots',
16
+ 'cache',
17
+ 'reports',
18
+ 'lake/callgraph',
19
+ 'lake/patterns',
20
+ 'lake/security',
21
+ 'lake/examples',
22
+ 'boundaries',
23
+ 'test-topology',
24
+ 'module-coupling',
25
+ 'error-handling',
26
+ 'constraints/discovered',
27
+ 'constraints/approved',
28
+ 'constraints/ignored',
29
+ 'constraints/custom',
30
+ 'constraints/history',
31
+ 'contracts/discovered',
32
+ 'contracts/verified',
33
+ 'contracts/mismatch',
34
+ 'contracts/ignored',
35
+ 'indexes',
36
+ 'views',
37
+ 'dna',
38
+ 'environment',
39
+ 'memory',
40
+ 'audit/snapshots',
41
+ ];
42
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/setup/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqGH,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,qBAAqB;IACrB,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,SAAS;IACT,OAAO;IACP,KAAK;IACL,aAAa;IACb,QAAQ;IACR,iBAAiB;CAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Setup UI - Console output helpers
3
+ *
4
+ * @module commands/setup/ui
5
+ */
6
+ import type { BaseRunner } from './runners/base.js';
7
+ import type { SourceOfTruth, FeatureResult } from './types.js';
8
+ export declare function printWelcome(): void;
9
+ export declare function printPhase(num: number, title: string, description: string): void;
10
+ export declare function printFeature(runner: BaseRunner): void;
11
+ export declare function printSuccess(message: string): void;
12
+ export declare function printSkip(message: string): void;
13
+ export declare function printInfo(message: string): void;
14
+ export declare function printSummary(sot: SourceOfTruth): void;
15
+ export declare function formatFeatureResult(name: string, result: FeatureResult): string;
16
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/commands/setup/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAKhF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAKrD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAqDrD;AAsBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAc/E"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Setup UI - Console output helpers
3
+ *
4
+ * @module commands/setup/ui
5
+ */
6
+ import chalk from 'chalk';
7
+ export function printWelcome() {
8
+ console.log();
9
+ console.log(chalk.bold.magenta('โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—'));
10
+ console.log(chalk.bold.magenta('โ•‘') + chalk.bold(' ๐Ÿ” Drift Setup Wizard ') + chalk.bold.magenta('โ•‘'));
11
+ console.log(chalk.bold.magenta('โ•‘') + chalk.gray(' Create your codebase Source of Truth ') + chalk.bold.magenta('โ•‘'));
12
+ console.log(chalk.bold.magenta('โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•'));
13
+ console.log();
14
+ }
15
+ export function printPhase(num, title, description) {
16
+ console.log();
17
+ console.log(chalk.bold.cyan(`โ”โ”โ” Phase ${num}: ${title} โ”โ”โ”`));
18
+ console.log(chalk.gray(` ${description}`));
19
+ console.log();
20
+ }
21
+ export function printFeature(runner) {
22
+ console.log(` ${runner.icon} ${chalk.bold(runner.name)}`);
23
+ console.log(chalk.gray(` ${runner.description}`));
24
+ console.log(chalk.green(` โ†’ ${runner.benefit}`));
25
+ console.log();
26
+ }
27
+ export function printSuccess(message) {
28
+ console.log(chalk.green(` โœ“ ${message}`));
29
+ }
30
+ export function printSkip(message) {
31
+ console.log(chalk.gray(` โ—‹ ${message}`));
32
+ }
33
+ export function printInfo(message) {
34
+ console.log(chalk.gray(` ${message}`));
35
+ }
36
+ export function printSummary(sot) {
37
+ console.log();
38
+ console.log(chalk.bold.green('โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—'));
39
+ console.log(chalk.bold.green('โ•‘') + chalk.bold(' Setup Complete! ๐ŸŽ‰ ') + chalk.bold.green('โ•‘'));
40
+ console.log(chalk.bold.green('โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•'));
41
+ console.log();
42
+ console.log(chalk.bold(' Source of Truth Created'));
43
+ console.log(chalk.gray(` ID: ${sot.baseline.scanId}`));
44
+ console.log(chalk.gray(` Checksum: ${sot.baseline.checksum}`));
45
+ console.log();
46
+ console.log(chalk.bold(' What was configured:'));
47
+ printSuccess(`Project: ${sot.project.name}`);
48
+ if (sot.baseline.patternCount > 0) {
49
+ printSuccess(`${sot.baseline.patternCount} patterns discovered`);
50
+ }
51
+ if (sot.baseline.approvedCount > 0) {
52
+ printSuccess(`${sot.baseline.approvedCount} patterns approved`);
53
+ }
54
+ // Show stats from each feature
55
+ printFeatureStats('Call graph', sot.features.callGraph, ['functions', 'entryPoints']);
56
+ printFeatureStats('Test topology', sot.features.testTopology, ['totalTests', 'testFiles']);
57
+ printFeatureStats('Coupling', sot.features.coupling, ['modules', 'cycles', 'healthScore']);
58
+ printFeatureStats('DNA', sot.features.dna, ['genes', 'healthScore']);
59
+ if (sot.features.memory.enabled) {
60
+ printSuccess('Memory system initialized');
61
+ }
62
+ console.log();
63
+ console.log(chalk.bold(' What happens next:'));
64
+ console.log(chalk.gray(' โ€ข All data is pre-computed for fast CLI/MCP access'));
65
+ console.log(chalk.gray(' โ€ข Future scans are tracked against this baseline'));
66
+ console.log(chalk.gray(' โ€ข Changes require explicit approval'));
67
+ console.log(chalk.gray(' โ€ข Backups are created before destructive operations'));
68
+ console.log();
69
+ console.log(chalk.bold(' Quick commands:'));
70
+ console.log(chalk.cyan(' drift status') + chalk.gray(' - See current state'));
71
+ console.log(chalk.cyan(' drift dashboard') + chalk.gray(' - Visual pattern browser'));
72
+ console.log(chalk.cyan(' drift check') + chalk.gray(' - Check for violations'));
73
+ if (sot.baseline.approvedCount === 0 && sot.baseline.patternCount > 0) {
74
+ console.log(chalk.cyan(' drift approve all') + chalk.gray(' - Review patterns'));
75
+ }
76
+ console.log();
77
+ console.log(chalk.bold(' For AI integration:'));
78
+ console.log(chalk.gray(' Install: ') + chalk.cyan('npm install -g driftdetect-mcp'));
79
+ console.log(chalk.gray(' Then configure your AI tool (Claude, Cursor, Kiro)'));
80
+ console.log();
81
+ }
82
+ function printFeatureStats(name, config, keys) {
83
+ if (!config.enabled || !config.stats)
84
+ return;
85
+ const parts = [];
86
+ for (const key of keys) {
87
+ const value = config.stats[key];
88
+ if (value !== undefined) {
89
+ parts.push(`${value} ${key}`);
90
+ }
91
+ }
92
+ if (parts.length > 0) {
93
+ printSuccess(`${name}: ${parts.join(', ')}`);
94
+ }
95
+ }
96
+ export function formatFeatureResult(name, result) {
97
+ if (!result.success) {
98
+ return chalk.red(`${name}: Failed - ${result.error}`);
99
+ }
100
+ if (!result.stats) {
101
+ return chalk.green(`${name}: Initialized`);
102
+ }
103
+ const parts = Object.entries(result.stats)
104
+ .map(([k, v]) => `${v} ${k}`)
105
+ .join(', ');
106
+ return chalk.green(`${name}: ${parts}`);
107
+ }
108
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/commands/setup/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Setup Utilities - Shared helper functions
3
+ *
4
+ * @module commands/setup/utils
5
+ */
6
+ import { type SourceOfTruth, type SetupState } from './types.js';
7
+ export declare function isDriftInitialized(rootDir: string): Promise<boolean>;
8
+ export declare function createDriftDirectory(rootDir: string): Promise<void>;
9
+ export declare function createDefaultConfig(rootDir: string, projectId: string): Promise<void>;
10
+ export declare function createDriftignore(rootDir: string): Promise<void>;
11
+ export declare function loadSourceOfTruth(rootDir: string): Promise<SourceOfTruth | null>;
12
+ export declare function saveSourceOfTruth(rootDir: string, sot: SourceOfTruth): Promise<void>;
13
+ export declare function loadSetupState(rootDir: string): Promise<SetupState | null>;
14
+ export declare function saveSetupState(rootDir: string, state: SetupState): Promise<void>;
15
+ export declare function clearSetupState(rootDir: string): Promise<void>;
16
+ export declare function countSourceFiles(rootDir: string): Promise<number>;
17
+ export declare function findSourceFiles(rootDir: string): Promise<string[]>;
18
+ export declare function computeChecksum(data: unknown): string;
19
+ export declare function isScannableFile(filePath: string): boolean;
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/commands/setup/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAMpB,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1E;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtE;AAMD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQtF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1F;AAMD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQhF;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAUD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwBxE;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAErD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzD"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Setup Utilities - Shared helper functions
3
+ *
4
+ * @module commands/setup/utils
5
+ */
6
+ import * as crypto from 'node:crypto';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import { shouldIgnoreDirectory } from 'driftdetect-core';
10
+ import { DRIFT_DIR, DRIFT_SUBDIRS, SOURCE_OF_TRUTH_FILE, SETUP_STATE_FILE, SCHEMA_VERSION, } from './types.js';
11
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
12
+ // FILE SYSTEM HELPERS
13
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
14
+ export async function isDriftInitialized(rootDir) {
15
+ try {
16
+ await fs.access(path.join(rootDir, DRIFT_DIR));
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ export async function createDriftDirectory(rootDir) {
24
+ const driftDir = path.join(rootDir, DRIFT_DIR);
25
+ await fs.mkdir(driftDir, { recursive: true });
26
+ for (const subdir of DRIFT_SUBDIRS) {
27
+ await fs.mkdir(path.join(driftDir, subdir), { recursive: true });
28
+ }
29
+ }
30
+ export async function createDefaultConfig(rootDir, projectId) {
31
+ const configPath = path.join(rootDir, DRIFT_DIR, 'config.json');
32
+ const config = {
33
+ version: SCHEMA_VERSION,
34
+ project: {
35
+ id: projectId,
36
+ name: path.basename(rootDir),
37
+ initializedAt: new Date().toISOString(),
38
+ },
39
+ severity: {},
40
+ ignore: [
41
+ 'node_modules/**', 'dist/**', 'build/**', '.git/**', 'coverage/**',
42
+ '*.min.js', '*.bundle.js', 'vendor/**', '__pycache__/**', '.venv/**',
43
+ 'target/**', 'bin/**', 'obj/**',
44
+ ],
45
+ ci: { failOn: 'error', reportFormat: 'text' },
46
+ learning: { autoApproveThreshold: 0.85, minOccurrences: 3, semanticLearning: true },
47
+ performance: { maxWorkers: 4, cacheEnabled: true, incrementalAnalysis: true, cacheTTL: 3600 },
48
+ features: { callGraph: true, boundaries: true, dna: true, contracts: true },
49
+ };
50
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
51
+ }
52
+ export async function createDriftignore(rootDir) {
53
+ const driftignorePath = path.join(rootDir, '.driftignore');
54
+ try {
55
+ await fs.access(driftignorePath);
56
+ }
57
+ catch {
58
+ await fs.writeFile(driftignorePath, `# Drift ignore patterns
59
+ node_modules/
60
+ dist/
61
+ build/
62
+ .git/
63
+ coverage/
64
+ vendor/
65
+ __pycache__/
66
+ .venv/
67
+ target/
68
+ bin/
69
+ obj/
70
+ `);
71
+ }
72
+ }
73
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
74
+ // SOURCE OF TRUTH
75
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
76
+ export async function loadSourceOfTruth(rootDir) {
77
+ try {
78
+ const sotPath = path.join(rootDir, DRIFT_DIR, SOURCE_OF_TRUTH_FILE);
79
+ const content = await fs.readFile(sotPath, 'utf-8');
80
+ return JSON.parse(content);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ export async function saveSourceOfTruth(rootDir, sot) {
87
+ const sotPath = path.join(rootDir, DRIFT_DIR, SOURCE_OF_TRUTH_FILE);
88
+ sot.updatedAt = new Date().toISOString();
89
+ await fs.writeFile(sotPath, JSON.stringify(sot, null, 2));
90
+ }
91
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
92
+ // SETUP STATE (for resume)
93
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
94
+ export async function loadSetupState(rootDir) {
95
+ try {
96
+ const statePath = path.join(rootDir, DRIFT_DIR, SETUP_STATE_FILE);
97
+ const content = await fs.readFile(statePath, 'utf-8');
98
+ return JSON.parse(content);
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ export async function saveSetupState(rootDir, state) {
105
+ const statePath = path.join(rootDir, DRIFT_DIR, SETUP_STATE_FILE);
106
+ await fs.writeFile(statePath, JSON.stringify(state, null, 2));
107
+ }
108
+ export async function clearSetupState(rootDir) {
109
+ try {
110
+ const statePath = path.join(rootDir, DRIFT_DIR, SETUP_STATE_FILE);
111
+ await fs.unlink(statePath);
112
+ }
113
+ catch { /* ignore */ }
114
+ }
115
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
116
+ // FILE DISCOVERY
117
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
118
+ const SOURCE_EXTENSIONS = new Set([
119
+ '.ts', '.tsx', '.js', '.jsx', '.py', '.cs', '.java', '.php', '.go', '.rs',
120
+ ]);
121
+ export async function countSourceFiles(rootDir) {
122
+ let count = 0;
123
+ async function walk(dir) {
124
+ try {
125
+ const entries = await fs.readdir(dir, { withFileTypes: true });
126
+ for (const entry of entries) {
127
+ if (entry.isDirectory() && !shouldIgnoreDirectory(entry.name)) {
128
+ await walk(path.join(dir, entry.name));
129
+ }
130
+ else if (entry.isFile()) {
131
+ const ext = path.extname(entry.name).toLowerCase();
132
+ if (SOURCE_EXTENSIONS.has(ext)) {
133
+ count++;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ catch { /* skip */ }
139
+ }
140
+ await walk(rootDir);
141
+ return count;
142
+ }
143
+ export async function findSourceFiles(rootDir) {
144
+ const files = [];
145
+ async function walk(dir, relativePath = '') {
146
+ try {
147
+ const entries = await fs.readdir(dir, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ const fullPath = path.join(dir, entry.name);
150
+ const relPath = relativePath ? path.join(relativePath, entry.name) : entry.name;
151
+ if (entry.isDirectory() && !shouldIgnoreDirectory(entry.name)) {
152
+ await walk(fullPath, relPath);
153
+ }
154
+ else if (entry.isFile()) {
155
+ const ext = path.extname(entry.name).toLowerCase();
156
+ if (SOURCE_EXTENSIONS.has(ext)) {
157
+ files.push(relPath);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch { /* skip */ }
163
+ }
164
+ await walk(rootDir);
165
+ return files;
166
+ }
167
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
168
+ // MISC HELPERS
169
+ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
170
+ export function computeChecksum(data) {
171
+ return crypto.createHash('sha256').update(JSON.stringify(data)).digest('hex').slice(0, 16);
172
+ }
173
+ export function isScannableFile(filePath) {
174
+ const exts = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'py', 'cs', 'java', 'php', 'go', 'rs', 'c', 'cpp', 'cc', 'h', 'hpp', 'vue', 'svelte'];
175
+ const ext = path.extname(filePath).toLowerCase().slice(1);
176
+ return exts.includes(ext);
177
+ }
178
+ //# sourceMappingURL=utils.js.map