code-auditor-mcp 3.1.0 → 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 (360) 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 -4
  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 -5
  25. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  26. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  27. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +0 -3
  28. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  29. package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
  30. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  31. package/dist/analyzers/cross-language/SchemaValidator.js +2 -5
  32. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  33. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
  34. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
  35. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
  36. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
  37. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  38. package/dist/analyzers/documentationAnalyzer.js +8 -4
  39. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  40. package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
  41. package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
  42. package/dist/analyzers/orm/adapterRegistry.js +73 -0
  43. package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
  44. package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
  45. package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
  46. package/dist/analyzers/orm/drizzleAdapter.js +166 -0
  47. package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
  48. package/dist/analyzers/orm/index.d.ts +14 -0
  49. package/dist/analyzers/orm/index.d.ts.map +1 -0
  50. package/dist/analyzers/orm/index.js +24 -0
  51. package/dist/analyzers/orm/index.js.map +1 -0
  52. package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
  53. package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
  54. package/dist/analyzers/orm/prismaAdapter.js +170 -0
  55. package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
  56. package/dist/analyzers/orm/types.d.ts +63 -0
  57. package/dist/analyzers/orm/types.d.ts.map +1 -0
  58. package/dist/analyzers/orm/types.js +10 -0
  59. package/dist/analyzers/orm/types.js.map +1 -0
  60. package/dist/analyzers/provenance.d.ts +133 -0
  61. package/dist/analyzers/provenance.d.ts.map +1 -0
  62. package/dist/analyzers/provenance.js +1041 -0
  63. package/dist/analyzers/provenance.js.map +1 -0
  64. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  65. package/dist/analyzers/reactAnalyzer.js +117 -1
  66. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  67. package/dist/analyzers/ruleRegistry.d.ts +38 -0
  68. package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
  69. package/dist/analyzers/ruleRegistry.js +123 -0
  70. package/dist/analyzers/ruleRegistry.js.map +1 -0
  71. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
  72. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
  73. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
  74. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
  75. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
  76. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  77. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
  78. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  79. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
  80. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  81. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -103
  82. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  83. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  84. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
  85. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  86. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  87. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
  88. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  89. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
  90. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  91. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
  92. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  93. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
  94. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
  95. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
  96. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
  97. package/dist/auditRunner.d.ts.map +1 -1
  98. package/dist/auditRunner.js +483 -3
  99. package/dist/auditRunner.js.map +1 -1
  100. package/dist/baseline.d.ts +98 -0
  101. package/dist/baseline.d.ts.map +1 -0
  102. package/dist/baseline.js +184 -0
  103. package/dist/baseline.js.map +1 -0
  104. package/dist/churn/churnExtractor.d.ts +32 -0
  105. package/dist/churn/churnExtractor.d.ts.map +1 -0
  106. package/dist/churn/churnExtractor.js +261 -0
  107. package/dist/churn/churnExtractor.js.map +1 -0
  108. package/dist/cli.js +1215 -11
  109. package/dist/cli.js.map +1 -1
  110. package/dist/codeIndexDB-enhanced.js +1 -1
  111. package/dist/codeIndexDB-enhanced.js.map +1 -1
  112. package/dist/codeIndexDB.d.ts +101 -0
  113. package/dist/codeIndexDB.d.ts.map +1 -1
  114. package/dist/codeIndexDB.js +661 -5
  115. package/dist/codeIndexDB.js.map +1 -1
  116. package/dist/config/configLoader.d.ts.map +1 -1
  117. package/dist/config/configLoader.js +95 -1
  118. package/dist/config/configLoader.js.map +1 -1
  119. package/dist/config/defaults.d.ts +72 -1
  120. package/dist/config/defaults.d.ts.map +1 -1
  121. package/dist/config/defaults.js +146 -15
  122. package/dist/config/defaults.js.map +1 -1
  123. package/dist/config/pathProfiles.d.ts +38 -0
  124. package/dist/config/pathProfiles.d.ts.map +1 -0
  125. package/dist/config/pathProfiles.js +47 -0
  126. package/dist/config/pathProfiles.js.map +1 -0
  127. package/dist/conventions/conventionMiner.d.ts +63 -0
  128. package/dist/conventions/conventionMiner.d.ts.map +1 -0
  129. package/dist/conventions/conventionMiner.js +696 -0
  130. package/dist/conventions/conventionMiner.js.map +1 -0
  131. package/dist/coverage/coverageService.d.ts +49 -0
  132. package/dist/coverage/coverageService.d.ts.map +1 -0
  133. package/dist/coverage/coverageService.js +117 -0
  134. package/dist/coverage/coverageService.js.map +1 -0
  135. package/dist/coverage/istanbulParser.d.ts +84 -0
  136. package/dist/coverage/istanbulParser.d.ts.map +1 -0
  137. package/dist/coverage/istanbulParser.js +120 -0
  138. package/dist/coverage/istanbulParser.js.map +1 -0
  139. package/dist/coverage/lcovParser.d.ts +40 -0
  140. package/dist/coverage/lcovParser.d.ts.map +1 -0
  141. package/dist/coverage/lcovParser.js +168 -0
  142. package/dist/coverage/lcovParser.js.map +1 -0
  143. package/dist/fingerprint.d.ts +17 -0
  144. package/dist/fingerprint.d.ts.map +1 -1
  145. package/dist/fingerprint.js +42 -0
  146. package/dist/fingerprint.js.map +1 -1
  147. package/dist/grammars/tree-sitter-css.wasm +0 -0
  148. package/dist/graph/blastRadius.d.ts +27 -0
  149. package/dist/graph/blastRadius.d.ts.map +1 -0
  150. package/dist/graph/blastRadius.js +150 -0
  151. package/dist/graph/blastRadius.js.map +1 -0
  152. package/dist/graph/callGraph.d.ts +78 -0
  153. package/dist/graph/callGraph.d.ts.map +1 -0
  154. package/dist/graph/callGraph.js +484 -0
  155. package/dist/graph/callGraph.js.map +1 -0
  156. package/dist/graph/importGraph.d.ts +91 -0
  157. package/dist/graph/importGraph.d.ts.map +1 -0
  158. package/dist/graph/importGraph.js +602 -0
  159. package/dist/graph/importGraph.js.map +1 -0
  160. package/dist/graph/outputFormatter.d.ts +55 -0
  161. package/dist/graph/outputFormatter.d.ts.map +1 -0
  162. package/dist/graph/outputFormatter.js +283 -0
  163. package/dist/graph/outputFormatter.js.map +1 -0
  164. package/dist/hooks/codex.d.ts +36 -1
  165. package/dist/hooks/codex.d.ts.map +1 -1
  166. package/dist/hooks/codex.js +88 -54
  167. package/dist/hooks/codex.js.map +1 -1
  168. package/dist/hotspots/hotspotScorer.d.ts +20 -0
  169. package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
  170. package/dist/hotspots/hotspotScorer.js +202 -0
  171. package/dist/hotspots/hotspotScorer.js.map +1 -0
  172. package/dist/invariants/invariant-rules.schema.json +42 -1
  173. package/dist/invariants/ruleEngine.d.ts +4 -1
  174. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  175. package/dist/invariants/ruleEngine.js +141 -5
  176. package/dist/invariants/ruleEngine.js.map +1 -1
  177. package/dist/invariants/ruleValidator.d.ts.map +1 -1
  178. package/dist/invariants/ruleValidator.js +62 -1
  179. package/dist/invariants/ruleValidator.js.map +1 -1
  180. package/dist/invariants/types.d.ts +23 -2
  181. package/dist/invariants/types.d.ts.map +1 -1
  182. package/dist/languages/UniversalAnalyzer.d.ts +1 -1
  183. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  184. package/dist/languages/UniversalAnalyzer.js +59 -24
  185. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  186. package/dist/languages/index.d.ts +1 -0
  187. package/dist/languages/index.d.ts.map +1 -1
  188. package/dist/languages/index.js +3 -0
  189. package/dist/languages/index.js.map +1 -1
  190. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
  191. package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
  192. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
  193. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
  194. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  195. package/dist/languages/tree-sitter/parser.js +2 -0
  196. package/dist/languages/tree-sitter/parser.js.map +1 -1
  197. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  198. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
  199. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  200. package/dist/ledger.d.ts +128 -0
  201. package/dist/ledger.d.ts.map +1 -0
  202. package/dist/ledger.js +345 -0
  203. package/dist/ledger.js.map +1 -0
  204. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  205. package/dist/mcp-tools/projectTasks.js +9 -14
  206. package/dist/mcp-tools/projectTasks.js.map +1 -1
  207. package/dist/mcp.js +0 -0
  208. package/dist/mcpAuditJobs.d.ts.map +1 -1
  209. package/dist/mcpAuditJobs.js +3 -0
  210. package/dist/mcpAuditJobs.js.map +1 -1
  211. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  212. package/dist/reporting/csvReportGenerator.js +7 -1
  213. package/dist/reporting/csvReportGenerator.js.map +1 -1
  214. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  215. package/dist/reporting/htmlReportGenerator.js +5 -1
  216. package/dist/reporting/htmlReportGenerator.js.map +1 -1
  217. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  218. package/dist/reporting/jsonReportGenerator.js +10 -2
  219. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  220. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  221. package/dist/reporting/sarifReportGenerator.js +17 -17
  222. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  223. package/dist/scripts/runBench.d.ts +94 -0
  224. package/dist/scripts/runBench.d.ts.map +1 -0
  225. package/dist/scripts/runBench.js +1559 -0
  226. package/dist/scripts/runBench.js.map +1 -0
  227. package/dist/search/QueryParser.d.ts.map +1 -1
  228. package/dist/search/QueryParser.js +51 -4
  229. package/dist/search/QueryParser.js.map +1 -1
  230. package/dist/services/CodeMapGenerator.d.ts +33 -0
  231. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  232. package/dist/services/CodeMapGenerator.js +404 -0
  233. package/dist/services/CodeMapGenerator.js.map +1 -1
  234. package/dist/styles/normalizer.d.ts +37 -0
  235. package/dist/styles/normalizer.d.ts.map +1 -0
  236. package/dist/styles/normalizer.js +301 -0
  237. package/dist/styles/normalizer.js.map +1 -0
  238. package/dist/styles/styleExtractor.d.ts +38 -0
  239. package/dist/styles/styleExtractor.d.ts.map +1 -0
  240. package/dist/styles/styleExtractor.js +630 -0
  241. package/dist/styles/styleExtractor.js.map +1 -0
  242. package/dist/styles/styleIndexer.d.ts +35 -0
  243. package/dist/styles/styleIndexer.d.ts.map +1 -0
  244. package/dist/styles/styleIndexer.js +266 -0
  245. package/dist/styles/styleIndexer.js.map +1 -0
  246. package/dist/styles/tailwindConfigLoader.d.ts +38 -0
  247. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
  248. package/dist/styles/tailwindConfigLoader.js +374 -0
  249. package/dist/styles/tailwindConfigLoader.js.map +1 -0
  250. package/dist/styles/tailwindExpander.d.ts +38 -0
  251. package/dist/styles/tailwindExpander.d.ts.map +1 -0
  252. package/dist/styles/tailwindExpander.js +637 -0
  253. package/dist/styles/tailwindExpander.js.map +1 -0
  254. package/dist/styles/types.d.ts +92 -0
  255. package/dist/styles/types.d.ts.map +1 -0
  256. package/dist/styles/types.js +10 -0
  257. package/dist/styles/types.js.map +1 -0
  258. package/dist/symbols.d.ts +21 -0
  259. package/dist/symbols.d.ts.map +1 -0
  260. package/dist/symbols.js +31 -0
  261. package/dist/symbols.js.map +1 -0
  262. package/dist/types.d.ts +326 -3
  263. package/dist/types.d.ts.map +1 -1
  264. package/dist/types.js.map +1 -1
  265. package/package.json +9 -5
  266. package/plugin/.claude-plugin/plugin.json +1 -1
  267. package/plugin/scripts/hook-audit.sh +5 -1
  268. package/plugin/skills/code-auditor/SKILL.md +51 -0
  269. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
  270. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
  271. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
  272. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
  273. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
  274. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
  275. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
  276. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
  277. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
  278. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
  279. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
  280. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
  281. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
  282. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
  283. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
  284. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
  285. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
  286. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
  287. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
  288. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
  289. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
  290. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
  291. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
  292. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
  293. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
  294. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
  295. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
  296. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
  297. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
  298. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
  299. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
  300. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
  301. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
  302. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
  303. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
  304. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
  305. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
  306. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
  307. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
  308. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
  309. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
  310. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
  311. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
  312. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
  313. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
  314. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
  315. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
  316. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
  317. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
  318. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
  319. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
  320. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
  321. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
  322. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
  323. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
  324. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
  325. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
  326. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
  327. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
  328. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
  329. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
  330. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
  331. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
  332. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
  333. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
  334. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
  335. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
  336. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
  337. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
  338. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
  339. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
  340. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
  341. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
  342. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
  343. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
  344. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
  345. package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
  346. package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
  347. package/dist/analyzers/dataAccessAnalyzer.js +0 -474
  348. package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
  349. package/dist/analyzers/dryAnalyzer.d.ts +0 -31
  350. package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
  351. package/dist/analyzers/dryAnalyzer.js +0 -734
  352. package/dist/analyzers/dryAnalyzer.js.map +0 -1
  353. package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
  354. package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
  355. package/dist/analyzers/schemaAnalyzer.js +0 -564
  356. package/dist/analyzers/schemaAnalyzer.js.map +0 -1
  357. package/dist/analyzers/solidAnalyzer.d.ts +0 -33
  358. package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
  359. package/dist/analyzers/solidAnalyzer.js +0 -847
  360. package/dist/analyzers/solidAnalyzer.js.map +0 -1
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Universal Conventions Analyzer — Spec 12 R2.
3
+ *
4
+ * Reads mined conventions from the SQLite conventions table and flags
5
+ * deviations at suggestion severity. All detection is cross-file (DB-based);
6
+ * no per-AST processing is needed.
7
+ *
8
+ * Five rule IDs:
9
+ * conventions/usage-pair — missing co-occurring function calls
10
+ * conventions/import-form — minority import style
11
+ * conventions/error-handling — wrong error-handling shape
12
+ * conventions/export-shape — minority export style
13
+ * conventions/naming — wrong casing convention
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
18
+ import { CodeIndexDB } from '../../codeIndexDB.js';
19
+ import { detectCase, detectErrorHandlingShape, detectExportForm, parseFileImports, hasNonLatinChars, } from '../../conventions/conventionMiner.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Default configuration
22
+ // ---------------------------------------------------------------------------
23
+ export const DEFAULT_CONVENTIONS_CONFIG = {
24
+ minCorpus: 20,
25
+ pairConfidence: 0.9,
26
+ modeShare: 0.8,
27
+ maxConventionsPerDomain: 200,
28
+ };
29
+ // ---------------------------------------------------------------------------
30
+ // Analyzer
31
+ // ---------------------------------------------------------------------------
32
+ export class UniversalConventionsAnalyzer extends UniversalAnalyzer {
33
+ name = 'conventions';
34
+ description = 'Mines codebase conventions and flags deviations at suggestion severity';
35
+ category = 'style';
36
+ /**
37
+ * Full override: query conventions from the DB and emit violations per domain.
38
+ * The base-class per-file AST loop is bypassed.
39
+ */
40
+ async analyze(files, config = {}, options = {}) {
41
+ const startTime = Date.now();
42
+ const violations = [];
43
+ let rawDb = null;
44
+ try {
45
+ const db = CodeIndexDB.getInstance();
46
+ await db.initialize();
47
+ rawDb = db.rawDb;
48
+ }
49
+ catch {
50
+ return {
51
+ violations: [],
52
+ errors: [{ file: '', error: 'Failed to open code index database' }],
53
+ filesProcessed: 0,
54
+ executionTime: Date.now() - startTime,
55
+ metrics: { filesAnalyzed: 0, totalViolations: 0, executionTime: Date.now() - startTime },
56
+ };
57
+ }
58
+ if (!rawDb) {
59
+ return {
60
+ violations: [],
61
+ errors: [],
62
+ filesProcessed: 0,
63
+ executionTime: Date.now() - startTime,
64
+ metrics: { filesAnalyzed: 0, totalViolations: 0, executionTime: Date.now() - startTime },
65
+ };
66
+ }
67
+ // Query all conventions
68
+ const conventions = rawDb
69
+ .prepare('SELECT * FROM conventions ORDER BY domain, directory')
70
+ .all();
71
+ if (conventions.length === 0) {
72
+ return {
73
+ violations: [],
74
+ errors: [],
75
+ filesProcessed: files.length,
76
+ executionTime: Date.now() - startTime,
77
+ metrics: { filesAnalyzed: files.length, totalViolations: 0, executionTime: Date.now() - startTime },
78
+ };
79
+ }
80
+ // Extract project root from config
81
+ const projectRoot = config.projectRoot;
82
+ // Group conventions by domain for efficient detection
83
+ const byDomain = new Map();
84
+ for (const c of conventions) {
85
+ const list = byDomain.get(c.domain) ?? [];
86
+ list.push(c);
87
+ byDomain.set(c.domain, list);
88
+ }
89
+ // Detect violations per domain
90
+ for (const [domain, domainConventions] of byDomain) {
91
+ switch (domain) {
92
+ case 'usage-pair':
93
+ violations.push(...this.detectUsagePairViolations(rawDb, domainConventions));
94
+ break;
95
+ case 'import-form':
96
+ violations.push(...this.detectImportFormViolations(rawDb, domainConventions, projectRoot));
97
+ break;
98
+ case 'error-handling':
99
+ violations.push(...this.detectErrorHandlingViolations(rawDb, domainConventions));
100
+ break;
101
+ case 'export-shape':
102
+ violations.push(...this.detectExportShapeViolations(rawDb, domainConventions, projectRoot));
103
+ break;
104
+ case 'naming':
105
+ violations.push(...this.detectNamingViolations(rawDb, domainConventions));
106
+ break;
107
+ }
108
+ }
109
+ return {
110
+ violations,
111
+ errors: [],
112
+ filesProcessed: files.length,
113
+ executionTime: Date.now() - startTime,
114
+ metrics: {
115
+ filesAnalyzed: files.length,
116
+ totalViolations: violations.length,
117
+ executionTime: Date.now() - startTime,
118
+ },
119
+ };
120
+ }
121
+ /** No-op — all detection is DB-based. */
122
+ async analyzeAST() {
123
+ return [];
124
+ }
125
+ // ── Usage-Pair Detection ──────────────────────────────────────────────
126
+ /**
127
+ * For each usage-pair convention (antecedent → consequent), find functions
128
+ * that call the antecedent but NOT the consequent.
129
+ */
130
+ detectUsagePairViolations(rawDb, conventions) {
131
+ const violations = [];
132
+ // Query all function calls once
133
+ const allCalls = rawDb
134
+ .prepare('SELECT caller_id, callee_name FROM function_calls')
135
+ .all();
136
+ // Build callerId → Set<calleeName>
137
+ const callerCalls = new Map();
138
+ for (const fc of allCalls) {
139
+ if (!callerCalls.has(fc.caller_id))
140
+ callerCalls.set(fc.caller_id, new Set());
141
+ callerCalls.get(fc.caller_id).add(fc.callee_name);
142
+ }
143
+ // antecedentName → Set<callerId>
144
+ const antecedentCallers = new Map();
145
+ for (const fc of allCalls) {
146
+ if (!antecedentCallers.has(fc.callee_name)) {
147
+ antecedentCallers.set(fc.callee_name, new Set());
148
+ }
149
+ antecedentCallers.get(fc.callee_name).add(fc.caller_id);
150
+ }
151
+ // Query all functions for file/line info
152
+ const funcRows = rawDb
153
+ .prepare('SELECT id, name, file_path, line_number FROM functions')
154
+ .all();
155
+ const funcById = new Map();
156
+ for (const f of funcRows) {
157
+ funcById.set(f.id, f);
158
+ }
159
+ for (const conv of conventions) {
160
+ if (!conv.antecedent || !conv.consequent)
161
+ continue;
162
+ const antecedent = conv.antecedent;
163
+ const consequent = conv.consequent;
164
+ const callerIds = antecedentCallers.get(antecedent);
165
+ if (!callerIds || callerIds.size === 0)
166
+ continue;
167
+ for (const cid of callerIds) {
168
+ const callSet = callerCalls.get(cid);
169
+ if (!callSet || !callSet.has(consequent)) {
170
+ const func = funcById.get(cid);
171
+ if (!func)
172
+ continue;
173
+ const exemplarRef = conv.exemplar_file
174
+ ? ` (exemplar: ${conv.exemplar_file}${conv.exemplar_line ? `:${conv.exemplar_line}` : ''})`
175
+ : '';
176
+ const pct = Math.round(conv.confidence * 100);
177
+ violations.push({
178
+ file: func.file_path,
179
+ line: func.line_number,
180
+ column: 1,
181
+ severity: 'suggestion',
182
+ message: `${pct}% of \`${antecedent}\` callers also call \`${consequent}\` — ` +
183
+ `this function calls \`${antecedent}\` without \`${consequent}\`${exemplarRef}`,
184
+ rule: 'conventions/usage-pair',
185
+ analyzer: this.name,
186
+ functionName: func.name,
187
+ });
188
+ }
189
+ }
190
+ }
191
+ return violations;
192
+ }
193
+ // ── Import-Form Detection ─────────────────────────────────────────────
194
+ /**
195
+ * For each import-form convention (source → dominantForm in directory),
196
+ * find imports of that source that use a minority form.
197
+ */
198
+ detectImportFormViolations(rawDb, conventions, projectRoot) {
199
+ const violations = [];
200
+ // Use directory-key → Map<source, ImportConv>
201
+ const dirImports = new Map();
202
+ for (const conv of conventions) {
203
+ const dir = conv.directory ?? '.';
204
+ const source = conv.antecedent;
205
+ if (!source)
206
+ continue;
207
+ const form = conv.consequent;
208
+ if (!form)
209
+ continue;
210
+ if (!dirImports.has(dir))
211
+ dirImports.set(dir, new Map());
212
+ dirImports.get(dir).set(source, {
213
+ source,
214
+ form,
215
+ confidence: conv.confidence,
216
+ exemplar_file: conv.exemplar_file,
217
+ exemplar_line: conv.exemplar_line,
218
+ });
219
+ }
220
+ // Get unique file paths
221
+ const fileRows = rawDb
222
+ .prepare('SELECT DISTINCT file_path FROM functions WHERE file_path IS NOT NULL')
223
+ .all();
224
+ const seenFiles = new Set();
225
+ for (const { file_path: fp } of fileRows) {
226
+ if (seenFiles.has(fp))
227
+ continue;
228
+ seenFiles.add(fp);
229
+ const directory = path.dirname(fp) || '.';
230
+ const importConvs = dirImports.get(directory);
231
+ if (!importConvs)
232
+ continue;
233
+ const fullPath = projectRoot ? path.join(projectRoot, fp) : fp;
234
+ let content;
235
+ try {
236
+ content = fs.readFileSync(fullPath, 'utf-8');
237
+ }
238
+ catch {
239
+ continue;
240
+ }
241
+ const imports = parseFileImports(content);
242
+ for (const imp of imports) {
243
+ const conv = importConvs.get(imp.source);
244
+ if (!conv || imp.form === conv.form)
245
+ continue;
246
+ const pct = Math.round(conv.confidence * 100);
247
+ const exemplarRef = conv.exemplar_file
248
+ ? ` (exemplar: ${conv.exemplar_file}${conv.exemplar_line ? `:${conv.exemplar_line}` : ''})`
249
+ : '';
250
+ violations.push({
251
+ file: fp,
252
+ line: imp.line,
253
+ column: 1,
254
+ severity: 'suggestion',
255
+ message: `${pct}% of imports of \`${imp.source}\` in \`${directory}/\` ` +
256
+ `use ${conv.form} import — this file uses ${imp.form}${exemplarRef}`,
257
+ rule: 'conventions/import-form',
258
+ analyzer: this.name,
259
+ details: {
260
+ source: imp.source,
261
+ directory,
262
+ conventionForm: conv.form,
263
+ actualForm: imp.form,
264
+ localNames: imp.localNames,
265
+ },
266
+ });
267
+ }
268
+ }
269
+ return violations;
270
+ }
271
+ // ── Error-Handling Detection ──────────────────────────────────────────
272
+ /**
273
+ * For each error-handling convention, find functions in that directory
274
+ * that have error handling but use a different shape.
275
+ *
276
+ * Functions with NO error handling are excluded — never flagged.
277
+ */
278
+ detectErrorHandlingViolations(rawDb, conventions) {
279
+ const violations = [];
280
+ // directory → dominantShape
281
+ const dirShapes = new Map();
282
+ for (const conv of conventions) {
283
+ const dir = conv.directory ?? '.';
284
+ const shape = conv.pattern;
285
+ if (!shape)
286
+ continue;
287
+ dirShapes.set(dir, {
288
+ shape,
289
+ confidence: conv.confidence,
290
+ exemplar_file: conv.exemplar_file,
291
+ exemplar_line: conv.exemplar_line,
292
+ });
293
+ }
294
+ const rows = rawDb
295
+ .prepare(`SELECT id, name, file_path, line_number, metadata_json
296
+ FROM functions
297
+ WHERE metadata_json IS NOT NULL`)
298
+ .all();
299
+ for (const row of rows) {
300
+ const directory = path.dirname(row.file_path) || '.';
301
+ const conv = dirShapes.get(directory);
302
+ if (!conv)
303
+ continue;
304
+ let metadata;
305
+ try {
306
+ metadata = JSON.parse(row.metadata_json);
307
+ }
308
+ catch {
309
+ continue;
310
+ }
311
+ const body = metadata.body;
312
+ const shape = detectErrorHandlingShape(body);
313
+ if (!shape)
314
+ continue; // no error handling → skip
315
+ if (shape === conv.shape)
316
+ continue; // matches convention
317
+ const pct = Math.round(conv.confidence * 100);
318
+ const exemplarRef = conv.exemplar_file
319
+ ? ` (exemplar: ${conv.exemplar_file}${conv.exemplar_line ? `:${conv.exemplar_line}` : ''})`
320
+ : '';
321
+ violations.push({
322
+ file: row.file_path,
323
+ line: row.line_number,
324
+ column: 1,
325
+ severity: 'suggestion',
326
+ message: `${pct}% of error-handling functions in \`${directory}/\` use ` +
327
+ `\`${conv.shape}\` — this function uses \`${shape}\`${exemplarRef}`,
328
+ rule: 'conventions/error-handling',
329
+ analyzer: this.name,
330
+ functionName: row.name,
331
+ });
332
+ }
333
+ return violations;
334
+ }
335
+ // ── Export-Shape Detection ────────────────────────────────────────────
336
+ /**
337
+ * For each export-shape convention, find exported functions in that
338
+ * directory that use a minority export form.
339
+ */
340
+ detectExportShapeViolations(rawDb, conventions, projectRoot) {
341
+ const violations = [];
342
+ // directory → dominantForm
343
+ const dirForms = new Map();
344
+ for (const conv of conventions) {
345
+ const dir = conv.directory ?? '.';
346
+ const form = conv.pattern;
347
+ if (!form)
348
+ continue;
349
+ dirForms.set(dir, {
350
+ form,
351
+ confidence: conv.confidence,
352
+ exemplar_file: conv.exemplar_file,
353
+ exemplar_line: conv.exemplar_line,
354
+ });
355
+ }
356
+ const rows = rawDb
357
+ .prepare(`SELECT id, name, file_path, line_number, is_exported
358
+ FROM functions
359
+ WHERE is_exported = 1`)
360
+ .all();
361
+ for (const row of rows) {
362
+ const directory = path.dirname(row.file_path) || '.';
363
+ const conv = dirForms.get(directory);
364
+ if (!conv)
365
+ continue;
366
+ const fullPath = projectRoot ? path.join(projectRoot, row.file_path) : row.file_path;
367
+ const form = detectExportForm(fullPath, row.name);
368
+ if (!form || form === conv.form)
369
+ continue;
370
+ const pct = Math.round(conv.confidence * 100);
371
+ const exemplarRef = conv.exemplar_file
372
+ ? ` (exemplar: ${conv.exemplar_file}${conv.exemplar_line ? `:${conv.exemplar_line}` : ''})`
373
+ : '';
374
+ violations.push({
375
+ file: row.file_path,
376
+ line: row.line_number,
377
+ column: 1,
378
+ severity: 'suggestion',
379
+ message: `${pct}% of exports in \`${directory}/\` use ${conv.form} export — ` +
380
+ `\`${row.name}\` uses ${form}${exemplarRef}`,
381
+ rule: 'conventions/export-shape',
382
+ analyzer: this.name,
383
+ functionName: row.name,
384
+ });
385
+ }
386
+ return violations;
387
+ }
388
+ // ── Naming Detection ──────────────────────────────────────────────────
389
+ /**
390
+ * For each naming convention, find exported functions in that directory
391
+ * that don't match the dominant casing. Non-Latin names are skipped
392
+ * (Spec 21 R5.4).
393
+ */
394
+ detectNamingViolations(rawDb, conventions) {
395
+ const violations = [];
396
+ // directory → dominantCase
397
+ const dirCases = new Map();
398
+ for (const conv of conventions) {
399
+ const dir = conv.directory ?? '.';
400
+ const casing = conv.pattern;
401
+ if (!casing)
402
+ continue;
403
+ dirCases.set(dir, {
404
+ casing,
405
+ confidence: conv.confidence,
406
+ exemplar_file: conv.exemplar_file,
407
+ exemplar_line: conv.exemplar_line,
408
+ });
409
+ }
410
+ const rows = rawDb
411
+ .prepare(`SELECT id, name, file_path, line_number, is_exported
412
+ FROM functions
413
+ WHERE is_exported = 1`)
414
+ .all();
415
+ for (const row of rows) {
416
+ const directory = path.dirname(row.file_path) || '.';
417
+ const conv = dirCases.get(directory);
418
+ if (!conv)
419
+ continue;
420
+ // Non-Latin skip (Spec 21 R5.4)
421
+ if (hasNonLatinChars(row.name))
422
+ continue;
423
+ const casing = detectCase(row.name);
424
+ if (!casing || casing === conv.casing)
425
+ continue;
426
+ const pct = Math.round(conv.confidence * 100);
427
+ const exemplarRef = conv.exemplar_file
428
+ ? ` (exemplar: ${conv.exemplar_file}${conv.exemplar_line ? `:${conv.exemplar_line}` : ''})`
429
+ : '';
430
+ violations.push({
431
+ file: row.file_path,
432
+ line: row.line_number,
433
+ column: 1,
434
+ severity: 'suggestion',
435
+ message: `${pct}% of exports in \`${directory}/\` use ${conv.casing} — ` +
436
+ `\`${row.name}\` uses ${casing}${exemplarRef}`,
437
+ rule: 'conventions/naming',
438
+ analyzer: this.name,
439
+ functionName: row.name,
440
+ });
441
+ }
442
+ return violations;
443
+ }
444
+ }
445
+ //# sourceMappingURL=UniversalConventionsAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UniversalConventionsAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalConventionsAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,33 @@
6
6
  * R3.3: Rule-id split — dry/duplicate (exact token match) + dry/structural-similarity
