code-auditor-mcp 4.1.1 → 5.0.1

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 (1082) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +338 -0
  3. package/README.md +4 -4
  4. package/configs/hhra-compat.json +0 -8
  5. package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts +1 -1
  6. package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts.map +1 -1
  7. package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js +7 -1
  8. package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js.map +1 -1
  9. package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts +2 -8
  10. package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts.map +1 -1
  11. package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js +4 -4
  12. package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js.map +1 -1
  13. package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts +1 -1
  14. package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts.map +1 -1
  15. package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js.map +1 -1
  16. package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts +2 -2
  17. package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts.map +1 -1
  18. package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js.map +1 -1
  19. package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts +1 -1
  20. package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts.map +1 -1
  21. package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js.map +1 -1
  22. package/dist/analyzers/applicability.d.ts +42 -0
  23. package/dist/analyzers/applicability.d.ts.map +1 -1
  24. package/dist/analyzers/applicability.js +74 -0
  25. package/dist/analyzers/applicability.js.map +1 -1
  26. package/dist/analyzers/cross-language/APIContractAnalyzer.js +18 -24
  27. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  28. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +30 -23
  29. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  30. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +113 -76
  31. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  32. package/dist/analyzers/cross-language/SchemaValidator.d.ts +2 -0
  33. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  34. package/dist/analyzers/cross-language/SchemaValidator.js +8 -3
  35. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  36. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
  37. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +210 -148
  38. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
  39. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  40. package/dist/analyzers/documentationAnalyzer.js +23 -28
  41. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  42. package/dist/analyzers/handleIdentification.d.ts +356 -0
  43. package/dist/analyzers/handleIdentification.d.ts.map +1 -0
  44. package/dist/analyzers/handleIdentification.js +424 -0
  45. package/dist/analyzers/handleIdentification.js.map +1 -0
  46. package/dist/analyzers/manifestStaleness.d.ts +64 -0
  47. package/dist/analyzers/manifestStaleness.d.ts.map +1 -0
  48. package/dist/analyzers/manifestStaleness.js +115 -0
  49. package/dist/analyzers/manifestStaleness.js.map +1 -0
  50. package/dist/analyzers/orgFilterTiers.d.ts +73 -1
  51. package/dist/analyzers/orgFilterTiers.d.ts.map +1 -1
  52. package/dist/analyzers/orgFilterTiers.js +166 -1
  53. package/dist/analyzers/orgFilterTiers.js.map +1 -1
  54. package/dist/analyzers/provenance.d.ts +251 -57
  55. package/dist/analyzers/provenance.d.ts.map +1 -1
  56. package/dist/analyzers/provenance.js +1109 -429
  57. package/dist/analyzers/provenance.js.map +1 -1
  58. package/dist/analyzers/reactAnalyzer.d.ts +2 -0
  59. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  60. package/dist/analyzers/reactAnalyzer.js +2 -0
  61. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  62. package/dist/analyzers/receiverResolution.d.ts +183 -0
  63. package/dist/analyzers/receiverResolution.d.ts.map +1 -0
  64. package/dist/analyzers/receiverResolution.js +540 -0
  65. package/dist/analyzers/receiverResolution.js.map +1 -0
  66. package/dist/analyzers/receiverRoot.d.ts +328 -0
  67. package/dist/analyzers/receiverRoot.d.ts.map +1 -0
  68. package/dist/analyzers/receiverRoot.js +990 -0
  69. package/dist/analyzers/receiverRoot.js.map +1 -0
  70. package/dist/analyzers/ruleRegistry.d.ts +12 -68
  71. package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
  72. package/dist/analyzers/ruleRegistry.js +32 -342
  73. package/dist/analyzers/ruleRegistry.js.map +1 -1
  74. package/dist/analyzers/ruleTiming.d.ts +10 -0
  75. package/dist/analyzers/ruleTiming.d.ts.map +1 -1
  76. package/dist/analyzers/ruleTiming.js +20 -0
  77. package/dist/analyzers/ruleTiming.js.map +1 -1
  78. package/dist/analyzers/sqlLiteral.d.ts +76 -0
  79. package/dist/analyzers/sqlLiteral.d.ts.map +1 -0
  80. package/dist/analyzers/sqlLiteral.js +419 -0
  81. package/dist/analyzers/sqlLiteral.js.map +1 -0
  82. package/dist/analyzers/tsEcosystem.d.ts +115 -0
  83. package/dist/analyzers/tsEcosystem.d.ts.map +1 -0
  84. package/dist/analyzers/tsEcosystem.js +231 -0
  85. package/dist/analyzers/tsEcosystem.js.map +1 -0
  86. package/dist/analyzers/tsExpressionDescriptor.d.ts +156 -0
  87. package/dist/analyzers/tsExpressionDescriptor.d.ts.map +1 -0
  88. package/dist/analyzers/tsExpressionDescriptor.js +374 -0
  89. package/dist/analyzers/tsExpressionDescriptor.js.map +1 -0
  90. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +6 -0
  91. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
  92. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +107 -44
  93. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
  94. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  95. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +23 -35
  96. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  97. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +287 -49
  98. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  99. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +2130 -512
  100. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  101. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  102. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +2 -18
  103. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  104. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +0 -33
  105. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  106. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +20 -143
  107. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  108. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +4 -3
  109. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  110. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +36 -13
  111. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  112. package/dist/analyzers/universal/UniversalSecretsAnalyzer.d.ts.map +1 -1
  113. package/dist/analyzers/universal/UniversalSecretsAnalyzer.js +6 -0
  114. package/dist/analyzers/universal/UniversalSecretsAnalyzer.js.map +1 -1
  115. package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts +15 -0
  116. package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts.map +1 -1
  117. package/dist/analyzers/universal/UniversalSecurityAnalyzer.js +25 -0
  118. package/dist/analyzers/universal/UniversalSecurityAnalyzer.js.map +1 -1
  119. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +21 -32
  120. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  121. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +166 -196
  122. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  123. package/dist/analyzers/universal/functionConcerns.d.ts +3 -0
  124. package/dist/analyzers/universal/functionConcerns.d.ts.map +1 -1
  125. package/dist/analyzers/universal/functionConcerns.js +4 -1
  126. package/dist/analyzers/universal/functionConcerns.js.map +1 -1
  127. package/dist/analyzers/universal/schema/codeAnalysis.d.ts +310 -69
  128. package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
  129. package/dist/analyzers/universal/schema/codeAnalysis.js +709 -383
  130. package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
  131. package/dist/analyzers/universal/schema/config.d.ts +3 -14
  132. package/dist/analyzers/universal/schema/config.d.ts.map +1 -1
  133. package/dist/analyzers/universal/schema/config.js +3 -16
  134. package/dist/analyzers/universal/schema/config.js.map +1 -1
  135. package/dist/analyzers/universal/schema/discovery.d.ts +22 -1
  136. package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -1
  137. package/dist/analyzers/universal/schema/discovery.js +36 -20
  138. package/dist/analyzers/universal/schema/discovery.js.map +1 -1
  139. package/dist/analyzers/universal/schema/jsonSchema.d.ts.map +1 -1
  140. package/dist/analyzers/universal/schema/jsonSchema.js +13 -3
  141. package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
  142. package/dist/analyzers/universal/schema/migrations.d.ts +187 -27
  143. package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -1
  144. package/dist/analyzers/universal/schema/migrations.js +443 -186
  145. package/dist/analyzers/universal/schema/migrations.js.map +1 -1
  146. package/dist/analyzers/universal/schema/types.d.ts +17 -3
  147. package/dist/analyzers/universal/schema/types.d.ts.map +1 -1
  148. package/dist/analyzers/universal/schema/violations.js +1 -1
  149. package/dist/analyzers/universal/schema/violations.js.map +1 -1
  150. package/dist/analyzers/universal/styleScale.d.ts +52 -0
  151. package/dist/analyzers/universal/styleScale.d.ts.map +1 -0
  152. package/dist/analyzers/universal/styleScale.js +95 -0
  153. package/dist/analyzers/universal/styleScale.js.map +1 -0
  154. package/dist/applyDataDirEnv.js +1 -1
  155. package/dist/applyDataDirEnv.js.map +1 -1
  156. package/dist/auditRouter.d.ts +26 -30
  157. package/dist/auditRouter.d.ts.map +1 -1
  158. package/dist/auditRouter.js +373 -143
  159. package/dist/auditRouter.js.map +1 -1
  160. package/dist/auditRunner.d.ts +64 -1
  161. package/dist/auditRunner.d.ts.map +1 -1
  162. package/dist/auditRunner.js +1538 -1033
  163. package/dist/auditRunner.js.map +1 -1
  164. package/dist/baseline.d.ts +30 -3
  165. package/dist/baseline.d.ts.map +1 -1
  166. package/dist/baseline.js +70 -9
  167. package/dist/baseline.js.map +1 -1
  168. package/dist/cli.js +969 -821
  169. package/dist/cli.js.map +1 -1
  170. package/dist/codeIndex/analyzerConfig.d.ts +60 -0
  171. package/dist/codeIndex/analyzerConfig.d.ts.map +1 -0
  172. package/dist/codeIndex/analyzerConfig.js +98 -0
  173. package/dist/codeIndex/analyzerConfig.js.map +1 -0
  174. package/dist/codeIndex/auditResults.d.ts +39 -0
  175. package/dist/codeIndex/auditResults.d.ts.map +1 -0
  176. package/dist/codeIndex/auditResults.js +99 -0
  177. package/dist/codeIndex/auditResults.js.map +1 -0
  178. package/dist/codeIndex/codeMap.d.ts +59 -0
  179. package/dist/codeIndex/codeMap.d.ts.map +1 -0
  180. package/dist/codeIndex/codeMap.js +72 -0
  181. package/dist/codeIndex/codeMap.js.map +1 -0
  182. package/dist/codeIndex/conventions.d.ts +33 -0
  183. package/dist/codeIndex/conventions.d.ts.map +1 -0
  184. package/dist/codeIndex/conventions.js +84 -0
  185. package/dist/codeIndex/conventions.js.map +1 -0
  186. package/dist/codeIndex/coverage.d.ts +78 -0
  187. package/dist/codeIndex/coverage.d.ts.map +1 -0
  188. package/dist/codeIndex/coverage.js +164 -0
  189. package/dist/codeIndex/coverage.js.map +1 -0
  190. package/dist/codeIndex/dependencyGraph.d.ts +97 -0
  191. package/dist/codeIndex/dependencyGraph.d.ts.map +1 -0
  192. package/dist/codeIndex/dependencyGraph.js +241 -0
  193. package/dist/codeIndex/dependencyGraph.js.map +1 -0
  194. package/dist/codeIndex/functionIndex.d.ts +111 -0
  195. package/dist/codeIndex/functionIndex.d.ts.map +1 -0
  196. package/dist/codeIndex/functionIndex.js +306 -0
  197. package/dist/codeIndex/functionIndex.js.map +1 -0
  198. package/dist/codeIndex/inferredReceivers.d.ts +32 -0
  199. package/dist/codeIndex/inferredReceivers.d.ts.map +1 -0
  200. package/dist/codeIndex/inferredReceivers.js +41 -0
  201. package/dist/codeIndex/inferredReceivers.js.map +1 -0
  202. package/dist/codeIndex/meta.d.ts +30 -0
  203. package/dist/codeIndex/meta.d.ts.map +1 -0
  204. package/dist/codeIndex/meta.js +37 -0
  205. package/dist/codeIndex/meta.js.map +1 -0
  206. package/dist/codeIndex/migrations.d.ts +96 -0
  207. package/dist/codeIndex/migrations.d.ts.map +1 -0
  208. package/dist/codeIndex/migrations.js +1302 -0
  209. package/dist/codeIndex/migrations.js.map +1 -0
  210. package/dist/codeIndex/projectTasks.d.ts +54 -0
  211. package/dist/codeIndex/projectTasks.d.ts.map +1 -0
  212. package/dist/codeIndex/projectTasks.js +81 -0
  213. package/dist/codeIndex/projectTasks.js.map +1 -0
  214. package/dist/codeIndex/provenance.d.ts +47 -0
  215. package/dist/codeIndex/provenance.d.ts.map +1 -0
  216. package/dist/codeIndex/provenance.js +48 -0
  217. package/dist/codeIndex/provenance.js.map +1 -0
  218. package/dist/codeIndex/rawSql.d.ts +54 -0
  219. package/dist/codeIndex/rawSql.d.ts.map +1 -0
  220. package/dist/codeIndex/rawSql.js +71 -0
  221. package/dist/codeIndex/rawSql.js.map +1 -0
  222. package/dist/codeIndex/schema.d.ts +99 -0
  223. package/dist/codeIndex/schema.d.ts.map +1 -0
  224. package/dist/codeIndex/schema.js +174 -0
  225. package/dist/codeIndex/schema.js.map +1 -0
  226. package/dist/codeIndex/search.d.ts +40 -0
  227. package/dist/codeIndex/search.d.ts.map +1 -0
  228. package/dist/codeIndex/search.js +316 -0
  229. package/dist/codeIndex/search.js.map +1 -0
  230. package/dist/codeIndex/shared.d.ts +27 -0
  231. package/dist/codeIndex/shared.d.ts.map +1 -0
  232. package/dist/codeIndex/shared.js +46 -0
  233. package/dist/codeIndex/shared.js.map +1 -0
  234. package/dist/codeIndex/sqliteCollection.d.ts +81 -0
  235. package/dist/codeIndex/sqliteCollection.d.ts.map +1 -0
  236. package/dist/codeIndex/sqliteCollection.js +250 -0
  237. package/dist/codeIndex/sqliteCollection.js.map +1 -0
  238. package/dist/codeIndex/whitelist.d.ts +59 -0
  239. package/dist/codeIndex/whitelist.d.ts.map +1 -0
  240. package/dist/codeIndex/whitelist.js +188 -0
  241. package/dist/codeIndex/whitelist.js.map +1 -0
  242. package/dist/codeIndexDB.d.ts +132 -271
  243. package/dist/codeIndexDB.d.ts.map +1 -1
  244. package/dist/codeIndexDB.js +365 -2729
  245. package/dist/codeIndexDB.js.map +1 -1
  246. package/dist/codeIndexService.d.ts +87 -12
  247. package/dist/codeIndexService.d.ts.map +1 -1
  248. package/dist/codeIndexService.js +110 -34
  249. package/dist/codeIndexService.js.map +1 -1
  250. package/dist/componentScanner.d.ts +35 -0
  251. package/dist/componentScanner.d.ts.map +1 -1
  252. package/dist/componentScanner.js +114 -80
  253. package/dist/componentScanner.js.map +1 -1
  254. package/dist/config/configGeneratePath.d.ts +4 -0
  255. package/dist/config/configGeneratePath.d.ts.map +1 -1
  256. package/dist/config/configGeneratePath.js +4 -0
  257. package/dist/config/configGeneratePath.js.map +1 -1
  258. package/dist/config/configLoader.d.ts +15 -0
  259. package/dist/config/configLoader.d.ts.map +1 -1
  260. package/dist/config/configLoader.js +15 -16
  261. package/dist/config/configLoader.js.map +1 -1
  262. package/dist/config/defaults.d.ts +11 -7
  263. package/dist/config/defaults.d.ts.map +1 -1
  264. package/dist/config/defaults.js +16 -14
  265. package/dist/config/defaults.js.map +1 -1
  266. package/dist/config/effectiveConfig.d.ts +17 -2
  267. package/dist/config/effectiveConfig.d.ts.map +1 -1
  268. package/dist/config/effectiveConfig.js +32 -25
  269. package/dist/config/effectiveConfig.js.map +1 -1
  270. package/dist/config/lintConfigReader.d.ts +6 -0
  271. package/dist/config/lintConfigReader.d.ts.map +1 -1
  272. package/dist/config/lintConfigReader.js +6 -0
  273. package/dist/config/lintConfigReader.js.map +1 -1
  274. package/dist/config/staticObjectExtract.d.ts +4 -0
  275. package/dist/config/staticObjectExtract.d.ts.map +1 -1
  276. package/dist/config/staticObjectExtract.js +7 -3
  277. package/dist/config/staticObjectExtract.js.map +1 -1
  278. package/dist/config/thresholdRationales.d.ts +2 -0
  279. package/dist/config/thresholdRationales.d.ts.map +1 -1
  280. package/dist/config/thresholdRationales.js +5 -2
  281. package/dist/config/thresholdRationales.js.map +1 -1
  282. package/dist/constants.d.ts +1 -1
  283. package/dist/conventions/conventionMiner.d.ts +105 -2
  284. package/dist/conventions/conventionMiner.d.ts.map +1 -1
  285. package/dist/conventions/conventionMiner.js +334 -259
  286. package/dist/conventions/conventionMiner.js.map +1 -1
  287. package/dist/coverage/coverageService.js +4 -4
  288. package/dist/coverage/coverageService.js.map +1 -1
  289. package/dist/daemon/args.d.ts +3 -0
  290. package/dist/daemon/args.d.ts.map +1 -1
  291. package/dist/daemon/args.js +3 -0
  292. package/dist/daemon/args.js.map +1 -1
  293. package/dist/daemon/core.d.ts +33 -27
  294. package/dist/daemon/core.d.ts.map +1 -1
  295. package/dist/daemon/core.js +198 -162
  296. package/dist/daemon/core.js.map +1 -1
  297. package/dist/daemon/lspServer.d.ts +8 -0
  298. package/dist/daemon/lspServer.d.ts.map +1 -1
  299. package/dist/daemon/lspServer.js +8 -0
  300. package/dist/daemon/lspServer.js.map +1 -1
  301. package/dist/daemon/main.d.ts +2 -0
  302. package/dist/daemon/main.d.ts.map +1 -1
  303. package/dist/daemon/main.js +2 -0
  304. package/dist/daemon/main.js.map +1 -1
  305. package/dist/daemon/resolve.d.ts +18 -3
  306. package/dist/daemon/resolve.d.ts.map +1 -1
  307. package/dist/daemon/resolve.js +25 -4
  308. package/dist/daemon/resolve.js.map +1 -1
  309. package/dist/daemon/socketClient.d.ts +10 -1
  310. package/dist/daemon/socketClient.d.ts.map +1 -1
  311. package/dist/daemon/socketClient.js +10 -1
  312. package/dist/daemon/socketClient.js.map +1 -1
  313. package/dist/daemon/socketServer.d.ts +13 -0
  314. package/dist/daemon/socketServer.d.ts.map +1 -1
  315. package/dist/daemon/socketServer.js +13 -0
  316. package/dist/daemon/socketServer.js.map +1 -1
  317. package/dist/dataPaths.d.ts +17 -8
  318. package/dist/dataPaths.d.ts.map +1 -1
  319. package/dist/dataPaths.js +16 -44
  320. package/dist/dataPaths.js.map +1 -1
  321. package/dist/dismissals.d.ts +22 -1
  322. package/dist/dismissals.d.ts.map +1 -1
  323. package/dist/dismissals.js +22 -1
  324. package/dist/dismissals.js.map +1 -1
  325. package/dist/enforcement/gate.d.ts +1 -0
  326. package/dist/enforcement/gate.d.ts.map +1 -1
  327. package/dist/enforcement/gate.js +1 -0
  328. package/dist/enforcement/gate.js.map +1 -1
  329. package/dist/fingerprint.d.ts +6 -0
  330. package/dist/fingerprint.d.ts.map +1 -1
  331. package/dist/fingerprint.js +46 -1
  332. package/dist/fingerprint.js.map +1 -1
  333. package/dist/functionScanner.d.ts +30 -1
  334. package/dist/functionScanner.d.ts.map +1 -1
  335. package/dist/functionScanner.js +258 -256
  336. package/dist/functionScanner.js.map +1 -1
  337. package/dist/generators/AWSQConfigGenerator.d.ts +23 -0
  338. package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
  339. package/dist/generators/AWSQConfigGenerator.js +23 -0
  340. package/dist/generators/AWSQConfigGenerator.js.map +1 -1
  341. package/dist/generators/BaseConfigGenerator.d.ts +7 -0
  342. package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
  343. package/dist/generators/BaseConfigGenerator.js +7 -0
  344. package/dist/generators/BaseConfigGenerator.js.map +1 -1
  345. package/dist/generators/ClaudeConfigGenerator.d.ts +23 -0
  346. package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
  347. package/dist/generators/ClaudeConfigGenerator.js +23 -0
  348. package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
  349. package/dist/generators/ClineConfigGenerator.d.ts +23 -0
  350. package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
  351. package/dist/generators/ClineConfigGenerator.js +23 -0
  352. package/dist/generators/ClineConfigGenerator.js.map +1 -1
  353. package/dist/generators/CodeiumConfigGenerator.d.ts +23 -0
  354. package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
  355. package/dist/generators/CodeiumConfigGenerator.js +23 -0
  356. package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
  357. package/dist/generators/CodexConfigGenerator.d.ts +23 -0
  358. package/dist/generators/CodexConfigGenerator.d.ts.map +1 -1
  359. package/dist/generators/CodexConfigGenerator.js +23 -0
  360. package/dist/generators/CodexConfigGenerator.js.map +1 -1
  361. package/dist/generators/ConfigGeneratorFactory.d.ts +9 -0
  362. package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
  363. package/dist/generators/ConfigGeneratorFactory.js +9 -0
  364. package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
  365. package/dist/generators/ContinueConfigGenerator.d.ts +23 -0
  366. package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
  367. package/dist/generators/ContinueConfigGenerator.js +23 -0
  368. package/dist/generators/ContinueConfigGenerator.js.map +1 -1
  369. package/dist/generators/CopilotConfigGenerator.d.ts +23 -0
  370. package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
  371. package/dist/generators/CopilotConfigGenerator.js +23 -0
  372. package/dist/generators/CopilotConfigGenerator.js.map +1 -1
  373. package/dist/generators/CursorConfigGenerator.d.ts +23 -0
  374. package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
  375. package/dist/generators/CursorConfigGenerator.js +23 -0
  376. package/dist/generators/CursorConfigGenerator.js.map +1 -1
  377. package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
  378. package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -1
  379. package/dist/generators/GeminiConfigGenerator.js +23 -0
  380. package/dist/generators/GeminiConfigGenerator.js.map +1 -1
  381. package/dist/generators/VSCodeConfigGenerator.d.ts +23 -0
  382. package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
  383. package/dist/generators/VSCodeConfigGenerator.js +23 -0
  384. package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
  385. package/dist/generators/ZCodeConfigGenerator.d.ts +23 -0
  386. package/dist/generators/ZCodeConfigGenerator.d.ts.map +1 -1
  387. package/dist/generators/ZCodeConfigGenerator.js +23 -0
  388. package/dist/generators/ZCodeConfigGenerator.js.map +1 -1
  389. package/dist/graph/blastRadius.d.ts.map +1 -1
  390. package/dist/graph/blastRadius.js +12 -7
  391. package/dist/graph/blastRadius.js.map +1 -1
  392. package/dist/graph/callGraph.d.ts +31 -0
  393. package/dist/graph/callGraph.d.ts.map +1 -1
  394. package/dist/graph/callGraph.js +62 -32
  395. package/dist/graph/callGraph.js.map +1 -1
  396. package/dist/graph/importClassification.d.ts +28 -0
  397. package/dist/graph/importClassification.d.ts.map +1 -1
  398. package/dist/graph/importClassification.js +57 -0
  399. package/dist/graph/importClassification.js.map +1 -1
  400. package/dist/graph/importGraph.d.ts +38 -0
  401. package/dist/graph/importGraph.d.ts.map +1 -1
  402. package/dist/graph/importGraph.js +38 -0
  403. package/dist/graph/importGraph.js.map +1 -1
  404. package/dist/graph/outputFormatter.d.ts +12 -4
  405. package/dist/graph/outputFormatter.d.ts.map +1 -1
  406. package/dist/graph/outputFormatter.js +12 -62
  407. package/dist/graph/outputFormatter.js.map +1 -1
  408. package/dist/hooks/codex.d.ts +8 -1
  409. package/dist/hooks/codex.d.ts.map +1 -1
  410. package/dist/hooks/codex.js +7 -0
  411. package/dist/hooks/codex.js.map +1 -1
  412. package/dist/hooks/core.d.ts +6 -0
  413. package/dist/hooks/core.d.ts.map +1 -1
  414. package/dist/hooks/core.js +6 -1
  415. package/dist/hooks/core.js.map +1 -1
  416. package/dist/hooks/cursor.d.ts +11 -1
  417. package/dist/hooks/cursor.d.ts.map +1 -1
  418. package/dist/hooks/cursor.js +10 -0
  419. package/dist/hooks/cursor.js.map +1 -1
  420. package/dist/index.d.ts +4 -0
  421. package/dist/index.d.ts.map +1 -1
  422. package/dist/index.js +4 -0
  423. package/dist/index.js.map +1 -1
  424. package/dist/installConfig.d.ts +23 -5
  425. package/dist/installConfig.d.ts.map +1 -1
  426. package/dist/installConfig.js +23 -5
  427. package/dist/installConfig.js.map +1 -1
  428. package/dist/installer.d.ts +6 -0
  429. package/dist/installer.d.ts.map +1 -1
  430. package/dist/installer.js +6 -0
  431. package/dist/installer.js.map +1 -1
  432. package/dist/invariants/ruleEngine.d.ts +3 -0
  433. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  434. package/dist/invariants/ruleEngine.js +156 -119
  435. package/dist/invariants/ruleEngine.js.map +1 -1
  436. package/dist/invariants/ruleValidator.d.ts +3 -0
  437. package/dist/invariants/ruleValidator.d.ts.map +1 -1
  438. package/dist/invariants/ruleValidator.js +185 -178
  439. package/dist/invariants/ruleValidator.js.map +1 -1
  440. package/dist/languages/LanguageOrchestrator.d.ts +4 -1
  441. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
  442. package/dist/languages/LanguageOrchestrator.js +8 -19
  443. package/dist/languages/LanguageOrchestrator.js.map +1 -1
  444. package/dist/languages/RuntimeManager.d.ts +8 -0
  445. package/dist/languages/RuntimeManager.d.ts.map +1 -1
  446. package/dist/languages/RuntimeManager.js +55 -5
  447. package/dist/languages/RuntimeManager.js.map +1 -1
  448. package/dist/languages/UniversalAnalyzer.js +1 -1
  449. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  450. package/dist/languages/adapterBridge.d.ts +4 -0
  451. package/dist/languages/adapterBridge.d.ts.map +1 -1
  452. package/dist/languages/adapterBridge.js +37 -3
  453. package/dist/languages/adapterBridge.js.map +1 -1
  454. package/dist/languages/go/GoAdapter.d.ts.map +1 -1
  455. package/dist/languages/go/GoAdapter.js +11 -14
  456. package/dist/languages/go/GoAdapter.js.map +1 -1
  457. package/dist/languages/go/analyzer-darwin-amd64 +0 -0
  458. package/dist/languages/go/analyzer-darwin-arm64 +0 -0
  459. package/dist/languages/go/analyzer-linux-amd64 +0 -0
  460. package/dist/languages/go/analyzer-linux-arm64 +0 -0
  461. package/dist/languages/go/analyzer-src/analyzer.go +2 -0
  462. package/dist/languages/go/analyzer-src/dataaccess.go +388 -0
  463. package/dist/languages/go/analyzer-src/types.go +8 -0
  464. package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
  465. package/dist/languages/go/database-packages.json +8 -0
  466. package/dist/languages/go/goResolution.d.ts +229 -0
  467. package/dist/languages/go/goResolution.d.ts.map +1 -0
  468. package/dist/languages/go/goResolution.js +799 -0
  469. package/dist/languages/go/goResolution.js.map +1 -0
  470. package/dist/languages/go/stdlib-packages.json +353 -0
  471. package/dist/languages/go/tenantInputs.d.ts +37 -0
  472. package/dist/languages/go/tenantInputs.d.ts.map +1 -0
  473. package/dist/languages/go/tenantInputs.js +121 -0
  474. package/dist/languages/go/tenantInputs.js.map +1 -0
  475. package/dist/languages/index.d.ts +1 -0
  476. package/dist/languages/index.d.ts.map +1 -1
  477. package/dist/languages/index.js +5 -0
  478. package/dist/languages/index.js.map +1 -1
  479. package/dist/languages/json/JsonAdapter.d.ts +177 -0
  480. package/dist/languages/json/JsonAdapter.d.ts.map +1 -0
  481. package/dist/languages/json/JsonAdapter.js +531 -0
  482. package/dist/languages/json/JsonAdapter.js.map +1 -0
  483. package/dist/languages/locationIndex.d.ts +41 -0
  484. package/dist/languages/locationIndex.d.ts.map +1 -0
  485. package/dist/languages/locationIndex.js +42 -0
  486. package/dist/languages/locationIndex.js.map +1 -0
  487. package/dist/languages/sql/dialectDetection.d.ts +57 -0
  488. package/dist/languages/sql/dialectDetection.d.ts.map +1 -0
  489. package/dist/languages/sql/dialectDetection.js +135 -0
  490. package/dist/languages/sql/dialectDetection.js.map +1 -0
  491. package/dist/languages/sql/sqlAst.d.ts +494 -0
  492. package/dist/languages/sql/sqlAst.d.ts.map +1 -0
  493. package/dist/languages/sql/sqlAst.js +1817 -0
  494. package/dist/languages/sql/sqlAst.js.map +1 -0
  495. package/dist/languages/testConventions.d.ts +12 -1
  496. package/dist/languages/testConventions.d.ts.map +1 -1
  497. package/dist/languages/testConventions.js +13 -1
  498. package/dist/languages/testConventions.js.map +1 -1
  499. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +1 -1
  500. package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -1
  501. package/dist/languages/tree-sitter/converter.js +2 -2
  502. package/dist/languages/tree-sitter/converter.js.map +1 -1
  503. package/dist/languages/tree-sitter/parser.d.ts +3 -4
  504. package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
  505. package/dist/languages/tree-sitter/parser.js +10 -4
  506. package/dist/languages/tree-sitter/parser.js.map +1 -1
  507. package/dist/languages/tree-sitter/rawNode.d.ts +3 -0
  508. package/dist/languages/tree-sitter/rawNode.d.ts.map +1 -1
  509. package/dist/languages/tree-sitter/rawNode.js +3 -0
  510. package/dist/languages/tree-sitter/rawNode.js.map +1 -1
  511. package/dist/languages/types.d.ts +7 -0
  512. package/dist/languages/types.d.ts.map +1 -1
  513. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +36 -0
  514. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  515. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +168 -45
  516. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  517. package/dist/languages/typescript/database-packages.json +19 -0
  518. package/dist/ledger.d.ts +118 -2
  519. package/dist/ledger.d.ts.map +1 -1
  520. package/dist/ledger.js +167 -45
  521. package/dist/ledger.js.map +1 -1
  522. package/dist/legacyIndexNotice.d.ts +32 -0
  523. package/dist/legacyIndexNotice.d.ts.map +1 -0
  524. package/dist/legacyIndexNotice.js +89 -0
  525. package/dist/legacyIndexNotice.js.map +1 -0
  526. package/dist/mcp-tools/discoveryQueries.d.ts +55 -0
  527. package/dist/mcp-tools/discoveryQueries.d.ts.map +1 -0
  528. package/dist/mcp-tools/discoveryQueries.js +157 -0
  529. package/dist/mcp-tools/discoveryQueries.js.map +1 -0
  530. package/dist/mcp-tools/projectTasks.d.ts +9 -123
  531. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  532. package/dist/mcp-tools/projectTasks.js +180 -170
  533. package/dist/mcp-tools/projectTasks.js.map +1 -1
  534. package/dist/mcp-tools/whitelistTools.d.ts +20 -0
  535. package/dist/mcp-tools/whitelistTools.d.ts.map +1 -1
  536. package/dist/mcp-tools/whitelistTools.js +20 -0
  537. package/dist/mcp-tools/whitelistTools.js.map +1 -1
  538. package/dist/mcp-tools/workflowGuide.d.ts +9 -0
  539. package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
  540. package/dist/mcp-tools/workflowGuide.js +13 -5
  541. package/dist/mcp-tools/workflowGuide.js.map +1 -1
  542. package/dist/mcp-tools-shared.d.ts +78 -0
  543. package/dist/mcp-tools-shared.d.ts.map +1 -1
  544. package/dist/mcp-tools-shared.js +203 -340
  545. package/dist/mcp-tools-shared.js.map +1 -1
  546. package/dist/mcp-ui-simple.d.ts +2 -0
  547. package/dist/mcp-ui-simple.d.ts.map +1 -1
  548. package/dist/mcp-ui-simple.js +12 -5
  549. package/dist/mcp-ui-simple.js.map +1 -1
  550. package/dist/mcp.d.ts +6 -0
  551. package/dist/mcp.d.ts.map +1 -1
  552. package/dist/mcp.js +827 -850
  553. package/dist/mcp.js.map +1 -1
  554. package/dist/mcpAuditJobs.d.ts +29 -33
  555. package/dist/mcpAuditJobs.d.ts.map +1 -1
  556. package/dist/mcpAuditJobs.js +102 -791
  557. package/dist/mcpAuditJobs.js.map +1 -1
  558. package/dist/mcpAutoIndex.d.ts +5 -0
  559. package/dist/mcpAutoIndex.d.ts.map +1 -1
  560. package/dist/mcpAutoIndex.js +7 -2
  561. package/dist/mcpAutoIndex.js.map +1 -1
  562. package/dist/mcpDiagnostics.d.ts +7 -0
  563. package/dist/mcpDiagnostics.d.ts.map +1 -1
  564. package/dist/mcpDiagnostics.js +34 -9
  565. package/dist/mcpDiagnostics.js.map +1 -1
  566. package/dist/mcpToolErrors.d.ts +16 -0
  567. package/dist/mcpToolErrors.d.ts.map +1 -1
  568. package/dist/mcpToolErrors.js +16 -0
  569. package/dist/mcpToolErrors.js.map +1 -1
  570. package/dist/nextFile.d.ts +6 -0
  571. package/dist/nextFile.d.ts.map +1 -1
  572. package/dist/nextFile.js +6 -0
  573. package/dist/nextFile.js.map +1 -1
  574. package/dist/nextFileIncremental.d.ts +44 -4
  575. package/dist/nextFileIncremental.d.ts.map +1 -1
  576. package/dist/nextFileIncremental.js +47 -7
  577. package/dist/nextFileIncremental.js.map +1 -1
  578. package/dist/phase/batchFunctions.d.ts +38 -0
  579. package/dist/phase/batchFunctions.d.ts.map +1 -0
  580. package/dist/phase/batchFunctions.js +64 -0
  581. package/dist/phase/batchFunctions.js.map +1 -0
  582. package/dist/phase/checks.d.ts +39 -0
  583. package/dist/phase/checks.d.ts.map +1 -0
  584. package/dist/phase/checks.js +48 -0
  585. package/dist/phase/checks.js.map +1 -0
  586. package/dist/phase/codeBlocks.d.ts +25 -0
  587. package/dist/phase/codeBlocks.d.ts.map +1 -0
  588. package/dist/phase/codeBlocks.js +268 -0
  589. package/dist/phase/codeBlocks.js.map +1 -0
  590. package/dist/phase/colorMath.d.ts +41 -0
  591. package/dist/phase/colorMath.d.ts.map +1 -0
  592. package/dist/phase/colorMath.js +109 -0
  593. package/dist/phase/colorMath.js.map +1 -0
  594. package/dist/phase/config.d.ts +29 -0
  595. package/dist/phase/config.d.ts.map +1 -0
  596. package/dist/phase/config.js +54 -0
  597. package/dist/phase/config.js.map +1 -0
  598. package/dist/phase/consumed.d.ts +47 -0
  599. package/dist/phase/consumed.d.ts.map +1 -0
  600. package/dist/phase/consumed.js +22 -0
  601. package/dist/phase/consumed.js.map +1 -0
  602. package/dist/phase/conventionMining.d.ts +59 -0
  603. package/dist/phase/conventionMining.d.ts.map +1 -0
  604. package/dist/phase/conventionMining.js +152 -0
  605. package/dist/phase/conventionMining.js.map +1 -0
  606. package/dist/phase/coverage.d.ts +65 -0
  607. package/dist/phase/coverage.d.ts.map +1 -0
  608. package/dist/phase/coverage.js +121 -0
  609. package/dist/phase/coverage.js.map +1 -0
  610. package/dist/phase/dag.d.ts +49 -0
  611. package/dist/phase/dag.d.ts.map +1 -0
  612. package/dist/phase/dag.js +120 -0
  613. package/dist/phase/dag.js.map +1 -0
  614. package/dist/phase/dataAccessCalls.d.ts +33 -0
  615. package/dist/phase/dataAccessCalls.d.ts.map +1 -0
  616. package/dist/phase/dataAccessCalls.js +42 -0
  617. package/dist/phase/dataAccessCalls.js.map +1 -0
  618. package/dist/phase/dataAccessCallsCandidates.d.ts +25 -0
  619. package/dist/phase/dataAccessCallsCandidates.d.ts.map +1 -0
  620. package/dist/phase/dataAccessCallsCandidates.js +27 -0
  621. package/dist/phase/dataAccessCallsCandidates.js.map +1 -0
  622. package/dist/phase/dynamicSql.d.ts +18 -0
  623. package/dist/phase/dynamicSql.d.ts.map +1 -0
  624. package/dist/phase/dynamicSql.js +20 -0
  625. package/dist/phase/dynamicSql.js.map +1 -0
  626. package/dist/phase/exportForm.d.ts +23 -0
  627. package/dist/phase/exportForm.d.ts.map +1 -0
  628. package/dist/phase/exportForm.js +29 -0
  629. package/dist/phase/exportForm.js.map +1 -0
  630. package/dist/phase/exportSymbols.d.ts +21 -0
  631. package/dist/phase/exportSymbols.d.ts.map +1 -0
  632. package/dist/phase/exportSymbols.js +28 -0
  633. package/dist/phase/exportSymbols.js.map +1 -0
  634. package/dist/phase/fileHeader.d.ts +15 -0
  635. package/dist/phase/fileHeader.d.ts.map +1 -0
  636. package/dist/phase/fileHeader.js +33 -0
  637. package/dist/phase/fileHeader.js.map +1 -0
  638. package/dist/phase/fileImports.d.ts +39 -0
  639. package/dist/phase/fileImports.d.ts.map +1 -0
  640. package/dist/phase/fileImports.js +138 -0
  641. package/dist/phase/fileImports.js.map +1 -0
  642. package/dist/phase/fileSymbols.d.ts +25 -0
  643. package/dist/phase/fileSymbols.d.ts.map +1 -0
  644. package/dist/phase/fileSymbols.js +302 -0
  645. package/dist/phase/fileSymbols.js.map +1 -0
  646. package/dist/phase/functionBodies.d.ts +28 -0
  647. package/dist/phase/functionBodies.d.ts.map +1 -0
  648. package/dist/phase/functionBodies.js +67 -0
  649. package/dist/phase/functionBodies.js.map +1 -0
  650. package/dist/phase/functionIndex.d.ts +28 -0
  651. package/dist/phase/functionIndex.d.ts.map +1 -0
  652. package/dist/phase/functionIndex.js +152 -0
  653. package/dist/phase/functionIndex.js.map +1 -0
  654. package/dist/phase/goFunctionAnalysis.d.ts +47 -0
  655. package/dist/phase/goFunctionAnalysis.d.ts.map +1 -0
  656. package/dist/phase/goFunctionAnalysis.js +291 -0
  657. package/dist/phase/goFunctionAnalysis.js.map +1 -0
  658. package/dist/phase/goFunctions.d.ts +38 -0
  659. package/dist/phase/goFunctions.d.ts.map +1 -0
  660. package/dist/phase/goFunctions.js +154 -0
  661. package/dist/phase/goFunctions.js.map +1 -0
  662. package/dist/phase/goImports.d.ts +29 -0
  663. package/dist/phase/goImports.d.ts.map +1 -0
  664. package/dist/phase/goImports.js +68 -0
  665. package/dist/phase/goImports.js.map +1 -0
  666. package/dist/phase/goPackageBindings.d.ts +22 -0
  667. package/dist/phase/goPackageBindings.d.ts.map +1 -0
  668. package/dist/phase/goPackageBindings.js +30 -0
  669. package/dist/phase/goPackageBindings.js.map +1 -0
  670. package/dist/phase/goSwitches.d.ts +28 -0
  671. package/dist/phase/goSwitches.d.ts.map +1 -0
  672. package/dist/phase/goSwitches.js +52 -0
  673. package/dist/phase/goSwitches.js.map +1 -0
  674. package/dist/phase/importForm.d.ts +20 -0
  675. package/dist/phase/importForm.d.ts.map +1 -0
  676. package/dist/phase/importForm.js +27 -0
  677. package/dist/phase/importForm.js.map +1 -0
  678. package/dist/phase/importSpecifiers.d.ts +20 -0
  679. package/dist/phase/importSpecifiers.d.ts.map +1 -0
  680. package/dist/phase/importSpecifiers.js +30 -0
  681. package/dist/phase/importSpecifiers.js.map +1 -0
  682. package/dist/phase/imports.d.ts +18 -0
  683. package/dist/phase/imports.d.ts.map +1 -0
  684. package/dist/phase/imports.js +25 -0
  685. package/dist/phase/imports.js.map +1 -0
  686. package/dist/phase/jsonDocument.d.ts +26 -0
  687. package/dist/phase/jsonDocument.d.ts.map +1 -0
  688. package/dist/phase/jsonDocument.js +36 -0
  689. package/dist/phase/jsonDocument.js.map +1 -0
  690. package/dist/phase/localBinding.d.ts +33 -0
  691. package/dist/phase/localBinding.d.ts.map +1 -0
  692. package/dist/phase/localBinding.js +208 -0
  693. package/dist/phase/localBinding.js.map +1 -0
  694. package/dist/phase/loopQueries.d.ts +31 -0
  695. package/dist/phase/loopQueries.d.ts.map +1 -0
  696. package/dist/phase/loopQueries.js +44 -0
  697. package/dist/phase/loopQueries.js.map +1 -0
  698. package/dist/phase/loopQueryCandidates.d.ts +26 -0
  699. package/dist/phase/loopQueryCandidates.d.ts.map +1 -0
  700. package/dist/phase/loopQueryCandidates.js +28 -0
  701. package/dist/phase/loopQueryCandidates.js.map +1 -0
  702. package/dist/phase/oracles.d.ts +216 -0
  703. package/dist/phase/oracles.d.ts.map +1 -0
  704. package/dist/phase/oracles.js +484 -0
  705. package/dist/phase/oracles.js.map +1 -0
  706. package/dist/phase/phaseModel.d.ts +190 -0
  707. package/dist/phase/phaseModel.d.ts.map +1 -0
  708. package/dist/phase/phaseModel.js +468 -0
  709. package/dist/phase/phaseModel.js.map +1 -0
  710. package/dist/phase/producers.d.ts +450 -0
  711. package/dist/phase/producers.d.ts.map +1 -0
  712. package/dist/phase/producers.js +1027 -0
  713. package/dist/phase/producers.js.map +1 -0
  714. package/dist/phase/querySiteCandidates.d.ts +27 -0
  715. package/dist/phase/querySiteCandidates.d.ts.map +1 -0
  716. package/dist/phase/querySiteCandidates.js +66 -0
  717. package/dist/phase/querySiteCandidates.js.map +1 -0
  718. package/dist/phase/querySites.d.ts +30 -0
  719. package/dist/phase/querySites.d.ts.map +1 -0
  720. package/dist/phase/querySites.js +93 -0
  721. package/dist/phase/querySites.js.map +1 -0
  722. package/dist/phase/reachability.d.ts +61 -0
  723. package/dist/phase/reachability.d.ts.map +1 -0
  724. package/dist/phase/reachability.js +104 -0
  725. package/dist/phase/reachability.js.map +1 -0
  726. package/dist/phase/reactComponents.d.ts +33 -0
  727. package/dist/phase/reactComponents.d.ts.map +1 -0
  728. package/dist/phase/reactComponents.js +47 -0
  729. package/dist/phase/reactComponents.js.map +1 -0
  730. package/dist/phase/receiverActivity.d.ts +35 -0
  731. package/dist/phase/receiverActivity.d.ts.map +1 -0
  732. package/dist/phase/receiverActivity.js +66 -0
  733. package/dist/phase/receiverActivity.js.map +1 -0
  734. package/dist/phase/receiverConsumers.d.ts +200 -0
  735. package/dist/phase/receiverConsumers.d.ts.map +1 -0
  736. package/dist/phase/receiverConsumers.js +1025 -0
  737. package/dist/phase/receiverConsumers.js.map +1 -0
  738. package/dist/phase/receiverProvenance.d.ts +97 -0
  739. package/dist/phase/receiverProvenance.d.ts.map +1 -0
  740. package/dist/phase/receiverProvenance.js +337 -0
  741. package/dist/phase/receiverProvenance.js.map +1 -0
  742. package/dist/phase/routing.d.ts +47 -0
  743. package/dist/phase/routing.d.ts.map +1 -0
  744. package/dist/phase/routing.js +62 -0
  745. package/dist/phase/routing.js.map +1 -0
  746. package/dist/phase/rules/conventions.d.ts +61 -0
  747. package/dist/phase/rules/conventions.d.ts.map +1 -0
  748. package/dist/phase/rules/conventions.js +403 -0
  749. package/dist/phase/rules/conventions.js.map +1 -0
  750. package/dist/phase/rules/crossDomain.d.ts +102 -0
  751. package/dist/phase/rules/crossDomain.d.ts.map +1 -0
  752. package/dist/phase/rules/crossDomain.js +918 -0
  753. package/dist/phase/rules/crossDomain.js.map +1 -0
  754. package/dist/phase/rules/dataAccess.d.ts +62 -0
  755. package/dist/phase/rules/dataAccess.d.ts.map +1 -0
  756. package/dist/phase/rules/dataAccess.js +480 -0
  757. package/dist/phase/rules/dataAccess.js.map +1 -0
  758. package/dist/phase/rules/dependencyGraph.d.ts +44 -0
  759. package/dist/phase/rules/dependencyGraph.d.ts.map +1 -0
  760. package/dist/phase/rules/dependencyGraph.js +260 -0
  761. package/dist/phase/rules/dependencyGraph.js.map +1 -0
  762. package/dist/phase/rules/documentation.d.ts +45 -0
  763. package/dist/phase/rules/documentation.d.ts.map +1 -0
  764. package/dist/phase/rules/documentation.js +340 -0
  765. package/dist/phase/rules/documentation.js.map +1 -0
  766. package/dist/phase/rules/dry.d.ts +109 -0
  767. package/dist/phase/rules/dry.d.ts.map +1 -0
  768. package/dist/phase/rules/dry.js +803 -0
  769. package/dist/phase/rules/dry.js.map +1 -0
  770. package/dist/phase/rules/fileDocumentation.d.ts +36 -0
  771. package/dist/phase/rules/fileDocumentation.d.ts.map +1 -0
  772. package/dist/phase/rules/fileDocumentation.js +134 -0
  773. package/dist/phase/rules/fileDocumentation.js.map +1 -0
  774. package/dist/phase/rules/functionBodies.d.ts +33 -0
  775. package/dist/phase/rules/functionBodies.d.ts.map +1 -0
  776. package/dist/phase/rules/functionBodies.js +71 -0
  777. package/dist/phase/rules/functionBodies.js.map +1 -0
  778. package/dist/phase/rules/goRules.d.ts +49 -0
  779. package/dist/phase/rules/goRules.d.ts.map +1 -0
  780. package/dist/phase/rules/goRules.js +209 -0
  781. package/dist/phase/rules/goRules.js.map +1 -0
  782. package/dist/phase/rules/querySites.d.ts +29 -0
  783. package/dist/phase/rules/querySites.d.ts.map +1 -0
  784. package/dist/phase/rules/querySites.js +94 -0
  785. package/dist/phase/rules/querySites.js.map +1 -0
  786. package/dist/phase/rules/react.d.ts +38 -0
  787. package/dist/phase/rules/react.d.ts.map +1 -0
  788. package/dist/phase/rules/react.js +202 -0
  789. package/dist/phase/rules/react.js.map +1 -0
  790. package/dist/phase/rules/registry.d.ts +170 -0
  791. package/dist/phase/rules/registry.d.ts.map +1 -0
  792. package/dist/phase/rules/registry.js +103 -0
  793. package/dist/phase/rules/registry.js.map +1 -0
  794. package/dist/phase/rules/schema.d.ts +79 -0
  795. package/dist/phase/rules/schema.d.ts.map +1 -0
  796. package/dist/phase/rules/schema.js +273 -0
  797. package/dist/phase/rules/schema.js.map +1 -0
  798. package/dist/phase/rules/schemaJson.d.ts +32 -0
  799. package/dist/phase/rules/schemaJson.d.ts.map +1 -0
  800. package/dist/phase/rules/schemaJson.js +81 -0
  801. package/dist/phase/rules/schemaJson.js.map +1 -0
  802. package/dist/phase/rules/schemaValidator.d.ts +38 -0
  803. package/dist/phase/rules/schemaValidator.d.ts.map +1 -0
  804. package/dist/phase/rules/schemaValidator.js +107 -0
  805. package/dist/phase/rules/schemaValidator.js.map +1 -0
  806. package/dist/phase/rules/secrets.d.ts +34 -0
  807. package/dist/phase/rules/secrets.d.ts.map +1 -0
  808. package/dist/phase/rules/secrets.js +208 -0
  809. package/dist/phase/rules/secrets.js.map +1 -0
  810. package/dist/phase/rules/security.d.ts +30 -0
  811. package/dist/phase/rules/security.d.ts.map +1 -0
  812. package/dist/phase/rules/security.js +85 -0
  813. package/dist/phase/rules/security.js.map +1 -0
  814. package/dist/phase/rules/securityDefects.d.ts +37 -0
  815. package/dist/phase/rules/securityDefects.d.ts.map +1 -0
  816. package/dist/phase/rules/securityDefects.js +167 -0
  817. package/dist/phase/rules/securityDefects.js.map +1 -0
  818. package/dist/phase/rules/solid.d.ts +61 -0
  819. package/dist/phase/rules/solid.d.ts.map +1 -0
  820. package/dist/phase/rules/solid.js +562 -0
  821. package/dist/phase/rules/solid.js.map +1 -0
  822. package/dist/phase/rules/styles.d.ts +77 -0
  823. package/dist/phase/rules/styles.d.ts.map +1 -0
  824. package/dist/phase/rules/styles.js +868 -0
  825. package/dist/phase/rules/styles.js.map +1 -0
  826. package/dist/phase/rules/unreferencedModule.d.ts +26 -0
  827. package/dist/phase/rules/unreferencedModule.d.ts.map +1 -0
  828. package/dist/phase/rules/unreferencedModule.js +61 -0
  829. package/dist/phase/rules/unreferencedModule.js.map +1 -0
  830. package/dist/phase/runner.d.ts +549 -0
  831. package/dist/phase/runner.d.ts.map +1 -0
  832. package/dist/phase/runner.js +1098 -0
  833. package/dist/phase/runner.js.map +1 -0
  834. package/dist/phase/schemaCode.d.ts +34 -0
  835. package/dist/phase/schemaCode.d.ts.map +1 -0
  836. package/dist/phase/schemaCode.js +53 -0
  837. package/dist/phase/schemaCode.js.map +1 -0
  838. package/dist/phase/schemaObjects.d.ts +37 -0
  839. package/dist/phase/schemaObjects.d.ts.map +1 -0
  840. package/dist/phase/schemaObjects.js +139 -0
  841. package/dist/phase/schemaObjects.js.map +1 -0
  842. package/dist/phase/schemaUsage.d.ts +30 -0
  843. package/dist/phase/schemaUsage.d.ts.map +1 -0
  844. package/dist/phase/schemaUsage.js +99 -0
  845. package/dist/phase/schemaUsage.js.map +1 -0
  846. package/dist/phase/schemaUsageCandidates.d.ts +32 -0
  847. package/dist/phase/schemaUsageCandidates.d.ts.map +1 -0
  848. package/dist/phase/schemaUsageCandidates.js +165 -0
  849. package/dist/phase/schemaUsageCandidates.js.map +1 -0
  850. package/dist/phase/schemaValidations.d.ts +34 -0
  851. package/dist/phase/schemaValidations.d.ts.map +1 -0
  852. package/dist/phase/schemaValidations.js +53 -0
  853. package/dist/phase/schemaValidations.js.map +1 -0
  854. package/dist/phase/secretCandidates.d.ts +28 -0
  855. package/dist/phase/secretCandidates.d.ts.map +1 -0
  856. package/dist/phase/secretCandidates.js +132 -0
  857. package/dist/phase/secretCandidates.js.map +1 -0
  858. package/dist/phase/securityCandidates.d.ts +29 -0
  859. package/dist/phase/securityCandidates.d.ts.map +1 -0
  860. package/dist/phase/securityCandidates.js +469 -0
  861. package/dist/phase/securityCandidates.js.map +1 -0
  862. package/dist/phase/seeded-defects.d.ts +18 -0
  863. package/dist/phase/seeded-defects.d.ts.map +1 -0
  864. package/dist/phase/seeded-defects.js +61 -0
  865. package/dist/phase/seeded-defects.js.map +1 -0
  866. package/dist/phase/stringLiterals.d.ts +24 -0
  867. package/dist/phase/stringLiterals.d.ts.map +1 -0
  868. package/dist/phase/stringLiterals.js +35 -0
  869. package/dist/phase/stringLiterals.js.map +1 -0
  870. package/dist/phase/stylesCss.d.ts +25 -0
  871. package/dist/phase/stylesCss.d.ts.map +1 -0
  872. package/dist/phase/stylesCss.js +34 -0
  873. package/dist/phase/stylesCss.js.map +1 -0
  874. package/dist/phase/stylesMarkup.d.ts +31 -0
  875. package/dist/phase/stylesMarkup.d.ts.map +1 -0
  876. package/dist/phase/stylesMarkup.js +48 -0
  877. package/dist/phase/stylesMarkup.js.map +1 -0
  878. package/dist/phase/stylesSource.d.ts +36 -0
  879. package/dist/phase/stylesSource.d.ts.map +1 -0
  880. package/dist/phase/stylesSource.js +50 -0
  881. package/dist/phase/stylesSource.js.map +1 -0
  882. package/dist/phase/typeDeclarations.d.ts +33 -0
  883. package/dist/phase/typeDeclarations.d.ts.map +1 -0
  884. package/dist/phase/typeDeclarations.js +76 -0
  885. package/dist/phase/typeDeclarations.js.map +1 -0
  886. package/dist/phase/types.d.ts +2191 -0
  887. package/dist/phase/types.d.ts.map +1 -0
  888. package/dist/phase/types.js +27 -0
  889. package/dist/phase/types.js.map +1 -0
  890. package/dist/phase/withinFileProvenance.d.ts +50 -0
  891. package/dist/phase/withinFileProvenance.d.ts.map +1 -0
  892. package/dist/phase/withinFileProvenance.js +112 -0
  893. package/dist/phase/withinFileProvenance.js.map +1 -0
  894. package/dist/pipeline.d.ts +37 -30
  895. package/dist/pipeline.d.ts.map +1 -1
  896. package/dist/pipeline.js +131 -326
  897. package/dist/pipeline.js.map +1 -1
  898. package/dist/pipelineAdapters.d.ts +104 -21
  899. package/dist/pipelineAdapters.d.ts.map +1 -1
  900. package/dist/pipelineAdapters.js +1144 -984
  901. package/dist/pipelineAdapters.js.map +1 -1
  902. package/dist/pipelineTypes.d.ts +21 -0
  903. package/dist/pipelineTypes.d.ts.map +1 -1
  904. package/dist/pipelineTypes.js +21 -10
  905. package/dist/pipelineTypes.js.map +1 -1
  906. package/dist/presets/presets.d.ts +9 -2
  907. package/dist/presets/presets.d.ts.map +1 -1
  908. package/dist/presets/presets.js +15 -26
  909. package/dist/presets/presets.js.map +1 -1
  910. package/dist/reporting/csvReportGenerator.d.ts +14 -3
  911. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  912. package/dist/reporting/csvReportGenerator.js +14 -3
  913. package/dist/reporting/csvReportGenerator.js.map +1 -1
  914. package/dist/reporting/htmlReportGenerator.d.ts +5 -1
  915. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  916. package/dist/reporting/htmlReportGenerator.js +5 -1
  917. package/dist/reporting/htmlReportGenerator.js.map +1 -1
  918. package/dist/reporting/jsonReportGenerator.d.ts +9 -2
  919. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  920. package/dist/reporting/jsonReportGenerator.js +19 -5
  921. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  922. package/dist/reporting/reportGenerator.d.ts +9 -2
  923. package/dist/reporting/reportGenerator.d.ts.map +1 -1
  924. package/dist/reporting/reportGenerator.js +9 -2
  925. package/dist/reporting/reportGenerator.js.map +1 -1
  926. package/dist/reporting/sarifReportGenerator.d.ts +14 -0
  927. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
  928. package/dist/reporting/sarifReportGenerator.js +14 -0
  929. package/dist/reporting/sarifReportGenerator.js.map +1 -1
  930. package/dist/reporting/sizeDistribution.d.ts +19 -2
  931. package/dist/reporting/sizeDistribution.d.ts.map +1 -1
  932. package/dist/reporting/sizeDistribution.js +23 -5
  933. package/dist/reporting/sizeDistribution.js.map +1 -1
  934. package/dist/ruleAliases.d.ts +6 -8
  935. package/dist/ruleAliases.d.ts.map +1 -1
  936. package/dist/ruleAliases.js +29 -4
  937. package/dist/ruleAliases.js.map +1 -1
  938. package/dist/search/QueryParser.d.ts +1 -0
  939. package/dist/search/QueryParser.d.ts.map +1 -1
  940. package/dist/search/QueryParser.js +32 -91
  941. package/dist/search/QueryParser.js.map +1 -1
  942. package/dist/services/CodeMapGenerator.d.ts +19 -20
  943. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  944. package/dist/services/CodeMapGenerator.js +214 -194
  945. package/dist/services/CodeMapGenerator.js.map +1 -1
  946. package/dist/services/ProjectTaskRepository.d.ts +65 -3
  947. package/dist/services/ProjectTaskRepository.d.ts.map +1 -1
  948. package/dist/services/ProjectTaskRepository.js +94 -25
  949. package/dist/services/ProjectTaskRepository.js.map +1 -1
  950. package/dist/services/auditJobService.d.ts +17 -1
  951. package/dist/services/auditJobService.d.ts.map +1 -1
  952. package/dist/services/auditJobService.js +16 -0
  953. package/dist/services/auditJobService.js.map +1 -1
  954. package/dist/services/fileAccounting.d.ts +43 -5
  955. package/dist/services/fileAccounting.d.ts.map +1 -1
  956. package/dist/services/fileAccounting.js +48 -9
  957. package/dist/services/fileAccounting.js.map +1 -1
  958. package/dist/services/projectTaskHelpers.d.ts +45 -0
  959. package/dist/services/projectTaskHelpers.d.ts.map +1 -1
  960. package/dist/services/projectTaskHelpers.js +45 -0
  961. package/dist/services/projectTaskHelpers.js.map +1 -1
  962. package/dist/services/whitelistService.d.ts +40 -5
  963. package/dist/services/whitelistService.d.ts.map +1 -1
  964. package/dist/services/whitelistService.js +87 -46
  965. package/dist/services/whitelistService.js.map +1 -1
  966. package/dist/sqlite/betterSqlite3.d.ts +35 -1
  967. package/dist/sqlite/betterSqlite3.d.ts.map +1 -1
  968. package/dist/sqlite/betterSqlite3.js +35 -1
  969. package/dist/sqlite/betterSqlite3.js.map +1 -1
  970. package/dist/sqlite/driver.d.ts +23 -0
  971. package/dist/sqlite/driver.d.ts.map +1 -1
  972. package/dist/sqlite/driver.js +23 -0
  973. package/dist/sqlite/driver.js.map +1 -1
  974. package/dist/sqlite/nodeSqlite.d.ts +35 -1
  975. package/dist/sqlite/nodeSqlite.d.ts.map +1 -1
  976. package/dist/sqlite/nodeSqlite.js +35 -1
  977. package/dist/sqlite/nodeSqlite.js.map +1 -1
  978. package/dist/structuralSignature.d.ts +9 -0
  979. package/dist/structuralSignature.d.ts.map +1 -1
  980. package/dist/structuralSignature.js +9 -0
  981. package/dist/structuralSignature.js.map +1 -1
  982. package/dist/styles/cssAstExtractor.d.ts +15 -0
  983. package/dist/styles/cssAstExtractor.d.ts.map +1 -1
  984. package/dist/styles/cssAstExtractor.js +15 -0
  985. package/dist/styles/cssAstExtractor.js.map +1 -1
  986. package/dist/styles/normalizer.d.ts +6 -0
  987. package/dist/styles/normalizer.d.ts.map +1 -1
  988. package/dist/styles/normalizer.js +6 -0
  989. package/dist/styles/normalizer.js.map +1 -1
  990. package/dist/styles/styleExtractor.d.ts +29 -2
  991. package/dist/styles/styleExtractor.d.ts.map +1 -1
  992. package/dist/styles/styleExtractor.js +67 -48
  993. package/dist/styles/styleExtractor.js.map +1 -1
  994. package/dist/styles/styleIndexer.d.ts +8 -0
  995. package/dist/styles/styleIndexer.d.ts.map +1 -1
  996. package/dist/styles/styleIndexer.js +135 -138
  997. package/dist/styles/styleIndexer.js.map +1 -1
  998. package/dist/styles/tailwindConfigLoader.d.ts +12 -0
  999. package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
  1000. package/dist/styles/tailwindConfigLoader.js +12 -0
  1001. package/dist/styles/tailwindConfigLoader.js.map +1 -1
  1002. package/dist/styles/tailwindExpander.d.ts +3 -0
  1003. package/dist/styles/tailwindExpander.d.ts.map +1 -1
  1004. package/dist/styles/tailwindExpander.js +8 -4
  1005. package/dist/styles/tailwindExpander.js.map +1 -1
  1006. package/dist/styles/tailwindProbe.d.ts +9 -0
  1007. package/dist/styles/tailwindProbe.d.ts.map +1 -1
  1008. package/dist/styles/tailwindProbe.js +181 -166
  1009. package/dist/styles/tailwindProbe.js.map +1 -1
  1010. package/dist/styles/tailwindUtilityExpander.d.ts +13 -0
  1011. package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
  1012. package/dist/styles/tailwindUtilityExpander.js +13 -0
  1013. package/dist/styles/tailwindUtilityExpander.js.map +1 -1
  1014. package/dist/symbols.d.ts +13 -11
  1015. package/dist/symbols.d.ts.map +1 -1
  1016. package/dist/symbols.js +14 -21
  1017. package/dist/symbols.js.map +1 -1
  1018. package/dist/telemetry.d.ts +31 -3
  1019. package/dist/telemetry.d.ts.map +1 -1
  1020. package/dist/telemetry.js +31 -3
  1021. package/dist/telemetry.js.map +1 -1
  1022. package/dist/tool-registry.d.ts +37 -1
  1023. package/dist/tool-registry.d.ts.map +1 -1
  1024. package/dist/tool-registry.js +37 -1
  1025. package/dist/tool-registry.js.map +1 -1
  1026. package/dist/types.d.ts +101 -71
  1027. package/dist/types.d.ts.map +1 -1
  1028. package/dist/types.js +7 -16
  1029. package/dist/types.js.map +1 -1
  1030. package/dist/ui/InteractivePrompts.d.ts +12 -0
  1031. package/dist/ui/InteractivePrompts.d.ts.map +1 -1
  1032. package/dist/ui/InteractivePrompts.js +12 -0
  1033. package/dist/ui/InteractivePrompts.js.map +1 -1
  1034. package/dist/utils/astParser.d.ts +15 -0
  1035. package/dist/utils/astParser.d.ts.map +1 -1
  1036. package/dist/utils/astParser.js +15 -0
  1037. package/dist/utils/astParser.js.map +1 -1
  1038. package/dist/utils/astUtils.d.ts +60 -0
  1039. package/dist/utils/astUtils.d.ts.map +1 -1
  1040. package/dist/utils/astUtils.js +350 -362
  1041. package/dist/utils/astUtils.js.map +1 -1
  1042. package/dist/utils/contentHash.d.ts +22 -0
  1043. package/dist/utils/contentHash.d.ts.map +1 -0
  1044. package/dist/utils/contentHash.js +26 -0
  1045. package/dist/utils/contentHash.js.map +1 -0
  1046. package/dist/utils/dependencyExtractor.d.ts +28 -0
  1047. package/dist/utils/dependencyExtractor.d.ts.map +1 -1
  1048. package/dist/utils/dependencyExtractor.js +28 -1
  1049. package/dist/utils/dependencyExtractor.js.map +1 -1
  1050. package/dist/utils/errorMessage.d.ts +10 -0
  1051. package/dist/utils/errorMessage.d.ts.map +1 -0
  1052. package/dist/utils/errorMessage.js +12 -0
  1053. package/dist/utils/errorMessage.js.map +1 -0
  1054. package/dist/utils/fileDiscovery.d.ts +61 -2
  1055. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  1056. package/dist/utils/fileDiscovery.js +131 -23
  1057. package/dist/utils/fileDiscovery.js.map +1 -1
  1058. package/dist/utils/reactDetection.d.ts +34 -5
  1059. package/dist/utils/reactDetection.d.ts.map +1 -1
  1060. package/dist/utils/reactDetection.js +73 -52
  1061. package/dist/utils/reactDetection.js.map +1 -1
  1062. package/dist/version.generated.d.ts +1 -1
  1063. package/dist/version.generated.js +1 -1
  1064. package/dist/workers/auditWorker.js +7 -3
  1065. package/dist/workers/auditWorker.js.map +1 -1
  1066. package/examples/.auditrc.example.json +0 -8
  1067. package/examples/.auditrc.json +0 -11
  1068. package/examples/.code-auditor.json +0 -2
  1069. package/examples/nextjs.auditrc.json +0 -8
  1070. package/examples/node-api.auditrc.json +0 -7
  1071. package/examples/react.auditrc.json +0 -6
  1072. package/examples/tolerant-solid.auditrc.json +0 -5
  1073. package/package.json +11 -5
  1074. package/plugin/.claude-plugin/manifest.json +16 -0
  1075. package/plugin/.claude-plugin/plugin.json +1 -1
  1076. package/plugin/hooks/hooks.json +6 -2
  1077. package/plugin/scripts/hook-audit.sh +41 -14
  1078. package/plugin/scripts/hook-common.sh +50 -5
  1079. package/plugin/scripts/hook-drift-check.sh +72 -0
  1080. package/plugin/scripts/hook-self-audit.sh +17 -12
  1081. package/plugin/skills/code-auditor/SKILL.md +1 -1
  1082. package/server.json +2 -2
