code-auditor-mcp 2.6.2 → 3.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 (344) hide show
  1. package/README.md +23 -196
  2. package/dist/analyzers/analyzerUtils.d.ts +13 -11
  3. package/dist/analyzers/analyzerUtils.d.ts.map +1 -1
  4. package/dist/analyzers/analyzerUtils.js +22 -56
  5. package/dist/analyzers/analyzerUtils.js.map +1 -1
  6. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
  7. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
  8. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  9. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  10. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  11. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  12. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  13. package/dist/analyzers/dataAccessAnalyzer.d.ts.map +1 -1
  14. package/dist/analyzers/dataAccessAnalyzer.js +50 -24
  15. package/dist/analyzers/dataAccessAnalyzer.js.map +1 -1
  16. package/dist/analyzers/documentationAnalyzer.d.ts +4 -1
  17. package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
  18. package/dist/analyzers/documentationAnalyzer.js +210 -111
  19. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  20. package/dist/analyzers/dryAnalyzer.d.ts.map +1 -1
  21. package/dist/analyzers/dryAnalyzer.js +190 -58
  22. package/dist/analyzers/dryAnalyzer.js.map +1 -1
  23. package/dist/analyzers/invariantsAnalyzer.d.ts +20 -0
  24. package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -0
  25. package/dist/analyzers/invariantsAnalyzer.js +148 -0
  26. package/dist/analyzers/invariantsAnalyzer.js.map +1 -0
  27. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  28. package/dist/analyzers/reactAnalyzer.js +2 -2
  29. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  30. package/dist/analyzers/schemaAnalyzer.d.ts +2 -0
  31. package/dist/analyzers/schemaAnalyzer.d.ts.map +1 -1
  32. package/dist/analyzers/schemaAnalyzer.js +306 -147
  33. package/dist/analyzers/schemaAnalyzer.js.map +1 -1
  34. package/dist/analyzers/solidAnalyzer.d.ts.map +1 -1
  35. package/dist/analyzers/solidAnalyzer.js +145 -119
  36. package/dist/analyzers/solidAnalyzer.js.map +1 -1
  37. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +3 -1
  38. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  39. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +41 -1
  40. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  41. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  42. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +8 -8
  43. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  44. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  45. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +6 -6
  46. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  47. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  48. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  49. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +1 -1
  50. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  51. package/dist/api/index.js +1 -0
  52. package/dist/api/index.js.map +1 -1
  53. package/dist/auditRunner.d.ts.map +1 -1
  54. package/dist/auditRunner.js +367 -24
  55. package/dist/auditRunner.js.map +1 -1
  56. package/dist/cli.d.ts +1 -1
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +740 -18
  59. package/dist/cli.js.map +1 -1
  60. package/dist/codeIndexDB-enhanced.d.ts +35 -13
  61. package/dist/codeIndexDB-enhanced.d.ts.map +1 -1
  62. package/dist/codeIndexDB-enhanced.js +311 -214
  63. package/dist/codeIndexDB-enhanced.js.map +1 -1
  64. package/dist/{codeIndexDb.d.ts → codeIndexDB.d.ts} +51 -224
  65. package/dist/codeIndexDB.d.ts.map +1 -0
  66. package/dist/codeIndexDB.js +2042 -0
  67. package/dist/codeIndexDB.js.map +1 -0
  68. package/dist/codeIndexService.d.ts.map +1 -1
  69. package/dist/codeIndexService.js.map +1 -1
  70. package/dist/componentScanner.d.ts +14 -8
  71. package/dist/componentScanner.d.ts.map +1 -1
  72. package/dist/componentScanner.js +136 -113
  73. package/dist/componentScanner.js.map +1 -1
  74. package/dist/config/configLoader.d.ts.map +1 -1
  75. package/dist/config/configLoader.js +10 -7
  76. package/dist/config/configLoader.js.map +1 -1
  77. package/dist/config/defaults.d.ts.map +1 -1
  78. package/dist/constants.js.map +1 -1
  79. package/dist/fingerprint.d.ts +15 -0
  80. package/dist/fingerprint.d.ts.map +1 -0
  81. package/dist/fingerprint.js +32 -0
  82. package/dist/fingerprint.js.map +1 -0
  83. package/dist/functionScanner.d.ts +5 -0
  84. package/dist/functionScanner.d.ts.map +1 -1
  85. package/dist/functionScanner.js +417 -341
  86. package/dist/functionScanner.js.map +1 -1
  87. package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
  88. package/dist/generators/AiderConfigGenerator.d.ts.map +1 -1
  89. package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
  90. package/dist/generators/BaseConfigGenerator.js.map +1 -1
  91. package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
  92. package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
  93. package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
  94. package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
  95. package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
  96. package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
  97. package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
  98. package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
  99. package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -1
  100. package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
  101. package/dist/grammars/tree-sitter-go.wasm +0 -0
  102. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  103. package/dist/grammars/tree-sitter-tsx.wasm +0 -0
  104. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +2 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/invariants/index.d.ts +9 -0
  110. package/dist/invariants/index.d.ts.map +1 -0
  111. package/dist/invariants/index.js +4 -0
  112. package/dist/invariants/index.js.map +1 -0
  113. package/dist/invariants/invariant-rules.schema.json +137 -0
  114. package/dist/invariants/ruleEngine.d.ts +32 -0
  115. package/dist/invariants/ruleEngine.d.ts.map +1 -0
  116. package/dist/invariants/ruleEngine.js +536 -0
  117. package/dist/invariants/ruleEngine.js.map +1 -0
  118. package/dist/invariants/ruleValidator.d.ts +17 -0
  119. package/dist/invariants/ruleValidator.d.ts.map +1 -0
  120. package/dist/invariants/ruleValidator.js +264 -0
  121. package/dist/invariants/ruleValidator.js.map +1 -0
  122. package/dist/invariants/types.d.ts +78 -0
  123. package/dist/invariants/types.d.ts.map +1 -0
  124. package/dist/invariants/types.js +5 -0
  125. package/dist/invariants/types.js.map +1 -0
  126. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
  127. package/dist/languages/LanguageOrchestrator.js.map +1 -1
  128. package/dist/languages/LanguageRegistry.d.ts.map +1 -1
  129. package/dist/languages/RuntimeManager.d.ts.map +1 -1
  130. package/dist/languages/RuntimeManager.js +1 -1
  131. package/dist/languages/RuntimeManager.js.map +1 -1
  132. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  133. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  134. package/dist/languages/adapterBridge.d.ts +102 -0
  135. package/dist/languages/adapterBridge.d.ts.map +1 -0
  136. package/dist/languages/adapterBridge.js +382 -0
  137. package/dist/languages/adapterBridge.js.map +1 -0
  138. package/dist/languages/go/GoAdapter.d.ts +37 -26
  139. package/dist/languages/go/GoAdapter.d.ts.map +1 -1
  140. package/dist/languages/go/GoAdapter.js +560 -281
  141. package/dist/languages/go/GoAdapter.js.map +1 -1
  142. package/dist/languages/index.d.ts +5 -2
  143. package/dist/languages/index.d.ts.map +1 -1
  144. package/dist/languages/index.js +11 -9
  145. package/dist/languages/index.js.map +1 -1
  146. package/dist/languages/tree-sitter/converter.d.ts +43 -0
  147. package/dist/languages/tree-sitter/converter.d.ts.map +1 -0
  148. package/dist/languages/tree-sitter/converter.js +150 -0
  149. package/dist/languages/tree-sitter/converter.js.map +1 -0
  150. package/dist/languages/tree-sitter/parser.d.ts +36 -0
  151. package/dist/languages/tree-sitter/parser.d.ts.map +1 -0
  152. package/dist/languages/tree-sitter/parser.js +114 -0
  153. package/dist/languages/tree-sitter/parser.js.map +1 -0
  154. package/dist/languages/types.d.ts +11 -0
  155. package/dist/languages/types.d.ts.map +1 -1
  156. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +92 -0
  157. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -0
  158. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +951 -0
  159. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -0
  160. package/dist/mcp-tools/projectTasks.d.ts +58 -22
  161. package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
  162. package/dist/mcp-tools/projectTasks.js +172 -10
  163. package/dist/mcp-tools/projectTasks.js.map +1 -1
  164. package/dist/mcp-tools/whitelistTools.d.ts +21 -21
  165. package/dist/mcp-tools/whitelistTools.d.ts.map +1 -1
  166. package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
  167. package/dist/mcp-tools/workflowGuide.js +130 -126
  168. package/dist/mcp-tools/workflowGuide.js.map +1 -1
  169. package/dist/mcp-tools-shared.d.ts.map +1 -1
  170. package/dist/mcp-tools-shared.js.map +1 -1
  171. package/dist/mcp-ui-simple.js +1 -1
  172. package/dist/mcp-ui-simple.js.map +1 -1
  173. package/dist/mcp.d.ts +1 -1
  174. package/dist/mcp.d.ts.map +1 -1
  175. package/dist/mcp.js +1376 -1181
  176. package/dist/mcp.js.map +1 -1
  177. package/dist/mcpAuditJobs.d.ts +4 -0
  178. package/dist/mcpAuditJobs.d.ts.map +1 -1
  179. package/dist/mcpAuditJobs.js +49 -2
  180. package/dist/mcpAuditJobs.js.map +1 -1
  181. package/dist/mcpToolErrors.d.ts.map +1 -1
  182. package/dist/mcpToolErrors.js.map +1 -1
  183. package/dist/native/ast-grep-napi.darwin-arm64.node +0 -0
  184. package/dist/native/ast-grep-napi.darwin-x64.node +0 -0
  185. package/dist/native/ast-grep-napi.linux-arm64-gnu.node +0 -0
  186. package/dist/native/ast-grep-napi.linux-arm64-musl.node +0 -0
  187. package/dist/native/ast-grep-napi.linux-x64-gnu.node +0 -0
  188. package/dist/native/ast-grep-napi.linux-x64-musl.node +0 -0
  189. package/dist/native/ast-grep-napi.win32-x64-msvc.node +0 -0
  190. package/dist/native-bootstrap.d.ts +15 -0
  191. package/dist/native-bootstrap.d.ts.map +1 -0
  192. package/dist/native-bootstrap.js +75 -0
  193. package/dist/native-bootstrap.js.map +1 -0
  194. package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
  195. package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
  196. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  197. package/dist/reporting/reportGenerator.d.ts.map +1 -1
  198. package/dist/reporting/reportGenerator.js +4 -0
  199. package/dist/reporting/reportGenerator.js.map +1 -1
  200. package/dist/reporting/sarifReportGenerator.d.ts +39 -0
  201. package/dist/reporting/sarifReportGenerator.d.ts.map +1 -0
  202. package/dist/reporting/sarifReportGenerator.js +229 -0
  203. package/dist/reporting/sarifReportGenerator.js.map +1 -0
  204. package/dist/search/QueryParser.d.ts +41 -0
  205. package/dist/search/QueryParser.d.ts.map +1 -1
  206. package/dist/search/QueryParser.js +200 -19
  207. package/dist/search/QueryParser.js.map +1 -1
  208. package/dist/services/CodeMapGenerator.d.ts.map +1 -1
  209. package/dist/services/CodeMapGenerator.js +4 -4
  210. package/dist/services/CodeMapGenerator.js.map +1 -1
  211. package/dist/services/ProjectTaskRepository.d.ts +15 -2
  212. package/dist/services/ProjectTaskRepository.d.ts.map +1 -1
  213. package/dist/services/ProjectTaskRepository.js +16 -1
  214. package/dist/services/ProjectTaskRepository.js.map +1 -1
  215. package/dist/services/SchemaParser.d.ts.map +1 -1
  216. package/dist/services/SchemaParser.js +5 -8
  217. package/dist/services/SchemaParser.js.map +1 -1
  218. package/dist/services/auditJobService.d.ts +1 -1
  219. package/dist/services/projectTaskHelpers.js.map +1 -1
  220. package/dist/services/whitelistService.d.ts.map +1 -1
  221. package/dist/services/whitelistService.js +1 -1
  222. package/dist/services/whitelistService.js.map +1 -1
  223. package/dist/tool-registry.d.ts +79 -0
  224. package/dist/tool-registry.d.ts.map +1 -0
  225. package/dist/tool-registry.js +139 -0
  226. package/dist/tool-registry.js.map +1 -0
  227. package/dist/types/projectTask.d.ts +4 -0
  228. package/dist/types/projectTask.d.ts.map +1 -1
  229. package/dist/types.d.ts +26 -2
  230. package/dist/types.d.ts.map +1 -1
  231. package/dist/types.js.map +1 -1
  232. package/dist/ui/InteractivePrompts.d.ts.map +1 -1
  233. package/dist/ui/InteractivePrompts.js.map +1 -1
  234. package/dist/utils/astParser.d.ts +31 -38
  235. package/dist/utils/astParser.d.ts.map +1 -1
  236. package/dist/utils/astParser.js +138 -196
  237. package/dist/utils/astParser.js.map +1 -1
  238. package/dist/utils/astUtils.d.ts +87 -58
  239. package/dist/utils/astUtils.d.ts.map +1 -1
  240. package/dist/utils/astUtils.js +852 -581
  241. package/dist/utils/astUtils.js.map +1 -1
  242. package/dist/utils/componentPatterns.js.map +1 -1
  243. package/dist/utils/componentResponsibility.d.ts +13 -9
  244. package/dist/utils/componentResponsibility.d.ts.map +1 -1
  245. package/dist/utils/componentResponsibility.js +236 -206
  246. package/dist/utils/componentResponsibility.js.map +1 -1
  247. package/dist/utils/dependencyExtractor.d.ts +11 -6
  248. package/dist/utils/dependencyExtractor.d.ts.map +1 -1
  249. package/dist/utils/dependencyExtractor.js +200 -119
  250. package/dist/utils/dependencyExtractor.js.map +1 -1
  251. package/dist/utils/fileDiscovery.d.ts +1 -1
  252. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  253. package/dist/utils/fileDiscovery.js +15 -6
  254. package/dist/utils/fileDiscovery.js.map +1 -1
  255. package/dist/utils/jsDocParser.d.ts +27 -30
  256. package/dist/utils/jsDocParser.d.ts.map +1 -1
  257. package/dist/utils/jsDocParser.js +271 -207
  258. package/dist/utils/jsDocParser.js.map +1 -1
  259. package/dist/utils/reactDetection.d.ts +27 -12
  260. package/dist/utils/reactDetection.d.ts.map +1 -1
  261. package/dist/utils/reactDetection.js +331 -219
  262. package/dist/utils/reactDetection.js.map +1 -1
  263. package/dist/workers/auditWorker.js +17 -3
  264. package/dist/workers/auditWorker.js.map +1 -1
  265. package/package.json +54 -51
  266. package/dist/adapters/GoAdapter.d.ts +0 -53
  267. package/dist/adapters/GoAdapter.d.ts.map +0 -1
  268. package/dist/adapters/GoAdapter.js +0 -611
  269. package/dist/adapters/GoAdapter.js.map +0 -1
  270. package/dist/adapters/GoConfig.d.ts +0 -35
  271. package/dist/adapters/GoConfig.d.ts.map +0 -1
  272. package/dist/adapters/GoConfig.js +0 -155
  273. package/dist/adapters/GoConfig.js.map +0 -1
  274. package/dist/adapters/LanguageAdapter.d.ts +0 -135
  275. package/dist/adapters/LanguageAdapter.d.ts.map +0 -1
  276. package/dist/adapters/LanguageAdapter.js +0 -47
  277. package/dist/adapters/LanguageAdapter.js.map +0 -1
  278. package/dist/adapters/TypeScriptAdapter.d.ts +0 -43
  279. package/dist/adapters/TypeScriptAdapter.d.ts.map +0 -1
  280. package/dist/adapters/TypeScriptAdapter.js +0 -386
  281. package/dist/adapters/TypeScriptAdapter.js.map +0 -1
  282. package/dist/adapters/UniversalAnalyzer.d.ts +0 -42
  283. package/dist/adapters/UniversalAnalyzer.d.ts.map +0 -1
  284. package/dist/adapters/UniversalAnalyzer.js +0 -103
  285. package/dist/adapters/UniversalAnalyzer.js.map +0 -1
  286. package/dist/adapters/UniversalSOLIDAnalyzer.d.ts +0 -48
  287. package/dist/adapters/UniversalSOLIDAnalyzer.d.ts.map +0 -1
  288. package/dist/adapters/UniversalSOLIDAnalyzer.js +0 -178
  289. package/dist/adapters/UniversalSOLIDAnalyzer.js.map +0 -1
  290. package/dist/adapters/solidAnalyzerCompat.d.ts +0 -21
  291. package/dist/adapters/solidAnalyzerCompat.d.ts.map +0 -1
  292. package/dist/adapters/solidAnalyzerCompat.js +0 -78
  293. package/dist/adapters/solidAnalyzerCompat.js.map +0 -1
  294. package/dist/analyzers/dataAccessAnalyzerCompat.d.ts +0 -20
  295. package/dist/analyzers/dataAccessAnalyzerCompat.d.ts.map +0 -1
  296. package/dist/analyzers/dataAccessAnalyzerCompat.js +0 -59
  297. package/dist/analyzers/dataAccessAnalyzerCompat.js.map +0 -1
  298. package/dist/analyzers/documentationAnalyzerCompat.d.ts +0 -20
  299. package/dist/analyzers/documentationAnalyzerCompat.d.ts.map +0 -1
  300. package/dist/analyzers/documentationAnalyzerCompat.js +0 -52
  301. package/dist/analyzers/documentationAnalyzerCompat.js.map +0 -1
  302. package/dist/analyzers/dryAnalyzerCompat.d.ts +0 -20
  303. package/dist/analyzers/dryAnalyzerCompat.d.ts.map +0 -1
  304. package/dist/analyzers/dryAnalyzerCompat.js +0 -44
  305. package/dist/analyzers/dryAnalyzerCompat.js.map +0 -1
  306. package/dist/analyzers/schemaAnalyzerCompat.d.ts +0 -20
  307. package/dist/analyzers/schemaAnalyzerCompat.d.ts.map +0 -1
  308. package/dist/analyzers/schemaAnalyzerCompat.js +0 -69
  309. package/dist/analyzers/schemaAnalyzerCompat.js.map +0 -1
  310. package/dist/analyzers/solidAnalyzerCompat.d.ts +0 -20
  311. package/dist/analyzers/solidAnalyzerCompat.d.ts.map +0 -1
  312. package/dist/analyzers/solidAnalyzerCompat.js +0 -78
  313. package/dist/analyzers/solidAnalyzerCompat.js.map +0 -1
  314. package/dist/codeIndexDb.d.ts.map +0 -1
  315. package/dist/codeIndexDb.js +0 -2102
  316. package/dist/codeIndexDb.js.map +0 -1
  317. package/dist/languages/typescript/TypeScriptAdapter.d.ts +0 -108
  318. package/dist/languages/typescript/TypeScriptAdapter.d.ts.map +0 -1
  319. package/dist/languages/typescript/TypeScriptAdapter.js +0 -567
  320. package/dist/languages/typescript/TypeScriptAdapter.js.map +0 -1
  321. package/dist/languages/typescript/test-extraction.d.ts +0 -2
  322. package/dist/languages/typescript/test-extraction.d.ts.map +0 -1
  323. package/dist/languages/typescript/test-extraction.js +0 -36
  324. package/dist/languages/typescript/test-extraction.js.map +0 -1
  325. package/dist/mcp-hybrid.d.ts +0 -10
  326. package/dist/mcp-hybrid.d.ts.map +0 -1
  327. package/dist/mcp-hybrid.js +0 -41
  328. package/dist/mcp-hybrid.js.map +0 -1
  329. package/dist/mcp-index.d.ts +0 -13
  330. package/dist/mcp-index.d.ts.map +0 -1
  331. package/dist/mcp-index.js +0 -136
  332. package/dist/mcp-index.js.map +0 -1
  333. package/dist/mcp-standalone.d.ts +0 -3
  334. package/dist/mcp-standalone.d.ts.map +0 -1
  335. package/dist/mcp-standalone.js +0 -1324
  336. package/dist/mcp-standalone.js.map +0 -1
  337. package/dist/mcp-ui-server.d.ts +0 -27
  338. package/dist/mcp-ui-server.d.ts.map +0 -1
  339. package/dist/mcp-ui-server.js +0 -484
  340. package/dist/mcp-ui-server.js.map +0 -1
  341. package/dist/test-multi-strategy-search.d.ts +0 -3
  342. package/dist/test-multi-strategy-search.d.ts.map +0 -1
  343. package/dist/test-multi-strategy-search.js +0 -170
  344. package/dist/test-multi-strategy-search.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"csvReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/csvReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC,CAAC;CACzF;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAiCR;AAmGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsBlE;AAGD,eAAO,MAAM,kBAAkB;;CAE9B,CAAC"}