7
7
  * (identical token-kind sequence with different identifiers/literals).
8
8
  * R7: dry/duplicate → warning, dry/structural-similarity → suggestion.
9
+ *
10
+ * Spec 13 R5 — Diverging Clones: Exports DryPairSeed during analysis for
11
+ * two-phase tracking (seed + re-measure pass in auditRunner).
9
12
  */
10
13
  import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
11
14
  import type { Violation, FunctionMetadata } from '../../types.js';
12
15
  import type { AST, LanguageAdapter } from '../../languages/types.js';
16
+ /**
17
+ * Pair seed emitted during DRY analysis for diverging-clone tracking.
18
+ * The identity is fingerprint-based (file + enclosing symbol), not content-hash-based.
19
+ */
20
+ export interface DryPairSeed {
21
+ /** Order-normalized pair identity: SHA256(sorted(fp1, fp2).join('||')) */
22
+ pairFingerprint: string;
23
+ file1: string;
24
+ symbol1: string;
25
+ line1: number;
26
+ contentHash1: string;
27
+ file2: string;
28
+ symbol2: string;
29
+ line2: number;
30
+ contentHash2: string;
31
+ /** Jaccard similarity [0,1] — 1.0 for exact, ~Jaccard for structural. */
32
+ similarity: number;
33
+ /** Rule: 'dry/duplicate' or 'dry/structural-similarity' */
34
+ rule: string;
35
+ }
13
36
  /**
14
37
  * Configuration for DRY analyzer
15
38
  */
