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,355 @@
1
+ // ============================================================================
2
+ // Complexity Engine
3
+ // ============================================================================
4
+ export class ComplexityEngine {
5
+ /**
6
+ * Analyze complexity of a single file
7
+ */
8
+ analyzeFile(fileInfo, content) {
9
+ const metrics = this.calculateDetailedMetrics(content);
10
+ const symbolComplexities = this.analyzeSymbols(fileInfo.symbols, content);
11
+ const score = this.calculateScore(fileInfo, metrics, symbolComplexities);
12
+ return {
13
+ path: fileInfo.relativePath,
14
+ score,
15
+ symbols: symbolComplexities,
16
+ metrics,
17
+ };
18
+ }
19
+ /**
20
+ * Analyze complexity across all files
21
+ */
22
+ analyzeAll(files, contents, dependencyInfo) {
23
+ const results = new Map();
24
+ for (const [path, fileInfo] of files) {
25
+ const content = contents.get(path) || '';
26
+ const complexity = this.analyzeFile(fileInfo, content);
27
+ // Add coupling metrics from dependency info
28
+ const deps = dependencyInfo.get(path);
29
+ if (deps) {
30
+ const totalDeps = deps.imports + deps.importedBy;
31
+ complexity.score.coupling = Math.min(100, (deps.imports + deps.importedBy) * 5);
32
+ complexity.score.instability = totalDeps > 0
33
+ ? deps.imports / totalDeps
34
+ : 0;
35
+ }
36
+ results.set(path, complexity);
37
+ }
38
+ return results;
39
+ }
40
+ /**
41
+ * Calculate detailed code metrics
42
+ */
43
+ calculateDetailedMetrics(content) {
44
+ const lines = content.split('\n');
45
+ let logicalLines = 0;
46
+ let commentLines = 0;
47
+ let blankLines = 0;
48
+ let inBlockComment = false;
49
+ let maxNestingDepth = 0;
50
+ let currentNesting = 0;
51
+ let returnStatements = 0;
52
+ let parameterCount = 0;
53
+ const functionLengths = [];
54
+ let currentFunctionStart = -1;
55
+ for (let i = 0; i < lines.length; i++) {
56
+ const line = lines[i].trim();
57
+ // Blank line
58
+ if (line === '') {
59
+ blankLines++;
60
+ continue;
61
+ }
62
+ // Block comment handling
63
+ if (line.startsWith('/*')) {
64
+ inBlockComment = true;
65
+ commentLines++;
66
+ if (line.includes('*/'))
67
+ inBlockComment = false;
68
+ continue;
69
+ }
70
+ if (inBlockComment) {
71
+ commentLines++;
72
+ if (line.includes('*/'))
73
+ inBlockComment = false;
74
+ continue;
75
+ }
76
+ // Single line comment
77
+ if (line.startsWith('//')) {
78
+ commentLines++;
79
+ continue;
80
+ }
81
+ // Logical line
82
+ logicalLines++;
83
+ // Nesting depth tracking
84
+ const openBraces = (line.match(/{/g) || []).length;
85
+ const closeBraces = (line.match(/}/g) || []).length;
86
+ currentNesting += openBraces - closeBraces;
87
+ maxNestingDepth = Math.max(maxNestingDepth, currentNesting);
88
+ // Return statements
89
+ if (/\breturn\b/.test(line)) {
90
+ returnStatements++;
91
+ }
92
+ // Function/method detection
93
+ if (/\b(function|async function|\w+\s*\(.*\)\s*[:{]|=>\s*{?)/.test(line)) {
94
+ if (currentFunctionStart >= 0) {
95
+ functionLengths.push(i - currentFunctionStart);
96
+ }
97
+ currentFunctionStart = i;
98
+ // Count parameters
99
+ const paramMatch = line.match(/\(([^)]*)\)/);
100
+ if (paramMatch) {
101
+ const params = paramMatch[1].split(',').filter(p => p.trim());
102
+ parameterCount += params.length;
103
+ }
104
+ }
105
+ }
106
+ // Close last function
107
+ if (currentFunctionStart >= 0) {
108
+ functionLengths.push(lines.length - currentFunctionStart);
109
+ }
110
+ const avgFunctionLength = functionLengths.length > 0
111
+ ? functionLengths.reduce((a, b) => a + b, 0) / functionLengths.length
112
+ : 0;
113
+ const maxFunctionLength = functionLengths.length > 0
114
+ ? Math.max(...functionLengths)
115
+ : 0;
116
+ return {
117
+ linesOfCode: lines.length,
118
+ logicalLines,
119
+ commentLines,
120
+ blankLines,
121
+ commentRatio: lines.length > 0 ? commentLines / lines.length : 0,
122
+ avgFunctionLength,
123
+ maxFunctionLength,
124
+ maxNestingDepth,
125
+ parameterCount,
126
+ returnStatements,
127
+ };
128
+ }
129
+ /**
130
+ * Analyze complexity of individual symbols
131
+ */
132
+ analyzeSymbols(symbols, content) {
133
+ const results = [];
134
+ const lines = content.split('\n');
135
+ for (const symbol of symbols) {
136
+ // Estimate symbol boundaries (simplified)
137
+ const startLine = symbol.line - 1;
138
+ let endLine = startLine;
139
+ let braceCount = 0;
140
+ let started = false;
141
+ for (let i = startLine; i < lines.length; i++) {
142
+ const line = lines[i];
143
+ for (const char of line) {
144
+ if (char === '{') {
145
+ braceCount++;
146
+ started = true;
147
+ }
148
+ else if (char === '}') {
149
+ braceCount--;
150
+ if (started && braceCount === 0) {
151
+ endLine = i;
152
+ break;
153
+ }
154
+ }
155
+ }
156
+ if (started && braceCount === 0)
157
+ break;
158
+ }
159
+ const symbolContent = lines.slice(startLine, endLine + 1).join('\n');
160
+ results.push({
161
+ name: symbol.name,
162
+ kind: symbol.kind,
163
+ cyclomatic: this.calculateCyclomaticComplexity(symbolContent),
164
+ cognitive: this.calculateCognitiveComplexity(symbolContent),
165
+ linesOfCode: endLine - startLine + 1,
166
+ parameters: this.countParameters(symbolContent),
167
+ dependencies: symbol.references?.length || 0,
168
+ });
169
+ }
170
+ return results;
171
+ }
172
+ /**
173
+ * Calculate cyclomatic complexity (decision points + 1)
174
+ */
175
+ calculateCyclomaticComplexity(code) {
176
+ let complexity = 1;
177
+ // Control flow keywords
178
+ const patterns = [
179
+ /\bif\b/g,
180
+ /\belse\s+if\b/g,
181
+ /\bfor\b/g,
182
+ /\bwhile\b/g,
183
+ /\bdo\b/g,
184
+ /\bcase\b/g,
185
+ /\bcatch\b/g,
186
+ /\?\?/g, // Nullish coalescing
187
+ /\?\./g, // Optional chaining
188
+ /\|\|/g, // Logical OR
189
+ /&&/g, // Logical AND
190
+ /\?[^:]/g, // Ternary (not TS type)
191
+ ];
192
+ for (const pattern of patterns) {
193
+ const matches = code.match(pattern);
194
+ if (matches) {
195
+ complexity += matches.length;
196
+ }
197
+ }
198
+ return complexity;
199
+ }
200
+ /**
201
+ * Calculate cognitive complexity (human-centric complexity)
202
+ */
203
+ calculateCognitiveComplexity(code) {
204
+ let complexity = 0;
205
+ let nestingLevel = 0;
206
+ const lines = code.split('\n');
207
+ for (const line of lines) {
208
+ const trimmed = line.trim();
209
+ // Increment for nesting
210
+ if (/\b(if|else|for|while|switch|try|catch)\b/.test(trimmed)) {
211
+ complexity += 1 + nestingLevel; // Base + nesting penalty
212
+ }
213
+ // Break/continue with labels add complexity
214
+ if (/\b(break|continue)\s+\w+/.test(trimmed)) {
215
+ complexity += 1;
216
+ }
217
+ // Recursion is complex
218
+ if (/\bthis\.\w+\(/.test(trimmed) || /\brecurs/.test(trimmed)) {
219
+ complexity += 1;
220
+ }
221
+ // Track nesting
222
+ const opens = (line.match(/{/g) || []).length;
223
+ const closes = (line.match(/}/g) || []).length;
224
+ nestingLevel = Math.max(0, nestingLevel + opens - closes);
225
+ }
226
+ return complexity;
227
+ }
228
+ /**
229
+ * Count function parameters
230
+ */
231
+ countParameters(code) {
232
+ const firstLine = code.split('\n')[0];
233
+ const match = firstLine.match(/\(([^)]*)\)/);
234
+ if (!match)
235
+ return 0;
236
+ const params = match[1].split(',').filter(p => p.trim());
237
+ return params.length;
238
+ }
239
+ /**
240
+ * Calculate overall complexity score
241
+ */
242
+ calculateScore(fileInfo, metrics, symbolComplexities) {
243
+ // Calculate averages
244
+ const avgCyclomatic = symbolComplexities.length > 0
245
+ ? symbolComplexities.reduce((sum, s) => sum + s.cyclomatic, 0) / symbolComplexities.length
246
+ : 0;
247
+ const avgCognitive = symbolComplexities.length > 0
248
+ ? symbolComplexities.reduce((sum, s) => sum + s.cognitive, 0) / symbolComplexities.length
249
+ : 0;
250
+ // Abstractness: ratio of interfaces/types to classes/functions
251
+ const abstractSymbols = fileInfo.symbols.filter(s => s.kind === 'interface' || s.kind === 'type').length;
252
+ const concreteSymbols = fileInfo.symbols.filter(s => s.kind === 'class' || s.kind === 'function').length;
253
+ const abstractness = (abstractSymbols + concreteSymbols) > 0
254
+ ? abstractSymbols / (abstractSymbols + concreteSymbols)
255
+ : 0;
256
+ // Cohesion: simplified - based on how many symbols reference each other
257
+ // Lower exports relative to total symbols suggests higher cohesion
258
+ const cohesion = fileInfo.symbols.length > 0
259
+ ? 1 - (fileInfo.exports.length / fileInfo.symbols.length)
260
+ : 1;
261
+ // Maintainability Index (simplified version of Microsoft's formula)
262
+ // MI = 171 - 5.2 * ln(V) - 0.23 * G - 16.2 * ln(L)
263
+ // Where V=volume, G=cyclomatic, L=lines
264
+ const volume = metrics.logicalLines * Math.log2(fileInfo.symbols.length + 1);
265
+ const mi = Math.max(0, Math.min(100, 171 - 5.2 * Math.log(volume + 1) - 0.23 * avgCyclomatic - 16.2 * Math.log(metrics.linesOfCode + 1)));
266
+ // Overall score (weighted composite)
267
+ const overall = Math.round((100 - Math.min(100, avgCyclomatic * 5)) * 0.25 +
268
+ (100 - Math.min(100, avgCognitive * 3)) * 0.25 +
269
+ mi * 0.3 +
270
+ cohesion * 100 * 0.1 +
271
+ (1 - Math.min(1, metrics.maxNestingDepth / 10)) * 100 * 0.1);
272
+ return {
273
+ overall,
274
+ cyclomatic: Math.round(avgCyclomatic * 10) / 10,
275
+ cognitive: Math.round(avgCognitive * 10) / 10,
276
+ coupling: 0, // Calculated externally with dependency info
277
+ cohesion: Math.round(cohesion * 100) / 100,
278
+ abstractness: Math.round(abstractness * 100) / 100,
279
+ instability: 0, // Calculated externally with dependency info
280
+ maintainabilityIndex: Math.round(mi),
281
+ };
282
+ }
283
+ /**
284
+ * Get complexity signals (warnings for problematic areas)
285
+ */
286
+ getSignals(complexity) {
287
+ const signals = [];
288
+ // High cyclomatic complexity
289
+ if (complexity.score.cyclomatic > 15) {
290
+ signals.push({
291
+ type: 'high-cyclomatic',
292
+ severity: complexity.score.cyclomatic > 25 ? 'error' : 'warning',
293
+ message: `High cyclomatic complexity (${complexity.score.cyclomatic})`,
294
+ suggestion: 'Consider breaking down complex functions',
295
+ });
296
+ }
297
+ // High cognitive complexity
298
+ if (complexity.score.cognitive > 20) {
299
+ signals.push({
300
+ type: 'high-cognitive',
301
+ severity: complexity.score.cognitive > 35 ? 'error' : 'warning',
302
+ message: `High cognitive complexity (${complexity.score.cognitive})`,
303
+ suggestion: 'Simplify nested logic and reduce cognitive load',
304
+ });
305
+ }
306
+ // Low maintainability index
307
+ if (complexity.score.maintainabilityIndex < 40) {
308
+ signals.push({
309
+ type: 'low-maintainability',
310
+ severity: complexity.score.maintainabilityIndex < 20 ? 'error' : 'warning',
311
+ message: `Low maintainability index (${complexity.score.maintainabilityIndex}/100)`,
312
+ suggestion: 'Refactor to improve maintainability',
313
+ });
314
+ }
315
+ // High coupling
316
+ if (complexity.score.coupling > 50) {
317
+ signals.push({
318
+ type: 'high-coupling',
319
+ severity: 'warning',
320
+ message: `High coupling score (${complexity.score.coupling})`,
321
+ suggestion: 'Consider reducing dependencies',
322
+ });
323
+ }
324
+ // Instability zone (high instability + low abstractness)
325
+ if (complexity.score.instability > 0.7 && complexity.score.abstractness < 0.3) {
326
+ signals.push({
327
+ type: 'instability-zone',
328
+ severity: 'warning',
329
+ message: 'File is in instability zone (high instability, low abstractness)',
330
+ suggestion: 'Add abstractions or reduce outgoing dependencies',
331
+ });
332
+ }
333
+ // Complex symbols
334
+ for (const symbol of complexity.symbols) {
335
+ if (symbol.cyclomatic > 20) {
336
+ signals.push({
337
+ type: 'complex-symbol',
338
+ severity: 'warning',
339
+ message: `${symbol.kind} '${symbol.name}' has high complexity (${symbol.cyclomatic})`,
340
+ suggestion: 'Break down into smaller functions',
341
+ });
342
+ }
343
+ if (symbol.linesOfCode > 100) {
344
+ signals.push({
345
+ type: 'long-function',
346
+ severity: 'info',
347
+ message: `${symbol.kind} '${symbol.name}' is ${symbol.linesOfCode} lines`,
348
+ suggestion: 'Consider extracting helper functions',
349
+ });
350
+ }
351
+ }
352
+ return signals;
353
+ }
354
+ }
355
+ //# sourceMappingURL=complexity-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complexity-engine.js","sourceRoot":"","sources":["../../src/modules/complexity-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ConventionViolation, ConventionMemory, FileInfo, GitDiff } from '../core/types.js';
2
+ export declare class ConventionChecker {
3
+ private conventions;
4
+ constructor();
5
+ /**
6
+ * Load conventions from memory
7
+ */
8
+ loadFromMemory(memory: ConventionMemory): void;
9
+ /**
10
+ * Check files for convention violations
11
+ */
12
+ check(diff: GitDiff, files: Map<string, FileInfo>): ConventionViolation[];
13
+ /**
14
+ * Check all conventions (not just diff)
15
+ */
16
+ checkAll(files: Map<string, FileInfo>): ConventionViolation[];
17
+ private checkFileConventions;
18
+ private checkSymbolConventions;
19
+ private loadDefaultConventions;
20
+ private getConvention;
21
+ private toPascalCase;
22
+ private toCamelCase;
23
+ }
24
+ //# sourceMappingURL=convention-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention-checker.d.ts","sourceRoot":"","sources":["../../src/modules/convention-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACR,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAoB;;IAMvC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAkB9C;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,mBAAmB,EAAE;IAmBzE;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,mBAAmB,EAAE;IAc7D,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,sBAAsB;IAiD9B,OAAO,CAAC,sBAAsB;IA6C9B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,181 @@
1
+ export class ConventionChecker {
2
+ conventions = [];
3
+ constructor() {
4
+ this.loadDefaultConventions();
5
+ }
6
+ /**
7
+ * Load conventions from memory
8
+ */
9
+ loadFromMemory(memory) {
10
+ // Convert memory conventions to checkable conventions
11
+ for (const naming of memory.naming) {
12
+ this.conventions.push({
13
+ id: `naming-${naming.target}`,
14
+ name: `${naming.target} naming`,
15
+ description: `${naming.target} should match pattern ${naming.pattern}`,
16
+ category: 'naming',
17
+ severity: 'warning',
18
+ check: {
19
+ type: 'regex',
20
+ pattern: naming.pattern,
21
+ message: `${naming.target} does not match expected pattern`,
22
+ },
23
+ });
24
+ }
25
+ }
26
+ /**
27
+ * Check files for convention violations
28
+ */
29
+ check(diff, files) {
30
+ const violations = [];
31
+ for (const file of diff.files) {
32
+ const fileInfo = files.get(file.path);
33
+ if (!fileInfo)
34
+ continue;
35
+ // Check file-level conventions
36
+ violations.push(...this.checkFileConventions(file.path, fileInfo));
37
+ // Check symbol-level conventions
38
+ for (const symbol of fileInfo.symbols) {
39
+ violations.push(...this.checkSymbolConventions(symbol, file.path));
40
+ }
41
+ }
42
+ return violations;
43
+ }
44
+ /**
45
+ * Check all conventions (not just diff)
46
+ */
47
+ checkAll(files) {
48
+ const violations = [];
49
+ for (const [filePath, fileInfo] of files) {
50
+ violations.push(...this.checkFileConventions(filePath, fileInfo));
51
+ for (const symbol of fileInfo.symbols) {
52
+ violations.push(...this.checkSymbolConventions(symbol, filePath));
53
+ }
54
+ }
55
+ return violations;
56
+ }
57
+ checkFileConventions(filePath, fileInfo) {
58
+ const violations = [];
59
+ // Check: File size
60
+ if (fileInfo.lines > 500) {
61
+ violations.push({
62
+ convention: this.getConvention('file-size'),
63
+ filePath,
64
+ line: 1,
65
+ column: 1,
66
+ message: `File has ${fileInfo.lines} lines, exceeds recommended 500`,
67
+ suggestion: 'Consider splitting into smaller modules',
68
+ });
69
+ }
70
+ // Check: Too many exports
71
+ if (fileInfo.exports.length > 10) {
72
+ violations.push({
73
+ convention: this.getConvention('export-count'),
74
+ filePath,
75
+ line: 1,
76
+ column: 1,
77
+ message: `File has ${fileInfo.exports.length} exports, exceeds recommended 10`,
78
+ suggestion: 'Consider grouping related exports or splitting the module',
79
+ });
80
+ }
81
+ return violations;
82
+ }
83
+ checkSymbolConventions(symbol, filePath) {
84
+ const violations = [];
85
+ // Check: Class naming (PascalCase)
86
+ if (symbol.kind === 'class' && !/^[A-Z][a-zA-Z0-9]*$/.test(symbol.name)) {
87
+ violations.push({
88
+ convention: this.getConvention('class-naming'),
89
+ filePath,
90
+ line: symbol.line,
91
+ column: 1,
92
+ message: `Class '${symbol.name}' should use PascalCase`,
93
+ suggestion: `Rename to ${this.toPascalCase(symbol.name)}`,
94
+ });
95
+ }
96
+ // Check: Interface naming (PascalCase, optionally prefixed with I)
97
+ if (symbol.kind === 'interface' && !/^I?[A-Z][a-zA-Z0-9]*$/.test(symbol.name)) {
98
+ violations.push({
99
+ convention: this.getConvention('interface-naming'),
100
+ filePath,
101
+ line: symbol.line,
102
+ column: 1,
103
+ message: `Interface '${symbol.name}' should use PascalCase`,
104
+ });
105
+ }
106
+ // Check: Function naming (camelCase)
107
+ if (symbol.kind === 'function' && !/^[a-z][a-zA-Z0-9]*$/.test(symbol.name)) {
108
+ violations.push({
109
+ convention: this.getConvention('function-naming'),
110
+ filePath,
111
+ line: symbol.line,
112
+ column: 1,
113
+ message: `Function '${symbol.name}' should use camelCase`,
114
+ suggestion: `Rename to ${this.toCamelCase(symbol.name)}`,
115
+ });
116
+ }
117
+ // Check: Constant naming (SCREAMING_SNAKE_CASE for true constants)
118
+ if (symbol.kind === 'variable' && symbol.name === symbol.name.toUpperCase() && symbol.name.length > 1) {
119
+ // This is likely intentional constant naming - no violation
120
+ }
121
+ return violations;
122
+ }
123
+ loadDefaultConventions() {
124
+ this.conventions = [
125
+ {
126
+ id: 'file-size',
127
+ name: 'File Size',
128
+ description: 'Files should not exceed 500 lines',
129
+ category: 'structure',
130
+ severity: 'warning',
131
+ check: { type: 'custom', message: 'File exceeds recommended size' },
132
+ },
133
+ {
134
+ id: 'export-count',
135
+ name: 'Export Count',
136
+ description: 'Files should not have more than 10 exports',
137
+ category: 'exports',
138
+ severity: 'warning',
139
+ check: { type: 'custom', message: 'Too many exports in file' },
140
+ },
141
+ {
142
+ id: 'class-naming',
143
+ name: 'Class Naming',
144
+ description: 'Classes should use PascalCase',
145
+ category: 'naming',
146
+ severity: 'warning',
147
+ check: { type: 'regex', pattern: '^[A-Z][a-zA-Z0-9]*$', message: 'Use PascalCase' },
148
+ },
149
+ {
150
+ id: 'interface-naming',
151
+ name: 'Interface Naming',
152
+ description: 'Interfaces should use PascalCase',
153
+ category: 'naming',
154
+ severity: 'warning',
155
+ check: { type: 'regex', pattern: '^I?[A-Z][a-zA-Z0-9]*$', message: 'Use PascalCase' },
156
+ },
157
+ {
158
+ id: 'function-naming',
159
+ name: 'Function Naming',
160
+ description: 'Functions should use camelCase',
161
+ category: 'naming',
162
+ severity: 'warning',
163
+ check: { type: 'regex', pattern: '^[a-z][a-zA-Z0-9]*$', message: 'Use camelCase' },
164
+ },
165
+ ];
166
+ }
167
+ getConvention(id) {
168
+ return this.conventions.find(c => c.id === id);
169
+ }
170
+ toPascalCase(str) {
171
+ return str
172
+ .replace(/[-_](.)/g, (_, c) => c.toUpperCase())
173
+ .replace(/^(.)/, (_, c) => c.toUpperCase());
174
+ }
175
+ toCamelCase(str) {
176
+ return str
177
+ .replace(/[-_](.)/g, (_, c) => c.toUpperCase())
178
+ .replace(/^(.)/, (_, c) => c.toLowerCase());
179
+ }
180
+ }
181
+ //# sourceMappingURL=convention-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention-checker.js","sourceRoot":"","sources":["../../src/modules/convention-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Utility functions for graph data transformations
3
+ */
4
+ export interface RawGraphNode {
5
+ id: string;
6
+ }
7
+ export interface RawGraphEdge {
8
+ from: string;
9
+ to: string;
10
+ }
11
+ export interface RawGraphData {
12
+ nodes: RawGraphNode[];
13
+ edges: RawGraphEdge[];
14
+ }
15
+ export interface TransformedGraphNode {
16
+ path: string;
17
+ imports: string[];
18
+ importedBy: string[];
19
+ depth: number;
20
+ }
21
+ export interface TransformedGraphEdge {
22
+ from: string;
23
+ to: string;
24
+ kind: 'static';
25
+ }
26
+ export interface TransformedGraphData {
27
+ nodes: TransformedGraphNode[];
28
+ edges: TransformedGraphEdge[];
29
+ rootNodes: string[];
30
+ leafNodes: string[];
31
+ }
32
+ /**
33
+ * Transform engine's graph format to Visualizer's expected format
34
+ * @param rawData - Raw graph data from engine with nodes and edges
35
+ * @returns Transformed graph data with imports, importedBy, root and leaf nodes
36
+ */
37
+ export declare function transformGraphData(rawData: RawGraphData): TransformedGraphData;
38
+ //# sourceMappingURL=graph-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-utils.d.ts","sourceRoot":"","sources":["../../src/modules/graph-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,oBAAoB,CAiC9E"}