1
+ {"version":3,"file":"csvReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/csvReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC,CAAC;CACzF;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAiCR;AAmGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsBlE;AAGD,eAAO,MAAM,kBAAkB;IAC7B,QAAQ;CACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"htmlReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/htmlReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAa,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAyBR;AA8UD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
1
+ {"version":3,"file":"htmlReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/htmlReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAa,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAyBR;AA8UD,eAAO,MAAM,mBAAmB;IAC9B,QAAQ;CACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsonReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/jsonReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAYR;AA4ED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqBrE;AAGD,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
1
+ {"version":3,"file":"jsonReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/jsonReportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,CAYR;AA4ED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqBrE;AAGD,eAAO,MAAM,mBAAmB;IAC9B,QAAQ;CACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/reportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKxD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAWhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC;qBASnF,WAAW,UAAU,MAAM,GAAG,MAAM;8BAQ3B,MAAM,aAAa,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM;2BAIrD,MAAM,EAAE;EAIlC;AAGD,eAAO,MAAM,eAAe;;CAE3B,CAAC"}
1
+ {"version":3,"file":"reportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/reportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMxD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAahF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC;IAUpG,QAAQ,SAAS,WAAW,UAAU,MAAM,GAAG,MAAM;IAQrD,iBAAiB,SAAS,MAAM,aAAa,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM;IAI5E,mBAAmB,IAAI,MAAM,EAAE;EAIlC;AAGD,eAAO,MAAM,eAAe;IAC1B,QAAQ;CACT,CAAC"}
@@ -5,6 +5,7 @@
5
5
  import { generateHTMLReport } from './htmlReportGenerator.js';
6
6
  import { generateJSONReport } from './jsonReportGenerator.js';
7
7
  import { generateCSVReport } from './csvReportGenerator.js';
8
+ import { generateSARIFReport } from './sarifReportGenerator.js';
8
9
  /**
9
10
  * Generate a report in the specified format
10
11
  */
@@ -16,6 +17,8 @@ export function generateReport(result, format) {
16
17
  return generateJSONReport(result);
17
18
  case 'csv':
18
19
  return generateCSVReport(result);
20
+ case 'sarif':
21
+ return generateSARIFReport(result);
19
22
  default:
20
23
  throw new Error(`Unknown report format: ${format}`);
21
24
  }
@@ -28,6 +31,7 @@ export function createReportGenerator(customFormatters) {
28
31
  html: generateHTMLReport,
29
32
  json: generateJSONReport,
30
33
  csv: generateCSVReport,
34
+ sarif: generateSARIFReport,
31
35
  ...customFormatters
32
36
  };
33
37
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"reportGenerator.js","sourceRoot":"","sources":["../../src/reporting/reportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,MAAoB;IACtE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,KAAK;YACR,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,gBAAkE;IACtG,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,iBAAiB;QACtB,GAAG,gBAAgB;KACpB,CAAC;IAEF,OAAO;QACL,QAAQ,CAAC,MAAmB,EAAE,MAAc;YAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,iBAAiB,CAAC,MAAc,EAAE,SAA0C;YAC1E,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,mBAAmB;YACjB,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,cAAc;CACzB,CAAC"}
1
+ {"version":3,"file":"reportGenerator.js","sourceRoot":"","sources":["../../src/reporting/reportGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,MAAoB;IACtE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,KAAK;YACR,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,OAAO;YACV,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,gBAAkE;IACtG,MAAM,UAAU,GAAoD;QAClE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,GAAG,gBAAgB;KACpB,CAAC;IAEF,OAAO;QACL,QAAQ,CAAC,MAAmB,EAAE,MAAc;YAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,iBAAiB,CAAC,MAAc,EAAE,SAA0C;YAC1E,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,mBAAmB;YACjB,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,cAAc;CACzB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * SARIF 2.1.0 Report Generator
3
+ *
4
+ * Produces valid SARIF output consumable by GitHub Code Scanning
5
+ * (via github/codeql-action/upload-sarif).
6
+ *
7
+ * Spec 06 — R1: SARIF 2.1.0 emitter for code-auditor-mcp.
8
+ */
9
+ import type { AuditResult, Violation } from '../types.js';
10
+ /**
11
+ * Resolves the stable rule identifier for a violation.
12
+ * The format is `{analyzerName}/{ruleId}`.
13
+ *
14
+ * Precedence for the rule-id portion:
15
+ * 1. `violation.rule` (React, Universal Schema, Invariants)
16
+ * 2. `violation.principle` (SOLID)
17
+ * 3. `violation.details.rule` (React — nested)
18
+ * 4. `violation.type` (DRY, Data Access, Dependency Graph)
19
+ * 5. `violation.schemaType` (Schema)
20
+ * 6. `violation.violationType` (general fallback)
21
+ * 7. `'unknown'`
22
+ */
23
+ export declare function resolveRuleId(violation: Violation): string;
24
+ /**
25
+ * Builds the full SARIF rule ID: `{analyzerName}/{localRuleId}`.
26
+ */
27
+ export declare function buildFullRuleId(analyzerName: string, violation: Violation): string;
28
+ export interface SARIFReportConfig {
29
+ /** Base path for making artifact URIs relative (default: process.cwd()) */
30
+ rootDir?: string;
31
+ }
32
+ /**
33
+ * Generates a SARIF 2.1.0 log string from an AuditResult.
34
+ */
35
+ export declare function generateSARIFReport(result: AuditResult, config?: SARIFReportConfig): string;
36
+ export declare const SARIFReportGenerator: {
37
+ generate: typeof generateSARIFReport;
38
+ };
39
+ //# sourceMappingURL=sarifReportGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarifReportGenerator.d.ts","sourceRoot":"","sources":["../../src/reporting/sarifReportGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAsB1D;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CA0B1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAGlF;AAiCD,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA8F3F;AAkFD,eAAO,MAAM,oBAAoB;IAC/B,QAAQ;CACT,CAAC"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * SARIF 2.1.0 Report Generator
3
+ *
4
+ * Produces valid SARIF output consumable by GitHub Code Scanning
5
+ * (via github/codeql-action/upload-sarif).
6
+ *
7
+ * Spec 06 — R1: SARIF 2.1.0 emitter for code-auditor-mcp.
8
+ */
9
+ import { PACKAGE_VERSION } from '../constants.js';
10
+ import { fingerprint } from '../fingerprint.js';
11
+ // ── Constants ───────────────────────────────────────────────────────────────
12
+ const SARIF_SCHEMA = 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json';
13
+ const SARIF_VERSION = '2.1.0';
14
+ const TOOL_NAME = 'code-auditor-mcp';
15
+ const INFORMATION_URI = 'https://github.com/BenAHammond/code-auditor-mcp';
16
+ // ── Severity mapping (Spec 06 R1.4) ────────────────────────────────────────
17
+ const SEVERITY_TO_LEVEL = {
18
+ critical: 'error',
19
+ warning: 'warning',
20
+ suggestion: 'note',
21
+ };
22
+ // ── Rule ID resolution ──────────────────────────────────────────────────────
23
+ /**
24
+ * Resolves the stable rule identifier for a violation.
25
+ * The format is `{analyzerName}/{ruleId}`.
26
+ *
27
+ * Precedence for the rule-id portion:
28
+ * 1. `violation.rule` (React, Universal Schema, Invariants)
29
+ * 2. `violation.principle` (SOLID)
30
+ * 3. `violation.details.rule` (React — nested)
31
+ * 4. `violation.type` (DRY, Data Access, Dependency Graph)
32
+ * 5. `violation.schemaType` (Schema)
33
+ * 6. `violation.violationType` (general fallback)
34
+ * 7. `'unknown'`
35
+ */
36
+ export function resolveRuleId(violation) {
37
+ if (violation.rule && typeof violation.rule === 'string') {
38
+ return violation.rule;
39
+ }
40
+ if (violation.principle && typeof violation.principle === 'string') {
41
+ return violation.principle;
42
+ }
43
+ if (violation.details &&
44
+ typeof violation.details === 'object' &&
45
+ !Array.isArray(violation.details) &&
46
+ violation.details.rule &&
47
+ typeof violation.details.rule === 'string') {
48
+ return violation.details.rule;
49
+ }
50
+ if (violation.type && typeof violation.type === 'string') {
51
+ return violation.type;
52
+ }
53
+ if (violation.schemaType && typeof violation.schemaType === 'string') {
54
+ return violation.schemaType;
55
+ }
56
+ if (violation.violationType && typeof violation.violationType === 'string') {
57
+ return violation.violationType;
58
+ }
59
+ return 'unknown';
60
+ }
61
+ /**
62
+ * Builds the full SARIF rule ID: `{analyzerName}/{localRuleId}`.
63
+ */
64
+ export function buildFullRuleId(analyzerName, violation) {
65
+ const localId = resolveRuleId(violation);
66
+ return `${normalizeAnalyzerName(analyzerName)}/${localId}`;
67
+ }
68
+ /**
69
+ * Normalizes analyzer names to short kebab-case identifiers.
70
+ */
71
+ function normalizeAnalyzerName(name) {
72
+ const mapping = {
73
+ 'solid-analyzer': 'solid',
74
+ 'dry-analyzer': 'dry',
75
+ 'react-analyzer': 'react',
76
+ 'data-access-analyzer': 'data-access',
77
+ 'documentation-analyzer': 'documentation',
78
+ 'schema-analyzer': 'schema',
79
+ 'universal-schema-analyzer': 'universal-schema',
80
+ 'invariants-analyzer': 'invariants',
81
+ 'dependency-graph-analyzer': 'dependency-graph',
82
+ 'cross-language-solid-analyzer': 'solid',
83
+ 'solid': 'solid',
84
+ 'dry': 'dry',
85
+ 'react': 'react',
86
+ 'data-access': 'data-access',
87
+ 'documentation': 'documentation',
88
+ 'schema': 'schema',
89
+ 'universal-schema': 'universal-schema',
90
+ 'invariants': 'invariants',
91
+ 'dependency-graph': 'dependency-graph',
92
+ 'cross-language-solid': 'solid',
93
+ };
94
+ return mapping[name] ?? name.replace(/[^a-z0-9-]/g, '-').toLowerCase();
95
+ }
96
+ /**
97
+ * Generates a SARIF 2.1.0 log string from an AuditResult.
98
+ */
99
+ export function generateSARIFReport(result, config) {
100
+ const rootDir = config?.rootDir ?? process.cwd();
101
+ const driverRules = [];
102
+ const seenRuleIds = new Set();
103
+ const results = [];
104
+ // Walk all analyzer results and build rules + results
105
+ for (const [analyzerName, analyzerResult] of Object.entries(result.analyzerResults)) {
106
+ const normName = normalizeAnalyzerName(analyzerName);
107
+ for (const violation of analyzerResult.violations) {
108
+ const fullRuleId = buildFullRuleId(analyzerName, violation);
109
+ // Collect unique rules
110
+ if (!seenRuleIds.has(fullRuleId)) {
111
+ seenRuleIds.add(fullRuleId);
112
+ driverRules.push({
113
+ id: fullRuleId,
114
+ shortDescription: {
115
+ text: buildShortDescription(normName, resolveRuleId(violation)),
116
+ },
117
+ fullDescription: {
118
+ text: violation.message,
119
+ },
120
+ helpUri: buildHelpUri(fullRuleId),
121
+ });
122
+ }
123
+ // Build result
124
+ const region = {};
125
+ if (violation.line != null) {
126
+ region.startLine = violation.line;
127
+ region.endLine = violation.line;
128
+ }
129
+ if (violation.column != null) {
130
+ region.startColumn = violation.column;
131
+ }
132
+ const artifactUri = makeRelativeUri(violation.file, rootDir);
133
+ const sarifResult = {
134
+ ruleId: fullRuleId,
135
+ level: mapSeverity(violation.severity),
136
+ message: {
137
+ text: violation.message,
138
+ },
139
+ locations: [
140
+ {
141
+ physicalLocation: {
142
+ artifactLocation: {
143
+ uri: artifactUri,
144
+ },
145
+ region: Object.keys(region).length > 0 ? region : undefined,
146
+ },
147
+ },
148
+ ],
149
+ partialFingerprints: buildPartialFingerprints(analyzerName, violation),
150
+ };
151
+ // Add suggestion as a fix if present
152
+ if (violation.suggestion) {
153
+ sarifResult.fixes = [
154
+ {
155
+ description: {
156
+ text: `Suggestion: ${violation.suggestion}`,
157
+ },
158
+ },
159
+ ];
160
+ }
161
+ results.push(sarifResult);
162
+ }
163
+ }
164
+ // Build the SARIF log
165
+ const sarifLog = {
166
+ $schema: SARIF_SCHEMA,
167
+ version: SARIF_VERSION,
168
+ runs: [
169
+ {
170
+ tool: {
171
+ driver: {
172
+ name: TOOL_NAME,
173
+ version: PACKAGE_VERSION,
174
+ informationUri: INFORMATION_URI,
175
+ rules: driverRules,
176
+ },
177
+ },
178
+ results,
179
+ },
180
+ ],
181
+ };
182
+ return JSON.stringify(sarifLog, null, 2);
183
+ }
184
+ function mapSeverity(severity) {
185
+ return SEVERITY_TO_LEVEL[severity] ?? 'warning';
186
+ }
187
+ function makeRelativeUri(filePath, rootDir) {
188
+ // Normalize and make relative to root directory
189
+ const normalized = filePath.replace(/\\/g, '/');
190
+ if (rootDir && normalized.startsWith(rootDir.replace(/\\/g, '/'))) {
191
+ let relative = normalized.slice(rootDir.replace(/\\/g, '/').length);
192
+ if (relative.startsWith('/')) {
193
+ relative = relative.slice(1);
194
+ }
195
+ return relative || '.';
196
+ }
197
+ return normalized;
198
+ }
199
+ function buildShortDescription(analyzerName, ruleId) {
200
+ return `${analyzerName}: ${ruleId}`;
201
+ }
202
+ function buildHelpUri(fullRuleId) {
203
+ return `${INFORMATION_URI}#${fullRuleId.replace(/\//g, '-')}`;
204
+ }
205
+ function buildPartialFingerprints(analyzerName, violation) {
206
+ const normName = normalizeAnalyzerName(analyzerName);
207
+ const localRule = resolveRuleId(violation);
208
+ const symbol = violation.className ??
209
+ violation.functionName ??
210
+ violation.componentName ??
211
+ violation.symbol ??
212
+ violation.methodName ??
213
+ violation.name ??
214
+ 'unknown';
215
+ const fp = fingerprint({
216
+ analyzer: normName,
217
+ rule: localRule,
218
+ file: violation.file,
219
+ symbol,
220
+ });
221
+ return {
222
+ 'primary': fp,
223
+ };
224
+ }
225
+ // ── Backward-compatible object export ────────────────────────────────────────
226
+ export const SARIFReportGenerator = {
227
+ generate: generateSARIFReport,
228
+ };
229
+ //# sourceMappingURL=sarifReportGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarifReportGenerator.js","sourceRoot":"","sources":["../../src/reporting/sarifReportGenerator.ts"],"names":[],"mappings":"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"}
@@ -59,4 +59,45 @@ export declare class QueryParser {
59
59
  expandQuery(query: string): string;
60
60
  }
61
61
  export declare const queryParser: QueryParser;
62
+ /** Compiled SQL query fragments for use with the SQLite-backed CodeIndexDB. */
63
+ export interface SqlQuery {
64
+ /** FTS5 MATCH expression, or null if no free-text terms */
65
+ ftsMatch: string | null;
66
+ /** WHERE clause fragments (ANDed together) */
67
+ whereClauses: string[];
68
+ /** JOIN clauses for call/dependency graph traversal */
69
+ joinClauses: string[];
70
+ /** Named parameters for the prepared statement */
71
+ params: Record<string, any>;
72
+ /** ORDER BY clause */
73
+ orderBy: string;
74
+ /** LIMIT value */
75
+ limit: number;
76
+ /** OFFSET value */
77
+ offset: number;
78
+ }
79
+ /**
80
+ * Compile a parsed query into SQL fragments for the SQLite-backed CodeIndexDB.
81
+ *
82
+ * The caller assembles the final SQL from the returned fragments:
83
+ * ```sql
84
+ * SELECT f.* [, bm25(functions_fts) as score]
85
+ * FROM functions f
86
+ * [JOIN functions_fts ON functions_fts.rowid = f.id] -- when ftsMatch is set
87
+ * {joinClauses...}
88
+ * WHERE 1=1
89
+ * [AND functions_fts MATCH @ftsMatch] -- when ftsMatch is set
90
+ * {whereClauses...}
91
+ * ORDER BY {orderBy}
92
+ * LIMIT {limit} OFFSET {offset}
93
+ * ```
94
+ *
95
+ * @param parsedQuery The parsed query from {@link QueryParser.parse}.
96
+ * @param options Optional overrides for limit/offset.
97
+ * @returns Compiled SQL fragments.
98
+ */
99
+ export declare function compileToSQL(parsedQuery: ParsedQuery, options?: {
100
+ defaultLimit?: number;
101
+ offset?: number;
102
+ }): SqlQuery;
62
103
  //# sourceMappingURL=QueryParser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryParser.d.ts","sourceRoot":"","sources":["../../src/search/QueryParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CA6D9B;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAmCtB;IAEX;;;;OAIG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAgFxC;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA0DtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAuFxB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAoJ5B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;;;OAIG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB1C;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAK1C;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
1
+ {"version":3,"file":"QueryParser.d.ts","sourceRoot":"","sources":["../../src/search/QueryParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CA6D9B;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAoCtB;IAEX;;;;OAIG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA8EvC;IAED;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA0DtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAqFxB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA+K5B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;;;OAIG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBzC;IAED;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxC;CACF;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC;AAI7C,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,QAAQ,CAiKV"}
@@ -78,6 +78,7 @@ export class QueryParser {
78
78
  'complexity:': 'complexity',
79
79
  'jsdoc:': 'hasJsDoc',
80
80
  'doc:': 'hasJsDoc',
81
+ 'exported:': 'isExported',
81
82
  'since:': 'dateRange',
82
83
  'before:': 'dateRange',
83
84
  'after:': 'dateRange',
@@ -310,12 +311,10 @@ export class QueryParser {
310
311
  valueEndIndex = j;
311
312
  }
312
313
  }
313
- if (value) {
314
- operators.set(operator, value);
315
- // Replace the operator:value with spaces to clean the query
316
- const toReplace = query.substring(i, valueEndIndex);
317
- cleanedQuery = cleanedQuery.replace(toReplace, ' '.repeat(toReplace.length));
318
- }
314
+ operators.set(operator, value);
315
+ // Replace the operator:value with spaces to clean the query
316
+ const toReplace = query.substring(i, valueEndIndex);
317
+ cleanedQuery = cleanedQuery.replace(toReplace, ' '.repeat(toReplace.length));
319
318
  i = valueEndIndex;
320
319
  }
321
320
  else {
@@ -347,22 +346,53 @@ export class QueryParser {
347
346
  parsedQuery.filters.language = value;
348
347
  break;
349
348
  case 'hasJsDoc':
350
- parsedQuery.filters.hasJsDoc = value.toLowerCase() === 'true' || value === '1';
349
+ // Bare keyword (no value) means "enabled" jsdoc: or exported:
350
+ if (value === '' || value === 'true' || value === '1' || value === 'yes') {
351
+ parsedQuery.filters.hasJsDoc = true;
352
+ }
353
+ else if (value === 'false' || value === '0' || value === 'no') {
354
+ parsedQuery.filters.hasJsDoc = false;
355
+ }
356
+ break;
357
+ case 'isExported':
358
+ // Bare keyword (no value) means "enabled"
359
+ if (value === '' || value === 'true' || value === '1' || value === 'yes') {
360
+ parsedQuery.filters.isExported = true;
361
+ }
362
+ else if (value === 'false' || value === '0' || value === 'no') {
363
+ parsedQuery.filters.isExported = false;
364
+ }
351
365
  break;
352
366
  case 'complexity':
353
- if (value.includes('-')) {
354
- const [min, max] = value.split('-').map(v => parseInt(v.trim(), 10));
355
- if (!isNaN(min) && !isNaN(max)) {
356
- parsedQuery.filters.complexity = { min, max };
367
+ // complexity:N (exact), complexity:N-M or N..M (range), complexity:>N, complexity:<N
368
+ if (typeof value === 'string' && value.length > 0) {
369
+ const first = value[0];
370
+ if (first === '>' && /^>\d+$/.test(value)) {
371
+ parsedQuery.filters.complexity = { min: parseInt(value.slice(1), 10) };
357
372
  }
358
- }
359
- else {
360
- const complexityValue = parseInt(value, 10);
361
- if (!isNaN(complexityValue)) {
362
- parsedQuery.filters.complexity = {
363
- min: complexityValue,
364
- max: complexityValue
365
- };
373
+ else if (first === '<' && /^<\d+$/.test(value)) {
374
+ parsedQuery.filters.complexity = { max: parseInt(value.slice(1), 10) };
375
+ }
376
+ else if (value.includes('..')) {
377
+ const [a, b] = value.split('..').map(v => parseInt(v.trim(), 10));
378
+ if (!isNaN(a) && !isNaN(b)) {
379
+ parsedQuery.filters.complexity = { min: a, max: b };
380
+ }
381
+ }
382
+ else if (value.includes('-')) {
383
+ const [min, max] = value.split('-').map(v => parseInt(v.trim(), 10));
384
+ if (!isNaN(min) && !isNaN(max)) {
385
+ parsedQuery.filters.complexity = { min, max };
386
+ }
387
+ }
388
+ else {
389
+ const complexityValue = parseInt(value, 10);
390
+ if (!isNaN(complexityValue)) {
391
+ parsedQuery.filters.complexity = {
392
+ min: complexityValue,
393
+ max: complexityValue,
394
+ };
395
+ }
366
396
  }
367
397
  }
368
398
  break;
@@ -530,4 +560,155 @@ export class QueryParser {
530
560
  }
531
561
  // Export a singleton instance for convenience
532
562
  export const queryParser = new QueryParser();
563
+ /** Escape a string for safe use inside double-quotes in an FTS5 MATCH expression. */
564
+ function escapeFTS5(value) {
565
+ return value.replace(/"/g, '""');
566
+ }
567
+ /**
568
+ * Compile a parsed query into SQL fragments for the SQLite-backed CodeIndexDB.
569
+ *
570
+ * The caller assembles the final SQL from the returned fragments:
571
+ * ```sql
572
+ * SELECT f.* [, bm25(functions_fts) as score]
573
+ * FROM functions f
574
+ * [JOIN functions_fts ON functions_fts.rowid = f.id] -- when ftsMatch is set
575
+ * {joinClauses...}
576
+ * WHERE 1=1
577
+ * [AND functions_fts MATCH @ftsMatch] -- when ftsMatch is set
578
+ * {whereClauses...}
579
+ * ORDER BY {orderBy}
580
+ * LIMIT {limit} OFFSET {offset}
581
+ * ```
582
+ *
583
+ * @param parsedQuery The parsed query from {@link QueryParser.parse}.
584
+ * @param options Optional overrides for limit/offset.
585
+ * @returns Compiled SQL fragments.
586
+ */
587
+ export function compileToSQL(parsedQuery, options) {
588
+ const whereClauses = [];
589
+ const joinClauses = [];
590
+ const params = {};
591
+ // ── FTS5 MATCH expression ───────────────────────────────────────────────
592
+ let ftsMatch = null;
593
+ const matchParts = [];
594
+ // Free-text terms — OR'd together with prefix matching (FTS5 "*" suffix
595
+ // enables matching camelCased tokens like "validateEmail" from "validate")
596
+ if (parsedQuery.terms.length > 0) {
597
+ const termExpr = parsedQuery.terms
598
+ .map((t) => `"${escapeFTS5(t)}"*`)
599
+ .join(' OR ');
600
+ matchParts.push(parsedQuery.terms.length > 1 ? `(${termExpr})` : termExpr);
601
+ }
602
+ // Exact phrases — no prefix; user requested exact match
603
+ for (const phrase of parsedQuery.phrases) {
604
+ matchParts.push(`"${escapeFTS5(phrase)}"`);
605
+ }
606
+ // Excluded terms — prefix matching to match tokenizer behaviour
607
+ for (const term of parsedQuery.excludedTerms) {
608
+ matchParts.push(`NOT "${escapeFTS5(term)}"*`);
609
+ }
610
+ if (matchParts.length > 0) {
611
+ ftsMatch = matchParts.join(' ');
612
+ params.ftsMatch = ftsMatch;
613
+ }
614
+ // ── Operator filters → WHERE clauses ────────────────────────────────────
615
+ const f = parsedQuery.filters;
616
+ // entity: function | component
617
+ if (f.metadata?.entityType) {
618
+ whereClauses.push('entity_type = @entityType');
619
+ params.entityType = f.metadata.entityType;
620
+ }
621
+ // component: functional | class | memo | forwardRef
622
+ if (f.metadata?.componentType) {
623
+ whereClauses.push('component_type = @componentType');
624
+ params.componentType = f.metadata.componentType;
625
+ }
626
+ // hook: useState / hooks: useEffect
627
+ if (f.metadata?.hasHook) {
628
+ whereClauses.push('EXISTS (SELECT 1 FROM json_each(hooks) WHERE LOWER(json_extract(value, \'$.name\')) = LOWER(@hookName))');
629
+ params.hookName = f.metadata.hasHook;
630
+ }
631
+ // prop: / props: <name>
632
+ if (f.metadata?.hasProp) {
633
+ whereClauses.push('EXISTS (SELECT 1 FROM json_each(props) WHERE LOWER(json_extract(value, \'$.name\')) = LOWER(@propName))');
634
+ params.propName = f.metadata.hasProp;
635
+ }
636
+ // dep: / dependency: / uses: <name>
637
+ if (f.metadata?.usesDependency) {
638
+ whereClauses.push('EXISTS (SELECT 1 FROM function_dependencies fd WHERE fd.function_id = f.id AND fd.dependency = @depName)');
639
+ params.depName = f.metadata.usesDependency;
640
+ }
641
+ // calls: <name>
642
+ if (f.metadata?.callsFunction) {
643
+ joinClauses.push('JOIN function_calls fc ON fc.caller_id = f.id');
644
+ whereClauses.push('fc.callee_name = @calleeName');
645
+ params.calleeName = f.metadata.callsFunction;
646
+ }
647
+ // calledby: / dependents-of: / used-by: <name>
648
+ if (f.metadata?.calledByFunction) {
649
+ whereClauses.push('EXISTS (SELECT 1 FROM function_calls fc2 WHERE fc2.callee_name = f.name AND fc2.caller_id IN (SELECT id FROM functions WHERE name = @calledByName))');
650
+ params.calledByName = f.metadata.calledByFunction;
651
+ }
652
+ // depends-on: / imports-from: <module>
653
+ if (f.metadata?.dependsOnModule) {
654
+ whereClauses.push('EXISTS (SELECT 1 FROM function_dependencies fd2 WHERE fd2.function_id = f.id AND fd2.dependency LIKE @modulePattern)');
655
+ params.modulePattern = `%${f.metadata.dependsOnModule}%`;
656
+ }
657
+ // unused-imports / dead-imports
658
+ if (f.metadata?.hasUnusedImports) {
659
+ whereClauses.push('has_unused_imports = 1');
660
+ }
661
+ // lang: / language:
662
+ if (f.language) {
663
+ whereClauses.push('LOWER(language) = LOWER(@language)');
664
+ params.language = f.language;
665
+ }
666
+ // file: / path: (glob)
667
+ if (f.filePath) {
668
+ whereClauses.push('file_path GLOB @fileGlob');
669
+ params.fileGlob = f.filePath;
670
+ }
671
+ // jsdoc: / doc:
672
+ if (f.hasJsDoc) {
673
+ whereClauses.push('has_jsdoc = 1');
674
+ }
675
+ // exported:
676
+ if (f.isExported) {
677
+ whereClauses.push('is_exported = 1');
678
+ }
679
+ // complexity: N, complexity: N..M, complexity: >N, complexity: <N
680
+ if (f.complexity) {
681
+ if (f.complexity.min !== undefined && f.complexity.max !== undefined) {
682
+ if (f.complexity.min === f.complexity.max) {
683
+ whereClauses.push('complexity = @complexityExact');
684
+ params.complexityExact = f.complexity.min;
685
+ }
686
+ else {
687
+ whereClauses.push('complexity BETWEEN @cMin AND @cMax');
688
+ params.cMin = f.complexity.min;
689
+ params.cMax = f.complexity.max;
690
+ }
691
+ }
692
+ else if (f.complexity.min !== undefined) {
693
+ whereClauses.push('complexity > @cMin');
694
+ params.cMin = f.complexity.min;
695
+ }
696
+ else if (f.complexity.max !== undefined) {
697
+ whereClauses.push('complexity < @cMax');
698
+ params.cMax = f.complexity.max;
699
+ }
700
+ }
701
+ // fileType — filter by file extension (not a column, so use LIKE on file_path)
702
+ if (f.fileType) {
703
+ const ext = f.fileType.startsWith('.') ? f.fileType : `.${f.fileType}`;
704
+ whereClauses.push('file_path LIKE @fileExt');
705
+ params.fileExt = `%${ext}`;
706
+ }
707
+ // ── Ordering ────────────────────────────────────────────────────────────
708
+ const orderBy = ftsMatch ? 'score' : 'name';
709
+ // ── Limit / offset ──────────────────────────────────────────────────────
710
+ const limit = options?.defaultLimit ?? 200;
711
+ const offset = options?.offset ?? 0;
712
+ return { ftsMatch, whereClauses, joinClauses, params, orderBy, limit, offset };
713
+ }
533
714
  //# sourceMappingURL=QueryParser.js.map