@@ -19,6 +42,8 @@ export interface DRYAnalyzerConfig {
19
42
  excludePatterns?: string[];
20
43
  checkImports?: boolean;
21
44
  checkStrings?: boolean;
45
+ /** R4.2: Enables dry/structural-similarity analysis. Default false. */
46
+ checkStructuralSimilarity?: boolean;
22
47
  ignoreComments?: boolean;
23
48
  ignoreWhitespace?: boolean;
24
49
  /** Full function index (all functions in codebase) for cross-file duplicate detection in scoped audits */
@@ -29,6 +54,12 @@ export declare class UniversalDRYAnalyzer extends UniversalAnalyzer {
29
54
  readonly name = "dry";
30
55
  readonly description = "Detects code duplication across the codebase";
31
56
  readonly category = "maintainability";
57
+ /** Per-file accumulator for pairs seeded during analyzeAST. */
58
+ private _dryPairsForFile;
59
+ /** Pairs collected during the current analysis run for diverging-clone seeding. */
60
+ private _dryPairs;
61
+ /** Expose collected pairs for the auditRunner to persist. */
62
+ get dryPairs(): DryPairSeed[];
32
63
  protected analyzeAST(ast: AST, adapter: LanguageAdapter, config: DRYAnalyzerConfig, sourceCode: string): Promise<Violation[]>;
33
64
  /**
34
65
  * Returns true if the two blocks share code spans (same file + overlapping lines).
@@ -107,5 +138,26 @@ export declare class UniversalDRYAnalyzer extends UniversalAnalyzer {
107
138
  private walkAST;
108
139
  private isSignificantBlock;
109
140
  private isStringLiteral;
141
+ /**
142
+ * Compute the Jaccard similarity index between two tokenized strings.
143
+ * Jaccard = |intersection| / |union|. Range [0, 1].
144
+ */
145
+ private computeJaccardSimilarity;
146
+ /**
147
+ * Compute an order-independent pair fingerprint from file + line + nodeType.
148
+ * Uses SHA256(sorted(a, b).join('||')) so the same pair has the same
149
+ * fingerprint regardless of argument order.
150
+ */
151
+ private computePairFingerprint;
152
+ /**
153
+ * Seed a pair into the per-file accumulator for diverging-clone tracking.
154
+ * Called during analyzeAST when a duplicate or structural-similarity pair
155
+ * is detected.
156
+ */
157
+ private seedPair;
158
+ /**
159
+ * Override analyze() to attach seeded pairs to the AnalyzerResult.
160
+ */
161
+ analyze(files: string[], config?: any, options?: any): Promise<import('../../types.js').AnalyzerResult>;
110
162
  }
111
163
  //# sourceMappingURL=UniversalDRYAnalyzer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalDRYAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0GAA0G;IAC1G,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAShC,CAAC;AAsBF,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAwItB;IAID;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAKjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;CAGxB"}
1
+ {"version":3,"file":"UniversalDRYAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0GAA0G;IAC1G,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAYhC,CAAC;AAsBF,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,+DAA+D;IAC/D,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,mFAAmF;IACnF,OAAO,CAAC,SAAS,CAAqB;IAEtC,6DAA6D;IAC7D,IAAI,QAAQ,IAAI,WAAW,EAAE,CAE5B;IAED,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CA6JtB;IAID;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAKjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2C7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAahC;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAyBhB;;OAEG;IACG,OAAO,CACX,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,GAAE,GAAQ,EAChB,OAAO,GAAE,GAAQ,GAChB,OAAO,CAAC,OAAO,gBAAgB,EAAE,cAAc,CAAC,CAIlD;CACF"}