package/dist/mcp.js CHANGED
@@ -66,8 +66,9 @@ import chalk from 'chalk';
66
66
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
67
67
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
68
68
  import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
69
- import { createWriteStream, mkdirSync } from 'node:fs';
69
+ import { createWriteStream, mkdirSync, realpathSync } from 'node:fs';
70
70
  import fs from 'node:fs/promises';
71
+ import { fileURLToPath } from 'node:url';
71
72
  import { createAuditRunner } from './auditRunner.js';
72
73
  import { searchFunctions, findDefinition, syncFileIndex, getDatabase } from './codeIndexService.js';
73
74
  import { CodeMapGenerator } from './services/CodeMapGenerator.js';
@@ -75,17 +76,21 @@ import { analyzeDocumentation } from './analyzers/documentationAnalyzer.js';
75
76
  import { ConfigGeneratorFactory } from './generators/ConfigGeneratorFactory.js';
76
77
  import { resolveConfigGenerateDir } from './config/configGeneratePath.js';
77
78
  import { getInstallId, getTelemetryOptIn, setTelemetryOptIn, PRIVACY_MESSAGE, resolveTelemetryEndpoint } from './installConfig.js';
78
- import { MCP_DEFAULT_ANALYZERS } from './analyzers/ruleRegistry.js';
79
79
  import { DEFAULT_SERVER_URL, IS_DEV_MODE, PACKAGE_VERSION } from './constants.js';
