codexia 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +111 -0
- package/LICENSE +663 -0
- package/README.md +392 -0
- package/dist/adapters/github/index.d.ts +66 -0
- package/dist/adapters/github/index.d.ts.map +1 -0
- package/dist/adapters/github/index.js +84 -0
- package/dist/adapters/github/index.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cli/commands/changelog.d.ts +3 -0
- package/dist/cli/commands/changelog.d.ts.map +1 -0
- package/dist/cli/commands/changelog.js +221 -0
- package/dist/cli/commands/changelog.js.map +1 -0
- package/dist/cli/commands/check.d.ts +3 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +35 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/complexity.d.ts +3 -0
- package/dist/cli/commands/complexity.d.ts.map +1 -0
- package/dist/cli/commands/complexity.js +103 -0
- package/dist/cli/commands/complexity.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +3 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +46 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +127 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/hotpaths.d.ts +3 -0
- package/dist/cli/commands/hotpaths.d.ts.map +1 -0
- package/dist/cli/commands/hotpaths.js +153 -0
- package/dist/cli/commands/hotpaths.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +37 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +167 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/invariants.d.ts +3 -0
- package/dist/cli/commands/invariants.d.ts.map +1 -0
- package/dist/cli/commands/invariants.js +176 -0
- package/dist/cli/commands/invariants.js.map +1 -0
- package/dist/cli/commands/mcp-server.d.ts +3 -0
- package/dist/cli/commands/mcp-server.d.ts.map +1 -0
- package/dist/cli/commands/mcp-server.js +64 -0
- package/dist/cli/commands/mcp-server.js.map +1 -0
- package/dist/cli/commands/monorepo.d.ts +3 -0
- package/dist/cli/commands/monorepo.d.ts.map +1 -0
- package/dist/cli/commands/monorepo.js +156 -0
- package/dist/cli/commands/monorepo.js.map +1 -0
- package/dist/cli/commands/pr-report.d.ts +3 -0
- package/dist/cli/commands/pr-report.d.ts.map +1 -0
- package/dist/cli/commands/pr-report.js +32 -0
- package/dist/cli/commands/pr-report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +25 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/signals.d.ts +3 -0
- package/dist/cli/commands/signals.d.ts.map +1 -0
- package/dist/cli/commands/signals.js +34 -0
- package/dist/cli/commands/signals.js.map +1 -0
- package/dist/cli/commands/tests.d.ts +3 -0
- package/dist/cli/commands/tests.d.ts.map +1 -0
- package/dist/cli/commands/tests.js +30 -0
- package/dist/cli/commands/tests.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +131 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/engine.d.ts +162 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +564 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/formatter.d.ts +39 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +444 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +63 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +7 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +644 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/core/dependency-graph.d.ts +54 -0
- package/dist/core/dependency-graph.d.ts.map +1 -0
- package/dist/core/dependency-graph.js +190 -0
- package/dist/core/dependency-graph.js.map +1 -0
- package/dist/core/dependency-graph.test.d.ts +2 -0
- package/dist/core/dependency-graph.test.d.ts.map +1 -0
- package/dist/core/dependency-graph.test.js +106 -0
- package/dist/core/dependency-graph.test.js.map +1 -0
- package/dist/core/git-analyzer.d.ts +52 -0
- package/dist/core/git-analyzer.d.ts.map +1 -0
- package/dist/core/git-analyzer.js +250 -0
- package/dist/core/git-analyzer.js.map +1 -0
- package/dist/core/git-analyzer.test.d.ts +2 -0
- package/dist/core/git-analyzer.test.d.ts.map +1 -0
- package/dist/core/git-analyzer.test.js +71 -0
- package/dist/core/git-analyzer.test.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/repo-indexer.d.ts +57 -0
- package/dist/core/repo-indexer.d.ts.map +1 -0
- package/dist/core/repo-indexer.js +356 -0
- package/dist/core/repo-indexer.js.map +1 -0
- package/dist/core/repo-indexer.test.d.ts +2 -0
- package/dist/core/repo-indexer.test.d.ts.map +1 -0
- package/dist/core/repo-indexer.test.js +89 -0
- package/dist/core/repo-indexer.test.js.map +1 -0
- package/dist/core/signals-engine.d.ts +38 -0
- package/dist/core/signals-engine.d.ts.map +1 -0
- package/dist/core/signals-engine.js +142 -0
- package/dist/core/signals-engine.js.map +1 -0
- package/dist/core/signals-engine.test.d.ts +2 -0
- package/dist/core/signals-engine.test.d.ts.map +1 -0
- package/dist/core/signals-engine.test.js +129 -0
- package/dist/core/signals-engine.test.js.map +1 -0
- package/dist/core/symbol-map.d.ts +45 -0
- package/dist/core/symbol-map.d.ts.map +1 -0
- package/dist/core/symbol-map.js +187 -0
- package/dist/core/symbol-map.js.map +1 -0
- package/dist/core/types.d.ts +514 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/types.test.d.ts +2 -0
- package/dist/core/types.test.d.ts.map +1 -0
- package/dist/core/types.test.js +20 -0
- package/dist/core/types.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +89 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +549 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/modules/changelog-generator.d.ts +82 -0
- package/dist/modules/changelog-generator.d.ts.map +1 -0
- package/dist/modules/changelog-generator.js +350 -0
- package/dist/modules/changelog-generator.js.map +1 -0
- package/dist/modules/complexity-engine.d.ts +86 -0
- package/dist/modules/complexity-engine.d.ts.map +1 -0
- package/dist/modules/complexity-engine.js +355 -0
- package/dist/modules/complexity-engine.js.map +1 -0
- package/dist/modules/convention-checker.d.ts +24 -0
- package/dist/modules/convention-checker.d.ts.map +1 -0
- package/dist/modules/convention-checker.js +181 -0
- package/dist/modules/convention-checker.js.map +1 -0
- package/dist/modules/graph-utils.d.ts +38 -0
- package/dist/modules/graph-utils.d.ts.map +1 -0
- package/dist/modules/graph-utils.js +40 -0
- package/dist/modules/graph-utils.js.map +1 -0
- package/dist/modules/hot-path-detector.d.ts +105 -0
- package/dist/modules/hot-path-detector.d.ts.map +1 -0
- package/dist/modules/hot-path-detector.js +332 -0
- package/dist/modules/hot-path-detector.js.map +1 -0
- package/dist/modules/impact-analyzer.d.ts +40 -0
- package/dist/modules/impact-analyzer.d.ts.map +1 -0
- package/dist/modules/impact-analyzer.js +218 -0
- package/dist/modules/impact-analyzer.js.map +1 -0
- package/dist/modules/impact-analyzer.test.d.ts +2 -0
- package/dist/modules/impact-analyzer.test.d.ts.map +1 -0
- package/dist/modules/impact-analyzer.test.js +308 -0
- package/dist/modules/impact-analyzer.test.js.map +1 -0
- package/dist/modules/index.d.ts +14 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +20 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/invariant-engine.d.ts +119 -0
- package/dist/modules/invariant-engine.d.ts.map +1 -0
- package/dist/modules/invariant-engine.js +457 -0
- package/dist/modules/invariant-engine.js.map +1 -0
- package/dist/modules/memory-loader.d.ts +34 -0
- package/dist/modules/memory-loader.d.ts.map +1 -0
- package/dist/modules/memory-loader.js +313 -0
- package/dist/modules/memory-loader.js.map +1 -0
- package/dist/modules/memory-loader.test.d.ts +2 -0
- package/dist/modules/memory-loader.test.d.ts.map +1 -0
- package/dist/modules/memory-loader.test.js +120 -0
- package/dist/modules/memory-loader.test.js.map +1 -0
- package/dist/modules/monorepo-analyzer.d.ts +141 -0
- package/dist/modules/monorepo-analyzer.d.ts.map +1 -0
- package/dist/modules/monorepo-analyzer.js +453 -0
- package/dist/modules/monorepo-analyzer.js.map +1 -0
- package/dist/modules/plugin-system.d.ts +144 -0
- package/dist/modules/plugin-system.d.ts.map +1 -0
- package/dist/modules/plugin-system.js +428 -0
- package/dist/modules/plugin-system.js.map +1 -0
- package/dist/modules/smart-test-prioritizer.d.ts +95 -0
- package/dist/modules/smart-test-prioritizer.d.ts.map +1 -0
- package/dist/modules/smart-test-prioritizer.js +328 -0
- package/dist/modules/smart-test-prioritizer.js.map +1 -0
- package/dist/modules/temporal-analyzer.d.ts +71 -0
- package/dist/modules/temporal-analyzer.d.ts.map +1 -0
- package/dist/modules/temporal-analyzer.js +301 -0
- package/dist/modules/temporal-analyzer.js.map +1 -0
- package/dist/modules/test-suggester.d.ts +22 -0
- package/dist/modules/test-suggester.d.ts.map +1 -0
- package/dist/modules/test-suggester.js +145 -0
- package/dist/modules/test-suggester.js.map +1 -0
- package/dist/modules/visualizer.d.ts +49 -0
- package/dist/modules/visualizer.d.ts.map +1 -0
- package/dist/modules/visualizer.js +302 -0
- package/dist/modules/visualizer.js.map +1 -0
- package/dist/modules/watcher.d.ts +82 -0
- package/dist/modules/watcher.d.ts.map +1 -0
- package/dist/modules/watcher.js +298 -0
- package/dist/modules/watcher.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { CodexiaEngine } from '../engine.js';
|
|
3
|
+
import { Formatter } from '../formatter.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
export const hotpathsCommand = new Command('hotpaths')
|
|
6
|
+
.description('Detect and analyze critical code paths')
|
|
7
|
+
.option('-e, --entry <files>', 'Entry points (comma-separated)')
|
|
8
|
+
.option('--auto-detect', 'Auto-detect entry points', true)
|
|
9
|
+
.option('--top <n>', 'Show top N hot paths', '10')
|
|
10
|
+
.option('--min-score <score>', 'Minimum criticality score', '0.5')
|
|
11
|
+
.option('--trace <symbol>', 'Trace paths through specific symbol')
|
|
12
|
+
.option('--impact <file>', 'Show impact on hot paths for a file')
|
|
13
|
+
.addHelpText('after', `
|
|
14
|
+
Examples:
|
|
15
|
+
$ codexia hotpaths Auto-detect and show hot paths
|
|
16
|
+
$ codexia hotpaths -e src/index.ts Analyze from specific entry
|
|
17
|
+
$ codexia hotpaths --trace handleRequest Trace paths through symbol
|
|
18
|
+
$ codexia hotpaths --impact src/db.ts Show how file affects hot paths
|
|
19
|
+
`)
|
|
20
|
+
.action(async (options, command) => {
|
|
21
|
+
const globalOpts = command.parent?.opts() || {};
|
|
22
|
+
const formatter = new Formatter(globalOpts.json);
|
|
23
|
+
try {
|
|
24
|
+
const engine = new CodexiaEngine();
|
|
25
|
+
await engine.initialize();
|
|
26
|
+
const entryPoints = options.entry?.split(',');
|
|
27
|
+
const minScore = parseFloat(options.minScore);
|
|
28
|
+
const topN = parseInt(options.top);
|
|
29
|
+
const analysis = await engine.analyzeHotPaths({
|
|
30
|
+
entryPoints,
|
|
31
|
+
autoDetect: options.autoDetect && !entryPoints,
|
|
32
|
+
trace: options.trace,
|
|
33
|
+
impactFile: options.impact,
|
|
34
|
+
});
|
|
35
|
+
if (globalOpts.json) {
|
|
36
|
+
console.log(JSON.stringify(analysis, null, 2));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(chalk.bold.cyan('\nš„ Hot Path Analysis\n'));
|
|
40
|
+
console.log(chalk.dim('ā'.repeat(80)));
|
|
41
|
+
// Entry points - handle missing entryPoints gracefully
|
|
42
|
+
const detectedEntryPoints = analysis.entryPoints || [];
|
|
43
|
+
if (detectedEntryPoints.length > 0) {
|
|
44
|
+
console.log(chalk.bold('\\nš Entry Points Detected:\\n'));
|
|
45
|
+
for (const entry of detectedEntryPoints) {
|
|
46
|
+
console.log(` ${chalk.green('ā')} ${chalk.cyan(entry.file || entry)}`);
|
|
47
|
+
if (entry.type) {
|
|
48
|
+
console.log(chalk.dim(` Type: ${entry.type} | Exports: ${entry.exports?.join(', ') || 'default'}`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(chalk.bold('\nš Entry Points:\n'));
|
|
54
|
+
console.log(chalk.dim(' No explicit entry points detected. Using dependency roots.\n'));
|
|
55
|
+
}
|
|
56
|
+
// Hot paths - engine returns 'paths' field
|
|
57
|
+
const hotPaths = analysis.paths || [];
|
|
58
|
+
// Hot paths
|
|
59
|
+
console.log(chalk.bold('\nš¤ļø Critical Hot Paths:\n'));
|
|
60
|
+
const filteredPaths = hotPaths
|
|
61
|
+
.filter((p) => (p.criticalityScore || 0.5) >= minScore)
|
|
62
|
+
.slice(0, topN);
|
|
63
|
+
if (filteredPaths.length === 0) {
|
|
64
|
+
console.log(chalk.dim(' No hot paths detected above threshold.\n'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
for (let i = 0; i < filteredPaths.length; i++) {
|
|
68
|
+
const path = filteredPaths[i];
|
|
69
|
+
const score = path.criticalityScore ?? 0.5;
|
|
70
|
+
const scoreBar = 'ā'.repeat(Math.round(score * 10));
|
|
71
|
+
const scoreColor = score >= 0.8 ? chalk.red :
|
|
72
|
+
score >= 0.5 ? chalk.yellow :
|
|
73
|
+
chalk.green;
|
|
74
|
+
console.log(` ${chalk.bold(`#${i + 1}`)} ${chalk.cyan(path.name || path.id || 'Unnamed path')}`);
|
|
75
|
+
console.log(` Score: ${scoreColor(scoreBar)} ${(score * 100).toFixed(0)}%`);
|
|
76
|
+
console.log(` Criticality: ${path.criticality || 'medium'}`);
|
|
77
|
+
// Show path nodes if available
|
|
78
|
+
const nodes = path.nodes || [];
|
|
79
|
+
if (nodes.length > 0) {
|
|
80
|
+
console.log(chalk.dim(' Path:'));
|
|
81
|
+
for (let j = 0; j < Math.min(5, nodes.length); j++) {
|
|
82
|
+
const node = nodes[j];
|
|
83
|
+
const indent = ' ' + ' '.repeat(j);
|
|
84
|
+
const arrow = j > 0 ? 'ā³ ' : '';
|
|
85
|
+
const nodeName = node.symbol || node.path?.split('/').pop() || 'unknown';
|
|
86
|
+
const fileName = node.file?.split('/').pop() || node.path?.split('/').pop() || '';
|
|
87
|
+
console.log(chalk.dim(`${indent}${arrow}${nodeName}${fileName ? ` (${fileName})` : ''}`));
|
|
88
|
+
}
|
|
89
|
+
if (nodes.length > 5) {
|
|
90
|
+
console.log(chalk.dim(` ... +${nodes.length - 5} more nodes`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Description if available
|
|
94
|
+
if (path.description) {
|
|
95
|
+
console.log(chalk.dim(` ${path.description}`));
|
|
96
|
+
}
|
|
97
|
+
// Risk factors
|
|
98
|
+
if (path.riskFactors?.length) {
|
|
99
|
+
console.log(` ${chalk.yellow('ā ')} Risks: ${path.riskFactors.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
console.log();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Trace results
|
|
105
|
+
if (options.trace && analysis.traceResults) {
|
|
106
|
+
console.log(chalk.bold(`\nš Trace: ${options.trace}\n`));
|
|
107
|
+
if (analysis.traceResults.pathsThrough?.length) {
|
|
108
|
+
console.log(` Found in ${chalk.yellow(analysis.traceResults.pathsThrough.length)} hot paths:`);
|
|
109
|
+
for (const path of analysis.traceResults.pathsThrough) {
|
|
110
|
+
console.log(` ${chalk.dim('ā¢')} ${path.name} (score: ${(path.criticalityScore * 100).toFixed(0)}%)`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(chalk.dim(' Symbol not found in any hot paths.\n'));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Impact analysis
|
|
118
|
+
if (options.impact && analysis.impactAnalysis) {
|
|
119
|
+
console.log(chalk.bold(`\nš„ Impact of ${options.impact}:\n`));
|
|
120
|
+
const impact = analysis.impactAnalysis;
|
|
121
|
+
console.log(` Hot paths affected: ${chalk.red(impact.hotPathsAffected)} of ${analysis.hotPaths.length}`);
|
|
122
|
+
console.log(` Total impact score: ${chalk.yellow((impact.totalImpactScore * 100).toFixed(0))}%`);
|
|
123
|
+
if (impact.affectedPaths?.length) {
|
|
124
|
+
console.log(chalk.dim('\n Affected paths:'));
|
|
125
|
+
for (const p of impact.affectedPaths.slice(0, 5)) {
|
|
126
|
+
console.log(` ${chalk.dim('ā¢')} ${p.name}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (impact.recommendations?.length) {
|
|
130
|
+
console.log(chalk.bold('\n š” Recommendations:'));
|
|
131
|
+
for (const rec of impact.recommendations) {
|
|
132
|
+
console.log(` ${chalk.yellow('ā¢')} ${rec}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Summary
|
|
137
|
+
console.log(chalk.dim('ā'.repeat(80)));
|
|
138
|
+
console.log(chalk.bold('\nš Summary:\n'));
|
|
139
|
+
console.log(` Total entry points: ${chalk.yellow(detectedEntryPoints.length)}`);
|
|
140
|
+
console.log(` Total hot paths: ${chalk.yellow(hotPaths.length)}`);
|
|
141
|
+
console.log(` Critical paths (>80%): ${chalk.red(hotPaths.filter((p) => (p.criticalityScore || 0) >= 0.8).length)}`);
|
|
142
|
+
if (analysis.summary?.averageDepth !== undefined) {
|
|
143
|
+
console.log(` Average path depth: ${chalk.yellow(analysis.summary.averageDepth.toFixed(1))}`);
|
|
144
|
+
console.log(` Max path depth: ${chalk.yellow(analysis.summary.maxDepth)}`);
|
|
145
|
+
}
|
|
146
|
+
console.log();
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
console.error(formatter.formatError(error));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=hotpaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotpaths.js","sourceRoot":"","sources":["../../../src/cli/commands/hotpaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAmCtB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { CodexiaEngine } from '../engine.js';
|
|
3
|
+
import { Formatter } from '../formatter.js';
|
|
4
|
+
export const impactCommand = new Command('impact')
|
|
5
|
+
.description('Analyze impact of current git diff')
|
|
6
|
+
.option('-b, --base <ref>', 'Base ref for comparison', 'HEAD')
|
|
7
|
+
.option('--head <ref>', 'Head ref for comparison')
|
|
8
|
+
.option('--staged', 'Analyze only staged changes')
|
|
9
|
+
.addHelpText('after', `
|
|
10
|
+
Examples:
|
|
11
|
+
$ codexia impact Analyze uncommitted changes
|
|
12
|
+
$ codexia impact --staged Analyze staged changes only
|
|
13
|
+
$ codexia impact -b main Compare current HEAD to main
|
|
14
|
+
$ codexia impact -b HEAD~3 --head HEAD Compare last 3 commits
|
|
15
|
+
$ codexia impact --json Output as JSON
|
|
16
|
+
`)
|
|
17
|
+
.action(async (options, command) => {
|
|
18
|
+
const globalOpts = command.parent?.opts() || {};
|
|
19
|
+
const formatter = new Formatter(globalOpts.json);
|
|
20
|
+
try {
|
|
21
|
+
const engine = new CodexiaEngine();
|
|
22
|
+
const impact = await engine.analyzeImpact({
|
|
23
|
+
base: options.base,
|
|
24
|
+
head: options.head,
|
|
25
|
+
staged: options.staged,
|
|
26
|
+
});
|
|
27
|
+
const diff = options.staged
|
|
28
|
+
? await engine.getStagedDiff()
|
|
29
|
+
: await engine.getDiff(options.base, options.head);
|
|
30
|
+
console.log(formatter.formatImpact(impact, diff));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(formatter.formatError(error));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../../src/cli/commands/impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,CAAC;KAC7D,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,6BAA6B,CAAC;KACjD,WAAW,CAAC,OAAO,EAAE;;;;;;;CAOvB,CAAC;KACC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACxC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;YACzB,CAAC,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE;YAC9B,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAc,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsGpC,eAAO,MAAM,WAAW,SAwEpB,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const TEMPLATES = {
|
|
6
|
+
architecture: `# Architecture
|
|
7
|
+
|
|
8
|
+
## Layers
|
|
9
|
+
|
|
10
|
+
- **CLI**: Command-line interface layer
|
|
11
|
+
- paths: \`src/cli/**\`
|
|
12
|
+
- depends on: Core, Modules
|
|
13
|
+
|
|
14
|
+
- **Core**: Core domain logic and types
|
|
15
|
+
- paths: \`src/core/**\`
|
|
16
|
+
- depends on: (none)
|
|
17
|
+
|
|
18
|
+
- **Modules**: Feature modules
|
|
19
|
+
- paths: \`src/modules/**\`
|
|
20
|
+
- depends on: Core
|
|
21
|
+
|
|
22
|
+
## Boundaries
|
|
23
|
+
|
|
24
|
+
- **Modules** cannot import **CLI**: Modules should be independent of CLI
|
|
25
|
+
- **Core** cannot import **Modules**: Core should have no external dependencies
|
|
26
|
+
- **Core** cannot import **CLI**: Core should have no external dependencies
|
|
27
|
+
|
|
28
|
+
## Entry Points
|
|
29
|
+
|
|
30
|
+
- \`src/cli/index.ts\`
|
|
31
|
+
- \`src/core/index.ts\`
|
|
32
|
+
|
|
33
|
+
## Critical Paths
|
|
34
|
+
|
|
35
|
+
- User authentication flow
|
|
36
|
+
- Data persistence layer
|
|
37
|
+
`,
|
|
38
|
+
conventions: `# Conventions
|
|
39
|
+
|
|
40
|
+
## Naming Conventions
|
|
41
|
+
|
|
42
|
+
- Classes: \`PascalCase\`
|
|
43
|
+
- Functions: \`camelCase\`
|
|
44
|
+
- Constants: \`SCREAMING_SNAKE_CASE\`
|
|
45
|
+
- Private fields: \`_prefixed\` or \`#private\`
|
|
46
|
+
- Interfaces: \`IPrefixed\` or plain \`PascalCase\`
|
|
47
|
+
- Type aliases: \`PascalCase\`
|
|
48
|
+
|
|
49
|
+
## File Structure
|
|
50
|
+
|
|
51
|
+
- One class/component per file
|
|
52
|
+
- Test files adjacent to source: \`*.test.ts\` or \`*.spec.ts\`
|
|
53
|
+
- Index files for public exports
|
|
54
|
+
|
|
55
|
+
## Code Patterns
|
|
56
|
+
|
|
57
|
+
- Use async/await over raw Promises
|
|
58
|
+
- Prefer const over let
|
|
59
|
+
- Use TypeScript strict mode
|
|
60
|
+
- Export types from dedicated type files
|
|
61
|
+
`,
|
|
62
|
+
invariants: `# Invariants
|
|
63
|
+
|
|
64
|
+
These are rules that must NEVER be violated.
|
|
65
|
+
|
|
66
|
+
### No direct database access from CLI
|
|
67
|
+
|
|
68
|
+
The CLI layer must never directly access the database. All data access should go through the service layer.
|
|
69
|
+
|
|
70
|
+
### All public APIs must be typed
|
|
71
|
+
|
|
72
|
+
All exported functions and classes must have explicit TypeScript types. No \`any\` types in public APIs.
|
|
73
|
+
|
|
74
|
+
### Tests required for critical paths
|
|
75
|
+
|
|
76
|
+
All code in critical paths must have corresponding unit tests with >80% coverage.
|
|
77
|
+
`,
|
|
78
|
+
adrTemplate: `# ADR-001: [Title]
|
|
79
|
+
|
|
80
|
+
**Status:** Proposed
|
|
81
|
+
**Date:** ${new Date().toISOString().split('T')[0]}
|
|
82
|
+
|
|
83
|
+
## Context
|
|
84
|
+
|
|
85
|
+
[Describe the context and problem statement]
|
|
86
|
+
|
|
87
|
+
## Decision
|
|
88
|
+
|
|
89
|
+
[Describe the decision that was made]
|
|
90
|
+
|
|
91
|
+
## Consequences
|
|
92
|
+
|
|
93
|
+
- [Positive consequence 1]
|
|
94
|
+
- [Positive consequence 2]
|
|
95
|
+
- [Negative consequence that was accepted]
|
|
96
|
+
`,
|
|
97
|
+
};
|
|
98
|
+
export const initCommand = new Command('init')
|
|
99
|
+
.description('Initialize Codexia project memory (.codexia directory)')
|
|
100
|
+
.option('-f, --force', 'Overwrite existing files')
|
|
101
|
+
.addHelpText('after', `
|
|
102
|
+
Examples:
|
|
103
|
+
$ codexia init Create .codexia directory with templates
|
|
104
|
+
$ codexia init --force Overwrite existing .codexia files
|
|
105
|
+
`)
|
|
106
|
+
.action(async (options) => {
|
|
107
|
+
const cwd = process.cwd();
|
|
108
|
+
const codexiaDir = path.join(cwd, '.codexia');
|
|
109
|
+
const adrsDir = path.join(codexiaDir, 'adrs');
|
|
110
|
+
try {
|
|
111
|
+
// Check if directory exists
|
|
112
|
+
try {
|
|
113
|
+
await fs.access(codexiaDir);
|
|
114
|
+
if (!options.force) {
|
|
115
|
+
console.log(chalk.yellow('ā ') + ' .codexia directory already exists. Use --force to overwrite.');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Directory doesn't exist, continue
|
|
121
|
+
}
|
|
122
|
+
// Create directories
|
|
123
|
+
await fs.mkdir(codexiaDir, { recursive: true });
|
|
124
|
+
await fs.mkdir(adrsDir, { recursive: true });
|
|
125
|
+
// Write template files
|
|
126
|
+
const files = [
|
|
127
|
+
{ path: path.join(codexiaDir, '.gitignore'), content: '# Auto-generated cache (contains local paths)\nindex-cache.json\n' },
|
|
128
|
+
{ path: path.join(codexiaDir, 'architecture.md'), content: TEMPLATES.architecture },
|
|
129
|
+
{ path: path.join(codexiaDir, 'conventions.md'), content: TEMPLATES.conventions },
|
|
130
|
+
{ path: path.join(codexiaDir, 'invariants.md'), content: TEMPLATES.invariants },
|
|
131
|
+
{ path: path.join(adrsDir, 'template.md'), content: TEMPLATES.adrTemplate },
|
|
132
|
+
];
|
|
133
|
+
for (const file of files) {
|
|
134
|
+
let backupPath = null;
|
|
135
|
+
if (options.force) {
|
|
136
|
+
try {
|
|
137
|
+
await fs.access(file.path);
|
|
138
|
+
const ext = path.extname(file.path);
|
|
139
|
+
const base = file.path.slice(0, file.path.length - ext.length);
|
|
140
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
141
|
+
backupPath = `${base}.${timestamp}.bak${ext}`;
|
|
142
|
+
await fs.rename(file.path, backupPath);
|
|
143
|
+
console.log(chalk.yellow('ā ') +
|
|
144
|
+
` Existing ${path.relative(cwd, file.path)} backed up to ${path.relative(cwd, backupPath)}`);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// File does not exist or cannot be accessed; no backup created
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await fs.writeFile(file.path, file.content, 'utf-8');
|
|
151
|
+
console.log(chalk.green('ā') + ` Created ${path.relative(cwd, file.path)}`);
|
|
152
|
+
}
|
|
153
|
+
console.log('');
|
|
154
|
+
console.log(chalk.green('ā') + ' Codexia initialized successfully!');
|
|
155
|
+
console.log('');
|
|
156
|
+
console.log('Next steps:');
|
|
157
|
+
console.log(' 1. Edit .codexia/architecture.md to define your project layers');
|
|
158
|
+
console.log(' 2. Edit .codexia/conventions.md to set naming conventions');
|
|
159
|
+
console.log(' 3. Run ' + chalk.cyan('codexia scan') + ' to index your repository');
|
|
160
|
+
console.log('');
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error(chalk.red('ā') + ` Failed to initialize: ${error.message}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,iBAAiB,SAiH1B,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { CodexiaEngine } from '../engine.js';
|
|
3
|
+
import { Formatter } from '../formatter.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
export const invariantsCommand = new Command('invariants')
|
|
6
|
+
.description('Check architectural invariants')
|
|
7
|
+
.option('-c, --config <file>', 'Invariants config file', 'codexia.invariants.yaml')
|
|
8
|
+
.option('--init', 'Generate example invariants config')
|
|
9
|
+
.option('--strict', 'Fail on any violation')
|
|
10
|
+
.option('--fix', 'Attempt to auto-fix violations where possible')
|
|
11
|
+
.option('--watch', 'Watch for changes and re-check')
|
|
12
|
+
.addHelpText('after', `
|
|
13
|
+
Examples:
|
|
14
|
+
$ codexia invariants Check all invariants
|
|
15
|
+
$ codexia invariants --init Generate example config
|
|
16
|
+
$ codexia invariants --strict Fail on violations
|
|
17
|
+
$ codexia invariants -c rules.yaml Use custom config file
|
|
18
|
+
`)
|
|
19
|
+
.action(async (options, command) => {
|
|
20
|
+
const globalOpts = command.parent?.opts() || {};
|
|
21
|
+
const formatter = new Formatter(globalOpts.json);
|
|
22
|
+
try {
|
|
23
|
+
const engine = new CodexiaEngine();
|
|
24
|
+
// Generate example config
|
|
25
|
+
if (options.init) {
|
|
26
|
+
const exampleConfig = generateExampleConfig();
|
|
27
|
+
console.log(exampleConfig);
|
|
28
|
+
console.log(chalk.dim(`\n# Save this to ${options.config} and customize for your project`));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await engine.initialize();
|
|
32
|
+
const results = await engine.checkInvariants({
|
|
33
|
+
configFile: options.config,
|
|
34
|
+
fix: options.fix,
|
|
35
|
+
});
|
|
36
|
+
if (globalOpts.json) {
|
|
37
|
+
console.log(JSON.stringify(results, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.bold.cyan('\nš”ļø Invariant Check Report\n'));
|
|
41
|
+
console.log(chalk.dim('ā'.repeat(80)));
|
|
42
|
+
// Group by rule
|
|
43
|
+
const byRule = new Map();
|
|
44
|
+
for (const v of results.violations) {
|
|
45
|
+
const existing = byRule.get(v.rule) || [];
|
|
46
|
+
existing.push(v);
|
|
47
|
+
byRule.set(v.rule, existing);
|
|
48
|
+
}
|
|
49
|
+
if (results.violations.length === 0) {
|
|
50
|
+
console.log(chalk.green('\nā
All invariants satisfied!\n'));
|
|
51
|
+
console.log(` Rules checked: ${chalk.yellow(results.rulesChecked)}`);
|
|
52
|
+
console.log(` Files scanned: ${chalk.yellow(results.filesScanned)}`);
|
|
53
|
+
console.log();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Show violations grouped by rule
|
|
57
|
+
for (const [rule, violations] of byRule) {
|
|
58
|
+
const ruleConfig = results.rules?.find((r) => r.name === rule);
|
|
59
|
+
const severityColor = ruleConfig?.severity === 'error' ? chalk.red :
|
|
60
|
+
ruleConfig?.severity === 'warning' ? chalk.yellow :
|
|
61
|
+
chalk.dim;
|
|
62
|
+
console.log(`\n${severityColor('ā')} ${chalk.bold(rule)}`);
|
|
63
|
+
if (ruleConfig?.description) {
|
|
64
|
+
console.log(chalk.dim(` ${ruleConfig.description}`));
|
|
65
|
+
}
|
|
66
|
+
console.log();
|
|
67
|
+
for (const v of violations) {
|
|
68
|
+
const icon = v.severity === 'error' ? chalk.red('ā') :
|
|
69
|
+
v.severity === 'warning' ? chalk.yellow('ā ') :
|
|
70
|
+
chalk.dim('ā');
|
|
71
|
+
console.log(` ${icon} ${chalk.cyan(v.file)}${v.line ? `:${v.line}` : ''}`);
|
|
72
|
+
console.log(` ${v.message}`);
|
|
73
|
+
if (v.suggestion) {
|
|
74
|
+
console.log(chalk.dim(` š” ${v.suggestion}`));
|
|
75
|
+
}
|
|
76
|
+
if (v.fixed && options.fix) {
|
|
77
|
+
console.log(chalk.green(` ā Auto-fixed`));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Summary
|
|
82
|
+
console.log(chalk.dim('\nā'.repeat(80)));
|
|
83
|
+
console.log(chalk.bold('\nš Summary:\n'));
|
|
84
|
+
const errors = results.violations.filter((v) => v.severity === 'error').length;
|
|
85
|
+
const warnings = results.violations.filter((v) => v.severity === 'warning').length;
|
|
86
|
+
const fixed = results.violations.filter((v) => v.fixed).length;
|
|
87
|
+
console.log(` Rules checked: ${chalk.yellow(results.rulesChecked)}`);
|
|
88
|
+
console.log(` Files scanned: ${chalk.yellow(results.filesScanned)}`);
|
|
89
|
+
console.log(` Errors: ${chalk.red(errors)}`);
|
|
90
|
+
console.log(` Warnings: ${chalk.yellow(warnings)}`);
|
|
91
|
+
if (options.fix) {
|
|
92
|
+
console.log(` Auto-fixed: ${chalk.green(fixed)}`);
|
|
93
|
+
}
|
|
94
|
+
console.log();
|
|
95
|
+
if (options.strict && errors > 0) {
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(formatter.formatError(error));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
function generateExampleConfig() {
|
|
105
|
+
return `# Codexia Architectural Invariants
|
|
106
|
+
# Define rules to enforce codebase conventions
|
|
107
|
+
|
|
108
|
+
rules:
|
|
109
|
+
# Layer boundary rules
|
|
110
|
+
- name: no-ui-in-core
|
|
111
|
+
description: "Core modules should not import from UI layer"
|
|
112
|
+
type: no-import
|
|
113
|
+
from: "src/core/**"
|
|
114
|
+
target: "src/ui/**"
|
|
115
|
+
severity: error
|
|
116
|
+
|
|
117
|
+
- name: no-direct-db-access
|
|
118
|
+
description: "Only data layer can access database"
|
|
119
|
+
type: no-import
|
|
120
|
+
from: "src/!(data)/**"
|
|
121
|
+
target: "src/data/db/**"
|
|
122
|
+
severity: error
|
|
123
|
+
|
|
124
|
+
# Required dependencies
|
|
125
|
+
- name: controllers-use-services
|
|
126
|
+
description: "Controllers must use services, not repositories directly"
|
|
127
|
+
type: require-import
|
|
128
|
+
from: "src/controllers/**"
|
|
129
|
+
target: "src/services/**"
|
|
130
|
+
severity: warning
|
|
131
|
+
|
|
132
|
+
# Naming conventions
|
|
133
|
+
- name: test-file-naming
|
|
134
|
+
description: "Test files must end with .test.ts or .spec.ts"
|
|
135
|
+
type: naming-pattern
|
|
136
|
+
pattern: "src/**/*.test.ts|src/**/*.spec.ts"
|
|
137
|
+
exclude: "src/**/*.ts"
|
|
138
|
+
severity: warning
|
|
139
|
+
|
|
140
|
+
# Dependency limits
|
|
141
|
+
- name: max-dependencies
|
|
142
|
+
description: "No file should have more than 15 imports"
|
|
143
|
+
type: max-dependencies
|
|
144
|
+
max: 15
|
|
145
|
+
scope: "src/**"
|
|
146
|
+
severity: warning
|
|
147
|
+
|
|
148
|
+
# Annotation requirements
|
|
149
|
+
- name: public-api-docs
|
|
150
|
+
description: "Public API must have JSDoc comments"
|
|
151
|
+
type: annotation-required
|
|
152
|
+
scope: "src/api/**"
|
|
153
|
+
annotation: "@public"
|
|
154
|
+
exports: true
|
|
155
|
+
severity: error
|
|
156
|
+
|
|
157
|
+
# Custom layer boundaries
|
|
158
|
+
- name: clean-architecture
|
|
159
|
+
description: "Enforce clean architecture layers"
|
|
160
|
+
type: layer-boundary
|
|
161
|
+
layers:
|
|
162
|
+
- name: domain
|
|
163
|
+
pattern: "src/domain/**"
|
|
164
|
+
- name: application
|
|
165
|
+
pattern: "src/application/**"
|
|
166
|
+
canImport: [domain]
|
|
167
|
+
- name: infrastructure
|
|
168
|
+
pattern: "src/infrastructure/**"
|
|
169
|
+
canImport: [domain, application]
|
|
170
|
+
- name: presentation
|
|
171
|
+
pattern: "src/ui/**"
|
|
172
|
+
canImport: [application]
|
|
173
|
+
severity: error
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/cli/commands/invariants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,gBAAgB,SA+DzB,CAAC"}
|