gitnexus 1.6.8-rc.9 → 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 (430) 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 +11 -0
  135. package/dist/core/ingestion/languages/c-cpp.js +6 -1
  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 +3 -0
  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 +23 -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/parse-worker.d.ts +13 -0
  238. package/dist/core/ingestion/workers/parse-worker.js +76 -17
  239. package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
  240. package/dist/core/ingestion/workers/worker-pool.js +15 -2
  241. package/dist/core/lbug/csv-generator.d.ts +51 -3
  242. package/dist/core/lbug/csv-generator.js +369 -255
  243. package/dist/core/lbug/lbug-adapter.d.ts +58 -18
  244. package/dist/core/lbug/lbug-adapter.js +346 -84
  245. package/dist/core/lbug/lbug-config.d.ts +19 -0
  246. package/dist/core/lbug/lbug-config.js +29 -0
  247. package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
  248. package/dist/core/lbug/pdg-emit-sink.js +358 -0
  249. package/dist/core/lbug/pool-adapter.d.ts +35 -0
  250. package/dist/core/lbug/pool-adapter.js +90 -1
  251. package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
  252. package/dist/core/lbug/rel-pair-routing.js +140 -0
  253. package/dist/core/lbug/schema.d.ts +2 -2
  254. package/dist/core/lbug/schema.js +3 -0
  255. package/dist/core/logger.d.ts +0 -5
  256. package/dist/core/run-analyze.d.ts +96 -0
  257. package/dist/core/run-analyze.js +207 -3
  258. package/dist/core/tree-sitter/parser-loader.js +5 -4
  259. package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
  260. package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
  261. package/dist/core/tree-sitter/vendored-grammars.js +57 -0
  262. package/dist/core/wiki/generator.js +3 -1
  263. package/dist/core/wiki/graph-queries.d.ts +6 -0
  264. package/dist/core/wiki/graph-queries.js +9 -1
  265. package/dist/mcp/http-transport.d.ts +134 -0
  266. package/dist/mcp/http-transport.js +503 -0
  267. package/dist/mcp/local/local-backend.d.ts +110 -24
  268. package/dist/mcp/local/local-backend.js +1225 -19
  269. package/dist/mcp/local/pdg-impact.d.ts +384 -0
  270. package/dist/mcp/local/pdg-impact.js +1972 -0
  271. package/dist/mcp/resources.js +13 -1
  272. package/dist/mcp/tools.d.ts +12 -0
  273. package/dist/mcp/tools.js +214 -7
  274. package/dist/server/analyze-launch.d.ts +29 -0
  275. package/dist/server/analyze-launch.js +137 -0
  276. package/dist/server/analyze-upload.d.ts +33 -0
  277. package/dist/server/analyze-upload.js +123 -0
  278. package/dist/server/analyze-worker.d.ts +17 -1
  279. package/dist/server/api.d.ts +17 -0
  280. package/dist/server/api.js +132 -168
  281. package/dist/server/git-clone.d.ts +43 -2
  282. package/dist/server/git-clone.js +211 -16
  283. package/dist/server/mcp-http.d.ts +5 -6
  284. package/dist/server/mcp-http.js +9 -82
  285. package/dist/server/middleware.d.ts +40 -0
  286. package/dist/server/middleware.js +92 -0
  287. package/dist/server/private-ip.d.ts +1 -0
  288. package/dist/server/private-ip.js +15 -0
  289. package/dist/server/upload-ingest.d.ts +56 -0
  290. package/dist/server/upload-ingest.js +276 -0
  291. package/dist/server/upload-paths.d.ts +37 -0
  292. package/dist/server/upload-paths.js +57 -0
  293. package/dist/server/upload-sweep.d.ts +20 -0
  294. package/dist/server/upload-sweep.js +57 -0
  295. package/dist/storage/git.js +5 -8
  296. package/dist/storage/parse-cache.d.ts +22 -1
  297. package/dist/storage/parse-cache.js +41 -10
  298. package/dist/storage/repo-manager.d.ts +121 -10
  299. package/dist/storage/repo-manager.js +43 -5
  300. package/dist/types/pipeline.d.ts +9 -0
  301. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
  302. package/hooks/claude/gitnexus-hook.cjs +110 -13
  303. package/hooks/claude/hook-db-lock-probe.cjs +513 -26
  304. package/package.json +8 -2
  305. package/scripts/assert-publish-grammar-coverage.cjs +31 -0
  306. package/scripts/build-tree-sitter-grammars.cjs +16 -10
  307. package/scripts/cross-platform-tests.ts +1 -0
  308. package/skills/gitnexus-debugging.md +16 -4
  309. package/skills/gitnexus-exploring.md +3 -3
  310. package/skills/gitnexus-guide.md +33 -0
  311. package/skills/gitnexus-pdg-query.md +89 -0
  312. package/skills/gitnexus-refactoring.md +1 -1
  313. package/skills/gitnexus-taint-analysis.md +178 -0
  314. package/vendor/tree-sitter-c/package.json +1 -1
  315. package/vendor/tree-sitter-dart/package.json +1 -1
  316. package/vendor/tree-sitter-kotlin/package.json +1 -1
  317. package/vendor/tree-sitter-proto/package.json +1 -1
  318. package/vendor/tree-sitter-swift/package.json +1 -1
  319. package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
  320. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
  321. package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
  322. package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
  323. package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
  324. package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
  325. package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
  326. package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
  327. package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
  328. package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
  329. package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
  330. package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
  331. package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
  332. package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
  333. package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
  334. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
  335. package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
  336. package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
  337. package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
  338. package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
  339. package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
  340. package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
  341. package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
  342. package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
  343. package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
  344. package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
  345. package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
  346. package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
  347. package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
  348. package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
  349. package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
  350. package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
  351. package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
  352. package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
  353. package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
  354. package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
  355. package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
  356. package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
  357. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
  358. package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
  359. package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
  360. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
  361. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
  362. package/web/assets/index-BvYev1UJ.js +635 -0
  363. package/web/assets/index-_lgn7hs5.css +2 -0
  364. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
  365. package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
  366. package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
  367. package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
  368. package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
  369. package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
  370. package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
  371. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
  372. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
  373. package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
  374. package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
  375. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
  376. package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
  377. package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
  378. package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
  379. package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
  380. package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
  381. package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
  382. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
  383. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
  384. package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
  385. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
  386. package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
  387. package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
  388. package/web/index.html +13 -15
  389. package/scripts/materialize-vendor-grammars.cjs +0 -97
  390. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
  391. package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
  392. package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
  393. package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
  394. package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
  395. package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
  396. package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
  397. package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
  398. package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
  399. package/web/assets/chunk-CilyBKbf.js +0 -1
  400. package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
  401. package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
  402. package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
  403. package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
  404. package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
  405. package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
  406. package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
  407. package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
  408. package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
  409. package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
  410. package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
  411. package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
  412. package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
  413. package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
  414. package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
  415. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
  416. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
  417. package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
  418. package/web/assets/index-BKWA-m7o.css +0 -2
  419. package/web/assets/index-CG6q8eTs.js +0 -626
  420. package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
  421. package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
  422. package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
  423. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
  424. package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
  425. package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
  426. package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
  427. package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
  428. package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
  429. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
  430. /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
