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,621 @@
1
+ import { CallSiteFactAccumulator, finalizeChain } from './call-site-harvest.js';
2
+ import { ScopeTreeHarvester } from './scope-tree-harvest.js';
3
+ /** Node types that own a nested CFG — their subtrees are opaque to harvesting. */
4
+ const NESTED_FUNCTION_TYPES = new Set([
5
+ 'func_literal',
6
+ 'function_declaration',
7
+ 'method_declaration',
8
+ ]);
9
+ /**
10
+ * Nodes that open a lexical scope for block-local declarations. A `block` is one
11
+ * scope; the loop / branch constructs open a scope for their init / loop var; a
12
+ * switch/select case scopes its case-local declarations.
13
+ */
14
+ const SCOPE_TYPES = new Set([
15
+ 'block',
16
+ 'for_statement',
17
+ 'if_statement',
18
+ 'expression_switch_statement',
19
+ 'type_switch_statement',
20
+ 'select_statement',
21
+ 'expression_case',
22
+ 'type_case',
23
+ 'default_case',
24
+ 'communication_case',
25
+ ]);
26
+ export class GoHarvester extends ScopeTreeHarvester {
27
+ constructor(fnNode) {
28
+ super(fnNode);
29
+ this.declareReceiver(fnNode);
30
+ this.declareParams(fnNode);
31
+ const body = this.bodyOf(fnNode);
32
+ if (body && body.type === 'block')
33
+ this.prescan(body, this.openScope(body));
34
+ }
35
+ /** The function/method/literal body node (always a `block` in Go). */
36
+ bodyOf(fnNode) {
37
+ return fnNode.childForFieldName('body') ?? undefined;
38
+ }
39
+ // ── phase 1: declaration pre-scan ────────────────────────────────────────
40
+ /** Go override: `_` is the blank identifier and binds nothing. */
41
+ declare(nameNode, kind, scope) {
42
+ const name = nameNode.text;
43
+ if (!name || name === '_' || scope.table.has(name))
44
+ return; // `_` is the blank identifier
45
+ scope.table.set(name, this.bindings.length);
46
+ this.bindings.push({
47
+ name,
48
+ declLine: nameNode.startPosition.row + 1,
49
+ declColumn: nameNode.startPosition.column,
50
+ kind,
51
+ });
52
+ }
53
+ /** Method receiver: `func (r *T) M()` — `r` binds at function scope. */
54
+ declareReceiver(fnNode) {
55
+ const recv = fnNode.childForFieldName('receiver');
56
+ if (!recv)
57
+ return;
58
+ for (let i = 0; i < recv.namedChildCount; i++) {
59
+ const p = recv.namedChild(i);
60
+ if (p?.type !== 'parameter_declaration')
61
+ continue;
62
+ const name = p.childForFieldName('name');
63
+ if (name)
64
+ this.declare(name, 'param', this.root);
65
+ }
66
+ }
67
+ declareParams(fnNode) {
68
+ const params = fnNode.childForFieldName('parameters');
69
+ if (!params)
70
+ return;
71
+ for (let i = 0; i < params.namedChildCount; i++) {
72
+ const p = params.namedChild(i);
73
+ if (p?.type !== 'parameter_declaration' && p?.type !== 'variadic_parameter_declaration') {
74
+ continue;
75
+ }
76
+ // A single `parameter_declaration` can name several params: `a, b int`.
77
+ for (let j = 0; j < p.namedChildCount; j++) {
78
+ const c = p.namedChild(j);
79
+ if (c?.type === 'identifier')
80
+ this.declare(c, 'param', this.root);
81
+ }
82
+ }
83
+ }
84
+ prescan(node, scope) {
85
+ this.nearestScopeCache.set(node.id, scope);
86
+ const t = node.type;
87
+ if (NESTED_FUNCTION_TYPES.has(t) && node.id !== this.fnId) {
88
+ // A nested function literal is opaque — do not descend.
89
+ return;
90
+ }
91
+ let childScope = scope;
92
+ if (SCOPE_TYPES.has(t))
93
+ childScope = this.openScope(node);
94
+ switch (t) {
95
+ case 'short_var_declaration': {
96
+ // `a, b := …` — every identifier on the left is a fresh binding.
97
+ const left = node.childForFieldName('left');
98
+ if (left)
99
+ this.declareIdentifiers(left, childScope);
100
+ break;
101
+ }
102
+ case 'var_declaration':
103
+ this.declareVarDeclaration(node, childScope);
104
+ break;
105
+ case 'range_clause': {
106
+ // `for k, v := range xs` — the `:=` form binds the loop vars; the `=`
107
+ // reassign form references existing names (not declared here).
108
+ if (this.rangeIsShort(node)) {
109
+ const left = node.childForFieldName('left');
110
+ if (left)
111
+ this.declareIdentifiers(left, childScope);
112
+ }
113
+ break;
114
+ }
115
+ case 'type_switch_statement': {
116
+ // `switch t := i.(type)` — `t` binds once for the whole switch (the
117
+ // per-case narrowed `t` shares the name).
118
+ const alias = node.childForFieldName('alias');
119
+ if (alias)
120
+ this.declareIdentifiers(alias, childScope);
121
+ break;
122
+ }
123
+ case 'receive_statement': {
124
+ // `case v := <-ch` inside a select — the `:=` form binds `v`.
125
+ if (this.receiveIsShort(node)) {
126
+ const left = node.childForFieldName('left');
127
+ if (left)
128
+ this.declareIdentifiers(left, childScope);
129
+ }
130
+ break;
131
+ }
132
+ default:
133
+ break;
134
+ }
135
+ for (let i = 0; i < node.namedChildCount; i++) {
136
+ const c = node.namedChild(i);
137
+ if (c)
138
+ this.prescan(c, childScope);
139
+ }
140
+ }
141
+ /** Declare every identifier child of an `expression_list` (LHS of `:=`). */
142
+ declareIdentifiers(list, scope) {
143
+ for (let i = 0; i < list.namedChildCount; i++) {
144
+ const c = list.namedChild(i);
145
+ if (c?.type === 'identifier')
146
+ this.declare(c, 'var', scope);
147
+ }
148
+ }
149
+ /** Declare names of an INITIALIZED `var_spec` (a bare `var x int` writes nothing). */
150
+ declareVarDeclaration(declNode, scope) {
151
+ const specs = this.varSpecs(declNode);
152
+ for (const spec of specs) {
153
+ const hasValue = spec.childForFieldName('value') !== null;
154
+ if (!hasValue)
155
+ continue; // bare `var x int` — not a runtime write
156
+ for (let i = 0; i < spec.namedChildCount; i++) {
157
+ const c = spec.namedChild(i);
158
+ if (c?.type === 'identifier')
159
+ this.declare(c, 'var', scope);
160
+ }
161
+ }
162
+ }
163
+ /** The `var_spec` nodes of a `var_declaration` (single or `var ( … )` block). */
164
+ varSpecs(declNode) {
165
+ const out = [];
166
+ for (let i = 0; i < declNode.namedChildCount; i++) {
167
+ const c = declNode.namedChild(i);
168
+ if (!c)
169
+ continue;
170
+ if (c.type === 'var_spec')
171
+ out.push(c);
172
+ else if (c.type === 'var_spec_list') {
173
+ for (let j = 0; j < c.namedChildCount; j++) {
174
+ const s = c.namedChild(j);
175
+ if (s?.type === 'var_spec')
176
+ out.push(s);
177
+ }
178
+ }
179
+ }
180
+ return out;
181
+ }
182
+ /** A `range_clause` is the `:=` short form iff it has no `=` operator token. */
183
+ rangeIsShort(node) {
184
+ return this.hasAnonChild(node, ':=');
185
+ }
186
+ /** A `receive_statement` (`case v := <-ch`) is the `:=` short form. */
187
+ receiveIsShort(node) {
188
+ return this.hasAnonChild(node, ':=');
189
+ }
190
+ hasAnonChild(node, text) {
191
+ for (let i = 0; i < node.childCount; i++) {
192
+ const c = node.child(i);
193
+ if (c && !c.isNamed && c.text === text)
194
+ return true;
195
+ }
196
+ return false;
197
+ }
198
+ // ── phase 2: per-statement fact extraction ───────────────────────────────
199
+ /** Def/use facts for one statement (or construct-header expression) node. */
200
+ facts(node) {
201
+ const acc = new FactAccumulator(node.startPosition.row + 1);
202
+ this.walkValue(node, acc);
203
+ return acc.finish();
204
+ }
205
+ /** Facts for an expression whose WHOLE evaluation is conditional (case tests). */
206
+ factsConditional(node) {
207
+ const acc = new FactAccumulator(node.startPosition.row + 1);
208
+ this.conditional(() => this.walkValue(node, acc));
209
+ return acc.finish();
210
+ }
211
+ /**
212
+ * Facts for a `for … range right` head: the `:=` loop vars are defs (the `=`
213
+ * reassign form's vars are also written), and `right` is used.
214
+ */
215
+ rangeHeadFacts(rangeClause) {
216
+ const acc = new FactAccumulator(rangeClause.startPosition.row + 1);
217
+ const left = rangeClause.childForFieldName('left');
218
+ const right = rangeClause.childForFieldName('right');
219
+ if (left) {
220
+ for (let i = 0; i < left.namedChildCount; i++) {
221
+ const c = left.namedChild(i);
222
+ if (c?.type === 'identifier')
223
+ this.def(c, acc);
224
+ else if (c)
225
+ this.walkValue(c, acc);
226
+ }
227
+ }
228
+ if (right)
229
+ this.walkValue(right, acc);
230
+ return acc.finish();
231
+ }
232
+ /**
233
+ * Facts for a `switch t := i.(type)` head: `t` binds (a def) and the inspected
234
+ * value is used.
235
+ */
236
+ typeSwitchHeadFacts(stmt) {
237
+ const acc = new FactAccumulator(stmt.startPosition.row + 1);
238
+ const alias = stmt.childForFieldName('alias');
239
+ const value = stmt.childForFieldName('value');
240
+ if (alias) {
241
+ for (let i = 0; i < alias.namedChildCount; i++) {
242
+ const c = alias.namedChild(i);
243
+ if (c?.type === 'identifier')
244
+ this.def(c, acc);
245
+ }
246
+ }
247
+ if (value)
248
+ this.walkValue(value, acc);
249
+ return acc.finish();
250
+ }
251
+ /** ENTRY-block facts for the receiver + parameters (defs only). */
252
+ paramFacts() {
253
+ const acc = new FactAccumulator(this.fnNode.startPosition.row + 1);
254
+ const recv = this.fnNode.childForFieldName('receiver');
255
+ if (recv) {
256
+ for (let i = 0; i < recv.namedChildCount; i++) {
257
+ const p = recv.namedChild(i);
258
+ if (p?.type !== 'parameter_declaration')
259
+ continue;
260
+ const name = p.childForFieldName('name');
261
+ if (name)
262
+ this.def(name, acc);
263
+ }
264
+ }
265
+ const params = this.fnNode.childForFieldName('parameters');
266
+ if (params) {
267
+ for (let i = 0; i < params.namedChildCount; i++) {
268
+ const p = params.namedChild(i);
269
+ if (p?.type !== 'parameter_declaration' && p?.type !== 'variadic_parameter_declaration') {
270
+ continue;
271
+ }
272
+ for (let j = 0; j < p.namedChildCount; j++) {
273
+ const c = p.namedChild(j);
274
+ if (c?.type === 'identifier')
275
+ this.def(c, acc);
276
+ }
277
+ }
278
+ }
279
+ return acc.defCount() ? acc.finish() : undefined;
280
+ }
281
+ /** Go override: the blank identifier (`_`) defines nothing. */
282
+ def(nameNode, acc) {
283
+ if (nameNode.text === '_')
284
+ return; // blank identifier defines nothing
285
+ if (this.conditionalDepth > 0)
286
+ acc.addMayDef(this.resolve(nameNode));
287
+ else
288
+ acc.addDef(this.resolve(nameNode));
289
+ }
290
+ /** Go override: the blank identifier (`_`) is read of nothing. */
291
+ use(nameNode, acc) {
292
+ if (nameNode.text === '_')
293
+ return;
294
+ acc.addUse(this.resolve(nameNode));
295
+ }
296
+ /** Strip parenthesized wrappers around an lvalue (`(x) = 1`). */
297
+ unwrapLvalue(node) {
298
+ let n = node;
299
+ let hops = 8;
300
+ while (n.type === 'parenthesized_expression' && hops-- > 0) {
301
+ const inner = n.namedChild(0);
302
+ if (!inner)
303
+ break;
304
+ n = inner;
305
+ }
306
+ return n;
307
+ }
308
+ /** Def each identifier of an LHS `expression_list`; route non-identifiers to uses. */
309
+ defLeftList(list, acc, alsoUse) {
310
+ for (let i = 0; i < list.namedChildCount; i++) {
311
+ const c = list.namedChild(i);
312
+ if (!c)
313
+ continue;
314
+ const lv = this.unwrapLvalue(c);
315
+ if (lv.type === 'identifier') {
316
+ this.def(lv, acc);
317
+ if (alsoUse)
318
+ this.use(lv, acc); // compound assign (`+=`) reads too
319
+ }
320
+ else {
321
+ // selector / index / pointer-deref target — uses only (root identifier).
322
+ this.walkValue(lv, acc);
323
+ }
324
+ }
325
+ }
326
+ /** Value-position walk: collect uses; route def positions to the lvalue handler. */
327
+ walkValue(node, acc) {
328
+ const t = node.type;
329
+ if (NESTED_FUNCTION_TYPES.has(t) && node.id !== this.fnId) {
330
+ // Opaque nested function literal — captured reads/writes are invisible.
331
+ return;
332
+ }
333
+ switch (t) {
334
+ case 'identifier':
335
+ this.use(node, acc);
336
+ return;
337
+ case 'short_var_declaration': {
338
+ const left = node.childForFieldName('left');
339
+ const right = node.childForFieldName('right');
340
+ // Register result-defs BEFORE walking the value so the nested call site
341
+ // (reached during the value walk) carries them — single-target only
342
+ // (`x := f(a)`; a multi-target `a, b := f()` attaches nothing).
343
+ if (left && right)
344
+ this.registerListResultDefs(left, right);
345
+ if (right)
346
+ this.walkValue(right, acc);
347
+ if (left) {
348
+ for (let i = 0; i < left.namedChildCount; i++) {
349
+ const c = left.namedChild(i);
350
+ if (c?.type === 'identifier')
351
+ this.def(c, acc);
352
+ }
353
+ }
354
+ return;
355
+ }
356
+ case 'var_declaration': {
357
+ for (const spec of this.varSpecs(node)) {
358
+ const value = spec.childForFieldName('value');
359
+ if (value && this.singleSpecName(spec))
360
+ this.registerResultDefs(value, [spec]);
361
+ if (value)
362
+ this.walkValue(value, acc);
363
+ if (value) {
364
+ for (let i = 0; i < spec.namedChildCount; i++) {
365
+ const c = spec.namedChild(i);
366
+ if (c?.type === 'identifier')
367
+ this.def(c, acc);
368
+ }
369
+ }
370
+ }
371
+ return;
372
+ }
373
+ case 'assignment_statement': {
374
+ const left = node.childForFieldName('left');
375
+ const right = node.childForFieldName('right');
376
+ const op = node.childForFieldName('operator')?.text ?? '=';
377
+ // Plain `x = f(a)` attaches `resultDefs: [x]`; a compound `x += f(a)`
378
+ // does not (the prior value flows in too).
379
+ if (op === '=' && left && right)
380
+ this.registerListResultDefs(left, right);
381
+ if (right)
382
+ this.walkValue(right, acc);
383
+ if (left)
384
+ this.defLeftList(left, acc, op !== '=');
385
+ return;
386
+ }
387
+ case 'receive_statement': {
388
+ // `select { case v := <-ch: }` / `case v = <-ch:` — the left
389
+ // identifier(s) are DEFS of the channel-received value; `<-ch` (right)
390
+ // is a use of the channel. A bare `case <-ch:` has no left (uses only).
391
+ const left = node.childForFieldName('left');
392
+ const right = node.childForFieldName('right');
393
+ const isShort = node.children.some((c) => !c.isNamed && c.text === ':=');
394
+ if (isShort && left && right)
395
+ this.registerListResultDefs(left, right);
396
+ if (right)
397
+ this.walkValue(right, acc);
398
+ if (left)
399
+ this.defLeftList(left, acc, false);
400
+ return;
401
+ }
402
+ case 'inc_statement':
403
+ case 'dec_statement': {
404
+ // `x++` / `x--` — def AND use the lvalue when it's a plain identifier.
405
+ const operand = node.namedChild(0);
406
+ const lv = operand ? this.unwrapLvalue(operand) : null;
407
+ if (lv?.type === 'identifier') {
408
+ this.def(lv, acc);
409
+ this.use(lv, acc);
410
+ }
411
+ else if (operand) {
412
+ this.walkValue(operand, acc);
413
+ }
414
+ return;
415
+ }
416
+ case 'binary_expression': {
417
+ const left = node.childForFieldName('left');
418
+ const right = node.childForFieldName('right');
419
+ const op = node.childForFieldName('operator')?.text ?? '';
420
+ if (left)
421
+ this.walkValue(left, acc);
422
+ if (right) {
423
+ if (op === '&&' || op === '||')
424
+ this.conditional(() => this.walkValue(right, acc));
425
+ else
426
+ this.walkValue(right, acc);
427
+ }
428
+ return;
429
+ }
430
+ case 'call_expression':
431
+ // #2195 U6: explicit case (previously default-descended) — same uses,
432
+ // plus a taint-site record. Go has no `new` (constructor calls are plain
433
+ // `call_expression`s). Defs/uses stay byte-identical.
434
+ this.visitCall(node, acc);
435
+ return;
436
+ case 'selector_expression': {
437
+ // `a.b` — value read of the operand root only; the field name is not a
438
+ // scalar binding. Mirrors the TS member-read use semantics, plus a
439
+ // member-read site for the innermost identifier-rooted access.
440
+ this.walkChain(node, acc, false);
441
+ return;
442
+ }
443
+ default:
444
+ for (let i = 0; i < node.namedChildCount; i++) {
445
+ const c = node.namedChild(i);
446
+ if (c)
447
+ this.walkValue(c, acc);
448
+ }
449
+ }
450
+ }
451
+ // ── taint-site harvest (#2195 U6) ────────────────────────────────────────
452
+ /** The single `var_spec` name when the spec declares exactly one name, else undefined. */
453
+ singleSpecName(spec) {
454
+ const names = [];
455
+ for (let i = 0; i < spec.namedChildCount; i++) {
456
+ const c = spec.namedChild(i);
457
+ if (c?.type === 'identifier')
458
+ names.push(c);
459
+ }
460
+ return names.length === 1 ? names[0] : undefined;
461
+ }
462
+ /**
463
+ * Register result-defs for a single-target LHS `expression_list` → RHS
464
+ * `expression_list` whose sole element is a call. `a, b := f()` (multi-target)
465
+ * and `x, y := f(), g()` attach nothing — the per-target mapping is ambiguous,
466
+ * matching the TS harvester's per-declarator restriction.
467
+ */
468
+ registerListResultDefs(left, right) {
469
+ const leftNames = this.listIdentifiers(left);
470
+ const rightVals = this.listElements(right);
471
+ if (leftNames.length !== 1 || rightVals.length !== 1)
472
+ return;
473
+ this.registerResultDefs(rightVals[0], [leftNames[0]]);
474
+ }
475
+ /** Identifier elements of an `expression_list` (`a, b` ⇒ [a, b]). */
476
+ listIdentifiers(list) {
477
+ const out = [];
478
+ for (let i = 0; i < list.namedChildCount; i++) {
479
+ const c = list.namedChild(i);
480
+ if (c?.type === 'identifier')
481
+ out.push(c);
482
+ }
483
+ return out;
484
+ }
485
+ /** Named elements of an `expression_list` (or the node itself if not a list). */
486
+ listElements(list) {
487
+ if (list.type !== 'expression_list')
488
+ return [list];
489
+ const out = [];
490
+ for (let i = 0; i < list.namedChildCount; i++) {
491
+ const c = list.namedChild(i);
492
+ if (c)
493
+ out.push(c);
494
+ }
495
+ return out;
496
+ }
497
+ /**
498
+ * When `value`'s root (after stripping parens) is a call, remember its site
499
+ * should carry `resultDefs` — the binding indices of `targets` (def-position
500
+ * identifiers, resolved against the completed scope tree). Consumed by
501
+ * {@link visitCall} once the value walk reaches the node.
502
+ */
503
+ registerResultDefs(value, targets) {
504
+ const root = this.unwrapLvalue(value);
505
+ if (root.type !== 'call_expression')
506
+ return;
507
+ const defs = [];
508
+ for (const target of targets) {
509
+ // A `var_spec` carries its name(s) as children; an identifier resolves
510
+ // directly. Skip the blank identifier (`_`), which binds nothing.
511
+ const names = target.type === 'identifier' ? [target] : this.listIdentifiers(target);
512
+ for (const n of names) {
513
+ if (n.text === '_')
514
+ continue;
515
+ defs.push(this.resolve(n));
516
+ }
517
+ }
518
+ if (defs.length > 0)
519
+ this.resultDefTargets.set(root.id, defs);
520
+ }
521
+ /**
522
+ * Explicit `call_expression` handler. Records a call site (callee path,
523
+ * receiver, per-arg occurrence entries, result defs) while reproducing EXACTLY
524
+ * the uses the old default descent recorded (callee chain root + arguments).
525
+ */
526
+ visitCall(node, acc) {
527
+ const calleeNode = node.childForFieldName('function');
528
+ const argsNode = node.childForFieldName('arguments');
529
+ // `node` IS the call_expression — the SAME node the scope-extractor anchors
530
+ // `@reference.call.*` (its `atRange`) on (KTD7).
531
+ const siteIdx = acc.openCallSite('call', [
532
+ node.startPosition.row + 1,
533
+ node.startPosition.column,
534
+ ]);
535
+ acc.pushFrame(siteIdx);
536
+ let calleePath;
537
+ if (calleeNode) {
538
+ const callee = this.unwrapLvalue(calleeNode);
539
+ if (callee.type === 'identifier') {
540
+ if (callee.text !== '_')
541
+ acc.addUseWithoutOccurrence(this.resolve(callee));
542
+ calleePath = callee.text;
543
+ }
544
+ else if (callee.type === 'selector_expression') {
545
+ // skipFinalRead: the final `.field` IS the callee, carried by the path.
546
+ const chain = this.walkChain(callee, acc, true);
547
+ calleePath = chain.path;
548
+ if (chain.rootIdx !== undefined)
549
+ acc.setSiteReceiver(siteIdx, chain.rootIdx);
550
+ }
551
+ else {
552
+ // Call-rooted chains, conversions (`T(x)`), parenthesized funcs — the
553
+ // walk still records uses and nested sites.
554
+ this.walkValue(callee, acc);
555
+ }
556
+ if (calleePath !== undefined)
557
+ acc.setSiteCallee(siteIdx, calleePath);
558
+ }
559
+ const resultDefs = this.resultDefTargets.get(node.id);
560
+ if (resultDefs !== undefined)
561
+ acc.setSiteResultDefs(siteIdx, resultDefs);
562
+ if (argsNode) {
563
+ let pos = 0;
564
+ for (let i = 0; i < argsNode.namedChildCount; i++) {
565
+ const arg = argsNode.namedChild(i);
566
+ if (!arg || arg.type === 'comment')
567
+ continue;
568
+ // `f(xs...)` — a variadic spread. Mark the first spread position so the
569
+ // matcher degrades soundly; the inner value still walks for occurrences.
570
+ if (arg.type === 'variadic_argument') {
571
+ acc.setFrameArg(pos);
572
+ acc.setSiteSpread(siteIdx, pos);
573
+ const inner = arg.namedChild(0);
574
+ if (inner)
575
+ this.walkValue(inner, acc);
576
+ }
577
+ else {
578
+ acc.setFrameArg(pos);
579
+ this.walkValue(arg, acc);
580
+ }
581
+ pos++;
582
+ }
583
+ }
584
+ acc.popFrame();
585
+ }
586
+ /**
587
+ * `selector_expression` chain walk shared by value position and callee
588
+ * position. Records the chain-root identifier as a use (identical to the old
589
+ * default descent) plus at most ONE member-read site — the INNERMOST access —
590
+ * when the root is an identifier; `skipFinalRead` suppresses it when that
591
+ * access is the callee (carried by the dotted path instead).
592
+ */
593
+ walkChain(node, acc, skipFinalRead) {
594
+ const accesses = [];
595
+ let cur = this.unwrapLvalue(node);
596
+ for (;;) {
597
+ if (cur.type === 'selector_expression') {
598
+ const field = cur.childForFieldName('field');
599
+ accesses.unshift(field?.text ?? '');
600
+ const operand = cur.childForFieldName('operand');
601
+ if (!operand)
602
+ break;
603
+ cur = this.unwrapLvalue(operand);
604
+ }
605
+ else {
606
+ break;
607
+ }
608
+ }
609
+ // The shared terminal: root-use record + innermost member-read + path-join.
610
+ return finalizeChain(acc, cur, accesses, skipFinalRead, (t) => t === 'identifier', {
611
+ resolve: (n) => this.resolve(n),
612
+ walkRoot: (n) => this.walkValue(n, acc),
613
+ });
614
+ }
615
+ }
616
+ /**
617
+ * Ordered, deduplicating def/use + call-site collector for one statement record.
618
+ * The shared {@link CallSiteFactAccumulator} carries the def/use machinery the
619
+ * old local class had, plus the taint-site harvest (#2195 U6).
620
+ */
621
+ const FactAccumulator = CallSiteFactAccumulator;