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
@@ -9,6 +9,7 @@ import { emitPhpScopeCaptures, interpretPhpImport, interpretPhpTypeBinding, phpA
9
9
  import { SupportedLanguages } from '../../../_shared/index.js';
10
10
  import { createClassExtractor } from '../class-extractors/generic.js';
11
11
  import { phpClassConfig } from '../class-extractors/configs/php.js';
12
+ import { createPhpCfgVisitor } from '../cfg/visitors/php.js';
12
13
  import { defineLanguage } from '../language-provider.js';
13
14
  import { typeConfig as phpConfig } from '../type-extractors/php.js';
14
15
  import { phpExportChecker } from '../export-detection.js';
@@ -271,6 +272,7 @@ export const phpProvider = defineLanguage({
271
272
  builtInNames: BUILT_INS,
272
273
  // ── RFC #909 Ring 3: scope-based resolution hooks ──────────────────────
273
274
  emitScopeCaptures: emitPhpScopeCaptures,
275
+ cfgVisitor: createPhpCfgVisitor(),
274
276
  interpretImport: interpretPhpImport,
275
277
  interpretTypeBinding: interpretPhpTypeBinding,
276
278
  // LanguageProvider uses (def, callsite); phpArityCompatibility uses (def, callsite) — same.
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
24
24
  import { pythonVariableConfig } from '../variable-extractors/configs/python.js';
25
25
  import { createCallExtractor } from '../call-extractors/generic.js';
26
26
  import { pythonCallConfig } from '../call-extractors/configs/python.js';
27
+ import { createPythonCfgVisitor } from '../cfg/visitors/python.js';
27
28
  import { emitPythonScopeCaptures, pythonFunctionDefinitionLabel, interpretPythonImport, interpretPythonTypeBinding, pythonArityCompatibility, pythonBindingScopeFor, pythonImportOwningScope, pythonMergeBindings, pythonReceiverBinding, resolvePythonImportTarget, } from './python/index.js';
28
29
  const BUILT_INS = new Set([
29
30
  'print',
@@ -115,6 +116,7 @@ export const pythonProvider = defineLanguage({
115
116
  // full per-hook rationale and the canonical capture vocabulary in
116
117
  // ./python/query.ts (PYTHON_SCOPE_QUERY constant).
117
118
  emitScopeCaptures: emitPythonScopeCaptures,
119
+ cfgVisitor: createPythonCfgVisitor(),
118
120
  interpretImport: interpretPythonImport,
119
121
  interpretTypeBinding: interpretPythonTypeBinding,
120
122
  bindingScopeFor: pythonBindingScopeFor,
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
24
24
  import { rubyVariableConfig } from '../variable-extractors/configs/ruby.js';
25
25
  import { createCallExtractor } from '../call-extractors/generic.js';
26
26
  import { rubyCallConfig } from '../call-extractors/configs/ruby.js';
27
+ import { createRubyCfgVisitor } from '../cfg/visitors/ruby.js';
27
28
  import { emitRubyScopeCaptures, rubyArityCompatibility, rubyBindingScopeFor, rubyImportOwningScope, rubyReceiverBinding, interpretRubyImport, interpretRubyTypeBinding, } from './ruby/index.js';
28
29
  /**
29
30
  * Ruby label override. Applied to:
@@ -186,6 +187,7 @@ export const rubyProvider = defineLanguage({
186
187
  builtInNames: BUILT_INS,
187
188
  // ── RFC #909 Ring 3: scope-based resolution hooks ──────────
188
189
  emitScopeCaptures: emitRubyScopeCaptures,
190
+ cfgVisitor: createRubyCfgVisitor(),
189
191
  interpretImport: interpretRubyImport,
190
192
  interpretTypeBinding: interpretRubyTypeBinding,
191
193
  bindingScopeFor: rubyBindingScopeFor,
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
24
24
  import { rustVariableConfig } from '../variable-extractors/configs/rust.js';
25
25
  import { createCallExtractor } from '../call-extractors/generic.js';
26
26
  import { rustCallConfig } from '../call-extractors/configs/rust.js';
27
+ import { createRustCfgVisitor } from '../cfg/visitors/rust.js';
27
28
  import { emitRustScopeCaptures, rustArityCompatibility, rustBindingScopeFor, rustImportOwningScope, rustReceiverBinding, interpretRustImport, interpretRustTypeBinding, } from './rust/index.js';
28
29
  /** Rust impl_item: find the function_item child and extract its name as a Method. */
29
30
  const rustExtractFunctionName = (node) => {
@@ -161,6 +162,7 @@ export const rustProvider = defineLanguage({
161
162
  builtInNames: BUILT_INS,
162
163
  // ── RFC #909 Ring 3: scope-based resolution hooks ──────────
163
164
  emitScopeCaptures: emitRustScopeCaptures,
165
+ cfgVisitor: createRustCfgVisitor(),
164
166
  interpretImport: interpretRustImport,
165
167
  interpretTypeBinding: interpretRustTypeBinding,
166
168
  bindingScopeFor: rustBindingScopeFor,
@@ -21,6 +21,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
21
21
  import { swiftVariableConfig } from '../variable-extractors/configs/swift.js';
22
22
  import { createCallExtractor } from '../call-extractors/generic.js';
23
23
  import { swiftCallConfig } from '../call-extractors/configs/swift.js';
24
+ import { createSwiftCfgVisitor } from '../cfg/visitors/swift.js';
24
25
  import { emitSwiftScopeCaptures, interpretSwiftImport, interpretSwiftTypeBinding, swiftBindingScopeFor, swiftImportOwningScope, swiftReceiverBinding, swiftMergeBindings, swiftArityCompatibility, } from './swift/index.js';
25
26
  /** Swift init/deinit declarations have special names and Constructor label. */
26
27
  const swiftExtractFunctionName = (node) => {
@@ -226,6 +227,7 @@ export const swiftProvider = defineLanguage({
226
227
  // ── Scope-based resolution hooks (RFC #909 Ring 3, issue #937). See
227
228
  // languages/swift/ for the implementations. ──────────────────────
228
229
  emitScopeCaptures: emitSwiftScopeCaptures,
230
+ cfgVisitor: createSwiftCfgVisitor(),
229
231
  interpretImport: interpretSwiftImport,
230
232
  interpretTypeBinding: interpretSwiftTypeBinding,
231
233
  bindingScopeFor: swiftBindingScopeFor,
@@ -9,6 +9,7 @@ import { SupportedLanguages } from '../../../_shared/index.js';
9
9
  import { defineLanguage } from '../language-provider.js';
10
10
  import { createClassExtractor } from '../class-extractors/generic.js';
11
11
  import { typescriptClassConfig, javascriptClassConfig, } from '../class-extractors/configs/typescript-javascript.js';
12
+ import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
12
13
  import { typeConfig as typescriptConfig } from '../type-extractors/typescript.js';
13
14
  import { tsExportChecker } from '../export-detection.js';
14
15
  import { createImportResolver } from '../import-resolvers/resolver-factory.js';
@@ -293,6 +294,8 @@ export const typescriptProvider = defineLanguage({
293
294
  // canonical capture vocabulary in ./typescript/query.ts
294
295
  // (TYPESCRIPT_SCOPE_QUERY constant).
295
296
  emitScopeCaptures: emitTsScopeCaptures,
297
+ // CFG/PDG substrate (#2081 M1) — runs in the worker on a --pdg run.
298
+ cfgVisitor: createTypeScriptCfgVisitor(),
296
299
  interpretImport: interpretTsImport,
297
300
  interpretTypeBinding: interpretTsTypeBinding,
298
301
  bindingScopeFor: tsBindingScopeFor,
@@ -352,6 +355,8 @@ export const javascriptProvider = defineLanguage({
352
355
  // JSDoc type bindings) live in ./javascript/captures.ts.
353
356
  // See ./javascript/index.ts for the full per-module rationale.
354
357
  emitScopeCaptures: emitJsScopeCaptures,
358
+ // CFG/PDG substrate (#2081 M1) — TS and JS share the same grammar family.
359
+ cfgVisitor: createTypeScriptCfgVisitor(),
355
360
  interpretImport: interpretJsImport,
356
361
  interpretTypeBinding: interpretJsTypeBinding,
357
362
  bindingScopeFor: jsBindingScopeFor,
@@ -27,6 +27,7 @@ import { createCallExtractor } from '../call-extractors/generic.js';
27
27
  import { typescriptCallConfig } from '../call-extractors/configs/typescript-javascript.js';
28
28
  import { interpretTsImport, interpretTsTypeBinding, tsBindingScopeFor, tsImportOwningScope, tsReceiverBinding, typescriptMergeBindings, typescriptArityCompatibility, resolveTsImportTarget, } from './typescript/index.js';
29
29
  import { emitVueScopeCaptures } from './vue/captures.js';
30
+ import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
30
31
  const VUE_SPECIFIC_BUILT_INS = [
31
32
  'ref',
32
33
  'reactive',
@@ -74,6 +75,11 @@ export const vueProvider = defineLanguage({
74
75
  variableExtractor: createVariableExtractor(typescriptVariableConfig),
75
76
  classExtractor: vueClassExtractor,
76
77
  builtInNames: VUE_BUILT_INS,
78
+ // Vue SFC <script> blocks are extracted and parsed with the TypeScript
79
+ // grammar (parse-worker GRAMMAR_BY_LANGUAGE[Vue] = TypeScript.typescript),
80
+ // so the TS CFG visitor builds CFGs for the script's functions verbatim —
81
+ // no Vue-specific visitor needed (#2195).
82
+ cfgVisitor: createTypeScriptCfgVisitor(),
77
83
  // Scope-resolution pipeline hooks (RFC #909 Ring 3)
78
84
  emitScopeCaptures: emitVueScopeCaptures,
79
85
  interpretImport: interpretTsImport,
@@ -33,18 +33,12 @@ function findFunctionDeclarator(node) {
33
33
  }
34
34
  return null;
35
35
  }
36
- /**
37
- * Detect `= delete` and `= default` special member function declarations.
38
- * These are not callable methods and should be suppressed from extraction.
39
- * tree-sitter-cpp ^0.23.4 emits `delete_method_clause` / `default_method_clause`
40
- * as named children of the function_definition node.
41
- */
42
- function isDeletedOrDefaulted(node) {
36
+ /** Detect a C++ special member clause by its tree-sitter node type. */
37
+ function hasSpecialMethodClause(node, clauseType) {
43
38
  for (let i = 0; i < node.namedChildCount; i++) {
44
39
  const child = node.namedChild(i);
45
- if (child?.type === 'delete_method_clause' || child?.type === 'default_method_clause') {
40
+ if (child?.type === clauseType)
46
41
  return true;
47
- }
48
42
  }
49
43
  return false;
50
44
  }
@@ -57,10 +51,6 @@ function extractCppMethodName(node) {
57
51
  const funcDecl = findFunctionDeclarator(node);
58
52
  if (!funcDecl)
59
53
  return undefined;
60
- // Suppress `= delete` and `= default` special members — these are not callable
61
- // methods and should not appear in HAS_METHOD edges.
62
- if (isDeletedOrDefaulted(node))
63
- return undefined;
64
54
  const nameNode = funcDecl.childForFieldName('declarator');
65
55
  if (!nameNode)
66
56
  return undefined;
@@ -360,6 +350,9 @@ export const cppMethodConfig = {
360
350
  }
361
351
  return false;
362
352
  },
353
+ isDeleted(node) {
354
+ return hasSpecialMethodClause(node, 'delete_method_clause');
355
+ },
363
356
  };
364
357
  // ---------------------------------------------------------------------------
365
358
  // C config (minimal — C has no classes/methods, only struct function pointers)
@@ -198,6 +198,7 @@ function buildMethod(node, ownerNode, context, config) {
198
198
  ...(config.isAsync?.(node) ? { isAsync: true } : {}),
199
199
  ...(config.isPartial?.(node) ? { isPartial: true } : {}),
200
200
  ...(config.isConst?.(node) ? { isConst: true } : {}),
201
+ ...(config.isDeleted?.(node) ? { isDeleted: true } : {}),
201
202
  annotations: config.extractAnnotations?.(node) ?? [],
202
203
  sourceFile: context.filePath,
203
204
  line: node.startPosition.row + 1,
@@ -27,6 +27,7 @@ export interface MethodInfo {
27
27
  isAsync?: boolean;
28
28
  isPartial?: boolean;
29
29
  isConst?: boolean;
30
+ isDeleted?: boolean;
30
31
  annotations: string[];
31
32
  sourceFile: string;
32
33
  line: number;
@@ -74,6 +75,7 @@ export interface MethodExtractionConfig {
74
75
  isAsync?: (node: SyntaxNode) => boolean;
75
76
  isPartial?: (node: SyntaxNode) => boolean;
76
77
  isConst?: (node: SyntaxNode) => boolean;
78
+ isDeleted?: (node: SyntaxNode) => boolean;
77
79
  /** Owner node types where member functions are effectively static (e.g.
78
80
  * Ruby singleton_class, Kotlin companion_object / object_declaration).
79
81
  * When the ownerNode matches one of these types, isStatic is forced true. */
@@ -102,6 +102,7 @@ export interface AddMetadata {
102
102
  templateArguments?: string[];
103
103
  ownerId?: string;
104
104
  qualifiedName?: string;
105
+ isDeleted?: boolean;
105
106
  }
106
107
  /**
107
108
  * Pure read-only view over the file and callable indexes. Does NOT
@@ -136,6 +136,7 @@ export const createSymbolTable = () => {
136
136
  ? { templateArguments: metadata.templateArguments }
137
137
  : {}),
138
138
  ...(metadata?.ownerId !== undefined ? { ownerId: metadata.ownerId } : {}),
139
+ ...(metadata?.isDeleted === true ? { isDeleted: true } : {}),
139
140
  };
140
141
  // A. File Index — unconditional.
141
142
  if (!fileIndex.has(filePath)) {
@@ -74,6 +74,9 @@ function buildAdjacency(graph) {
74
74
  }
75
75
  return { parentMap, methodMap, parentEdgeType };
76
76
  }
77
+ /** Confidence for a single-ancestor override edge (a subclass overriding one parent
78
+ * method via class inheritance) — same tier as MRO-ordered resolution. */
79
+ const SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE = 0.9;
77
80
  /** Resolve by MRO order — first ancestor in linearized order wins. */
78
81
  function resolveByMroOrder(methodName, defs, mroOrder, reasonPrefix) {
79
82
  for (const ancestorId of mroOrder) {
@@ -266,6 +269,112 @@ export function computeMRO(graph) {
266
269
  ambiguities,
267
270
  });
268
271
  }
272
+ // ── Single-ancestor override detection ──────────────────────────────────
273
+ // The collision loop above only emits when a method is defined in 2+ ancestors
274
+ // (defs.length < 2 is skipped). A subclass overriding a single parent method via
275
+ // class inheritance is the common case. Applicability is derived automatically from
276
+ // the language's existing MRO strategy — no separate per-language flag: every
277
+ // strategy resolves overrides by inheritance order EXCEPT `qualified-syntax` (Rust),
278
+ // where a same-named method is a trait implementation (METHOD_IMPLEMENTS), not an
279
+ // override. The EXTENDS-only walk below reinforces this structurally.
280
+ const emittedOverrideEdgeIds = new Set();
281
+ // Follow only EXTENDS (class-inheritance) parents and skip Interface/Trait ancestors:
282
+ // satisfying an interface/trait default method is a METHOD_IMPLEMENTS relationship
283
+ // (handled by emitMethodImplementsEdges), not an override. This also structurally
284
+ // excludes languages without class inheritance (e.g. Rust traits use IMPLEMENTS).
285
+ const extendsParentsOf = (nodeId) => (parentMap.get(nodeId) ?? []).filter((pid) => {
286
+ if (parentEdgeType.get(nodeId)?.get(pid) !== 'EXTENDS')
287
+ return false;
288
+ const pn = graph.getNode(pid);
289
+ return !!pn && pn.label !== 'Interface' && pn.label !== 'Trait';
290
+ });
291
+ for (const classId of parentMap.keys()) {
292
+ const classNode = graph.getNode(classId);
293
+ const language = classNode?.properties.language;
294
+ if (!language)
295
+ continue;
296
+ // Language-aware gate, reusing the MRO model we already maintain (not a new flag).
297
+ if (getProvider(language).mroStrategy === 'qualified-syntax')
298
+ continue;
299
+ const ownMethods = methodMap.get(classId) ?? [];
300
+ const extendsParents = extendsParentsOf(classId);
301
+ if (extendsParents.length === 0 || ownMethods.length === 0)
302
+ continue;
303
+ const orderedAncestorMethods = [];
304
+ {
305
+ const visited = new Set();
306
+ const queue = [...extendsParents];
307
+ while (queue.length > 0) {
308
+ const ancestorId = queue.shift();
309
+ if (visited.has(ancestorId))
310
+ continue;
311
+ visited.add(ancestorId);
312
+ const ancestorName = graph.getNode(ancestorId)?.properties.name;
313
+ const methodsByName = new Map();
314
+ for (const mid of methodMap.get(ancestorId) ?? []) {
315
+ const mn = graph.getNode(mid);
316
+ if (!mn || mn.label === 'Property' || typeof mn.properties.name !== 'string')
317
+ continue;
318
+ const entry = {
319
+ methodId: mid,
320
+ paramTypes: mn.properties.parameterTypes ?? [],
321
+ paramCount: mn.properties.parameterCount,
322
+ };
323
+ const bucket = methodsByName.get(mn.properties.name);
324
+ if (bucket)
325
+ bucket.push(entry);
326
+ else
327
+ methodsByName.set(mn.properties.name, [entry]);
328
+ }
329
+ orderedAncestorMethods.push({
330
+ className: typeof ancestorName === 'string' ? ancestorName : '<anonymous>',
331
+ methodsByName,
332
+ });
333
+ queue.push(...extendsParentsOf(ancestorId));
334
+ }
335
+ }
336
+ for (const methodId of ownMethods) {
337
+ const methodNode = graph.getNode(methodId);
338
+ if (!methodNode || methodNode.label === 'Property' || !methodNode.properties.name)
339
+ continue;
340
+ const methodName = methodNode.properties.name;
341
+ const ownParamTypes = methodNode.properties.parameterTypes ?? [];
342
+ const ownParamCount = methodNode.properties.parameterCount;
343
+ // Nearest ancestor (BFS order) defining this method by name AND signature, so a
344
+ // same-named overload (e.g. foo(int) vs foo()) is not mistaken for an override.
345
+ for (const { className, methodsByName } of orderedAncestorMethods) {
346
+ const sameName = methodsByName.get(methodName);
347
+ if (!sameName)
348
+ continue;
349
+ const matches = sameName.filter((m) => parameterTypesMatch(ownParamTypes, m.paramTypes, ownParamCount, m.paramCount).match);
350
+ if (matches.length === 0)
351
+ continue; // name present but no signature match — look deeper
352
+ // Emit only when the match is unambiguous (exactly one candidate); >1 means the
353
+ // override target cannot be pinned, so emit nothing. Either way stop — a closer
354
+ // ancestor shadows anything deeper.
355
+ if (matches.length === 1) {
356
+ const matchingMethodId = matches[0].methodId;
357
+ // Target the ancestor METHOD node (not the class), key the id on the method
358
+ // so distinct overrides stay distinct, and count only edges actually added
359
+ // (addRelationship is first-writer-wins, so a duplicate id is dropped).
360
+ const overrideId = generateId('METHOD_OVERRIDES', `${classId}->${matchingMethodId}`);
361
+ if (!emittedOverrideEdgeIds.has(overrideId)) {
362
+ emittedOverrideEdgeIds.add(overrideId);
363
+ graph.addRelationship({
364
+ id: overrideId,
365
+ sourceId: classId,
366
+ targetId: matchingMethodId,
367
+ type: 'METHOD_OVERRIDES',
368
+ confidence: SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE,
369
+ reason: `single-ancestor override: ${className}::${methodName}()`,
370
+ });
371
+ overrideEdges++;
372
+ }
373
+ }
374
+ break; // nearest ancestor shadows deeper ones
375
+ }
376
+ }
377
+ }
269
378
  const methodImplementsEdges = emitMethodImplementsEdges(graph, parentMap, methodMap, parentEdgeType, ancestorsMap, edgeTypesMap);
270
379
  return { entries, overrideEdges, ambiguityCount, methodImplementsEdges };
271
380
  }
@@ -49,6 +49,7 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
49
49
  templateArguments: sym.templateArguments,
50
50
  ownerId: sym.ownerId,
51
51
  qualifiedName: sym.qualifiedName,
52
+ isDeleted: sym.isDeleted,
52
53
  });
53
54
  }
54
55
  if (exportedTypeMap) {
@@ -144,6 +145,49 @@ chunkHash) => {
144
145
  .join(', ');
145
146
  logger.warn(` Skipped unsupported languages: ${summary}`);
146
147
  }
148
+ // Per-language CFG skip telemetry (#2195): functions skipped during the worker
149
+ // CFG walk, bucketed by reason. Only surfaced for a `--pdg` run (otherwise
150
+ // `cfgSkipped` is empty). Warn ONLY when a robustness-relevant bucket
151
+ // (too-deeply-nested / build-error) is non-zero — a too-many-lines skip is the
152
+ // expected, benign minified/generated-code case and would otherwise be spam.
153
+ const cfgSkipped = new Map();
154
+ for (const result of chunkResults) {
155
+ for (const [lang, counts] of Object.entries(result.cfgSkipped ?? {})) {
156
+ const prev = cfgSkipped.get(lang) ?? { tooManyLines: 0, tooDeeplyNested: 0, buildError: 0 };
157
+ cfgSkipped.set(lang, {
158
+ tooManyLines: prev.tooManyLines + counts.tooManyLines,
159
+ tooDeeplyNested: prev.tooDeeplyNested + counts.tooDeeplyNested,
160
+ buildError: prev.buildError + counts.buildError,
161
+ });
162
+ }
163
+ }
164
+ for (const [lang, c] of cfgSkipped) {
165
+ if (c.tooDeeplyNested > 0 || c.buildError > 0) {
166
+ logger.warn(` CFG functions skipped (${lang}): ${c.tooDeeplyNested} too-deeply-nested, ` +
167
+ `${c.buildError} build-error(s), ${c.tooManyLines} over line cap`);
168
+ }
169
+ }
170
+ // Clone-safety telemetry (#2112): files whose parse output carried a value
171
+ // the structured-clone algorithm couldn't serialize across the worker
172
+ // boundary. The worker sanitized/dropped the offending value so the run
173
+ // could complete; surface the (rare) data loss so it's visible and the
174
+ // offending extractor can be fixed at source.
175
+ const skippedPaths = [];
176
+ for (const result of chunkResults) {
177
+ for (const entry of result.skippedPaths ?? [])
178
+ skippedPaths.push(entry);
179
+ }
180
+ if (skippedPaths.length > 0) {
181
+ // Keep the per-file reason ("stripped N value(s) from nodes" /
182
+ // "dropped non-serializable parsedFiles entry") — it distinguishes a
183
+ // recoverable strip from a whole-record drop, which a path-only line loses.
184
+ const shown = skippedPaths
185
+ .slice(0, 10)
186
+ .map((e) => `${e.path} (${e.reason})`)
187
+ .join(', ');
188
+ const more = skippedPaths.length > 10 ? ` …and ${skippedPaths.length - 10} more` : '';
189
+ logger.warn(` Sanitized ${skippedPaths.length} file(s) with non-serializable parse output: ${shown}${more}`);
190
+ }
147
191
  onFileProgress?.(total, total, 'done');
148
192
  return chunkResults;
149
193
  };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Phase: callSummaries (PDG FU-C, U-C3)
3
+ *
4
+ * The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
5
+ * SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
6
+ * `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
7
+ * summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
8
+ * per harvested callee. A later consumer phase (NOT this task) decodes the
9
+ * bitset to ascend a callee's return effect into the caller continuation.
10
+ *
11
+ * Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
12
+ * `analyze` run never includes it, so the graph is byte-identical and emits ZERO
13
+ * CALL_SUMMARY edges. No always-on phase depends on it.
14
+ *
15
+ * @deps scopeResolution, pruneLocalSymbols
16
+ * @reads scopeResolution output (callSummaries)
17
+ * @writes graph (CALL_SUMMARY self-loop edges)
18
+ */
19
+ import type { PipelinePhase } from './types.js';
20
+ export interface CallSummariesOutput {
21
+ /** Per-callee summaries fed to the emit. */
22
+ summaries: number;
23
+ /** CALL_SUMMARY edges persisted. */
24
+ edgesEmitted: number;
25
+ }
26
+ export declare const callSummariesPhase: PipelinePhase<CallSummariesOutput>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Phase: callSummaries (PDG FU-C, U-C3)
3
+ *
4
+ * The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
5
+ * SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
6
+ * `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
7
+ * summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
8
+ * per harvested callee. A later consumer phase (NOT this task) decodes the
9
+ * bitset to ascend a callee's return effect into the caller continuation.
10
+ *
11
+ * Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
12
+ * `analyze` run never includes it, so the graph is byte-identical and emits ZERO
13
+ * CALL_SUMMARY edges. No always-on phase depends on it.
14
+ *
15
+ * @deps scopeResolution, pruneLocalSymbols
16
+ * @reads scopeResolution output (callSummaries)
17
+ * @writes graph (CALL_SUMMARY self-loop edges)
18
+ */
19
+ import { getPhaseOutput } from './types.js';
20
+ import { emitCallSummaries, DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES, } from '../taint/call-summary-emit.js';
21
+ import { logger } from '../../logger.js';
22
+ const EMPTY = { summaries: 0, edgesEmitted: 0 };
23
+ export const callSummariesPhase = {
24
+ name: 'callSummaries',
25
+ deps: ['scopeResolution', 'pruneLocalSymbols'],
26
+ async execute(ctx, deps) {
27
+ const scope = getPhaseOutput(deps, 'scopeResolution');
28
+ const summaries = scope.callSummaries;
29
+ if (summaries.length === 0)
30
+ return EMPTY;
31
+ const maxEdges = ctx.options?.pdgMaxCallSummaryEdges ?? DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES;
32
+ const emit = emitCallSummaries(ctx.graph, summaries, { maxEdges }, (m) => logger.warn(m));
33
+ if (emit.edgesDropped > 0) {
34
+ logger.warn(`[call-summary] capped: ${emit.edgesDropped} CALL_SUMMARY edge(s) dropped by the ` +
35
+ `per-run cap (${maxEdges}) — raise pdgMaxCallSummaryEdges if intentional`);
36
+ }
37
+ if (emit.skippedMissingEndpoint > 0) {
38
+ logger.debug(`[call-summary] ${emit.skippedMissingEndpoint} summary/summaries skipped (callee node ` +
39
+ `missing from graph)`);
40
+ }
41
+ if (emit.edgesEmitted > 0) {
42
+ logger.debug(`[call-summary] ${summaries.length} summaries → ${emit.edgesEmitted} CALL_SUMMARY edge(s)`);
43
+ }
44
+ return { summaries: summaries.length, edgesEmitted: emit.edgesEmitted };
45
+ },
46
+ };
@@ -15,6 +15,8 @@ export { ormPhase, type ORMOutput } from './orm.js';
15
15
  export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
16
16
  export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
17
17
  export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
18
+ export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
19
+ export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
18
20
  export { mroPhase, type MROOutput } from './mro.js';
19
21
  export { communitiesPhase, type CommunitiesOutput } from './communities.js';
20
22
  export { processesPhase, type ProcessesOutput } from './processes.js';
@@ -16,6 +16,8 @@ export { ormPhase } from './orm.js';
16
16
  export { crossFilePhase } from './cross-file.js';
17
17
  export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
18
18
  export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
19
+ export { taintSummariesPhase } from './taint-summaries.js';
20
+ export { callSummariesPhase } from './call-summaries.js';
19
21
  export { mroPhase } from './mro.js';
20
22
  export { communitiesPhase } from './communities.js';
21
23
  export { processesPhase } from './processes.js';
@@ -26,27 +26,6 @@ type ScannedFile = {
26
26
  size: number;
27
27
  };
28
28
  type ProgressFn = (progress: PipelineProgress) => void;
29
- /**
30
- * Handle a worker-pool startup failure by FAILING FAST with the captured cause
31
- * (#1741). The pool self-heals *transient* worker crashes on its own — a
32
- * bounded, jittered startup restart loop (see worker-pool.ts) — so this is
33
- * reached only when that self-heal is EXHAUSTED, or a deterministic crash-loop
34
- * was detected, or the pool could not even be constructed. In every such case
35
- * the workers genuinely cannot start.
36
- *
37
- * There is no sequential parser to silently degrade to — that fallback was
38
- * removed (and it had masked a worker-startup regression as a 2-hour "stuck"
39
- * run in #1741, rc99: a dropped `logger.warn` plus an unbounded sequential
40
- * grind). GitNexus surfaces the real crash and aborts so the operator fixes the
41
- * worker startup (commonly a missing build). The pool's own crash
42
- * classification (`crashClass` on WorkerPoolInitializationError) sharpens the
43
- * message.
44
- *
45
- * @throws always — an actionable Error carrying the captured worker crash.
46
- * @internal Exported for unit tests; production callers are the parse loop's
47
- * two worker-startup catch sites below.
48
- */
49
- export declare function handleWorkerStartupFailure(err: Error): never;
50
29
  /**
51
30
  * Chunked parse + resolve loop.
52
31
  *
@@ -18,6 +18,7 @@ import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulat
18
18
  import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
19
19
  import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
20
20
  import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
21
+ import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
21
22
  import { processRoutesFromExtracted, buildExportedTypeMapFromGraph, } from '../call-processor.js';
22
23
  import { createSemanticModel } from '../model/index.js';
23
24
  import { getLanguageFromFilename, } from '../../../_shared/index.js';
@@ -319,6 +320,10 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
319
320
  // Initialized below before the chunk loop (same deferred-init pattern
320
321
  // as `parsedFileStorePath`); this closure only runs from the loop.
321
322
  durableParsedFileStoragePath: durableParsedFileDir,
323
+ // CFG/PDG opt-in (#2081 M1) — baked into each worker's workerData so the
324
+ // worker builds + attaches cfgSideChannel. Off by default.
325
+ pdg: options?.pdg === true,
326
+ pdgMaxFunctionLines: options?.pdgMaxFunctionLines,
322
327
  // Fan each chunk across the whole pool (#worker-idle): without this a
323
328
  // chunk smaller than the 8 MB sub-batch cap became a single job on a
324
329
  // single worker. Honors an explicit `subBatchMaxBytes` / env override.
@@ -566,7 +571,19 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
566
571
  filePath: f.path,
567
572
  contentHash: fileContentHash(f.content),
568
573
  }));
569
- chunkHash = computeChunkHash(entries);
574
+ chunkHash = computeChunkHash(entries,
575
+ // Only worker-visible pdg config participates in the key —
576
+ // pdgMaxEdgesPerFunction is emit-time-only and deliberately
577
+ // excluded (see PdgCacheKey in parse-cache.ts; #2099 F3). The line
578
+ // cap is RESOLVED to the worker's default before folding so an
579
+ // explicit-default run shares the default run's keys (the worker
580
+ // output is byte-identical either way).
581
+ options?.pdg === true
582
+ ? {
583
+ pdg: true,
584
+ maxFunctionLines: options?.pdgMaxFunctionLines ?? DEFAULT_PDG_MAX_FUNCTION_LINES,
585
+ }
586
+ : false);
570
587
  }
571
588
  const cachedRaw = chunkHash && parseCache ? await loadParseCacheChunk(parseCache, chunkHash) : undefined;
572
589
  // Track every chunk hash we touched so the orchestrator can
@@ -14,6 +14,15 @@ import type { PipelinePhase } from './types.js';
14
14
  export interface RouteEntry {
15
15
  filePath: string;
16
16
  source: string;
17
+ /**
18
+ * HTTP verb for this route when ingestion knows it structurally
19
+ * (Spring/Laravel framework routes and decorator routes carry
20
+ * `httpMethod`; filesystem-derived routes — Next.js/Expo/PHP file
21
+ * routes — do not, so this stays undefined for them). Persisted onto
22
+ * the Route node so downstream contract extraction can read the verb
23
+ * from the graph instead of re-parsing the handler source.
24
+ */
25
+ method?: string;
17
26
  }
18
27
  export interface RoutesOutput {
19
28
  routeRegistry: Map<string, RouteEntry>;
@@ -26,4 +35,5 @@ export interface TemplateFetchCall {
26
35
  export declare const isTemplateRouteCandidate: (filePath: string) => boolean;
27
36
  export declare function extractTemplateStaticFetchCalls(filePath: string, content: string, namedRouteUrls?: ReadonlyMap<string, string>): TemplateFetchCall[];
28
37
  export declare function normalizeExtractedRoutePath(routePath: string, prefix: string | null): string;
38
+ export declare function normalizeRouteMethod(raw: string | null | undefined): string | undefined;
29
39
  export declare const routesPhase: PipelinePhase<RoutesOutput>;