@optave/codegraph 3.13.0 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/README.md +35 -34
  2. package/dist/ast-analysis/engine.d.ts.map +1 -1
  3. package/dist/ast-analysis/engine.js +38 -40
  4. package/dist/ast-analysis/engine.js.map +1 -1
  5. package/dist/ast-analysis/rules/b2.d.ts +7 -0
  6. package/dist/ast-analysis/rules/b2.d.ts.map +1 -0
  7. package/dist/ast-analysis/rules/b2.js +240 -0
  8. package/dist/ast-analysis/rules/b2.js.map +1 -0
  9. package/dist/ast-analysis/rules/b3.d.ts +6 -0
  10. package/dist/ast-analysis/rules/b3.d.ts.map +1 -0
  11. package/dist/ast-analysis/rules/b3.js +105 -0
  12. package/dist/ast-analysis/rules/b3.js.map +1 -0
  13. package/dist/ast-analysis/rules/b4.d.ts +9 -0
  14. package/dist/ast-analysis/rules/b4.d.ts.map +1 -0
  15. package/dist/ast-analysis/rules/b4.js +361 -0
  16. package/dist/ast-analysis/rules/b4.js.map +1 -0
  17. package/dist/ast-analysis/rules/b5.d.ts +4 -0
  18. package/dist/ast-analysis/rules/b5.d.ts.map +1 -0
  19. package/dist/ast-analysis/rules/b5.js +52 -0
  20. package/dist/ast-analysis/rules/b5.js.map +1 -0
  21. package/dist/ast-analysis/rules/c.d.ts +4 -0
  22. package/dist/ast-analysis/rules/c.d.ts.map +1 -0
  23. package/dist/ast-analysis/rules/c.js +143 -0
  24. package/dist/ast-analysis/rules/c.js.map +1 -0
  25. package/dist/ast-analysis/rules/index.d.ts.map +1 -1
  26. package/dist/ast-analysis/rules/index.js +34 -0
  27. package/dist/ast-analysis/rules/index.js.map +1 -1
  28. package/dist/ast-analysis/rules/javascript.d.ts.map +1 -1
  29. package/dist/ast-analysis/rules/javascript.js +3 -0
  30. package/dist/ast-analysis/rules/javascript.js.map +1 -1
  31. package/dist/ast-analysis/shared.d.ts.map +1 -1
  32. package/dist/ast-analysis/shared.js +2 -0
  33. package/dist/ast-analysis/shared.js.map +1 -1
  34. package/dist/ast-analysis/visitor-utils.d.ts +1 -0
  35. package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
  36. package/dist/ast-analysis/visitor-utils.js +5 -0
  37. package/dist/ast-analysis/visitor-utils.js.map +1 -1
  38. package/dist/ast-analysis/visitor.d.ts.map +1 -1
  39. package/dist/ast-analysis/visitor.js +60 -47
  40. package/dist/ast-analysis/visitor.js.map +1 -1
  41. package/dist/ast-analysis/visitors/cfg-visitor.d.ts.map +1 -1
  42. package/dist/ast-analysis/visitors/cfg-visitor.js +126 -76
  43. package/dist/ast-analysis/visitors/cfg-visitor.js.map +1 -1
  44. package/dist/ast-analysis/visitors/complexity-visitor.d.ts.map +1 -1
  45. package/dist/ast-analysis/visitors/complexity-visitor.js +27 -15
  46. package/dist/ast-analysis/visitors/complexity-visitor.js.map +1 -1
  47. package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
  48. package/dist/ast-analysis/visitors/dataflow-visitor.js +54 -21
  49. package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
  50. package/dist/cli/commands/config.d.ts.map +1 -1
  51. package/dist/cli/commands/config.js +137 -134
  52. package/dist/cli/commands/config.js.map +1 -1
  53. package/dist/cli/commands/roles.d.ts.map +1 -1
  54. package/dist/cli/commands/roles.js +6 -1
  55. package/dist/cli/commands/roles.js.map +1 -1
  56. package/dist/db/better-sqlite3.d.ts +2 -1
  57. package/dist/db/better-sqlite3.d.ts.map +1 -1
  58. package/dist/db/better-sqlite3.js.map +1 -1
  59. package/dist/db/connection.d.ts +7 -1
  60. package/dist/db/connection.d.ts.map +1 -1
  61. package/dist/db/connection.js +20 -5
  62. package/dist/db/connection.js.map +1 -1
  63. package/dist/db/index.d.ts +1 -1
  64. package/dist/db/index.d.ts.map +1 -1
  65. package/dist/db/index.js +1 -1
  66. package/dist/db/index.js.map +1 -1
  67. package/dist/db/migrations.d.ts.map +1 -1
  68. package/dist/db/migrations.js +68 -0
  69. package/dist/db/migrations.js.map +1 -1
  70. package/dist/db/repository/build-stmts.d.ts.map +1 -1
  71. package/dist/db/repository/build-stmts.js +18 -0
  72. package/dist/db/repository/build-stmts.js.map +1 -1
  73. package/dist/db/repository/dataflow.d.ts +5 -0
  74. package/dist/db/repository/dataflow.d.ts.map +1 -1
  75. package/dist/db/repository/dataflow.js +14 -0
  76. package/dist/db/repository/dataflow.js.map +1 -1
  77. package/dist/db/repository/index.d.ts +1 -1
  78. package/dist/db/repository/index.d.ts.map +1 -1
  79. package/dist/db/repository/index.js +1 -1
  80. package/dist/db/repository/index.js.map +1 -1
  81. package/dist/db/repository/native-repository.d.ts.map +1 -1
  82. package/dist/db/repository/native-repository.js +47 -34
  83. package/dist/db/repository/native-repository.js.map +1 -1
  84. package/dist/domain/analysis/context.d.ts +2 -2
  85. package/dist/domain/analysis/dependencies.d.ts +2 -2
  86. package/dist/domain/analysis/diff-impact.d.ts +2 -2
  87. package/dist/domain/analysis/fn-impact.d.ts +3 -1
  88. package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
  89. package/dist/domain/analysis/fn-impact.js +4 -0
  90. package/dist/domain/analysis/fn-impact.js.map +1 -1
  91. package/dist/domain/analysis/implementations.d.ts +2 -2
  92. package/dist/domain/analysis/module-map.d.ts.map +1 -1
  93. package/dist/domain/analysis/module-map.js +32 -5
  94. package/dist/domain/analysis/module-map.js.map +1 -1
  95. package/dist/domain/analysis/roles.d.ts +7 -1
  96. package/dist/domain/analysis/roles.d.ts.map +1 -1
  97. package/dist/domain/analysis/roles.js +16 -0
  98. package/dist/domain/analysis/roles.js.map +1 -1
  99. package/dist/domain/analysis/symbol-lookup.d.ts +4 -4
  100. package/dist/domain/graph/builder/call-resolver.d.ts +17 -5
  101. package/dist/domain/graph/builder/call-resolver.d.ts.map +1 -1
  102. package/dist/domain/graph/builder/call-resolver.js +85 -220
  103. package/dist/domain/graph/builder/call-resolver.js.map +1 -1
  104. package/dist/domain/graph/builder/context.d.ts +1 -0
  105. package/dist/domain/graph/builder/context.d.ts.map +1 -1
  106. package/dist/domain/graph/builder/context.js.map +1 -1
  107. package/dist/domain/graph/builder/helpers.d.ts +16 -1
  108. package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
  109. package/dist/domain/graph/builder/helpers.js +162 -72
  110. package/dist/domain/graph/builder/helpers.js.map +1 -1
  111. package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
  112. package/dist/domain/graph/builder/incremental.js +166 -97
  113. package/dist/domain/graph/builder/incremental.js.map +1 -1
  114. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  115. package/dist/domain/graph/builder/pipeline.js +10 -4
  116. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  117. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  118. package/dist/domain/graph/builder/stages/build-edges.js +496 -250
  119. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  120. package/dist/domain/graph/builder/stages/collect-files.d.ts.map +1 -1
  121. package/dist/domain/graph/builder/stages/collect-files.js +10 -7
  122. package/dist/domain/graph/builder/stages/collect-files.js.map +1 -1
  123. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  124. package/dist/domain/graph/builder/stages/detect-changes.js +2 -1
  125. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  126. package/dist/domain/graph/builder/stages/native-orchestrator.d.ts.map +1 -1
  127. package/dist/domain/graph/builder/stages/native-orchestrator.js +895 -545
  128. package/dist/domain/graph/builder/stages/native-orchestrator.js.map +1 -1
  129. package/dist/domain/graph/resolver/points-to.d.ts.map +1 -1
  130. package/dist/domain/graph/resolver/points-to.js +105 -57
  131. package/dist/domain/graph/resolver/points-to.js.map +1 -1
  132. package/dist/domain/graph/resolver/strategy.d.ts +61 -0
  133. package/dist/domain/graph/resolver/strategy.d.ts.map +1 -0
  134. package/dist/domain/graph/resolver/strategy.js +222 -0
  135. package/dist/domain/graph/resolver/strategy.js.map +1 -0
  136. package/dist/domain/graph/watcher.d.ts.map +1 -1
  137. package/dist/domain/graph/watcher.js +16 -9
  138. package/dist/domain/graph/watcher.js.map +1 -1
  139. package/dist/domain/parser.d.ts +12 -0
  140. package/dist/domain/parser.d.ts.map +1 -1
  141. package/dist/domain/parser.js +12 -2
  142. package/dist/domain/parser.js.map +1 -1
  143. package/dist/domain/queries.d.ts +1 -1
  144. package/dist/domain/queries.d.ts.map +1 -1
  145. package/dist/domain/queries.js +1 -1
  146. package/dist/domain/queries.js.map +1 -1
  147. package/dist/domain/wasm-worker-entry.js +3 -0
  148. package/dist/domain/wasm-worker-entry.js.map +1 -1
  149. package/dist/domain/wasm-worker-pool.d.ts.map +1 -1
  150. package/dist/domain/wasm-worker-pool.js +24 -5
  151. package/dist/domain/wasm-worker-pool.js.map +1 -1
  152. package/dist/domain/wasm-worker-protocol.d.ts +7 -0
  153. package/dist/domain/wasm-worker-protocol.d.ts.map +1 -1
  154. package/dist/extractors/dart.js +48 -3
  155. package/dist/extractors/dart.js.map +1 -1
  156. package/dist/extractors/groovy.js +62 -3
  157. package/dist/extractors/groovy.js.map +1 -1
  158. package/dist/extractors/helpers.d.ts +4 -2
  159. package/dist/extractors/helpers.d.ts.map +1 -1
  160. package/dist/extractors/helpers.js +5 -1
  161. package/dist/extractors/helpers.js.map +1 -1
  162. package/dist/extractors/java.js +77 -1
  163. package/dist/extractors/java.js.map +1 -1
  164. package/dist/extractors/javascript.d.ts.map +1 -1
  165. package/dist/extractors/javascript.js +549 -163
  166. package/dist/extractors/javascript.js.map +1 -1
  167. package/dist/extractors/kotlin.js +58 -3
  168. package/dist/extractors/kotlin.js.map +1 -1
  169. package/dist/extractors/objc.js +25 -2
  170. package/dist/extractors/objc.js.map +1 -1
  171. package/dist/extractors/scala.js +62 -2
  172. package/dist/extractors/scala.js.map +1 -1
  173. package/dist/extractors/swift.js +52 -3
  174. package/dist/extractors/swift.js.map +1 -1
  175. package/dist/features/audit.js +26 -23
  176. package/dist/features/audit.js.map +1 -1
  177. package/dist/features/boundaries.d.ts.map +1 -1
  178. package/dist/features/boundaries.js +12 -9
  179. package/dist/features/boundaries.js.map +1 -1
  180. package/dist/features/cfg.d.ts.map +1 -1
  181. package/dist/features/cfg.js +25 -18
  182. package/dist/features/cfg.js.map +1 -1
  183. package/dist/features/check.d.ts.map +1 -1
  184. package/dist/features/check.js +18 -5
  185. package/dist/features/check.js.map +1 -1
  186. package/dist/features/communities.d.ts +4 -2
  187. package/dist/features/communities.d.ts.map +1 -1
  188. package/dist/features/communities.js +6 -4
  189. package/dist/features/communities.js.map +1 -1
  190. package/dist/features/dataflow.d.ts +60 -0
  191. package/dist/features/dataflow.d.ts.map +1 -1
  192. package/dist/features/dataflow.js +530 -6
  193. package/dist/features/dataflow.js.map +1 -1
  194. package/dist/features/manifesto.d.ts.map +1 -1
  195. package/dist/features/manifesto.js +59 -72
  196. package/dist/features/manifesto.js.map +1 -1
  197. package/dist/features/sequence.d.ts.map +1 -1
  198. package/dist/features/sequence.js +27 -22
  199. package/dist/features/sequence.js.map +1 -1
  200. package/dist/features/snapshot.d.ts.map +1 -1
  201. package/dist/features/snapshot.js +36 -28
  202. package/dist/features/snapshot.js.map +1 -1
  203. package/dist/features/structure.d.ts.map +1 -1
  204. package/dist/features/structure.js +150 -62
  205. package/dist/features/structure.js.map +1 -1
  206. package/dist/features/triage.d.ts.map +1 -1
  207. package/dist/features/triage.js +18 -11
  208. package/dist/features/triage.js.map +1 -1
  209. package/dist/graph/algorithms/bfs.d.ts +1 -1
  210. package/dist/graph/algorithms/bfs.d.ts.map +1 -1
  211. package/dist/graph/algorithms/bfs.js +14 -13
  212. package/dist/graph/algorithms/bfs.js.map +1 -1
  213. package/dist/graph/algorithms/tarjan.d.ts.map +1 -1
  214. package/dist/graph/algorithms/tarjan.js +5 -0
  215. package/dist/graph/algorithms/tarjan.js.map +1 -1
  216. package/dist/graph/builders/dependency.js +28 -22
  217. package/dist/graph/builders/dependency.js.map +1 -1
  218. package/dist/graph/classifiers/roles.d.ts +10 -1
  219. package/dist/graph/classifiers/roles.d.ts.map +1 -1
  220. package/dist/graph/classifiers/roles.js +60 -6
  221. package/dist/graph/classifiers/roles.js.map +1 -1
  222. package/dist/infrastructure/config.d.ts +10 -0
  223. package/dist/infrastructure/config.d.ts.map +1 -1
  224. package/dist/infrastructure/config.js +31 -3
  225. package/dist/infrastructure/config.js.map +1 -1
  226. package/dist/infrastructure/registry.d.ts +0 -7
  227. package/dist/infrastructure/registry.d.ts.map +1 -1
  228. package/dist/infrastructure/registry.js +29 -13
  229. package/dist/infrastructure/registry.js.map +1 -1
  230. package/dist/infrastructure/update-check.d.ts.map +1 -1
  231. package/dist/infrastructure/update-check.js +49 -31
  232. package/dist/infrastructure/update-check.js.map +1 -1
  233. package/dist/mcp/server.d.ts +2 -10
  234. package/dist/mcp/server.d.ts.map +1 -1
  235. package/dist/mcp/server.js.map +1 -1
  236. package/dist/mcp/tools/ast-query.d.ts +1 -1
  237. package/dist/mcp/tools/ast-query.d.ts.map +1 -1
  238. package/dist/mcp/tools/audit.d.ts +1 -1
  239. package/dist/mcp/tools/audit.d.ts.map +1 -1
  240. package/dist/mcp/tools/batch-query.d.ts +1 -1
  241. package/dist/mcp/tools/batch-query.d.ts.map +1 -1
  242. package/dist/mcp/tools/branch-compare.d.ts +1 -1
  243. package/dist/mcp/tools/branch-compare.d.ts.map +1 -1
  244. package/dist/mcp/tools/brief.d.ts +1 -1
  245. package/dist/mcp/tools/brief.d.ts.map +1 -1
  246. package/dist/mcp/tools/cfg.d.ts +1 -1
  247. package/dist/mcp/tools/cfg.d.ts.map +1 -1
  248. package/dist/mcp/tools/check.d.ts +1 -1
  249. package/dist/mcp/tools/check.d.ts.map +1 -1
  250. package/dist/mcp/tools/co-changes.d.ts +1 -1
  251. package/dist/mcp/tools/co-changes.d.ts.map +1 -1
  252. package/dist/mcp/tools/code-owners.d.ts +1 -1
  253. package/dist/mcp/tools/code-owners.d.ts.map +1 -1
  254. package/dist/mcp/tools/communities.d.ts +1 -1
  255. package/dist/mcp/tools/communities.d.ts.map +1 -1
  256. package/dist/mcp/tools/complexity.d.ts +1 -1
  257. package/dist/mcp/tools/complexity.d.ts.map +1 -1
  258. package/dist/mcp/tools/context.d.ts +1 -1
  259. package/dist/mcp/tools/context.d.ts.map +1 -1
  260. package/dist/mcp/tools/dataflow.d.ts +1 -1
  261. package/dist/mcp/tools/dataflow.d.ts.map +1 -1
  262. package/dist/mcp/tools/diff-impact.d.ts +1 -1
  263. package/dist/mcp/tools/diff-impact.d.ts.map +1 -1
  264. package/dist/mcp/tools/execution-flow.d.ts +1 -1
  265. package/dist/mcp/tools/execution-flow.d.ts.map +1 -1
  266. package/dist/mcp/tools/export-graph.d.ts +1 -1
  267. package/dist/mcp/tools/export-graph.d.ts.map +1 -1
  268. package/dist/mcp/tools/file-deps.d.ts +1 -1
  269. package/dist/mcp/tools/file-deps.d.ts.map +1 -1
  270. package/dist/mcp/tools/file-exports.d.ts +1 -1
  271. package/dist/mcp/tools/file-exports.d.ts.map +1 -1
  272. package/dist/mcp/tools/find-cycles.d.ts +1 -1
  273. package/dist/mcp/tools/find-cycles.d.ts.map +1 -1
  274. package/dist/mcp/tools/fn-impact.d.ts +1 -1
  275. package/dist/mcp/tools/fn-impact.d.ts.map +1 -1
  276. package/dist/mcp/tools/impact-analysis.d.ts +1 -1
  277. package/dist/mcp/tools/impact-analysis.d.ts.map +1 -1
  278. package/dist/mcp/tools/implementations.d.ts +1 -1
  279. package/dist/mcp/tools/implementations.d.ts.map +1 -1
  280. package/dist/mcp/tools/index.d.ts +2 -5
  281. package/dist/mcp/tools/index.d.ts.map +1 -1
  282. package/dist/mcp/tools/index.js.map +1 -1
  283. package/dist/mcp/tools/interfaces.d.ts +1 -1
  284. package/dist/mcp/tools/interfaces.d.ts.map +1 -1
  285. package/dist/mcp/tools/list-functions.d.ts +1 -1
  286. package/dist/mcp/tools/list-functions.d.ts.map +1 -1
  287. package/dist/mcp/tools/list-repos.d.ts +1 -1
  288. package/dist/mcp/tools/list-repos.d.ts.map +1 -1
  289. package/dist/mcp/tools/module-map.d.ts +1 -1
  290. package/dist/mcp/tools/module-map.d.ts.map +1 -1
  291. package/dist/mcp/tools/node-roles.d.ts +1 -1
  292. package/dist/mcp/tools/node-roles.d.ts.map +1 -1
  293. package/dist/mcp/tools/path.d.ts +1 -1
  294. package/dist/mcp/tools/path.d.ts.map +1 -1
  295. package/dist/mcp/tools/query.d.ts +1 -1
  296. package/dist/mcp/tools/query.d.ts.map +1 -1
  297. package/dist/mcp/tools/semantic-search.d.ts +1 -1
  298. package/dist/mcp/tools/semantic-search.d.ts.map +1 -1
  299. package/dist/mcp/tools/sequence.d.ts +1 -1
  300. package/dist/mcp/tools/sequence.d.ts.map +1 -1
  301. package/dist/mcp/tools/structure.d.ts +1 -1
  302. package/dist/mcp/tools/structure.d.ts.map +1 -1
  303. package/dist/mcp/tools/symbol-children.d.ts +1 -1
  304. package/dist/mcp/tools/symbol-children.d.ts.map +1 -1
  305. package/dist/mcp/tools/triage.d.ts +1 -1
  306. package/dist/mcp/tools/triage.d.ts.map +1 -1
  307. package/dist/mcp/tools/where.d.ts +1 -1
  308. package/dist/mcp/tools/where.d.ts.map +1 -1
  309. package/dist/mcp/types.d.ts +19 -0
  310. package/dist/mcp/types.d.ts.map +1 -0
  311. package/dist/mcp/types.js +6 -0
  312. package/dist/mcp/types.js.map +1 -0
  313. package/dist/presentation/queries-cli/index.d.ts +1 -1
  314. package/dist/presentation/queries-cli/index.d.ts.map +1 -1
  315. package/dist/presentation/queries-cli/index.js +1 -1
  316. package/dist/presentation/queries-cli/index.js.map +1 -1
  317. package/dist/presentation/queries-cli/overview.d.ts +1 -0
  318. package/dist/presentation/queries-cli/overview.d.ts.map +1 -1
  319. package/dist/presentation/queries-cli/overview.js +20 -1
  320. package/dist/presentation/queries-cli/overview.js.map +1 -1
  321. package/dist/presentation/queries-cli.d.ts +1 -1
  322. package/dist/presentation/queries-cli.d.ts.map +1 -1
  323. package/dist/presentation/queries-cli.js +1 -1
  324. package/dist/presentation/queries-cli.js.map +1 -1
  325. package/dist/presentation/viewer.d.ts.map +1 -1
  326. package/dist/presentation/viewer.js +45 -32
  327. package/dist/presentation/viewer.js.map +1 -1
  328. package/dist/shared/constants.d.ts +21 -0
  329. package/dist/shared/constants.d.ts.map +1 -1
  330. package/dist/shared/constants.js +25 -0
  331. package/dist/shared/constants.js.map +1 -1
  332. package/dist/shared/normalize.d.ts.map +1 -1
  333. package/dist/shared/normalize.js +12 -22
  334. package/dist/shared/normalize.js.map +1 -1
  335. package/dist/shared/paginate.d.ts +4 -17
  336. package/dist/shared/paginate.d.ts.map +1 -1
  337. package/dist/shared/paginate.js.map +1 -1
  338. package/dist/types.d.ts +76 -1
  339. package/dist/types.d.ts.map +1 -1
  340. package/grammars/tree-sitter-erlang.wasm +0 -0
  341. package/package.json +7 -7
  342. package/src/ast-analysis/engine.ts +43 -63
  343. package/src/ast-analysis/rules/b2.ts +263 -0
  344. package/src/ast-analysis/rules/b3.ts +127 -0
  345. package/src/ast-analysis/rules/b4.ts +378 -0
  346. package/src/ast-analysis/rules/b5.ts +65 -0
  347. package/src/ast-analysis/rules/c.ts +157 -0
  348. package/src/ast-analysis/rules/index.ts +34 -0
  349. package/src/ast-analysis/rules/javascript.ts +3 -0
  350. package/src/ast-analysis/shared.ts +2 -0
  351. package/src/ast-analysis/visitor-utils.ts +5 -0
  352. package/src/ast-analysis/visitor.ts +82 -52
  353. package/src/ast-analysis/visitors/cfg-visitor.ts +198 -84
  354. package/src/ast-analysis/visitors/complexity-visitor.ts +44 -16
  355. package/src/ast-analysis/visitors/dataflow-visitor.ts +68 -29
  356. package/src/cli/commands/config.ts +184 -184
  357. package/src/cli/commands/roles.ts +6 -1
  358. package/src/db/better-sqlite3.ts +5 -4
  359. package/src/db/connection.ts +23 -5
  360. package/src/db/index.ts +1 -0
  361. package/src/db/migrations.ts +68 -0
  362. package/src/db/repository/build-stmts.ts +30 -0
  363. package/src/db/repository/dataflow.ts +16 -0
  364. package/src/db/repository/index.ts +1 -1
  365. package/src/db/repository/native-repository.ts +56 -40
  366. package/src/domain/analysis/fn-impact.ts +4 -0
  367. package/src/domain/analysis/module-map.ts +38 -6
  368. package/src/domain/analysis/roles.ts +23 -0
  369. package/src/domain/graph/builder/call-resolver.ts +112 -232
  370. package/src/domain/graph/builder/context.ts +1 -0
  371. package/src/domain/graph/builder/helpers.ts +190 -72
  372. package/src/domain/graph/builder/incremental.ts +249 -120
  373. package/src/domain/graph/builder/pipeline.ts +11 -5
  374. package/src/domain/graph/builder/stages/build-edges.ts +696 -296
  375. package/src/domain/graph/builder/stages/collect-files.ts +12 -6
  376. package/src/domain/graph/builder/stages/detect-changes.ts +3 -1
  377. package/src/domain/graph/builder/stages/native-orchestrator.ts +1102 -590
  378. package/src/domain/graph/resolver/points-to.ts +182 -59
  379. package/src/domain/graph/resolver/strategy.ts +265 -0
  380. package/src/domain/graph/watcher.ts +19 -9
  381. package/src/domain/parser.ts +12 -2
  382. package/src/domain/queries.ts +1 -1
  383. package/src/domain/wasm-worker-entry.ts +3 -0
  384. package/src/domain/wasm-worker-pool.ts +28 -4
  385. package/src/domain/wasm-worker-protocol.ts +4 -0
  386. package/src/extractors/dart.ts +48 -3
  387. package/src/extractors/groovy.ts +62 -2
  388. package/src/extractors/helpers.ts +5 -2
  389. package/src/extractors/java.ts +80 -1
  390. package/src/extractors/javascript.ts +566 -161
  391. package/src/extractors/kotlin.ts +57 -3
  392. package/src/extractors/objc.ts +25 -1
  393. package/src/extractors/scala.ts +63 -1
  394. package/src/extractors/swift.ts +46 -3
  395. package/src/features/audit.ts +43 -34
  396. package/src/features/boundaries.ts +17 -9
  397. package/src/features/cfg.ts +31 -22
  398. package/src/features/check.ts +21 -5
  399. package/src/features/communities.ts +28 -19
  400. package/src/features/dataflow.ts +755 -6
  401. package/src/features/manifesto.ts +76 -75
  402. package/src/features/sequence.ts +29 -23
  403. package/src/features/snapshot.ts +36 -25
  404. package/src/features/structure.ts +185 -55
  405. package/src/features/triage.ts +28 -15
  406. package/src/graph/algorithms/bfs.ts +13 -12
  407. package/src/graph/algorithms/tarjan.ts +5 -0
  408. package/src/graph/builders/dependency.ts +35 -23
  409. package/src/graph/classifiers/roles.ts +74 -7
  410. package/src/infrastructure/config.ts +32 -3
  411. package/src/infrastructure/registry.ts +44 -20
  412. package/src/infrastructure/update-check.ts +55 -33
  413. package/src/mcp/server.ts +2 -8
  414. package/src/mcp/tools/ast-query.ts +1 -1
  415. package/src/mcp/tools/audit.ts +1 -1
  416. package/src/mcp/tools/batch-query.ts +1 -1
  417. package/src/mcp/tools/branch-compare.ts +1 -1
  418. package/src/mcp/tools/brief.ts +1 -1
  419. package/src/mcp/tools/cfg.ts +1 -1
  420. package/src/mcp/tools/check.ts +1 -1
  421. package/src/mcp/tools/co-changes.ts +1 -1
  422. package/src/mcp/tools/code-owners.ts +1 -1
  423. package/src/mcp/tools/communities.ts +1 -1
  424. package/src/mcp/tools/complexity.ts +1 -1
  425. package/src/mcp/tools/context.ts +1 -1
  426. package/src/mcp/tools/dataflow.ts +1 -1
  427. package/src/mcp/tools/diff-impact.ts +1 -1
  428. package/src/mcp/tools/execution-flow.ts +1 -1
  429. package/src/mcp/tools/export-graph.ts +1 -1
  430. package/src/mcp/tools/file-deps.ts +1 -1
  431. package/src/mcp/tools/file-exports.ts +1 -1
  432. package/src/mcp/tools/find-cycles.ts +1 -1
  433. package/src/mcp/tools/fn-impact.ts +1 -1
  434. package/src/mcp/tools/impact-analysis.ts +1 -1
  435. package/src/mcp/tools/implementations.ts +1 -1
  436. package/src/mcp/tools/index.ts +2 -5
  437. package/src/mcp/tools/interfaces.ts +1 -1
  438. package/src/mcp/tools/list-functions.ts +1 -1
  439. package/src/mcp/tools/list-repos.ts +1 -1
  440. package/src/mcp/tools/module-map.ts +1 -1
  441. package/src/mcp/tools/node-roles.ts +1 -1
  442. package/src/mcp/tools/path.ts +1 -1
  443. package/src/mcp/tools/query.ts +1 -1
  444. package/src/mcp/tools/semantic-search.ts +1 -1
  445. package/src/mcp/tools/sequence.ts +1 -1
  446. package/src/mcp/tools/structure.ts +1 -1
  447. package/src/mcp/tools/symbol-children.ts +1 -1
  448. package/src/mcp/tools/triage.ts +1 -1
  449. package/src/mcp/tools/where.ts +1 -1
  450. package/src/mcp/types.ts +21 -0
  451. package/src/presentation/queries-cli/index.ts +1 -1
  452. package/src/presentation/queries-cli/overview.ts +35 -1
  453. package/src/presentation/queries-cli.ts +1 -0
  454. package/src/presentation/viewer.ts +98 -87
  455. package/src/shared/constants.ts +26 -0
  456. package/src/shared/normalize.ts +13 -22
  457. package/src/shared/paginate.ts +4 -18
  458. package/src/types.ts +86 -1
