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,40 @@
1
+ /**
2
+ * Utility functions for graph data transformations
3
+ */
4
+ /**
5
+ * Transform engine's graph format to Visualizer's expected format
6
+ * @param rawData - Raw graph data from engine with nodes and edges
7
+ * @returns Transformed graph data with imports, importedBy, root and leaf nodes
8
+ */
9
+ export function transformGraphData(rawData) {
10
+ const nodeMap = new Map();
11
+ // Initialize all nodes
12
+ for (const node of rawData.nodes) {
13
+ nodeMap.set(node.id, { path: node.id, imports: [], importedBy: [], depth: 0 });
14
+ }
15
+ // Build imports/importedBy from edges
16
+ for (const edge of rawData.edges) {
17
+ const fromNode = nodeMap.get(edge.from);
18
+ const toNode = nodeMap.get(edge.to);
19
+ if (fromNode)
20
+ fromNode.imports.push(edge.to);
21
+ if (toNode)
22
+ toNode.importedBy.push(edge.from);
23
+ }
24
+ const nodes = Array.from(nodeMap.values());
25
+ const rootNodes = nodes.filter(n => n.importedBy.length === 0).map(n => n.path);
26
+ const leafNodes = nodes.filter(n => n.imports.length === 0).map(n => n.path);
27
+ // Transform edges to include 'kind'
28
+ const edges = rawData.edges.map((e) => ({
29
+ from: e.from,
30
+ to: e.to,
31
+ kind: 'static',
32
+ }));
33
+ return {
34
+ nodes,
35
+ edges,
36
+ rootNodes,
37
+ leafNodes,
38
+ };
39
+ }
40
+ //# sourceMappingURL=graph-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-utils.js","sourceRoot":"","sources":["../../src/modules/graph-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAExD,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,QAAQ;YAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM;YAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE7E,oCAAoC;IACpC,MAAM,KAAK,GAA2B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,QAAiB;KACxB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK;QACL,KAAK;QACL,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,105 @@
1
+ import type { FileInfo, DependencyNode, Symbol } from '../core/types.js';
2
+ export interface HotPath {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ nodes: HotPathNode[];
7
+ criticality: 'critical' | 'high' | 'medium';
8
+ category: HotPathCategory;
9
+ }
10
+ export interface HotPathNode {
11
+ path: string;
12
+ symbol?: string;
13
+ role: 'entry' | 'handler' | 'service' | 'data' | 'external';
14
+ order: number;
15
+ }
16
+ export type HotPathCategory = 'api-endpoint' | 'data-pipeline' | 'authentication' | 'payment' | 'user-flow' | 'core-business' | 'custom';
17
+ export interface HotPathAnalysis {
18
+ paths: HotPath[];
19
+ affectedPaths: HotPath[];
20
+ riskLevel: 'low' | 'medium' | 'high' | 'critical';
21
+ summary: HotPathSummary;
22
+ }
23
+ export interface HotPathSummary {
24
+ totalPaths: number;
25
+ criticalPaths: number;
26
+ affectedCritical: number;
27
+ coverage: number;
28
+ }
29
+ export interface PathDetectionConfig {
30
+ entryPatterns: string[];
31
+ exitPatterns: string[];
32
+ criticalPatterns: string[];
33
+ maxDepth: number;
34
+ }
35
+ export declare class HotPathDetector {
36
+ private paths;
37
+ private config;
38
+ constructor(_repoRoot: string, config?: Partial<PathDetectionConfig>);
39
+ /**
40
+ * Detect hot paths automatically from codebase structure
41
+ */
42
+ detectPaths(files: Map<string, FileInfo>, dependencies: Map<string, DependencyNode>): HotPath[];
43
+ /**
44
+ * Load hot paths from architecture memory
45
+ */
46
+ loadFromArchitecture(criticalPaths: string[], entryPoints: string[]): void;
47
+ /**
48
+ * Add a custom hot path definition
49
+ */
50
+ addPath(hotPath: HotPath): void;
51
+ /**
52
+ * Analyze which hot paths are affected by changes
53
+ */
54
+ analyzeImpact(changedFiles: string[]): HotPathAnalysis;
55
+ /**
56
+ * Get all registered hot paths
57
+ */
58
+ getPaths(): HotPath[];
59
+ /**
60
+ * Find symbols on hot paths
61
+ */
62
+ getHotSymbols(files: Map<string, FileInfo>): Symbol[];
63
+ /**
64
+ * Find entry points in the codebase
65
+ */
66
+ private findEntryPoints;
67
+ /**
68
+ * Trace a path from entry point to data layer
69
+ */
70
+ private tracePath;
71
+ /**
72
+ * Check if file matches exit patterns
73
+ */
74
+ private isExitPoint;
75
+ /**
76
+ * Check if path contains critical files
77
+ */
78
+ private isCriticalPath;
79
+ /**
80
+ * Determine the role of a node in a path
81
+ */
82
+ private determineRole;
83
+ /**
84
+ * Generate a name for an auto-detected path
85
+ */
86
+ private generatePathName;
87
+ /**
88
+ * Categorize a path based on its nodes
89
+ */
90
+ private categorize;
91
+ /**
92
+ * Calculate coverage of hot paths
93
+ */
94
+ private calculateCoverage;
95
+ /**
96
+ * Pattern matching helper
97
+ */
98
+ private matchesPattern;
99
+ /**
100
+ * Format hot paths for display
101
+ */
102
+ formatPaths(format?: 'ascii' | 'json'): string;
103
+ private getRoleIcon;
104
+ }
105
+ //# sourceMappingURL=hot-path-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-path-detector.d.ts","sourceRoot":"","sources":["../../src/modules/hot-path-detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAMzE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,SAAS,GACT,WAAW,GACX,eAAe,GACf,QAAQ,CAAC;AAEb,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAsB;gBAExB,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IA4BpE;;OAEG;IACH,WAAW,CACT,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACxC,OAAO,EAAE;IA+BZ;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAmC1E;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI/B;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,eAAe;IA0CtD;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAIrB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE;IAcrD;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAiCjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,WAAW,CAAC,MAAM,GAAE,OAAO,GAAG,MAAgB,GAAG,MAAM;IAgCvD,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,332 @@
1
+ import * as path from 'node:path';
2
+ // ============================================================================
3
+ // Hot Path Detector
4
+ // ============================================================================
5
+ export class HotPathDetector {
6
+ paths = [];
7
+ config;
8
+ constructor(_repoRoot, config) {
9
+ this.config = {
10
+ entryPatterns: [
11
+ '**/routes/**',
12
+ '**/controllers/**',
13
+ '**/api/**',
14
+ '**/handlers/**',
15
+ '**/pages/api/**', // Next.js
16
+ '**/app/**/route.ts', // Next.js App Router
17
+ ],
18
+ exitPatterns: [
19
+ '**/db/**',
20
+ '**/database/**',
21
+ '**/repositories/**',
22
+ '**/external/**',
23
+ '**/clients/**',
24
+ ],
25
+ criticalPatterns: [
26
+ '**/auth/**',
27
+ '**/payment/**',
28
+ '**/security/**',
29
+ '**/billing/**',
30
+ ],
31
+ maxDepth: 10,
32
+ ...config,
33
+ };
34
+ }
35
+ /**
36
+ * Detect hot paths automatically from codebase structure
37
+ */
38
+ detectPaths(files, dependencies) {
39
+ const detectedPaths = [];
40
+ // Find entry points
41
+ const entryPoints = this.findEntryPoints(files);
42
+ // For each entry point, trace the path to data/external layers
43
+ for (const entry of entryPoints) {
44
+ const traced = this.tracePath(entry, dependencies, files);
45
+ if (traced.length > 1) {
46
+ const isCritical = this.isCriticalPath(traced);
47
+ detectedPaths.push({
48
+ id: `auto-${detectedPaths.length + 1}`,
49
+ name: this.generatePathName(entry, traced),
50
+ description: `Auto-detected path from ${entry}`,
51
+ nodes: traced.map((node, index) => ({
52
+ path: node,
53
+ role: this.determineRole(node, index, traced.length),
54
+ order: index,
55
+ })),
56
+ criticality: isCritical ? 'critical' : 'medium',
57
+ category: this.categorize(traced),
58
+ });
59
+ }
60
+ }
61
+ this.paths = detectedPaths;
62
+ return detectedPaths;
63
+ }
64
+ /**
65
+ * Load hot paths from architecture memory
66
+ */
67
+ loadFromArchitecture(criticalPaths, entryPoints) {
68
+ // Convert simple path definitions to HotPath objects
69
+ for (let i = 0; i < criticalPaths.length; i++) {
70
+ const pathDef = criticalPaths[i];
71
+ const parts = pathDef.split('->').map(p => p.trim());
72
+ this.paths.push({
73
+ id: `arch-${i + 1}`,
74
+ name: `Critical Path ${i + 1}`,
75
+ description: pathDef,
76
+ nodes: parts.map((part, index) => ({
77
+ path: part,
78
+ role: index === 0 ? 'entry' : index === parts.length - 1 ? 'external' : 'handler',
79
+ order: index,
80
+ })),
81
+ criticality: 'critical',
82
+ category: 'core-business',
83
+ });
84
+ }
85
+ // Add entry points as the start of potential paths
86
+ for (const entry of entryPoints) {
87
+ if (!this.paths.some(p => p.nodes[0]?.path === entry)) {
88
+ this.paths.push({
89
+ id: `entry-${entry}`,
90
+ name: `Entry: ${path.basename(entry)}`,
91
+ description: `Entry point at ${entry}`,
92
+ nodes: [{ path: entry, role: 'entry', order: 0 }],
93
+ criticality: 'high',
94
+ category: 'api-endpoint',
95
+ });
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Add a custom hot path definition
101
+ */
102
+ addPath(hotPath) {
103
+ this.paths.push(hotPath);
104
+ }
105
+ /**
106
+ * Analyze which hot paths are affected by changes
107
+ */
108
+ analyzeImpact(changedFiles) {
109
+ const affectedPaths = [];
110
+ const changedSet = new Set(changedFiles);
111
+ for (const hotPath of this.paths) {
112
+ const isAffected = hotPath.nodes.some(node => {
113
+ // Direct match
114
+ if (changedSet.has(node.path))
115
+ return true;
116
+ // Pattern match (for glob-style paths)
117
+ return changedFiles.some(changed => this.matchesPattern(changed, node.path));
118
+ });
119
+ if (isAffected) {
120
+ affectedPaths.push(hotPath);
121
+ }
122
+ }
123
+ // Calculate risk level
124
+ const affectedCritical = affectedPaths.filter(p => p.criticality === 'critical').length;
125
+ const affectedHigh = affectedPaths.filter(p => p.criticality === 'high').length;
126
+ let riskLevel = 'low';
127
+ if (affectedCritical > 0)
128
+ riskLevel = 'critical';
129
+ else if (affectedHigh > 1)
130
+ riskLevel = 'high';
131
+ else if (affectedPaths.length > 0)
132
+ riskLevel = 'medium';
133
+ return {
134
+ paths: this.paths,
135
+ affectedPaths,
136
+ riskLevel,
137
+ summary: {
138
+ totalPaths: this.paths.length,
139
+ criticalPaths: this.paths.filter(p => p.criticality === 'critical').length,
140
+ affectedCritical,
141
+ coverage: this.calculateCoverage(changedFiles),
142
+ },
143
+ };
144
+ }
145
+ /**
146
+ * Get all registered hot paths
147
+ */
148
+ getPaths() {
149
+ return [...this.paths];
150
+ }
151
+ /**
152
+ * Find symbols on hot paths
153
+ */
154
+ getHotSymbols(files) {
155
+ const hotSymbols = [];
156
+ const hotFiles = new Set(this.paths.flatMap(p => p.nodes.map(n => n.path)));
157
+ for (const [filePath, fileInfo] of files) {
158
+ if (hotFiles.has(filePath) ||
159
+ [...hotFiles].some(h => this.matchesPattern(filePath, h))) {
160
+ hotSymbols.push(...fileInfo.symbols.filter(s => s.exported));
161
+ }
162
+ }
163
+ return hotSymbols;
164
+ }
165
+ /**
166
+ * Find entry points in the codebase
167
+ */
168
+ findEntryPoints(files) {
169
+ const entries = [];
170
+ for (const [filePath, fileInfo] of files) {
171
+ // Check if file matches entry patterns
172
+ const isEntry = this.config.entryPatterns.some(pattern => this.matchesPattern(filePath, pattern));
173
+ if (isEntry) {
174
+ entries.push(filePath);
175
+ continue;
176
+ }
177
+ // Check for HTTP handler exports
178
+ const hasHttpHandlers = fileInfo.exports.some(exp => /^(get|post|put|patch|delete|handler|action)$/i.test(exp.name) ||
179
+ /Handler$|Controller$|Route$/.test(exp.name));
180
+ if (hasHttpHandlers) {
181
+ entries.push(filePath);
182
+ }
183
+ }
184
+ return entries;
185
+ }
186
+ /**
187
+ * Trace a path from entry point to data layer
188
+ */
189
+ tracePath(entryPoint, dependencies, files, visited = new Set(), depth = 0) {
190
+ if (depth > this.config.maxDepth)
191
+ return [entryPoint];
192
+ if (visited.has(entryPoint))
193
+ return [entryPoint];
194
+ visited.add(entryPoint);
195
+ const node = dependencies.get(entryPoint);
196
+ if (!node)
197
+ return [entryPoint];
198
+ // Check if we've reached an exit point (data/external layer)
199
+ const isExit = this.config.exitPatterns.some(pattern => this.matchesPattern(entryPoint, pattern));
200
+ if (isExit)
201
+ return [entryPoint];
202
+ // Follow dependencies
203
+ for (const dep of node.imports) {
204
+ const subPath = this.tracePath(dep, dependencies, files, visited, depth + 1);
205
+ if (subPath.length > 1 || this.isExitPoint(subPath[0])) {
206
+ return [entryPoint, ...subPath];
207
+ }
208
+ }
209
+ return [entryPoint];
210
+ }
211
+ /**
212
+ * Check if file matches exit patterns
213
+ */
214
+ isExitPoint(filePath) {
215
+ return this.config.exitPatterns.some(pattern => this.matchesPattern(filePath, pattern));
216
+ }
217
+ /**
218
+ * Check if path contains critical files
219
+ */
220
+ isCriticalPath(pathNodes) {
221
+ return pathNodes.some(node => this.config.criticalPatterns.some(pattern => this.matchesPattern(node, pattern)));
222
+ }
223
+ /**
224
+ * Determine the role of a node in a path
225
+ */
226
+ determineRole(filePath, index, totalLength) {
227
+ if (index === 0)
228
+ return 'entry';
229
+ if (index === totalLength - 1) {
230
+ if (this.isExitPoint(filePath))
231
+ return 'external';
232
+ return 'data';
233
+ }
234
+ if (filePath.includes('service'))
235
+ return 'service';
236
+ return 'handler';
237
+ }
238
+ /**
239
+ * Generate a name for an auto-detected path
240
+ */
241
+ generatePathName(entry, nodes) {
242
+ const entryName = path.basename(entry, path.extname(entry));
243
+ const exitName = nodes.length > 1
244
+ ? path.basename(nodes[nodes.length - 1], path.extname(nodes[nodes.length - 1]))
245
+ : 'unknown';
246
+ return `${entryName} → ${exitName}`;
247
+ }
248
+ /**
249
+ * Categorize a path based on its nodes
250
+ */
251
+ categorize(nodes) {
252
+ const pathStr = nodes.join(' ').toLowerCase();
253
+ if (pathStr.includes('auth') || pathStr.includes('login') || pathStr.includes('session')) {
254
+ return 'authentication';
255
+ }
256
+ if (pathStr.includes('payment') || pathStr.includes('billing') || pathStr.includes('stripe')) {
257
+ return 'payment';
258
+ }
259
+ if (pathStr.includes('api') || pathStr.includes('route') || pathStr.includes('endpoint')) {
260
+ return 'api-endpoint';
261
+ }
262
+ if (pathStr.includes('pipeline') || pathStr.includes('job') || pathStr.includes('queue')) {
263
+ return 'data-pipeline';
264
+ }
265
+ return 'core-business';
266
+ }
267
+ /**
268
+ * Calculate coverage of hot paths
269
+ */
270
+ calculateCoverage(allFiles) {
271
+ const hotFiles = new Set(this.paths.flatMap(p => p.nodes.map(n => n.path)));
272
+ const covered = allFiles.filter(f => hotFiles.has(f) || [...hotFiles].some(h => this.matchesPattern(f, h)));
273
+ return allFiles.length > 0
274
+ ? Math.round((covered.length / allFiles.length) * 100)
275
+ : 0;
276
+ }
277
+ /**
278
+ * Pattern matching helper
279
+ */
280
+ matchesPattern(filePath, pattern) {
281
+ // Direct match
282
+ if (filePath === pattern)
283
+ return true;
284
+ // Glob pattern
285
+ const regex = pattern
286
+ .replace(/\*\*/g, '{{DOUBLESTAR}}')
287
+ .replace(/\*/g, '[^/]*')
288
+ .replace(/{{DOUBLESTAR}}/g, '.*')
289
+ .replace(/\//g, '\\/');
290
+ return new RegExp(regex).test(filePath);
291
+ }
292
+ /**
293
+ * Format hot paths for display
294
+ */
295
+ formatPaths(format = 'ascii') {
296
+ if (format === 'json') {
297
+ return JSON.stringify(this.paths, null, 2);
298
+ }
299
+ const lines = [];
300
+ lines.push('');
301
+ lines.push('╔════════════════════════════════════════════════════════════╗');
302
+ lines.push('║ HOT PATHS ║');
303
+ lines.push('╚════════════════════════════════════════════════════════════╝');
304
+ lines.push('');
305
+ for (const hotPath of this.paths) {
306
+ const icon = hotPath.criticality === 'critical' ? '🔥' :
307
+ hotPath.criticality === 'high' ? '⚠️' : '📍';
308
+ lines.push(`${icon} ${hotPath.name} [${hotPath.criticality.toUpperCase()}]`);
309
+ lines.push(` ${hotPath.description}`);
310
+ lines.push('');
311
+ for (let i = 0; i < hotPath.nodes.length; i++) {
312
+ const node = hotPath.nodes[i];
313
+ const connector = i === hotPath.nodes.length - 1 ? '└──' : '├──';
314
+ const roleIcon = this.getRoleIcon(node.role);
315
+ lines.push(` ${connector} ${roleIcon} ${node.path}`);
316
+ }
317
+ lines.push('');
318
+ }
319
+ return lines.join('\n');
320
+ }
321
+ getRoleIcon(role) {
322
+ switch (role) {
323
+ case 'entry': return '🚪';
324
+ case 'handler': return '⚙️';
325
+ case 'service': return '🔧';
326
+ case 'data': return '💾';
327
+ case 'external': return '🌐';
328
+ default: return '•';
329
+ }
330
+ }
331
+ }
332
+ //# sourceMappingURL=hot-path-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-path-detector.js","sourceRoot":"","sources":["../../src/modules/hot-path-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { GitDiff, ImpactResult, Symbol, FileInfo, ArchitectureMemory } from '../core/types.js';
2
+ import { DependencyGraph } from '../core/dependency-graph.js';
3
+ export declare class ImpactAnalyzer {
4
+ private depGraph;
5
+ private architecture;
6
+ constructor(depGraph: DependencyGraph);
7
+ /**
8
+ * Set architecture memory for boundary checking
9
+ */
10
+ setArchitecture(architecture: ArchitectureMemory): void;
11
+ /**
12
+ * Analyze impact of a diff
13
+ */
14
+ analyze(diff: GitDiff, files: Map<string, FileInfo>, _symbols: Map<string, Symbol[]>): ImpactResult;
15
+ /**
16
+ * Find symbols that were directly changed
17
+ */
18
+ private findChangedSymbols;
19
+ /**
20
+ * Find modules affected by the changes
21
+ */
22
+ private findAffectedModules;
23
+ /**
24
+ * Detect public API changes
25
+ */
26
+ private detectApiChanges;
27
+ /**
28
+ * Check for architectural boundary violations
29
+ */
30
+ private checkBoundaryViolations;
31
+ /**
32
+ * Find which architecture layer a file path belongs to
33
+ */
34
+ private findLayerForPath;
35
+ /**
36
+ * Calculate overall risk score
37
+ */
38
+ private calculateRiskScore;
39
+ }
40
+ //# sourceMappingURL=impact-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-analyzer.d.ts","sourceRoot":"","sources":["../../src/modules/impact-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAOZ,MAAM,EACN,QAAQ,EACR,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAmC;gBAE3C,QAAQ,EAAE,eAAe;IAIrC;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI;IAIvD;;OAEG;IACH,OAAO,CACL,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC9B,YAAY;IAqBf;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8D/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAqD3B"}