gitnexus 1.6.9 → 1.6.10-aptos.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +211 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +197 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +5 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +28 -0
  294. package/dist/core/move/consistency.js +98 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +49 -0
  310. package/dist/core/move/move-ingest.js +320 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +3 -3
  322. package/dist/core/run-analyze.js +1001 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  374. package/hooks/claude/gitnexus-hook.cjs +59 -9
  375. package/hooks/claude/pre-tool-use.sh +0 -0
  376. package/hooks/claude/session-start.sh +0 -0
  377. package/package.json +21 -15
  378. package/scripts/cross-platform-tests.ts +56 -0
  379. package/scripts/ensure-fts.ts +43 -0
  380. package/scripts/install-duckdb-extension.mjs +85 -24
  381. package/scripts/run-cross-platform.ts +61 -6
  382. package/scripts/shard-arg.ts +30 -0
  383. package/scripts/sync-plugin-manifests.mjs +192 -0
  384. package/skills/gitnexus-lfg/README.md +55 -0
  385. package/skills/gitnexus-lfg/SKILL.md +86 -0
  386. package/skills/gitnexus-plan/README.md +142 -0
  387. package/skills/gitnexus-plan/SKILL.md +348 -0
  388. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  389. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  390. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  391. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  392. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  393. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  394. package/skills/gitnexus-review/SKILL.md +273 -0
  395. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  396. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  397. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  398. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  399. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  400. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  401. package/skills/gitnexus-work/README.md +71 -0
  402. package/skills/gitnexus-work/SKILL.md +269 -0
  403. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  404. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  405. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  406. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  407. package/web/assets/agent-Bqxn-abU.js +626 -0
  408. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  409. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  410. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  411. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  412. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  413. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  414. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  415. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  416. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  417. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  418. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  419. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  420. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  421. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  422. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  423. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  424. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  425. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  426. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  427. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  428. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  429. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  430. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  431. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  432. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  433. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  434. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  435. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  436. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  437. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  438. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  439. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  440. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  441. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  442. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  443. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  444. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  445. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  446. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  447. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  448. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  449. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  450. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  451. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  452. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  453. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  454. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  455. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  456. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  457. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  458. package/web/assets/index-CX_fADmQ.css +2 -0
  459. package/web/assets/index-D1Z3dGGz.js +575 -0
  460. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  461. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  462. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  463. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  464. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  465. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  466. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  467. package/web/assets/node-Ct_zna8U.js +8 -0
  468. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  469. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  470. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  471. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  472. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  473. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  474. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  475. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  476. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  477. package/web/assets/sdk-CzHHH8tD.js +37 -0
  478. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  479. package/web/assets/src-JV30wyV8.js +1 -0
  480. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  481. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  482. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  483. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  484. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  485. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  486. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  487. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  488. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  489. package/web/index.html +18 -10
  490. package/skills/gitnexus-pr-review.md +0 -163
  491. package/web/assets/agent-Dli_x7bU.js +0 -660
  492. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  493. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  494. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  495. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  496. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  497. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  498. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  499. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  500. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  501. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  502. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  503. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  504. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  505. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  506. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  507. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  508. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  509. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  510. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  511. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  512. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  513. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  514. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  515. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  516. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  517. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  518. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  519. package/web/assets/index-KctnI3Vq.js +0 -635
  520. package/web/assets/index-_lgn7hs5.css +0 -2
  521. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  522. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  523. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  524. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  525. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  526. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  527. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  528. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  529. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  530. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  531. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  532. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  533. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  534. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  535. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  536. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  537. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  538. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  539. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -1,6 +1,22 @@
1
1
  const REF_PREFIX_RE = /^&\s*(mut\s+)?/;
2
2
  const PTR_PREFIX_RE = /^\*\s*(const|mut)?\s*/;
3
+ const DYN_PREFIX_RE = /^dyn\s+/;
3
4
  const ENUM_VARIANT_NAMES = new Set(['Some', 'None', 'Ok', 'Err']);
5
+ // `dyn Trait`, `&dyn Trait`, `Box<dyn Trait>` all name a trait object whose
6
+ // receiver-dispatch target is the trait itself (#2604) — strip the `dyn`
7
+ // keyword and any auto-trait/lifetime bound list (`dyn Trait + Send`) down to
8
+ // the principal trait name. Reference/pointer sigils are stripped by the
9
+ // caller first; wrapper unwrapping (Box<T> etc.) runs before this so the
10
+ // unwrapped inner text still gets the same treatment.
11
+ function stripDynBound(t) {
12
+ if (!DYN_PREFIX_RE.test(t))
13
+ return t;
14
+ t = t.replace(DYN_PREFIX_RE, '');
15
+ const plus = t.indexOf('+');
16
+ if (plus !== -1)
17
+ t = t.slice(0, plus);
18
+ return t.trim();
19
+ }
4
20
  // ─── interpretImport ──────────────────────────────────────────────────────
