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
@@ -51,6 +51,7 @@ export declare const zhCN: {
51
51
  'tool.usage.query': string;
52
52
  'tool.usage.context': string;
53
53
  'tool.usage.impact': string;
54
+ 'tool.usage.trace': string;
54
55
  'tool.usage.cypher': string;
55
56
  'tool.warn.unknownKind': string;
56
57
  'tool.detectChanges.noChanges': string;
@@ -124,8 +125,10 @@ export declare const zhCN: {
124
125
  'help.command.query.description': string;
125
126
  'help.command.context.description': string;
126
127
  'help.command.impact.description': string;
128
+ 'help.command.trace.description': string;
127
129
  'help.command.cypher.description': string;
128
130
  'help.command.detectChanges.description': string;
131
+ 'help.command.check.description': string;
129
132
  'help.command.evalServer.description': string;
130
133
  'help.command.group.description': string;
131
134
  'help.command.group.create.description': string;
@@ -137,6 +140,7 @@ export declare const zhCN: {
137
140
  'help.command.group.impact.description': string;
138
141
  'help.command.group.query.description': string;
139
142
  'help.command.group.contracts.description': string;
143
+ 'help.option.setup.codingAgent': string;
140
144
  'help.option.analyze.force': string;
141
145
  'help.option.analyze.repairFts': string;
142
146
  'help.option.analyze.embeddings': string;
@@ -162,6 +166,9 @@ export declare const zhCN: {
162
166
  'help.option.index.allowNonGit': string;
163
167
  'help.option.port': string;
164
168
  'help.option.serve.host': string;
169
+ 'help.option.mcp.http': string;
170
+ 'help.option.mcp.host': string;
171
+ 'help.option.mcp.authToken': string;
165
172
  'help.option.force.confirmation': string;
166
173
  'help.option.uninstall.force': string;
167
174
  'help.option.clean.all': string;
@@ -198,8 +205,15 @@ export declare const zhCN: {
198
205
  'help.option.impact.limit': string;
199
206
  'help.option.impact.offset': string;
200
207
  'help.option.impact.summaryOnly': string;
208
+ 'help.option.trace.fromUid': string;
209
+ 'help.option.trace.fromFile': string;
210
+ 'help.option.trace.toUid': string;
211
+ 'help.option.trace.toFile': string;
212
+ 'help.option.trace.depth': string;
213
+ 'help.option.trace.includeTests': string;
201
214
  'help.option.detectChanges.scope': string;
202
215
  'help.option.detectChanges.baseRef': string;
216
+ 'help.option.check.cycles': string;
203
217
  'help.option.evalServer.host': string;
204
218
  'help.option.evalServer.idleTimeout': string;
205
219
  'help.option.group.create.force': string;
@@ -51,6 +51,7 @@ export const zhCN = {
51
51
  'tool.usage.query': '用法:gitnexus query <搜索词>',
52
52
  'tool.usage.context': '用法:gitnexus context <符号名> [--uid <uid>] [--file <路径>]',
53
53
  'tool.usage.impact': '用法:gitnexus impact <符号名> [--uid <uid>] [--file <路径>] [--kind <类型>] [--direction upstream|downstream]',
54
+ 'tool.usage.trace': '用法:gitnexus trace <起点> <终点> [--from-uid <uid>] [--to-uid <uid>] [--depth <n>]',
54
55
  'tool.usage.cypher': '用法:gitnexus cypher <Cypher 查询>',
55
56
  'tool.warn.unknownKind': "--kind '{{kind}}' 不是已知的符号类型(如 Function、Class、Method),不会用于缩小结果范围。",
56
57
  'tool.detectChanges.noChanges': '未检测到变更。',
@@ -112,7 +113,7 @@ export const zhCN = {
112
113
  'help.command.analyze.description': '索引仓库(完整分析)',
113
114
  'help.command.index.description': '将现有 .gitnexus/ 文件夹注册到全局注册表(无需重新分析)',
114
115
  'help.command.serve.description': '启动供 Web UI 连接的本地 HTTP 服务器',
115
- 'help.command.mcp.description': '启动 MCP 服务器(stdio)— 提供所有已索引仓库',
116
+ 'help.command.mcp.description': '启动 MCP 服务器。默认为 stdio。使用 --http 启动远程 HTTP 服务器(Streamable HTTP: POST /mcp + 遗留 SSE: GET /sse, POST /messages)。',
116
117
  'help.command.list.description': '列出所有已索引仓库',
117
118
  'help.command.status.description': '显示当前仓库的索引状态',
118
119
  'help.command.doctor.description': '显示运行平台能力和嵌入配置',
@@ -124,8 +125,10 @@ export const zhCN = {
124
125
  'help.command.query.description': '搜索知识图谱中与概念相关的执行流程',
125
126
  'help.command.context.description': '查看代码符号的 360 度视图:调用者、被调用者、流程',
126
127
  'help.command.impact.description': '影响面分析:修改符号会影响什么',
128
+ 'help.command.trace.description': '查找两个符号之间的最短有向路径(调用与类成员边)',
127
129
  'help.command.cypher.description': '对知识图谱执行原始 Cypher 查询',
128
130
  'help.command.detectChanges.description': '将 git diff hunk 映射到已索引符号和受影响执行流程',
131
+ 'help.command.check.description': '对已索引图谱运行结构检查',
129
132
  'help.command.evalServer.description': '启动轻量 HTTP 服务器,用于评测期间的快速工具调用',
130
133
  'help.command.group.description': '管理仓库组,用于跨索引影响分析',
131
134
  'help.command.group.create.description': '使用模板 group.yaml 创建新仓库组',
@@ -137,6 +140,7 @@ export const zhCN = {
137
140
  'help.command.group.impact.description': '分析仓库组中某个成员仓库符号的跨仓库影响',
138
141
  'help.command.group.query.description': '跨仓库组所有仓库搜索执行流程',
139
142
  'help.command.group.contracts.description': '查看 Contract Registry',
143
+ 'help.option.setup.codingAgent': '仅配置这些编码代理(逗号分隔或重复传入)',
140
144
  'help.option.analyze.force': '即使已是最新也强制完整重建索引',
141
145
  'help.option.analyze.repairFts': '修复/重建搜索 FTS 索引,不执行完整重新分析',
142
146
  'help.option.analyze.embeddings': '启用语义搜索的嵌入生成(默认关闭)。可选 [limit] 覆盖 50,000 节点安全上限;传 0 可完全禁用上限。',
@@ -162,6 +166,9 @@ export const zhCN = {
162
166
  'help.option.index.allowNonGit': '允许注册非 Git 仓库文件夹',
163
167
  'help.option.port': '端口号',
164
168
  'help.option.serve.host': '绑定地址(默认:127.0.0.1;远程访问可用 0.0.0.0)',
169
+ 'help.option.mcp.http': '使用 HTTP 代替 stdio 提供 MCP 服务(适合远程客户端)',
170
+ 'help.option.mcp.host': 'HTTP 绑定地址(仅与 --http 搭配使用)。默认:127.0.0.1(回环)。使用 0.0.0.0 向所有接口开放。',
171
+ 'help.option.mcp.authToken': '要求 Authorization 头携带此 Bearer Token(仅与 --http 搭配使用);也可通过 GITNEXUS_MCP_AUTH_TOKEN 环境变量设置。非回环绑定(--host 0.0.0.0/::)时必填,否则拒绝启动。',
165
172
  'help.option.force.confirmation': '跳过确认提示',
166
173
  'help.option.uninstall.force': '应用更改(默认仅为预演预览)',
167
174
  'help.option.clean.all': '清理所有已索引仓库',
@@ -198,8 +205,15 @@ export const zhCN = {
198
205
  'help.option.impact.limit': '每层深度最大符号数(默认:100)',
199
206
  'help.option.impact.offset': '每层深度跳过 N 个符号(分页用)',
200
207
  'help.option.impact.summaryOnly': '仅返回计数和风险等级,省略符号列表',
208
+ 'help.option.trace.fromUid': '源符号 UID(零歧义查找)',
209
+ 'help.option.trace.fromFile': '源文件路径,用于消除常见名称歧义',
210
+ 'help.option.trace.toUid': '目标符号 UID(零歧义查找)',
211
+ 'help.option.trace.toFile': '目标文件路径,用于消除常见名称歧义',
212
+ 'help.option.trace.depth': '最大路径跳数(默认:10)',
213
+ 'help.option.trace.includeTests': '遍历时包含测试文件中的符号(默认:false)',
201
214
  'help.option.detectChanges.scope': '分析范围:unstaged、staged、all 或 compare',
202
215
  'help.option.detectChanges.baseRef': 'compare 范围的分支/提交(例如 main)',
216
+ 'help.option.check.cycles': '检测循环导入,并在发现循环时失败',
203
217
  'help.option.evalServer.host': '绑定地址(默认:127.0.0.1;用 0.0.0.0 暴露到所有网卡)',
204
218
  'help.option.evalServer.idleTimeout': '空闲 N 秒后自动关闭(0 = 禁用)',
205
219
  'help.option.group.create.force': '覆盖现有仓库组',
package/dist/cli/index.js CHANGED
@@ -4,22 +4,35 @@
4
4
  import { Command } from 'commander';
5
5
  import { createRequire } from 'node:module';
6
6
  import { createLazyAction, createLbugLazyAction } from './lazy-action.js';
7
+ import { EMBEDDING_DIMS_ERROR, normalizeEmbeddingDims } from './embedding-dims.js';
7
8
  import { registerGroupCommands } from './group.js';
8
9
  import { localizeCliHelp } from './help-i18n.js';
9
10
  import { t } from './i18n/index.js';
10
11
  const _require = createRequire(import.meta.url);
11
12
  const pkg = _require('../../package.json');
12
13
  const program = new Command();
14
+ function collectCodingAgents(value, previous) {
15
+ return [...(previous ?? []), ...value.split(',')];
16
+ }
13
17
  program.name('gitnexus').description('GitNexus local CLI and MCP server').version(pkg.version);
14
18
  program
15
19
  .command('setup')
16
20
  .description('One-time setup: configure MCP for Cursor, Claude Code, Antigravity, OpenCode, Codex')
21
+ .option('-c, --coding-agent <agents>', 'Configure only these coding agents (comma-separated or repeatable)', collectCodingAgents)
17
22
  .action(createLazyAction(() => import('./setup.js'), 'setupCommand'));
18
23
  program
19
24
  .command('uninstall')
20
25
  .description('Reverse `setup`: remove GitNexus MCP entries, skills, and hooks from all detected editors')
21
26
  .option('-f, --force', 'Apply the changes (default is a dry-run preview)')
22
27
  .action(createLazyAction(() => import('./uninstall.js'), 'uninstallCommand'));
28
+ // Baseline of GITNEXUS_EMBEDDING_DIMS captured by the analyze preAction hook
29
+ // before it overwrites the var, so the postAction hook can restore it. The
30
+ // analyzeCommand env snapshot is taken AFTER this hook runs, so it cannot undo
31
+ // the hook's write on its own — without this restore a CLI --embedding-dims
32
+ // would leak into a later in-process program.parseAsync (tests / long-running
33
+ // hosts). Single-shot CLI exits the process, making the restore a no-op there.
34
+ let dimsEnvBaseline;
35
+ let dimsEnvCaptured = false;
23
36
  program
24
37
  .command('analyze [path]')
25
38
  .description('Index a repository (full analysis)')
@@ -32,6 +45,8 @@ program
32
45
  .option('--skills', 'Generate repo-specific skill files from detected communities ' +
33
46
  '(no-op when --index-only is also set).')
34
47
  .option('--skip-agents-md', 'Skip updating the gitnexus section in AGENTS.md and CLAUDE.md')
48
+ .option('--pdg', 'Build the control-flow-graph / PDG substrate (BasicBlock nodes + CFG edges) ' +
49
+ 'for supported languages. Opt-in; off by default. (#2081 M1)')
35
50
  .option('--default-branch <branch>', 'Default branch used in the generated regression-compare example (base_ref). ' +
36
51
  'Falls back to .gitnexusrc, then auto-detected origin/HEAD, then "main".')
37
52
  .option('--branch <name>', 'Index the working tree under a specific branch slot (multi-branch indexing). ' +
@@ -57,7 +72,53 @@ program
57
72
  .option('--embedding-batch-size <n>', 'Number of nodes per embedding batch')
58
73
  .option('--embedding-sub-batch-size <n>', 'Number of chunks per embedding model call')
59
74
  .option('--embedding-device <device>', 'Embedding device: auto, cpu, dml, cuda, or wasm')
75
+ .option('--embedding-base-url <url>', 'OpenAI-compatible embeddings base URL including the /v1 suffix ' +
76
+ '(e.g. http://10.219.32.29:11434/v1 for Ollama). Overrides GITNEXUS_EMBEDDING_URL.')
77
+ .option('--embedding-model <model>', 'Embedding model name (e.g. qwen3-embedding:8b). Overrides GITNEXUS_EMBEDDING_MODEL.')
78
+ .option('--embedding-auth-token <token>', 'Bearer token for the embeddings endpoint (omit for unauthenticated servers like Ollama). ' +
79
+ 'Overrides GITNEXUS_EMBEDDING_API_KEY.')
80
+ .option('--embedding-dims <number>', 'Embedding vector dimensions (positive integer; e.g. 4096 for Qwen3-Embedding-8B). ' +
81
+ 'Must match what the index was built with. Overrides GITNEXUS_EMBEDDING_DIMS.')
60
82
  .addHelpText('after', () => t('help.analyze.environment'))
83
+ .hook('preAction', (thisCommand) => {
84
+ // ONLY GITNEXUS_EMBEDDING_DIMS must be set here: schema.ts reads it at
85
+ // module-load time during the lazy import('./analyze.js') below (via the
86
+ // static chain analyze.ts → run-analyze.ts → schema.ts), so deferring to
87
+ // analyzeCommandImpl would be too late. URL / MODEL / API_KEY are read
88
+ // lazily at runtime (readConfig), so analyzeCommandImpl is their sole
89
+ // setter — keeping them out of this hook means they fall under the impl's
90
+ // env snapshot/restore and don't leak across in-process invocations.
91
+ const dimsOpt = thisCommand.opts()['embeddingDims'];
92
+ if (dimsOpt !== undefined) {
93
+ // Validate + normalize BEFORE writing the env var: schema.ts throws on a
94
+ // bad value at module-load, which — on the synchronous program.parse()
95
+ // path, before the analyze fatal-handlers are installed — would surface
96
+ // as a raw unhandled rejection instead of this friendly message.
97
+ const dims = normalizeEmbeddingDims(String(dimsOpt));
98
+ if (dims === null) {
99
+ process.stderr.write(`\n ${EMBEDDING_DIMS_ERROR}\n\n`);
100
+ process.exit(1);
101
+ }
102
+ dimsEnvBaseline = process.env.GITNEXUS_EMBEDDING_DIMS;
103
+ dimsEnvCaptured = true;
104
+ process.env.GITNEXUS_EMBEDDING_DIMS = dims;
105
+ }
106
+ })
107
+ .hook('postAction', () => {
108
+ // Restore the pre-hook GITNEXUS_EMBEDDING_DIMS so a CLI override doesn't
109
+ // persist into a later program.parseAsync in the same process. (Fires on a
110
+ // microtask after a successful parse; the crash path never reaches here,
111
+ // but the hook validates dims before writing, so there's nothing to undo.)
112
+ if (!dimsEnvCaptured)
113
+ return;
114
+ dimsEnvCaptured = false;
115
+ if (dimsEnvBaseline === undefined) {
116
+ delete process.env.GITNEXUS_EMBEDDING_DIMS;
117
+ }
118
+ else {
119
+ process.env.GITNEXUS_EMBEDDING_DIMS = dimsEnvBaseline;
120
+ }
121
+ })
61
122
  .action(createLbugLazyAction(() => import('./analyze.js'), 'analyzeCommand'));
62
123
  program
63
124
  .command('index [path...]')
@@ -73,7 +134,12 @@ program
73
134
  .action(createLbugLazyAction(() => import('./serve.js'), 'serveCommand'));
74
135
  program
75
136
  .command('mcp')
76
- .description('Start MCP server (stdio) serves all indexed repos')
137
+ .description('Start MCP server. Default: stdio. Use --http for a remote HTTP server ' +
138
+ '(Streamable HTTP at POST /mcp + legacy SSE at GET /sse, POST /messages).')
139
+ .option('--http', 'Serve MCP over HTTP instead of stdio (for remote clients)')
140
+ .option('-p, --port <port>', 'HTTP port (only with --http). Default: 3000', '3000')
141
+ .option('--host <host>', 'HTTP bind address (only with --http). Default: 127.0.0.1 (loopback). Use 0.0.0.0 to expose to all interfaces.', '127.0.0.1')
142
+ .option('--auth-token <token>', 'Require this bearer token in the Authorization header (only with --http); may also be set via the GITNEXUS_MCP_AUTH_TOKEN env var. Required for a non-loopback bind (--host 0.0.0.0/::), which otherwise refuses to start.')
77
143
  .action(createLbugLazyAction(() => import('./mcp.js'), 'mcpCommand'));
78
144
  program
79
145
  .command('list')
@@ -158,6 +224,8 @@ program
158
224
  .command('impact [target]')
159
225
  .description('Blast radius analysis: what breaks if you change a symbol')
160
226
  .option('-d, --direction <dir>', 'upstream (dependants) or downstream (dependencies)', 'upstream')
227
+ .option('--mode <mode>', 'Engine: callgraph (default) or pdg (opt-in, intra-procedural; needs analyze --pdg)', 'callgraph')
228
+ .option('--line <number>', '1-based source line — PDG-only statement anchor (--mode pdg): slice the dependence from the statement at this line and show what depends on it')
161
229
  .option('-r, --repo <name>', 'Target repository')
162
230
  .option('--branch <name>', 'Scope to a specific branch index (multi-branch repos)')
163
231
  .option('-u, --uid <uid>', 'Direct symbol UID (zero-ambiguity lookup)')
@@ -169,6 +237,18 @@ program
169
237
  .option('--offset <n>', 'Skip N symbols per depth level for pagination')
170
238
  .option('--summary-only', 'Return counts and risk only, omit symbol list')
171
239
  .action(createLbugLazyAction(() => import('./tool.js'), 'impactCommand'));
240
+ program
241
+ .command('trace <from> <to>')
242
+ .description('Find the shortest directed path between two symbols (call + class-member edges)')
243
+ .option('--from-uid <uid>', 'Source symbol UID (zero-ambiguity)')
244
+ .option('--from-file <path>', 'Source file path hint')
245
+ .option('--to-uid <uid>', 'Target symbol UID (zero-ambiguity)')
246
+ .option('--to-file <path>', 'Target file path hint')
247
+ .option('--depth <n>', 'Max path length in hops (default: 10)')
248
+ .option('--include-tests', 'Include test files in results')
249
+ .option('-r, --repo <name>', 'Target repository')
250
+ .option('--branch <name>', 'Scope to a specific branch index')
251
+ .action(createLbugLazyAction(() => import('./tool.js'), 'traceCommand'));
172
252
  program
173
253
  .command('cypher <query>')
174
254
  .description('Execute raw Cypher query against the knowledge graph')
@@ -184,6 +264,14 @@ program
184
264
  .option('-r, --repo <name>', 'Target repository')
185
265
  .option('--branch <name>', 'Scope to a specific branch index (multi-branch repos)')
186
266
  .action(createLbugLazyAction(() => import('./tool.js'), 'detectChangesCommand'));
267
+ program
268
+ .command('check')
269
+ .description('Run structural checks against the indexed graph')
270
+ .option('--cycles', 'Detect circular imports and fail when any are found')
271
+ .option('--json', 'Emit machine-readable JSON')
272
+ .option('-r, --repo <name>', 'Target repository')
273
+ .option('--branch <name>', 'Scope to a specific branch index (multi-branch repos)')
274
+ .action(createLbugLazyAction(() => import('./tool.js'), 'checkCommand'));
187
275
  // ─── Eval Server (persistent daemon for SWE-bench) ─────────────────
188
276
  program
189
277
  .command('eval-server')
package/dist/cli/mcp.d.ts CHANGED
@@ -26,4 +26,9 @@
26
26
  * `mcpCommand` after the sentinel install. The regression test at
27
27
  * `gitnexus/test/integration/mcp/import-closure.test.ts` enforces this.
28
28
  */
29
- export declare const mcpCommand: () => Promise<void>;
29
+ export declare const mcpCommand: (options?: {
30
+ http?: boolean;
31
+ port?: string;
32
+ host?: string;
33
+ authToken?: string;
34
+ }) => Promise<void>;
package/dist/cli/mcp.js CHANGED
@@ -27,7 +27,7 @@
27
27
  * `gitnexus/test/integration/mcp/import-closure.test.ts` enforces this.
28
28
  */
29
29
  import { installGlobalStdoutSentinel } from '../mcp/stdio-context.js';
30
- export const mcpCommand = async () => {
30
+ export const mcpCommand = async (options) => {
31
31
  // Install the global stdout sentinel as the very first thing — before
32
32
  // ANY other module loads. The static-import closure above is leaf-only
33
33
  // (stdio-context → stdio-capture, zero non-`node:` deps), so this is
@@ -68,6 +68,31 @@ export const mcpCommand = async () => {
68
68
  else {
69
69
  logger.info({ repoCount: repos.length, repos: repos.map((r) => r.name) }, 'GitNexus: MCP server starting');
70
70
  }
71
+ // Start HTTP server or fall back to stdio (default).
72
+ if (options?.http) {
73
+ // Dynamically import the HTTP transport module AFTER the sentinel installs.
74
+ // http-transport.ts pulls in express/cors/MCP SDK HTTP transport; these must
75
+ // not load before installGlobalStdoutSentinel() runs (see module doc above).
76
+ const port = Number(options.port ?? 3000);
77
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
78
+ logger.error({ port: options.port }, `Invalid --port value: "${options.port ?? ''}". Must be an integer between 1 and 65535.`);
79
+ process.exit(1);
80
+ }
81
+ // Dynamic import keeps express/cors out of mcp.ts's static graph (stdio sentinel).
82
+ const { startMcpHttpServer, resolveAuthToken } = await import('../mcp/http-transport.js');
83
+ try {
84
+ await startMcpHttpServer(backend, {
85
+ port,
86
+ host: options.host ?? '127.0.0.1',
87
+ authToken: resolveAuthToken(options.authToken, process.env),
88
+ });
89
+ }
90
+ catch (err) {
91
+ logger.error({ err: err instanceof Error ? err.message : err }, 'Failed to start the MCP HTTP server');
92
+ process.exit(1);
93
+ }
94
+ return;
95
+ }
71
96
  // Start MCP server (serves all repos, discovers new ones lazily)
72
97
  await startMCPServer(backend);
73
98
  };
@@ -1,15 +1,13 @@
1
1
  /**
2
2
  * Optional grammar availability check.
3
3
  *
4
- * tree-sitter-dart, tree-sitter-proto, and tree-sitter-swift are vendored
5
- * under vendor/ and materialized into node_modules/ at postinstall. Dart
6
- * and Proto are built from source with node-gyp; Swift ships platform
7
- * prebuilds activated via node-gyp-build. tree-sitter-kotlin is a declared
8
- * optionalDependency (not vendored). All can be skipped via
4
+ * tree-sitter-dart, -proto, -swift, and -kotlin are vendored under vendor/ and
5
+ * loaded from there by absolute path (NEVER copied into node_modules see
6
+ * core/tree-sitter/vendored-grammars.ts / #2111). Each ships committed platform
7
+ * prebuilds activated via node-gyp-build. All can be skipped via
9
8
  * GITNEXUS_SKIP_OPTIONAL_GRAMMARS=1 (postinstall scripts), or can silently
10
- * soft-fail when the toolchain is missing (Dart/Proto), when no prebuild
11
- * matches the host platform (Swift), or when the optional install was
12
- * skipped or its native build failed (Kotlin).
9
+ * soft-fail when no prebuild matches the host platform (and a source build was
10
+ * unavailable / not attempted).
13
11
  *
14
12
  * Either path produces the same observable: the .node binding is absent
15
13
  * at runtime. This helper detects that condition and surfaces a single
@@ -1,26 +1,23 @@
1
1
  /**
2
2
  * Optional grammar availability check.
3
3
  *
4
- * tree-sitter-dart, tree-sitter-proto, and tree-sitter-swift are vendored
5
- * under vendor/ and materialized into node_modules/ at postinstall. Dart
6
- * and Proto are built from source with node-gyp; Swift ships platform
7
- * prebuilds activated via node-gyp-build. tree-sitter-kotlin is a declared
8
- * optionalDependency (not vendored). All can be skipped via
4
+ * tree-sitter-dart, -proto, -swift, and -kotlin are vendored under vendor/ and
5
+ * loaded from there by absolute path (NEVER copied into node_modules see
6
+ * core/tree-sitter/vendored-grammars.ts / #2111). Each ships committed platform
7
+ * prebuilds activated via node-gyp-build. All can be skipped via
9
8
  * GITNEXUS_SKIP_OPTIONAL_GRAMMARS=1 (postinstall scripts), or can silently
10
- * soft-fail when the toolchain is missing (Dart/Proto), when no prebuild
11
- * matches the host platform (Swift), or when the optional install was
12
- * skipped or its native build failed (Kotlin).
9
+ * soft-fail when no prebuild matches the host platform (and a source build was
10
+ * unavailable / not attempted).
13
11
  *
14
12
  * Either path produces the same observable: the .node binding is absent
15
13
  * at runtime. This helper detects that condition and surfaces a single
16
14
  * stderr line per missing grammar so users learn why .dart/.proto/.swift/.kt
17
15
  * support is unavailable instead of silently getting a degraded index.
18
16
  */
19
- import { createRequire } from 'module';
20
17
  import { SupportedLanguages } from '../_shared/index.js';
21
18
  import { isGrammarRuntimeSkipped } from '../core/tree-sitter/parser-loader.js';
19
+ import { requireVendoredGrammar } from '../core/tree-sitter/vendored-grammars.js';
22
20
  import { cliWarn } from './cli-message.js';
23
- const _require = createRequire(import.meta.url);
24
21
  const OPTIONAL_GRAMMARS = [
25
22
  {
26
23
  name: 'tree-sitter-dart',
@@ -76,7 +73,7 @@ export function detectMissingOptionalGrammars() {
76
73
  continue;
77
74
  }
78
75
  try {
79
- _require(g.pkg);
76
+ requireVendoredGrammar(g.pkg);
80
77
  }
81
78
  catch (err) {
82
79
  const code = err?.code;
@@ -37,5 +37,7 @@ interface SetupResult {
37
37
  * install paths copy this same list from hooks/claude/ (the canonical source).
38
38
  */
39
39
  export declare function copyHookHelpers(srcDir: string, destDir: string, label: string, result: SetupResult): Promise<string[]>;
40
- export declare const setupCommand: () => Promise<void>;
40
+ export declare const setupCommand: (options?: {
41
+ codingAgent?: string[] | string;
42
+ }) => Promise<void>;
41
43
  export {};
package/dist/cli/setup.js CHANGED
@@ -61,6 +61,33 @@ export function formatHookCommand(hookPath, isWindows = process.platform === 'wi
61
61
  // changes this literal, the guard records an actionable error instead of
62
62
  // silently shipping a hook with an unresolved relative cliPath.
63
63
  const CLI_PATH_SOURCE_LITERAL = "let cliPath = path.resolve(__dirname, '..', '..', 'dist', 'cli', 'index.js');";
64
+ const CODING_AGENT_IDS = {
65
+ cursor: 'cursor',
66
+ claude: 'claude',
67
+ antigravity: 'antigravity',
68
+ opencode: 'opencode',
69
+ codex: 'codex',
70
+ };
71
+ const SUPPORTED_CODING_AGENTS = Object.values(CODING_AGENT_IDS);
72
+ function selectedCodingAgents(values) {
73
+ if (values == null)
74
+ return new Set(SUPPORTED_CODING_AGENTS);
75
+ const rawValues = Array.isArray(values) ? values : [values];
76
+ const requested = rawValues
77
+ .flatMap((value) => value.split(','))
78
+ .map((value) => value.trim().toLowerCase())
79
+ .filter(Boolean);
80
+ const invalid = requested.filter((value) => !SUPPORTED_CODING_AGENTS.includes(value));
81
+ if (requested.length === 0 || invalid.length > 0) {
82
+ const detail = requested.length === 0
83
+ ? 'No coding agents were provided.'
84
+ : `Unknown: ${invalid.join(', ')}.`;
85
+ process.stderr.write(`${detail} Valid values: ${SUPPORTED_CODING_AGENTS.join(', ')}.\n`);
86
+ process.exitCode = 1;
87
+ return null;
88
+ }
89
+ return new Set(requested);
90
+ }
64
91
  /**
65
92
  * Resolve the absolute path to the `gitnexus` binary if it's installed
66
93
  * globally (or via npm -g / yarn global). Returns null when not found.
@@ -832,7 +859,11 @@ async function installCodexSkills(result) {
832
859
  }
833
860
  }
834
861
  // ─── Main command ──────────────────────────────────────────────────
835
- export const setupCommand = async () => {
862
+ export const setupCommand = async (options) => {
863
+ const explicitSelection = options?.codingAgent != null;
864
+ const selected = selectedCodingAgents(options?.codingAgent);
865
+ if (!selected)
866
+ return;
836
867
  console.log('');
837
868
  console.log(' GitNexus Setup');
838
869
  console.log(' ==============');
@@ -846,19 +877,31 @@ export const setupCommand = async () => {
846
877
  errors: [],
847
878
  };
848
879
  // Detect and configure each editor's MCP
849
- await setupCursor(result);
850
- await setupClaudeCode(result);
851
- await setupAntigravity(result);
852
- await setupOpenCode(result);
853
- await setupCodex(result);
880
+ if (selected.has('cursor'))
881
+ await setupCursor(result);
882
+ if (selected.has('claude'))
883
+ await setupClaudeCode(result);
884
+ if (selected.has('antigravity'))
885
+ await setupAntigravity(result);
886
+ if (selected.has('opencode'))
887
+ await setupOpenCode(result);
888
+ if (selected.has('codex'))
889
+ await setupCodex(result);
854
890
  // Install global skills for platforms that support them
855
- await installClaudeCodeSkills(result);
856
- await installClaudeCodeHooks(result);
857
- await installAntigravitySkills(result);
858
- await installAntigravityHooks(result);
859
- await installCursorSkills(result);
860
- await installOpenCodeSkills(result);
861
- await installCodexSkills(result);
891
+ if (selected.has('claude')) {
892
+ await installClaudeCodeSkills(result);
893
+ await installClaudeCodeHooks(result);
894
+ }
895
+ if (selected.has('antigravity')) {
896
+ await installAntigravitySkills(result);
897
+ await installAntigravityHooks(result);
898
+ }
899
+ if (selected.has('cursor'))
900
+ await installCursorSkills(result);
901
+ if (selected.has('opencode'))
902
+ await installOpenCodeSkills(result);
903
+ if (selected.has('codex'))
904
+ await installCodexSkills(result);
862
905
  // Print results
863
906
  if (result.configured.length > 0) {
864
907
  console.log(' Configured:');
@@ -884,10 +927,17 @@ export const setupCommand = async () => {
884
927
  console.log(' Summary:');
885
928
  console.log(` MCP configured for: ${result.configured.filter((c) => !c.includes('skills')).join(', ') || 'none'}`);
886
929
  console.log(` Skills installed to: ${result.configured.filter((c) => c.includes('skills')).length > 0 ? result.configured.filter((c) => c.includes('skills')).join(', ') : 'none'}`);
930
+ const configurationSucceeded = result.configured.length > 0;
931
+ if (explicitSelection && !configurationSucceeded) {
932
+ process.stderr.write('None of the explicitly selected coding agents were configured.\n');
933
+ process.exitCode = 1;
934
+ }
887
935
  console.log('');
888
- console.log(' Next steps:');
889
- console.log(' 1. cd into any git repo');
890
- console.log(' 2. Run: gitnexus analyze');
891
- console.log(' 3. Open the repo in your editor — MCP is ready!');
936
+ if (configurationSucceeded) {
937
+ console.log(' Next steps:');
938
+ console.log(' 1. cd into any git repo');
939
+ console.log(' 2. Run: gitnexus analyze');
940
+ console.log(' 3. Open the repo in your editor — MCP is ready!');
941
+ }
892
942
  console.log('');
893
943
  };
@@ -483,8 +483,9 @@ const renderSkillMarkdown = (community, projectName, members, files, entryPoints
483
483
  lines.push('## How to Explore');
484
484
  lines.push('');
485
485
  lines.push(`1. \`context({name: "${firstEntry}"})\` \u2014 see callers and callees`);
486
- lines.push(`2. \`query({query: "${community.label.toLowerCase()}"})\` \u2014 find related execution flows`);
486
+ lines.push(`2. \`query({search_query: "${community.label.toLowerCase()}"})\` \u2014 find related execution flows`);
487
487
  lines.push('3. Read key files listed above for implementation details');
488
+ lines.push('4. `explain({target: "<file or symbol>"})` — persisted taint findings (source→sink data flows), when indexed with `--pdg`');
488
489
  lines.push('');
489
490
  return lines.join('\n');
490
491
  };
@@ -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:
@@ -31,6 +31,8 @@ export declare function contextCommand(name: string, options?: {
31
31
  }): Promise<void>;
32
32
  export declare function impactCommand(target?: string, options?: {
33
33
  direction?: string;
34
+ mode?: string;
35
+ line?: string;
34
36
  repo?: string;
35
37
  branch?: string;
36
38
  uid?: string;
@@ -52,3 +54,19 @@ export declare function detectChangesCommand(options?: {
52
54
  repo?: string;
53
55
  branch?: string;
54
56
  }): Promise<void>;
57
+ export declare function checkCommand(options?: {
58
+ cycles?: boolean;
59
+ json?: boolean;
60
+ repo?: string;
61
+ branch?: string;
62
+ }): Promise<void>;
63
+ export declare function traceCommand(from?: string, to?: string, options?: {
64
+ fromUid?: string;
65
+ fromFile?: string;
66
+ toUid?: string;
67
+ toFile?: string;
68
+ depth?: string;
69
+ repo?: string;
70
+ branch?: string;
71
+ includeTests?: boolean;
72
+ }): Promise<void>;