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,119 @@
|
|
|
1
|
+
import type { FileInfo, InvariantMemory } from '../core/types.js';
|
|
2
|
+
export interface InvariantRule {
|
|
3
|
+
id: string;
|
|
4
|
+
description: string;
|
|
5
|
+
severity: 'critical' | 'high' | 'medium';
|
|
6
|
+
type: InvariantType;
|
|
7
|
+
config: InvariantConfig;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type InvariantType = 'no-import' | 'require-import' | 'file-pattern' | 'symbol-required' | 'annotation-required' | 'layer-boundary' | 'naming-pattern' | 'max-dependencies' | 'custom';
|
|
11
|
+
export interface InvariantConfig {
|
|
12
|
+
fromPattern?: string;
|
|
13
|
+
toPattern?: string;
|
|
14
|
+
pattern?: string;
|
|
15
|
+
mustExist?: boolean;
|
|
16
|
+
filePattern?: string;
|
|
17
|
+
symbolName?: string;
|
|
18
|
+
symbolKind?: string;
|
|
19
|
+
annotation?: string;
|
|
20
|
+
sourceLayer?: string;
|
|
21
|
+
targetLayer?: string;
|
|
22
|
+
targetKind?: string;
|
|
23
|
+
namePattern?: string;
|
|
24
|
+
maxCount?: number;
|
|
25
|
+
checkFn?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface InvariantViolation {
|
|
28
|
+
rule: InvariantRule;
|
|
29
|
+
filePath: string;
|
|
30
|
+
line?: number;
|
|
31
|
+
message: string;
|
|
32
|
+
evidence: string;
|
|
33
|
+
suggestion?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface InvariantCheckResult {
|
|
36
|
+
passed: boolean;
|
|
37
|
+
violations: InvariantViolation[];
|
|
38
|
+
checkedRules: number;
|
|
39
|
+
passedRules: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class InvariantEngine {
|
|
42
|
+
private rules;
|
|
43
|
+
private repoRoot;
|
|
44
|
+
private layers;
|
|
45
|
+
constructor(repoRoot: string);
|
|
46
|
+
/**
|
|
47
|
+
* Load invariants from memory file
|
|
48
|
+
*/
|
|
49
|
+
loadFromMemory(memory: InvariantMemory): void;
|
|
50
|
+
/**
|
|
51
|
+
* Load invariants from .codexia/invariants.md
|
|
52
|
+
*/
|
|
53
|
+
loadFromFile(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Add a rule programmatically
|
|
56
|
+
*/
|
|
57
|
+
addRule(rule: InvariantRule): void;
|
|
58
|
+
/**
|
|
59
|
+
* Define architectural layers
|
|
60
|
+
*/
|
|
61
|
+
defineLayers(layers: Record<string, string[]>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Check all invariants against the codebase
|
|
64
|
+
*/
|
|
65
|
+
check(files: Map<string, FileInfo>): Promise<InvariantCheckResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Check a single rule
|
|
68
|
+
*/
|
|
69
|
+
private checkRule;
|
|
70
|
+
/**
|
|
71
|
+
* Check no-import invariant
|
|
72
|
+
*/
|
|
73
|
+
private checkNoImport;
|
|
74
|
+
/**
|
|
75
|
+
* Check require-import invariant
|
|
76
|
+
*/
|
|
77
|
+
private checkRequireImport;
|
|
78
|
+
/**
|
|
79
|
+
* Check layer boundary invariant
|
|
80
|
+
*/
|
|
81
|
+
private checkLayerBoundary;
|
|
82
|
+
/**
|
|
83
|
+
* Check naming pattern invariant
|
|
84
|
+
*/
|
|
85
|
+
private checkNamingPattern;
|
|
86
|
+
/**
|
|
87
|
+
* Check max dependencies invariant
|
|
88
|
+
*/
|
|
89
|
+
private checkMaxDependencies;
|
|
90
|
+
/**
|
|
91
|
+
* Check annotation required invariant
|
|
92
|
+
*/
|
|
93
|
+
private checkAnnotationRequired;
|
|
94
|
+
/**
|
|
95
|
+
* Check file pattern invariant
|
|
96
|
+
*/
|
|
97
|
+
private checkFilePattern;
|
|
98
|
+
/**
|
|
99
|
+
* Parse invariant from memory format
|
|
100
|
+
*/
|
|
101
|
+
private parseInvariant;
|
|
102
|
+
/**
|
|
103
|
+
* Parse invariants from markdown
|
|
104
|
+
*/
|
|
105
|
+
private parseInvariantsMarkdown;
|
|
106
|
+
/**
|
|
107
|
+
* Check if path matches glob pattern
|
|
108
|
+
*/
|
|
109
|
+
private matchesPattern;
|
|
110
|
+
/**
|
|
111
|
+
* Get all registered rules
|
|
112
|
+
*/
|
|
113
|
+
getRules(): InvariantRule[];
|
|
114
|
+
/**
|
|
115
|
+
* Generate a sample invariants.md file
|
|
116
|
+
*/
|
|
117
|
+
static generateSampleFile(): string;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=invariant-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant-engine.d.ts","sourceRoot":"","sources":["../../src/modules/invariant-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { glob } from 'glob';
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Invariant Engine
|
|
6
|
+
// ============================================================================
|
|
7
|
+
export class InvariantEngine {
|
|
8
|
+
rules = [];
|
|
9
|
+
repoRoot;
|
|
10
|
+
layers = new Map(); // Layer name -> file patterns
|
|
11
|
+
constructor(repoRoot) {
|
|
12
|
+
this.repoRoot = repoRoot;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load invariants from memory file
|
|
16
|
+
*/
|
|
17
|
+
loadFromMemory(memory) {
|
|
18
|
+
for (const invariant of memory.rules) {
|
|
19
|
+
this.addRule(this.parseInvariant(invariant));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load invariants from .codexia/invariants.md
|
|
24
|
+
*/
|
|
25
|
+
async loadFromFile() {
|
|
26
|
+
const filePath = path.join(this.repoRoot, '.codexia', 'invariants.md');
|
|
27
|
+
try {
|
|
28
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
29
|
+
const rules = this.parseInvariantsMarkdown(content);
|
|
30
|
+
for (const rule of rules) {
|
|
31
|
+
this.addRule(rule);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// No invariants file, use defaults
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Add a rule programmatically
|
|
40
|
+
*/
|
|
41
|
+
addRule(rule) {
|
|
42
|
+
this.rules.push(rule);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Define architectural layers
|
|
46
|
+
*/
|
|
47
|
+
defineLayers(layers) {
|
|
48
|
+
this.layers = new Map(Object.entries(layers));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check all invariants against the codebase
|
|
52
|
+
*/
|
|
53
|
+
async check(files) {
|
|
54
|
+
const violations = [];
|
|
55
|
+
let passedRules = 0;
|
|
56
|
+
for (const rule of this.rules) {
|
|
57
|
+
if (!rule.enabled)
|
|
58
|
+
continue;
|
|
59
|
+
const ruleViolations = await this.checkRule(rule, files);
|
|
60
|
+
if (ruleViolations.length === 0) {
|
|
61
|
+
passedRules++;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
violations.push(...ruleViolations);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
passed: violations.length === 0,
|
|
69
|
+
violations,
|
|
70
|
+
checkedRules: this.rules.filter(r => r.enabled).length,
|
|
71
|
+
passedRules,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check a single rule
|
|
76
|
+
*/
|
|
77
|
+
async checkRule(rule, files) {
|
|
78
|
+
switch (rule.type) {
|
|
79
|
+
case 'no-import':
|
|
80
|
+
return this.checkNoImport(rule, files);
|
|
81
|
+
case 'require-import':
|
|
82
|
+
return this.checkRequireImport(rule, files);
|
|
83
|
+
case 'layer-boundary':
|
|
84
|
+
return this.checkLayerBoundary(rule, files);
|
|
85
|
+
case 'naming-pattern':
|
|
86
|
+
return this.checkNamingPattern(rule, files);
|
|
87
|
+
case 'max-dependencies':
|
|
88
|
+
return this.checkMaxDependencies(rule, files);
|
|
89
|
+
case 'annotation-required':
|
|
90
|
+
return this.checkAnnotationRequired(rule, files);
|
|
91
|
+
case 'file-pattern':
|
|
92
|
+
return this.checkFilePattern(rule);
|
|
93
|
+
default:
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check no-import invariant
|
|
99
|
+
*/
|
|
100
|
+
checkNoImport(rule, files) {
|
|
101
|
+
const violations = [];
|
|
102
|
+
const { fromPattern, toPattern } = rule.config;
|
|
103
|
+
if (!fromPattern || !toPattern)
|
|
104
|
+
return violations;
|
|
105
|
+
for (const [filePath, fileInfo] of files) {
|
|
106
|
+
// Check if file matches source pattern
|
|
107
|
+
if (!this.matchesPattern(filePath, fromPattern))
|
|
108
|
+
continue;
|
|
109
|
+
// Check imports
|
|
110
|
+
for (const imp of fileInfo.imports) {
|
|
111
|
+
if (this.matchesPattern(imp.source, toPattern)) {
|
|
112
|
+
violations.push({
|
|
113
|
+
rule,
|
|
114
|
+
filePath,
|
|
115
|
+
line: imp.line,
|
|
116
|
+
message: `Import from '${imp.source}' violates invariant: ${rule.description}`,
|
|
117
|
+
evidence: `import { ${imp.specifiers.join(', ')} } from '${imp.source}'`,
|
|
118
|
+
suggestion: `Remove or refactor this import to comply with architectural boundaries`,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return violations;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check require-import invariant
|
|
127
|
+
*/
|
|
128
|
+
checkRequireImport(rule, files) {
|
|
129
|
+
const violations = [];
|
|
130
|
+
const { fromPattern, toPattern } = rule.config;
|
|
131
|
+
if (!fromPattern || !toPattern)
|
|
132
|
+
return violations;
|
|
133
|
+
for (const [filePath, fileInfo] of files) {
|
|
134
|
+
if (!this.matchesPattern(filePath, fromPattern))
|
|
135
|
+
continue;
|
|
136
|
+
const hasRequiredImport = fileInfo.imports.some(imp => this.matchesPattern(imp.source, toPattern));
|
|
137
|
+
if (!hasRequiredImport) {
|
|
138
|
+
violations.push({
|
|
139
|
+
rule,
|
|
140
|
+
filePath,
|
|
141
|
+
message: `Missing required import matching '${toPattern}'`,
|
|
142
|
+
evidence: `File matches '${fromPattern}' but doesn't import from '${toPattern}'`,
|
|
143
|
+
suggestion: `Add import from ${toPattern}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return violations;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check layer boundary invariant
|
|
151
|
+
*/
|
|
152
|
+
checkLayerBoundary(rule, files) {
|
|
153
|
+
const violations = [];
|
|
154
|
+
const { sourceLayer, targetLayer } = rule.config;
|
|
155
|
+
if (!sourceLayer || !targetLayer)
|
|
156
|
+
return violations;
|
|
157
|
+
const sourcePatterns = this.layers.get(sourceLayer) || [sourceLayer];
|
|
158
|
+
const targetPatterns = this.layers.get(targetLayer) || [targetLayer];
|
|
159
|
+
for (const [filePath, fileInfo] of files) {
|
|
160
|
+
// Check if file is in source layer
|
|
161
|
+
const isInSourceLayer = sourcePatterns.some(p => this.matchesPattern(filePath, p));
|
|
162
|
+
if (!isInSourceLayer)
|
|
163
|
+
continue;
|
|
164
|
+
// Check imports
|
|
165
|
+
for (const imp of fileInfo.imports) {
|
|
166
|
+
const importsFromTarget = targetPatterns.some(p => this.matchesPattern(imp.source, p));
|
|
167
|
+
if (importsFromTarget) {
|
|
168
|
+
violations.push({
|
|
169
|
+
rule,
|
|
170
|
+
filePath,
|
|
171
|
+
line: imp.line,
|
|
172
|
+
message: `Layer violation: '${sourceLayer}' cannot depend on '${targetLayer}'`,
|
|
173
|
+
evidence: `Import '${imp.source}' crosses layer boundary`,
|
|
174
|
+
suggestion: `Introduce an abstraction or move this code to a shared layer`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return violations;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check naming pattern invariant
|
|
183
|
+
*/
|
|
184
|
+
checkNamingPattern(rule, files) {
|
|
185
|
+
const violations = [];
|
|
186
|
+
const { targetKind, namePattern, filePattern } = rule.config;
|
|
187
|
+
if (!targetKind || !namePattern)
|
|
188
|
+
return violations;
|
|
189
|
+
const regex = new RegExp(namePattern);
|
|
190
|
+
for (const [filePath, fileInfo] of files) {
|
|
191
|
+
if (filePattern && !this.matchesPattern(filePath, filePattern))
|
|
192
|
+
continue;
|
|
193
|
+
for (const symbol of fileInfo.symbols) {
|
|
194
|
+
if (symbol.kind !== targetKind)
|
|
195
|
+
continue;
|
|
196
|
+
if (!regex.test(symbol.name)) {
|
|
197
|
+
violations.push({
|
|
198
|
+
rule,
|
|
199
|
+
filePath,
|
|
200
|
+
line: symbol.line,
|
|
201
|
+
message: `Naming violation: ${symbol.kind} '${symbol.name}' doesn't match pattern '${namePattern}'`,
|
|
202
|
+
evidence: `${symbol.kind} ${symbol.name}`,
|
|
203
|
+
suggestion: `Rename to match pattern: ${namePattern}`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return violations;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check max dependencies invariant
|
|
212
|
+
*/
|
|
213
|
+
checkMaxDependencies(rule, files) {
|
|
214
|
+
const violations = [];
|
|
215
|
+
const { maxCount, filePattern } = rule.config;
|
|
216
|
+
if (maxCount === undefined)
|
|
217
|
+
return violations;
|
|
218
|
+
for (const [filePath, fileInfo] of files) {
|
|
219
|
+
if (filePattern && !this.matchesPattern(filePath, filePattern))
|
|
220
|
+
continue;
|
|
221
|
+
if (fileInfo.imports.length > maxCount) {
|
|
222
|
+
violations.push({
|
|
223
|
+
rule,
|
|
224
|
+
filePath,
|
|
225
|
+
message: `Too many dependencies: ${fileInfo.imports.length} (max: ${maxCount})`,
|
|
226
|
+
evidence: `File has ${fileInfo.imports.length} imports`,
|
|
227
|
+
suggestion: `Reduce dependencies or split into smaller modules`,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return violations;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check annotation required invariant
|
|
235
|
+
*/
|
|
236
|
+
checkAnnotationRequired(rule, files) {
|
|
237
|
+
const violations = [];
|
|
238
|
+
const { filePattern, annotation, symbolKind } = rule.config;
|
|
239
|
+
if (!filePattern || !annotation)
|
|
240
|
+
return violations;
|
|
241
|
+
for (const [filePath, fileInfo] of files) {
|
|
242
|
+
if (!this.matchesPattern(filePath, filePattern))
|
|
243
|
+
continue;
|
|
244
|
+
for (const symbol of fileInfo.symbols) {
|
|
245
|
+
if (symbolKind && symbol.kind !== symbolKind)
|
|
246
|
+
continue;
|
|
247
|
+
if (!symbol.exported)
|
|
248
|
+
continue;
|
|
249
|
+
const hasAnnotation = symbol.documentation?.includes(annotation);
|
|
250
|
+
if (!hasAnnotation) {
|
|
251
|
+
violations.push({
|
|
252
|
+
rule,
|
|
253
|
+
filePath,
|
|
254
|
+
line: symbol.line,
|
|
255
|
+
message: `Missing required annotation '${annotation}' on ${symbol.kind} '${symbol.name}'`,
|
|
256
|
+
evidence: `Exported ${symbol.kind} without ${annotation} annotation`,
|
|
257
|
+
suggestion: `Add ${annotation} annotation to documentation`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return violations;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check file pattern invariant
|
|
266
|
+
*/
|
|
267
|
+
async checkFilePattern(rule) {
|
|
268
|
+
const violations = [];
|
|
269
|
+
const { pattern, mustExist } = rule.config;
|
|
270
|
+
if (!pattern)
|
|
271
|
+
return violations;
|
|
272
|
+
const matches = await glob(pattern, {
|
|
273
|
+
cwd: this.repoRoot,
|
|
274
|
+
ignore: ['**/node_modules/**'],
|
|
275
|
+
});
|
|
276
|
+
if (mustExist && matches.length === 0) {
|
|
277
|
+
violations.push({
|
|
278
|
+
rule,
|
|
279
|
+
filePath: pattern,
|
|
280
|
+
message: `Required file pattern '${pattern}' has no matches`,
|
|
281
|
+
evidence: 'No files found matching pattern',
|
|
282
|
+
suggestion: `Create files matching ${pattern}`,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (!mustExist && matches.length > 0) {
|
|
286
|
+
for (const match of matches) {
|
|
287
|
+
violations.push({
|
|
288
|
+
rule,
|
|
289
|
+
filePath: match,
|
|
290
|
+
message: `Forbidden file pattern '${pattern}' has matches`,
|
|
291
|
+
evidence: `File '${match}' should not exist`,
|
|
292
|
+
suggestion: `Remove or rename file`,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return violations;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Parse invariant from memory format
|
|
300
|
+
*/
|
|
301
|
+
parseInvariant(invariant) {
|
|
302
|
+
const config = {};
|
|
303
|
+
let type = 'custom';
|
|
304
|
+
// Parse check string to determine type
|
|
305
|
+
if (invariant.check) {
|
|
306
|
+
const check = invariant.check.toLowerCase();
|
|
307
|
+
if (check.includes('cannot import') || check.includes('no import')) {
|
|
308
|
+
type = 'no-import';
|
|
309
|
+
const match = invariant.check.match(/from ['"](.*?)['"].*?cannot import.*?['"](.*?)['"]/i) ||
|
|
310
|
+
invariant.check.match(/['"](.*?)['"].*?cannot import.*?from ['"](.*?)['"]/i);
|
|
311
|
+
if (match) {
|
|
312
|
+
config.fromPattern = match[1];
|
|
313
|
+
config.toPattern = match[2];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else if (check.includes('must import')) {
|
|
317
|
+
type = 'require-import';
|
|
318
|
+
}
|
|
319
|
+
else if (check.includes('layer')) {
|
|
320
|
+
type = 'layer-boundary';
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
id: invariant.id,
|
|
325
|
+
description: invariant.description,
|
|
326
|
+
severity: invariant.severity,
|
|
327
|
+
type,
|
|
328
|
+
config,
|
|
329
|
+
enabled: true,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Parse invariants from markdown
|
|
334
|
+
*/
|
|
335
|
+
parseInvariantsMarkdown(content) {
|
|
336
|
+
const rules = [];
|
|
337
|
+
const lines = content.split('\n');
|
|
338
|
+
let currentRule = null;
|
|
339
|
+
for (const line of lines) {
|
|
340
|
+
// Rule header: ## INV-001: Description
|
|
341
|
+
const headerMatch = line.match(/^##\s+(INV-\d+):\s*(.+)$/);
|
|
342
|
+
if (headerMatch) {
|
|
343
|
+
if (currentRule?.id) {
|
|
344
|
+
rules.push(currentRule);
|
|
345
|
+
}
|
|
346
|
+
currentRule = {
|
|
347
|
+
id: headerMatch[1],
|
|
348
|
+
description: headerMatch[2],
|
|
349
|
+
type: 'custom',
|
|
350
|
+
config: {},
|
|
351
|
+
enabled: true,
|
|
352
|
+
severity: 'medium',
|
|
353
|
+
};
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (!currentRule)
|
|
357
|
+
continue;
|
|
358
|
+
// Severity: - **Severity:** critical
|
|
359
|
+
const severityMatch = line.match(/\*\*Severity\*\*:\s*(critical|high|medium)/i);
|
|
360
|
+
if (severityMatch) {
|
|
361
|
+
currentRule.severity = severityMatch[1].toLowerCase();
|
|
362
|
+
}
|
|
363
|
+
// Check: - **Check:** Files in `src/controllers/` cannot import from `src/db/`
|
|
364
|
+
const checkMatch = line.match(/\*\*Check\*\*:\s*(.+)/);
|
|
365
|
+
if (checkMatch) {
|
|
366
|
+
const checkStr = checkMatch[1];
|
|
367
|
+
// Parse no-import pattern
|
|
368
|
+
const noImportMatch = checkStr.match(/Files in [`'](.+?)[`'] cannot import from [`'](.+?)[`']/);
|
|
369
|
+
if (noImportMatch) {
|
|
370
|
+
currentRule.type = 'no-import';
|
|
371
|
+
currentRule.config = {
|
|
372
|
+
fromPattern: noImportMatch[1] + '**',
|
|
373
|
+
toPattern: noImportMatch[2],
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
// Parse annotation required
|
|
377
|
+
const annotationMatch = checkStr.match(/must have [`'](.+?)[`'] (annotation|JSDoc)/);
|
|
378
|
+
if (annotationMatch) {
|
|
379
|
+
currentRule.type = 'annotation-required';
|
|
380
|
+
currentRule.config = {
|
|
381
|
+
...currentRule.config,
|
|
382
|
+
annotation: annotationMatch[1],
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
// Parse naming pattern
|
|
386
|
+
const namingMatch = checkStr.match(/(class|function|interface|type).*?must match.*?[`'](.+?)[`']/i);
|
|
387
|
+
if (namingMatch) {
|
|
388
|
+
currentRule.type = 'naming-pattern';
|
|
389
|
+
currentRule.config = {
|
|
390
|
+
...currentRule.config,
|
|
391
|
+
targetKind: namingMatch[1].toLowerCase(),
|
|
392
|
+
namePattern: namingMatch[2],
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Don't forget the last rule
|
|
398
|
+
if (currentRule?.id) {
|
|
399
|
+
rules.push(currentRule);
|
|
400
|
+
}
|
|
401
|
+
return rules;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Check if path matches glob pattern
|
|
405
|
+
*/
|
|
406
|
+
matchesPattern(filePath, pattern) {
|
|
407
|
+
// Simple glob matching (supports * and **)
|
|
408
|
+
const regex = pattern
|
|
409
|
+
.replace(/\*\*/g, '{{DOUBLESTAR}}')
|
|
410
|
+
.replace(/\*/g, '[^/]*')
|
|
411
|
+
.replace(/{{DOUBLESTAR}}/g, '.*')
|
|
412
|
+
.replace(/\//g, '\\/');
|
|
413
|
+
return new RegExp(`^${regex}$`).test(filePath) ||
|
|
414
|
+
new RegExp(regex).test(filePath);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Get all registered rules
|
|
418
|
+
*/
|
|
419
|
+
getRules() {
|
|
420
|
+
return [...this.rules];
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Generate a sample invariants.md file
|
|
424
|
+
*/
|
|
425
|
+
static generateSampleFile() {
|
|
426
|
+
return `# Invariants
|
|
427
|
+
|
|
428
|
+
These rules must never be violated. They represent architectural constraints that ensure system integrity.
|
|
429
|
+
|
|
430
|
+
## INV-001: No direct database access from controllers
|
|
431
|
+
- **Severity:** critical
|
|
432
|
+
- **Check:** Files in \`src/controllers/\` cannot import from \`src/db/\`
|
|
433
|
+
- **Rationale:** Controllers should use services/repositories for data access
|
|
434
|
+
|
|
435
|
+
## INV-002: All public APIs must have documentation
|
|
436
|
+
- **Severity:** high
|
|
437
|
+
- **Check:** Exported functions in \`src/api/\` must have \`@description\` JSDoc
|
|
438
|
+
- **Rationale:** Public APIs must be documented for consumers
|
|
439
|
+
|
|
440
|
+
## INV-003: Services must follow naming convention
|
|
441
|
+
- **Severity:** medium
|
|
442
|
+
- **Check:** class in \`src/services/\` must match \`^[A-Z][a-zA-Z]+Service$\`
|
|
443
|
+
- **Rationale:** Consistent naming improves discoverability
|
|
444
|
+
|
|
445
|
+
## INV-004: Maximum dependencies per module
|
|
446
|
+
- **Severity:** medium
|
|
447
|
+
- **Check:** Files cannot have more than 15 imports
|
|
448
|
+
- **Rationale:** Too many dependencies indicate poor cohesion
|
|
449
|
+
|
|
450
|
+
## INV-005: Test files must exist for services
|
|
451
|
+
- **Severity:** high
|
|
452
|
+
- **Check:** Files matching \`src/services/*.ts\` must have corresponding \`*.test.ts\`
|
|
453
|
+
- **Rationale:** All services must have test coverage
|
|
454
|
+
`;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=invariant-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant-engine.js","sourceRoot":"","sources":["../../src/modules/invariant-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ProjectMemory, ArchitectureMemory, ConventionMemory, InvariantMemory, AdrMemory } from '../core/types.js';
|
|
2
|
+
export declare class MemoryLoader {
|
|
3
|
+
private memoryDir;
|
|
4
|
+
constructor(repoRoot: string);
|
|
5
|
+
/**
|
|
6
|
+
* Check if memory directory exists
|
|
7
|
+
*/
|
|
8
|
+
hasMemory(): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Load all project memory
|
|
11
|
+
*/
|
|
12
|
+
loadMemory(): Promise<ProjectMemory | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Load architecture memory
|
|
15
|
+
*/
|
|
16
|
+
loadArchitecture(): Promise<ArchitectureMemory>;
|
|
17
|
+
/**
|
|
18
|
+
* Load conventions memory
|
|
19
|
+
*/
|
|
20
|
+
loadConventions(): Promise<ConventionMemory>;
|
|
21
|
+
/**
|
|
22
|
+
* Load invariants memory
|
|
23
|
+
*/
|
|
24
|
+
loadInvariants(): Promise<InvariantMemory>;
|
|
25
|
+
/**
|
|
26
|
+
* Load ADRs
|
|
27
|
+
*/
|
|
28
|
+
loadAdrs(): Promise<AdrMemory[]>;
|
|
29
|
+
private parseArchitecture;
|
|
30
|
+
private parseConventions;
|
|
31
|
+
private parseInvariants;
|
|
32
|
+
private parseAdr;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=memory-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-loader.d.ts","sourceRoot":"","sources":["../../src/modules/memory-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IASnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAoBjD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAerD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAclD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC;IAYhD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBtC,OAAO,CAAC,iBAAiB;IAgHzB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,QAAQ;CAoCjB"}
|