@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
@@ -114,10 +114,12 @@ function buildContainmentEdges(
114
114
  // Lazily-cached prepared statements for reverse-dep operations
115
115
  let _revDepDb: BetterSqlite3Database | null = null;
116
116
  let _findRevDepsStmt: SqliteStatement | null = null;
117
+ let _deleteDataflowByCallEdgeStmt: SqliteStatement | null | undefined; // undefined = not yet tried
117
118
  let _deleteOutEdgesStmt: SqliteStatement | null = null;
118
119
 
119
120
  function getRevDepStmts(db: BetterSqlite3Database): {
120
121
  findRevDepsStmt: SqliteStatement;
122
+ deleteDataflowByCallEdgeStmt: SqliteStatement | null;
121
123
  deleteOutEdgesStmt: SqliteStatement;
122
124
  } {
123
125
  if (_revDepDb !== db) {
@@ -128,12 +130,24 @@ function getRevDepStmts(db: BetterSqlite3Database): {
128
130
  JOIN nodes n_tgt ON e.target_id = n_tgt.id
129
131
  WHERE n_tgt.file = ? AND n_src.file != ? AND n_src.kind != 'directory'`,
130
132
  );
133
+ // Delete inter-procedural dataflow rows whose call_edge_id references an
134
+ // outgoing edge from this file. Must run before deleteOutEdgesStmt to avoid
135
+ // SQLITE_CONSTRAINT_FOREIGNKEY: dataflow.call_edge_id REFERENCES edges(id).
136
+ try {
137
+ _deleteDataflowByCallEdgeStmt = db.prepare(
138
+ `DELETE FROM dataflow WHERE call_edge_id IN
139
+ (SELECT id FROM edges WHERE source_id IN (SELECT id FROM nodes WHERE file = ?))`,
140
+ );
141
+ } catch {
142
+ _deleteDataflowByCallEdgeStmt = null; // dataflow table or call_edge_id column absent
143
+ }
131
144
  _deleteOutEdgesStmt = db.prepare(
132
145
  'DELETE FROM edges WHERE source_id IN (SELECT id FROM nodes WHERE file = ?)',
133
146
  );
134
147
  }
135
148
  return {
136
149
  findRevDepsStmt: _findRevDepsStmt!,
150
+ deleteDataflowByCallEdgeStmt: _deleteDataflowByCallEdgeStmt ?? null,
137
151
  deleteOutEdgesStmt: _deleteOutEdgesStmt!,
138
152
  };
139
153
  }
@@ -144,7 +158,10 @@ function findReverseDeps(db: BetterSqlite3Database, relPath: string): string[] {
144
158
  }
145
159
 
146
160
  function deleteOutgoingEdges(db: BetterSqlite3Database, relPath: string): void {
147
- const { deleteOutEdgesStmt } = getRevDepStmts(db);
161
+ const { deleteDataflowByCallEdgeStmt, deleteOutEdgesStmt } = getRevDepStmts(db);
162
+ // Clear any inter-procedural dataflow rows that reference outgoing edges via
163
+ // call_edge_id before deleting those edges (FK: dataflow.call_edge_id → edges.id).
164
+ deleteDataflowByCallEdgeStmt?.run(relPath);
148
165
  deleteOutEdgesStmt.run(relPath);
149
166
  }
150
167
 
@@ -482,6 +499,215 @@ function makeIncrementalLookup(db: BetterSqlite3Database, stmts: IncrementalStmt
482
499
  };
483
500
  }
484
501
 
502
+ /** Coerce symbols.typeMap (Map, Array, or undefined) to a canonical Map. */
503
+ function coerceTypeMap(symbols: ExtractorOutput): Map<string, unknown> {
504
+ const rawTM: unknown = symbols.typeMap;
505
+ if (rawTM instanceof Map) return rawTM;
506
+ if (Array.isArray(rawTM) && rawTM.length > 0) {
507
+ return new Map(
508
+ (rawTM as Array<{ name: string; typeName?: string; type?: string }>).map((e) => [
509
+ e.name,
510
+ e.typeName ?? e.type ?? null,
511
+ ]),
512
+ );
513
+ }
514
+ return new Map();
515
+ }
516
+
517
+ /**
518
+ * Seed scoped rest-param keys into typeMap (Phase 8.3f).
519
+ * Mirrors buildObjectRestParamPostPass in the full build.
520
+ *
521
+ * Scoped keys (`callee::restName`) prevent same-name rest-param collisions
522
+ * when two functions in the same file both use `...rest` (#1358). The
523
+ * unscoped key is also seeded when only one callee uses a given rest name,
524
+ * preserving resolution when callerName is null.
525
+ */
526
+ function seedRestParamTypeMap(typeMap: Map<string, unknown>, symbols: ExtractorOutput): void {
527
+ if (!symbols.objectRestParamBindings?.length || !symbols.paramBindings?.length) return;
528
+
529
+ const restNameCallees = new Map<string, Set<string>>();
530
+ for (const orpb of symbols.objectRestParamBindings) {
531
+ if (!restNameCallees.has(orpb.restName)) restNameCallees.set(orpb.restName, new Set());
532
+ restNameCallees.get(orpb.restName)!.add(orpb.callee);
533
+ }
534
+ for (const orpb of symbols.objectRestParamBindings) {
535
+ for (const pb of symbols.paramBindings) {
536
+ if (pb.callee === orpb.callee && pb.argIndex === orpb.argIndex) {
537
+ const scopedKey = `${orpb.callee}::${orpb.restName}`;
538
+ if (!typeMap.has(scopedKey)) {
539
+ typeMap.set(scopedKey, { type: pb.argName, confidence: 0.65 });
540
+ if (restNameCallees.get(orpb.restName)!.size === 1 && !typeMap.has(orpb.restName)) {
541
+ typeMap.set(orpb.restName, { type: pb.argName, confidence: 0.65 });
542
+ }
543
+ }
544
+ }
545
+ }
546
+ }
547
+ }
548
+
549
+ /**
550
+ * Normalize symbols.typeMap into a canonical Map and seed scoped rest-param
551
+ * keys (Phase 8.3f). Mirrors buildObjectRestParamPostPass in the full build.
552
+ */
553
+ function buildIncrementalTypeMap(symbols: ExtractorOutput): Map<string, unknown> {
554
+ const typeMap = coerceTypeMap(symbols);
555
+ seedRestParamTypeMap(typeMap, symbols);
556
+ return typeMap;
557
+ }
558
+
559
+ /**
560
+ * Strategy 1 — same-class `this.method()` fallback.
561
+ * Derives the enclosing class name from callerName by extracting the segment
562
+ * immediately before the final dot (e.g. `MyClass.method` → `MyClass`,
563
+ * `Namespace.MyClass.method` → `MyClass`), then retries with the qualified
564
+ * method name `MyClass.callName`.
565
+ *
566
+ * Uses lastIndexOf to match the full-build counterpart in resolveFallbackTargets
567
+ * (build-edges.ts) — indexOf would extract `Namespace` instead of `MyClass` for
568
+ * deeply-qualified caller names like `Namespace.MyClass.method`.
569
+ */
570
+ function resolveThisSameClassTarget(
571
+ callName: string,
572
+ callerName: string,
573
+ relPath: string,
574
+ lookup: CallNodeLookup,
575
+ ): Array<{ id: number; file: string; kind?: string }> {
576
+ const lastDot = callerName.lastIndexOf('.');
577
+ if (lastDot <= 0) return [];
578
+ const prevDot = callerName.lastIndexOf('.', lastDot - 1);
579
+ const className = callerName.slice(prevDot + 1, lastDot);
580
+ return lookup
581
+ .byNameAndFile(`${className}.${callName}`, relPath)
582
+ .filter((n) => n.kind === 'method');
583
+ }
584
+
585
+ /**
586
+ * Strategy 2 — Object.defineProperty accessor fallback.
587
+ * When a function is registered as a getter/setter via
588
+ * `Object.defineProperty(obj, "bar", { get: getter })`, calls to `this.X()`
589
+ * inside `getter` resolve against `obj`. Looks up the receiver var in the
590
+ * typeMap for its type, then falls back to any same-file definition named
591
+ * `callName` with function or method kind.
592
+ */
593
+ function resolveDefinePropertyTarget(
594
+ callName: string,
595
+ callerName: string,
596
+ relPath: string,
597
+ typeMap: Map<string, unknown>,
598
+ lookup: CallNodeLookup,
599
+ definePropertyReceivers: Map<string, string>,
600
+ ): Array<{ id: number; file: string; kind?: string }> {
601
+ const receiverVarName = definePropertyReceivers.get(callerName);
602
+ if (!receiverVarName) return [];
603
+
604
+ const typeEntry = typeMap.get(receiverVarName);
605
+ const typeName = typeEntry
606
+ ? typeof typeEntry === 'string'
607
+ ? typeEntry
608
+ : (typeEntry as { type?: string }).type
609
+ : null;
610
+ if (typeName) {
611
+ const qualified = lookup.byNameAndFile(`${typeName}.${callName}`, relPath);
612
+ if (qualified.length > 0) return [...qualified];
613
+ }
614
+ // Narrow to function/method kinds only to avoid matching unrelated
615
+ // variables or classes that share a name in the same file.
616
+ return lookup
617
+ .byNameAndFile(callName, relPath)
618
+ .filter((n) => n.kind === 'function' || n.kind === 'method');
619
+ }
620
+
621
+ /**
622
+ * Apply `this`-receiver fallback resolution strategies for a single call site
623
+ * when the primary resolveCallTargets pass returned no targets.
624
+ */
625
+ function applyThisReceiverFallbacks(
626
+ call: { name: string; receiver?: string | null },
627
+ callerName: string | null,
628
+ relPath: string,
629
+ typeMap: Map<string, unknown>,
630
+ lookup: CallNodeLookup,
631
+ definePropertyReceivers: Map<string, string> | undefined,
632
+ initialTargets: Array<{ id: number; file: string; kind?: string }>,
633
+ ): Array<{ id: number; file: string; kind?: string }> {
634
+ if (initialTargets.length > 0) return initialTargets;
635
+
636
+ // Strategy 1: same-class `this.method()` fallback.
637
+ if (call.receiver === 'this' && callerName != null) {
638
+ const s1 = resolveThisSameClassTarget(call.name, callerName, relPath, lookup);
639
+ if (s1.length > 0) return s1;
640
+ }
641
+
642
+ // Strategy 2: Object.defineProperty accessor fallback.
643
+ if (call.receiver === 'this' && callerName != null && definePropertyReceivers) {
644
+ return resolveDefinePropertyTarget(
645
+ call.name,
646
+ callerName,
647
+ relPath,
648
+ typeMap,
649
+ lookup,
650
+ definePropertyReceivers,
651
+ );
652
+ }
653
+
654
+ return initialTargets;
655
+ }
656
+
657
+ /**
658
+ * Emit direct `calls` edges for the resolved targets of a single call site,
659
+ * then emit a `receiver` edge when the call has a non-this/self/super receiver.
660
+ * Returns the number of edges inserted.
661
+ */
662
+ function emitIncrementalCallEdges(
663
+ call: { name: string; receiver?: string | null; dynamic?: boolean },
664
+ caller: { id: number; callerName: string | null },
665
+ targets: Array<{ id: number; file: string; kind?: string }>,
666
+ importedFrom: string | null | undefined,
667
+ relPath: string,
668
+ typeMap: Map<string, unknown>,
669
+ lookup: CallNodeLookup,
670
+ importedNames: Map<string, string>,
671
+ seenCallEdges: Set<string>,
672
+ stmts: IncrementalStmts,
673
+ ): number {
674
+ let edgesAdded = 0;
675
+
676
+ for (const t of targets) {
677
+ const edgeKey = `${caller.id}|${t.id}`;
678
+ if (t.id !== caller.id && !seenCallEdges.has(edgeKey)) {
679
+ seenCallEdges.add(edgeKey);
680
+ const confidence = computeConfidence(relPath, t.file, importedFrom ?? null);
681
+ stmts.insertEdge.run(caller.id, t.id, 'calls', confidence, call.dynamic ? 1 : 0);
682
+ edgesAdded++;
683
+ }
684
+ }
685
+
686
+ if (
687
+ call.receiver &&
688
+ !BUILTIN_RECEIVERS.has(call.receiver) &&
689
+ call.receiver !== 'this' &&
690
+ call.receiver !== 'self' &&
691
+ call.receiver !== 'super'
692
+ ) {
693
+ const recv = resolveReceiverEdge(
694
+ lookup,
695
+ { name: call.name, receiver: call.receiver },
696
+ caller,
697
+ relPath,
698
+ typeMap,
699
+ seenCallEdges,
700
+ importedNames,
701
+ );
702
+ if (recv) {
703
+ stmts.insertEdge.run(recv.callerId, recv.receiverId, 'receiver', recv.confidence, 0);
704
+ edgesAdded++;
705
+ }
706
+ }
707
+
708
+ return edgesAdded;
709
+ }
710
+
485
711
  function buildCallEdges(
486
712
  db: BetterSqlite3Database,
487
713
  stmts: IncrementalStmts,
@@ -490,46 +716,7 @@ function buildCallEdges(
490
716
  fileNodeRow: { id: number },
491
717
  importedNames: Map<string, string>,
492
718
  ): number {
493
- const rawTM: unknown = symbols.typeMap;
494
- const typeMap: Map<string, unknown> =
495
- rawTM instanceof Map
496
- ? rawTM
497
- : Array.isArray(rawTM) && rawTM.length > 0
498
- ? new Map(
499
- (rawTM as Array<{ name: string; typeName?: string; type?: string }>).map((e) => [
500
- e.name,
501
- e.typeName ?? e.type ?? null,
502
- ]),
503
- )
504
- : new Map();
505
-
506
- // Phase 8.3f: seed typeMap[callee::restName] = { type: argName } from
507
- // objectRestParamBindings × paramBindings, mirroring buildObjectRestParamPostPass.
508
- // Scoped keys prevent same-name rest-param collisions when two functions in
509
- // the same file both use `...rest` (#1358). The unscoped key is also seeded
510
- // when only one callee uses a given rest name, preserving resolution when
511
- // callerName is null (findCaller couldn't identify the enclosing function).
512
- if (symbols.objectRestParamBindings?.length && symbols.paramBindings?.length) {
513
- const restNameCallees = new Map<string, Set<string>>();
514
- for (const orpb of symbols.objectRestParamBindings) {
515
- if (!restNameCallees.has(orpb.restName)) restNameCallees.set(orpb.restName, new Set());
516
- restNameCallees.get(orpb.restName)!.add(orpb.callee);
517
- }
518
- for (const orpb of symbols.objectRestParamBindings) {
519
- for (const pb of symbols.paramBindings) {
520
- if (pb.callee === orpb.callee && pb.argIndex === orpb.argIndex) {
521
- const scopedKey = `${orpb.callee}::${orpb.restName}`;
522
- if (!typeMap.has(scopedKey)) {
523
- typeMap.set(scopedKey, { type: pb.argName, confidence: 0.65 });
524
- if (restNameCallees.get(orpb.restName)!.size === 1 && !typeMap.has(orpb.restName)) {
525
- typeMap.set(orpb.restName, { type: pb.argName, confidence: 0.65 });
526
- }
527
- }
528
- }
529
- }
530
- }
531
- }
532
-
719
+ const typeMap = buildIncrementalTypeMap(symbols);
533
720
  const seenCallEdges = new Set<string>();
534
721
  const lookup = makeIncrementalLookup(db, stmts);
535
722
  let edgesAdded = 0;
@@ -546,87 +733,29 @@ function buildCallEdges(
546
733
  typeMap,
547
734
  caller.callerName,
548
735
  );
549
- let targets = initialTargets;
550
-
551
- if (targets.length === 0 && call.receiver === 'this' && caller.callerName != null) {
552
- const dotIdx = caller.callerName.indexOf('.');
553
- if (dotIdx > 0) {
554
- const className = caller.callerName.slice(0, dotIdx);
555
- const qualifiedName = `${className}.${call.name}`;
556
- const qualified = lookup
557
- .byNameAndFile(qualifiedName, relPath)
558
- .filter((n) => n.kind === 'method');
559
- if (qualified.length > 0) {
560
- targets = qualified;
561
- }
562
- }
563
- }
564
-
565
- if (
566
- targets.length === 0 &&
567
- call.receiver === 'this' &&
568
- caller.callerName != null &&
569
- symbols.definePropertyReceivers
570
- ) {
571
- const receiverVarName = symbols.definePropertyReceivers.get(caller.callerName);
572
- if (receiverVarName) {
573
- const typeEntry = typeMap.get(receiverVarName);
574
- const typeName = typeEntry
575
- ? typeof typeEntry === 'string'
576
- ? typeEntry
577
- : (typeEntry as { type?: string }).type
578
- : null;
579
- if (typeName) {
580
- const qualifiedName = `${typeName}.${call.name}`;
581
- const qualified = lookup.byNameAndFile(qualifiedName, relPath);
582
- if (qualified.length > 0) {
583
- targets = [...qualified];
584
- }
585
- }
586
- if (targets.length === 0) {
587
- // Narrow to function/method kinds only to avoid matching unrelated
588
- // variables or classes that share a name in the same file.
589
- const sameFile = lookup
590
- .byNameAndFile(call.name, relPath)
591
- .filter((n) => n.kind === 'function' || n.kind === 'method');
592
- if (sameFile.length > 0) {
593
- targets = [...sameFile];
594
- }
595
- }
596
- }
597
- }
598
736
 
599
- for (const t of targets) {
600
- const edgeKey = `${caller.id}|${t.id}`;
601
- if (t.id !== caller.id && !seenCallEdges.has(edgeKey)) {
602
- seenCallEdges.add(edgeKey);
603
- const confidence = computeConfidence(relPath, t.file, importedFrom ?? null);
604
- stmts.insertEdge.run(caller.id, t.id, 'calls', confidence, call.dynamic ? 1 : 0);
605
- edgesAdded++;
606
- }
607
- }
737
+ const targets = applyThisReceiverFallbacks(
738
+ call,
739
+ caller.callerName,
740
+ relPath,
741
+ typeMap,
742
+ lookup,
743
+ symbols.definePropertyReceivers,
744
+ initialTargets,
745
+ );
608
746
 
609
- if (
610
- call.receiver &&
611
- !BUILTIN_RECEIVERS.has(call.receiver) &&
612
- call.receiver !== 'this' &&
613
- call.receiver !== 'self' &&
614
- call.receiver !== 'super'
615
- ) {
616
- const recv = resolveReceiverEdge(
617
- lookup,
618
- { name: call.name, receiver: call.receiver },
619
- caller,
620
- relPath,
621
- typeMap,
622
- seenCallEdges,
623
- importedNames,
624
- );
625
- if (recv) {
626
- stmts.insertEdge.run(recv.callerId, recv.receiverId, 'receiver', recv.confidence, 0);
627
- edgesAdded++;
628
- }
629
- }
747
+ edgesAdded += emitIncrementalCallEdges(
748
+ call,
749
+ caller,
750
+ targets,
751
+ importedFrom,
752
+ relPath,
753
+ typeMap,
754
+ lookup,
755
+ importedNames,
756
+ seenCallEdges,
757
+ stmts,
758
+ );
630
759
  }
631
760
  return edgesAdded;
632
761
  }
@@ -62,7 +62,9 @@ export {
62
62
 
63
63
  function initializeEngine(ctx: PipelineContext): void {
64
64
  ctx.engineOpts = {
65
- engine: ctx.opts.engine || 'auto',
65
+ // Priority: CLI --engine flag > .codegraphrc.json build.engine > 'auto'.
66
+ // ctx.config is already populated by the time initializeEngine is called.
67
+ engine: ctx.opts.engine ?? ctx.config.build.engine ?? 'auto',
66
68
  dataflow: ctx.opts.dataflow !== false,
67
69
  ast: ctx.opts.ast !== false,
68
70
  // nativeDb and WAL callbacks are set later when NativeDatabase is opened
@@ -174,8 +176,13 @@ function setupPipeline(ctx: PipelineContext): void {
174
176
  ? path.resolve(ctx.opts.dbPath)
175
177
  : path.join(ctx.rootDir, '.codegraph', 'graph.db');
176
178
 
179
+ // Load config first so build.engine from .codegraphrc.json is available for
180
+ // the engine-pref fallback below (ctx.opts.engine > config.build.engine > 'auto').
181
+ ctx.config = loadConfig(ctx.rootDir, { userConfig: ctx.opts.userConfig });
182
+
177
183
  // Detect whether native engine is available.
178
- const enginePref = ctx.opts.engine || 'auto';
184
+ // Priority: CLI --engine flag > .codegraphrc.json build.engine > 'auto'.
185
+ const enginePref = ctx.opts.engine ?? ctx.config.build.engine ?? 'auto';
179
186
  const native = enginePref !== 'wasm' ? loadNative() : null;
180
187
  ctx.nativeAvailable = !!native?.NativeDatabase;
181
188
 
@@ -188,8 +195,6 @@ function setupPipeline(ctx: PipelineContext): void {
188
195
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
189
196
  ctx.db = openDb(ctx.dbPath);
190
197
  initSchema(ctx.db);
191
-
192
- ctx.config = loadConfig(ctx.rootDir, { userConfig: ctx.opts.userConfig });
193
198
  // Merge caller-supplied excludes on top of the file-config excludes so
194
199
  // programmatic callers (e.g. benchmark scripts) can extend exclusion
195
200
  // without mutating .codegraphrc.json. Native orchestrator picks this up
@@ -411,7 +416,8 @@ export async function buildGraph(
411
416
  // engineName, scope, etc.) we log the reason so the bench gate run
412
417
  // produces observable output even if `detectNoChanges` is never
413
418
  // entered.
414
- const fastSkipDiag = process.env.CODEGRAPH_FAST_SKIP_DIAG === '1';
419
+ // Reads from config (which applies CODEGRAPH_FAST_SKIP_DIAG via applyEnvOverrides).
420
+ const fastSkipDiag = ctx.config.build.fastSkipDiag;
415
421
  if (fastSkipDiag) {
416
422
  const reasons: string[] = [];
417
423
  if (!ctx.nativeAvailable) reasons.push('nativeAvailable=false');