@optave/codegraph 3.7.0 → 3.8.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 (401) hide show
  1. package/README.md +28 -16
  2. package/dist/ast-analysis/engine.d.ts.map +1 -1
  3. package/dist/ast-analysis/engine.js +195 -30
  4. package/dist/ast-analysis/engine.js.map +1 -1
  5. package/dist/ast-analysis/metrics.d.ts +0 -3
  6. package/dist/ast-analysis/metrics.d.ts.map +1 -1
  7. package/dist/ast-analysis/metrics.js +30 -13
  8. package/dist/ast-analysis/metrics.js.map +1 -1
  9. package/dist/ast-analysis/rules/javascript.d.ts.map +1 -1
  10. package/dist/ast-analysis/rules/javascript.js +0 -1
  11. package/dist/ast-analysis/rules/javascript.js.map +1 -1
  12. package/dist/ast-analysis/shared.d.ts.map +1 -1
  13. package/dist/ast-analysis/shared.js +24 -19
  14. package/dist/ast-analysis/shared.js.map +1 -1
  15. package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
  16. package/dist/ast-analysis/visitor-utils.js +55 -39
  17. package/dist/ast-analysis/visitor-utils.js.map +1 -1
  18. package/dist/ast-analysis/visitor.d.ts.map +1 -1
  19. package/dist/ast-analysis/visitor.js +91 -70
  20. package/dist/ast-analysis/visitor.js.map +1 -1
  21. package/dist/ast-analysis/visitors/ast-store-visitor.d.ts.map +1 -1
  22. package/dist/ast-analysis/visitors/ast-store-visitor.js +52 -129
  23. package/dist/ast-analysis/visitors/ast-store-visitor.js.map +1 -1
  24. package/dist/ast-analysis/visitors/complexity-visitor.d.ts.map +1 -1
  25. package/dist/ast-analysis/visitors/complexity-visitor.js +32 -39
  26. package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
  27. package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
  28. package/dist/ast-analysis/visitors/dataflow-visitor.js +57 -38
  29. package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
  30. package/dist/cli/commands/ast.js +2 -2
  31. package/dist/cli/commands/ast.js.map +1 -1
  32. package/dist/cli/commands/watch.d.ts.map +1 -1
  33. package/dist/cli/commands/watch.js +16 -2
  34. package/dist/cli/commands/watch.js.map +1 -1
  35. package/dist/db/connection.d.ts.map +1 -1
  36. package/dist/db/connection.js +29 -26
  37. package/dist/db/connection.js.map +1 -1
  38. package/dist/db/query-builder.d.ts.map +1 -1
  39. package/dist/db/query-builder.js +16 -5
  40. package/dist/db/query-builder.js.map +1 -1
  41. package/dist/db/repository/base.d.ts +10 -0
  42. package/dist/db/repository/base.d.ts.map +1 -1
  43. package/dist/db/repository/base.js +17 -0
  44. package/dist/db/repository/base.js.map +1 -1
  45. package/dist/db/repository/native-repository.d.ts +6 -1
  46. package/dist/db/repository/native-repository.d.ts.map +1 -1
  47. package/dist/db/repository/native-repository.js +77 -1
  48. package/dist/db/repository/native-repository.js.map +1 -1
  49. package/dist/db/repository/nodes.d.ts.map +1 -1
  50. package/dist/db/repository/nodes.js +8 -4
  51. package/dist/db/repository/nodes.js.map +1 -1
  52. package/dist/db/repository/sqlite-repository.d.ts +3 -0
  53. package/dist/db/repository/sqlite-repository.d.ts.map +1 -1
  54. package/dist/db/repository/sqlite-repository.js +26 -0
  55. package/dist/db/repository/sqlite-repository.js.map +1 -1
  56. package/dist/domain/analysis/brief.d.ts.map +1 -1
  57. package/dist/domain/analysis/brief.js +13 -17
  58. package/dist/domain/analysis/brief.js.map +1 -1
  59. package/dist/domain/analysis/context.d.ts.map +1 -1
  60. package/dist/domain/analysis/context.js +14 -11
  61. package/dist/domain/analysis/context.js.map +1 -1
  62. package/dist/domain/analysis/dependencies.d.ts.map +1 -1
  63. package/dist/domain/analysis/dependencies.js +53 -52
  64. package/dist/domain/analysis/dependencies.js.map +1 -1
  65. package/dist/domain/analysis/fn-impact.d.ts +2 -7
  66. package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
  67. package/dist/domain/analysis/fn-impact.js +33 -31
  68. package/dist/domain/analysis/fn-impact.js.map +1 -1
  69. package/dist/domain/analysis/implementations.d.ts.map +1 -1
  70. package/dist/domain/analysis/implementations.js +11 -19
  71. package/dist/domain/analysis/implementations.js.map +1 -1
  72. package/dist/domain/analysis/module-map.d.ts.map +1 -1
  73. package/dist/domain/analysis/module-map.js +55 -76
  74. package/dist/domain/analysis/module-map.js.map +1 -1
  75. package/dist/domain/analysis/query-helpers.d.ts +7 -0
  76. package/dist/domain/analysis/query-helpers.d.ts.map +1 -1
  77. package/dist/domain/analysis/query-helpers.js +15 -1
  78. package/dist/domain/analysis/query-helpers.js.map +1 -1
  79. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  80. package/dist/domain/graph/builder/pipeline.js +315 -43
  81. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  82. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  83. package/dist/domain/graph/builder/stages/build-edges.js +106 -1
  84. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  85. package/dist/domain/graph/builder/stages/collect-files.d.ts.map +1 -1
  86. package/dist/domain/graph/builder/stages/collect-files.js +17 -5
  87. package/dist/domain/graph/builder/stages/collect-files.js.map +1 -1
  88. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  89. package/dist/domain/graph/builder/stages/detect-changes.js +99 -51
  90. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  91. package/dist/domain/graph/builder/stages/finalize.d.ts.map +1 -1
  92. package/dist/domain/graph/builder/stages/finalize.js +34 -7
  93. package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
  94. package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
  95. package/dist/domain/graph/builder/stages/insert-nodes.js +50 -26
  96. package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
  97. package/dist/domain/graph/builder/stages/resolve-imports.d.ts.map +1 -1
  98. package/dist/domain/graph/builder/stages/resolve-imports.js +95 -84
  99. package/dist/domain/graph/builder/stages/resolve-imports.js.map +1 -1
  100. package/dist/domain/graph/cycles.d.ts +6 -0
  101. package/dist/domain/graph/cycles.d.ts.map +1 -1
  102. package/dist/domain/graph/cycles.js +114 -22
  103. package/dist/domain/graph/cycles.js.map +1 -1
  104. package/dist/domain/graph/resolve.js +1 -1
  105. package/dist/domain/graph/resolve.js.map +1 -1
  106. package/dist/domain/graph/watcher.d.ts +2 -0
  107. package/dist/domain/graph/watcher.d.ts.map +1 -1
  108. package/dist/domain/graph/watcher.js +170 -75
  109. package/dist/domain/graph/watcher.js.map +1 -1
  110. package/dist/domain/parser.d.ts +1 -6
  111. package/dist/domain/parser.d.ts.map +1 -1
  112. package/dist/domain/parser.js +101 -32
  113. package/dist/domain/parser.js.map +1 -1
  114. package/dist/domain/search/generator.js +1 -1
  115. package/dist/domain/search/generator.js.map +1 -1
  116. package/dist/domain/search/models.d.ts +4 -3
  117. package/dist/domain/search/models.d.ts.map +1 -1
  118. package/dist/domain/search/models.js +18 -5
  119. package/dist/domain/search/models.js.map +1 -1
  120. package/dist/domain/search/search/hybrid.d.ts.map +1 -1
  121. package/dist/domain/search/search/hybrid.js +29 -18
  122. package/dist/domain/search/search/hybrid.js.map +1 -1
  123. package/dist/extractors/clojure.d.ts +12 -0
  124. package/dist/extractors/clojure.d.ts.map +1 -0
  125. package/dist/extractors/clojure.js +245 -0
  126. package/dist/extractors/clojure.js.map +1 -0
  127. package/dist/extractors/cuda.d.ts +11 -0
  128. package/dist/extractors/cuda.d.ts.map +1 -0
  129. package/dist/extractors/cuda.js +302 -0
  130. package/dist/extractors/cuda.js.map +1 -0
  131. package/dist/extractors/erlang.d.ts +14 -0
  132. package/dist/extractors/erlang.d.ts.map +1 -0
  133. package/dist/extractors/erlang.js +239 -0
  134. package/dist/extractors/erlang.js.map +1 -0
  135. package/dist/extractors/fsharp.d.ts +13 -0
  136. package/dist/extractors/fsharp.d.ts.map +1 -0
  137. package/dist/extractors/fsharp.js +218 -0
  138. package/dist/extractors/fsharp.js.map +1 -0
  139. package/dist/extractors/gleam.d.ts +14 -0
  140. package/dist/extractors/gleam.d.ts.map +1 -0
  141. package/dist/extractors/gleam.js +229 -0
  142. package/dist/extractors/gleam.js.map +1 -0
  143. package/dist/extractors/go.js +36 -33
  144. package/dist/extractors/go.js.map +1 -1
  145. package/dist/extractors/groovy.d.ts +10 -0
  146. package/dist/extractors/groovy.d.ts.map +1 -0
  147. package/dist/extractors/groovy.js +304 -0
  148. package/dist/extractors/groovy.js.map +1 -0
  149. package/dist/extractors/helpers.d.ts.map +1 -1
  150. package/dist/extractors/helpers.js +40 -29
  151. package/dist/extractors/helpers.js.map +1 -1
  152. package/dist/extractors/index.d.ts +11 -0
  153. package/dist/extractors/index.d.ts.map +1 -1
  154. package/dist/extractors/index.js +11 -0
  155. package/dist/extractors/index.js.map +1 -1
  156. package/dist/extractors/java.js +58 -46
  157. package/dist/extractors/java.js.map +1 -1
  158. package/dist/extractors/javascript.js +46 -45
  159. package/dist/extractors/javascript.js.map +1 -1
  160. package/dist/extractors/julia.d.ts +16 -0
  161. package/dist/extractors/julia.d.ts.map +1 -0
  162. package/dist/extractors/julia.js +287 -0
  163. package/dist/extractors/julia.js.map +1 -0
  164. package/dist/extractors/kotlin.js +84 -78
  165. package/dist/extractors/kotlin.js.map +1 -1
  166. package/dist/extractors/objc.d.ts +9 -0
  167. package/dist/extractors/objc.d.ts.map +1 -0
  168. package/dist/extractors/objc.js +406 -0
  169. package/dist/extractors/objc.js.map +1 -0
  170. package/dist/extractors/ocaml.js +74 -0
  171. package/dist/extractors/ocaml.js.map +1 -1
  172. package/dist/extractors/python.js +29 -24
  173. package/dist/extractors/python.js.map +1 -1
  174. package/dist/extractors/r.d.ts +13 -0
  175. package/dist/extractors/r.d.ts.map +1 -0
  176. package/dist/extractors/r.js +251 -0
  177. package/dist/extractors/r.js.map +1 -0
  178. package/dist/extractors/rust.js +41 -32
  179. package/dist/extractors/rust.js.map +1 -1
  180. package/dist/extractors/solidity.d.ts +9 -0
  181. package/dist/extractors/solidity.d.ts.map +1 -0
  182. package/dist/extractors/solidity.js +365 -0
  183. package/dist/extractors/solidity.js.map +1 -0
  184. package/dist/extractors/swift.js +83 -81
  185. package/dist/extractors/swift.js.map +1 -1
  186. package/dist/extractors/verilog.d.ts +9 -0
  187. package/dist/extractors/verilog.d.ts.map +1 -0
  188. package/dist/extractors/verilog.js +286 -0
  189. package/dist/extractors/verilog.js.map +1 -0
  190. package/dist/extractors/zig.js +58 -60
  191. package/dist/extractors/zig.js.map +1 -1
  192. package/dist/features/ast.d.ts +16 -14
  193. package/dist/features/ast.d.ts.map +1 -1
  194. package/dist/features/ast.js +84 -83
  195. package/dist/features/ast.js.map +1 -1
  196. package/dist/features/audit.d.ts.map +1 -1
  197. package/dist/features/audit.js +8 -6
  198. package/dist/features/audit.js.map +1 -1
  199. package/dist/features/branch-compare.d.ts.map +1 -1
  200. package/dist/features/branch-compare.js +69 -72
  201. package/dist/features/branch-compare.js.map +1 -1
  202. package/dist/features/communities.d.ts.map +1 -1
  203. package/dist/features/communities.js +19 -7
  204. package/dist/features/communities.js.map +1 -1
  205. package/dist/features/complexity.d.ts.map +1 -1
  206. package/dist/features/complexity.js +120 -125
  207. package/dist/features/complexity.js.map +1 -1
  208. package/dist/features/dataflow.d.ts.map +1 -1
  209. package/dist/features/dataflow.js +136 -137
  210. package/dist/features/dataflow.js.map +1 -1
  211. package/dist/features/flow.d.ts.map +1 -1
  212. package/dist/features/flow.js +84 -79
  213. package/dist/features/flow.js.map +1 -1
  214. package/dist/features/structure-query.d.ts.map +1 -1
  215. package/dist/features/structure-query.js +69 -65
  216. package/dist/features/structure-query.js.map +1 -1
  217. package/dist/graph/algorithms/bfs.d.ts +2 -0
  218. package/dist/graph/algorithms/bfs.d.ts.map +1 -1
  219. package/dist/graph/algorithms/bfs.js +27 -0
  220. package/dist/graph/algorithms/bfs.js.map +1 -1
  221. package/dist/graph/algorithms/centrality.d.ts +2 -0
  222. package/dist/graph/algorithms/centrality.d.ts.map +1 -1
  223. package/dist/graph/algorithms/centrality.js +28 -0
  224. package/dist/graph/algorithms/centrality.js.map +1 -1
  225. package/dist/graph/algorithms/leiden/optimiser.d.ts.map +1 -1
  226. package/dist/graph/algorithms/leiden/optimiser.js +70 -55
  227. package/dist/graph/algorithms/leiden/optimiser.js.map +1 -1
  228. package/dist/graph/algorithms/leiden/partition.d.ts.map +1 -1
  229. package/dist/graph/algorithms/leiden/partition.js +288 -266
  230. package/dist/graph/algorithms/leiden/partition.js.map +1 -1
  231. package/dist/graph/algorithms/louvain.d.ts +3 -4
  232. package/dist/graph/algorithms/louvain.d.ts.map +1 -1
  233. package/dist/graph/algorithms/louvain.js +29 -0
  234. package/dist/graph/algorithms/louvain.js.map +1 -1
  235. package/dist/graph/algorithms/shortest-path.d.ts +2 -0
  236. package/dist/graph/algorithms/shortest-path.d.ts.map +1 -1
  237. package/dist/graph/algorithms/shortest-path.js +18 -1
  238. package/dist/graph/algorithms/shortest-path.js.map +1 -1
  239. package/dist/graph/model.d.ts.map +1 -1
  240. package/dist/graph/model.js +5 -1
  241. package/dist/graph/model.js.map +1 -1
  242. package/dist/infrastructure/config.d.ts.map +1 -1
  243. package/dist/infrastructure/config.js +6 -4
  244. package/dist/infrastructure/config.js.map +1 -1
  245. package/dist/infrastructure/suppress.d.ts +25 -0
  246. package/dist/infrastructure/suppress.d.ts.map +1 -0
  247. package/dist/infrastructure/suppress.js +43 -0
  248. package/dist/infrastructure/suppress.js.map +1 -0
  249. package/dist/mcp/server.d.ts.map +1 -1
  250. package/dist/mcp/server.js +29 -24
  251. package/dist/mcp/server.js.map +1 -1
  252. package/dist/presentation/dataflow.d.ts.map +1 -1
  253. package/dist/presentation/dataflow.js +47 -38
  254. package/dist/presentation/dataflow.js.map +1 -1
  255. package/dist/presentation/diff-impact-mermaid.d.ts.map +1 -1
  256. package/dist/presentation/diff-impact-mermaid.js +60 -51
  257. package/dist/presentation/diff-impact-mermaid.js.map +1 -1
  258. package/dist/presentation/queries-cli/exports.d.ts.map +1 -1
  259. package/dist/presentation/queries-cli/exports.js +20 -14
  260. package/dist/presentation/queries-cli/exports.js.map +1 -1
  261. package/dist/presentation/queries-cli/impact.d.ts.map +1 -1
  262. package/dist/presentation/queries-cli/impact.js +15 -13
  263. package/dist/presentation/queries-cli/impact.js.map +1 -1
  264. package/dist/presentation/queries-cli/inspect.d.ts.map +1 -1
  265. package/dist/presentation/queries-cli/inspect.js +101 -79
  266. package/dist/presentation/queries-cli/inspect.js.map +1 -1
  267. package/dist/presentation/queries-cli/overview.d.ts.map +1 -1
  268. package/dist/presentation/queries-cli/overview.js +25 -16
  269. package/dist/presentation/queries-cli/overview.js.map +1 -1
  270. package/dist/presentation/queries-cli/path.js +26 -20
  271. package/dist/presentation/queries-cli/path.js.map +1 -1
  272. package/dist/presentation/result-formatter.d.ts +10 -0
  273. package/dist/presentation/result-formatter.d.ts.map +1 -1
  274. package/dist/presentation/result-formatter.js +16 -1
  275. package/dist/presentation/result-formatter.js.map +1 -1
  276. package/dist/presentation/viewer.d.ts.map +1 -1
  277. package/dist/presentation/viewer.js +18 -12
  278. package/dist/presentation/viewer.js.map +1 -1
  279. package/dist/shared/errors.d.ts +5 -0
  280. package/dist/shared/errors.d.ts.map +1 -1
  281. package/dist/shared/errors.js +5 -0
  282. package/dist/shared/errors.js.map +1 -1
  283. package/dist/shared/hierarchy.d.ts +8 -2
  284. package/dist/shared/hierarchy.d.ts.map +1 -1
  285. package/dist/shared/hierarchy.js +42 -1
  286. package/dist/shared/hierarchy.js.map +1 -1
  287. package/dist/shared/normalize.d.ts +6 -1
  288. package/dist/shared/normalize.d.ts.map +1 -1
  289. package/dist/shared/normalize.js +20 -12
  290. package/dist/shared/normalize.js.map +1 -1
  291. package/dist/shared/paginate.d.ts +0 -9
  292. package/dist/shared/paginate.d.ts.map +1 -1
  293. package/dist/shared/paginate.js +0 -15
  294. package/dist/shared/paginate.js.map +1 -1
  295. package/dist/types.d.ts +129 -3
  296. package/dist/types.d.ts.map +1 -1
  297. package/grammars/tree-sitter-clojure.wasm +0 -0
  298. package/grammars/tree-sitter-cuda.wasm +0 -0
  299. package/grammars/tree-sitter-erlang.wasm +0 -0
  300. package/grammars/tree-sitter-fsharp.wasm +0 -0
  301. package/grammars/tree-sitter-gleam.wasm +0 -0
  302. package/grammars/tree-sitter-groovy.wasm +0 -0
  303. package/grammars/tree-sitter-julia.wasm +0 -0
  304. package/grammars/tree-sitter-objc.wasm +0 -0
  305. package/grammars/tree-sitter-ocaml_interface.wasm +0 -0
  306. package/grammars/tree-sitter-r.wasm +0 -0
  307. package/grammars/tree-sitter-solidity.wasm +0 -0
  308. package/grammars/tree-sitter-verilog.wasm +0 -0
  309. package/package.json +18 -7
  310. package/src/ast-analysis/engine.ts +245 -42
  311. package/src/ast-analysis/metrics.ts +33 -11
  312. package/src/ast-analysis/rules/javascript.ts +0 -1
  313. package/src/ast-analysis/shared.ts +33 -24
  314. package/src/ast-analysis/visitor-utils.ts +52 -32
  315. package/src/ast-analysis/visitor.ts +132 -71
  316. package/src/ast-analysis/visitors/ast-store-visitor.ts +49 -119
  317. package/src/ast-analysis/visitors/complexity-visitor.ts +35 -40
  318. package/src/ast-analysis/visitors/dataflow-visitor.ts +87 -43
  319. package/src/cli/commands/ast.ts +2 -2
  320. package/src/cli/commands/watch.ts +16 -2
  321. package/src/db/connection.ts +29 -28
  322. package/src/db/query-builder.ts +15 -3
  323. package/src/db/repository/base.ts +20 -0
  324. package/src/db/repository/native-repository.ts +79 -1
  325. package/src/db/repository/nodes.ts +13 -8
  326. package/src/db/repository/sqlite-repository.ts +29 -0
  327. package/src/domain/analysis/brief.ts +15 -25
  328. package/src/domain/analysis/context.ts +17 -10
  329. package/src/domain/analysis/dependencies.ts +67 -76
  330. package/src/domain/analysis/fn-impact.ts +36 -43
  331. package/src/domain/analysis/implementations.ts +11 -17
  332. package/src/domain/analysis/module-map.ts +58 -92
  333. package/src/domain/analysis/query-helpers.ts +18 -1
  334. package/src/domain/graph/builder/pipeline.ts +366 -41
  335. package/src/domain/graph/builder/stages/build-edges.ts +162 -1
  336. package/src/domain/graph/builder/stages/collect-files.ts +18 -7
  337. package/src/domain/graph/builder/stages/detect-changes.ts +110 -56
  338. package/src/domain/graph/builder/stages/finalize.ts +41 -11
  339. package/src/domain/graph/builder/stages/insert-nodes.ts +75 -39
  340. package/src/domain/graph/builder/stages/resolve-imports.ts +122 -100
  341. package/src/domain/graph/cycles.ts +110 -23
  342. package/src/domain/graph/resolve.ts +1 -1
  343. package/src/domain/graph/watcher.ts +202 -96
  344. package/src/domain/parser.ts +122 -28
  345. package/src/domain/search/generator.ts +1 -1
  346. package/src/domain/search/models.ts +17 -4
  347. package/src/domain/search/search/hybrid.ts +69 -51
  348. package/src/extractors/clojure.ts +273 -0
  349. package/src/extractors/cuda.ts +316 -0
  350. package/src/extractors/erlang.ts +252 -0
  351. package/src/extractors/fsharp.ts +253 -0
  352. package/src/extractors/gleam.ts +246 -0
  353. package/src/extractors/go.ts +43 -33
  354. package/src/extractors/groovy.ts +332 -0
  355. package/src/extractors/helpers.ts +37 -23
  356. package/src/extractors/index.ts +11 -0
  357. package/src/extractors/java.ts +66 -47
  358. package/src/extractors/javascript.ts +45 -46
  359. package/src/extractors/julia.ts +318 -0
  360. package/src/extractors/kotlin.ts +84 -77
  361. package/src/extractors/objc.ts +431 -0
  362. package/src/extractors/ocaml.ts +78 -0
  363. package/src/extractors/python.ts +31 -25
  364. package/src/extractors/r.ts +253 -0
  365. package/src/extractors/rust.ts +37 -29
  366. package/src/extractors/solidity.ts +394 -0
  367. package/src/extractors/swift.ts +81 -80
  368. package/src/extractors/verilog.ts +315 -0
  369. package/src/extractors/zig.ts +58 -61
  370. package/src/features/ast.ts +131 -112
  371. package/src/features/audit.ts +8 -6
  372. package/src/features/branch-compare.ts +105 -79
  373. package/src/features/communities.ts +25 -10
  374. package/src/features/complexity.ts +171 -134
  375. package/src/features/dataflow.ts +165 -175
  376. package/src/features/flow.ts +129 -92
  377. package/src/features/structure-query.ts +79 -64
  378. package/src/graph/algorithms/bfs.ts +34 -0
  379. package/src/graph/algorithms/centrality.ts +30 -0
  380. package/src/graph/algorithms/leiden/optimiser.ts +99 -55
  381. package/src/graph/algorithms/leiden/partition.ts +359 -294
  382. package/src/graph/algorithms/louvain.ts +31 -4
  383. package/src/graph/algorithms/shortest-path.ts +20 -1
  384. package/src/graph/model.ts +6 -1
  385. package/src/infrastructure/config.ts +6 -4
  386. package/src/infrastructure/suppress.ts +47 -0
  387. package/src/mcp/server.ts +53 -37
  388. package/src/presentation/dataflow.ts +50 -44
  389. package/src/presentation/diff-impact-mermaid.ts +104 -62
  390. package/src/presentation/queries-cli/exports.ts +21 -13
  391. package/src/presentation/queries-cli/impact.ts +15 -13
  392. package/src/presentation/queries-cli/inspect.ts +100 -81
  393. package/src/presentation/queries-cli/overview.ts +26 -16
  394. package/src/presentation/queries-cli/path.ts +33 -25
  395. package/src/presentation/result-formatter.ts +19 -1
  396. package/src/presentation/viewer.ts +42 -14
  397. package/src/shared/errors.ts +6 -0
  398. package/src/shared/hierarchy.ts +50 -2
  399. package/src/shared/normalize.ts +31 -12
  400. package/src/shared/paginate.ts +0 -17
  401. package/src/types.ts +138 -3
