gitnexus 1.6.8-rc.8 → 1.6.8

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 (439) hide show
  1. package/README.md +3 -3
  2. package/dist/_shared/graph/types.d.ts +31 -1
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/language-detection.d.ts.map +1 -1
  5. package/dist/_shared/language-detection.js +11 -1
  6. package/dist/_shared/language-detection.js.map +1 -1
  7. package/dist/_shared/lbug/schema-constants.d.ts +1 -1
  8. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  9. package/dist/_shared/lbug/schema-constants.js +6 -0
  10. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  11. package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
  12. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  13. package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
  14. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  15. package/dist/cli/ai-context.d.ts +31 -1
  16. package/dist/cli/ai-context.js +18 -16
  17. package/dist/cli/analyze-config.js +11 -0
  18. package/dist/cli/analyze.d.ts +14 -0
  19. package/dist/cli/analyze.js +98 -0
  20. package/dist/cli/embedding-dims.d.ts +33 -0
  21. package/dist/cli/embedding-dims.js +39 -0
  22. package/dist/cli/eval-server.d.ts +8 -0
  23. package/dist/cli/eval-server.js +242 -2
  24. package/dist/cli/help-i18n.js +19 -0
  25. package/dist/cli/i18n/en.d.ts +15 -1
  26. package/dist/cli/i18n/en.js +15 -1
  27. package/dist/cli/i18n/resources.d.ts +29 -1
  28. package/dist/cli/i18n/zh-CN.d.ts +14 -0
  29. package/dist/cli/i18n/zh-CN.js +15 -1
  30. package/dist/cli/index.js +89 -1
  31. package/dist/cli/mcp.d.ts +6 -1
  32. package/dist/cli/mcp.js +26 -1
  33. package/dist/cli/optional-grammars.d.ts +6 -8
  34. package/dist/cli/optional-grammars.js +8 -11
  35. package/dist/cli/setup.d.ts +3 -1
  36. package/dist/cli/setup.js +67 -17
  37. package/dist/cli/skill-gen.js +2 -1
  38. package/dist/cli/tool.d.ts +19 -1
  39. package/dist/cli/tool.js +96 -3
  40. package/dist/core/embeddings/hf-env.d.ts +0 -66
  41. package/dist/core/embeddings/http-client.d.ts +7 -0
  42. package/dist/core/embeddings/http-client.js +5 -3
  43. package/dist/core/embeddings/server-mapping.d.ts +1 -1
  44. package/dist/core/embeddings/server-mapping.js +7 -3
  45. package/dist/core/graph/import-cycles.d.ts +10 -0
  46. package/dist/core/graph/import-cycles.js +103 -0
  47. package/dist/core/group/cross-impact.d.ts +2 -1
  48. package/dist/core/group/cross-impact.js +5 -1
  49. package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
  50. package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
  51. package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
  52. package/dist/core/group/extractors/http-route-extractor.js +22 -4
  53. package/dist/core/group/extractors/include-extractor.js +22 -13
  54. package/dist/core/group/sync.d.ts +27 -1
  55. package/dist/core/group/sync.js +0 -0
  56. package/dist/core/incremental/subgraph-extract.js +18 -1
  57. package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
  58. package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
  59. package/dist/core/ingestion/cfg/collect.d.ts +51 -0
  60. package/dist/core/ingestion/cfg/collect.js +77 -0
  61. package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
  62. package/dist/core/ingestion/cfg/control-dependence.js +182 -0
  63. package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
  64. package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
  65. package/dist/core/ingestion/cfg/emit.d.ts +293 -0
  66. package/dist/core/ingestion/cfg/emit.js +646 -0
  67. package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
  68. package/dist/core/ingestion/cfg/post-dominators.js +176 -0
  69. package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
  70. package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
  71. package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
  72. package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
  73. package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
  74. package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
  75. package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
  76. package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
  77. package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
  78. package/dist/core/ingestion/cfg/traversal-result.js +2 -0
  79. package/dist/core/ingestion/cfg/types.d.ts +274 -0
  80. package/dist/core/ingestion/cfg/types.js +13 -0
  81. package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
  82. package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
  83. package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
  84. package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
  85. package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
  86. package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
  87. package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
  88. package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
  89. package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
  90. package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
  91. package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
  92. package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
  93. package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
  94. package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
  95. package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
  96. package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
  97. package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
  98. package/dist/core/ingestion/cfg/visitors/go.js +638 -0
  99. package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
  100. package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
  101. package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
  102. package/dist/core/ingestion/cfg/visitors/java.js +812 -0
  103. package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
  104. package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
  105. package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
  106. package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
  107. package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
  108. package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
  109. package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
  110. package/dist/core/ingestion/cfg/visitors/php.js +721 -0
  111. package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
  112. package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
  113. package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
  114. package/dist/core/ingestion/cfg/visitors/python.js +558 -0
  115. package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
  116. package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
  117. package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
  118. package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
  119. package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
  120. package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
  121. package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
  122. package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
  123. package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
  124. package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
  125. package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
  126. package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
  127. package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
  128. package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
  129. package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
  130. package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
  131. package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
  132. package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
  133. package/dist/core/ingestion/import-resolvers/utils.js +2 -0
  134. package/dist/core/ingestion/language-provider.d.ts +23 -2
  135. package/dist/core/ingestion/languages/c-cpp.js +17 -5
  136. package/dist/core/ingestion/languages/cobol.js +4 -0
  137. package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
  138. package/dist/core/ingestion/languages/cpp/captures.js +50 -1
  139. package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
  140. package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
  141. package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
  142. package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
  143. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
  144. package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
  145. package/dist/core/ingestion/languages/cpp/query.js +23 -0
  146. package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
  147. package/dist/core/ingestion/languages/csharp.js +2 -0
  148. package/dist/core/ingestion/languages/dart.js +2 -0
  149. package/dist/core/ingestion/languages/go.js +2 -0
  150. package/dist/core/ingestion/languages/java.js +3 -0
  151. package/dist/core/ingestion/languages/kotlin/query.js +3 -2
  152. package/dist/core/ingestion/languages/kotlin.js +8 -1
  153. package/dist/core/ingestion/languages/php.js +2 -0
  154. package/dist/core/ingestion/languages/python.js +2 -0
  155. package/dist/core/ingestion/languages/ruby.js +2 -0
  156. package/dist/core/ingestion/languages/rust.js +2 -0
  157. package/dist/core/ingestion/languages/swift.js +2 -0
  158. package/dist/core/ingestion/languages/typescript.js +5 -0
  159. package/dist/core/ingestion/languages/vue.js +6 -0
  160. package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
  161. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  162. package/dist/core/ingestion/method-types.d.ts +2 -0
  163. package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
  164. package/dist/core/ingestion/model/symbol-table.js +1 -0
  165. package/dist/core/ingestion/mro-processor.js +109 -0
  166. package/dist/core/ingestion/parsing-processor.js +44 -0
  167. package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
  168. package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
  169. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  170. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  171. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
  172. package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
  173. package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
  174. package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
  175. package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
  176. package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
  177. package/dist/core/ingestion/pipeline.d.ts +92 -10
  178. package/dist/core/ingestion/pipeline.js +11 -2
  179. package/dist/core/ingestion/scope-extractor.js +12 -2
  180. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
  181. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
  182. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
  183. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
  184. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
  185. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
  186. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
  187. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
  188. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
  189. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
  190. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
  191. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
  192. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
  193. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
  194. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
  195. package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
  196. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
  197. package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
  198. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  199. package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
  200. package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
  201. package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
  202. package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
  203. package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
  204. package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
  205. package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
  206. package/dist/core/ingestion/taint/call-summary-model.js +25 -0
  207. package/dist/core/ingestion/taint/emit.d.ts +125 -0
  208. package/dist/core/ingestion/taint/emit.js +208 -0
  209. package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
  210. package/dist/core/ingestion/taint/interproc-emit.js +88 -0
  211. package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
  212. package/dist/core/ingestion/taint/interproc-solver.js +312 -0
  213. package/dist/core/ingestion/taint/match.d.ts +153 -0
  214. package/dist/core/ingestion/taint/match.js +278 -0
  215. package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
  216. package/dist/core/ingestion/taint/path-codec.js +190 -0
  217. package/dist/core/ingestion/taint/propagate.d.ts +216 -0
  218. package/dist/core/ingestion/taint/propagate.js +659 -0
  219. package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
  220. package/dist/core/ingestion/taint/site-safety.js +98 -0
  221. package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
  222. package/dist/core/ingestion/taint/source-sink-config.js +35 -12
  223. package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
  224. package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
  225. package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
  226. package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
  227. package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
  228. package/dist/core/ingestion/taint/summary-harvest.js +537 -0
  229. package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
  230. package/dist/core/ingestion/taint/summary-model.js +86 -0
  231. package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
  232. package/dist/core/ingestion/taint/typescript-model.js +102 -0
  233. package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
  234. package/dist/core/ingestion/utils/env.d.ts +7 -0
  235. package/dist/core/ingestion/utils/env.js +12 -0
  236. package/dist/core/ingestion/utils/method-props.js +1 -0
  237. package/dist/core/ingestion/workers/clone-safety.d.ts +109 -0
  238. package/dist/core/ingestion/workers/clone-safety.js +465 -0
  239. package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
  240. package/dist/core/ingestion/workers/parse-worker.js +81 -53
  241. package/dist/core/ingestion/workers/post-result.d.ts +22 -0
  242. package/dist/core/ingestion/workers/post-result.js +87 -0
  243. package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
  244. package/dist/core/ingestion/workers/result-merge.js +43 -0
  245. package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
  246. package/dist/core/ingestion/workers/worker-pool.js +43 -16
  247. package/dist/core/lbug/csv-generator.d.ts +51 -3
  248. package/dist/core/lbug/csv-generator.js +369 -255
  249. package/dist/core/lbug/lbug-adapter.d.ts +58 -18
  250. package/dist/core/lbug/lbug-adapter.js +346 -84
  251. package/dist/core/lbug/lbug-config.d.ts +19 -0
  252. package/dist/core/lbug/lbug-config.js +29 -0
  253. package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
  254. package/dist/core/lbug/pdg-emit-sink.js +358 -0
  255. package/dist/core/lbug/pool-adapter.d.ts +35 -0
  256. package/dist/core/lbug/pool-adapter.js +90 -1
  257. package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
  258. package/dist/core/lbug/rel-pair-routing.js +140 -0
  259. package/dist/core/lbug/schema.d.ts +2 -2
  260. package/dist/core/lbug/schema.js +3 -0
  261. package/dist/core/logger.d.ts +0 -5
  262. package/dist/core/run-analyze.d.ts +96 -0
  263. package/dist/core/run-analyze.js +207 -3
  264. package/dist/core/tree-sitter/parser-loader.js +5 -4
  265. package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
  266. package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
  267. package/dist/core/tree-sitter/vendored-grammars.js +57 -0
  268. package/dist/core/wiki/generator.js +3 -1
  269. package/dist/core/wiki/graph-queries.d.ts +6 -0
  270. package/dist/core/wiki/graph-queries.js +9 -1
  271. package/dist/mcp/http-transport.d.ts +134 -0
  272. package/dist/mcp/http-transport.js +503 -0
  273. package/dist/mcp/local/local-backend.d.ts +110 -24
  274. package/dist/mcp/local/local-backend.js +1225 -19
  275. package/dist/mcp/local/pdg-impact.d.ts +384 -0
  276. package/dist/mcp/local/pdg-impact.js +1972 -0
  277. package/dist/mcp/resources.js +13 -1
  278. package/dist/mcp/tools.d.ts +12 -0
  279. package/dist/mcp/tools.js +214 -7
  280. package/dist/server/analyze-launch.d.ts +29 -0
  281. package/dist/server/analyze-launch.js +137 -0
  282. package/dist/server/analyze-upload.d.ts +33 -0
  283. package/dist/server/analyze-upload.js +123 -0
  284. package/dist/server/analyze-worker-ipc.d.ts +58 -0
  285. package/dist/server/analyze-worker-ipc.js +16 -0
  286. package/dist/server/analyze-worker.d.ts +17 -1
  287. package/dist/server/analyze-worker.js +7 -1
  288. package/dist/server/api.d.ts +17 -0
  289. package/dist/server/api.js +132 -168
  290. package/dist/server/git-clone.d.ts +43 -2
  291. package/dist/server/git-clone.js +211 -16
  292. package/dist/server/mcp-http.d.ts +5 -6
  293. package/dist/server/mcp-http.js +9 -82
  294. package/dist/server/middleware.d.ts +40 -0
  295. package/dist/server/middleware.js +92 -0
  296. package/dist/server/private-ip.d.ts +1 -0
  297. package/dist/server/private-ip.js +15 -0
  298. package/dist/server/upload-ingest.d.ts +56 -0
  299. package/dist/server/upload-ingest.js +276 -0
  300. package/dist/server/upload-paths.d.ts +37 -0
  301. package/dist/server/upload-paths.js +57 -0
  302. package/dist/server/upload-sweep.d.ts +20 -0
  303. package/dist/server/upload-sweep.js +57 -0
  304. package/dist/storage/git.js +5 -8
  305. package/dist/storage/parse-cache.d.ts +22 -1
  306. package/dist/storage/parse-cache.js +44 -10
  307. package/dist/storage/repo-manager.d.ts +121 -10
  308. package/dist/storage/repo-manager.js +43 -5
  309. package/dist/types/pipeline.d.ts +9 -0
  310. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
  311. package/hooks/claude/gitnexus-hook.cjs +110 -13
  312. package/hooks/claude/hook-db-lock-probe.cjs +513 -26
  313. package/package.json +8 -2
  314. package/scripts/assert-publish-grammar-coverage.cjs +31 -0
  315. package/scripts/build-tree-sitter-grammars.cjs +16 -10
  316. package/scripts/cross-platform-tests.ts +1 -0
  317. package/skills/gitnexus-debugging.md +16 -4
  318. package/skills/gitnexus-exploring.md +3 -3
  319. package/skills/gitnexus-guide.md +33 -0
  320. package/skills/gitnexus-pdg-query.md +89 -0
  321. package/skills/gitnexus-refactoring.md +1 -1
  322. package/skills/gitnexus-taint-analysis.md +178 -0
  323. package/vendor/tree-sitter-c/package.json +1 -1
  324. package/vendor/tree-sitter-dart/package.json +1 -1
  325. package/vendor/tree-sitter-kotlin/package.json +1 -1
  326. package/vendor/tree-sitter-proto/package.json +1 -1
  327. package/vendor/tree-sitter-swift/package.json +1 -1
  328. package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
  329. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
  330. package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
  331. package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
  332. package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
  333. package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
  334. package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
  335. package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
  336. package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
  337. package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
  338. package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
  339. package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
  340. package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
  341. package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
  342. package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
  343. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
  344. package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
  345. package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
  346. package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
  347. package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
  348. package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
  349. package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
  350. package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
  351. package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
  352. package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
  353. package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
  354. package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
  355. package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
  356. package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
  357. package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
  358. package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
  359. package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
  360. package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
  361. package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
  362. package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
  363. package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
  364. package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
  365. package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
  366. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
  367. package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
  368. package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
  369. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
  370. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
  371. package/web/assets/index-BvYev1UJ.js +635 -0
  372. package/web/assets/index-_lgn7hs5.css +2 -0
  373. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
  374. package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
  375. package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
  376. package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
  377. package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
  378. package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
  379. package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
  380. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
  381. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
  382. package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
  383. package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
  384. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
  385. package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
  386. package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
  387. package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
  388. package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
  389. package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
  390. package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
  391. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
  392. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
  393. package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
  394. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
  395. package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
  396. package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
  397. package/web/index.html +13 -15
  398. package/scripts/materialize-vendor-grammars.cjs +0 -97
  399. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
  400. package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
  401. package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
  402. package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
  403. package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
  404. package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
  405. package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
  406. package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
  407. package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
  408. package/web/assets/chunk-CilyBKbf.js +0 -1
  409. package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
  410. package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
  411. package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
  412. package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
  413. package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
  414. package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
  415. package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
  416. package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
  417. package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
  418. package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
  419. package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
  420. package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
  421. package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
  422. package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
  423. package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
  424. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
  425. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
  426. package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
  427. package/web/assets/index-BKWA-m7o.css +0 -2
  428. package/web/assets/index-CG6q8eTs.js +0 -626
  429. package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
  430. package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
  431. package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
  432. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
  433. package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
  434. package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
  435. package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
  436. package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
  437. package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
  438. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
  439. /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