package/dist/cli/tool.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Direct CLI Tool Commands
3
3
  *
4
- * Exposes GitNexus tools (query, context, impact, cypher) as direct CLI commands.
4
+ * Exposes GitNexus tools (query, context, impact, cypher, check) as direct CLI commands.
5
5
  * Bypasses MCP entirely — invokes LocalBackend directly for minimal overhead.
6
6
  *
7
7
  * Usage:
@@ -62,7 +62,8 @@ export async function queryCommand(queryText, options) {
62
62
  }
63
63
  const backend = await getBackend();
64
64
  const result = await backend.callTool('query', {
65
- query: queryText,
65
+ // #2175: canonical param is search_query; the backend still accepts legacy "query".
66
+ search_query: queryText,
66
67
  task_context: options?.context,
67
68
  goal: options?.goal,
68
69
  limit: options?.limit ? parseInt(options.limit) : undefined,
@@ -119,12 +120,23 @@ export async function impactCommand(target, options) {
119
120
  const rawOffset = parseInt(options?.offset ?? '', 10);
120
121
  const parsedLimit = Number.isFinite(rawLimit) ? rawLimit : undefined;
121
122
  const parsedOffset = Number.isFinite(rawOffset) ? rawOffset : undefined;
123
+ // `--line` is a PDG-only statement anchor (1-based source line). Parse it to
124
+ // an integer when provided and thread it ONLY when present, so the backend's
125
+ // line-without-pdg / non-positive-integer validation fires on the real value
126
+ // rather than on a silently-dropped flag. A non-numeric `--line` parses to
127
+ // NaN, which the backend rejects as a non-positive integer (loud, not silent).
128
+ const parsedLine = options?.line !== undefined ? parseInt(options.line, 10) : undefined;
122
129
  const result = await backend.callTool('impact', {
123
130
  target: target || undefined,
124
131
  target_uid: options?.uid,
125
132
  file_path: options?.file,
126
133
  kind: options?.kind,
127
134
  direction: options?.direction || 'upstream',
135
+ // Forward the engine selector; backend validates the enum (callgraph/pdg)
136
+ // and treats the default 'callgraph' identically to an omitted mode.
137
+ mode: options?.mode,
138
+ // PDG-only statement anchor — forwarded only when --line was given.
139
+ ...(parsedLine !== undefined ? { line: parsedLine } : {}),
128
140
  maxDepth: options?.depth ? parseInt(options.depth, 10) : undefined,
129
141
  includeTests: options?.includeTests ?? false,
130
142
  repo: options?.repo,
@@ -154,7 +166,8 @@ export async function cypherCommand(query, options) {
154
166
  }
155
167
  const backend = await getBackend();
156
168
  const result = await backend.callTool('cypher', {
157
- query,
169
+ // #2175: canonical param is statement; the backend still accepts legacy "query".
170
+ statement: query,
158
171
  repo: options?.repo,
159
172
  branch: options?.branch,
160
173
  });
@@ -170,3 +183,83 @@ export async function detectChangesCommand(options) {
170
183
  });
171
184
  output(formatDetectChangesResult(result));
172
185
  }
186
+ export async function checkCommand(options) {
187
+ if (!options?.cycles) {
188
+ process.stderr.write('Usage: gitnexus check --cycles [--json]\n');
189
+ process.exitCode = 1;
190
+ return;
191
+ }
192
+ try {
193
+ const backend = await getBackend();
194
+ const result = await backend.callTool('check', {
195
+ cycles: true,
196
+ repo: options.repo,
197
+ branch: options.branch,
198
+ });
199
+ if (result?.error) {
200
+ output(result);
201
+ process.exitCode = 1;
202
+ return;
203
+ }
204
+ if (options.json) {
205
+ output(result);
206
+ }
207
+ else if (result.cycleCount === 0) {
208
+ output('No circular imports found.');
209
+ }
210
+ else {
211
+ output(result.cycles.map((cycle) => cycle.files.join(' -> ')).join('\n'));
212
+ }
213
+ if (result.cycleCount > 0)
214
+ process.exitCode = 1;
215
+ }
216
+ catch (error) {
217
+ output({ error: error instanceof Error ? error.message : String(error) });
218
+ process.exitCode = 1;
219
+ }
220
+ }
221
+ export async function traceCommand(from, to, options) {
222
+ if (options?.fromUid?.startsWith('--') || options?.toUid?.startsWith('--')) {
223
+ cliErrorKey('tool.usage.trace');
224
+ process.exit(1);
225
+ }
226
+ if ((!from?.trim() && !options?.fromUid) || (!to?.trim() && !options?.toUid)) {
227
+ cliErrorKey('tool.usage.trace');
228
+ process.exit(1);
229
+ }
230
+ // Reject a non-numeric / non-positive --depth up front rather than forwarding
231
+ // NaN (which the backend would silently treat as the default).
232
+ if (options?.depth !== undefined) {
233
+ const parsedDepth = Number(options.depth);
234
+ if (!Number.isInteger(parsedDepth) || parsedDepth < 1) {
235
+ cliErrorKey('tool.usage.trace');
236
+ process.exit(1);
237
+ }
238
+ }
239
+ try {
240
+ const backend = await getBackend();
241
+ const result = await backend.callTool('trace', {
242
+ from: from || undefined,
243
+ from_uid: options?.fromUid,
244
+ from_file: options?.fromFile,
245
+ to: to || undefined,
246
+ to_uid: options?.toUid,
247
+ to_file: options?.toFile,
248
+ maxDepth: options?.depth ? parseInt(options.depth, 10) : undefined,
249
+ includeTests: options?.includeTests ?? false,
250
+ repo: options?.repo,
251
+ branch: options?.branch,
252
+ });
253
+ output(result);
254
+ }
255
+ catch (err) {
256
+ output({
257
+ status: 'error',
258
+ error: (err instanceof Error ? err.message : String(err)) || 'Trace analysis failed unexpectedly',
259
+ from: { name: from },
260
+ to: { name: to },
261
+ suggestion: 'Try gitnexus context <symbol> to see connections, or check if an interface bridges them.',
262
+ });
263
+ process.exit(1);
264
+ }
265
+ }
@@ -13,66 +13,6 @@ export declare const CB_RESET_TIMEOUT_MS = 60000;
13
13
  export declare const HF_MAX_TIMEOUT_MS: number;
14
14
  /** Upper bound clamped on the env-override attempt count. */
15
15
  export declare const HF_MAX_ATTEMPTS_CAP = 10;
16
- /**
17
- * @internal Exported only for unit tests and the two embedder entry points
18
- * (`core/embeddings/embedder.ts` + `mcp/core/embedder.ts`). Not part of the
19
- * public package API.
20
- *
21
- * Minimal subset of `@huggingface/transformers`' `env` object that gitnexus
22
- * mutates. Defining a local structural type keeps this helper free of a
23
- * transitive dependency on transformers' generated `.d.ts` while still
24
- * giving full type-checking on the two fields we actually touch.
25
- */
26
- export interface HfEnvSubset {
27
- cacheDir: string;
28
- remoteHost: string;
29
- }
30
- /**
31
- * @internal Exported only for unit tests and the two embedder entry points
32
- * (`core/embeddings/embedder.ts` + `mcp/core/embedder.ts`). Not part of the
33
- * public package API.
34
- *
35
- * Apply user-controlled HuggingFace environment overrides to the
36
- * `@huggingface/transformers` `env` object. Centralises the two env-var
37
- * bridges so every gitnexus embedder entry point (the analyze pipeline
38
- * and the MCP server) behaves identically.
39
- *
40
- * - **`HF_HOME`** → `env.cacheDir` (default: `~/.cache/huggingface`).
41
- * transformers.js otherwise defaults to `./node_modules/.cache` inside
42
- * its own install dir, which is unwritable when gitnexus is installed
43
- * globally (e.g. `/usr/lib/node_modules/`).
44
- *
45
- * - **`HF_ENDPOINT`** → `env.remoteHost` (#1205). transformers.js does
46
- * not read `HF_ENDPOINT` on its own — it reads `env.remoteHost` —
47
- * even though `HF_ENDPOINT` is the standard env var the upstream
48
- * `huggingface_hub` Python client and the official HF mirror docs
49
- * tell users to set. Bridging the two unblocks `--embeddings` for
50
- * users behind networks where `huggingface.co` is unreachable
51
- * (corporate proxies, the GFW, air-gapped mirrors). The trailing
52
- * slash is normalised because transformers.js builds URLs by string
53
- * concatenation and a missing slash silently falls through to its
54
- * default `huggingface.co/...` host.
55
- *
56
- * Mutation rather than return-and-apply because callers already hold a
57
- * reference to the live `env` object imported from
58
- * `@huggingface/transformers` — passing the same reference in keeps the
59
- * call site a single line at each entry point.
60
- */
61
- export declare function applyHfEnvOverrides(env: HfEnvSubset): void;
62
- /**
63
- * @internal Exported for unit tests and the two embedder entry points.
64
- *
65
- * Returns true when an error message indicates a network-level fetch failure
66
- * during HuggingFace model download (e.g. `TypeError: fetch failed`,
67
- * `ECONNREFUSED`, `ENOTFOUND`, `ETIMEDOUT`, `ECONNRESET`).
68
- *
69
- * These errors are not device-specific and cannot be fixed by falling back to
70
- * a different ONNX device — the caller should rethrow immediately with
71
- * guidance about `HF_ENDPOINT`.
72
- */
73
- export declare function isNetworkFetchError(message: string): boolean;
74
- /** @internal Used by `withHfDownloadRetry` to mark a circuit-open rejection. */
75
- export declare const CIRCUIT_OPEN_TAG = "hf-circuit-open";
76
16
  /**
77
17
  * Module-level singleton shared by both embedder entry points
78
18
  * (`core/embeddings/embedder.ts` + `mcp/core/embedder.ts`). Per-process
@@ -82,18 +22,12 @@ export declare const CIRCUIT_OPEN_TAG = "hf-circuit-open";
82
22
  * recovery-time stampedes).
83
23
  */
84
24
  export declare const hfDownloadCircuit: CircuitBreaker;
85
- /** @internal Returns true for errors that should abort without retry (circuit-open). */
86
- export declare function isHfCircuitOpenError(message: string): boolean;
87
25
  /**
88
26
  * Returns true for any HuggingFace download failure that warrants showing the
89
27
  * `HF_ENDPOINT` remediation hint: either a raw network error or a
90
28
  * circuit-open rejection (which itself was caused by repeated network errors).
91
29
  */
92
30
  export declare function isHfDownloadFailure(message: string): boolean;
93
- /** @internal Wraps `fn` in a hard time-limit. The timeout error contains
94
- * `ETIMEDOUT` so that `isNetworkFetchError` classifies it correctly.
95
- */
96
- export declare function withDownloadTimeout<T>(fn: () => Promise<T>, timeoutMs: number): Promise<T>;
97
31
  export interface HfRetryOptions {
98
32
  /** Maximum total attempts including the initial one (default: `HF_MAX_ATTEMPTS`). */
99
33
  maxAttempts?: number;
@@ -19,6 +19,13 @@ export declare const isHttpMode: () => boolean;
19
19
  * if HTTP mode is not active or no explicit dimensions are set.
20
20
  */
21
21
  export declare const getHttpDimensions: () => number | undefined;
22
+ /**
23
+ * Return a safe representation of a URL for logs and error messages.
24
+ * Strips query string (may contain tokens) and userinfo (may contain
25
+ * credentials), keeping protocol + host + path. Exported so the CLI's
26
+ * custom-endpoint confirmation can mask the same way.
27
+ */
28
+ export declare const safeUrl: (url: string) => string;
22
29
  /**
23
30
  * Embed texts via the HTTP backend, splitting into batches.
24
31
  * Reads config from env vars on every call.
@@ -56,10 +56,12 @@ export const isHttpMode = () => readConfig() !== null;
56
56
  */
57
57
  export const getHttpDimensions = () => readConfig()?.dimensions;
58
58
  /**
59
- * Return a safe representation of a URL for error messages.
60
- * Strips query string (may contain tokens) and userinfo.
59
+ * Return a safe representation of a URL for logs and error messages.
60
+ * Strips query string (may contain tokens) and userinfo (may contain
61
+ * credentials), keeping protocol + host + path. Exported so the CLI's
62
+ * custom-endpoint confirmation can mask the same way.
61
63
  */
62
- const safeUrl = (url) => {
64
+ export const safeUrl = (url) => {
63
65
  try {
64
66
  const u = new URL(url);
65
67
  return `${u.protocol}//${u.host}${u.pathname}`;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Server Mapping Configuration
3
3
  *
4
- * Reads ~/.gitnexus/server-mapping.json to map repo names to service names.
4
+ * Reads getGlobalDir()/server-mapping.json to map repo names to service names.
5
5
  * Used in embedding text to enrich metadata with microservice context.
6
6
  */
7
7
  /**
@@ -1,13 +1,17 @@
1
1
  /**
2
2
  * Server Mapping Configuration
3
3
  *
4
- * Reads ~/.gitnexus/server-mapping.json to map repo names to service names.
4
+ * Reads getGlobalDir()/server-mapping.json to map repo names to service names.
5
5
  * Used in embedding text to enrich metadata with microservice context.
6
6
  */
7
7
  import fs from 'fs/promises';
8
8
  import path from 'path';
9
- import os from 'os';
10
- const MAPPING_FILE = path.join(os.homedir(), '.gitnexus', 'server-mapping.json');
9
+ import { getGlobalDir } from '../../storage/repo-manager.js';
10
+ // Sourced from getGlobalDir() so it honors GITNEXUS_HOME (the Docker image sets
11
+ // GITNEXUS_HOME=/data/gitnexus); falls back to ~/.gitnexus when unset. Wrapped in
12
+ // path.resolve() for parity with the clone/upload roots (git-clone.ts CLONE_ROOT,
13
+ // upload-paths.ts UPLOAD_ROOT) so a relative GITNEXUS_HOME still yields an absolute path.
14
+ const MAPPING_FILE = path.resolve(path.join(getGlobalDir(), 'server-mapping.json'));
11
15
  let cachedMapping = null;
12
16
  /**
13
17
  * Read the server mapping file and return the serverName for a given repoName.
@@ -0,0 +1,10 @@
1
+ interface ImportEdge {
2
+ source: string;
3
+ target: string;
4
+ }
5
+ /**
6
+ * Return one deterministic concrete cycle for every cyclic strongly connected
7
+ * component in the file import graph.
8
+ */
9
+ export declare function findImportCycles(edges: ImportEdge[]): string[][];
10
+ export {};
@@ -0,0 +1,103 @@
1
+ function findCyclePath(component, adjacency) {
2
+ const allowed = new Set(component);
3
+ const start = component[0];
4
+ const parents = new Map([[start, null]]);
5
+ const queue = [start];
6
+ for (let index = 0; index < queue.length; index += 1) {
7
+ const node = queue[index];
8
+ for (const next of adjacency.get(node) ?? []) {
9
+ if (!allowed.has(next))
10
+ continue;
11
+ if (next === start) {
12
+ const path = [];
13
+ let cursor = node;
14
+ while (cursor !== null) {
15
+ path.push(cursor);
16
+ cursor = parents.get(cursor) ?? null;
17
+ }
18
+ path.reverse();
19
+ return [...path, start];
20
+ }
21
+ if (parents.has(next))
22
+ continue;
23
+ parents.set(next, node);
24
+ queue.push(next);
25
+ }
26
+ }
27
+ throw new Error('Invariant violation: no cycle found through SCC root.');
28
+ }
29
+ /**
30
+ * Return one deterministic concrete cycle for every cyclic strongly connected
31
+ * component in the file import graph.
32
+ */
33
+ export function findImportCycles(edges) {
34
+ const adjacency = new Map();
35
+ for (const { source, target } of edges) {
36
+ if (!source || !target)
37
+ continue;
38
+ const targets = adjacency.get(source) ?? new Set();
39
+ targets.add(target);
40
+ adjacency.set(source, targets);
41
+ if (!adjacency.has(target))
42
+ adjacency.set(target, new Set());
43
+ }
44
+ const sortedAdjacency = new Map([...adjacency].map(([node, targets]) => [node, [...targets].sort()]));
45
+ const reverseAdjacency = new Map();
46
+ for (const node of sortedAdjacency.keys())
47
+ reverseAdjacency.set(node, []);
48
+ for (const [source, targets] of sortedAdjacency) {
49
+ for (const target of targets)
50
+ reverseAdjacency.get(target).push(source);
51
+ }
52
+ for (const sources of reverseAdjacency.values())
53
+ sources.sort();
54
+ const visited = new Set();
55
+ const finishOrder = [];
56
+ const components = [];
57
+ for (const start of [...sortedAdjacency.keys()].sort()) {
58
+ if (visited.has(start))
59
+ continue;
60
+ visited.add(start);
61
+ const stack = [{ node: start, nextIndex: 0 }];
62
+ while (stack.length > 0) {
63
+ const frame = stack[stack.length - 1];
64
+ const neighbors = sortedAdjacency.get(frame.node) ?? [];
65
+ if (frame.nextIndex < neighbors.length) {
66
+ const next = neighbors[frame.nextIndex++];
67
+ if (!visited.has(next)) {
68
+ visited.add(next);
69
+ stack.push({ node: next, nextIndex: 0 });
70
+ }
71
+ }
72
+ else {
73
+ finishOrder.push(frame.node);
74
+ stack.pop();
75
+ }
76
+ }
77
+ }
78
+ visited.clear();
79
+ for (let index = finishOrder.length - 1; index >= 0; index -= 1) {
80
+ const start = finishOrder[index];
81
+ if (visited.has(start))
82
+ continue;
83
+ const component = [];
84
+ const stack = [start];
85
+ visited.add(start);
86
+ while (stack.length > 0) {
87
+ const node = stack.pop();
88
+ component.push(node);
89
+ for (const next of reverseAdjacency.get(node) ?? []) {
90
+ if (visited.has(next))
91
+ continue;
92
+ visited.add(next);
93
+ stack.push(next);
94
+ }
95
+ }
96
+ component.sort();
97
+ components.push(component);
98
+ }
99
+ return components
100
+ .filter((component) => component.length > 1 || (sortedAdjacency.get(component[0]) ?? []).includes(component[0]))
101
+ .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
102
+ .map((component) => findCyclePath(component, sortedAdjacency));
103
+ }
@@ -2,7 +2,7 @@
2
2
  * Cross-repo impact (Phase 1 local walk + Phase 2 bridge fan-out).
3
3
  * All bridge Cypher for this feature lives in this module.
4
4
  */
5
- import type { GroupImpactResult } from './types.js';
5
+ import type { CrossRepoImpact, GroupImpactResult } from './types.js';
6
6
  import type { GroupToolPort } from './service.js';
7
7
  /** Cross-boundary hops beyond this value are clamped (multi-hop reserved for future work). */
8
8
  export declare const MAX_SUPPORTED_CROSS_DEPTH = 1;
@@ -79,6 +79,7 @@ export declare function collectImpactSymbolUids(local: unknown, servicePrefix: s
79
79
  uids: string[];
80
80
  targetFilePath?: string;
81
81
  };
82
+ export declare function mergeRisk(localRisk: string, cross: CrossRepoImpact[]): string;
82
83
  export declare function runGroupImpact(deps: RunGroupImpactDeps, params: Record<string, unknown>): Promise<GroupImpactResult | {
83
84
  error: string;
84
85
  }>;
@@ -251,7 +251,11 @@ function extractProcessNames(impact) {
251
251
  return [];
252
252
  return o.affected_processes.map((p) => String(p.name ?? '')).filter(Boolean);
253
253
  }
254
- function mergeRisk(localRisk, cross) {
254
+ // Exported so the U4 PDG-result interchangeability contract (KTD8) can assert
255
+ // permanently that a PDG `risk:'UNKNOWN'` never coalesces to a confident `LOW`.
256
+ // No behavior change — `'UNKNOWN'` was already handled correctly at the
257
+ // `(localRisk === 'LOW' || localRisk === 'UNKNOWN')` branch below.
258
+ export function mergeRisk(localRisk, cross) {
255
259
  const highConf = cross.some((c) => c.contract.confidence >= 0.85);
256
260
  if (localRisk === 'CRITICAL')
257
261
  return 'CRITICAL';
@@ -1,23 +1,27 @@
1
1
  import { createRequire } from 'node:module';
2
+ import { requireVendoredGrammar } from '../../../tree-sitter/vendored-grammars.js';
2
3
  import { compilePatterns, runCompiledPatterns, } from '../tree-sitter-scanner.js';
3
4
  /**
4
5
  * Protobuf (.proto) tree-sitter plugin for gRPC contract extraction.
5
6
  *
6
- * Uses `tree-sitter-proto` (coder3101/tree-sitter-proto) as an
7
- * optionalDependency if the grammar is not installed (e.g. native
8
- * compilation failed on an unusual platform), the plugin exports
9
- * `null` and the orchestrator falls back to the existing manual
10
- * string-sanitizing parser.
7
+ * Uses `tree-sitter-proto` (coder3101/tree-sitter-proto), loaded from
8
+ * `vendor/` by absolute path (NEVER copied into node_modules see
9
+ * vendored-grammars.ts / #2111). If the grammar's binding cannot be loaded
10
+ * (e.g. no prebuild for an unusual platform), the plugin exports `null` and the
11
+ * orchestrator falls back to the existing manual string-sanitizing parser.
11
12
  *
12
13
  * The grammar is vendored in `vendor/tree-sitter-proto/` with
13
14
  * parser.c regenerated against tree-sitter-cli 0.24 (ABI version 14)
14
15
  * so it is compatible with the project's tree-sitter 0.21.1 runtime
15
16
  * (which loads ABI 13–14).
16
17
  */
18
+ // Only for `tree-sitter` (a real npm dependency) in the smoke-test below;
19
+ // the vendored grammar goes through requireVendoredGrammar (never a bare
20
+ // `_require('tree-sitter-proto')`, which would force a node_modules copy — #2111).
17
21
  const _require = createRequire(import.meta.url);
18
22
  let ProtoGrammar = null;
19
23
  try {
20
- ProtoGrammar = _require('tree-sitter-proto');
24
+ ProtoGrammar = requireVendoredGrammar('tree-sitter-proto');
21
25
  }
22
26
  catch {
23
27
  // Grammar not installed — PROTO_GRPC_PLUGIN will be null.
@@ -1,4 +1,4 @@
1
- import { createRequire } from 'node:module';
1
+ import { requireVendoredGrammar } from '../../../tree-sitter/vendored-grammars.js';
2
2
  import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-sitter-scanner.js';
3
3
  /**
4
4
  * Kotlin HTTP plugin (Spring providers + consumers).
@@ -52,15 +52,15 @@ import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-s
52
52
  * value_argument
53
53
  * string_literal ← the path
54
54
  *
55
- * tree-sitter-kotlin is an optional npm dependency when its native
56
- * binding is unavailable the plugin gracefully exports `null` and
57
- * `http-patterns/index.ts` skips registration for `.kt`/`.kts` files.
55
+ * tree-sitter-kotlin is a vendored grammar loaded from `vendor/` by absolute
56
+ * path (NEVER copied into node_modules see vendored-grammars.ts / #2111) —
57
+ * when its native binding is unavailable the plugin gracefully exports `null`
58
+ * and `http-patterns/index.ts` skips registration for `.kt`/`.kts` files.
58
59
  */
59
- const _require = createRequire(import.meta.url);
60
- /** Loaded lazily; null when the grammar binding isn't installed. */
60
+ /** Loaded lazily; null when the grammar binding isn't available. */
61
61
  let Kotlin = null;
62
62
  try {
63
- Kotlin = _require('tree-sitter-kotlin');
63
+ Kotlin = requireVendoredGrammar('tree-sitter-kotlin');
64
64
  }
65
65
  catch {
66
66
  Kotlin = null;
@@ -1,5 +1,29 @@
1
1
  import type { ContractExtractor, CypherExecutor } from '../contract-extractor.js';
2
2
  import type { ExtractedContract, RepoHandle } from '../types.js';
3
+ /**
4
+ * Language-agnostic orchestrator for HTTP route (provider + consumer)
5
+ * contract extraction. Two strategies, in order of preference per role:
6
+ *
7
+ * 1. **Graph-assisted (Strategy A)** — if a per-repo LadybugDB executor
8
+ * is available, read `HANDLES_ROUTE` / `FETCHES` Cypher edges that
9
+ * the ingestion pipeline already produced via tree-sitter. This is
10
+ * the preferred path because the graph has richer symbol metadata
11
+ * (real uids, class/method structure, etc.).
12
+ *
13
+ * 2. **Source-scan supplement (Strategy B)** — parse files directly with
14
+ * the per-language plugin registry in `./http-patterns/`. Used to
15
+ * fill gaps when graph extraction only covers part of a polyglot repo
16
+ * (e.g. Java graph routes plus Go source-scan routes). Graph entries
17
+ * remain authoritative for duplicate contract IDs because they carry
18
+ * richer symbol metadata. Each plugin owns its tree-sitter grammar
19
+ * and query sources — this orchestrator imports NO grammars or query
20
+ * strings.
21
+ *
22
+ * Adding a new language for Strategy B is a one-file edit in
23
+ * `http-patterns/index.ts`: register a new `HttpLanguagePlugin` and
24
+ * widen `HTTP_SCAN_GLOB` if needed.
25
+ */
26
+ export declare const HANDLES_ROUTE_QUERY = "\nMATCH (handlerFile:File)-[r:CodeRelation {type: 'HANDLES_ROUTE'}]->(route:Route)\nRETURN handlerFile.id AS fileId, handlerFile.filePath AS filePath,\n route.name AS routePath, route.id AS routeId,\n route.method AS routeMethod,\n route.responseKeys AS responseKeys,\n r.reason AS routeSource";
3
27
  /**
4
28
  * Canonicalize a provider-side HTTP path for contract-id generation:
5
29
  * - strip query string
@@ -4,6 +4,7 @@ import Parser from 'tree-sitter';
4
4
  import { createIgnoreFilter } from '../../../config/ignore-service.js';
5
5
  import { readSafe } from './fs-utils.js';
6
6
  import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
7
+ import { logger } from '../../logger.js';
7
8
  import { getPluginForFile, HTTP_SCAN_GLOB, } from './http-patterns/index.js';
8
9
  /**
9
10
  * Language-agnostic orchestrator for HTTP route (provider + consumer)
@@ -29,10 +30,14 @@ import { getPluginForFile, HTTP_SCAN_GLOB, } from './http-patterns/index.js';
29
30
  * widen `HTTP_SCAN_GLOB` if needed.
30
31
  */
31
32
  // ─── Graph-assisted queries ──────────────────────────────────────────
32
- const HANDLES_ROUTE_QUERY = `
33
+ // Exported so integration tests can run the exact production query against a
34
+ // real LadybugDB (guards the Route.method column contract — see
35
+ // route-method-roundtrip.test.ts).
36
+ export const HANDLES_ROUTE_QUERY = `
33
37
  MATCH (handlerFile:File)-[r:CodeRelation {type: 'HANDLES_ROUTE'}]->(route:Route)
34
38
  RETURN handlerFile.id AS fileId, handlerFile.filePath AS filePath,
35
39
  route.name AS routePath, route.id AS routeId,
40
+ route.method AS routeMethod,
36
41
  route.responseKeys AS responseKeys,
37
42
  r.reason AS routeSource`;
38
43
  const FETCHES_QUERY = `
@@ -273,14 +278,26 @@ export class HttpRouteExtractor {
273
278
  try {
274
279
  rows = await db(HANDLES_ROUTE_QUERY);
275
280
  }
276
- catch {
281
+ catch (err) {
282
+ // A failure here silently disables the entire graph-assisted HTTP
283
+ // provider path (the source-scan fallback still runs and masks most
284
+ // of the damage), so surface it at debug level to make a total
285
+ // outage observable instead of invisible.
286
+ logger.debug(`[http-route-extractor] HANDLES_ROUTE query failed; graph providers skipped: ${err instanceof Error ? err.message : String(err)}`);
277
287
  return [];
278
288
  }
279
289
  for (const row of rows) {
280
290
  const filePath = String(row.filePath ?? '');
281
291
  const routePath = String(row.routePath ?? '');
282
292
  const routeSource = String(row.routeSource ?? row.routeReason ?? '');
283
- let method = methodFromRouteReason(routeSource);
293
+ // Prefer the HTTP verb persisted on the Route node by the ingestion
294
+ // routes phase (Spring/Laravel framework routes and decorator routes
295
+ // carry it). Fall back to parsing it out of the edge reason for
296
+ // older indexes or filesystem routes that never stored a method.
297
+ const graphMethod = String(row.routeMethod ?? '')
298
+ .trim()
299
+ .toUpperCase();
300
+ let method = (graphMethod || null) ?? methodFromRouteReason(routeSource);
284
301
  // Look up handler name (and backfill method if missing) from the
285
302
  // plugin's scan of the handler file. This replaces the old
286
303
  // regex-based `inferMethodFromFileScan` and `pickJavaHandlerName`
@@ -396,7 +413,8 @@ export class HttpRouteExtractor {
396
413
  try {
397
414
  rows = await db(FETCHES_QUERY);
398
415
  }
399
- catch {
416
+ catch (err) {
417
+ logger.debug(`[http-route-extractor] FETCHES query failed; graph consumers skipped: ${err instanceof Error ? err.message : String(err)}`);
400
418
  return [];
401
419
  }
402
420
  for (const row of rows) {