code-auditor-mcp 3.1.1 → 3.4.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 (357) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +665 -1
  3. package/README.md +85 -11
  4. package/dist/__test_tmp__/spec18_test.d.ts +2 -0
  5. package/dist/__test_tmp__/spec18_test.d.ts.map +1 -0
  6. package/dist/__test_tmp__/spec18_test.js +5 -0
  7. package/dist/__test_tmp__/spec18_test.js.map +1 -0
  8. package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +6 -0
  9. package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/spec-20/scripts/tool.js +12 -0
  11. package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +1 -0
  12. package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +7 -0
  13. package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/spec-20/src/demo-module.js +13 -0
  15. package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +1 -0
  16. package/dist/analyzers/analyzerUtils.js +2 -2
  17. package/dist/analyzers/analyzerUtils.js.map +1 -1
  18. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +1 -1
  19. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
  20. package/dist/analyzers/cross-language/APIContractAnalyzer.js +2 -2
  21. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  22. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +3 -0
  23. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
  24. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +3 -3
  25. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  26. package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
  27. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  28. package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
  29. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  30. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
  31. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
  32. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
  33. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
  34. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  35. package/dist/analyzers/documentationAnalyzer.js +8 -4
  36. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  37. package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
  38. package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
  39. package/dist/analyzers/orm/adapterRegistry.js +73 -0
  40. package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
  41. package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
  42. package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
  43. package/dist/analyzers/orm/drizzleAdapter.js +166 -0
  44. package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
  45. package/dist/analyzers/orm/index.d.ts +14 -0
  46. package/dist/analyzers/orm/index.d.ts.map +1 -0
  47. package/dist/analyzers/orm/index.js +24 -0
  48. package/dist/analyzers/orm/index.js.map +1 -0
  49. package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
  50. package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
  51. package/dist/analyzers/orm/prismaAdapter.js +170 -0
  52. package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
  53. package/dist/analyzers/orm/types.d.ts +63 -0
  54. package/dist/analyzers/orm/types.d.ts.map +1 -0
  55. package/dist/analyzers/orm/types.js +10 -0
  56. package/dist/analyzers/orm/types.js.map +1 -0
  57. package/dist/analyzers/provenance.d.ts +133 -0
  58. package/dist/analyzers/provenance.d.ts.map +1 -0
  59. package/dist/analyzers/provenance.js +1041 -0
  60. package/dist/analyzers/provenance.js.map +1 -0
  61. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  62. package/dist/analyzers/reactAnalyzer.js +117 -1
  63. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  64. package/dist/analyzers/ruleRegistry.d.ts +38 -0
  65. package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
  66. package/dist/analyzers/ruleRegistry.js +123 -0
  67. package/dist/analyzers/ruleRegistry.js.map +1 -0
  68. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
  69. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
  70. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
  71. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
  72. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
  73. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  74. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
  75. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  76. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
  77. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  78. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -53
  79. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  80. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  81. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
  82. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  83. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  84. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
  85. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  86. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
  87. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  88. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
  89. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  90. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
  91. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
  92. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
  93. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
  94. package/dist/auditRunner.d.ts.map +1 -1
  95. package/dist/auditRunner.js +483 -3
  96. package/dist/auditRunner.js.map +1 -1
  97. package/dist/baseline.d.ts +98 -0
  98. package/dist/baseline.d.ts.map +1 -0
  99. package/dist/baseline.js +184 -0
  100. package/dist/baseline.js.map +1 -0
  101. package/dist/churn/churnExtractor.d.ts +32 -0
  102. package/dist/churn/churnExtractor.d.ts.map +1 -0
  103. package/dist/churn/churnExtractor.js +261 -0
  104. package/dist/churn/churnExtractor.js.map +1 -0
  105. package/dist/cli.js +1215 -11
  106. package/dist/cli.js.map +1 -1
  107. package/dist/codeIndexDB-enhanced.js +1 -1
  108. package/dist/codeIndexDB-enhanced.js.map +1 -1
  109. package/dist/codeIndexDB.d.ts +101 -0
  110. package/dist/codeIndexDB.d.ts.map +1 -1
  111. package/dist/codeIndexDB.js +661 -5
  112. package/dist/codeIndexDB.js.map +1 -1
  113. package/dist/config/configLoader.d.ts.map +1 -1
  114. package/dist/config/configLoader.js +95 -1
  115. package/dist/config/configLoader.js.map +1 -1
  116. package/dist/config/defaults.d.ts +72 -1
  117. package/dist/config/defaults.d.ts.map +1 -1
  118. package/dist/config/defaults.js +146 -15
  119. package/dist/config/defaults.js.map +1 -1
  120. package/dist/config/pathProfiles.d.ts +38 -0
  121. package/dist/config/pathProfiles.d.ts.map +1 -0
  122. package/dist/config/pathProfiles.js +47 -0
  123. package/dist/config/pathProfiles.js.map +1 -0
  124. package/dist/conventions/conventionMiner.d.ts +63 -0
  125. package/dist/conventions/conventionMiner.d.ts.map +1 -0
  126. package/dist/conventions/conventionMiner.js +696 -0
  127. package/dist/conventions/conventionMiner.js.map +1 -0
  128. package/dist/coverage/coverageService.d.ts +49 -0
  129. package/dist/coverage/coverageService.d.ts.map +1 -0
  130. package/dist/coverage/coverageService.js +117 -0
  131. package/dist/coverage/coverageService.js.map +1 -0
  132. package/dist/coverage/istanbulParser.d.ts +84 -0
  133. package/dist/coverage/istanbulParser.d.ts.map +1 -0
  134. package/dist/coverage/istanbulParser.js +120 -0
  135. package/dist/coverage/istanbulParser.js.map +1 -0
  136. package/dist/coverage/lcovParser.d.ts +40 -0
  137. package/dist/coverage/lcovParser.d.ts.map +1 -0
  138. package/dist/coverage/lcovParser.js +168 -0
  139. package/dist/coverage/lcovParser.js.map +1 -0
  140. package/dist/fingerprint.d.ts +17 -0
  141. package/dist/fingerprint.d.ts.map +1 -1
  142. package/dist/fingerprint.js +42 -0
  143. package/dist/fingerprint.js.map +1 -1
  144. package/dist/grammars/tree-sitter-css.wasm +0 -0
  145. package/dist/graph/blastRadius.d.ts +27 -0
  146. package/dist/graph/blastRadius.d.ts.map +1 -0
  147. package/dist/graph/blastRadius.js +150 -0
  148. package/dist/graph/blastRadius.js.map +1 -0
  149. package/dist/graph/callGraph.d.ts +78 -0
  150. package/dist/graph/callGraph.d.ts.map +1 -0
  151. package/dist/graph/callGraph.js +484 -0
  152. package/dist/graph/callGraph.js.map +1 -0
  153. package/dist/graph/importGraph.d.ts +91 -0
  154. package/dist/graph/importGraph.d.ts.map +1 -0
  155. package/dist/graph/importGraph.js +602 -0
  156. package/dist/graph/importGraph.js.map +1 -0
  157. package/dist/graph/outputFormatter.d.ts +55 -0
  158. package/dist/graph/outputFormatter.d.ts.map +1 -0
  159. package/dist/graph/outputFormatter.js +283 -0
  160. package/dist/graph/outputFormatter.js.map +1 -0
  161. package/dist/hooks/codex.d.ts +36 -1
  162. package/dist/hooks/codex.d.ts.map +1 -1
  163. package/dist/hooks/codex.js +88 -54
  164. package/dist/hooks/codex.js.map +1 -1
  165. package/dist/hotspots/hotspotScorer.d.ts +20 -0
  166. package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
  167. package/dist/hotspots/hotspotScorer.js +202 -0
  168. package/dist/hotspots/hotspotScorer.js.map +1 -0
  169. package/dist/invariants/invariant-rules.schema.json +42 -1
  170. package/dist/invariants/ruleEngine.d.ts +4 -1
  171. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  172. package/dist/invariants/ruleEngine.js +141 -5
  173. package/dist/invariants/ruleEngine.js.map +1 -1
  174. package/dist/invariants/ruleValidator.d.ts.map +1 -1
  175. package/dist/invariants/ruleValidator.js +62 -1
  176. package/dist/invariants/ruleValidator.js.map +1 -1
  177. package/dist/invariants/types.d.ts +23 -2
  178. package/dist/invariants/types.d.ts.map +1 -1
  179. package/dist/languages/UniversalAnalyzer.d.ts +1 -1
  180. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  181. package/dist/languages/UniversalAnalyzer.js +61 -4
  182. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  183. package/dist/languages/index.d.ts +1 -0
  184. package/dist/languages/index.d.ts.map +1 -1
  185. package/dist/languages/index.js +3 -0
  186. package/dist/languages/index.js.map +1 -1
  187. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
  188. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
  189. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
  190. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
  191. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  192. package/dist/languages/tree-sitter/parser.js +2 -0
  193. package/dist/languages/tree-sitter/parser.js.map +1 -1
  194. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  195. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
  196. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  197. package/dist/ledger.d.ts +128 -0
  198. package/dist/ledger.d.ts.map +1 -0
  199. package/dist/ledger.js +345 -0
  200. package/dist/ledger.js.map +1 -0
  201. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  202. package/dist/mcp-tools/projectTasks.js +9 -14
  203. package/dist/mcp-tools/projectTasks.js.map +1 -1
  204. package/dist/mcp.js +0 -0
  205. package/dist/mcpAuditJobs.d.ts.map +1 -1
  206. package/dist/mcpAuditJobs.js +3 -0
  207. package/dist/mcpAuditJobs.js.map +1 -1
  208. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  209. package/dist/reporting/csvReportGenerator.js +7 -1
  210. package/dist/reporting/csvReportGenerator.js.map +1 -1
  211. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  212. package/dist/reporting/htmlReportGenerator.js +5 -1
  213. package/dist/reporting/htmlReportGenerator.js.map +1 -1
  214. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  215. package/dist/reporting/jsonReportGenerator.js +10 -2
  216. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  217. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  218. package/dist/reporting/sarifReportGenerator.js +17 -17
  219. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  220. package/dist/scripts/runBench.d.ts +94 -0
  221. package/dist/scripts/runBench.d.ts.map +1 -0
  222. package/dist/scripts/runBench.js +1559 -0
  223. package/dist/scripts/runBench.js.map +1 -0
  224. package/dist/search/QueryParser.d.ts.map +1 -1
  225. package/dist/search/QueryParser.js +51 -4
  226. package/dist/search/QueryParser.js.map +1 -1
  227. package/dist/services/CodeMapGenerator.d.ts +33 -0
  228. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  229. package/dist/services/CodeMapGenerator.js +404 -0
  230. package/dist/services/CodeMapGenerator.js.map +1 -1
  231. package/dist/styles/normalizer.d.ts +37 -0
  232. package/dist/styles/normalizer.d.ts.map +1 -0
  233. package/dist/styles/normalizer.js +301 -0
  234. package/dist/styles/normalizer.js.map +1 -0
  235. package/dist/styles/styleExtractor.d.ts +38 -0
  236. package/dist/styles/styleExtractor.d.ts.map +1 -0
  237. package/dist/styles/styleExtractor.js +630 -0
  238. package/dist/styles/styleExtractor.js.map +1 -0
  239. package/dist/styles/styleIndexer.d.ts +35 -0
  240. package/dist/styles/styleIndexer.d.ts.map +1 -0
  241. package/dist/styles/styleIndexer.js +266 -0
  242. package/dist/styles/styleIndexer.js.map +1 -0
  243. package/dist/styles/tailwindConfigLoader.d.ts +38 -0
  244. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
  245. package/dist/styles/tailwindConfigLoader.js +374 -0
  246. package/dist/styles/tailwindConfigLoader.js.map +1 -0
  247. package/dist/styles/tailwindExpander.d.ts +38 -0
  248. package/dist/styles/tailwindExpander.d.ts.map +1 -0
  249. package/dist/styles/tailwindExpander.js +637 -0
  250. package/dist/styles/tailwindExpander.js.map +1 -0
  251. package/dist/styles/types.d.ts +92 -0
  252. package/dist/styles/types.d.ts.map +1 -0
  253. package/dist/styles/types.js +10 -0
  254. package/dist/styles/types.js.map +1 -0
  255. package/dist/symbols.d.ts +21 -0
  256. package/dist/symbols.d.ts.map +1 -0
  257. package/dist/symbols.js +31 -0
  258. package/dist/symbols.js.map +1 -0
  259. package/dist/types.d.ts +326 -3
  260. package/dist/types.d.ts.map +1 -1
  261. package/dist/types.js.map +1 -1
  262. package/package.json +9 -5
  263. package/plugin/.claude-plugin/plugin.json +1 -1
  264. package/plugin/scripts/hook-audit.sh +5 -1
  265. package/plugin/skills/code-auditor/SKILL.md +51 -0
  266. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
  267. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
  268. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
  269. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
  270. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
  271. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
  272. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
  273. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
  274. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
  275. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
  276. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
  277. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
  278. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
  279. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
  280. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
  281. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
  282. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
  283. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
  284. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
  285. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
  286. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
  287. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
  288. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
  289. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
  290. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
  291. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
  292. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
  293. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
  294. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
  295. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
  296. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
  297. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
  298. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
  299. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
  300. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
  301. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
  302. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
  303. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
  304. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
  305. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
  306. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
  307. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
  308. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
  309. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
  310. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
  311. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
  312. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
  313. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
  314. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
  315. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
  316. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
  317. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
  318. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
  319. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
  320. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
  321. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
  322. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
  323. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
  324. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
  325. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
  326. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
  327. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
  328. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
  329. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
  330. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
  331. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
  332. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
  333. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
  334. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
  335. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
  336. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
  337. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
  338. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
  339. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
  340. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
  341. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
  342. package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
  343. package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
  344. package/dist/analyzers/dataAccessAnalyzer.js +0 -474
  345. package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
  346. package/dist/analyzers/dryAnalyzer.d.ts +0 -31
  347. package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
  348. package/dist/analyzers/dryAnalyzer.js +0 -734
  349. package/dist/analyzers/dryAnalyzer.js.map +0 -1
  350. package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
  351. package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
  352. package/dist/analyzers/schemaAnalyzer.js +0 -564
  353. package/dist/analyzers/schemaAnalyzer.js.map +0 -1
  354. package/dist/analyzers/solidAnalyzer.d.ts +0 -33
  355. package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
  356. package/dist/analyzers/solidAnalyzer.js +0 -847
  357. package/dist/analyzers/solidAnalyzer.js.map +0 -1
