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.
Files changed (224) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/LICENSE +663 -0
  3. package/README.md +392 -0
  4. package/dist/adapters/github/index.d.ts +66 -0
  5. package/dist/adapters/github/index.d.ts.map +1 -0
  6. package/dist/adapters/github/index.js +84 -0
  7. package/dist/adapters/github/index.js.map +1 -0
  8. package/dist/adapters/index.d.ts +5 -0
  9. package/dist/adapters/index.d.ts.map +1 -0
  10. package/dist/adapters/index.js +5 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/cli/commands/changelog.d.ts +3 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +221 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/check.d.ts +3 -0
  17. package/dist/cli/commands/check.d.ts.map +1 -0
  18. package/dist/cli/commands/check.js +35 -0
  19. package/dist/cli/commands/check.js.map +1 -0
  20. package/dist/cli/commands/complexity.d.ts +3 -0
  21. package/dist/cli/commands/complexity.d.ts.map +1 -0
  22. package/dist/cli/commands/complexity.js +103 -0
  23. package/dist/cli/commands/complexity.js.map +1 -0
  24. package/dist/cli/commands/graph.d.ts +3 -0
  25. package/dist/cli/commands/graph.d.ts.map +1 -0
  26. package/dist/cli/commands/graph.js +46 -0
  27. package/dist/cli/commands/graph.js.map +1 -0
  28. package/dist/cli/commands/history.d.ts +3 -0
  29. package/dist/cli/commands/history.d.ts.map +1 -0
  30. package/dist/cli/commands/history.js +127 -0
  31. package/dist/cli/commands/history.js.map +1 -0
  32. package/dist/cli/commands/hotpaths.d.ts +3 -0
  33. package/dist/cli/commands/hotpaths.d.ts.map +1 -0
  34. package/dist/cli/commands/hotpaths.js +153 -0
  35. package/dist/cli/commands/hotpaths.js.map +1 -0
  36. package/dist/cli/commands/impact.d.ts +3 -0
  37. package/dist/cli/commands/impact.d.ts.map +1 -0
  38. package/dist/cli/commands/impact.js +37 -0
  39. package/dist/cli/commands/impact.js.map +1 -0
  40. package/dist/cli/commands/init.d.ts +3 -0
  41. package/dist/cli/commands/init.d.ts.map +1 -0
  42. package/dist/cli/commands/init.js +167 -0
  43. package/dist/cli/commands/init.js.map +1 -0
  44. package/dist/cli/commands/invariants.d.ts +3 -0
  45. package/dist/cli/commands/invariants.d.ts.map +1 -0
  46. package/dist/cli/commands/invariants.js +176 -0
  47. package/dist/cli/commands/invariants.js.map +1 -0
  48. package/dist/cli/commands/mcp-server.d.ts +3 -0
  49. package/dist/cli/commands/mcp-server.d.ts.map +1 -0
  50. package/dist/cli/commands/mcp-server.js +64 -0
  51. package/dist/cli/commands/mcp-server.js.map +1 -0
  52. package/dist/cli/commands/monorepo.d.ts +3 -0
  53. package/dist/cli/commands/monorepo.d.ts.map +1 -0
  54. package/dist/cli/commands/monorepo.js +156 -0
  55. package/dist/cli/commands/monorepo.js.map +1 -0
  56. package/dist/cli/commands/pr-report.d.ts +3 -0
  57. package/dist/cli/commands/pr-report.d.ts.map +1 -0
  58. package/dist/cli/commands/pr-report.js +32 -0
  59. package/dist/cli/commands/pr-report.js.map +1 -0
  60. package/dist/cli/commands/scan.d.ts +3 -0
  61. package/dist/cli/commands/scan.d.ts.map +1 -0
  62. package/dist/cli/commands/scan.js +25 -0
  63. package/dist/cli/commands/scan.js.map +1 -0
  64. package/dist/cli/commands/signals.d.ts +3 -0
  65. package/dist/cli/commands/signals.d.ts.map +1 -0
  66. package/dist/cli/commands/signals.js +34 -0
  67. package/dist/cli/commands/signals.js.map +1 -0
  68. package/dist/cli/commands/tests.d.ts +3 -0
  69. package/dist/cli/commands/tests.d.ts.map +1 -0
  70. package/dist/cli/commands/tests.js +30 -0
  71. package/dist/cli/commands/tests.js.map +1 -0
  72. package/dist/cli/commands/watch.d.ts +3 -0
  73. package/dist/cli/commands/watch.d.ts.map +1 -0
  74. package/dist/cli/commands/watch.js +131 -0
  75. package/dist/cli/commands/watch.js.map +1 -0
  76. package/dist/cli/engine.d.ts +162 -0
  77. package/dist/cli/engine.d.ts.map +1 -0
  78. package/dist/cli/engine.js +564 -0
  79. package/dist/cli/engine.js.map +1 -0
  80. package/dist/cli/formatter.d.ts +39 -0
  81. package/dist/cli/formatter.d.ts.map +1 -0
  82. package/dist/cli/formatter.js +444 -0
  83. package/dist/cli/formatter.js.map +1 -0
  84. package/dist/cli/index.d.ts +2 -0
  85. package/dist/cli/index.d.ts.map +1 -0
  86. package/dist/cli/index.js +63 -0
  87. package/dist/cli/index.js.map +1 -0
  88. package/dist/cli/interactive.d.ts +7 -0
  89. package/dist/cli/interactive.d.ts.map +1 -0
  90. package/dist/cli/interactive.js +644 -0
  91. package/dist/cli/interactive.js.map +1 -0
  92. package/dist/core/dependency-graph.d.ts +54 -0
  93. package/dist/core/dependency-graph.d.ts.map +1 -0
  94. package/dist/core/dependency-graph.js +190 -0
  95. package/dist/core/dependency-graph.js.map +1 -0
  96. package/dist/core/dependency-graph.test.d.ts +2 -0
  97. package/dist/core/dependency-graph.test.d.ts.map +1 -0
  98. package/dist/core/dependency-graph.test.js +106 -0
  99. package/dist/core/dependency-graph.test.js.map +1 -0
  100. package/dist/core/git-analyzer.d.ts +52 -0
  101. package/dist/core/git-analyzer.d.ts.map +1 -0
  102. package/dist/core/git-analyzer.js +250 -0
  103. package/dist/core/git-analyzer.js.map +1 -0
  104. package/dist/core/git-analyzer.test.d.ts +2 -0
  105. package/dist/core/git-analyzer.test.d.ts.map +1 -0
  106. package/dist/core/git-analyzer.test.js +71 -0
  107. package/dist/core/git-analyzer.test.js.map +1 -0
  108. package/dist/core/index.d.ts +7 -0
  109. package/dist/core/index.d.ts.map +1 -0
  110. package/dist/core/index.js +7 -0
  111. package/dist/core/index.js.map +1 -0
  112. package/dist/core/repo-indexer.d.ts +57 -0
  113. package/dist/core/repo-indexer.d.ts.map +1 -0
  114. package/dist/core/repo-indexer.js +356 -0
  115. package/dist/core/repo-indexer.js.map +1 -0
  116. package/dist/core/repo-indexer.test.d.ts +2 -0
  117. package/dist/core/repo-indexer.test.d.ts.map +1 -0
  118. package/dist/core/repo-indexer.test.js +89 -0
  119. package/dist/core/repo-indexer.test.js.map +1 -0
  120. package/dist/core/signals-engine.d.ts +38 -0
  121. package/dist/core/signals-engine.d.ts.map +1 -0
  122. package/dist/core/signals-engine.js +142 -0
  123. package/dist/core/signals-engine.js.map +1 -0
  124. package/dist/core/signals-engine.test.d.ts +2 -0
  125. package/dist/core/signals-engine.test.d.ts.map +1 -0
  126. package/dist/core/signals-engine.test.js +129 -0
  127. package/dist/core/signals-engine.test.js.map +1 -0
  128. package/dist/core/symbol-map.d.ts +45 -0
  129. package/dist/core/symbol-map.d.ts.map +1 -0
  130. package/dist/core/symbol-map.js +187 -0
  131. package/dist/core/symbol-map.js.map +1 -0
  132. package/dist/core/types.d.ts +514 -0
  133. package/dist/core/types.d.ts.map +1 -0
  134. package/dist/core/types.js +5 -0
  135. package/dist/core/types.js.map +1 -0
  136. package/dist/core/types.test.d.ts +2 -0
  137. package/dist/core/types.test.d.ts.map +1 -0
  138. package/dist/core/types.test.js +20 -0
  139. package/dist/core/types.test.js.map +1 -0
  140. package/dist/index.d.ts +5 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +9 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/mcp/index.d.ts +3 -0
  145. package/dist/mcp/index.d.ts.map +1 -0
  146. package/dist/mcp/index.js +2 -0
  147. package/dist/mcp/index.js.map +1 -0
  148. package/dist/mcp/server.d.ts +89 -0
  149. package/dist/mcp/server.d.ts.map +1 -0
  150. package/dist/mcp/server.js +549 -0
  151. package/dist/mcp/server.js.map +1 -0
  152. package/dist/modules/changelog-generator.d.ts +82 -0
  153. package/dist/modules/changelog-generator.d.ts.map +1 -0
  154. package/dist/modules/changelog-generator.js +350 -0
  155. package/dist/modules/changelog-generator.js.map +1 -0
  156. package/dist/modules/complexity-engine.d.ts +86 -0
  157. package/dist/modules/complexity-engine.d.ts.map +1 -0
  158. package/dist/modules/complexity-engine.js +355 -0
  159. package/dist/modules/complexity-engine.js.map +1 -0
  160. package/dist/modules/convention-checker.d.ts +24 -0
  161. package/dist/modules/convention-checker.d.ts.map +1 -0
  162. package/dist/modules/convention-checker.js +181 -0
  163. package/dist/modules/convention-checker.js.map +1 -0
  164. package/dist/modules/graph-utils.d.ts +38 -0
  165. package/dist/modules/graph-utils.d.ts.map +1 -0
  166. package/dist/modules/graph-utils.js +40 -0
  167. package/dist/modules/graph-utils.js.map +1 -0
  168. package/dist/modules/hot-path-detector.d.ts +105 -0
  169. package/dist/modules/hot-path-detector.d.ts.map +1 -0
  170. package/dist/modules/hot-path-detector.js +332 -0
  171. package/dist/modules/hot-path-detector.js.map +1 -0
  172. package/dist/modules/impact-analyzer.d.ts +40 -0
  173. package/dist/modules/impact-analyzer.d.ts.map +1 -0
  174. package/dist/modules/impact-analyzer.js +218 -0
  175. package/dist/modules/impact-analyzer.js.map +1 -0
  176. package/dist/modules/impact-analyzer.test.d.ts +2 -0
  177. package/dist/modules/impact-analyzer.test.d.ts.map +1 -0
  178. package/dist/modules/impact-analyzer.test.js +308 -0
  179. package/dist/modules/impact-analyzer.test.js.map +1 -0
  180. package/dist/modules/index.d.ts +14 -0
  181. package/dist/modules/index.d.ts.map +1 -0
  182. package/dist/modules/index.js +20 -0
  183. package/dist/modules/index.js.map +1 -0
  184. package/dist/modules/invariant-engine.d.ts +119 -0
  185. package/dist/modules/invariant-engine.d.ts.map +1 -0
  186. package/dist/modules/invariant-engine.js +457 -0
  187. package/dist/modules/invariant-engine.js.map +1 -0
  188. package/dist/modules/memory-loader.d.ts +34 -0
  189. package/dist/modules/memory-loader.d.ts.map +1 -0
  190. package/dist/modules/memory-loader.js +313 -0
  191. package/dist/modules/memory-loader.js.map +1 -0
  192. package/dist/modules/memory-loader.test.d.ts +2 -0
  193. package/dist/modules/memory-loader.test.d.ts.map +1 -0
  194. package/dist/modules/memory-loader.test.js +120 -0
  195. package/dist/modules/memory-loader.test.js.map +1 -0
  196. package/dist/modules/monorepo-analyzer.d.ts +141 -0
  197. package/dist/modules/monorepo-analyzer.d.ts.map +1 -0
  198. package/dist/modules/monorepo-analyzer.js +453 -0
  199. package/dist/modules/monorepo-analyzer.js.map +1 -0
  200. package/dist/modules/plugin-system.d.ts +144 -0
  201. package/dist/modules/plugin-system.d.ts.map +1 -0
  202. package/dist/modules/plugin-system.js +428 -0
  203. package/dist/modules/plugin-system.js.map +1 -0
  204. package/dist/modules/smart-test-prioritizer.d.ts +95 -0
  205. package/dist/modules/smart-test-prioritizer.d.ts.map +1 -0
  206. package/dist/modules/smart-test-prioritizer.js +328 -0
  207. package/dist/modules/smart-test-prioritizer.js.map +1 -0
  208. package/dist/modules/temporal-analyzer.d.ts +71 -0
  209. package/dist/modules/temporal-analyzer.d.ts.map +1 -0
  210. package/dist/modules/temporal-analyzer.js +301 -0
  211. package/dist/modules/temporal-analyzer.js.map +1 -0
  212. package/dist/modules/test-suggester.d.ts +22 -0
  213. package/dist/modules/test-suggester.d.ts.map +1 -0
  214. package/dist/modules/test-suggester.js +145 -0
  215. package/dist/modules/test-suggester.js.map +1 -0
  216. package/dist/modules/visualizer.d.ts +49 -0
  217. package/dist/modules/visualizer.d.ts.map +1 -0
  218. package/dist/modules/visualizer.js +302 -0
  219. package/dist/modules/visualizer.js.map +1 -0
  220. package/dist/modules/watcher.d.ts +82 -0
  221. package/dist/modules/watcher.d.ts.map +1 -0
  222. package/dist/modules/watcher.js +298 -0
  223. package/dist/modules/watcher.js.map +1 -0
  224. 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"}