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,118 +1,223 @@
1
1
  /**
2
2
  * Enhanced Code Index Database for Cross-Language Support
3
- * Extends the existing CodeIndexDB with multi-language capabilities
3
+ * Extends the SQLite-backed CodeIndexDB with multi-language capabilities.
4
+ *
5
+ * TODO: Cross-language features (FTS5 search, dep graph, analysis) will get their
6
+ * own dedicated schema and tests in a follow-up spec. For now, this provides
7
+ * the SQLite tables and basic CRUD — enough for the tests to continue passing.
4
8
  */
5
- import * as FlexSearch from 'flexsearch';
6
9
  import { CodeIndexDB } from './codeIndexDB.js';
7
- /**
8
- * Enhanced CodeIndexDB with cross-language support
9
- * Maintains backward compatibility while adding new capabilities
10
- */
10
+ // ── Cross-language SQLite adapter ──────────────────────────────────────
11
+ class CrossLangCollectionAdapter {
12
+ db;
13
+ tableName;
14
+ constructor(db, tableName) {
15
+ this.db = db;
16
+ this.tableName = tableName;
17
+ }
18
+ find(query) {
19
+ if (!query) {
20
+ return this.db.prepare(`SELECT *, rowid as "$loki" FROM "${this.tableName}"`).all()
21
+ .map((r) => this.rowToDoc(r));
22
+ }
23
+ // Handle $or
24
+ if (query.$or && Array.isArray(query.$or)) {
25
+ const results = [];
26
+ for (const subQuery of query.$or) {
27
+ results.push(...this.find(subQuery));
28
+ }
29
+ // Deduplicate by $loki
30
+ const seen = new Set();
31
+ return results.filter(r => {
32
+ if (seen.has(r.$loki))
33
+ return false;
34
+ seen.add(r.$loki);
35
+ return true;
36
+ });
37
+ }
38
+ // Handle $in
39
+ const clauses = [];
40
+ const params = {};
41
+ for (const [key, value] of Object.entries(query)) {
42
+ if (value && typeof value === 'object' && '$in' in value) {
43
+ const vals = value.$in;
44
+ const placeholders = vals.map((_, i) => `@in_${key}_${i}`);
45
+ clauses.push(`"${key}" IN (${placeholders.join(', ')})`);
46
+ vals.forEach((v, i) => { params[`in_${key}_${i}`] = v; });
47
+ }
48
+ else if (value === null || value === undefined) {
49
+ clauses.push(`"${key}" IS NULL`);
50
+ }
51
+ else {
52
+ clauses.push(`"${key}" = @${key}`);
53
+ params[key] = value;
54
+ }
55
+ }
56
+ const sql = `SELECT *, rowid as "$loki" FROM "${this.tableName}"${clauses.length ? ' WHERE ' + clauses.join(' AND ') : ''}`;
57
+ return this.db.prepare(sql).all(params).map((r) => this.rowToDoc(r));
58
+ }
59
+ findOne(query) {
60
+ const results = this.find({ ...query, _limit: 1 });
61
+ return results[0] ?? null;
62
+ }
63
+ insert(doc) {
64
+ const row = doc;
65
+ const keys = Object.keys(row).filter(k => k !== '$loki');
66
+ const vals = keys.map(k => `@${k}`);
67
+ const sql = `INSERT INTO "${this.tableName}" ("${keys.join('", "')}") VALUES (${vals.join(', ')})`;
68
+ const info = this.db.prepare(sql).run(row);
69
+ doc.$loki = Number(info.lastInsertRowid);
70
+ return doc;
71
+ }
72
+ update(doc) {
73
+ const row = doc;
74
+ const keys = Object.keys(row).filter(k => k !== '$loki');
75
+ const sets = keys.map(k => `"${k}" = @${k}`);
76
+ const params = {};
77
+ for (const k of keys)
78
+ params[k] = row[k];
79
+ params['_rowid'] = row.$loki;
80
+ this.db.prepare(`UPDATE "${this.tableName}" SET ${sets.join(', ')} WHERE rowid = @_rowid`).run(params);
81
+ }
82
+ get(id) {
83
+ const row = this.db.prepare(`SELECT *, rowid as "$loki" FROM "${this.tableName}" WHERE rowid = ?`).get(id);
84
+ return row ? this.rowToDoc(row) : null;
85
+ }
86
+ remove(doc) {
87
+ if (doc.$loki !== undefined) {
88
+ this.db.prepare(`DELETE FROM "${this.tableName}" WHERE rowid = ?`).run(doc.$loki);
89
+ }
90
+ }
91
+ removeWhere(query) {
92
+ const clauses = [];
93
+ const params = {};
94
+ for (const [key, value] of Object.entries(query)) {
95
+ if (value === null || value === undefined) {
96
+ clauses.push(`"${key}" IS NULL`);
97
+ }
98
+ else {
99
+ clauses.push(`"${key}" = @${key}`);
100
+ params[key] = value;
101
+ }
102
+ }
103
+ const sql = `DELETE FROM "${this.tableName}"${clauses.length ? ' WHERE ' + clauses.join(' AND ') : ''}`;
104
+ this.db.prepare(sql).run(params);
105
+ }
106
+ clear() {
107
+ this.db.prepare(`DELETE FROM "${this.tableName}"`).run();
108
+ }
109
+ rowToDoc(row) {
110
+ const doc = {};
111
+ for (const [key, value] of Object.entries(row)) {
112
+ // Unpack JSON columns
113
+ if (typeof value === 'string' && (key.endsWith('_json') || key === 'searchTokens' || key === 'calls' ||
114
+ key === 'calledBy' || key === 'implementedBy' || key === 'extendedBy' || key === 'parameters')) {
115
+ try {
116
+ doc[key] = JSON.parse(value);
117
+ }
118
+ catch {
119
+ doc[key] = value;
120
+ }
121
+ }
122
+ else {
123
+ doc[key] = value;
124
+ }
125
+ }
126
+ if ('createdAt' in doc && typeof doc.createdAt === 'string')
127
+ doc.createdAt = new Date(doc.createdAt);
128
+ if ('updatedAt' in doc && typeof doc.updatedAt === 'string')
129
+ doc.updatedAt = new Date(doc.updatedAt);
130
+ return doc;
131
+ }
132
+ }
133
+ // ── Main enhanced class ─────────────────────────────────────────────────
11
134
  export class EnhancedCodeIndexDB extends CodeIndexDB {
12
- // New collections for cross-language support
13
- crossLanguageEntitiesCollection = null;
14
- crossReferencesCollection = null;
15
- apiContractsCollection = null;
16
- // Enhanced search index for cross-language entities
17
- crossLanguageSearchIndex;
135
+ /** @internal subclasses use these directly */
136
+ crossLanguageEntities;
137
+ crossReferences;
138
+ apiContracts;
139
+ enhancedInitialized = false;
18
140
  migrationCompleted = false;
19
141
  constructor(dbPath = ':memory:') {
20
142
  super(dbPath);
21
- // Initialize enhanced FlexSearch for cross-language entities
22
- const { Document } = FlexSearch;
23
- this.crossLanguageSearchIndex = new Document({
24
- document: {
25
- id: '$loki',
26
- index: [
27
- {
28
- field: 'name',
29
- tokenize: 'full',
30
- optimize: true,
31
- resolution: 9,
32
- bidirectional: true,
33
- weight: 10
34
- },
35
- {
36
- field: 'signature',
37
- tokenize: 'full',
38
- optimize: true,
39
- resolution: 9,
40
- weight: 9
41
- },
42
- {
43
- field: 'purpose',
44
- tokenize: 'full',
45
- optimize: true,
46
- resolution: 9,
47
- weight: 8
48
- },
49
- {
50
- field: 'context',
51
- tokenize: 'full',
52
- optimize: true,
53
- resolution: 9,
54
- weight: 7
55
- },
56
- {
57
- field: 'language',
58
- tokenize: 'full',
59
- optimize: true,
60
- resolution: 9,
61
- weight: 6
62
- },
63
- {
64
- field: 'type',
65
- tokenize: 'full',
66
- optimize: true,
67
- resolution: 9,
68
- weight: 6
69
- },
70
- {
71
- field: 'searchTokens',
72
- tokenize: 'full',
73
- optimize: true,
74
- resolution: 9,
75
- weight: 5
76
- },
77
- {
78
- field: 'file',
79
- tokenize: 'full',
80
- optimize: true,
81
- resolution: 9,
82
- weight: 3
83
- }
84
- ]
85
- }
86
- });
87
143
  }
88
144
  /**
89
- * Initialize enhanced collections
145
+ * Initialize enhanced collections (SQLite tables).
90
146
  */
91
147
  async initializeEnhanced() {
92
- await this.initialize(); // Initialize base collections first
93
- this.crossLanguageEntitiesCollection =
94
- this.db.getCollection('crossLanguageEntities') ||
95
- this.db.addCollection('crossLanguageEntities', {
96
- indices: ['id', 'name', 'language', 'type', 'file'],
97
- unique: ['id']
98
- });
99
- this.crossReferencesCollection =
100
- this.db.getCollection('crossReferences') ||
101
- this.db.addCollection('crossReferences', {
102
- indices: [
103
- 'sourceId',
104
- 'targetId',
105
- 'sourceLanguage',
106
- 'targetLanguage',
107
- 'type'
108
- ]
109
- });
110
- this.apiContractsCollection =
111
- this.db.getCollection('apiContracts') ||
112
- this.db.addCollection('apiContracts', {
113
- indices: ['entityId', 'version']
114
- });
115
- console.log('[EnhancedCodeIndexDB] Cross-language collections initialized');
148
+ if (this.enhancedInitialized)
149
+ return;
150
+ await this.initialize(); // Ensure base is ready
151
+ // Create cross-language tables
152
+ this.db.exec(`
153
+ CREATE TABLE IF NOT EXISTS cross_language_entities (
154
+ id TEXT PRIMARY KEY,
155
+ name TEXT NOT NULL,
156
+ language TEXT NOT NULL DEFAULT 'typescript',
157
+ file TEXT NOT NULL,
158
+ type TEXT NOT NULL DEFAULT 'function',
159
+ startLine INTEGER,
160
+ endLine INTEGER,
161
+ lineNumber INTEGER,
162
+ signature TEXT,
163
+ parameters TEXT DEFAULT '[]',
164
+ returnType TEXT,
165
+ purpose TEXT DEFAULT '',
166
+ context TEXT DEFAULT '',
167
+ complexity INTEGER DEFAULT 0,
168
+ searchTokens TEXT DEFAULT '[]',
169
+ calls TEXT DEFAULT '[]',
170
+ calledBy TEXT DEFAULT '[]',
171
+ implementedBy TEXT DEFAULT '[]',
172
+ extendedBy TEXT DEFAULT '[]',
173
+ metadata_json TEXT DEFAULT '{}',
174
+ created_at TEXT DEFAULT (datetime('now')),
175
+ updated_at TEXT DEFAULT (datetime('now'))
176
+ );
177
+ CREATE INDEX IF NOT EXISTS idx_cle_language ON cross_language_entities(language);
178
+ CREATE INDEX IF NOT EXISTS idx_cle_type ON cross_language_entities(type);
179
+ CREATE INDEX IF NOT EXISTS idx_cle_file ON cross_language_entities(file);
180
+
181
+ -- FTS5 for cross-language entity search
182
+ CREATE VIRTUAL TABLE IF NOT EXISTS cross_language_fts USING fts5(
183
+ name, signature, purpose, context, language, type, searchTokens,
184
+ content='cross_language_entities', content_rowid='rowid',
185
+ tokenize='porter unicode61'
186
+ );
187
+
188
+ CREATE TABLE IF NOT EXISTS cross_references (
189
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
190
+ sourceId TEXT NOT NULL,
191
+ targetId TEXT NOT NULL,
192
+ sourceLanguage TEXT,
193
+ targetLanguage TEXT,
194
+ type TEXT DEFAULT 'calls',
195
+ protocol TEXT,
196
+ confidence REAL DEFAULT 1.0,
197
+ metadata_json TEXT DEFAULT '{}',
198
+ created_at TEXT DEFAULT (datetime('now')),
199
+ updated_at TEXT DEFAULT (datetime('now'))
200
+ );
201
+ CREATE INDEX IF NOT EXISTS idx_cref_source ON cross_references(sourceId);
202
+ CREATE INDEX IF NOT EXISTS idx_cref_target ON cross_references(targetId);
203
+
204
+ CREATE TABLE IF NOT EXISTS api_contracts (
205
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
206
+ entityId TEXT NOT NULL,
207
+ version TEXT DEFAULT '1.0.0',
208
+ endpoints TEXT DEFAULT '[]',
209
+ schemas TEXT DEFAULT '{}',
210
+ protocols TEXT DEFAULT '[]',
211
+ metadata_json TEXT DEFAULT '{}',
212
+ created_at TEXT DEFAULT (datetime('now')),
213
+ updated_at TEXT DEFAULT (datetime('now'))
214
+ );
215
+ CREATE INDEX IF NOT EXISTS idx_ac_entity ON api_contracts(entityId);
216
+ `);
217
+ this.crossLanguageEntities = new CrossLangCollectionAdapter(this.db, 'cross_language_entities');
218
+ this.crossReferences = new CrossLangCollectionAdapter(this.db, 'cross_references');
219
+ this.apiContracts = new CrossLangCollectionAdapter(this.db, 'api_contracts');
220
+ this.enhancedInitialized = true;
116
221
  }
117
222
  /**
118
223
  * Migrate existing data to cross-language format
@@ -124,11 +229,9 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
124
229
  validateContracts: false
125
230
  }) {
126
231
  if (this.migrationCompleted) {
127
- console.log('[EnhancedCodeIndexDB] Migration already completed');
128
232
  return;
129
233
  }
130
- console.log('[EnhancedCodeIndexDB] Starting migration to enhanced schema...');
131
- if (!this.crossLanguageEntitiesCollection) {
234
+ if (!this.enhancedInitialized) {
132
235
  await this.initializeEnhanced();
133
236
  }
134
237
  const adapter = new DefaultCompatibilityAdapter();
@@ -138,19 +241,14 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
138
241
  const entity = adapter.convertFunction(func);
139
242
  await this.addCrossLanguageEntity(entity);
140
243
  }
141
- // Migrate existing components (if any)
142
- // Note: This assumes components are stored somehow in the base class
143
- // Implementation would depend on how components are currently stored
144
- console.log(`[EnhancedCodeIndexDB] Migrated ${existingFunctions.length} functions to cross-language format`);
145
244
  this.migrationCompleted = true;
146
245
  }
147
246
  /**
148
247
  * Add a cross-language entity to the index
149
248
  */
150
249
  async addCrossLanguageEntity(entity) {
151
- if (!this.crossLanguageEntitiesCollection) {
250
+ if (!this.enhancedInitialized)
152
251
  await this.initializeEnhanced();
153
- }
154
252
  // Ensure required fields
155
253
  const enhancedEntity = {
156
254
  ...entity,
@@ -159,42 +257,35 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
159
257
  createdAt: new Date(),
160
258
  updatedAt: new Date()
161
259
  };
162
- // Check for existing entity
163
- const existing = this.crossLanguageEntitiesCollection.findOne({ id: enhancedEntity.id });
260
+ const existing = this.crossLanguageEntities.findOne({ id: enhancedEntity.id });
164
261
  if (existing) {
165
- // Update existing
166
262
  Object.assign(existing, enhancedEntity);
167
263
  existing.updatedAt = new Date();
168
- this.crossLanguageEntitiesCollection.update(existing);
264
+ this.crossLanguageEntities.update(existing);
169
265
  }
170
266
  else {
171
- // Add new
172
- this.crossLanguageEntitiesCollection.insert(enhancedEntity);
267
+ this.crossLanguageEntities.insert(enhancedEntity);
173
268
  }
174
- // Update search index
175
- this.crossLanguageSearchIndex.add(enhancedEntity);
176
269
  }
177
270
  /**
178
271
  * Add cross-reference between entities
179
272
  */
180
273
  async addCrossReference(reference) {
181
- if (!this.crossReferencesCollection) {
274
+ if (!this.enhancedInitialized)
182
275
  await this.initializeEnhanced();
183
- }
184
276
  const refDoc = {
185
277
  ...reference,
186
278
  createdAt: new Date(),
187
279
  updatedAt: new Date()
188
280
  };
189
- this.crossReferencesCollection.insert(refDoc);
281
+ this.crossReferences.insert(refDoc);
190
282
  }
191
283
  /**
192
284
  * Add API contract for an entity
193
285
  */
194
286
  async addAPIContract(entityId, contract) {
195
- if (!this.apiContractsCollection) {
287
+ if (!this.enhancedInitialized)
196
288
  await this.initializeEnhanced();
197
- }
198
289
  const contractDoc = {
199
290
  ...contract,
200
291
  entityId,
@@ -202,53 +293,80 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
202
293
  updatedAt: new Date()
203
294
  };
204
295
  // Remove existing contract for this entity
205
- this.apiContractsCollection.removeWhere({ entityId });
296
+ this.apiContracts.removeWhere({ entityId });
206
297
  // Add new contract
207
- this.apiContractsCollection.insert(contractDoc);
298
+ this.apiContracts.insert(contractDoc);
208
299
  }
209
300
  /**
210
- * Search cross-language entities
301
+ * Search cross-language entities (uses FTS5).
211
302
  */
212
303
  async searchCrossLanguage(query, options = {}) {
213
- if (!this.crossLanguageEntitiesCollection) {
304
+ if (!this.enhancedInitialized)
214
305
  await this.initializeEnhanced();
215
- }
216
- // Perform FlexSearch
217
- const searchResults = this.crossLanguageSearchIndex.search(query, {
218
- limit: 50,
219
- enrich: true
220
- });
221
306
  const results = [];
222
- for (const result of searchResults) {
223
- for (const doc of result.result) {
224
- const entity = this.crossLanguageEntitiesCollection.get(doc.id);
225
- if (!entity)
226
- continue;
227
- // Apply filters
228
- if (options.languages && !options.languages.includes(entity.language))
229
- continue;
230
- if (options.types && !options.types.includes(entity.type))
231
- continue;
232
- const searchResult = {
233
- entity,
234
- score: 1.0, // FlexSearch doesn't provide scores directly
235
- matches: [result.field] // Field that matched
236
- };
237
- // Include references if requested
238
- if (options.includeReferences) {
239
- searchResult.references = this.crossReferencesCollection.find({
240
- $or: [
241
- { sourceId: entity.id },
242
- { targetId: entity.id }
243
- ]
244
- });
307
+ // FTS5 search
308
+ let ftsQuery = query.split(/\s+/).map(t => `"${t.replace(/"/g, '""')}"`).join(' AND ');
309
+ if (!ftsQuery)
310
+ ftsQuery = '"*"';
311
+ let sql = `SELECT cle.*, cle.rowid as "$loki" FROM cross_language_entities cle
312
+ JOIN cross_language_fts ON cross_language_fts.rowid = cle.rowid
313
+ WHERE cross_language_fts MATCH @q`;
314
+ const params = { q: ftsQuery };
315
+ if (options.languages && options.languages.length > 0) {
316
+ sql += ' AND cle.language IN (@langs)';
317
+ params.langs = options.languages;
318
+ }
319
+ if (options.types && options.types.length > 0) {
320
+ sql += ' AND cle.type IN (@types)';
321
+ params.types = options.types;
322
+ }
323
+ sql += ' ORDER BY rank LIMIT 50';
324
+ let rows;
325
+ try {
326
+ rows = this.db.prepare(sql).all(params);
327
+ }
328
+ catch {
329
+ // FTS5 syntax error — fall back to LIKE-based search (simple)
330
+ sql = `SELECT cle.*, cle.rowid as "$loki" FROM cross_language_entities cle
331
+ WHERE cle.name LIKE @like`;
332
+ params.like = `%${query}%`;
333
+ rows = this.db.prepare(sql).all(params);
334
+ }
335
+ for (const row of rows) {
336
+ const entity = {};
337
+ for (const [k, v] of Object.entries(row)) {
338
+ if (typeof v === 'string' && ['parameters', 'searchTokens', 'calls', 'calledBy',
339
+ 'implementedBy', 'extendedBy', 'metadata_json'].includes(k)) {
340
+ try {
341
+ entity[k] = JSON.parse(v);
342
+ }
343
+ catch {
344
+ entity[k] = v;
345
+ }
245
346
  }
246
- // Include contracts if requested
247
- if (options.includeContracts) {
248
- searchResult.contracts = this.apiContractsCollection.find({ entityId: entity.id });
347
+ else {
348
+ entity[k] = v;
249
349
  }
250
- results.push(searchResult);
251
350
  }
351
+ if (options.languages && !options.languages.includes(entity.language))
352
+ continue;
353
+ if (options.types && !options.types.includes(entity.type))
354
+ continue;
355
+ const searchResult = {
356
+ entity,
357
+ score: 1.0,
358
+ matches: ['name']
359
+ };
360
+ if (options.includeReferences) {
361
+ searchResult.references = [
362
+ ...this.crossReferences.find({ sourceId: entity.id }),
363
+ ...this.crossReferences.find({ targetId: entity.id })
364
+ ];
365
+ }
366
+ if (options.includeContracts) {
367
+ searchResult.contracts = this.apiContracts.find({ entityId: entity.id });
368
+ }
369
+ results.push(searchResult);
252
370
  }
253
371
  return results;
254
372
  }
@@ -256,54 +374,47 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
256
374
  * Find entity by ID
257
375
  */
258
376
  async findEntityById(id) {
259
- if (!this.crossLanguageEntitiesCollection) {
377
+ if (!this.enhancedInitialized)
260
378
  await this.initializeEnhanced();
261
- }
262
- return this.crossLanguageEntitiesCollection.findOne({ id }) || null;
379
+ return this.crossLanguageEntities.findOne({ id }) || null;
263
380
  }
264
381
  /**
265
382
  * Find entities by language
266
383
  */
267
384
  async findEntitiesByLanguage(language) {
268
- if (!this.crossLanguageEntitiesCollection) {
385
+ if (!this.enhancedInitialized)
269
386
  await this.initializeEnhanced();
270
- }
271
- return this.crossLanguageEntitiesCollection.find({ language });
387
+ return this.crossLanguageEntities.find({ language });
272
388
  }
273
389
  /**
274
390
  * Find entities by type
275
391
  */
276
392
  async findEntitiesByType(type) {
277
- if (!this.crossLanguageEntitiesCollection) {
393
+ if (!this.enhancedInitialized)
278
394
  await this.initializeEnhanced();
279
- }
280
- return this.crossLanguageEntitiesCollection.find({ type });
395
+ return this.crossLanguageEntities.find({ type });
281
396
  }
282
397
  /**
283
398
  * Get cross-references for an entity
284
399
  */
285
400
  async getCrossReferences(entityId) {
286
- if (!this.crossReferencesCollection) {
401
+ if (!this.enhancedInitialized)
287
402
  await this.initializeEnhanced();
288
- }
289
- return this.crossReferencesCollection.find({
290
- $or: [
291
- { sourceId: entityId },
292
- { targetId: entityId }
293
- ]
294
- });
403
+ return [
404
+ ...this.crossReferences.find({ sourceId: entityId }),
405
+ ...this.crossReferences.find({ targetId: entityId })
406
+ ];
295
407
  }
296
408
  /**
297
409
  * Generate dependency graph
298
410
  */
299
411
  async generateDependencyGraph(languages) {
300
- if (!this.crossLanguageEntitiesCollection || !this.crossReferencesCollection) {
412
+ if (!this.enhancedInitialized)
301
413
  await this.initializeEnhanced();
302
- }
303
414
  const entities = languages
304
- ? this.crossLanguageEntitiesCollection.find({ language: { $in: languages } })
305
- : this.crossLanguageEntitiesCollection.find();
306
- const references = this.crossReferencesCollection.find();
415
+ ? this.crossLanguageEntities.find({ language: { $in: languages } })
416
+ : this.crossLanguageEntities.find();
417
+ const references = this.crossReferences.find();
307
418
  const nodes = entities.map(entity => ({
308
419
  id: entity.id,
309
420
  name: entity.name,
@@ -319,7 +430,6 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
319
430
  weight: ref.confidence,
320
431
  protocol: ref.protocol
321
432
  }));
322
- // TODO: Implement cycle detection
323
433
  const cycles = [];
324
434
  return {
325
435
  nodes,
@@ -329,9 +439,9 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
329
439
  totalNodes: nodes.length,
330
440
  totalEdges: edges.length,
331
441
  cycleCount: cycles.length,
332
- averageDepth: 0, // TODO: Calculate
333
- maxDepth: 0, // TODO: Calculate
334
- stronglyConnectedComponents: 0 // TODO: Calculate
442
+ averageDepth: 0,
443
+ maxDepth: 0,
444
+ stronglyConnectedComponents: 0
335
445
  }
336
446
  };
337
447
  }
@@ -339,12 +449,11 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
339
449
  * Get analysis summary
340
450
  */
341
451
  async getAnalysisSummary() {
342
- if (!this.crossLanguageEntitiesCollection || !this.crossReferencesCollection) {
452
+ if (!this.enhancedInitialized)
343
453
  await this.initializeEnhanced();
344
- }
345
- const entities = this.crossLanguageEntitiesCollection.find();
346
- const references = this.crossReferencesCollection.find();
347
- const contracts = this.apiContractsCollection.find();
454
+ const entities = this.crossLanguageEntities.find();
455
+ const references = this.crossReferences.find();
456
+ const contracts = this.apiContracts.find();
348
457
  const entitiesByLanguage = {};
349
458
  const entitiesByType = {};
350
459
  const complexities = {};
@@ -378,7 +487,7 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
378
487
  apiContracts: contracts.length,
379
488
  orphanedEntities,
380
489
  complexities: avgComplexities,
381
- coverage: {} // TODO: Calculate test coverage
490
+ coverage: {}
382
491
  };
383
492
  }
384
493
  /**
@@ -413,26 +522,15 @@ export class EnhancedCodeIndexDB extends CodeIndexDB {
413
522
  return Array.from(tokens);
414
523
  }
415
524
  /**
416
- * Also clears cross-language derived collections and their FlexSearch mirror when present.
525
+ * Also clears cross-language derived collections.
417
526
  */
418
527
  async clearIndex() {
419
528
  await super.clearIndex();
420
- const ldb = this.db;
421
- const names = [
422
- 'crossLanguageEntities',
423
- 'crossReferences',
424
- 'apiContracts'
425
- ];
426
- for (const n of names) {
427
- const c = ldb.getCollection(n);
428
- if (c) {
429
- c.clear();
430
- }
431
- }
432
- if (this.crossLanguageSearchIndex) {
433
- this.crossLanguageSearchIndex.clear();
529
+ if (this.enhancedInitialized) {
530
+ this.crossLanguageEntities.clear();
531
+ this.crossReferences.clear();
532
+ this.apiContracts.clear();
434
533
  }
435
- ldb.saveDatabase();
436
534
  }
437
535
  }
438
536
  /**
@@ -449,8 +547,8 @@ class DefaultCompatibilityAdapter {
449
547
  startLine: func.startLine,
450
548
  endLine: func.endLine,
451
549
  lineNumber: func.lineNumber,
452
- signature: func.name, // Basic signature, could be enhanced
453
- parameters: [], // Would need to be extracted from enhanced metadata
550
+ signature: func.name,
551
+ parameters: [],
454
552
  purpose: func.purpose,
455
553
  context: func.context,
456
554
  searchTokens: [],
@@ -497,14 +595,13 @@ class DefaultCompatibilityAdapter {
497
595
  startLine: entity.startLine,
498
596
  endLine: entity.endLine,
499
597
  language: entity.language,
500
- dependencies: [], // Would need to be extracted from references
598
+ dependencies: [],
501
599
  purpose: entity.purpose,
502
600
  context: entity.context,
503
601
  metadata: entity.metadata
504
602
  };
505
603
  }
506
604
  toComponentMetadata(entity) {
507
- // This would need more implementation based on the ComponentMetadata interface
508
605
  throw new Error('Component metadata conversion not implemented');
509
606
  }
510
607
  generateId(type, filePath, name, line) {