@@ -39,7 +39,7 @@ export {
39
39
  moduleMapData,
40
40
  statsData,
41
41
  } from './analysis/module-map.js';
42
- export { rolesData } from './analysis/roles.js';
42
+ export { dynamicCallsData, rolesData } from './analysis/roles.js';
43
43
  // ── Analysis modules ─────────────────────────────────────────────────────
44
44
  export {
45
45
  childrenData,
@@ -834,6 +834,9 @@ function serializeExtractorOutput(
834
834
  ? { returnTypeMap: Array.from(symbols.returnTypeMap.entries()) }
835
835
  : {}),
836
836
  ...(symbols.callAssignments?.length ? { callAssignments: symbols.callAssignments } : {}),
837
+ ...(symbols.cjsRequireBindings?.length
838
+ ? { cjsRequireBindings: symbols.cjsRequireBindings }
839
+ : {}),
837
840
  };
838
841
  }
839
842
 
@@ -86,11 +86,14 @@ interface PendingJob {
86
86
  */
87
87
  const WORKER_PARSE_TIMEOUT_MS = 60_000;
88
88
 
89
- function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutput | null {
90
- if (!ser) return null;
89
+ /** Deserialize the core fields and metadata scalars from a serialized result. */
90
+ function deserializeCoreFields(
91
+ ser: SerializedExtractorOutput,
92
+ ): Pick<ExtractorOutput, 'definitions' | 'calls' | 'imports' | 'classes' | 'exports' | 'typeMap'> &
93
+ Partial<Pick<ExtractorOutput, '_langId' | '_lineCount' | 'dataflow' | 'astNodes'>> {
91
94
  const typeMap = new Map<string, TypeMapEntry>();
92
95
  for (const [k, v] of ser.typeMap) typeMap.set(k, v);
93
- const out: ExtractorOutput = {
96
+ const out: ReturnType<typeof deserializeCoreFields> = {
94
97
  definitions: ser.definitions,
95
98
  calls: ser.calls,
96
99
  imports: ser.imports,
@@ -106,6 +109,11 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
106
109
  // {line, kind, name, text?, receiver?} shape — see engine.ts:822 where the
107
110
  // visitor output is cast the same way.
108
111
  if (ser.astNodes !== undefined) out.astNodes = ser.astNodes as unknown as ASTNodeRow[];
112
+ return out;
113
+ }
114
+
115
+ /** Deserialize the simple array binding fields (present when non-empty). */
116
+ function deserializeBindingFields(ser: SerializedExtractorOutput, out: ExtractorOutput): void {
109
117
  if (ser.fnRefBindings?.length) out.fnRefBindings = ser.fnRefBindings;
110
118
  if (ser.paramBindings?.length) out.paramBindings = ser.paramBindings;
111
119
  if (ser.arrayElemBindings?.length) out.arrayElemBindings = ser.arrayElemBindings;
@@ -117,6 +125,12 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
117
125
  if (ser.objectPropBindings?.length) out.objectPropBindings = ser.objectPropBindings;
118
126
  if (ser.thisCallBindings?.length) out.thisCallBindings = ser.thisCallBindings;
119
127
  if (ser.newExpressions?.length) out.newExpressions = ser.newExpressions;
128
+ if (ser.callAssignments?.length) out.callAssignments = ser.callAssignments;
129
+ if (ser.cjsRequireBindings?.length) out.cjsRequireBindings = ser.cjsRequireBindings;
130
+ }
131
+
132
+ /** Deserialize the Map-typed fields that require entry-by-entry reconstruction. */
133
+ function deserializeMapFields(ser: SerializedExtractorOutput, out: ExtractorOutput): void {
120
134
  if (ser.definePropertyReceivers?.length) {
121
135
  const m = new Map<string, string>();
122
136
  for (const [k, v] of ser.definePropertyReceivers) m.set(k, v);
@@ -127,7 +141,17 @@ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutp
127
141
  for (const [k, v] of ser.returnTypeMap) returnTypeMap.set(k, v);
128
142
  out.returnTypeMap = returnTypeMap;
129
143
  }
130
- if (ser.callAssignments?.length) out.callAssignments = ser.callAssignments;
144
+ }
145
+
146
+ function deserializeResult(ser: SerializedExtractorOutput | null): ExtractorOutput | null {
147
+ if (!ser) return null;
148
+ // deserializeCoreFields supplies all required ExtractorOutput fields (definitions,
149
+ // calls, imports, classes, exports, typeMap). The cast is safe: every required field
150
+ // is present in the returned Pick. If a new required field is added to ExtractorOutput,
151
+ // add it to deserializeCoreFields' return Pick and body to keep the cast honest.
152
+ const out = { ...deserializeCoreFields(ser) } as ExtractorOutput;
153
+ deserializeBindingFields(ser, out);
154
+ deserializeMapFields(ser, out);
131
155
  return out;
132
156
  }
133
157
 
@@ -77,6 +77,10 @@ export interface SerializedExtractorOutput {
77
77
  definePropertyReceivers?: Array<[string, string]>;
78
78
  returnTypeMap?: Array<[string, TypeMapEntry]>;
79
79
  callAssignments?: CallAssignment[];
80
+ /** Variable-level dataflow vertices extracted during parsing (P1+). */
81
+ dataflowVertices?: import('../types.js').DataflowVertex[];
82
+ /** CJS require bindings — see ExtractorOutput.cjsRequireBindings (#1661). */
83
+ cjsRequireBindings?: Array<{ names: string[]; source: string }>;
80
84
  }
81
85
 
82
86
  export interface WorkerParseResponseOk {
@@ -255,14 +255,59 @@ function handleDartSelector(node: TreeSitterNode, ctx: ExtractorOutput): void {
255
255
  const argPart = findChild(node, 'argument_part');
256
256
  if (!argPart) return;
257
257
 
258
- // Look for the identifier this selector belongs to
258
+ const line = node.startPosition.row + 1;
259
+
260
+ // Look for the identifier this selector belongs to.
261
+ // Two layouts are possible depending on grammar version:
262
+ // A) selector has both unconditional_assignable_selector + argument_part (same node)
263
+ // B) one selector node holds unconditional_assignable_selector (.method),
264
+ // the next holds argument_part (the call args) — method name is in the previous sibling
259
265
  const unconditional = findChild(node, 'unconditional_assignable_selector');
266
+ let methodName: string | null = null;
267
+
260
268
  if (unconditional) {
261
269
  const id = findChild(unconditional, 'identifier');
262
- if (id) {
263
- ctx.calls.push({ name: id.text, line: node.startPosition.row + 1 });
270
+ if (id) methodName = id.text;
271
+ } else {
272
+ // Layout B: look at the previous sibling selector for the method name
273
+ const parent = node.parent;
274
+ if (parent) {
275
+ for (let i = 0; i < parent.childCount; i++) {
276
+ const sibling = parent.child(i);
277
+ if (sibling === node) break;
278
+ if (sibling?.type === 'selector') {
279
+ const unc2 = findChild(sibling, 'unconditional_assignable_selector');
280
+ if (unc2) {
281
+ const id2 = findChild(unc2, 'identifier');
282
+ if (id2) methodName = id2.text;
283
+ }
284
+ }
285
+ }
264
286
  }
265
287
  }
288
+
289
+ if (!methodName) return;
290
+
291
+ // Function.apply(fn, positionalArgs, namedArgs) — dynamic higher-order dispatch
292
+ if (methodName === 'apply') {
293
+ const parent = node.parent;
294
+ if (parent) {
295
+ for (let i = 0; i < parent.childCount; i++) {
296
+ const sibling = parent.child(i);
297
+ if (sibling && sibling !== node && sibling.text === 'Function') {
298
+ ctx.calls.push({
299
+ name: '<dynamic:unresolved>',
300
+ line,
301
+ dynamic: true,
302
+ dynamicKind: 'unresolved-dynamic',
303
+ });
304
+ return;
305
+ }
306
+ }
307
+ }
308
+ }
309
+
310
+ ctx.calls.push({ name: methodName, line });
266
311
  }
267
312
 
268
313
  function handleDartTypeAlias(node: TreeSitterNode, ctx: ExtractorOutput): void {
@@ -292,8 +292,26 @@ function handleGroovyImport(node: TreeSitterNode, ctx: ExtractorOutput): void {
292
292
  }
293
293
  }
294
294
 
295
+ /** Extract the first string literal argument from a Groovy call node. */
296
+ function getFirstStringArgGroovy(node: TreeSitterNode): string | null {
297
+ const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
298
+ if (!args) return null;
299
+ for (let i = 0; i < args.childCount; i++) {
300
+ const child = args.child(i);
301
+ if (!child) continue;
302
+ const t = child.type;
303
+ if (t === '(' || t === ')' || t === ',') continue;
304
+ if (t === 'string' || t === 'string_literal' || t === 'string_fragment') {
305
+ return child.text.replace(/^["']|["']$/g, '');
306
+ }
307
+ break;
308
+ }
309
+ return null;
310
+ }
311
+
295
312
  function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void {
296
313
  const call: Call = { name: '', line: node.startPosition.row + 1 };
314
+ let fieldNode: TreeSitterNode | null = null;
297
315
 
298
316
  // Try standard call_expression pattern
299
317
  const funcNode = node.childForFieldName('function') || node.childForFieldName('method');
@@ -301,7 +319,10 @@ function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void
301
319
  if (funcNode.type === 'field_expression' || funcNode.type === 'member_access') {
302
320
  const field = funcNode.childForFieldName('field') || funcNode.childForFieldName('property');
303
321
  const obj = funcNode.childForFieldName('argument') || funcNode.childForFieldName('object');
304
- if (field) call.name = field.text;
322
+ if (field) {
323
+ fieldNode = field;
324
+ call.name = field.text;
325
+ }
305
326
  if (obj) call.receiver = obj.text;
306
327
  } else {
307
328
  call.name = funcNode.text;
@@ -311,12 +332,51 @@ function handleGroovyCallExpr(node: TreeSitterNode, ctx: ExtractorOutput): void
311
332
  const nameNode = node.childForFieldName('name');
312
333
  const obj = node.childForFieldName('object');
313
334
  if (nameNode) {
335
+ fieldNode = nameNode;
314
336
  call.name = nameNode.text;
315
337
  if (obj) call.receiver = obj.text;
316
338
  }
317
339
  }
318
340
 
319
- if (call.name) ctx.calls.push(call);
341
+ if (!call.name) return;
342
+
343
+ // obj."$dyn"() or obj."${var}"() — GString method name; cannot resolve statically
344
+ if (fieldNode && (fieldNode.type === 'gstring' || fieldNode.type === 'template_string')) {
345
+ ctx.calls.push({
346
+ name: '<dynamic:unresolved>',
347
+ line: call.line,
348
+ dynamic: true,
349
+ dynamicKind: 'unresolved-dynamic',
350
+ receiver: call.receiver,
351
+ });
352
+ return;
353
+ }
354
+
355
+ // obj.invokeMethod("name", args) — Groovy's explicit dynamic dispatch
356
+ if (call.name === 'invokeMethod') {
357
+ const literal = getFirstStringArgGroovy(node);
358
+ if (literal) {
359
+ ctx.calls.push({
360
+ name: literal,
361
+ line: call.line,
362
+ dynamic: true,
363
+ dynamicKind: 'reflection',
364
+ keyExpr: literal,
365
+ receiver: call.receiver,
366
+ });
367
+ } else {
368
+ ctx.calls.push({
369
+ name: '<dynamic:computed-key>',
370
+ line: call.line,
371
+ dynamic: true,
372
+ dynamicKind: 'computed-key',
373
+ receiver: call.receiver,
374
+ });
375
+ }
376
+ return;
377
+ }
378
+
379
+ ctx.calls.push(call);
320
380
  }
321
381
 
322
382
  function handleGroovyObjectCreation(node: TreeSitterNode, ctx: ExtractorOutput): void {
@@ -1,5 +1,6 @@
1
1
  import type {
2
2
  Call,
3
+ DynamicKind,
3
4
  ExtractorOutput,
4
5
  Import,
5
6
  SubDeclaration,
@@ -270,18 +271,20 @@ export function extractModifierVisibility(
270
271
 
271
272
  /**
272
273
  * Append a `Call` to the extractor output. `line` defaults to the start line of
273
- * `node`; pass `extra` for `receiver` / `dynamic` flags.
274
+ * `node`; pass `extra` for `receiver` / `dynamic` / `dynamicKind` / `keyExpr` fields.
274
275
  */
275
276
  export function pushCall(
276
277
  ctx: ExtractorOutput,
277
278
  node: TreeSitterNode,
278
279
  name: string,
279
- extra: { receiver?: string; dynamic?: boolean } = {},
280
+ extra: { receiver?: string; dynamic?: boolean; dynamicKind?: DynamicKind; keyExpr?: string } = {},
280
281
  ): void {
281
282
  if (!name) return;
282
283
  const call: Call = { name, line: nodeStartLine(node) };
283
284
  if (extra.receiver !== undefined) call.receiver = extra.receiver;
284
285
  if (extra.dynamic !== undefined) call.dynamic = extra.dynamic;
286
+ if (extra.dynamicKind !== undefined) call.dynamicKind = extra.dynamicKind;
287
+ if (extra.keyExpr !== undefined) call.keyExpr = extra.keyExpr;
285
288
  ctx.calls.push(call);
286
289
  }
287
290
 
@@ -258,11 +258,90 @@ function handleJavaImportDecl(node: TreeSitterNode, ctx: ExtractorOutput): void
258
258
  }
259
259
  }
260
260
 
261
+ /** Extract the first string literal argument from a method_invocation node. */
262
+ function getFirstStringArgJava(node: TreeSitterNode): string | null {
263
+ const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
264
+ if (!args) return null;
265
+ for (let i = 0; i < args.childCount; i++) {
266
+ const child = args.child(i);
267
+ if (!child) continue;
268
+ const t = child.type;
269
+ if (t === '(' || t === ')' || t === ',') continue;
270
+ if (t === 'string_literal' || t === 'string_fragment') {
271
+ return child.text.replace(/^["']|["']$/g, '');
272
+ }
273
+ break; // First real argument is not a string — stop
274
+ }
275
+ return null;
276
+ }
277
+
261
278
  function handleJavaMethodInvocation(node: TreeSitterNode, ctx: ExtractorOutput): void {
262
279
  const nameNode = node.childForFieldName('name');
263
280
  if (!nameNode) return;
264
281
  const obj = node.childForFieldName('object');
265
- pushCall(ctx, node, nameNode.text, obj ? { receiver: obj.text } : {});
282
+ const methodName = nameNode.text;
283
+ const receiver = obj?.text;
284
+
285
+ // Method.invoke(target, args) — runtime reflection, target not statically knowable.
286
+ // Require a non-null receiver to avoid false positives on user-defined `invoke` methods
287
+ // (e.g. executor services, command/strategy objects, Kotlin lambdas). The Java Reflection
288
+ // API always calls this on a `java.lang.reflect.Method` object, never bare.
289
+ if (methodName === 'invoke' && receiver !== undefined) {
290
+ pushCall(ctx, node, '<dynamic:unresolved>', {
291
+ dynamic: true,
292
+ dynamicKind: 'unresolved-dynamic',
293
+ receiver,
294
+ });
295
+ return;
296
+ }
297
+
298
+ // clazz.getMethod("name") / getDeclaredMethod("name") — resolvable if literal arg.
299
+ // Require a non-null receiver to avoid false positives on gRPC ServiceDescriptor.getMethod(),
300
+ // Spring AnnotationUtils.getDeclaredMethod(), proto-generated descriptors, and any other API
301
+ // that exposes a method by this name unrelated to java.lang.Class reflection.
302
+ if (
303
+ (methodName === 'getMethod' || methodName === 'getDeclaredMethod') &&
304
+ receiver !== undefined
305
+ ) {
306
+ const literal = getFirstStringArgJava(node);
307
+ if (literal) {
308
+ pushCall(ctx, node, literal, {
309
+ dynamic: true,
310
+ dynamicKind: 'reflection',
311
+ keyExpr: literal,
312
+ receiver,
313
+ });
314
+ } else {
315
+ const args = node.childForFieldName('arguments') || findChild(node, 'argument_list');
316
+ const firstArg = args?.child(1); // skip '('
317
+ const keyExpr = firstArg?.text;
318
+ pushCall(ctx, node, '<dynamic:computed-key>', {
319
+ dynamic: true,
320
+ dynamicKind: 'computed-key',
321
+ keyExpr: keyExpr ?? undefined,
322
+ receiver,
323
+ });
324
+ }
325
+ return;
326
+ }
327
+
328
+ // Class.forName("pkg.ClassName") — dynamic class loading; flag as unresolved
329
+ // (loading a class is not the same as calling it — don't emit a call edge).
330
+ // Guard on receiver === 'Class' to avoid false positives from user-defined
331
+ // `forName()` factory methods (e.g. Currency.forName("USD"), Enum.forName(...)).
332
+ if (methodName === 'forName' && receiver === 'Class') {
333
+ const literal = getFirstStringArgJava(node);
334
+ pushCall(ctx, node, '<dynamic:unresolved>', {
335
+ dynamic: true,
336
+ dynamicKind: 'unresolved-dynamic',
337
+ keyExpr: literal ?? undefined,
338
+ receiver,
339
+ });
340
+ return;
341
+ }
342
+
343
+ // Normal method invocation
344
+ pushCall(ctx, node, methodName, receiver ? { receiver } : {});
266
345
  }
267
346
 
268
347
  function handleJavaLocalVarDecl(node: TreeSitterNode, ctx: ExtractorOutput): void {