@@ -0,0 +1,602 @@
1
+ /**
2
+ * Spec 14 R3, R4 — Import Graph, Community Detection, and Martin Metrics
3
+ *
4
+ * Builds a file-level import graph from `function_dependencies`, runs Louvain
5
+ * community detection, computes directory purity vs community structure, and
6
+ * calculates Martin instability/abstractness metrics.
7
+ *
8
+ * IMPORTANT (R4 abstractness gate): The `functions` entity_type column stores
9
+ * only 'function' and 'component' — NOT type/interface declarations. Abstractness (A)
10
+ * is computed from `is_exported` rows using a per-file AST scan for export type/interface
11
+ * declarations. Without this, A = 0 everywhere (dead path).
12
+ *
13
+ * All advisory — zero violations. Reports and annotations only.
14
+ */
15
+ // ── R1 — Import graph construction ──────────────────────────────────────
16
+ /**
17
+ * Build a file-level import graph by aggregating `function_dependencies`
18
+ * joined with `functions.file_path`.
19
+ *
20
+ * Edge weight = count of distinct dependency symbols between a file pair.
21
+ */
22
+ export function buildImportGraph(db) {
23
+ const adjacency = new Map();
24
+ // Collect all files with indexed functions
25
+ const files = db.prepare('SELECT DISTINCT file_path FROM functions').all();
26
+ const filePaths = new Set();
27
+ for (const row of files) {
28
+ filePaths.add(row.file_path);
29
+ }
30
+ // Aggregate import edges: for each function, its dependencies map to
31
+ // the files those dependencies likely resolve to (module/file resolution)
32
+ const rows = db.prepare(`
33
+ SELECT
34
+ f.file_path AS source_file,
35
+ fd.dependency
36
+ FROM function_dependencies fd
37
+ JOIN functions f ON f.id = fd.function_id
38
+ ORDER BY f.file_path, fd.dependency
39
+ `).all();
40
+ // Group by (source_file, dependency) — weight = count of imports
41
+ const edgeWeights = new Map();
42
+ for (const row of rows) {
43
+ if (!edgeWeights.has(row.source_file)) {
44
+ edgeWeights.set(row.source_file, new Map());
45
+ }
46
+ const inner = edgeWeights.get(row.source_file);
47
+ inner.set(row.dependency, (inner.get(row.dependency) ?? 0) + 1);
48
+ }
49
+ // Now resolve each dependency to a file in the project
50
+ // Build a lookup: module name → file path
51
+ const moduleToFile = new Map();
52
+ // First pass: build a dependency → file lookup by matching dependency names
53
+ // against file basenames
54
+ for (const fp of filePaths) {
55
+ const basename = basenameNoExt(fp);
56
+ if (!moduleToFile.has(basename)) {
57
+ moduleToFile.set(basename, new Set());
58
+ }
59
+ moduleToFile.get(basename).add(fp);
60
+ }
61
+ // Second pass: resolve import edges
62
+ for (const [sourceFile, depMap] of edgeWeights) {
63
+ if (!adjacency.has(sourceFile)) {
64
+ adjacency.set(sourceFile, new Map());
65
+ }
66
+ for (const [dep, weight] of depMap) {
67
+ // Try to resolve the dependency to a file
68
+ const targets = resolveDependency(dep, filePaths, moduleToFile, sourceFile);
69
+ for (const target of targets) {
70
+ if (target === sourceFile)
71
+ continue; // Skip self-loops
72
+ if (!adjacency.has(sourceFile)) {
73
+ adjacency.set(sourceFile, new Map());
74
+ }
75
+ const adjMap = adjacency.get(sourceFile);
76
+ adjMap.set(target, (adjMap.get(target) ?? 0) + weight);
77
+ }
78
+ }
79
+ }
80
+ return { adjacency, filePaths };
81
+ }
82
+ function basenameNoExt(fp) {
83
+ const segments = fp.replace(/\\/g, '/').split('/');
84
+ const basename = segments[segments.length - 1];
85
+ const dot = basename.lastIndexOf('.');
86
+ return dot > 0 ? basename.substring(0, dot) : basename;
87
+ }
88
+ /**
89
+ * Resolve a dependency name to a set of file paths.
90
+ *
91
+ * Tries multiple strategies:
92
+ * 1. Exact file path match
93
+ * 2. Module name matching (npm package → search path patterns)
94
+ * 3. Relative import resolution
95
+ * 4. Basename matching
96
+ */
97
+ function resolveDependency(dep, filePaths, moduleToFile, sourceFile) {
98
+ const results = [];
99
+ // Strategy 1: Exact file path match
100
+ if (filePaths.has(dep)) {
101
+ return [dep];
102
+ }
103
+ // Strategy 2: Check if dep is a relative path
104
+ if (dep.startsWith('.') || dep.startsWith('/')) {
105
+ // Resolve relative to source file directory
106
+ const sourceDir = sourceFile.replace(/\\/g, '/').split('/').slice(0, -1).join('/');
107
+ const resolved = normalizePath(sourceDir ? `${sourceDir}/${dep}` : dep);
108
+ // Try with various extensions
109
+ for (const ext of ['', '.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx']) {
110
+ const candidate = resolved + ext;
111
+ if (filePaths.has(candidate)) {
112
+ return [candidate];
113
+ }
114
+ }
115
+ // Partial match: check if any file starts with the resolved path
116
+ for (const fp of filePaths) {
117
+ if (fp.startsWith(resolved + '/') || fp === resolved) {
118
+ results.push(fp);
119
+ }
120
+ }
121
+ return results;
122
+ }
123
+ // Strategy 3: Module name matching — try to find project files with matching
124
+ // directory/package names
125
+ const depParts = dep.split('/');
126
+ const lastName = depParts[depParts.length - 1];
127
+ // Check moduleToFile for the last segment
128
+ const candidates = moduleToFile.get(lastName);
129
+ if (candidates) {
130
+ // Filter: prefer files whose path contains the dep name
131
+ for (const fp of candidates) {
132
+ if (fp.includes('/' + dep + '/') || fp.includes('/' + dep + '.')) {
133
+ results.push(fp);
134
+ }
135
+ }
136
+ // If no strong matches, prefer files not in the source directory
137
+ if (results.length === 0) {
138
+ for (const fp of candidates) {
139
+ results.push(fp);
140
+ }
141
+ }
142
+ return results;
143
+ }
144
+ // Strategy 4: Fuzzy matching — check if dep appears as a file path segment
145
+ for (const fp of filePaths) {
146
+ const segments = fp.replace(/\\/g, '/').split('/');
147
+ if (segments.includes(lastName) || segments.includes(dep)) {
148
+ results.push(fp);
149
+ }
150
+ }
151
+ return results;
152
+ }
153
+ function normalizePath(p) {
154
+ const parts = p.replace(/\\/g, '/').split('/');
155
+ const result = [];
156
+ for (const part of parts) {
157
+ if (part === '..') {
158
+ result.pop();
159
+ }
160
+ else if (part !== '.' && part !== '') {
161
+ result.push(part);
162
+ }
163
+ }
164
+ return result.join('/');
165
+ }
166
+ /**
167
+ * Populate `graph_cache` with import graph edges.
168
+ */
169
+ export function populateImportGraphCache(db) {
170
+ const { adjacency } = buildImportGraph(db);
171
+ const txn = db.transaction(() => {
172
+ db.prepare("DELETE FROM graph_cache WHERE graph_type = 'import'").run();
173
+ const stmt = db.prepare(`INSERT OR REPLACE INTO graph_cache (graph_type, node_key, neighbor_key, weight)
174
+ VALUES ('import', ?, ?, ?)`);
175
+ for (const [sourceFile, neighbors] of adjacency) {
176
+ for (const [targetFile, weight] of neighbors) {
177
+ stmt.run(sourceFile, targetFile, weight);
178
+ }
179
+ }
180
+ });
181
+ txn();
182
+ }
183
+ /**
184
+ * Build an import graph from the persistent `graph_cache` table (fast path).
185
+ */
186
+ export function buildImportGraphFromCache(db) {
187
+ const adjacency = new Map();
188
+ const filePaths = new Set();
189
+ const rows = db.prepare(`SELECT node_key, neighbor_key, weight FROM graph_cache WHERE graph_type = 'import'`).all();
190
+ for (const row of rows) {
191
+ filePaths.add(row.node_key);
192
+ filePaths.add(row.neighbor_key);
193
+ if (!adjacency.has(row.node_key))
194
+ adjacency.set(row.node_key, new Map());
195
+ adjacency.get(row.node_key).set(row.neighbor_key, row.weight);
196
+ }
197
+ return { adjacency, filePaths };
198
+ }
199
+ // ── R3 — Louvain community detection ────────────────────────────────────
200
+ /**
201
+ * Louvain community detection on weighted undirected graph.
202
+ *
203
+ * Standard two-phase algorithm:
204
+ * Phase 1: Greedy modularity optimization (move nodes between communities)
205
+ * Phase 2: Community aggregation (build super-graph)
206
+ * Repeat until modularity gain < threshold.
207
+ */
208
+ export function detectCommunities(adjacency, filePaths) {
209
+ // Convert to undirected weighted graph
210
+ // For each directed edge, add reverse if not present
211
+ const undirected = new Map();
212
+ for (const [src, neighbors] of adjacency) {
213
+ if (!undirected.has(src))
214
+ undirected.set(src, new Map());
215
+ const srcMap = undirected.get(src);
216
+ for (const [dst, weight] of neighbors) {
217
+ srcMap.set(dst, (srcMap.get(dst) ?? 0) + weight);
218
+ // Add reverse edge
219
+ if (!undirected.has(dst))
220
+ undirected.set(dst, new Map());
221
+ const dstMap = undirected.get(dst);
222
+ dstMap.set(src, (dstMap.get(src) ?? 0) + weight);
223
+ }
224
+ }
225
+ const files = [...filePaths];
226
+ const N = files.length;
227
+ if (N === 0) {
228
+ return { communities: new Map(), communityCount: 0, modularity: 0 };
229
+ }
230
+ // Map file → index for fast access
231
+ const fileToIdx = new Map();
232
+ for (let i = 0; i < N; i++) {
233
+ fileToIdx.set(files[i], i);
234
+ }
235
+ // Initialize: each node in its own community
236
+ let communities = new Map();
237
+ for (let i = 0; i < N; i++) {
238
+ communities.set(files[i], i);
239
+ }
240
+ // Compute total edge weight (m) for modularity normalization
241
+ let m2 = 0; // 2 × m (undirected, each edge counted twice)
242
+ for (const [, neighbors] of undirected) {
243
+ for (const weight of neighbors.values()) {
244
+ m2 += weight;
245
+ }
246
+ }
247
+ if (m2 === 0) {
248
+ return { communities, communityCount: N, modularity: 0 };
249
+ }
250
+ // Compute weighted degree for each node
251
+ const weightedDegree = new Map();
252
+ for (const [node, neighbors] of undirected) {
253
+ let deg = 0;
254
+ for (const w of neighbors.values())
255
+ deg += w;
256
+ weightedDegree.set(node, deg);
257
+ }
258
+ const MODULARITY_THRESHOLD = 1e-5;
259
+ let currentModularity = computeModularity(undirected, communities, m2, weightedDegree);
260
+ let improved = true;
261
+ // Louvain iteration
262
+ while (improved) {
263
+ improved = false;
264
+ // Phase 1: Move nodes between communities
265
+ let phaseImproved = true;
266
+ while (phaseImproved) {
267
+ phaseImproved = false;
268
+ for (const node of files) {
269
+ const nodeComm = communities.get(node);
270
+ // Compute best community for this node
271
+ const neighborComms = new Map(); // commId → edgeWeightSum
272
+ const nodeNeighbors = undirected.get(node);
273
+ if (nodeNeighbors) {
274
+ for (const [neighbor, weight] of nodeNeighbors) {
275
+ const neighborComm = communities.get(neighbor);
276
+ if (neighborComm !== undefined) {
277
+ neighborComms.set(neighborComm, (neighborComms.get(neighborComm) ?? 0) + weight);
278
+ }
279
+ }
280
+ }
281
+ // Compute current modularity contribution of node to its community
282
+ const ki = weightedDegree.get(node) ?? 0;
283
+ // Total weight of edges from node to community
284
+ const toSelf = neighborComms.get(nodeComm) ?? 0;
285
+ // Compute sigma_tot for current community
286
+ let sigmaTotCurrent = 0;
287
+ for (const [n, comm] of communities) {
288
+ if (comm === nodeComm && n !== node) {
289
+ sigmaTotCurrent += weightedDegree.get(n) ?? 0;
290
+ }
291
+ }
292
+ // Remove node from its community and check gain
293
+ let bestComm = nodeComm;
294
+ let bestGain = 0;
295
+ for (const [comm, kiIn] of neighborComms) {
296
+ if (comm === nodeComm)
297
+ continue;
298
+ // Compute sigma_tot for candidate community
299
+ let sigmaTotComm = 0;
300
+ for (const [n, c] of communities) {
301
+ if (c === comm) {
302
+ sigmaTotComm += weightedDegree.get(n) ?? 0;
303
+ }
304
+ }
305
+ // Modularity gain of moving node to comm
306
+ const gain = (kiIn / (m2 / 2)) -
307
+ ((sigmaTotComm * ki) / (m2 * m2 / 4)) -
308
+ (toSelf / (m2 / 2)) +
309
+ ((sigmaTotCurrent * ki) / (m2 * m2 / 4));
310
+ if (gain > bestGain) {
311
+ bestGain = gain;
312
+ bestComm = comm;
313
+ }
314
+ }
315
+ if (bestComm !== nodeComm) {
316
+ communities.set(node, bestComm);
317
+ phaseImproved = true;
318
+ improved = true;
319
+ }
320
+ }
321
+ }
322
+ // Phase 2: Aggregate communities into super-graph
323
+ // Count communities
324
+ const commSet = new Set(communities.values());
325
+ const newCommCount = commSet.size;
326
+ // Map old comm → new index
327
+ const commToNew = new Map();
328
+ let idx = 0;
329
+ for (const c of commSet) {
330
+ commToNew.set(c, idx++);
331
+ }
332
+ // Build super-graph adjacency
333
+ const superAdj = new Map();
334
+ for (const [node, neighbors] of undirected) {
335
+ const srcComm = commToNew.get(communities.get(node));
336
+ const srcKey = String(srcComm);
337
+ if (!superAdj.has(srcKey))
338
+ superAdj.set(srcKey, new Map());
339
+ for (const [neighbor, weight] of neighbors) {
340
+ const dstComm = commToNew.get(communities.get(neighbor));
341
+ if (dstComm === undefined)
342
+ continue;
343
+ const dstKey = String(dstComm);
344
+ if (srcKey === dstKey)
345
+ continue; // Self-loop
346
+ const inner = superAdj.get(srcKey);
347
+ inner.set(dstKey, (inner.get(dstKey) ?? 0) + weight);
348
+ }
349
+ }
350
+ // If no aggregation happened (communities stayed same), break
351
+ if (newCommCount === N)
352
+ break;
353
+ // Update for next iteration: remap communities
354
+ const newCommunities = new Map();
355
+ for (const node of files) {
356
+ newCommunities.set(node, commToNew.get(communities.get(node)));
357
+ }
358
+ communities = newCommunities;
359
+ // Recompute modularity
360
+ const newModularity = computeModularity(undirected, communities, m2, weightedDegree);
361
+ if (newModularity - currentModularity < MODULARITY_THRESHOLD) {
362
+ break;
363
+ }
364
+ currentModularity = newModularity;
365
+ }
366
+ return {
367
+ communities,
368
+ communityCount: new Set(communities.values()).size,
369
+ modularity: currentModularity,
370
+ };
371
+ }
372
+ /**
373
+ * Compute modularity Q for a given community assignment.
374
+ */
375
+ function computeModularity(adjacency, communities, m2, weightedDegree) {
376
+ let Q = 0;
377
+ for (const [node, neighbors] of adjacency) {
378
+ const commI = communities.get(node);
379
+ if (commI === undefined)
380
+ continue;
381
+ const ki = weightedDegree.get(node) ?? 0;
382
+ for (const [neighbor, weight] of neighbors) {
383
+ const commJ = communities.get(neighbor);
384
+ if (commJ === undefined)
385
+ continue;
386
+ if (commI === commJ) {
387
+ const kj = weightedDegree.get(neighbor) ?? 0;
388
+ Q += weight - (ki * kj) / m2;
389
+ }
390
+ }
391
+ }
392
+ return Q / m2;
393
+ }
394
+ // ── R3 — Directory purity ───────────────────────────────────────────────
395
+ const COMMUNITY_MIN_FILES = 5;
396
+ /**
397
+ * Compute directory purity against detected communities.
398
+ *
399
+ * For each directory, compute: share of its files in the plurality community.
400
+ * Detects split candidates (directories spanning ≥2 communities) and
401
+ * merge candidates (one community dominating ≥2 directories).
402
+ */
403
+ export function computeDirectoryPurity(communities, filePaths) {
404
+ // Group files by directory
405
+ const dirFiles = new Map();
406
+ for (const fp of filePaths) {
407
+ const dir = dirname(fp);
408
+ if (!dirFiles.has(dir))
409
+ dirFiles.set(dir, []);
410
+ dirFiles.get(dir).push(fp);
411
+ }
412
+ const directoryPurities = [];
413
+ const splitCandidates = [];
414
+ const mergeCandidates = [];
415
+ // Per-directory purity
416
+ for (const [dir, files] of dirFiles) {
417
+ if (files.length === 0)
418
+ continue;
419
+ const commCounts = new Map();
420
+ for (const fp of files) {
421
+ const comm = communities.get(fp);
422
+ if (comm !== undefined) {
423
+ commCounts.set(comm, (commCounts.get(comm) ?? 0) + 1);
424
+ }
425
+ }
426
+ if (commCounts.size === 0)
427
+ continue;
428
+ // Find plurality community
429
+ let pluralityComm = -1;
430
+ let pluralityCount = 0;
431
+ for (const [comm, count] of commCounts) {
432
+ if (count > pluralityCount) {
433
+ pluralityCount = count;
434
+ pluralityComm = comm;
435
+ }
436
+ }
437
+ const purity = pluralityCount / files.length;
438
+ directoryPurities.push({
439
+ directory: dir,
440
+ totalFiles: files.length,
441
+ pluralityCommunity: pluralityComm,
442
+ pluralityCount,
443
+ purity,
444
+ });
445
+ // Split candidate: directory spanning ≥2 communities with ≥COMMUNITY_MIN_FILES each
446
+ const significantComms = [];
447
+ for (const [comm, count] of commCounts) {
448
+ if (count >= COMMUNITY_MIN_FILES && comm !== pluralityComm) {
449
+ significantComms.push({ comm, count });
450
+ }
451
+ }
452
+ if (significantComms.length >= 1 && pluralityCount >= COMMUNITY_MIN_FILES) {
453
+ splitCandidates.push({
454
+ directory: dir,
455
+ communities: [pluralityComm, ...significantComms.map(s => s.comm)],
456
+ fileCounts: [pluralityCount, ...significantComms.map(s => s.count)],
457
+ });
458
+ }
459
+ }
460
+ // Merge candidates: one community dominating ≥2 directories
461
+ const commToDirs = new Map();
462
+ for (const dp of directoryPurities) {
463
+ const comm = dp.pluralityCommunity;
464
+ if (!commToDirs.has(comm))
465
+ commToDirs.set(comm, []);
466
+ commToDirs.get(comm).push({ dir: dp.directory, count: dp.pluralityCount });
467
+ }
468
+ for (const [, entries] of commToDirs) {
469
+ if (entries.length >= 2) {
470
+ const dirs = entries.map(e => e.dir);
471
+ const maxCount = Math.max(...entries.map(e => e.count));
472
+ mergeCandidates.push({
473
+ directories: dirs,
474
+ community: directoryPurities.find(dp => dp.directory === dirs[0]).pluralityCommunity,
475
+ fileCount: maxCount,
476
+ });
477
+ }
478
+ }
479
+ // Agreement score: mean purity weighted by directory file count
480
+ let totalWeightedPurity = 0;
481
+ let totalFiles = 0;
482
+ for (const dp of directoryPurities) {
483
+ totalWeightedPurity += dp.purity * dp.totalFiles;
484
+ totalFiles += dp.totalFiles;
485
+ }
486
+ const agreementScore = totalFiles > 0 ? totalWeightedPurity / totalFiles : 0;
487
+ return { directoryPurities, splitCandidates, mergeCandidates, agreementScore };
488
+ }
489
+ function dirname(fp) {
490
+ const parts = fp.replace(/\\/g, '/').split('/');
491
+ parts.pop();
492
+ return parts.join('/');
493
+ }
494
+ // ── R4 — Martin instability & abstractness metrics ──────────────────────
495
+ /**
496
+ * Compute Martin metrics per directory (treated as package).
497
+ *
498
+ * Ce = efferent couplings: distinct directories this directory imports from
499
+ * Ca = afferent couplings: distinct directories that import this directory
500
+ * I = Ce / (Ca + Ce) — instability (0 if both zero)
501
+ * A = abstractness: exported type/interface declarations ÷ total exported symbols
502
+ * D = |A + I − 1| — distance from main sequence
503
+ *
504
+ * IMPORTANT: Abstractness computation uses an AST scan for export type/interface
505
+ * declarations because the `functions` table does not index type/interface entities.
506
+ * Uses a lightweight file-content scan.
507
+ */
508
+ export function computeMartinMetrics(db, importGraph) {
509
+ // Collect all directories from filePaths
510
+ const dirSet = new Set();
511
+ for (const fp of importGraph.filePaths) {
512
+ dirSet.add(dirname(fp));
513
+ }
514
+ const directories = [...dirSet];
515
+ // Build directory-level adjacency: dir → Set<imported dir>
516
+ const dirImports = new Map();
517
+ for (const [srcFile, neighbors] of importGraph.adjacency) {
518
+ const srcDir = dirname(srcFile);
519
+ if (!dirImports.has(srcDir))
520
+ dirImports.set(srcDir, new Set());
521
+ for (const dstFile of neighbors.keys()) {
522
+ const dstDir = dirname(dstFile);
523
+ if (dstDir !== srcDir) {
524
+ dirImports.get(srcDir).add(dstDir);
525
+ }
526
+ }
527
+ }
528
+ // Compute Ca (reverse: who imports each directory)
529
+ const dirImportedBy = new Map();
530
+ for (const [srcDir, importedDirs] of dirImports) {
531
+ for (const dstDir of importedDirs) {
532
+ if (!dirImportedBy.has(dstDir))
533
+ dirImportedBy.set(dstDir, new Set());
534
+ dirImportedBy.get(dstDir).add(srcDir);
535
+ }
536
+ }
537
+ // Count exported symbols per directory: total exported functions + type/interface declarations
538
+ // For abstractness: count type/interface declarations from file-content scan
539
+ const dirExported = new Map();
540
+ const dirAbstract = new Map();
541
+ // Get all exported function counts from DB
542
+ const exportedRows = db.prepare('SELECT file_path, COUNT(*) as cnt FROM functions WHERE is_exported = 1 GROUP BY file_path').all();
543
+ for (const row of exportedRows) {
544
+ const dir = dirname(row.file_path);
545
+ dirExported.set(dir, (dirExported.get(dir) ?? 0) + row.cnt);
546
+ }
547
+ // Scan for exported type/interface declarations per directory
548
+ // This is a lightweight content-based scan since entity_type doesn't include type/interface
549
+ const filePaths = [...importGraph.filePaths];
550
+ const filesPerDir = new Map();
551
+ for (const fp of filePaths) {
552
+ const dir = dirname(fp);
553
+ if (!filesPerDir.has(dir))
554
+ filesPerDir.set(dir, []);
555
+ filesPerDir.get(dir).push(fp);
556
+ }
557
+ for (const [dir, files] of filesPerDir) {
558
+ let abstractCount = 0;
559
+ for (const fp of files) {
560
+ try {
561
+ const content = require('fs').readFileSync(fp, 'utf-8');
562
+ // Count exported type/interface declarations
563
+ const typeMatches = content.match(/export\s+(type|interface)\s+\w+/g);
564
+ if (typeMatches) {
565
+ abstractCount += typeMatches.length;
566
+ }
567
+ }
568
+ catch {
569
+ // Skip unreadable files
570
+ }
571
+ }
572
+ dirAbstract.set(dir, abstractCount);
573
+ }
574
+ // Build Martin entries
575
+ const entries = [];
576
+ for (const dir of directories) {
577
+ const imports = dirImports.get(dir);
578
+ const importedBy = dirImportedBy.get(dir);
579
+ const ce = imports?.size ?? 0;
580
+ const ca = importedBy?.size ?? 0;
581
+ const i = ca + ce > 0 ? ce / (ca + ce) : 0;
582
+ const totalExported = dirExported.get(dir) ?? 0;
583
+ const abstractCount = dirAbstract.get(dir) ?? 0;
584
+ // A = exported abstract entities / total exported symbols
585
+ const a = totalExported + abstractCount > 0
586
+ ? abstractCount / (totalExported + abstractCount)
587
+ : 0;
588
+ const d = Math.abs(a + i - 1);
589
+ entries.push({
590
+ directory: dir,
591
+ ce,
592
+ ca,
593
+ instability: i,
594
+ abstractness: a,
595
+ distanceFromMain: d,
596
+ });
597
+ }
598
+ // Sort by distance from main sequence descending
599
+ entries.sort((a, b) => b.distanceFromMain - a.distanceFromMain);
600
+ return entries;
601
+ }
602
+ //# sourceMappingURL=importGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importGraph.js","sourceRoot":"","sources":["../../src/graph/importGraph.ts"],"names":[],"mappings":"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"}