5
21
  export function interpretRustImport(captures) {
6
22
  const kind = captures['@import.kind']?.text;
@@ -104,6 +120,7 @@ export function normalizeRustTypeName(text) {
104
120
  if (inner !== null)
105
121
  t = inner;
106
122
  }
123
+ t = stripDynBound(t);
107
124
  const bracket = t.indexOf('<');
108
125
  if (bracket !== -1)
109
126
  t = t.slice(0, bracket);
@@ -168,6 +185,7 @@ function normalizeRustReturnType(text) {
168
185
  }
169
186
  }
170
187
  }
188
+ t = stripDynBound(t);
171
189
  const bracket = t.indexOf('<');
172
190
  if (bracket !== -1)
173
191
  t = t.slice(0, bracket);
@@ -9,6 +9,7 @@ const RUST_SCOPE_QUERY = `
9
9
  (enum_item) @scope.class
10
10
  (union_item) @scope.class
11
11
  (function_item) @scope.function
12
+ (function_signature_item) @scope.function
12
13
  (closure_expression) @scope.function
13
14
  (block) @scope.block
14
15
  (if_expression) @scope.block
@@ -54,6 +55,14 @@ const RUST_SCOPE_QUERY = `
54
55
  (function_item
55
56
  name: (identifier) @declaration.name) @declaration.function
56
57
 
58
+ ;; Declarations — trait method signature (required method, no body,
59
+ ;; e.g. fn foo(self) -> T; inside a trait body). Without this, an abstract
60
+ ;; trait method is invisible to scope resolution — never owned by its
61
+ ;; trait's Class scope, so a dyn Trait receiver can never dispatch to
62
+ ;; it (#2604).
63
+ (function_signature_item
64
+ name: (identifier) @declaration.name) @declaration.function
65
+
57
66
  ;; Declarations — struct fields
58
67
  (field_declaration
59
68
  name: (field_identifier) @declaration.name
@@ -75,6 +75,12 @@ export function populateRustRangeBindings(parsedFiles, _indexes, ctx) {
75
75
  }
76
76
  }
77
77
  }
78
+ // Publish per-type member bindings for the whole workspace before resolving
79
+ // assignments. Otherwise an importer processed before its defining file can
80
+ // miss a field or identity-method type solely because of file order.
81
+ const scopeMap = new Map(parsed.scopes.map((scope) => [scope.id, scope]));
82
+ processFieldTypeBindings(tree.rootNode, parsed, scopeMap);
83
+ processIdentityMethodBindings(parsed);
78
84
  }