@@ -3,6 +3,15 @@ interface DbHandle {
3
3
  prepare(sql: string): { get(...params: unknown[]): unknown };
4
4
  }
5
5
 
6
+ /** Anything that can look up a file hash — either a raw DB or a Repository. */
7
+ interface HashSource {
8
+ getFileHash(file: string): string | null;
9
+ }
10
+
11
+ function isHashSource(x: unknown): x is HashSource {
12
+ return typeof x === 'object' && x !== null && typeof (x as HashSource).getFileHash === 'function';
13
+ }
14
+
6
15
  export function getFileHash(db: DbHandle, file: string): string | null {
7
16
  const row = db.prepare('SELECT hash FROM file_hashes WHERE file = ?').get(file) as
8
17
  | { hash: string }
@@ -55,25 +64,35 @@ interface RawSymbolRow {
55
64
  role?: string | null;
56
65
  }
57
66
 
67
+ /**
68
+ * Resolve a file hash, using the cache when available.
69
+ * Accepts a raw DB handle (with .prepare) or a Repository (with .getFileHash).
70
+ */
71
+ function resolveFileHash(
72
+ db: DbHandle | HashSource,
73
+ file: string,
74
+ hashCache?: Map<string, string | null>,
75
+ ): string | null {
76
+ const lookupHash = isHashSource(db)
77
+ ? (f: string) => db.getFileHash(f)
78
+ : (f: string) => getFileHash(db as DbHandle, f);
79
+ if (!hashCache) return lookupHash(file);
80
+ if (!hashCache.has(file)) {
81
+ hashCache.set(file, lookupHash(file));
82
+ }
83
+ return hashCache.get(file) ?? null;
84
+ }
85
+
58
86
  /**
59
87
  * Normalize a raw DB/query row into the stable 7-field symbol shape.
88
+ * Accepts a raw DB handle (with .prepare), a Repository (with .getFileHash), or null.
60
89
  */
61
90
  export function normalizeSymbol(
62
91
  row: RawSymbolRow,
63
- db?: DbHandle | null,
92
+ db?: DbHandle | HashSource | null,
64
93
  hashCache?: Map<string, string | null>,
65
94
  ): NormalizedSymbol {
66
- let fileHash: string | null = null;
67
- if (db) {
68
- if (hashCache) {
69
- if (!hashCache.has(row.file)) {
70
- hashCache.set(row.file, getFileHash(db, row.file));
71
- }
72
- fileHash = hashCache.get(row.file) ?? null;
73
- } else {
74
- fileHash = getFileHash(db, row.file);
75
- }
76
- }
95
+ const fileHash = db ? resolveFileHash(db, row.file, hashCache) : null;
77
96
  return {
78
97
  name: row.name,
79
98
  kind: row.kind,
@@ -105,20 +105,3 @@ export function paginateResult<T extends Record<string, unknown>>(
105
105
  const { items, pagination } = paginate(arr, { limit, offset });
106
106
  return { ...result, [field]: items, _pagination: pagination };
107
107
  }
108
-
109
- /**
110
- * Print data as newline-delimited JSON (NDJSON).
111
- *
112
- * Emits a `_meta` line with pagination info (if present), then one JSON
113
- * line per item in the named array field.
114
- */
115
- export function printNdjson(
116
- data: Record<string, unknown> & { _pagination?: PaginationMeta },
117
- field: string,
118
- ): void {
119
- if (data._pagination) console.log(JSON.stringify({ _meta: data._pagination }));
120
- const items = data[field];
121
- if (Array.isArray(items)) {
122
- for (const item of items) console.log(JSON.stringify(item));
123
- }
124
- }
package/src/types.ts CHANGED
@@ -61,7 +61,7 @@ export type EdgeKind = CoreEdgeKind | StructuralEdgeKind;
61
61
  export type AnyEdgeKind = EdgeKind | DataflowEdgeKind;
62
62
 
63
63
  /** AST node kinds extracted during analysis. */
64
- export type ASTNodeKind = 'call' | 'new' | 'string' | 'regex' | 'throw' | 'await';
64
+ export type ASTNodeKind = 'new' | 'string' | 'regex' | 'throw' | 'await';
65
65
 
66
66
  /** Coarse role classifications for symbols based on connectivity. */
67
67
  export type CoreRole = 'entry' | 'core' | 'utility' | 'adapter' | 'dead' | 'test-only' | 'leaf';
@@ -96,7 +96,19 @@ export type LanguageId =
96
96
  | 'dart'
97
97
  | 'zig'
98
98
  | 'haskell'
99
- | 'ocaml';
99
+ | 'ocaml'
100
+ | 'ocaml-interface'
101
+ | 'fsharp'
102
+ | 'gleam'
103
+ | 'clojure'
104
+ | 'julia'
105
+ | 'r'
106
+ | 'erlang'
107
+ | 'solidity'
108
+ | 'objc'
109
+ | 'cuda'
110
+ | 'groovy'
111
+ | 'verilog';
100
112
 
101
113
  /** Engine mode selector. */
102
114
  export type EngineMode = 'native' | 'wasm' | 'auto';
@@ -316,6 +328,11 @@ export interface Repository {
316
328
  hasEmbeddings(): boolean;
317
329
  hasDataflowTable(): boolean;
318
330
  getComplexityForNode(nodeId: number): ComplexityMetrics | undefined;
331
+
332
+ // ── Convenience queries ──────────────────────────────────────────
333
+ getFileHash(file: string): string | null;
334
+ hasImplementsEdges(): boolean;
335
+ hasCoChangesTable(): boolean;
319
336
  }
320
337
 
321
338
  /**
@@ -383,6 +400,7 @@ export interface SubDeclaration {
383
400
  line: number;
384
401
  endLine?: number;
385
402
  visibility?: 'public' | 'private' | 'protected';
403
+ decorators?: string[];
386
404
  }
387
405
 
388
406
  /** Complexity metrics attached to a definition post-analysis. */
@@ -1828,8 +1846,54 @@ export interface NativeAddon {
1828
1846
  ): Array<{ fromFile: string; importSource: string; resolvedPath: string }>;
1829
1847
  computeConfidence(callerFile: string, targetFile: string, importedFrom: string | null): number;
1830
1848
  detectCycles(edges: Array<{ source: string; target: string }>): string[][];
1849
+ bfsTraversal(
1850
+ edges: Array<{ source: string; target: string }>,
1851
+ startIds: string[],
1852
+ maxDepth?: number | null,
1853
+ direction?: string | null,
1854
+ ): Array<{ node: string; depth: number }>;
1855
+ shortestPath(
1856
+ edges: Array<{ source: string; target: string }>,
1857
+ fromId: string,
1858
+ toId: string,
1859
+ ): string[];
1860
+ fanInOut(
1861
+ edges: Array<{ source: string; target: string }>,
1862
+ ): Array<{ node: string; fanIn: number; fanOut: number }>;
1863
+ louvainCommunities(
1864
+ edges: Array<{ source: string; target: string }>,
1865
+ nodeIds: string[],
1866
+ resolution?: number | null,
1867
+ randomSeed?: number | null,
1868
+ ): {
1869
+ assignments: Array<{ node: string; community: number }>;
1870
+ modularity: number;
1871
+ };
1831
1872
  buildCallEdges(files: unknown[], nodes: unknown[], builtinReceivers: string[]): unknown[];
1873
+ buildImportEdges?(
1874
+ files: unknown[],
1875
+ resolvedImports: unknown[],
1876
+ fileReexports: unknown[],
1877
+ fileNodeIds: unknown[],
1878
+ barrelFiles: string[],
1879
+ rootDir: string,
1880
+ ): unknown[];
1832
1881
  engineVersion(): string;
1882
+ analyzeComplexity(
1883
+ source: string,
1884
+ filePath: string,
1885
+ langId?: string | null,
1886
+ ): NativeFunctionComplexityResult[];
1887
+ buildCfgAnalysis(
1888
+ source: string,
1889
+ filePath: string,
1890
+ langId?: string | null,
1891
+ ): NativeFunctionCfgResult[];
1892
+ extractDataflowAnalysis(
1893
+ source: string,
1894
+ filePath: string,
1895
+ langId?: string | null,
1896
+ ): DataflowResult | null;
1833
1897
  ParseTreeCache: new () => NativeParseTreeCache;
1834
1898
  NativeDatabase: {
1835
1899
  openReadWrite(dbPath: string): NativeDatabase;
@@ -1837,6 +1901,40 @@ export interface NativeAddon {
1837
1901
  };
1838
1902
  }
1839
1903
 
1904
+ /** Per-function complexity result from native standalone analysis (napi output shape). */
1905
+ export interface NativeFunctionComplexityResult {
1906
+ name: string;
1907
+ line: number;
1908
+ endLine: number | null;
1909
+ complexity: {
1910
+ cognitive: number;
1911
+ cyclomatic: number;
1912
+ maxNesting: number;
1913
+ halstead?: {
1914
+ n1: number;
1915
+ n2: number;
1916
+ bigN1: number;
1917
+ bigN2: number;
1918
+ vocabulary: number;
1919
+ length: number;
1920
+ volume: number;
1921
+ difficulty: number;
1922
+ effort: number;
1923
+ bugs: number;
1924
+ };
1925
+ loc?: { loc: number; sloc: number; commentLines: number };
1926
+ maintainabilityIndex?: number | null;
1927
+ };
1928
+ }
1929
+
1930
+ /** Per-function CFG result from native standalone analysis. */
1931
+ export interface NativeFunctionCfgResult {
1932
+ name: string;
1933
+ line: number;
1934
+ endLine: number | null;
1935
+ cfg: { blocks: CfgBlock[]; edges: CfgEdge[] };
1936
+ }
1937
+
1840
1938
  /** Native parse-tree cache instance. */
1841
1939
  export interface NativeParseTreeCache {
1842
1940
  get(filePath: string): unknown;
@@ -2029,7 +2127,10 @@ export interface NativeDatabase {
2029
2127
  hasCfgTables(): boolean;
2030
2128
  hasEmbeddings(): boolean;
2031
2129
  hasDataflowTable(): boolean;
2130
+ hasImplementsEdges(): boolean;
2131
+ hasCoChangesTable(): boolean;
2032
2132
  getComplexityForNode(nodeId: number): NativeComplexityMetrics | null;
2133
+ getFileHash(file: string): string | null;
2033
2134
 
2034
2135
  // ── Build pipeline writes (6.15) ───────────────────────────────────
2035
2136
  bulkInsertNodes(
@@ -2119,7 +2220,7 @@ export interface NativeDatabase {
2119
2220
  sourceId: number;
2120
2221
  targetId: number;
2121
2222
  kind: string;
2122
- paramIndex?: number | null;
2223
+ paramIndex?: number;
2123
2224
  expression?: string | null;
2124
2225
  line?: number | null;
2125
2226
  confidence: number;
@@ -2266,6 +2367,32 @@ export interface NativeDatabase {
2266
2367
  fanOut: number;
2267
2368
  }>;
2268
2369
 
2370
+ // ── Batched build-glue queries (6.18) ────────────────────────────────
2371
+ /** All file_hashes rows + table existence + max mtime in one call. */
2372
+ getFileHashData?(): {
2373
+ exists: boolean;
2374
+ rows: Array<{ file: string; hash: string; mtime: number; size: number }>;
2375
+ maxMtime: number;
2376
+ };
2377
+ /** CFG and dataflow table counts (-1 = table missing). */
2378
+ checkPendingAnalysis?(): { cfgCount: number; dataflowCount: number };
2379
+ /** Batch upsert file_hashes for metadata healing. */
2380
+ healFileMetadata?(
2381
+ entries: Array<{ file: string; hash: string; mtime: number; size: number }>,
2382
+ ): number;
2383
+ /** Find files with edges pointing to changed files. */
2384
+ findReverseDependencies?(changedFiles: string[]): string[];
2385
+ /** Node + edge counts in one call. */
2386
+ getFinalizeCounts?(): { nodeCount: number; edgeCount: number };
2387
+ /** Orphaned embeddings, stale embeddings, unused exports in one call. */
2388
+ runAdvisoryChecks?(hasEmbeddings: boolean): {
2389
+ orphanedEmbeddings: number;
2390
+ embedBuiltAt: string | null;
2391
+ unusedExports: number;
2392
+ };
2393
+ /** File_hashes count + all file paths in one call. */
2394
+ getCollectFilesData?(): { count: number; files: string[] };
2395
+
2269
2396
  // ── Generic query execution & version validation (6.16) ─────────────
2270
2397
  /** Execute a parameterized SELECT and return all rows as objects. */
2271
2398
  queryAll(sql: string, params: Array<string | number | null>): Record<string, unknown>[];
@@ -2273,6 +2400,14 @@ export interface NativeDatabase {
2273
2400
  queryGet(sql: string, params: Array<string | number | null>): Record<string, unknown> | null;
2274
2401
  /** Validate DB codegraph_version matches expected. Warns on mismatch. */
2275
2402
  validateSchemaVersion(expectedVersion: string): boolean;
2403
+
2404
+ // ── Full Rust build orchestration (#695) ─────────────────────────────
2405
+ /**
2406
+ * Run the entire build pipeline in Rust with zero napi boundary crossings.
2407
+ * Returns a JSON string with timing and build result data.
2408
+ * When unavailable, the JS pipeline (runPipelineStages) is used as fallback.
2409
+ */
2410
+ buildGraph?(rootDir: string, configJson: string, aliasesJson: string, optsJson: string): string;
2276
2411
  }
2277
2412
 
2278
2413
  // ════════════════════════════════════════════════════════════════════════