80
80
  import { resolveMcpDevLogPath } from './dataPaths.js';
81
81
  import { getAuditJobStatus, getAuditResultsPage, getAuditResultsAsSarif, startAuditJob } from './mcpAuditJobs.js';
82
82
  import { CodeIndexDB } from './codeIndexDB.js';
83
+ import { errorMessage } from './utils/errorMessage.js';
83
84
  import { logMcpDebug, logMcpInfo, mcpDebugStderr, mcpTraceStderr } from './mcpDiagnostics.js';
84
85
  import { assertAuditPathExists, formatMcpToolErrorPayload } from './mcpToolErrors.js';
85
86
  import { ToolRegistry } from './tool-registry.js';
86
87
  import { initParsers } from './languages/index.js';
87
88
  // ── Console / logging setup ──────────────────────────────────────────────────
88
89
  const originalConsoleError = console.error;
90
+ // Tool input-schema descriptions, hoisted so the repeated schema entries
91
+ // share one source.
92
+ const OPTION_ANALYZER_OVERRIDES = 'Analyzer-specific configuration overrides.';
93
+ const PROJECT_ROOT_DESCRIPTION = 'Project root.';
89
94
  let logStream = null;
90
95
  if (IS_DEV_MODE) {
91
96
  // Dev mode is opt-in (`--dev`); even so, the log lives in the OS cache, never
@@ -134,10 +139,17 @@ async function withAbortSignal(signal, phase, op) {
134
139
  return new Promise((resolve, reject) => {
135
140
  const onAbort = () => reject(new RequestAbortedError(`Request aborted during ${phase}`));
136
141
  signal.addEventListener('abort', onAbort, { once: true });
137
- void op()
138
- .then(resolve)
139
- .catch(reject)
140
- .finally(() => signal.removeEventListener('abort', onAbort));
142
+ void (async () => {
143
+ try {
144
+ resolve(await op());
145
+ }
146
+ catch (err) {
147
+ reject(err);
148
+ }
149
+ finally {
150
+ signal.removeEventListener('abort', onAbort);
151
+ }
152
+ })();
141
153
  });
142
154
  }
143
155
  function serializeForMcp(value) {
@@ -209,469 +221,386 @@ function registerProcessReliabilityHandlers() {
209
221
  }
210
222
  }
211
223
  // ── Tool registration ────────────────────────────────────────────────────────
212
- const DEFAULT_ANALYZERS = [...MCP_DEFAULT_ANALYZERS];
213
- function registerAllTools(registry) {
214
- // ── audit ──────────────────────────────────────────────────────────────────
215
- const auditActions = [
216
- {
217
- name: 'run',
218
- description: 'Run a synchronous audit on the specified path. Returns a full audit result with violations.',
219
- parameters: [
220
- {
221
- name: 'path',
222
- type: 'string',
223
- required: false,
224
- description: 'File or directory path to audit (defaults to current directory).',
225
- default: process.cwd(),
226
- },
227
- {
228
- name: 'analyzers',
229
- type: 'array',
230
- required: false,
231
- description: `Analyzers to run (default: ${DEFAULT_ANALYZERS.join(', ')}).`,
232
- default: DEFAULT_ANALYZERS,
233
- },
234
- {
235
- name: 'minSeverity',
236
- type: 'string',
237
- required: false,
238
- description: 'Minimum severity level to report (high included by default).',
239
- default: 'high',
240
- enum: ['high', 'severe', 'critical'],
241
- },
242
- {
243
- name: 'indexFunctions',
244
- type: 'boolean',
245
- required: false,
246
- description: 'Index functions during audit (default: true).',
247
- default: true,
248
- },
249
- {
250
- name: 'analyzerConfigs',
251
- type: 'object',
252
- required: false,
253
- description: 'Analyzer-specific configuration overrides.',
254
- },
255
- {
256
- name: 'scope',
257
- type: 'string',
258
- required: false,
259
- description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
260
- default: 'all',
261
- },
262
- ],
263
- handler: async (args, signal) => {
264
- return withAbortSignal(signal, 'audit.run', async () => {
265
- const auditPath = path.resolve(args.path || process.cwd());
266
- await assertAuditPathExists(auditPath);
267
- const analyzers = args.analyzers ?? DEFAULT_ANALYZERS;
268
- const minSeverity = (args.minSeverity || 'high');
269
- const indexFunctions = args.indexFunctions !== false;
270
- const db = CodeIndexDB.getInstance();
271
- await db.initialize();
272
- const storedConfigs = await db.getAllAnalyzerConfigs(auditPath);
273
- const analyzerConfigs = {
274
- ...storedConfigs,
275
- ...(args.analyzerConfigs || {}),
276
- };
277
- const scope = args.scope || 'all';
278
- const runner = createAuditRunner({
279
- projectRoot: auditPath,
280
- enabledAnalyzers: analyzers,
281
- minSeverity,
282
- verbose: false,
283
- indexFunctions,
284
- scope: scope !== 'all' ? scope : undefined,
285
- ...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
286
- });
287
- const auditResult = await runner.run();
288
- if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
289
- try {
290
- for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
291
- await syncFileIndex(filePath, functions);
292
- }
293
- }
294
- catch {
295
- // indexing is best-effort for sync audit
296
- }
297
- }
298
- return {
299
- success: true,
300
- summary: auditResult.summary,
301
- violations: auditResult.analyzerResults,
302
- metadata: auditResult.metadata,
303
- guidance: 'The audit takes readings, not verdicts. Severity is urgency — how fast a defect bites, never whether you may ignore it; there is no "noise" tier. Work criticals first, then severe, then high. The coverage panel tells you what was actually measured. Documentation readings (missing JSDoc) are maintainability gaps. If you decline a reading, record why instead of silently dismissing it.',
304
- };
305
- });
224
+ // ── audit ──────────────────────────────────────────────────────────────────
225
+ const auditActions = [
226
+ {
227
+ name: 'run',
228
+ description: 'Run a synchronous audit on the specified path. Returns a full audit result with violations.',
229
+ parameters: [
230
+ {
231
+ name: 'path',
232
+ type: 'string',
233
+ required: false,
234
+ description: 'File or directory path to audit (defaults to current directory).',
235
+ default: process.cwd(),
306
236
  },
307
- },
308
- {
309
- name: 'start',
310
- description: 'Start a background audit job. Returns immediately with a jobId. Poll `audit.status` until completed, then fetch pages with `audit.results`.',
311
- parameters: [
312
- {
313
- name: 'path',
314
- type: 'string',
315
- required: false,
316
- description: 'File or directory path to audit (defaults to current directory).',
317
- default: process.cwd(),
318
- },
319
- {
320
- name: 'analyzers',
321
- type: 'array',
322
- required: false,
323
- description: `Analyzers to run (default: ${DEFAULT_ANALYZERS.join(', ')}).`,
324
- default: DEFAULT_ANALYZERS,
325
- },
326
- {
327
- name: 'minSeverity',
328
- type: 'string',
329
- required: false,
330
- description: 'Minimum severity level to report (high included by default).',
331
- default: 'high',
332
- enum: ['high', 'severe', 'critical'],
333
- },
334
- {
335
- name: 'indexFunctions',
336
- type: 'boolean',
337
- required: false,
338
- description: 'Index functions during audit (default: true).',
339
- default: true,
340
- },
341
- {
342
- name: 'analyzerConfigs',
343
- type: 'object',
344
- required: false,
345
- description: 'Analyzer-specific configuration overrides.',
346
- },
347
- {
348
- name: 'scope',
349
- type: 'string',
350
- required: false,
351
- description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
352
- default: 'all',
353
- },
354
- {
355
- name: 'analyzerConcurrency',
356
- type: 'number',
357
- required: false,
358
- description: 'Max analyzers to run in parallel (default: 1).',
359
- default: 1,
360
- },
361
- {
362
- name: 'partitionStrategy',
363
- type: 'string',
364
- required: false,
365
- description: 'Partition mode: none | auto | top-level.',
366
- default: 'auto',
367
- enum: ['none', 'auto', 'top-level'],
368
- },
369
- {
370
- name: 'maxPartitions',
371
- type: 'number',
372
- required: false,
373
- description: 'Maximum number of folder partitions (default: 4).',
374
- default: 4,
375
- },
376
- {
377
- name: 'partitionThresholdFiles',
378
- type: 'number',
379
- required: false,
380
- description: 'Minimum files before auto partitioning (default: 250).',
381
- default: 250,
382
- },
383
- {
384
- name: 'workerCount',
385
- type: 'number',
386
- required: false,
387
- description: 'Number of worker processes (default: min(4, CPU-1)).',
388
- },
389
- {
390
- name: 'maxRetries',
391
- type: 'number',
392
- required: false,
393
- description: 'Retry attempts per shard (default: 1).',
394
- default: 1,
395
- },
396
- {
397
- name: 'shardTimeoutMs',
398
- type: 'number',
399
- required: false,
400
- description: 'Per-shard timeout in ms (default: 180000).',
401
- default: 180000,
402
- },
403
- {
404
- name: 'retryBackoffMs',
405
- type: 'number',
406
- required: false,
407
- description: 'Base retry backoff in ms (default: 500).',
408
- default: 500,
409
- },
410
- {
411
- name: 'jobTimeoutMs',
412
- type: 'number',
413
- required: false,
414
- description: 'Max wall time for the audit job (default 30m, cap 4h).',
415
- },
416
- {
417
- name: 'maxFilesPerRun',
418
- type: 'number',
419
- required: false,
420
- description: 'Per worker chunk size for file processing.',
421
- },
422
- {
423
- name: 'shardSoftBudgetMs',
424
- type: 'number',
425
- required: false,
426
- description: 'Per worker soft wall-clock budget.',
427
- },
428
- {
429
- name: 'generateCodeMap',
430
- type: 'boolean',
431
- required: false,
432
- description: 'Generate code map artifacts during audit (default: false).',
433
- default: false,
434
- },
435
- ],
436
- handler: async (args, signal) => {
437
- return withAbortSignal(signal, 'audit.start', () => startAuditJob(args, {
438
- defaultAnalyzers: DEFAULT_ANALYZERS,
439
- defaultMinSeverity: 'high',
440
- defaultGenerateCodeMap: false,
441
- }));
237
+ {
238
+ name: 'minSeverity',
239
+ type: 'string',
240
+ required: false,
241
+ description: 'Minimum severity level to report (high included by default).',
242
+ default: 'high',
243
+ enum: ['high', 'severe', 'critical'],
442
244
  },
443
- },
444
- {
445
- name: 'status',
446
- description: 'Get current status for a previously started background audit job.',
447
- parameters: [
448
- {
449
- name: 'jobId',
450
- type: 'string',
451
- required: true,
452
- description: 'Job ID returned by `audit start`.',
453
- },
454
- ],
455
- handler: async (args) => {
456
- const jobId = args.jobId;
457
- if (!jobId)
458
- throw new Error('audit.status requires jobId');
459
- return await getAuditJobStatus(jobId);
245
+ {
246
+ name: 'indexFunctions',
247
+ type: 'boolean',
248
+ required: false,
249
+ description: 'Index functions during audit (default: true).',
250
+ default: true,
460
251
  },
461
- },
462
- {
463
- name: 'results',
464
- description: 'Fetch paginated violations for a completed audit result by resultId.',
465
- parameters: [
466
- {
467
- name: 'resultId',
468
- type: 'string',
469
- required: false,
470
- description: 'Result ID returned by `audit status` when completed. Also accepts legacy `auditId`.',
471
- },
472
- {
473
- name: 'auditId',
474
- type: 'string',
475
- required: false,
476
- description: 'Backward-compatible alias for resultId.',
477
- },
478
- {
479
- name: 'limit',
480
- type: 'number',
481
- required: false,
482
- description: 'Maximum violations per page (default: 50, max: 100).',
483
- default: 50,
484
- },
485
- {
486
- name: 'offset',
487
- type: 'number',
488
- required: false,
489
- description: 'Violation offset for pagination (default: 0).',
490
- default: 0,
491
- },
492
- {
493
- name: 'format',
494
- type: 'string',
495
- required: false,
496
- description: 'Output format. "json" (default, structured data) or "sarif" (SARIF 2.1.0 JSON string).',
497
- },
498
- ],
499
- handler: async (args, signal) => {
500
- const format = args.format || 'json';
501
- if (format === 'sarif') {
502
- return withAbortSignal(signal, 'audit.results', () => getAuditResultsAsSarif(args));
503
- }
504
- return withAbortSignal(signal, 'audit.results', () => getAuditResultsPage(args));
252
+ {
253
+ name: 'analyzerConfigs',
254
+ type: 'object',
255
+ required: false,
256
+ description: OPTION_ANALYZER_OVERRIDES,
505
257
  },
506
- },
507
- {
508
- name: 'health',
509
- description: 'Quick health check of a codebase with key metrics and optional code map generation.',
510
- parameters: [
511
- {
512
- name: 'path',
513
- type: 'string',
514
- required: false,
515
- description: 'The directory path to check.',
516
- default: process.cwd(),
517
- },
518
- {
519
- name: 'threshold',
520
- type: 'number',
521
- required: false,
522
- description: 'Health score threshold (0-100) for pass/fail.',
523
- default: 70,
524
- },
525
- {
526
- name: 'indexFunctions',
527
- type: 'boolean',
528
- required: false,
529
- description: 'Automatically index functions during health check.',
530
- default: true,
531
- },
532
- {
533
- name: 'analyzerConfigs',
534
- type: 'object',
535
- required: false,
536
- description: 'Analyzer-specific configuration overrides.',
537
- },
538
- {
539
- name: 'generateCodeMap',
540
- type: 'boolean',
541
- required: false,
542
- description: 'Generate and return a human-readable code map.',
543
- default: true,
544
- },
545
- ],
546
- handler: async (args) => {
258
+ {
259
+ name: 'scope',
260
+ type: 'string',
261
+ required: false,
262
+ description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
263
+ default: 'all',
264
+ },
265
+ ],
266
+ handler: async (args, signal) => {
267
+ return withAbortSignal(signal, 'audit.run', async () => {
547
268
  const auditPath = path.resolve(args.path || process.cwd());
548
269
  await assertAuditPathExists(auditPath);
549
- const threshold = args.threshold || 70;
270
+ const minSeverity = (args.minSeverity || 'high');
550
271
  const indexFunctions = args.indexFunctions !== false;
551
- const generateCodeMap = args.generateCodeMap !== false;
552
272
  const db = CodeIndexDB.getInstance();
553
273
  await db.initialize();
554
- const storedConfigs = await db.getAllAnalyzerConfigs(auditPath);
274
+ const storedConfigs = await db.analyzerConfig.getAllAnalyzerConfigs(auditPath);
555
275
  const analyzerConfigs = {
556
276
  ...storedConfigs,
557
277
  ...(args.analyzerConfigs || {}),
558
278
  };
559
- const runner = createAuditRunner({
279
+ const scope = args.scope || 'all';
280
+ // Route through the single audit entry point shared with the CLI, so
281
+ // `.go` files dispatch to the Go phase rules instead of being silently
282
+ // skipped (task #255 — the stdio MCP server bypassed per-language
283
+ // dispatch and left every Go rule `notApplicable`).
284
+ const auditResult = await createAuditRunner({
560
285
  projectRoot: auditPath,
561
- enabledAnalyzers: DEFAULT_ANALYZERS,
562
- minSeverity: 'high',
286
+ minSeverity,
563
287
  verbose: false,
564
288
  indexFunctions,
289
+ scope: scope !== 'all' ? scope : undefined,
565
290
  ...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
566
- progressCallback: (p) => {
567
- if (p.phase === 'function-indexing' &&
568
- typeof p.current === 'number' &&
569
- typeof p.total === 'number' &&
570
- p.total > 0 &&
571
- p.current % 50 !== 0 &&
572
- p.current !== p.total)
573
- return;
574
- logMcpDebug('audit.health', p.message ?? p.phase ?? 'progress', {
575
- phase: p.phase,
576
- analyzer: p.analyzer,
577
- current: p.current,
578
- total: p.total,
579
- });
580
- },
581
- });
582
- const auditResult = await runner.run();
583
- const healthScore = calculateHealthScore(auditResult);
584
- let indexingResult = null;
291
+ }).run();
585
292
  if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
586
293
  try {
587
- const syncStats = { added: 0, updated: 0, removed: 0 };
588
294
  for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
589
- const fileStats = await syncFileIndex(filePath, functions);
590
- syncStats.added += fileStats.added;
591
- syncStats.updated += fileStats.updated;
592
- syncStats.removed += fileStats.removed;
295
+ await syncFileIndex(filePath, functions);
593
296
  }
594
- indexingResult = {
595
- success: true,
596
- registered: syncStats.added + syncStats.updated,
597
- failed: 0,
598
- syncStats,
599
- };
600
297
  }
601
298
  catch {
602
- // best-effort
299
+ // indexing is best-effort for sync audit
603
300
  }
604
301
  }
605
- let codeMapResult = null;
606
- if (generateCodeMap && indexingResult && indexingResult.success) {
302
+ return {
303
+ success: true,
304
+ summary: auditResult.summary,
305
+ violations: auditResult.analyzerResults,
306
+ metadata: auditResult.metadata,
307
+ guidance: 'The audit takes readings, not verdicts. Severity is urgency — how fast a defect bites, never whether you may ignore it; there is no "noise" tier. Work criticals first, then severe, then high. The coverage panel tells you what was actually measured. Documentation readings (missing JSDoc) are maintainability gaps. If you decline a reading, record why instead of silently dismissing it.',
308
+ };
309
+ });
310
+ },
311
+ },
312
+ {
313
+ name: 'start',
314
+ description: 'Start a background audit job. Returns immediately with a jobId. Poll `audit.status` until completed, then fetch pages with `audit.results`.',
315
+ parameters: [
316
+ {
317
+ name: 'path',
318
+ type: 'string',
319
+ required: false,
320
+ description: 'File or directory path to audit (defaults to current directory).',
321
+ default: process.cwd(),
322
+ },
323
+ {
324
+ name: 'minSeverity',
325
+ type: 'string',
326
+ required: false,
327
+ description: 'Minimum severity level to report (high included by default).',
328
+ default: 'high',
329
+ enum: ['high', 'severe', 'critical'],
330
+ },
331
+ {
332
+ name: 'indexFunctions',
333
+ type: 'boolean',
334
+ required: false,
335
+ description: 'Index functions during audit (default: true).',
336
+ default: true,
337
+ },
338
+ {
339
+ name: 'analyzerConfigs',
340
+ type: 'object',
341
+ required: false,
342
+ description: OPTION_ANALYZER_OVERRIDES,
343
+ },
344
+ {
345
+ name: 'scope',
346
+ type: 'string',
347
+ required: false,
348
+ description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
349
+ default: 'all',
350
+ },
351
+ {
352
+ name: 'jobTimeoutMs',
353
+ type: 'number',
354
+ required: false,
355
+ description: 'Max wall time for the audit job (default 30m, cap 4h).',
356
+ },
357
+ {
358
+ name: 'generateCodeMap',
359
+ type: 'boolean',
360
+ required: false,
361
+ description: 'Generate code map artifacts during audit (default: false).',
362
+ default: false,
363
+ },
364
+ ],
365
+ handler: async (args, signal) => {
366
+ return withAbortSignal(signal, 'audit.start', () => startAuditJob(args, {
367
+ defaultMinSeverity: 'high',
368
+ defaultGenerateCodeMap: false,
369
+ }));
370
+ },
371
+ },
372
+ {
373
+ name: 'status',
374
+ description: 'Get current status for a previously started background audit job.',
375
+ parameters: [
376
+ {
377
+ name: 'jobId',
378
+ type: 'string',
379
+ required: true,
380
+ description: 'Job ID returned by `audit start`.',
381
+ },
382
+ ],
383
+ handler: async (args) => {
384
+ const jobId = args.jobId;
385
+ if (!jobId)
386
+ throw new Error('audit.status requires jobId');
387
+ return await getAuditJobStatus(jobId);
388
+ },
389
+ },
390
+ {
391
+ name: 'results',
392
+ description: 'Fetch paginated violations for a completed audit result by resultId.',
393
+ parameters: [
394
+ {
395
+ name: 'resultId',
396
+ type: 'string',
397
+ required: false,
398
+ description: 'Result ID returned by `audit status` when completed. Also accepts legacy `auditId`.',
399
+ },
400
+ {
401
+ name: 'auditId',
402
+ type: 'string',
403
+ required: false,
404
+ description: 'Backward-compatible alias for resultId.',
405
+ },
406
+ {
407
+ name: 'limit',
408
+ type: 'number',
409
+ required: false,
410
+ description: 'Maximum violations per page (default: 50, max: 100).',
411
+ default: 50,
412
+ },
413
+ {
414
+ name: 'offset',
415
+ type: 'number',
416
+ required: false,
417
+ description: 'Violation offset for pagination (default: 0).',
418
+ default: 0,
419
+ },
420
+ {
421
+ name: 'format',
422
+ type: 'string',
423
+ required: false,
424
+ description: 'Output format. "json" (default, structured data) or "sarif" (SARIF 2.1.0 JSON string).',
425
+ },
426
+ ],
427
+ handler: async (args, signal) => {
428
+ const format = args.format || 'json';
429
+ if (format === 'sarif') {
430
+ return withAbortSignal(signal, 'audit.results', () => getAuditResultsAsSarif(args));
431
+ }
432
+ return withAbortSignal(signal, 'audit.results', () => getAuditResultsPage(args));
433
+ },
434
+ },
435
+ {
436
+ name: 'health',
437
+ description: 'Quick health check of a codebase with key metrics and optional code map generation.',
438
+ parameters: [
439
+ {
440
+ name: 'path',
441
+ type: 'string',
442
+ required: false,
443
+ description: 'The directory path to check.',
444
+ default: process.cwd(),
445
+ },
446
+ {
447
+ name: 'threshold',
448
+ type: 'number',
449
+ required: false,
450
+ description: 'Health score threshold (0-100) for pass/fail.',
451
+ default: 70,
452
+ },
453
+ {
454
+ name: 'indexFunctions',
455
+ type: 'boolean',
456
+ required: false,
457
+ description: 'Automatically index functions during health check.',
458
+ default: true,
459
+ },
460
+ {
461
+ name: 'analyzerConfigs',
462
+ type: 'object',
463
+ required: false,
464
+ description: OPTION_ANALYZER_OVERRIDES,
465
+ },
466
+ {
467
+ name: 'generateCodeMap',
468
+ type: 'boolean',
469
+ required: false,
470
+ description: 'Generate and return a human-readable code map.',
471
+ default: true,
472
+ },
473
+ ],
474
+ handler: async (args) => {
475
+ const auditPath = path.resolve(args.path || process.cwd());
476
+ await assertAuditPathExists(auditPath);
477
+ const threshold = args.threshold || 70;
478
+ const indexFunctions = args.indexFunctions !== false;
479
+ const generateCodeMap = args.generateCodeMap !== false;
480
+ const db = CodeIndexDB.getInstance();
481
+ await db.initialize();
482
+ const storedConfigs = await db.analyzerConfig.getAllAnalyzerConfigs(auditPath);
483
+ const analyzerConfigs = {
484
+ ...storedConfigs,
485
+ ...(args.analyzerConfigs || {}),
486
+ };
487
+ const auditResult = await createAuditRunner({
488
+ projectRoot: auditPath,
489
+ minSeverity: 'high',
490
+ verbose: false,
491
+ indexFunctions,
492
+ ...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
493
+ progressCallback: (p) => {
494
+ if (p.phase === 'function-indexing' &&
495
+ typeof p.current === 'number' &&
496
+ typeof p.total === 'number' &&
497
+ p.total > 0 &&
498
+ p.current % 50 !== 0 &&
499
+ p.current !== p.total)
500
+ return;
501
+ logMcpDebug('audit.health', p.message ?? p.phase ?? 'progress', {
502
+ phase: p.phase,
503
+ analyzer: p.analyzer,
504
+ current: p.current,
505
+ total: p.total,
506
+ });
507
+ },
508
+ }).run();
509
+ const healthScore = calculateHealthScore(auditResult);
510
+ let indexingResult = null;
511
+ if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
512
+ try {
513
+ const syncStats = { added: 0, updated: 0, removed: 0 };
514
+ for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
515
+ const fileStats = await syncFileIndex(filePath, functions);
516
+ syncStats.added += fileStats.added;
517
+ syncStats.updated += fileStats.updated;
518
+ syncStats.removed += fileStats.removed;
519
+ }
520
+ indexingResult = {
521
+ success: true,
522
+ registered: syncStats.added + syncStats.updated,
523
+ failed: 0,
524
+ syncStats,
525
+ };
526
+ }
527
+ catch {
528
+ // best-effort
529
+ }
530
+ }
531
+ let codeMapResult = null;
532
+ if (generateCodeMap && indexingResult && indexingResult.success) {
533
+ try {
534
+ const mapGenerator = new CodeMapGenerator();
535
+ const mapOptions = {
536
+ includeComplexity: true,
537
+ includeDocumentation: true,
538
+ includeDependencies: true,
539
+ includeUsage: false,
540
+ groupByDirectory: true,
541
+ maxDepth: 8,
542
+ showUnusedImports: true,
543
+ minComplexity: 7,
544
+ };
545
+ let documentation;
607
546
  try {
608
- const mapGenerator = new CodeMapGenerator();
609
- const mapOptions = {
610
- includeComplexity: true,
611
- includeDocumentation: true,
612
- includeDependencies: true,
613
- includeUsage: false,
614
- groupByDirectory: true,
615
- maxDepth: 8,
616
- showUnusedImports: true,
617
- minComplexity: 7,
618
- };
619
- let documentation;
620
- try {
621
- const files = Object.keys(auditResult.metadata.fileToFunctionsMap || {});
622
- if (files.length > 0) {
623
- const docResult = await analyzeDocumentation(files);
624
- documentation = docResult.metrics;
625
- }
626
- }
627
- catch {
628
- // best-effort
547
+ const files = Object.keys(auditResult.metadata.fileToFunctionsMap || {});
548
+ if (files.length > 0) {
549
+ const docResult = await analyzeDocumentation(files);
550
+ documentation = docResult.metrics;
629
551
  }
630
- const paginatedResult = await mapGenerator.generatePaginatedCodeMap(auditPath, {
631
- ...mapOptions,
632
- includeDocumentation: !!documentation,
633
- });
634
- codeMapResult = {
635
- success: true,
636
- mapId: paginatedResult.mapId,
637
- summary: paginatedResult.summary,
638
- quickPreview: paginatedResult.quickPreview,
639
- sections: paginatedResult.summary.sectionsAvailable,
640
- documentationCoverage: documentation?.coverageScore,
641
- };
642
552
  }
643
- catch (error) {
644
- codeMapResult = {
645
- success: false,
646
- error: error instanceof Error ? error.message : 'Failed to generate code map',
647
- };
553
+ catch {
554
+ // best-effort
648
555
  }
556
+ const paginatedResult = await mapGenerator.generatePaginatedCodeMap(auditPath, {
557
+ ...mapOptions,
558
+ includeDocumentation: !!documentation,
559
+ });
560
+ codeMapResult = {
561
+ success: true,
562
+ mapId: paginatedResult.mapId,
563
+ summary: paginatedResult.summary,
564
+ quickPreview: paginatedResult.quickPreview,
565
+ sections: paginatedResult.summary.sectionsAvailable,
566
+ documentationCoverage: documentation?.coverageScore,
567
+ };
649
568
  }
650
- return {
651
- healthScore,
652
- threshold,
653
- passed: healthScore >= threshold,
654
- status: healthScore >= threshold ? 'healthy' : 'needs-attention',
655
- metrics: {
656
- filesAnalyzed: auditResult.metadata.filesAnalyzed,
657
- totalViolations: auditResult.summary.totalViolations,
658
- criticalViolations: auditResult.summary.criticalIssues,
659
- severeViolations: auditResult.summary.severe,
660
- highViolations: auditResult.summary.high,
661
- },
662
- recommendation: getHealthRecommendation(healthScore, auditResult),
663
- ...(indexingResult && { functionIndexing: indexingResult }),
664
- ...(codeMapResult && { codeMap: codeMapResult }),
665
- };
666
- },
569
+ catch (error) {
570
+ codeMapResult = {
571
+ success: false,
572
+ error: error instanceof Error ? error.message : 'Failed to generate code map',
573
+ };
574
+ }
575
+ }
576
+ return {
577
+ healthScore,
578
+ threshold,
579
+ passed: healthScore >= threshold,
580
+ status: healthScore >= threshold ? 'healthy' : 'needs-attention',
581
+ metrics: {
582
+ filesAnalyzed: auditResult.metadata.filesAnalyzed,
583
+ totalViolations: auditResult.summary.totalViolations,
584
+ criticalViolations: auditResult.summary.criticalIssues,
585
+ severeViolations: auditResult.summary.severe,
586
+ highViolations: auditResult.summary.high,
587
+ },
588
+ recommendation: getHealthRecommendation(healthScore, auditResult),
589
+ ...(indexingResult && { functionIndexing: indexingResult }),
590
+ ...(codeMapResult && { codeMap: codeMapResult }),
591
+ };
667
592
  },
668
- ];
593
+ },
594
+ ];
595
+ function registerAuditTool(registry) {
669
596
  registry.register({
670
597
  name: 'audit',
671
598
  description: 'Run code quality audits (synchronous or background), check status, fetch paginated results, and get health checks. Actions: run (sync audit, returns full results), start (background job), status (poll a job), results (paginated violations), health (score + code map).',
672
599
  actions: auditActions,
673
600
  });
674
- // ── search ─────────────────────────────────────────────────────────────────
601
+ }
602
+ // ── search ─────────────────────────────────────────────────────────────────
603
+ function registerSearchTool(registry) {
675
604
  registry.register({
676
605
  name: 'search',
677
606
  description: 'Search indexed functions and components. Actions: query (natural language + operators like entity:, component:, hook:, dep:, calls:, lang:, complexity:, exported:, jsdoc:, file:, unused-imports, name:), definition (exact function/component lookup).',
@@ -745,7 +674,9 @@ function registerAllTools(registry) {
745
674
  },
746
675
  ],
747
676
  });
748
- // ── index ──────────────────────────────────────────────────────────────────
677
+ }
678
+ // ── index ──────────────────────────────────────────────────────────────────
679
+ function registerIndexTool(registry) {
749
680
  registry.register({
750
681
  name: 'index',
751
682
  description: 'Manage the code index. Actions: sync (update from files with optional auto-whitelist), cleanup (remove deleted files), reset (clear analysis data, preserve tasks/config/whitelist), status (index statistics).',
@@ -861,7 +792,7 @@ function registerAllTools(registry) {
861
792
  handler: async () => {
862
793
  const db = CodeIndexDB.getInstance();
863
794
  await db.initialize();
864
- const functionCount = await db.getFunctionCount();
795
+ const functionCount = await db.functionIndex.getFunctionCount();
865
796
  return {
866
797
  success: true,
867
798
  functionCount,
@@ -870,426 +801,431 @@ function registerAllTools(registry) {
870
801
  },
871
802
  ],
872
803
  });
873
- // ── config ─────────────────────────────────────────────────────────────────
874
- registry.register({
875
- name: 'config',
876
- description: 'Manage analyzer configurations, generate AI tool configs, manage whitelists, and manage invariant rules. Actions: get, set, reset (analyzer configs), generate (AI tool config files), whitelist_list, whitelist_add, whitelist_update, whitelist_detect, rules_list, rules_check.',
877
- actions: [
804
+ }
805
+ // ── config ─────────────────────────────────────────────────────────────────
806
+ const configActions = [
807
+ {
808
+ name: 'get',
809
+ description: 'Get current configuration for an analyzer (or all).',
810
+ parameters: [
878
811
  {
879
- name: 'get',
880
- description: 'Get current configuration for an analyzer (or all).',
881
- parameters: [
882
- {
883
- name: 'analyzerName',
884
- type: 'string',
885
- required: false,
886
- description: 'Specific analyzer name, or omit to get all configs.',
887
- },
888
- {
889
- name: 'projectPath',
890
- type: 'string',
891
- required: false,
892
- description: 'Optional project path for project-specific config.',
893
- },
894
- ],
895
- handler: async (args) => {
896
- const analyzerName = args.analyzerName;
897
- const projectPath = args.projectPath;
898
- const db = CodeIndexDB.getInstance();
899
- await db.initialize();
900
- if (analyzerName) {
901
- const config = await db.getAnalyzerConfig(analyzerName, projectPath);
902
- return {
903
- success: true,
904
- analyzer: analyzerName,
905
- config: config || null,
906
- scope: projectPath ? 'project' : 'global',
907
- message: config ? 'Configuration found' : 'No custom configuration found, using defaults',
908
- };
909
- }
910
- const configs = await db.getAllAnalyzerConfigs(projectPath);
911
- return {
912
- success: true,
913
- configs,
914
- scope: projectPath ? 'project' : 'global',
915
- message: `Found ${Object.keys(configs).length} analyzer configurations`,
916
- };
917
- },
812
+ name: 'analyzerName',
813
+ type: 'string',
814
+ required: false,
815
+ description: 'Specific analyzer name, or omit to get all configs.',
918
816
  },
919
817
  {
920
- name: 'set',
921
- description: 'Set or update analyzer configuration that persists across audit runs.',
922
- parameters: [
923
- {
924
- name: 'analyzerName',
925
- type: 'string',
926
- required: true,
927
- description: 'The analyzer to configure (solid, dry, security, etc.).',
928
- },
929
- {
930
- name: 'config',
931
- type: 'object',
932
- required: true,
933
- description: 'Configuration object for the analyzer (e.g., thresholds, rules).',
934
- },
935
- {
936
- name: 'projectPath',
937
- type: 'string',
938
- required: false,
939
- description: 'Optional project path for project-specific config.',
940
- },
941
- ],
942
- handler: async (args) => {
943
- const analyzerName = args.analyzerName;
944
- const config = args.config;
945
- const projectPath = args.projectPath;
946
- const db = CodeIndexDB.getInstance();
947
- await db.initialize();
948
- await db.storeAnalyzerConfig(analyzerName, config, {
949
- projectPath,
950
- isGlobal: !projectPath,
951
- });
952
- return {
953
- success: true,
954
- message: `Configuration for ${analyzerName} analyzer has been saved${projectPath ? ` for project ${projectPath}` : ' globally'}`,
955
- analyzer: analyzerName,
956
- scope: projectPath ? 'project' : 'global',
957
- config,
958
- };
959
- },
818
+ name: 'projectPath',
819
+ type: 'string',
820
+ required: false,
821
+ description: 'Optional project path for project-specific config.',
960
822
  },
823
+ ],
824
+ handler: async (args) => {
825
+ const analyzerName = args.analyzerName;
826
+ const projectPath = args.projectPath;
827
+ const db = CodeIndexDB.getInstance();
828
+ await db.initialize();
829
+ if (analyzerName) {
830
+ const config = await db.analyzerConfig.getAnalyzerConfig(analyzerName, projectPath);
831
+ return {
832
+ success: true,
833
+ analyzer: analyzerName,
834
+ config: config || null,
835
+ scope: projectPath ? 'project' : 'global',
836
+ message: config ? 'Configuration found' : 'No custom configuration found, using defaults',
837
+ };
838
+ }
839
+ const configs = await db.analyzerConfig.getAllAnalyzerConfigs(projectPath);
840
+ return {
841
+ success: true,
842
+ configs,
843
+ scope: projectPath ? 'project' : 'global',
844
+ message: `Found ${Object.keys(configs).length} analyzer configurations`,
845
+ };
846
+ },
847
+ },
848
+ {
849
+ name: 'set',
850
+ description: 'Set or update analyzer configuration that persists across audit runs.',
851
+ parameters: [
961
852
  {
962
- name: 'reset',
963
- description: 'Reset analyzer configuration to defaults.',
964
- parameters: [
965
- {
966
- name: 'analyzerName',
967
- type: 'string',
968
- required: false,
969
- description: 'Specific analyzer to reset, or omit to reset all.',
970
- },
971
- {
972
- name: 'projectPath',
973
- type: 'string',
974
- required: false,
975
- description: 'Optional project path to reset only project-specific config.',
976
- },
977
- ],
978
- handler: async (args) => {
979
- const analyzerName = args.analyzerName;
980
- const projectPath = args.projectPath;
981
- const db = CodeIndexDB.getInstance();
982
- await db.initialize();
983
- if (analyzerName) {
984
- const deleted = await db.deleteAnalyzerConfig(analyzerName, {
985
- projectPath,
986
- isGlobal: !projectPath,
987
- });
988
- return {
989
- success: deleted,
990
- message: deleted
991
- ? `Configuration for ${analyzerName} analyzer has been reset${projectPath ? ` for project ${projectPath}` : ' globally'}`
992
- : `No configuration found for ${analyzerName} analyzer`,
993
- analyzer: analyzerName,
994
- scope: projectPath ? 'project' : 'global',
995
- };
996
- }
997
- await db.resetAnalyzerConfigs(projectPath);
998
- return {
999
- success: true,
1000
- message: projectPath
1001
- ? `All project-specific configurations for ${projectPath} have been reset`
1002
- : 'All analyzer configurations have been reset to defaults',
1003
- scope: projectPath ? 'project' : 'global',
1004
- };
1005
- },
853
+ name: 'analyzerName',
854
+ type: 'string',
855
+ required: true,
856
+ description: 'The analyzer to configure (solid, dry, security, etc.).',
1006
857
  },
1007
858
  {
1008
- name: 'generate',
1009
- description: 'Generate configuration files for AI coding assistants (Cursor, Claude, Copilot, etc.).',
1010
- parameters: [
1011
- {
1012
- name: 'tools',
1013
- type: 'array',
1014
- required: true,
1015
- description: 'AI tools to configure (claude, codex, cursor, gemini, copilot, continue, awsq, codeium, vscode, cline, zcode).',
1016
- },
1017
- {
1018
- name: 'outputDir',
1019
- type: 'string',
1020
- required: false,
1021
- description: 'Output directory for configuration files.',
1022
- default: '.',
1023
- },
1024
- {
1025
- name: 'serverUrl',
1026
- type: 'string',
1027
- required: false,
1028
- description: 'MCP server URL (default: auto-detected).',
1029
- default: DEFAULT_SERVER_URL,
1030
- },
1031
- {
1032
- name: 'overwrite',
1033
- type: 'boolean',
1034
- required: false,
1035
- description: 'Overwrite existing files (default: false).',
1036
- default: false,
1037
- },
1038
- ],
1039
- handler: async (args) => {
1040
- const tools = args.tools;
1041
- const serverUrl = args.serverUrl || DEFAULT_SERVER_URL;
1042
- const rawOutputDir = args.outputDir || '.';
1043
- // Containment (Spec 61 R5.1): generated configs land only inside the
1044
- // working directory. `~` expansion still resolves (so a project under
1045
- // `~` keeps working), but it is no longer a way to escape cwd.
1046
- const outputDir = resolveConfigGenerateDir(rawOutputDir, process.cwd());
1047
- const overwrite = args.overwrite || false;
1048
- if (!Array.isArray(tools) || tools.length === 0)
1049
- throw new Error('tools parameter must be a non-empty array');
1050
- const factory = new ConfigGeneratorFactory(serverUrl);
1051
- const generatedFiles = [];
1052
- const errors = [];
1053
- for (const tool of tools) {
1054
- try {
1055
- const generator = factory.createGenerator(tool);
1056
- if (!generator) {
1057
- errors.push(`Unknown tool: ${tool}`);
1058
- continue;
1059
- }
1060
- const config = generator.generateConfig();
1061
- const outputPath = path.resolve(outputDir, config.filename);
1062
- let fileExists = false;
1063
- try {
1064
- await fs.access(outputPath);
1065
- fileExists = true;
1066
- }
1067
- catch {
1068
- // doesn't exist
1069
- }
1070
- if (fileExists && !overwrite) {
1071
- errors.push(`File already exists: ${config.filename} (use overwrite: true to replace)`);
1072
- continue;
1073
- }
1074
- await fs.mkdir(path.dirname(outputPath), { recursive: true });
1075
- await fs.writeFile(outputPath, config.content);
1076
- generatedFiles.push(config.filename);
1077
- if (config.additionalFiles) {
1078
- for (const additionalFile of config.additionalFiles) {
1079
- const additionalPath = path.resolve(outputDir, additionalFile.filename);
1080
- await fs.mkdir(path.dirname(additionalPath), { recursive: true });
1081
- await fs.writeFile(additionalPath, additionalFile.content);
1082
- generatedFiles.push(additionalFile.filename);
1083
- }
1084
- }
1085
- }
1086
- catch (error) {
1087
- errors.push(`Failed to generate config for ${tool}: ${error instanceof Error ? error.message : 'Unknown error'}`);
1088
- }
1089
- }
1090
- return {
1091
- success: errors.length === 0,
1092
- generatedFiles,
1093
- errors: errors.length > 0 ? errors : undefined,
1094
- totalRequested: tools.length,
1095
- totalGenerated: generatedFiles.length,
1096
- };
1097
- },
859
+ name: 'config',
860
+ type: 'object',
861
+ required: true,
862
+ description: 'Configuration object for the analyzer (e.g., thresholds, rules).',
1098
863
  },
1099
864
  {
1100
- name: 'whitelist_list',
1101
- description: 'Get current whitelist entries for dependency and class instantiation checks.',
1102
- parameters: [
1103
- {
1104
- name: 'type',
1105
- type: 'string',
1106
- required: false,
1107
- description: 'Filter by type: platform-api, framework-class, project-dep, shared-library, node-builtin.',
1108
- enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
1109
- },
1110
- {
1111
- name: 'status',
1112
- type: 'string',
1113
- required: false,
1114
- description: 'Filter by status: active, pending, rejected, disabled.',
1115
- enum: ['active', 'pending', 'rejected', 'disabled'],
1116
- },
1117
- ],
1118
- handler: async (args) => {
1119
- const { handleWhitelistGet } = await import('./mcp-tools/whitelistTools.js');
1120
- return handleWhitelistGet(args);
1121
- },
865
+ name: 'projectPath',
866
+ type: 'string',
867
+ required: false,
868
+ description: 'Optional project path for project-specific config.',
1122
869
  },
870
+ ],
871
+ handler: async (args) => {
872
+ const analyzerName = args.analyzerName;
873
+ const config = args.config;
874
+ const projectPath = args.projectPath;
875
+ const db = CodeIndexDB.getInstance();
876
+ await db.initialize();
877
+ await db.analyzerConfig.storeAnalyzerConfig(analyzerName, config, {
878
+ projectPath,
879
+ isGlobal: !projectPath,
880
+ });
881
+ return {
882
+ success: true,
883
+ message: `Configuration for ${analyzerName} analyzer has been saved${projectPath ? ` for project ${projectPath}` : ' globally'}`,
884
+ analyzer: analyzerName,
885
+ scope: projectPath ? 'project' : 'global',
886
+ config,
887
+ };
888
+ },
889
+ },
890
+ {
891
+ name: 'reset',
892
+ description: 'Reset analyzer configuration to defaults.',
893
+ parameters: [
1123
894
  {
1124
- name: 'whitelist_add',
1125
- description: 'Add a new entry to the whitelist.',
1126
- parameters: [
1127
- {
1128
- name: 'name',
1129
- type: 'string',
1130
- required: true,
1131
- description: 'Class name or import path to whitelist.',
1132
- },
1133
- {
1134
- name: 'type',
1135
- type: 'string',
1136
- required: true,
1137
- description: 'Type of whitelist entry.',
1138
- enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
1139
- },
1140
- {
1141
- name: 'description',
1142
- type: 'string',
1143
- required: false,
1144
- description: 'Explanation of why this is whitelisted.',
1145
- },
1146
- {
1147
- name: 'patterns',
1148
- type: 'array',
1149
- required: false,
1150
- description: 'Additional patterns to match (e.g., ["fs/*", "node:fs"]).',
1151
- },
1152
- ],
1153
- handler: async (args) => {
1154
- const { handleWhitelistAdd } = await import('./mcp-tools/whitelistTools.js');
1155
- return handleWhitelistAdd(args);
1156
- },
895
+ name: 'analyzerName',
896
+ type: 'string',
897
+ required: false,
898
+ description: 'Specific analyzer to reset, or omit to reset all.',
1157
899
  },
1158
900
  {
1159
- name: 'whitelist_update',
1160
- description: 'Update the status of a whitelist entry.',
1161
- parameters: [
1162
- {
1163
- name: 'name',
1164
- type: 'string',
1165
- required: true,
1166
- description: 'Name of the whitelist entry to update.',
1167
- },
1168
- {
1169
- name: 'status',
1170
- type: 'string',
1171
- required: true,
1172
- description: 'New status for the entry.',
1173
- enum: ['active', 'pending', 'rejected', 'disabled'],
1174
- },
1175
- ],
1176
- handler: async (args) => {
1177
- const { handleWhitelistUpdateStatus } = await import('./mcp-tools/whitelistTools.js');
1178
- return handleWhitelistUpdateStatus(args);
1179
- },
901
+ name: 'projectPath',
902
+ type: 'string',
903
+ required: false,
904
+ description: 'Optional project path to reset only project-specific config.',
1180
905
  },
906
+ ],
907
+ handler: async (args) => {
908
+ const analyzerName = args.analyzerName;
909
+ const projectPath = args.projectPath;
910
+ const db = CodeIndexDB.getInstance();
911
+ await db.initialize();
912
+ if (analyzerName) {
913
+ const deleted = await db.analyzerConfig.deleteAnalyzerConfig(analyzerName, {
914
+ projectPath,
915
+ isGlobal: !projectPath,
916
+ });
917
+ return {
918
+ success: deleted,
919
+ message: deleted
920
+ ? `Configuration for ${analyzerName} analyzer has been reset${projectPath ? ` for project ${projectPath}` : ' globally'}`
921
+ : `No configuration found for ${analyzerName} analyzer`,
922
+ analyzer: analyzerName,
923
+ scope: projectPath ? 'project' : 'global',
924
+ };
925
+ }
926
+ await db.analyzerConfig.resetAnalyzerConfigs(projectPath);
927
+ return {
928
+ success: true,
929
+ message: projectPath
930
+ ? `All project-specific configurations for ${projectPath} have been reset`
931
+ : 'All analyzer configurations have been reset to defaults',
932
+ scope: projectPath ? 'project' : 'global',
933
+ };
934
+ },
935
+ },
936
+ {
937
+ name: 'generate',
938
+ description: 'Generate configuration files for AI coding assistants (Cursor, Claude, Copilot, etc.).',
939
+ parameters: [
1181
940
  {
1182
- name: 'whitelist_detect',
1183
- description: 'Detect potential whitelist candidates from package.json and usage patterns.',
1184
- parameters: [
1185
- {
1186
- name: 'path',
1187
- type: 'string',
1188
- required: false,
1189
- description: 'Project path to analyze (defaults to current directory).',
1190
- default: process.cwd(),
1191
- },
1192
- {
1193
- name: 'includePackageJson',
1194
- type: 'boolean',
1195
- required: false,
1196
- description: 'Include dependencies from package.json.',
1197
- default: true,
1198
- },
1199
- {
1200
- name: 'autoPopulate',
1201
- type: 'boolean',
1202
- required: false,
1203
- description: 'Automatically add high-confidence entries.',
1204
- default: false,
1205
- },
1206
- ],
1207
- handler: async (args) => {
1208
- const { handleWhitelistDetect } = await import('./mcp-tools/whitelistTools.js');
1209
- return handleWhitelistDetect(args);
1210
- },
941
+ name: 'tools',
942
+ type: 'array',
943
+ required: true,
944
+ description: 'AI tools to configure (claude, codex, cursor, gemini, copilot, continue, awsq, codeium, vscode, cline, zcode).',
1211
945
  },
1212
946
  {
1213
- name: 'rules_list',
1214
- description: 'List all configured invariant rules from .codeauditor.json. Shows rule IDs, kinds, severity, and messages.',
1215
- parameters: [
1216
- {
1217
- name: 'configPath',
1218
- type: 'string',
1219
- required: false,
1220
- description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
1221
- },
1222
- ],
1223
- handler: async (args) => {
1224
- const { readFileSync } = await import('fs');
1225
- const path = await import('path');
1226
- const configPath = args.configPath ||
1227
- path.join(process.cwd(), '.codeauditor.json');
1228
- try {
1229
- const raw = readFileSync(configPath, 'utf-8');
1230
- const config = JSON.parse(raw);
1231
- const rules = config?.rules ?? [];
1232
- return {
1233
- rules: rules.map((r) => ({
1234
- id: r.id,
1235
- kind: r.kind,
1236
- severity: r.severity,
1237
- message: r.message || null,
1238
- })),
1239
- count: rules.length,
1240
- configPath,
1241
- };
1242
- }
1243
- catch (err) {
1244
- return {
1245
- error: `Failed to read rules: ${err.message}`,
1246
- configPath,
1247
- rules: [],
1248
- count: 0,
1249
- };
1250
- }
1251
- },
947
+ name: 'outputDir',
948
+ type: 'string',
949
+ required: false,
950
+ description: 'Output directory for configuration files.',
951
+ default: '.',
1252
952
  },
1253
953
  {
1254
- name: 'rules_check',
1255
- description: 'Validate the current .codeauditor.json rules (schema, duplicate IDs, valid globs/regex, mutual exclusivity). Returns any config errors.',
1256
- parameters: [
1257
- {
1258
- name: 'configPath',
1259
- type: 'string',
1260
- required: false,
1261
- description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
1262
- },
1263
- ],
1264
- handler: async (args) => {
1265
- const { validateRulesConfig } = await import('./invariants/ruleValidator.js');
1266
- const { readFileSync } = await import('fs');
1267
- const path = await import('path');
1268
- const configPath = args.configPath ||
1269
- path.join(process.cwd(), '.codeauditor.json');
954
+ name: 'serverUrl',
955
+ type: 'string',
956
+ required: false,
957
+ description: 'MCP server URL (default: auto-detected).',
958
+ default: DEFAULT_SERVER_URL,
959
+ },
960
+ {
961
+ name: 'overwrite',
962
+ type: 'boolean',
963
+ required: false,
964
+ description: 'Overwrite existing files (default: false).',
965
+ default: false,
966
+ },
967
+ ],
968
+ handler: async (args) => {
969
+ const tools = args.tools;
970
+ const serverUrl = args.serverUrl || DEFAULT_SERVER_URL;
971
+ const rawOutputDir = args.outputDir || '.';
972
+ // Containment (Spec 61 R5.1): generated configs land only inside the
973
+ // working directory. `~` expansion still resolves (so a project under
974
+ // `~` keeps working), but it is no longer a way to escape cwd.
975
+ const outputDir = resolveConfigGenerateDir(rawOutputDir, process.cwd());
976
+ const overwrite = args.overwrite || false;
977
+ if (!Array.isArray(tools) || tools.length === 0)
978
+ throw new Error('tools parameter must be a non-empty array');
979
+ const factory = new ConfigGeneratorFactory(serverUrl);
980
+ const generatedFiles = [];
981
+ const errors = [];
982
+ for (const tool of tools) {
983
+ try {
984
+ const generator = factory.createGenerator(tool);
985
+ if (!generator) {
986
+ errors.push(`Unknown tool: ${tool}`);
987
+ continue;
988
+ }
989
+ const config = generator.generateConfig();
990
+ const outputPath = path.resolve(outputDir, config.filename);
991
+ let fileExists = false;
1270
992
  try {
1271
- const raw = readFileSync(configPath, 'utf-8');
1272
- const config = JSON.parse(raw);
1273
- const rulesArray = config?.rules;
1274
- const errors = validateRulesConfig({ rules: rulesArray ?? [] });
1275
- return {
1276
- valid: errors.length === 0,
1277
- errors: errors.map(e => ({ ruleId: e.ruleId || null, message: e.message })),
1278
- configPath,
1279
- };
993
+ await fs.access(outputPath);
994
+ fileExists = true;
1280
995
  }
1281
- catch (err) {
1282
- return {
1283
- valid: false,
1284
- errors: [{ message: `Failed to read/parse config: ${err.message}` }],
1285
- configPath,
1286
- };
996
+ catch {
997
+ // doesn't exist
1287
998
  }
1288
- },
999
+ if (fileExists && !overwrite) {
1000
+ errors.push(`File already exists: ${config.filename} (use overwrite: true to replace)`);
1001
+ continue;
1002
+ }
1003
+ await fs.mkdir(path.dirname(outputPath), { recursive: true });
1004
+ await fs.writeFile(outputPath, config.content);
1005
+ generatedFiles.push(config.filename);
1006
+ if (config.additionalFiles) {
1007
+ for (const additionalFile of config.additionalFiles) {
1008
+ const additionalPath = path.resolve(outputDir, additionalFile.filename);
1009
+ await fs.mkdir(path.dirname(additionalPath), { recursive: true });
1010
+ await fs.writeFile(additionalPath, additionalFile.content);
1011
+ generatedFiles.push(additionalFile.filename);
1012
+ }
1013
+ }
1014
+ }
1015
+ catch (error) {
1016
+ errors.push(`Failed to generate config for ${tool}: ${errorMessage(error)}`);
1017
+ }
1018
+ }
1019
+ return {
1020
+ success: errors.length === 0,
1021
+ generatedFiles,
1022
+ errors: errors.length > 0 ? errors : undefined,
1023
+ totalRequested: tools.length,
1024
+ totalGenerated: generatedFiles.length,
1025
+ };
1026
+ },
1027
+ },
1028
+ {
1029
+ name: 'whitelist_list',
1030
+ description: 'Get current whitelist entries for dependency and class instantiation checks.',
1031
+ parameters: [
1032
+ {
1033
+ name: 'type',
1034
+ type: 'string',
1035
+ required: false,
1036
+ description: 'Filter by type: platform-api, framework-class, project-dep, shared-library, node-builtin.',
1037
+ enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
1038
+ },
1039
+ {
1040
+ name: 'status',
1041
+ type: 'string',
1042
+ required: false,
1043
+ description: 'Filter by status: active, pending, rejected, disabled.',
1044
+ enum: ['active', 'pending', 'rejected', 'disabled'],
1045
+ },
1046
+ ],
1047
+ handler: async (args) => {
1048
+ const { handleWhitelistGet } = await import('./mcp-tools/whitelistTools.js');
1049
+ return handleWhitelistGet(args);
1050
+ },
1051
+ },
1052
+ {
1053
+ name: 'whitelist_add',
1054
+ description: 'Add a new entry to the whitelist.',
1055
+ parameters: [
1056
+ {
1057
+ name: 'name',
1058
+ type: 'string',
1059
+ required: true,
1060
+ description: 'Class name or import path to whitelist.',
1061
+ },
1062
+ {
1063
+ name: 'type',
1064
+ type: 'string',
1065
+ required: true,
1066
+ description: 'Type of whitelist entry.',
1067
+ enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
1068
+ },
1069
+ {
1070
+ name: 'description',
1071
+ type: 'string',
1072
+ required: false,
1073
+ description: 'Explanation of why this is whitelisted.',
1074
+ },
1075
+ {
1076
+ name: 'patterns',
1077
+ type: 'array',
1078
+ required: false,
1079
+ description: 'Additional patterns to match (e.g., ["fs/*", "node:fs"]).',
1080
+ },
1081
+ ],
1082
+ handler: async (args) => {
1083
+ const { handleWhitelistAdd } = await import('./mcp-tools/whitelistTools.js');
1084
+ return handleWhitelistAdd(args);
1085
+ },
1086
+ },
1087
+ {
1088
+ name: 'whitelist_update',
1089
+ description: 'Update the status of a whitelist entry.',
1090
+ parameters: [
1091
+ {
1092
+ name: 'name',
1093
+ type: 'string',
1094
+ required: true,
1095
+ description: 'Name of the whitelist entry to update.',
1096
+ },
1097
+ {
1098
+ name: 'status',
1099
+ type: 'string',
1100
+ required: true,
1101
+ description: 'New status for the entry.',
1102
+ enum: ['active', 'pending', 'rejected', 'disabled'],
1289
1103
  },
1290
1104
  ],
1105
+ handler: async (args) => {
1106
+ const { handleWhitelistUpdateStatus } = await import('./mcp-tools/whitelistTools.js');
1107
+ return handleWhitelistUpdateStatus(args);
1108
+ },
1109
+ },
1110
+ {
1111
+ name: 'whitelist_detect',
1112
+ description: 'Detect potential whitelist candidates from package.json and usage patterns.',
1113
+ parameters: [
1114
+ {
1115
+ name: 'path',
1116
+ type: 'string',
1117
+ required: false,
1118
+ description: 'Project path to analyze (defaults to current directory).',
1119
+ default: process.cwd(),
1120
+ },
1121
+ {
1122
+ name: 'includePackageJson',
1123
+ type: 'boolean',
1124
+ required: false,
1125
+ description: 'Include dependencies from package.json.',
1126
+ default: true,
1127
+ },
1128
+ {
1129
+ name: 'autoPopulate',
1130
+ type: 'boolean',
1131
+ required: false,
1132
+ description: 'Automatically add high-confidence entries.',
1133
+ default: false,
1134
+ },
1135
+ ],
1136
+ handler: async (args) => {
1137
+ const { handleWhitelistDetect } = await import('./mcp-tools/whitelistTools.js');
1138
+ return handleWhitelistDetect(args);
1139
+ },
1140
+ },
1141
+ {
1142
+ name: 'rules_list',
1143
+ description: 'List all configured invariant rules from .codeauditor.json. Shows rule IDs, kinds, severity, and messages.',
1144
+ parameters: [
1145
+ {
1146
+ name: 'configPath',
1147
+ type: 'string',
1148
+ required: false,
1149
+ description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
1150
+ },
1151
+ ],
1152
+ handler: async (args) => {
1153
+ const { readFileSync } = await import('fs');
1154
+ const path = await import('path');
1155
+ const configPath = args.configPath ||
1156
+ path.join(process.cwd(), '.codeauditor.json');
1157
+ try {
1158
+ const raw = readFileSync(configPath, 'utf-8');
1159
+ const config = JSON.parse(raw);
1160
+ const rules = config?.rules ?? [];
1161
+ return {
1162
+ rules: rules.map((r) => ({
1163
+ id: r.id,
1164
+ kind: r.kind,
1165
+ severity: r.severity,
1166
+ message: r.message || null,
1167
+ })),
1168
+ count: rules.length,
1169
+ configPath,
1170
+ };
1171
+ }
1172
+ catch (err) {
1173
+ return {
1174
+ error: `Failed to read rules: ${err.message}`,
1175
+ configPath,
1176
+ rules: [],
1177
+ count: 0,
1178
+ };
1179
+ }
1180
+ },
1181
+ },
1182
+ {
1183
+ name: 'rules_check',
1184
+ description: 'Validate the current .codeauditor.json rules (schema, duplicate IDs, valid globs/regex, mutual exclusivity). Returns any config errors.',
1185
+ parameters: [
1186
+ {
1187
+ name: 'configPath',
1188
+ type: 'string',
1189
+ required: false,
1190
+ description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
1191
+ },
1192
+ ],
1193
+ handler: async (args) => {
1194
+ const { validateRulesConfig } = await import('./invariants/ruleValidator.js');
1195
+ const { readFileSync } = await import('fs');
1196
+ const path = await import('path');
1197
+ const configPath = args.configPath ||
1198
+ path.join(process.cwd(), '.codeauditor.json');
1199
+ try {
1200
+ const raw = readFileSync(configPath, 'utf-8');
1201
+ const config = JSON.parse(raw);
1202
+ const rulesArray = config?.rules;
1203
+ const errors = validateRulesConfig({ rules: rulesArray ?? [] });
1204
+ return {
1205
+ valid: errors.length === 0,
1206
+ errors: errors.map(e => ({ ruleId: e.ruleId || null, message: e.message })),
1207
+ configPath,
1208
+ };
1209
+ }
1210
+ catch (err) {
1211
+ return {
1212
+ valid: false,
1213
+ errors: [{ message: `Failed to read/parse config: ${err.message}` }],
1214
+ configPath,
1215
+ };
1216
+ }
1217
+ },
1218
+ },
1219
+ ];
1220
+ function registerConfigTool(registry) {
1221
+ registry.register({
1222
+ name: 'config',
1223
+ description: 'Manage analyzer configurations, generate AI tool configs, manage whitelists, and manage invariant rules. Actions: get, set, reset (analyzer configs), generate (AI tool config files), whitelist_list, whitelist_add, whitelist_update, whitelist_detect, rules_list, rules_check.',
1224
+ actions: configActions,
1291
1225
  });
1292
- // ── telemetry ──────────────────────────────────────────────────────────────
1226
+ }
1227
+ // ── telemetry ──────────────────────────────────────────────────────────────
1228
+ function registerTelemetryTool(registry) {
1293
1229
  registry.register({
1294
1230
  name: 'telemetry',
1295
1231
  description: 'Manage anonymous dismissal feedback opt-in (default OFF). Actions: status, enable, disable. When enabled, a dismissal and its reason are sent to the feedback endpoint, grouped by an anonymous install ID generated locally.',
@@ -1342,7 +1278,9 @@ function registerAllTools(registry) {
1342
1278
  },
1343
1279
  ],
1344
1280
  });
1345
- // ── code_map ───────────────────────────────────────────────────────────────
1281
+ }
1282
+ // ── code_map ───────────────────────────────────────────────────────────────
1283
+ function registerCodeMapTool(registry) {
1346
1284
  registry.register({
1347
1285
  name: 'code_map',
1348
1286
  description: 'Retrieve sections of previously generated code maps. Actions: get (retrieve a specific section), list (list all available sections for a map).',
@@ -1370,7 +1308,7 @@ function registerAllTools(registry) {
1370
1308
  if (!mapId || !sectionType)
1371
1309
  return { success: false, error: 'Both mapId and sectionType are required' };
1372
1310
  const db = await getDatabase();
1373
- const section = await db.getCodeMapSection(mapId, sectionType);
1311
+ const section = await db.codeMap.getCodeMapSection(mapId, sectionType);
1374
1312
  if (section) {
1375
1313
  return { success: true, mapId, sectionType, content: section.content, metadata: section.metadata };
1376
1314
  }
@@ -1393,13 +1331,15 @@ function registerAllTools(registry) {
1393
1331
  if (!mapId)
1394
1332
  return { success: false, error: 'mapId is required' };
1395
1333
  const db = await getDatabase();
1396
- const sections = await db.listCodeMapSections(mapId);
1334
+ const sections = await db.codeMap.listCodeMapSections(mapId);
1397
1335
  return { success: true, mapId, sections, totalSections: sections.length };
1398
1336
  },
1399
1337
  },
1400
1338
  ],
1401
1339
  });
1402
- // ── tasks ──────────────────────────────────────────────────────────────────
1340
+ }
1341
+ // ── tasks ──────────────────────────────────────────────────────────────────
1342
+ function registerTasksTool(registry) {
1403
1343
  registry.register({
1404
1344
  name: 'tasks',
1405
1345
  description: 'Manage a persistent per-project task queue. Tasks survive index resets. Actions: create, list, list_tree, get, update, complete, delete, from_audit (create tasks from audit violations with deduplication).',
@@ -1408,7 +1348,7 @@ function registerAllTools(registry) {
1408
1348
  name: 'create',
1409
1349
  description: 'Create a new task.',
1410
1350
  parameters: [
1411
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1351
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1412
1352
  { name: 'title', type: 'string', required: true, description: 'Task title.' },
1413
1353
  { name: 'description', type: 'string', required: false, description: 'Longer description.' },
1414
1354
  { name: 'status', type: 'string', required: false, description: 'Initial status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
@@ -1432,7 +1372,7 @@ function registerAllTools(registry) {
1432
1372
  name: 'list',
1433
1373
  description: 'List tasks (flat). Supports filtering by status, priority, labels, source, query text search.',
1434
1374
  parameters: [
1435
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1375
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1436
1376
  { name: 'status', type: 'string', required: false, description: 'Filter by status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
1437
1377
  { name: 'priority', type: 'string', required: false, description: 'Filter by priority.', enum: ['low', 'medium', 'high'] },
1438
1378
  { name: 'label', type: 'string', required: false, description: 'Filter by label.' },
@@ -1452,7 +1392,7 @@ function registerAllTools(registry) {
1452
1392
  name: 'list_tree',
1453
1393
  description: 'List tasks as a tree (parent-child hierarchy).',
1454
1394
  parameters: [
1455
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1395
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1456
1396
  { name: 'status', type: 'string', required: false, description: 'Filter by status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
1457
1397
  { name: 'limit', type: 'number', required: false, description: 'Max tasks (default 500).' },
1458
1398
  ],
@@ -1465,7 +1405,7 @@ function registerAllTools(registry) {
1465
1405
  name: 'get',
1466
1406
  description: 'Get a single task by ID.',
1467
1407
  parameters: [
1468
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1408
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1469
1409
  { name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
1470
1410
  ],
1471
1411
  handler: async (args, signal) => {
@@ -1477,7 +1417,7 @@ function registerAllTools(registry) {
1477
1417
  name: 'update',
1478
1418
  description: 'Update a task with a patch of partial fields.',
1479
1419
  parameters: [
1480
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1420
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1481
1421
  { name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
1482
1422
  { name: 'patch', type: 'object', required: true, description: 'Partial fields to update.' },
1483
1423
  ],
@@ -1490,7 +1430,7 @@ function registerAllTools(registry) {
1490
1430
  name: 'complete',
1491
1431
  description: 'Mark a task as completed.',
1492
1432
  parameters: [
1493
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1433
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1494
1434
  { name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
1495
1435
  ],
1496
1436
  handler: async (args, signal) => {
@@ -1502,7 +1442,7 @@ function registerAllTools(registry) {
1502
1442
  name: 'delete',
1503
1443
  description: 'Delete a task. Mode: reject (default, refuse if subtasks exist), detach (move subtasks up), cascade (delete subtree).',
1504
1444
  parameters: [
1505
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1445
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1506
1446
  { name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
1507
1447
  { name: 'mode', type: 'string', required: false, description: 'Delete mode.', enum: ['reject', 'detach', 'cascade'] },
1508
1448
  ],
@@ -1515,10 +1455,9 @@ function registerAllTools(registry) {
1515
1455
  name: 'from_audit',
1516
1456
  description: 'Create tasks from audit violations with deduplication. Each violation gets a stable fingerprint; violations matching existing open tasks are skipped.',
1517
1457
  parameters: [
1518
- { name: 'projectPath', type: 'string', required: false, description: 'Project root.' },
1458
+ { name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
1519
1459
  { name: 'auditJobId', type: 'string', required: false, description: 'Audit job ID. Omit to use most recent completed audit.' },
1520
1460
  { name: 'severities', type: 'array', required: false, description: 'Severities to include (default: critical, severe).' },
1521
- { name: 'analyzers', type: 'array', required: false, description: 'Filter violations by analyzer name.' },
1522
1461
  { name: 'paths', type: 'array', required: false, description: 'Filter violations by file path globs.' },
1523
1462
  ],
1524
1463
  handler: async (args, signal) => {
@@ -1528,7 +1467,9 @@ function registerAllTools(registry) {
1528
1467
  },
1529
1468
  ],
1530
1469
  });
1531
- // ── guide ──────────────────────────────────────────────────────────────────
1470
+ }
1471
+ // ── guide ──────────────────────────────────────────────────────────────────
1472
+ function registerGuideTool(registry) {
1532
1473
  registry.register({
1533
1474
  name: 'guide',
1534
1475
  description: 'Get recommended workflows and best practices for using the code auditor tools effectively. Single action: get.',
@@ -1559,7 +1500,7 @@ function registerAllTools(registry) {
1559
1500
  catch (error) {
1560
1501
  return {
1561
1502
  success: false,
1562
- error: error instanceof Error ? error.message : 'Unknown error',
1503
+ error: errorMessage(error),
1563
1504
  availableScenarios: [
1564
1505
  'initial-setup',
1565
1506
  'react-development',
@@ -1575,6 +1516,20 @@ function registerAllTools(registry) {
1575
1516
  ],
1576
1517
  });
1577
1518
  }
1519
+ /**
1520
+ * Register every MCP tool and its actions on the given registry.
1521
+ * @param registry - The tool registry to register tools on.
1522
+ */
1523
+ export function registerAllTools(registry) {
1524
+ registerAuditTool(registry);
1525
+ registerSearchTool(registry);
1526
+ registerIndexTool(registry);
1527
+ registerConfigTool(registry);
1528
+ registerTelemetryTool(registry);
1529
+ registerCodeMapTool(registry);
1530
+ registerTasksTool(registry);
1531
+ registerGuideTool(registry);
1532
+ }
1578
1533
  // ── MCP Server ───────────────────────────────────────────────────────────────
1579
1534
  async function startMcpServer() {
1580
1535
  logMcpInfo('startup', `code-auditor-mcp ${PACKAGE_VERSION} (stdio)`, {
@@ -1731,9 +1686,31 @@ async function main() {
1731
1686
  // --stdio (default): start the MCP server
1732
1687
  await startMcpServer();
1733
1688
  }
1734
- main().catch((error) => {
1735
- console.error(chalk.red('[ERROR]'), 'Failed to start:', error);
1736
- console.error(chalk.red('[ERROR]'), 'Stack:', error.stack);
1737
- process.exitCode = 1;
1738
- });
1689
+ // Start the server only when this file is the entry point (mirrors mcp-ui-simple).
1690
+ // Guarding `main()` lets tests import `registerAllTools` without booting the stdio
1691
+ // server (Spec 66 follow-up R5 — the entry-point conformance test must enumerate
1692
+ // the real `audit.run` / `audit.health` handlers, not a fake).
1693
+ //
1694
+ // Compare realpaths, not string-built URLs: `import.meta.url` is symlink-resolved
1695
+ // by Node, while `process.argv[1]` under a pnpm/npm `.bin` shim is the shim path
1696
+ // (or a symlinked path) that Node does not resolve. The two string forms diverge
1697
+ // on a symlinked install, so the naive `file://${argv[1]}` comparison never matches
1698
+ // and the published `code-auditor-mcp` bin boots to an immediate silent exit.
1699
+ function isMainModule() {
1700
+ if (!process.argv[1])
1701
+ return false;
1702
+ try {
1703
+ return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);
1704
+ }
1705
+ catch {
1706
+ return false;
1707
+ }
1708
+ }
1709
+ if (isMainModule()) {
1710
+ main().catch((error) => {
1711
+ console.error(chalk.red('[ERROR]'), 'Failed to start:', error);
1712
+ console.error(chalk.red('[ERROR]'), 'Stack:', error.stack);
1713
+ process.exitCode = 1;
1714
+ });
1715
+ }
1739
1716
  //# sourceMappingURL=mcp.js.map