79
85
  for (const parsed of parsedFiles) {
80
86
  const sourceText = ctx.fileContents.get(parsed.filePath);
@@ -103,8 +109,6 @@ export function populateRustRangeBindings(parsedFiles, _indexes, ctx) {
103
109
  const moduleScope = parsed.scopes.find((s) => s.kind === 'Module');
104
110
  if (moduleScope === undefined)
105
111
  continue;
106
- processFieldTypeBindings(tree.rootNode, parsed, scopeMap);
107
- processIdentityMethodBindings(parsed);
108
112
  processForLoops(tree.rootNode, parsed, scopeMap, moduleScope, allReturnTypes);
109
113
  processPatternBindings(tree.rootNode, parsed, scopeMap, moduleScope);
110
114
  processStructDestructuring(tree.rootNode, parsed, scopeMap, moduleScope, allFieldTypes);
@@ -41,8 +41,19 @@ import { getSwiftParser, getSwiftScopeQuery } from './query.js';
41
41
  import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
42
42
  import { getTreeSitterBufferSize } from '../../constants.js';
43
43
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
44
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
44
45
  /** Declaration anchors that carry function-like arity metadata. */
45
46
  const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.constructor'];
47
+ const SWIFT_CALLABLE_CAPTURE_OPTIONS = {
48
+ functionNodeTypes: new Set(['function_declaration', 'lambda_literal']),
49
+ callNodeTypes: new Set(['call_expression']),
50
+ parameterListNodeTypes: new Set(['value_arguments']),
51
+ parameterNodeTypes: new Set(['parameter']),
52
+ bindingNodeTypes: new Set(['property_declaration']),
53
+ assignmentNodeTypes: new Set(['assignment']),
54
+ identifierNodeTypes: new Set(['simple_identifier', 'type_identifier']),
55
+ extractFunctionParameters: (node) => node.namedChildren.filter((child) => child !== null && child.type === 'parameter'),
56
+ };
46
57
  /** tree-sitter-swift node types that carry arity. */
47
58
  const FUNCTION_NODE_TYPES = [
48
59
  'function_declaration',
@@ -257,6 +268,7 @@ export function emitSwiftScopeCaptures(sourceText, _filePath, cachedTree) {
257
268
  // legacy heritage-capture leg (removed in #942), which the worker pipeline
258
269
  // drops for registry-primary languages (issue #1951).
259
270
  out.push(...synthesizeSwiftInheritanceReferences(tree.rootNode));
271
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, SWIFT_CALLABLE_CAPTURE_OPTIONS));
260
272
  return out;
261
273
  }
262
274
  /**
@@ -33,6 +33,7 @@ import { computeTsArityMetadata } from './arity-metadata.js';
33
33
  import { isArrayMethodCallbackArrow } from './array-callback.js';
34
34
  import { getTreeSitterBufferSize } from '../../constants.js';
35
35
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
36
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
36
37
  import { deriveDefaultExportHocName, isBlockedDefaultExportHoc, isDefaultExportHocFunctionNode, } from '../../ts-js-hoc-utils.js';
37
38
  /** tree-sitter-typescript node types for function-like scopes that may
38
39
  * carry a synthesized `this` binding. Kept in sync with the
@@ -55,6 +56,25 @@ const CALL_TAGS = [
55
56
  '@reference.call.member',
56
57
  '@reference.call.constructor',
57
58
  ];
59
+ const TS_CALLABLE_CAPTURE_OPTIONS = {
60
+ functionNodeTypes: new Set(FUNCTION_NODE_TYPES),
61
+ callNodeTypes: new Set(['call_expression']),
62
+ parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
63
+ parameterNodeTypes: new Set([
64
+ 'required_parameter',
65
+ 'optional_parameter',
66
+ 'rest_pattern',
67
+ 'identifier',
68
+ ]),
69
+ bindingNodeTypes: new Set(['variable_declarator']),
70
+ assignmentNodeTypes: new Set(['assignment_expression', 'augmented_assignment_expression']),
71
+ identifierNodeTypes: new Set([
72
+ 'identifier',
73
+ 'property_identifier',
74
+ 'shorthand_property_identifier_pattern',
75
+ 'private_property_identifier',
76
+ ]),
77
+ };
58
78
  function pickFirstCapture(grouped, tags) {
59
79
  for (const tag of tags) {
60
80
  const cap = grouped[tag];
@@ -344,6 +364,7 @@ export function emitTsScopeCaptures(sourceText, filePath, cachedTree) {
344
364
  synthesizeForOfMapTupleBindings(tree.rootNode, out);
345
365
  synthesizeInstanceofNarrowings(tree.rootNode, out);
346
366
  synthesizeTsInheritanceReferences(tree.rootNode, out);
367
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, TS_CALLABLE_CAPTURE_OPTIONS));
347
368
  return out;
348
369
  }
349
370
  /**
@@ -202,7 +202,8 @@ function isProjectLocalPath(source) {
202
202
  /** True when `absPath` is `repoRoot` itself or lives beneath it. */
203
203
  function isWithinRepo(repoRoot, absPath) {
204
204
  const root = path.resolve(repoRoot);
205
- return absPath === root || absPath.startsWith(root + path.sep);
205
+ const safeRoot = root.endsWith(path.sep) ? root : root + path.sep;
206
+ return absPath === root || absPath.startsWith(safeRoot);
206
207
  }
207
208
  async function resolveExtension(base) {
208
209
  const directFile = await firstExistingFile([...FILE_EXTENSIONS.map((ext) => base + ext), base]);
@@ -96,6 +96,23 @@ const TYPESCRIPT_SCOPE_QUERY = `
96
96
  (arrow_function) @scope.function
97
97
  (function_expression) @scope.function
98
98
 
99
+ ;; Object literals (the { ... } value expression, NOT object_type or
100
+ ;; object_pattern) get their own scope boundary. Without it, a
101
+ ;; method_definition/property-arrow's auto-hoist (scope-extractor.ts)
102
+ ;; has nowhere to stop and leaks the name past the literal into whatever
103
+ ;; lexically encloses it -- e.g. 'export default { async fetch(req) {} }'
104
+ ;; would bind fetch at Module scope, letting an unrelated same-file
105
+ ;; fetch(...) call (the platform global) incorrectly resolve to it
106
+ ;; (#2545). Object (not Block or Class): object-literal members are
107
+ ;; reachable only via property access, never as bare identifiers -- not
108
+ ;; even by a SIBLING property's function body, unlike a real Block
109
+ ;; (if/for/while, where a nested closure legitimately sees a sibling
110
+ ;; let/const) or a Class (implicit-this sibling dispatch). Scope-chain
111
+ ;; walkers (scope-resolution/scope/walkers.ts) skip an Object scope's
112
+ ;; own bindings entirely while still treating it as a hoist boundary
113
+ ;; (#2551).
114
+ (object) @scope.object
115
+
99
116
  ;; Type aliases that contain an object_type are structurally class-like —
100
117
  ;; they define a shape with named members. Emit @scope.class so the
101
118
  ;; field-extractor's type-alias-with-object-type handling (in
@@ -987,6 +1004,26 @@ const TYPESCRIPT_SCOPE_QUERY = `
987
1004
  (member_expression
988
1005
  object: (_) @reference.receiver
989
1006
  property: (property_identifier) @reference.name) @reference.read.member
1007
+
1008
+ ;; References — value position (#2437): a function identifier assigned as an
1009
+ ;; object-literal property value (\`{ emitScopeCaptures: emitCppScopeCaptures }\`)
1010
+ ;; or shorthand (\`{ emitHook }\`). Resolution keeps only callable targets
1011
+ ;; (MethodRegistry), so plain-value pairs (\`{ port: DEFAULT_PORT }\`) emit
1012
+ ;; nothing; the emitted edge is a reference-class USES (registration ≠
1013
+ ;; invocation). \`@reference.property-key\` records the key so the
1014
+ ;; property-dispatch pass can synthesize CALLS at \`x.<key>()\` sites; for
1015
+ ;; shorthand the key IS the name (both tags on one node). Two separate
1016
+ ;; patterns — never combined in \`[...]\` (tree-sitter 0.21 drops alternation
1017
+ ;; siblings around predicates). Destructuring shorthand is a different node
1018
+ ;; (\`shorthand_property_identifier_pattern\`), so \`const { a } = o\` cannot
1019
+ ;; match; string/computed keys carry no \`property_identifier\` and register
1020
+ ;; without a dispatch key.
1021
+ (pair
1022
+ key: (property_identifier) @reference.property-key
1023
+ value: (identifier) @reference.name @reference.value-ref)
1024
+
1025
+ (object
1026
+ (shorthand_property_identifier) @reference.name @reference.property-key @reference.value-ref)
990
1027
  `;
991
1028
  /**
992
1029
  * JSX-only query suffix. Appended to the base query when compiling
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import path from 'node:path';
9
9
  import { generateId } from '../../lib/utils.js';
10
+ import { toZeroBasedLine } from './utils/line-base.js';
10
11
  const HEADING_RE = /^(#{1,6})\s+(.+)$/;
11
12
  const LINK_RE = /\[([^\]]*)\]\(([^)]+)\)/g;
12
13
  const MD_EXTENSIONS = new Set(['.md', '.mdx']);
@@ -59,8 +60,8 @@ export const processMarkdown = (graph, files, allPathSet) => {
59
60
  properties: {
60
61
  name: heading,
61
62
  filePath: file.path,
62
- startLine: lineNum,
63
- endLine,
63
+ startLine: toZeroBasedLine(lineNum),
64
+ endLine: toZeroBasedLine(endLine),
64
65
  level,
65
66
  description: `h${level}`,
66
67
  },
@@ -116,6 +116,7 @@ const LABEL_BEHAVIOR = {
116
116
  Section: 'inert',
117
117
  Route: 'inert',
118
118
  Tool: 'inert',
119
+ EnumVariant: 'inert',
119
120
  // Taint/PDG substrate (issue #2080) — a control-flow node, never a
120
121
  // symbol-resolution target. Inert: file index only, no owner scope.
121
122
  BasicBlock: 'inert',
@@ -3,7 +3,7 @@ import type { SymbolTableWriter } from './model/index.js';
3
3
  import { type ExportedTypeMap } from './call-processor.js';
4
4
  import type { ParsedFile } from '../../_shared/index.js';
5
5
  import { WorkerPool } from './workers/worker-pool.js';
6
- import type { ParseWorkerResult, ExtractedRoute, ExtractedFetchCall, ExtractedDecoratorRoute, ExtractedToolDef, FileScopeBindings, ExtractedORMQuery, FetchWrapperDef } from './workers/parse-worker.js';
6
+ import type { ParseWorkerResult, ExtractedRoute, ExtractedFetchCall, ExtractedDecoratorRoute, ExtractedModuleConstants, ExtractedToolDef, FileScopeBindings, ExtractedORMQuery, FetchWrapperDef } from './workers/parse-worker.js';
7
7
  import type { ExtractedRouterConstructorPrefix, ExtractedRouterImport, ExtractedRouterInclude, ExtractedRouterModuleAlias } from './route-extractors/fastapi-router-bindings.js';
8
8
  import type { SharedSpringType } from './route-extractors/spring-shared.js';
9
9
  export type FileProgressCallback = (current: number, total: number, filePath: string) => void;
@@ -16,6 +16,8 @@ export interface WorkerExtractedData {
16
16
  routerImports: ExtractedRouterImport[];
17
17
  routerConstructorPrefixes: ExtractedRouterConstructorPrefix[];
18
18
  routerModuleAliases: ExtractedRouterModuleAlias[];
19
+ /** Per-file Python module constants for cross-file route-path resolution (#2391). */
20
+ moduleConstants: ExtractedModuleConstants[];
19
21
  toolDefs: ExtractedToolDef[];
20
22
  ormQueries: ExtractedORMQuery[];
21
23
  /** Project-wide Spring class/interface views for the #2288 inheritance pass. */
@@ -1,6 +1,33 @@
1
1
  import { getLanguageFromFilename } from '../../_shared/index.js';
2
2
  import { accumulateExportedTypesFromParsedNode } from './call-processor.js';
3
3
  import { logger } from '../logger.js';
4
+ function compareText(left, right) {
5
+ return left < right ? -1 : left > right ? 1 : 0;
6
+ }
7
+ function sourceLine(node) {
8
+ const value = node.properties.startLine;
9
+ return typeof value === 'number' && Number.isFinite(value) ? value : Number.MAX_SAFE_INTEGER;
10
+ }
11
+ function compareParsedNodeSourceOrder(left, right) {
12
+ const leftPath = typeof left.properties.filePath === 'string' ? left.properties.filePath : '';
13
+ const rightPath = typeof right.properties.filePath === 'string' ? right.properties.filePath : '';
14
+ const fileOrder = compareText(leftPath, rightPath);
15
+ if (fileOrder !== 0)
16
+ return fileOrder;
17
+ const leftLine = sourceLine(left);
18
+ const rightLine = sourceLine(right);
19
+ if (leftLine !== rightLine)
20
+ return leftLine < rightLine ? -1 : 1;
21
+ return compareText(left.id, right.id);
22
+ }
23
+ function nodesInSourceOrder(nodes) {
24
+ for (let index = 1; index < nodes.length; index++) {
25
+ if (compareParsedNodeSourceOrder(nodes[index - 1], nodes[index]) > 0) {
26
+ return [...nodes].sort(compareParsedNodeSourceOrder);
27
+ }
28
+ }
29
+ return nodes;
30
+ }
4
31
  // ============================================================================
5
32
  // Worker-based parallel parsing
6
33
  // ============================================================================
@@ -24,13 +51,18 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
24
51
  const allRouterImports = [];
25
52
  const allRouterConstructorPrefixes = [];
26
53
  const allRouterModuleAliases = [];
54
+ const allModuleConstants = [];
27
55
  const allSpringTypes = [];
28
56
  const allToolDefs = [];
29
57
  const allORMQueries = [];
30
58
  const fileScopeBindingsByFile = [];
31
59
  const allParsedFiles = [];
32
60
  for (const result of chunkResults) {
33
- for (const node of result.nodes) {
61
+ // Worker jobs and input files are already merged in stable start-index/path
62
+ // order. Canonicalize the final per-result node boundary once so graph
63
+ // insertion, cache replay, and first-wins graph indexes share source order.
64
+ // The common already-ordered path stays allocation-free and linear.
65
+ for (const node of nodesInSourceOrder(result.nodes)) {
34
66
  graph.addNode({
35
67
  id: node.id,
36
68
  label: node.label,
@@ -76,6 +108,8 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
76
108
  }
77
109
  for (const item of result.routerModuleAliases ?? [])
78
110
  allRouterModuleAliases.push(item);
111
+ for (const item of result.moduleConstants ?? [])
112
+ allModuleConstants.push(item);
79
113
  for (const item of result.springTypes ?? [])
80
114
  allSpringTypes.push(item);
81
115
  for (const item of result.toolDefs)
@@ -99,6 +133,7 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
99
133
  routerImports: allRouterImports,
100
134
  routerConstructorPrefixes: allRouterConstructorPrefixes,
101
135
  routerModuleAliases: allRouterModuleAliases,
136
+ moduleConstants: allModuleConstants,
102
137
  toolDefs: allToolDefs,
103
138
  ormQueries: allORMQueries,
104
139
  springTypes: allSpringTypes,
@@ -6,6 +6,7 @@
6
6
  */
7
7
  export { scanPhase, type ScanOutput } from './scan.js';
8
8
  export { structurePhase, type StructureOutput } from './structure.js';
9
+ export { emptyStandaloneIngestPhase, type StandaloneIngestOutput } from './standalone-ingest.js';
9
10
  export { markdownPhase, type MarkdownOutput } from './markdown.js';
10
11
  export { cobolPhase, type CobolOutput } from './cobol.js';
11
12
  export { parsePhase, type ParseOutput } from './parse.js';
@@ -14,6 +15,7 @@ export { toolsPhase, type ToolsOutput, type ToolDef } from './tools.js';
14
15
  export { ormPhase, type ORMOutput } from './orm.js';
15
16
  export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
16
17
  export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
18
+ export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
17
19
  export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
18
20
  export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
19
21
  export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
@@ -7,6 +7,7 @@
7
7
  // ── Phase exports (in dependency order) ────────────────────────────────────
8
8
  export { scanPhase } from './scan.js';
9
9
  export { structurePhase } from './structure.js';
10
+ export { emptyStandaloneIngestPhase } from './standalone-ingest.js';
10
11
  export { markdownPhase } from './markdown.js';
11
12
  export { cobolPhase } from './cobol.js';
12
13
  export { parsePhase } from './parse.js';
@@ -15,6 +16,7 @@ export { toolsPhase } from './tools.js';
15
16
  export { ormPhase } from './orm.js';
16
17
  export { crossFilePhase } from './cross-file.js';
17
18
  export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
19
+ export { springConfigPhase } from './spring-config.js';
18
20
  export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
19
21
  export { taintSummariesPhase } from './taint-summaries.js';
20
22
  export { callSummariesPhase } from './call-summaries.js';
@@ -17,7 +17,7 @@
17
17
  import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulator.js';
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
- import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
20
+ import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
21
21
  import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
22
22
  import { processRoutesFromExtracted, resolveRouteHandlerSymbols, buildExportedTypeMapFromGraph, } from '../call-processor.js';
23
23
  import { createSemanticModel } from '../model/index.js';
@@ -28,6 +28,7 @@ import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
28
28
  import { getProvider, providers } from '../languages/index.js';
29
29
  import { createWorkerPool, workerPoolDisabledByEnv, resolveAutoPoolSize, WorkerPoolInitializationError, WorkerPoolDisabledError, } from '../workers/worker-pool.js';
30
30
  import { normalizeExtractedRoutePath } from '../route-extractors/route-path.js';
31
+ import { resolveOperands, } from '../route-extractors/python-const-resolver.js';
31
32
  import { resolveInheritedSpringRoutes, } from '../route-extractors/spring-shared.js';
32
33
  import fs from 'node:fs';
33
34
  import path from 'node:path';
@@ -277,7 +278,8 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
277
278
  const skippedByLang = new Map();
278
279
  for (const f of scannedFiles) {
279
280
  const lang = getLanguageFromFilename(f.path);
280
- if (lang && !isLanguageAvailable(lang)) {
281
+ const provider = lang === null ? undefined : getProvider(lang);
282
+ if (lang && provider?.parseStrategy !== 'standalone' && !isLanguageAvailable(lang)) {
281
283
  skippedByLang.set(lang, (skippedByLang.get(lang) || 0) + 1);
282
284
  }
283
285
  }
@@ -464,6 +466,9 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
464
466
  const allRouterImports = [];
465
467
  const allRouterConstructorPrefixes = [];
466
468
  const allRouterModuleAliases = [];
469
+ // Per-file Python module constants (#2391); resolved into decorator route paths
470
+ // below, after cross-file aggregation, alongside the include_router prefix pass.
471
+ const allModuleConstants = [];
467
472
  const allSpringTypes = [];
468
473
  const allToolDefs = [];
469
474
  const allORMQueries = [];
@@ -610,6 +615,10 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
610
615
  for (const item of chunkWorkerData.routerModuleAliases)
611
616
  allRouterModuleAliases.push(item);
612
617
  }
618
+ if (chunkWorkerData.moduleConstants?.length) {
619
+ for (const item of chunkWorkerData.moduleConstants)
620
+ allModuleConstants.push(item);
621
+ }
613
622
  if (chunkWorkerData.springTypes?.length) {
614
623
  for (const item of chunkWorkerData.springTypes)
615
624
  allSpringTypes.push(item);
@@ -769,6 +778,17 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
769
778
  // Cache miss: dispatch to workers, capture the raw results, store
770
779
  // them under the chunk hash for the next run.
771
780
  chunkCacheMisses++;
781
+ if (durableParsedFileDir !== undefined && chunkHash !== null) {
782
+ try {
783
+ await prepareDurableParsedFileChunk(durableParsedFileDir, chunkHash);
784
+ }
785
+ catch (err) {
786
+ // The durable store is an optimization — degrade like the restore
787
+ // path does instead of failing the analyze. Workers recreate the
788
+ // directory on write, so at worst the old generation lingers.
789
+ logger.warn({ err, chunkHash: chunkHash.slice(0, 8) }, 'parsedfile-cache: could not reset durable chunk generation; continuing');
790
+ }
791
+ }
772
792
  const progressForChunk = (current, _total, filePath) => {
773
793
  const globalCurrent = filesParsedSoFar + current;
774
794
  // Parse phase covers 20-70 (M2). Deferred extraction handles 70-95.
@@ -925,6 +945,40 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
925
945
  }
926
946
  // FastAPI router-prefix resolution (cross-file).
927
947
  //
948
+ // #2391: resolve non-literal FastAPI decorator route paths (imported/composed
949
+ // string constants) BEFORE the include_router/APIRouter prefix pass below, so a
950
+ // resolved path is then prefix-joined like any literal path. Each such route
951
+ // carries `routePathExpr`/`routePathOperands` and an empty `routePath`; we fold
952
+ // the operands against the repo-wide, file-path-keyed constant map. On failure
953
+ // we DROP the route (KTD5 skip floor) rather than emit a phantom `POST /`.
954
+ if (allDecoratorRoutes.some((dr) => dr.routePathExpr !== undefined)) {
955
+ const repoConstants = new Map();
956
+ for (const { filePath, constants } of allModuleConstants) {
957
+ repoConstants.set(filePath, constants);
958
+ }
959
+ const resolvedRoutes = [];
960
+ let skipped = 0;
961
+ for (const dr of allDecoratorRoutes) {
962
+ if (dr.routePathExpr === undefined) {
963
+ resolvedRoutes.push(dr);
964
+ continue;
965
+ }
966
+ const value = dr.routePathOperands
967
+ ? resolveOperands(dr.filePath, dr.routePathOperands, repoConstants)
968
+ : null;
969
+ if (value === null) {
970
+ skipped++;
971
+ continue;
972
+ }
973
+ resolvedRoutes.push({ ...dr, routePath: value });
974
+ }
975
+ allDecoratorRoutes.length = 0;
976
+ for (const dr of resolvedRoutes)
977
+ allDecoratorRoutes.push(dr);
978
+ if (isDev && skipped > 0) {
979
+ logger.info(` 🧩 Resolved composed route constants; ${skipped} unresolved route(s) skipped`);
980
+ }
981
+ }
928
982
  // Workers emit two kinds of records per Python file:
929
983
  // • `routerIncludes` — every `app.include_router(<routerExpr>, prefix='/x')`
930
984
  // site, where `routerExpr` is either `<module>.router` (Shape A) or a
@@ -48,8 +48,6 @@ export interface ParseOutput {
48
48
  model: MutableSemanticModel;
49
49
  /** Pass-through: all file paths for downstream phases. */
50
50
  readonly allPaths: readonly string[];
51
- /** Pass-through: shared `allPathSet` from structure (built once, not per-phase). */
52
- readonly allPathSet: ReadonlySet<string>;
53
51
  /** Pass-through: total file count for progress reporting. */
54
52
  totalFiles: number;
55
53
  /**
@@ -19,14 +19,23 @@ import { getPhaseOutput } from './types.js';
19
19
  import { runChunkedParseAndResolve } from './parse-impl.js';
20
20
  export const parsePhase = {
21
21
  name: 'parse',
22
- deps: ['structure', 'markdown', 'cobol'],
22
+ deps: ['structure', 'standaloneIngest', 'markdown', 'cobol'],
23
23
  async execute(ctx, deps) {
24
- const { scannedFiles, allPaths, allPathSet, totalFiles } = getPhaseOutput(deps, 'structure');
24
+ const structure = getPhaseOutput(deps, 'structure');
25
+ const { totalFiles } = structure;
26
+ // Files claimed by a standalone ingester must not be parsed a second time.
27
+ const standaloneIngest = getPhaseOutput(deps, 'standaloneIngest');
28
+ const ingested = standaloneIngest.ingestedFiles;
29
+ const scannedFiles = ingested.size
30
+ ? structure.scannedFiles.filter((f) => !ingested.has(f.path))
31
+ : structure.scannedFiles;
32
+ const allPaths = ingested.size
33
+ ? structure.allPaths.filter((p) => !ingested.has(p))
34
+ : structure.allPaths;
25
35
  const result = await runChunkedParseAndResolve(ctx.graph, scannedFiles, allPaths, totalFiles, ctx.repoPath, ctx.pipelineStart, ctx.onProgress, ctx.options);
26
36
  return {
27
37
  ...result,
28
38
  allPaths,
29
- allPathSet,
30
39
  totalFiles,
31
40
  };
32
41
  },
@@ -13,4 +13,12 @@ import { type ProcessDetectionResult } from '../process-processor.js';
13
13
  export interface ProcessesOutput {
14
14
  processResult: ProcessDetectionResult;
15
15
  }
16
+ /**
17
+ * Compute the dynamic max-processes budget from the symbol count.
18
+ *
19
+ * Scales proportionally (symbolCount / 10) with a floor of 20.
20
+ * Prior to #2198 this was capped at 300 via `Math.min(300, …)`,
21
+ * silently truncating process detection on large repositories.
22
+ */
23
+ export declare function computeDynamicMaxProcesses(symbolCount: number): number;
16
24
  export declare const processesPhase: PipelinePhase<ProcessesOutput>;
@@ -14,6 +14,16 @@ import { generateId } from '../../../lib/utils.js';
14
14
  import { routeNodeKey } from '../route-extractors/route-path.js';
15
15
  import { isDev } from '../utils/env.js';
16
16
  import { logger } from '../../logger.js';
17
+ /**
18
+ * Compute the dynamic max-processes budget from the symbol count.
19
+ *
20
+ * Scales proportionally (symbolCount / 10) with a floor of 20.
21
+ * Prior to #2198 this was capped at 300 via `Math.min(300, …)`,
22
+ * silently truncating process detection on large repositories.
23
+ */
24
+ export function computeDynamicMaxProcesses(symbolCount) {
25
+ return Math.max(20, Math.round(symbolCount / 10));
26
+ }
17
27
  export const processesPhase = {
18
28
  name: 'processes',
19
29
  // `structure` supplies `totalFiles` (progress counter) without the spurious
@@ -37,7 +47,7 @@ export const processesPhase = {
37
47
  if (n.label !== 'File')
38
48
  symbolCount++;
39
49
  });
40
- const dynamicMaxProcesses = Math.max(20, Math.min(300, Math.round(symbolCount / 10)));
50
+ const dynamicMaxProcesses = computeDynamicMaxProcesses(symbolCount);
41
51
  const processResult = await processProcesses(ctx.graph, communityResult.memberships, (message, progress) => {
42
52
  const processProgress = 99 + progress * 0.01;
43
53
  ctx.onProgress({
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Phase: springConfig
3
+ *
4
+ * Adds key-only nodes for statically readable Spring
5
+ * `application*.properties` / `application*.yml` / `application*.yaml` files.
6
+ * Language-specific ScopeResolver hooks attach consumers later. Configuration
7
+ * values are deliberately never copied into the graph because they may contain
8
+ * credentials and key identity is sufficient for impact analysis.
9
+ *
10
+ * @deps structure
11
+ * @reads Spring application configuration files
12
+ * @writes Property nodes and DEFINES edges
13
+ */
14
+ import type { PipelinePhase } from './types.js';
15
+ export interface SpringConfigKey {
16
+ readonly key: string;
17
+ readonly filePath: string;
18
+ readonly line: number;
19
+ readonly profile?: string;
20
+ readonly format: 'properties' | 'yaml';
21
+ }
22
+ interface SpringConfigFile {
23
+ readonly filePath: string;
24
+ readonly profile?: string;
25
+ readonly format: SpringConfigKey['format'];
26
+ }
27
+ export interface SpringConfigOutput {
28
+ readonly configKeys: number;
29
+ }
30
+ /** Match only Spring Boot's conventional application config file names. */
31
+ export declare function classifySpringConfigFile(filePath: string): SpringConfigFile | null;
32
+ /** Parse `.properties` keys without retaining their values. */
33
+ export declare function parseSpringProperties(content: string, filePath: string, profile?: string): SpringConfigKey[];
34
+ /** Parse and flatten YAML leaves without retaining their values. */
35
+ export declare function parseSpringYaml(content: string, filePath: string, profile?: string): SpringConfigKey[];
36
+ export declare const springConfigPhase: PipelinePhase<SpringConfigOutput>;
37
+ export {};