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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Runner - Abstract base class for feature runners
|
|
3
|
+
*
|
|
4
|
+
* Each runner is responsible for a single feature:
|
|
5
|
+
* - Explaining what it does
|
|
6
|
+
* - Running the actual analysis
|
|
7
|
+
* - Saving results to disk
|
|
8
|
+
* - Returning stats
|
|
9
|
+
*
|
|
10
|
+
* @module commands/setup/runners/base
|
|
11
|
+
*/
|
|
12
|
+
import type { FeatureResult } from '../types.js';
|
|
13
|
+
export interface RunnerContext {
|
|
14
|
+
rootDir: string;
|
|
15
|
+
verbose: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare abstract class BaseRunner {
|
|
18
|
+
protected readonly rootDir: string;
|
|
19
|
+
protected readonly verbose: boolean;
|
|
20
|
+
constructor(ctx: RunnerContext);
|
|
21
|
+
/** Human-readable name */
|
|
22
|
+
abstract get name(): string;
|
|
23
|
+
/** Icon for display */
|
|
24
|
+
abstract get icon(): string;
|
|
25
|
+
/** One-line description */
|
|
26
|
+
abstract get description(): string;
|
|
27
|
+
/** What benefit does this provide? */
|
|
28
|
+
abstract get benefit(): string;
|
|
29
|
+
/** CLI command to run this manually */
|
|
30
|
+
abstract get manualCommand(): string;
|
|
31
|
+
/** Execute the feature and return results */
|
|
32
|
+
abstract run(): Promise<FeatureResult>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8BAAsB,UAAU;IAC9B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAExB,GAAG,EAAE,aAAa;IAK9B,0BAA0B;IAC1B,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAE5B,uBAAuB;IACvB,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAE5B,2BAA2B;IAC3B,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC;IAEnC,sCAAsC;IACtC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC;IAE/B,uCAAuC;IACvC,QAAQ,KAAK,aAAa,IAAI,MAAM,CAAC;IAErC,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CACvC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Runner - Abstract base class for feature runners
|
|
3
|
+
*
|
|
4
|
+
* Each runner is responsible for a single feature:
|
|
5
|
+
* - Explaining what it does
|
|
6
|
+
* - Running the actual analysis
|
|
7
|
+
* - Saving results to disk
|
|
8
|
+
* - Returning stats
|
|
9
|
+
*
|
|
10
|
+
* @module commands/setup/runners/base
|
|
11
|
+
*/
|
|
12
|
+
export class BaseRunner {
|
|
13
|
+
rootDir;
|
|
14
|
+
verbose;
|
|
15
|
+
constructor(ctx) {
|
|
16
|
+
this.rootDir = ctx.rootDir;
|
|
17
|
+
this.verbose = ctx.verbose;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,OAAgB,UAAU;IACX,OAAO,CAAS;IAChB,OAAO,CAAU;IAEpC,YAAY,GAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;CAmBF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Graph Runner - Builds the call graph using native Rust or TypeScript fallback
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/callgraph
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRunner, type RunnerContext } from './base.js';
|
|
7
|
+
import type { FeatureResult } from '../types.js';
|
|
8
|
+
export declare class CallGraphRunner extends BaseRunner {
|
|
9
|
+
constructor(ctx: RunnerContext);
|
|
10
|
+
get name(): string;
|
|
11
|
+
get icon(): string;
|
|
12
|
+
get description(): string;
|
|
13
|
+
get benefit(): string;
|
|
14
|
+
get manualCommand(): string;
|
|
15
|
+
run(): Promise<FeatureResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=callgraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callgraph.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/callgraph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,GAAG,EAAE,aAAa;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CAsEpC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Graph Runner - Builds the call graph using native Rust or TypeScript fallback
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/callgraph
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRunner } from './base.js';
|
|
7
|
+
import { createSpinner } from '../../../ui/spinner.js';
|
|
8
|
+
import { isNativeAvailable, buildCallGraph, createStreamingCallGraphBuilder, } from 'driftdetect-core';
|
|
9
|
+
export class CallGraphRunner extends BaseRunner {
|
|
10
|
+
constructor(ctx) {
|
|
11
|
+
super(ctx);
|
|
12
|
+
}
|
|
13
|
+
get name() {
|
|
14
|
+
return 'Call Graph Analysis';
|
|
15
|
+
}
|
|
16
|
+
get icon() {
|
|
17
|
+
return '📊';
|
|
18
|
+
}
|
|
19
|
+
get description() {
|
|
20
|
+
return 'Maps function calls to understand code flow and data access.';
|
|
21
|
+
}
|
|
22
|
+
get benefit() {
|
|
23
|
+
return 'Answer: "What data can this code access?" and "Who calls this?"';
|
|
24
|
+
}
|
|
25
|
+
get manualCommand() {
|
|
26
|
+
return 'drift callgraph build';
|
|
27
|
+
}
|
|
28
|
+
async run() {
|
|
29
|
+
const spinner = createSpinner('Building call graph...');
|
|
30
|
+
spinner.start();
|
|
31
|
+
try {
|
|
32
|
+
// Try native Rust first (faster, memory-safe)
|
|
33
|
+
if (isNativeAvailable()) {
|
|
34
|
+
spinner.text('Building call graph (native Rust)...');
|
|
35
|
+
const result = await buildCallGraph({ root: this.rootDir, patterns: [] });
|
|
36
|
+
spinner.succeed(`Call graph built: ${result.totalFunctions} functions, ${result.entryPoints} entry points`);
|
|
37
|
+
return {
|
|
38
|
+
enabled: true,
|
|
39
|
+
success: true,
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
stats: {
|
|
42
|
+
functions: result.totalFunctions,
|
|
43
|
+
callSites: result.totalCalls,
|
|
44
|
+
resolvedCalls: result.resolvedCalls,
|
|
45
|
+
entryPoints: result.entryPoints,
|
|
46
|
+
dataAccessors: result.dataAccessors,
|
|
47
|
+
filesProcessed: result.filesProcessed,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// TypeScript fallback
|
|
52
|
+
spinner.text('Building call graph (TypeScript)...');
|
|
53
|
+
const builder = createStreamingCallGraphBuilder({
|
|
54
|
+
rootDir: this.rootDir,
|
|
55
|
+
onProgress: (current, total) => {
|
|
56
|
+
spinner.text(`Building call graph... ${current}/${total} files`);
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const result = await builder.build([
|
|
60
|
+
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py',
|
|
61
|
+
]);
|
|
62
|
+
spinner.succeed(`Call graph built: ${result.totalFunctions} functions, ${result.entryPoints} entry points`);
|
|
63
|
+
return {
|
|
64
|
+
enabled: true,
|
|
65
|
+
success: true,
|
|
66
|
+
timestamp: new Date().toISOString(),
|
|
67
|
+
stats: {
|
|
68
|
+
functions: result.totalFunctions,
|
|
69
|
+
callSites: result.totalCalls,
|
|
70
|
+
resolvedCalls: result.resolvedCalls,
|
|
71
|
+
entryPoints: result.entryPoints,
|
|
72
|
+
dataAccessors: result.dataAccessors,
|
|
73
|
+
filesProcessed: result.filesProcessed,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
79
|
+
spinner.fail(`Call graph failed: ${msg}`);
|
|
80
|
+
if (this.verbose && error instanceof Error) {
|
|
81
|
+
console.error(error.stack);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
enabled: true,
|
|
85
|
+
success: false,
|
|
86
|
+
error: msg,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=callgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callgraph.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/callgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coupling Runner - Analyzes module dependencies and cycles
|
|
3
|
+
*
|
|
4
|
+
* Uses the same analysis flow as `drift coupling build` to ensure
|
|
5
|
+
* the saved format is compatible with `drift coupling status`.
|
|
6
|
+
*
|
|
7
|
+
* @module commands/setup/runners/coupling
|
|
8
|
+
*/
|
|
9
|
+
import { BaseRunner, type RunnerContext } from './base.js';
|
|
10
|
+
import { type FeatureResult } from '../types.js';
|
|
11
|
+
export declare class CouplingRunner extends BaseRunner {
|
|
12
|
+
constructor(ctx: RunnerContext);
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): string;
|
|
15
|
+
get description(): string;
|
|
16
|
+
get benefit(): string;
|
|
17
|
+
get manualCommand(): string;
|
|
18
|
+
run(): Promise<FeatureResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=coupling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/coupling.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5D,qBAAa,cAAe,SAAQ,UAAU;gBAChC,GAAG,EAAE,aAAa;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CAgGpC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coupling Runner - Analyzes module dependencies and cycles
|
|
3
|
+
*
|
|
4
|
+
* Uses the same analysis flow as `drift coupling build` to ensure
|
|
5
|
+
* the saved format is compatible with `drift coupling status`.
|
|
6
|
+
*
|
|
7
|
+
* @module commands/setup/runners/coupling
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'node:fs/promises';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { BaseRunner } from './base.js';
|
|
13
|
+
import { createSpinner } from '../../../ui/spinner.js';
|
|
14
|
+
import { DRIFT_DIR } from '../types.js';
|
|
15
|
+
import { findSourceFiles } from '../utils.js';
|
|
16
|
+
import { analyzeCouplingWithFallback } from 'driftdetect-core';
|
|
17
|
+
export class CouplingRunner extends BaseRunner {
|
|
18
|
+
constructor(ctx) {
|
|
19
|
+
super(ctx);
|
|
20
|
+
}
|
|
21
|
+
get name() {
|
|
22
|
+
return 'Module Coupling';
|
|
23
|
+
}
|
|
24
|
+
get icon() {
|
|
25
|
+
return '🔗';
|
|
26
|
+
}
|
|
27
|
+
get description() {
|
|
28
|
+
return 'Analyzes dependencies, detects circular imports.';
|
|
29
|
+
}
|
|
30
|
+
get benefit() {
|
|
31
|
+
return 'Find tightly coupled modules and dependency cycles';
|
|
32
|
+
}
|
|
33
|
+
get manualCommand() {
|
|
34
|
+
return 'drift coupling build';
|
|
35
|
+
}
|
|
36
|
+
async run() {
|
|
37
|
+
const spinner = createSpinner('Analyzing module coupling...');
|
|
38
|
+
spinner.start();
|
|
39
|
+
try {
|
|
40
|
+
spinner.text('Finding source files...');
|
|
41
|
+
const files = await findSourceFiles(this.rootDir);
|
|
42
|
+
spinner.text(`Analyzing coupling for ${files.length} files...`);
|
|
43
|
+
const result = await analyzeCouplingWithFallback(this.rootDir, files);
|
|
44
|
+
// Save results in the SAME FORMAT as `drift coupling build`
|
|
45
|
+
// This ensures `drift coupling status` works correctly
|
|
46
|
+
const couplingDir = path.join(this.rootDir, DRIFT_DIR, 'module-coupling');
|
|
47
|
+
await fs.mkdir(couplingDir, { recursive: true });
|
|
48
|
+
// Convert native result to graph format (same as drift coupling build)
|
|
49
|
+
const serializedGraph = {
|
|
50
|
+
modules: Object.fromEntries(result.modules.map(m => [m.path, {
|
|
51
|
+
path: m.path,
|
|
52
|
+
imports: [],
|
|
53
|
+
importedBy: [],
|
|
54
|
+
exports: [],
|
|
55
|
+
metrics: {
|
|
56
|
+
Ca: m.ca,
|
|
57
|
+
Ce: m.ce,
|
|
58
|
+
instability: m.instability,
|
|
59
|
+
abstractness: m.abstractness,
|
|
60
|
+
distance: m.distance,
|
|
61
|
+
},
|
|
62
|
+
role: 'balanced',
|
|
63
|
+
isEntryPoint: false,
|
|
64
|
+
isLeaf: m.ce === 0,
|
|
65
|
+
}])),
|
|
66
|
+
edges: [],
|
|
67
|
+
cycles: result.cycles.map((c, i) => ({
|
|
68
|
+
id: `cycle-${i}`,
|
|
69
|
+
path: c.modules,
|
|
70
|
+
length: c.modules.length,
|
|
71
|
+
severity: c.severity,
|
|
72
|
+
totalWeight: c.filesAffected,
|
|
73
|
+
breakPoints: [],
|
|
74
|
+
})),
|
|
75
|
+
metrics: {
|
|
76
|
+
totalModules: result.modules.length,
|
|
77
|
+
totalEdges: 0,
|
|
78
|
+
cycleCount: result.cycles.length,
|
|
79
|
+
avgInstability: result.modules.reduce((sum, m) => sum + m.instability, 0) / Math.max(1, result.modules.length),
|
|
80
|
+
avgDistance: result.modules.reduce((sum, m) => sum + m.distance, 0) / Math.max(1, result.modules.length),
|
|
81
|
+
zoneOfPain: [],
|
|
82
|
+
zoneOfUselessness: [],
|
|
83
|
+
hotspots: result.hotspots.map(h => ({ path: h.module, coupling: h.totalCoupling })),
|
|
84
|
+
isolatedModules: [],
|
|
85
|
+
},
|
|
86
|
+
generatedAt: new Date().toISOString(),
|
|
87
|
+
projectRoot: this.rootDir,
|
|
88
|
+
};
|
|
89
|
+
await fs.writeFile(path.join(couplingDir, 'graph.json'), JSON.stringify(serializedGraph, null, 2));
|
|
90
|
+
const cycleStatus = result.cycles.length > 0
|
|
91
|
+
? chalk.yellow(`${result.cycles.length} cycles`)
|
|
92
|
+
: chalk.green('no cycles');
|
|
93
|
+
spinner.succeed(`Coupling analyzed: ${result.modules.length} modules, ${cycleStatus}`);
|
|
94
|
+
return {
|
|
95
|
+
enabled: true,
|
|
96
|
+
success: true,
|
|
97
|
+
timestamp: new Date().toISOString(),
|
|
98
|
+
stats: {
|
|
99
|
+
modules: result.modules.length,
|
|
100
|
+
cycles: result.cycles.length,
|
|
101
|
+
hotspots: result.hotspots.length,
|
|
102
|
+
healthScore: result.healthScore,
|
|
103
|
+
filesAnalyzed: result.filesAnalyzed,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
109
|
+
spinner.fail(`Coupling analysis failed: ${msg}`);
|
|
110
|
+
if (this.verbose && error instanceof Error) {
|
|
111
|
+
console.error(error.stack);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
enabled: true,
|
|
115
|
+
success: false,
|
|
116
|
+
error: msg,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=coupling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/coupling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DNA Runner - Analyzes styling patterns and code DNA
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/dna
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRunner, type RunnerContext } from './base.js';
|
|
7
|
+
import type { FeatureResult } from '../types.js';
|
|
8
|
+
export declare class DNARunner extends BaseRunner {
|
|
9
|
+
constructor(ctx: RunnerContext);
|
|
10
|
+
get name(): string;
|
|
11
|
+
get icon(): string;
|
|
12
|
+
get description(): string;
|
|
13
|
+
get benefit(): string;
|
|
14
|
+
get manualCommand(): string;
|
|
15
|
+
run(): Promise<FeatureResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=dna.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dna.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/dna.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,qBAAa,SAAU,SAAQ,UAAU;gBAC3B,GAAG,EAAE,aAAa;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CAkDpC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DNA Runner - Analyzes styling patterns and code DNA
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/dna
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRunner } from './base.js';
|
|
7
|
+
import { createSpinner } from '../../../ui/spinner.js';
|
|
8
|
+
import { DNAAnalyzer, DNAStore } from 'driftdetect-core';
|
|
9
|
+
export class DNARunner extends BaseRunner {
|
|
10
|
+
constructor(ctx) {
|
|
11
|
+
super(ctx);
|
|
12
|
+
}
|
|
13
|
+
get name() {
|
|
14
|
+
return 'Styling DNA';
|
|
15
|
+
}
|
|
16
|
+
get icon() {
|
|
17
|
+
return '🧬';
|
|
18
|
+
}
|
|
19
|
+
get description() {
|
|
20
|
+
return 'Analyzes frontend styling patterns (variants, spacing, theming).';
|
|
21
|
+
}
|
|
22
|
+
get benefit() {
|
|
23
|
+
return 'AI generates components matching your exact style';
|
|
24
|
+
}
|
|
25
|
+
get manualCommand() {
|
|
26
|
+
return 'drift dna scan';
|
|
27
|
+
}
|
|
28
|
+
async run() {
|
|
29
|
+
const spinner = createSpinner('Scanning DNA...');
|
|
30
|
+
spinner.start();
|
|
31
|
+
try {
|
|
32
|
+
spinner.text('Initializing DNA analyzer...');
|
|
33
|
+
const analyzer = new DNAAnalyzer({ rootDir: this.rootDir, mode: 'all' });
|
|
34
|
+
await analyzer.initialize();
|
|
35
|
+
spinner.text('Analyzing styling patterns...');
|
|
36
|
+
const result = await analyzer.analyze();
|
|
37
|
+
// Save profile
|
|
38
|
+
spinner.text('Saving DNA profile...');
|
|
39
|
+
const store = new DNAStore({ rootDir: this.rootDir });
|
|
40
|
+
await store.save(result.profile);
|
|
41
|
+
const geneCount = Object.keys(result.profile.genes).length;
|
|
42
|
+
const healthScore = result.profile.summary.healthScore;
|
|
43
|
+
spinner.succeed(`DNA profile created: ${geneCount} genes, ${healthScore}/100 health`);
|
|
44
|
+
return {
|
|
45
|
+
enabled: true,
|
|
46
|
+
success: true,
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
stats: {
|
|
49
|
+
genes: geneCount,
|
|
50
|
+
mutations: result.profile.mutations.length,
|
|
51
|
+
healthScore,
|
|
52
|
+
filesAnalyzed: result.stats.filesAnalyzed,
|
|
53
|
+
componentFiles: result.stats.componentFiles,
|
|
54
|
+
backendFiles: result.stats.backendFiles,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
60
|
+
spinner.fail(`DNA scan failed: ${msg}`);
|
|
61
|
+
if (this.verbose && error instanceof Error) {
|
|
62
|
+
console.error(error.stack);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
enabled: true,
|
|
66
|
+
success: false,
|
|
67
|
+
error: msg,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=dna.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dna.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/dna.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner Exports
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners
|
|
5
|
+
*/
|
|
6
|
+
export { BaseRunner, type RunnerContext } from './base.js';
|
|
7
|
+
export { CallGraphRunner } from './callgraph.js';
|
|
8
|
+
export { TestTopologyRunner } from './test-topology.js';
|
|
9
|
+
export { CouplingRunner } from './coupling.js';
|
|
10
|
+
export { DNARunner } from './dna.js';
|
|
11
|
+
export { MemoryRunner } from './memory.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner Exports
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners
|
|
5
|
+
*/
|
|
6
|
+
export { BaseRunner } from './base.js';
|
|
7
|
+
export { CallGraphRunner } from './callgraph.js';
|
|
8
|
+
export { TestTopologyRunner } from './test-topology.js';
|
|
9
|
+
export { CouplingRunner } from './coupling.js';
|
|
10
|
+
export { DNARunner } from './dna.js';
|
|
11
|
+
export { MemoryRunner } from './memory.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Runner - Initializes Cortex memory system
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/memory
|
|
5
|
+
*/
|
|
6
|
+
import { BaseRunner, type RunnerContext } from './base.js';
|
|
7
|
+
import { type FeatureResult } from '../types.js';
|
|
8
|
+
export declare class MemoryRunner extends BaseRunner {
|
|
9
|
+
constructor(ctx: RunnerContext);
|
|
10
|
+
get name(): string;
|
|
11
|
+
get icon(): string;
|
|
12
|
+
get description(): string;
|
|
13
|
+
get benefit(): string;
|
|
14
|
+
get manualCommand(): string;
|
|
15
|
+
run(): Promise<FeatureResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/memory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,qBAAa,YAAa,SAAQ,UAAU;gBAC9B,GAAG,EAAE,aAAa;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CA+CpC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Runner - Initializes Cortex memory system
|
|
3
|
+
*
|
|
4
|
+
* @module commands/setup/runners/memory
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { BaseRunner } from './base.js';
|
|
9
|
+
import { createSpinner } from '../../../ui/spinner.js';
|
|
10
|
+
import { DRIFT_DIR } from '../types.js';
|
|
11
|
+
export class MemoryRunner extends BaseRunner {
|
|
12
|
+
constructor(ctx) {
|
|
13
|
+
super(ctx);
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return 'Cortex Memory';
|
|
17
|
+
}
|
|
18
|
+
get icon() {
|
|
19
|
+
return '🧠';
|
|
20
|
+
}
|
|
21
|
+
get description() {
|
|
22
|
+
return 'Living knowledge system that learns and adapts.';
|
|
23
|
+
}
|
|
24
|
+
get benefit() {
|
|
25
|
+
return 'AI retrieves relevant context based on what you\'re doing';
|
|
26
|
+
}
|
|
27
|
+
get manualCommand() {
|
|
28
|
+
return 'drift memory init';
|
|
29
|
+
}
|
|
30
|
+
async run() {
|
|
31
|
+
const spinner = createSpinner('Initializing memory...');
|
|
32
|
+
spinner.start();
|
|
33
|
+
try {
|
|
34
|
+
// Ensure memory directory exists
|
|
35
|
+
const memoryDir = path.join(this.rootDir, DRIFT_DIR, 'memory');
|
|
36
|
+
await fs.mkdir(memoryDir, { recursive: true });
|
|
37
|
+
// Import and initialize Cortex
|
|
38
|
+
spinner.text('Setting up Cortex database...');
|
|
39
|
+
const { getCortex } = await import('driftdetect-cortex');
|
|
40
|
+
const dbPath = path.join(memoryDir, 'cortex.db');
|
|
41
|
+
const cortex = await getCortex({
|
|
42
|
+
storage: { type: 'sqlite', sqlitePath: dbPath },
|
|
43
|
+
autoInitialize: true,
|
|
44
|
+
});
|
|
45
|
+
// Close connection (will reopen when needed)
|
|
46
|
+
await cortex.storage.close();
|
|
47
|
+
spinner.succeed('Cortex memory system initialized');
|
|
48
|
+
return {
|
|
49
|
+
enabled: true,
|
|
50
|
+
success: true,
|
|
51
|
+
timestamp: new Date().toISOString(),
|
|
52
|
+
stats: {
|
|
53
|
+
initialized: 1,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
59
|
+
spinner.fail(`Memory init failed: ${msg}`);
|
|
60
|
+
if (this.verbose && error instanceof Error) {
|
|
61
|
+
console.error(error.stack);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
enabled: true,
|
|
65
|
+
success: false,
|
|
66
|
+
error: msg,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/commands/setup/runners/memory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAC;AAE5D,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,GAAkB;QAC5B,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,IAAI,IAAI;QACN,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW;QACb,OAAO,iDAAiD,CAAC;IAC3D,CAAC;IAED,IAAI,OAAO;QACT,OAAO,2DAA2D,CAAC;IACrE,CAAC;IAED,IAAI,aAAa;QACf,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,OAAO,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/C,+BAA+B;YAC/B,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;gBAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;gBAC/C,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YAEH,6CAA6C;YAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAE7B,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAEpD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE;oBACL,WAAW,EAAE,CAAC;iBACf;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAE3C,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG;aACX,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 { BaseRunner, type RunnerContext } from './base.js';
|
|
10
|
+
import { type FeatureResult } from '../types.js';
|
|
11
|
+
export declare class TestTopologyRunner extends BaseRunner {
|
|
12
|
+
constructor(ctx: RunnerContext);
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): string;
|
|
15
|
+
get description(): string;
|
|
16
|
+
get benefit(): string;
|
|
17
|
+
get manualCommand(): string;
|
|
18
|
+
run(): Promise<FeatureResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=test-topology.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-topology.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/runners/test-topology.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5D,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,GAAG,EAAE,aAAa;IAI9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;CAiGpC"}
|