@@ -0,0 +1,274 @@
1
+ /**
2
+ * CFG data model — plain, JSON-serializable types (issue #2081, M1).
3
+ *
4
+ * These cross the worker→main boundary and the disk-backed/durable ParsedFile
5
+ * store, so they must contain NO tree-sitter AST references, class instances,
6
+ * or anything that does not survive `JSON.stringify` → `JSON.parse`. Block and
7
+ * edge endpoints are referenced by integer index within a function's CFG.
8
+ *
9
+ * The per-language `CfgVisitor` (built in the parse worker, where the AST
10
+ * lives — see the M1 plan KTD1/KTD7) produces a `FunctionCfg` per function; the
11
+ * array of them is what rides on `ParsedFile.cfgSideChannel`.
12
+ */
13
+ /**
14
+ * One distinct declared variable (binding) within a function (#2082 M2 U1).
15
+ *
16
+ * Statement facts reference bindings by integer index into
17
+ * {@link FunctionCfg.bindings} — names appear once per binding instead of once
18
+ * per occurrence (measured ~4× smaller serialized payload than named records).
19
+ * Distinct bindings of the same name (shadowing) get distinct entries, which is
20
+ * what keeps an inner `let x` from falsely killing the outer `x`'s definitions
21
+ * in the reaching-defs solver. NOTE: no field here may be named `nodeId` — the
22
+ * durable parsedfile-store reviver dedups objects keyed on that field name.
23
+ */
24
+ export interface BindingEntry {
25
+ /** Source-level variable name (what the persisted edge's `reason` carries). */
26
+ readonly name: string;
27
+ /**
28
+ * 1-based line/0-based column of the canonical declaration site — `var`
29
+ * multi-declarations canonicalize to the FIRST declaration in source order.
30
+ * Both 0 for synthetic bindings.
31
+ */
32
+ readonly declLine: number;
33
+ readonly declColumn: number;
34
+ /** How the binding was introduced (param/catch matter to the M3 taint pass). */
35
+ readonly kind: 'var' | 'let' | 'const' | 'param' | 'catch' | 'function' | 'class' | 'module';
36
+ /**
37
+ * True when the name has no in-function declaration site (implicit global,
38
+ * import, or a variable captured from an enclosing function) — keyed
39
+ * `name@module` in edge ids instead of `name:line:col`.
40
+ */
41
+ readonly synthetic?: boolean;
42
+ /**
43
+ * For `kind: 'param'` bindings only: the 0-based ENCLOSING TOP-LEVEL FORMAL
44
+ * position this binding belongs to — the index a call site's argument position
45
+ * joins against (PDG FU-C). For a simple identifier formal this equals the
46
+ * param's ordinal; for a DESTRUCTURED/REST formal every inner name carries the
47
+ * SAME formal index (`function f({a, b}, c)` ⇒ a:0, b:0, c:1), so a downstream
48
+ * positional consumer never mistakes the destructured-object formal for a later
49
+ * simple formal. Set by the per-language `declareParams`; OMITTED when the
50
+ * producer does not (yet) supply it — a consumer that needs a sound formal
51
+ * position MUST treat a param binding without `formalIndex` as unknown and fall
52
+ * back conservatively (never attribute a flattened ordinal to a formal slot).
53
+ * Omit-when-absent (pre-upgrade durable channels stay valid; JSON-plain).
54
+ */
55
+ readonly formalIndex?: number;
56
+ }
57
+ /**
58
+ * One occurrence of a binding inside a call/new site's argument position
59
+ * (#2083 M3 U1). A bare `number` is a DIRECT occurrence (binding index into
60
+ * {@link FunctionCfg.bindings}); a `[bindingIdx, viaSiteIdx]` tuple marks an
61
+ * occurrence that reaches this argument THROUGH the nested site at
62
+ * `viaSiteIdx` (an index into the SAME statement's {@link StatementFacts.sites}
63
+ * array). The tag is load-bearing for sanitizer interposition (plan KTD4a):
64
+ * a flat per-arg binding set cannot distinguish `exec(escape(x))` (kill) from
65
+ * `exec(x)` (finding) — the single most common safe pattern would
66
+ * false-positive without it.
67
+ */
68
+ export type SiteArgOccurrence = number | readonly [number, number];
69
+ /**
70
+ * One call site, constructor call, or value-position member read harvested
71
+ * from a statement (#2083 M3 U1, plan KTD2). Worker-side substrate for the M3
72
+ * taint pass: the M2 facts carry no expression structure, and the main thread
73
+ * cannot re-parse (the #1983 OOM shape). Spec-AGNOSTIC — records structure
74
+ * only, never source/sink/sanitizer-ness (matching is a main-thread concern).
75
+ *
76
+ * Integer indices: binding fields (`receiver`/`object`/`resultDefs`/arg
77
+ * occurrences) index {@link FunctionCfg.bindings}; site references (`parent`,
78
+ * via-tags) index the OWNING statement's `sites` array. JSON-plain; NO field
79
+ * here may be named `nodeId` (durable parsedfile-store reviver hazard — see
80
+ * {@link BindingEntry}).
81
+ */
82
+ export interface SiteRecord {
83
+ readonly kind: 'call' | 'new' | 'member-read';
84
+ /**
85
+ * Dotted callee path for call/new sites whose callee chain is rooted at an
86
+ * identifier/`this`/`super` (`child_process.exec`, `req.body.toString`).
87
+ * Optional chaining is normalized (`a?.b()` ⇒ `a.b`); string-literal
88
+ * subscripts fold into the path (`cp["exec"]` ⇒ `cp.exec`). Absent when the
89
+ * chain is not statically resolvable (dynamic key, call-rooted chain).
90
+ */
91
+ readonly callee?: string;
92
+ /**
93
+ * Binding index of the callee chain's ROOT identifier when the callee is a
94
+ * member chain (`userInput.trim()` ⇒ `userInput`). Method calls launder
95
+ * taint without it (plan KTD5 receiver-position TITO). Absent for bare
96
+ * calls (`exec(x)`) and non-identifier roots.
97
+ */
98
+ readonly receiver?: number;
99
+ /**
100
+ * Per-argument-position occurrence entries (trailing empty positions are
101
+ * trimmed; absent when no argument carries a binding occurrence). For
102
+ * `template: true` sites every substitution occurrence aggregates at
103
+ * position 0 (tagged templates have no positional argument list).
104
+ */
105
+ readonly args?: ReadonlyArray<readonly SiteArgOccurrence[]>;
106
+ /**
107
+ * Bindings defined by a declarator/assignment whose ENTIRE value (after
108
+ * unwrapping parens/`await`/`as`/`!`) is this call — `const b = escape(t)`
109
+ * ⇒ `[b]`. Per-declarator: `const a = t, b = escape(t)` attaches `[b]`
110
+ * only. Kill placement (KTD4b) keys on this: a sanitizer kills exactly the
111
+ * defs that receive its result directly.
112
+ */
113
+ readonly resultDefs?: readonly number[];
114
+ /**
115
+ * `[siteIdx, argIdx]` of the innermost enclosing call/new site argument
116
+ * position this site occurs in (`exec(escape(x))` ⇒ escape's parent is
117
+ * `[execSiteIdx, 0]`). Absent for top-level sites.
118
+ */
119
+ readonly parent?: readonly [number, number];
120
+ /**
121
+ * Index of the FIRST spread argument (`exec(...args)` ⇒ 0). Presence means
122
+ * position matching must degrade soundly (any sink position ≥ this index —
123
+ * plan KTD2/U2). A number (not boolean) because the matcher needs the index.
124
+ */
125
+ readonly spread?: number;
126
+ /** Tagged-template call (`sql\`…${id}\``) — argument positions are not positional. */
127
+ readonly template?: boolean;
128
+ /**
129
+ * String-literal first argument when the callee is bare `require` —
130
+ * CommonJS aliases resolve like ESM imports on the main thread (KTD7).
131
+ */
132
+ readonly requireArg?: string;
133
+ /** Member read: binding index of the object root (`req.body` ⇒ `req`). */
134
+ readonly object?: number;
135
+ /**
136
+ * Member read: property name (`req.body` ⇒ `'body'`; `req["body"]`
137
+ * included; dynamic `req[key]` is never recorded — documented KTD10 FN).
138
+ */
139
+ readonly property?: string;
140
+ /**
141
+ * Call-site anchor source position `[line (1-based), column (0-based)]` for
142
+ * call/new sites only — member-read sites omit it (the resolved-id join only
143
+ * consumes call/new). Recorded by the harvester at the call/new node where it
144
+ * reads the callee, so the later resolved-callee-id join inherits this
145
+ * harvester's exact (nested-function-excluded — see line 150) site
146
+ * partitioning (#2227 follow-up plan KTD1).
147
+ *
148
+ * ANCHOR ALIGNMENT (plan KTD7 — load-bearing): this MUST be the SAME position
149
+ * the CALLS-edge resolution keys its `atRange` on, because a downstream unit
150
+ * joins the two by EXACT position. That anchor is the WHOLE call/new
151
+ * expression node's start — `nodeToCapture('@reference.call.*', node)` in the
152
+ * scope-extractor anchors `@reference.call.free/.member/.constructor` on the
153
+ * `call_expression`/`new_expression` (TS) / `method_invocation`/
154
+ * `object_creation_expression` (Java) node itself (the callee identifier /
155
+ * member property is the `@reference.name` SUB-tag, never the anchor — see
156
+ * `anchorCaptureFor` + `KNOWN_SUB_TAGS` in scope-extractor.ts, and
157
+ * `atRange: anchor.range` at scope-extractor.ts:1030). So for a bare call
158
+ * `foo(x)`, a member call `arr.map(x)`, and a namespaced/chained call
159
+ * `a.b.c(x)` alike, `at` is the start of the enclosing call/new expression
160
+ * node — the harvester's `visitCall`/`visitNew` receives exactly that node and
161
+ * records `[node.startPosition.row + 1, node.startPosition.column]`. (For a
162
+ * member call the call expression starts at the receiver, e.g. `arr` in
163
+ * `arr.map(x)`, and the CALLS anchor starts there too — they match.)
164
+ *
165
+ * Omit-when-absent (pre-upgrade durable channels stay valid; JSON-plain; NOT
166
+ * named `nodeId` per the reviver hazard above).
167
+ */
168
+ readonly at?: readonly [number, number];
169
+ }
170
+ /**
171
+ * Def/use facts for one harvested statement (or construct header), in
172
+ * execution order within its block (#2082 M2 U1). `defs`/`uses` are indices
173
+ * into {@link FunctionCfg.bindings}. A compound assignment / update expression
174
+ * lists its binding in BOTH. Self-describing — `line` is carried here, never
175
+ * inferred from the block's text fragments (facts-only records exist, e.g.
176
+ * params on ENTRY and catch params).
177
+ *
178
+ * `mayDefs` (tri-review P1): defs harvested inside CONDITIONALLY-EVALUATED
179
+ * subexpressions — short-circuit right operands (`a && (x = v)`,
180
+ * `c ?? (c = load())`), ternary arms, logical-assignment operators, and
181
+ * switch case-test expressions. The solver treats them as GEN WITHOUT KILL:
182
+ * treating them as must-defs would falsely kill the prior def on the
183
+ * not-taken path (a taint false negative on core JS idioms). Optional —
184
+ * absent means none.
185
+ *
186
+ * `sites` (#2083 M3 U1): call/member-read structure for the taint pass —
187
+ * see {@link SiteRecord}. Optional and omit-when-empty; absent on pre-M3
188
+ * channels and on statements with no calls or member reads. Sites inside
189
+ * nested functions are NOT recorded (consistent with def/use invisibility —
190
+ * the enclosing `arr.forEach(...)` call IS, with receiver `arr`).
191
+ */
192
+ export interface StatementFacts {
193
+ readonly line: number;
194
+ readonly defs: readonly number[];
195
+ readonly uses: readonly number[];
196
+ readonly mayDefs?: readonly number[];
197
+ readonly sites?: readonly SiteRecord[];
198
+ }
199
+ /** A basic block: a maximal straight-line run of statements between leaders. */
200
+ export interface BasicBlockData {
201
+ /** Block index within its function. The synthetic ENTRY is always 0. */
202
+ readonly index: number;
203
+ readonly startLine: number;
204
+ readonly endLine: number;
205
+ /** Source snippet for the block (empty for synthetic ENTRY/EXIT). */
206
+ readonly text: string;
207
+ readonly kind: 'entry' | 'exit' | 'normal';
208
+ /**
209
+ * Per-statement def/use facts in execution order (#2082 M2 U1). Present only
210
+ * when the producing visitor harvests (TS/JS under `--pdg`); absent on
211
+ * hand-built or pre-M2 CFGs — the reaching-defs solver reports `no-facts`.
212
+ */
213
+ readonly statements?: readonly StatementFacts[];
214
+ }
215
+ /**
216
+ * Why one block flows to another — drives the `reason` on the emitted CFG edge.
217
+ *
218
+ * Kind invariant (M2): a bare jump kind (`return`/`break`/`continue`) means the
219
+ * SOURCE block's terminator is that jump statement. A `finally-*` kind marks a
220
+ * COMPLETION edge out of a `finally` body's exit — the leg that resumes a jump
221
+ * which was re-routed through the finally (issue #2082 U2). Reusing the bare
222
+ * kinds on completion edges would silently break consumers that infer the
223
+ * source block's terminator from the kind, and a single generic kind would lose
224
+ * WHICH jump each completion edge completes when a shared finally has several
225
+ * pending targets.
226
+ */
227
+ export type CfgEdgeKind = 'seq' | 'cond-true' | 'cond-false' | 'loop-back' | 'break' | 'continue' | 'return' | 'throw' | 'switch-case' | 'fallthrough' | 'finally-return' | 'finally-break' | 'finally-continue';
228
+ export interface CfgEdgeData {
229
+ readonly from: number;
230
+ readonly to: number;
231
+ readonly kind: CfgEdgeKind;
232
+ }
233
+ /** One function's control-flow graph. `cfgSideChannel` is `readonly FunctionCfg[]`. */
234
+ export interface FunctionCfg {
235
+ readonly filePath: string;
236
+ /** Source span of the owning function — anchors the BasicBlock node ids. */
237
+ readonly functionStartLine: number;
238
+ readonly functionEndLine: number;
239
+ /**
240
+ * Start COLUMN of the owning function. Combined with `functionStartLine` it
241
+ * disambiguates the BasicBlock node ids when two functions share a start line
242
+ * — e.g. `{ a: () => x(), b: () => y() }`, where both arrows begin on the same
243
+ * line and each restarts its block indices at 0. Without the column the ids
244
+ * collide and the graph's first-writer-wins `addNode` silently drops the
245
+ * second function's blocks and cross-wires its edges.
246
+ */
247
+ readonly functionStartColumn: number;
248
+ readonly entryIndex: number;
249
+ readonly exitIndex: number;
250
+ readonly blocks: readonly BasicBlockData[];
251
+ readonly edges: readonly CfgEdgeData[];
252
+ /**
253
+ * The function's binding table (#2082 M2 U1) — referenced by index from
254
+ * {@link BasicBlockData.statements}. Present iff statement facts are.
255
+ */
256
+ readonly bindings?: readonly BindingEntry[];
257
+ }
258
+ /**
259
+ * Per-language CFG strategy. Invoked **in the parse worker** for each function
260
+ * node. `TNode` is the language's AST node type (tree-sitter `SyntaxNode` for
261
+ * TS/JS) — kept generic so this module stays AST-library-agnostic. Returns
262
+ * `undefined` when the node is not a CFG-bearing function (the caller skips it).
263
+ */
264
+ export interface CfgVisitor<TNode = unknown> {
265
+ buildFunctionCfg(fnNode: TNode, filePath: string): FunctionCfg | undefined;
266
+ /**
267
+ * Whether `node` is a CFG-bearing function this visitor handles. Lets the
268
+ * worker enumerate functions (and apply the per-function line budget) by a
269
+ * cheap node-type test, instead of attempting to build a CFG for every AST
270
+ * node. `buildFunctionCfg` still re-checks, so this is purely an optimization
271
+ * + the seam the line-budget hooks into.
272
+ */
273
+ isFunction(node: TNode): boolean;
274
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CFG data model — plain, JSON-serializable types (issue #2081, M1).
3
+ *
4
+ * These cross the worker→main boundary and the disk-backed/durable ParsedFile
5
+ * store, so they must contain NO tree-sitter AST references, class instances,
6
+ * or anything that does not survive `JSON.stringify` → `JSON.parse`. Block and
7
+ * edge endpoints are referenced by integer index within a function's CFG.
8
+ *
9
+ * The per-language `CfgVisitor` (built in the parse worker, where the AST
10
+ * lives — see the M1 plan KTD1/KTD7) produces a `FunctionCfg` per function; the
11
+ * array of them is what rides on `ParsedFile.cfgSideChannel`.
12
+ */
13
+ export {};
@@ -0,0 +1,111 @@
1
+ /**
2
+ * C / C++ def/use harvester (#2195 U2, plan KTD2) — the C-family analogue of
3
+ * {@link import('./typescript-harvest.js').TsHarvester}.
4
+ *
5
+ * Runs in the parse worker next to the C/C++ CFG visitor, extracting
6
+ * per-statement variable definition/use facts that ride the side channel for
7
+ * the reaching-defs / CDG solvers. Output is the per-function binding table
8
+ * ({@link BindingEntry}[]) plus {@link StatementFacts} the visitor attaches to
9
+ * blocks as it walks. One class serves both languages: the control-flow node
10
+ * set is identical (grammar-introspection probe confirmed — see U2 report),
11
+ * and the harvest's def/use node taxonomy (`declaration`/`init_declarator`/
12
+ * `assignment_expression`/`update_expression`/`parameter_declaration`) is shared
13
+ * too; C++-only `lambda_expression` is handled exactly like a nested function
14
+ * (opaque), so no language naming or branching is needed.
15
+ *
16
+ * TWO-PHASE, ORDER-INDEPENDENT (load-bearing — mirrors the TS harvester): the
17
+ * CFG walk is NOT source-order (`visitFor` builds the init block after the body,
18
+ * `visitDoWhile` the condition before the body), so resolving names against a
19
+ * scope stack populated *during* the walk would mis-resolve. Phase 1 pre-scans
20
+ * the whole function subtree once into a completed lexical scope tree; phase 2
21
+ * resolves defs/uses against that finished tree from any walk order.
22
+ *
23
+ * v1 def-semantics scope:
24
+ * - `declaration` → `init_declarator` (an initialized local is a def; a bare
25
+ * `int x;` with no initializer writes nothing at runtime — not a def, like
26
+ * the TS bare-`var` rule).
27
+ * - `assignment_expression` (plain + compound `+=` etc.), `update_expression`
28
+ * (`x++`/`--x`) — define and (for compound/update) also use the lvalue.
29
+ * - parameters (`parameter_declaration` declarator chain).
30
+ * EXCLUDED, deliberately (TypeScript-CFA precedent): member / pointer / array
31
+ * writes (`obj.f = …`, `*p = …`, `a[i] = …`) are NOT scalar defs — their
32
+ * identifiers are uses only. Both directions of nested-function (C++ lambda)
33
+ * capture are invisible (the lambda body is an opaque block in the enclosing
34
+ * CFG, exactly as TS treats arrow/function bodies).
35
+ *
36
+ * MAY-DEFS: a def inside a conditionally-evaluated subexpression — the right
37
+ * operand of `&&`/`||` (`if (a && (x = f()))`), a ternary arm, or a switch
38
+ * case-test — is a may-def (gen without kill), so the not-taken path's prior
39
+ * def is not falsely killed.
40
+ *
41
+ * Identifiers with no in-function declaration (globals, macros, params of an
42
+ * enclosing scope) resolve to a SYNTHETIC module-level binding (`name@module`),
43
+ * applied identically by def and use harvesting.
44
+ *
45
+ * RAII NOTE: C++ destructors that run at scope exit are NOT represented in the
46
+ * tree-sitter AST (they are implicit), so this harvest cannot and does not model
47
+ * destructor side effects — documented gap, see the visitor doc-comment.
48
+ *
49
+ * NOTE: nothing serialized here may carry a field named `nodeId` — the durable
50
+ * parsedfile-store reviver dedups objects keyed on that field name.
51
+ */
52
+ import type { SyntaxNode } from '../../utils/ast-helpers.js';
53
+ import type { StatementFacts } from '../types.js';
54
+ import { ScopeTreeHarvester, type Scope } from './scope-tree-harvest.js';
55
+ export declare class CCppHarvester extends ScopeTreeHarvester {
56
+ constructor(fnNode: SyntaxNode);
57
+ /** The function/lambda body block (`compound_statement`). */
58
+ private bodyOf;
59
+ /** The bare identifier a declarator chain ultimately names (or undefined). */
60
+ private declaratorName;
61
+ private declareParams;
62
+ private findFunctionDeclarator;
63
+ protected prescan(node: SyntaxNode, scope: Scope): void;
64
+ /**
65
+ * The `structured_binding_declarator` a declarator binds (C++17 `auto [a,b]`,
66
+ * or `auto& [a,b]` whose binding sits under a `reference_declarator`), or
67
+ * undefined. C has no structured bindings, so this is inert for C.
68
+ */
69
+ private structuredBinding;
70
+ /** The identifier leaves a `structured_binding_declarator` binds (`[a, b]`). */
71
+ private structuredBindingNames;
72
+ private declareDeclarators;
73
+ /** Def/use facts for one statement (or construct-header expression) node. */
74
+ facts(node: SyntaxNode): StatementFacts;
75
+ /** Facts for an expression whose WHOLE evaluation is conditional (case tests). */
76
+ factsConditional(node: SyntaxNode): StatementFacts;
77
+ /** Facts for a `for (decl : right)` range head: decl binds, right is used. */
78
+ forRangeHeadFacts(stmt: SyntaxNode): StatementFacts;
79
+ /** ENTRY-block facts for the function's parameters (defs only). */
80
+ paramFacts(): StatementFacts | undefined;
81
+ /** Def fact for a `catch (T& e)` parameter — prepend to the handler entry block. */
82
+ catchParamFacts(catchClause: SyntaxNode): StatementFacts | undefined;
83
+ /** Strip parenthesized wrappers around an lvalue (`(x) = 1`). */
84
+ private unwrapLvalue;
85
+ /** Value-position walk: collect uses; route def positions to the lvalue handler. */
86
+ private walkValue;
87
+ /**
88
+ * When `value`'s root (after stripping parens) is a call/new node, remember
89
+ * that its site should carry `resultDefs: defs` — consumed by
90
+ * {@link visitCall} once the value walk reaches the node.
91
+ */
92
+ private registerResultDefs;
93
+ /**
94
+ * Explicit call/new handler: records a call site (callee path, receiver,
95
+ * per-arg occurrence entries, result defs) while reproducing EXACTLY the uses
96
+ * the old default descent recorded — callee chain root + arguments. `new`
97
+ * sites read the `type` field as the callee; `call` sites the `function`
98
+ * field.
99
+ */
100
+ private visitCall;
101
+ /**
102
+ * Member chain walk shared by value position and callee position. Use-
103
+ * recording is identical to the old default descent (chain-root identifier
104
+ * once). Member-read sites: at most ONE per chain — the INNERMOST access —
105
+ * and only when the chain root is an identifier; `skipFinalRead` suppresses it
106
+ * when that access is the callee (carried by the dotted path instead).
107
+ */
108
+ private walkChain;
109
+ /** Dotted path of a `ns::a::b` qualified_identifier (`::` folded to `.`). */
110
+ private qualifiedPath;
111
+ }