gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -19,12 +19,13 @@ import { LBUG_ID_PROBE_BATCH_SIZE, LBUG_QUERY_BATCH_SIZE } from '../../core/lbug
19
19
  import { chunk, mapConcurrent } from '../../lib/utils.js';
20
20
  import { pathSuffixOf } from './path-predicate.js';
21
21
  import { toOneBasedLine } from '../../core/ingestion/utils/line-base.js';
22
+ import { isTestFilePath } from '../../core/ingestion/utils/test-file-path.js';
22
23
  import { isWalCorruptionError, WAL_RECOVERY_SUGGESTION } from '../../core/lbug/lbug-config.js';
23
24
  // Embedding imports are lazy (dynamic import) to avoid loading onnxruntime-node
24
25
  // at MCP server startup — crashes on unsupported Node ABI versions (#89)
25
26
  // git utilities available if needed
26
27
  // import { isGitRepo, getCurrentCommit, getGitRoot } from '../../storage/git.js';
27
- import { parseDiffHunks, coalesceHunksByPath, hunksOverlapRange, getCanonicalRepoRoot, getGitRoot, } from '../../storage/git.js';
28
+ import { parseDiffHunks, coalesceHunksByPath, hunksOverlapRange, findGitRootByDotGit, getCanonicalRepoRoot, getGitRoot, } from '../../storage/git.js';
28
29
  import { realpathSync } from 'fs';
29
30
  import { listRegisteredRepos, cleanupOldKuzuFiles, canonicalizePath, getStoragePaths, loadMeta, RegistryAmbiguousTargetError, } from '../../storage/repo-manager.js';
30
31
  import { GroupService, } from '../../core/group/service.js';
@@ -190,30 +191,8 @@ function normalizeToolParams(method, params) {
190
191
  }
191
192
  // AI context generation is CLI-only (gitnexus analyze)
192
193
  // import { generateAIContextFiles } from '../../cli/ai-context.js';
193
- /**
194
- * Quick test-file detection for filtering impact results.
195
- * Matches common test file patterns across all supported languages.
196
- */
197
- export function isTestFilePath(filePath) {
198
- if (!filePath)
199
- return false;
200
- const p = filePath.toLowerCase().replace(/\\/g, '/');
201
- return (p.includes('.test.') ||
202
- p.includes('.spec.') ||
203
- p.includes('__tests__/') ||
204
- p.includes('__mocks__/') ||
205
- p.includes('/test/') ||
206
- p.includes('/tests/') ||
207
- p.includes('/testing/') ||
208
- p.includes('/fixtures/') ||
209
- p.endsWith('_test.go') ||
210
- p.endsWith('_test.py') ||
211
- p.endsWith('_spec.rb') ||
212
- p.endsWith('_test.rb') ||
213
- p.includes('/spec/') ||
214
- p.includes('/test_') ||
215
- p.includes('/conftest.'));
216
- }
194
+ /** Shared predicate; re-exported so MCP importers keep the old public name. */
195
+ export { isTestFilePath };
217
196
  /** Valid LadybugDB node labels for safe Cypher query construction */
218
197
  export const VALID_NODE_LABELS = new Set([
219
198
  'File',
@@ -245,6 +224,7 @@ export const VALID_NODE_LABELS = new Set([
245
224
  'Module',
246
225
  'Route',
247
226
  'Tool',
227
+ 'Destination',
248
228
  ]);
249
229
  /** Valid relation types for impact analysis filtering */
250
230
  export const VALID_RELATION_TYPES = new Set([
@@ -288,6 +268,15 @@ export const VALID_RELATION_TYPES = new Set([
288
268
  // impact defaults do not silently widen; target enrichment still surfaces
289
269
  // advised/proxied state on ordinary impact calls.
290
270
  'ADVISED_BY',
271
+ // Async messaging edges. Valid for an explicit `relationTypes` filter —
272
+ // "who else publishes to the topic this handler reads?" — but deliberately
273
+ // NOT in the default impact relTypes, on the HANDLES_ROUTE precedent: a
274
+ // shared broker destination is a high-degree hub, and admitting it by
275
+ // default would pull every unrelated producer of a busy topic into an
276
+ // ordinary blast radius. No IMPACT_RELATION_CONFIDENCE entry either, so the
277
+ // 0.5 unknown-type floor applies (WRAPS/FETCHES/INJECTS precedent).
278
+ 'PUBLISHES_TO',
279
+ 'CONSUMES_FROM',
291
280
  ]);
292
281
  /**
293
282
  * Relation types the #1858 epistemic-boundary probe keys on. Kept as
@@ -666,6 +655,9 @@ export function buildDetectChangesDiffArgs(scope, baseRef) {
666
655
  'diff',
667
656
  '--ignore-cr-at-eol',
668
657
  '--no-ext-diff',
658
+ // color.ui=always prefixes `+++ b/` with ANSI, so parseDiffHunks sees zero
659
+ // files and the CLI used to print a clean "No changes detected." (#3131).
660
+ '--color=never',
669
661
  '--src-prefix=a/',
670
662
  '--dst-prefix=b/',
671
663
  ];
@@ -694,6 +686,18 @@ export function buildDetectChangesDiffArgs(scope, baseRef) {
694
686
  * (#2054).
695
687
  */
696
688
  export const REPO_ID_HASH_LENGTH = 6;
689
+ const routeRuntimeEvidence = (route) => ({
690
+ confirmed: route.runtimeConfirmed,
691
+ ...(route.runtimeSource === null ? {} : { source: route.runtimeSource }),
692
+ ...(route.runtimeStatus === null ? {} : { status: route.runtimeStatus }),
693
+ });
694
+ const isMissingRouteRuntimePropertyError = (error) => {
695
+ const message = error instanceof Error ? error.message : String(error);
696
+ return (['runtimeConfirmed', 'runtimeSource', 'runtimeStatus'].some((property) => message.includes(property)) &&
697
+ (/cannot find property/i.test(message) ||
698
+ /property .* does not exist/i.test(message) ||
699
+ /property .* not found/i.test(message)));
700
+ };
697
701
  /**
698
702
  * Validate and normalise `list_repos` pagination arguments.
699
703
  *
@@ -1179,23 +1183,56 @@ export class LocalBackend {
1179
1183
  * - If only 1 repo, use it
1180
1184
  * - If 0 or multiple without param, throw with helpful message
1181
1185
  *
1182
- * On a miss, re-reads the registry once in case a new repo was indexed
1183
- * while the MCP server was running.
1186
+ * Re-reads the registry before an omitted implicit target or after an
1187
+ * explicit miss, so long-running servers see newly indexed repositories.
1184
1188
  */
1185
1189
  async resolveRepo(repoParam, branch) {
1186
- let refreshedAfterAmbiguity = false;
1190
+ return this.selectToolRepository(repoParam, branch);
1191
+ }
1192
+ /**
1193
+ * Internal resolver variant for CLI/MCP tool routing and discovery.
1194
+ * - If repoParam is given, match by name or path
1195
+ * - If only 1 repo, use it
1196
+ * - If multiple repos exist and repoParam is omitted, callers may opt in to
1197
+ * the registered repo containing process.cwd()
1198
+ * - If 0 repos exist, or cwd cannot disambiguate multiple repos, throw
1199
+ *
1200
+ * Omitted-repo resolution re-reads the registry before accepting any
1201
+ * implicit target, including a cached singleton. A caller that just obtained
1202
+ * a fresh registry snapshot may disable that refresh explicitly.
1203
+ */
1204
+ async selectToolRepository(repoParam, branch, options = {}) {
1205
+ const allowCwdDefault = options.allowCwdDefault === true;
1206
+ const mayRefresh = options.refreshRegistry !== false;
1207
+ let refreshed = false;
1208
+ // A cached singleton is also an implicit choice: another process may have
1209
+ // registered a second repo since init, which must not let a repo-less
1210
+ // mutating call bypass the multi-repo ambiguity guard.
1211
+ if (!repoParam && mayRefresh) {
1212
+ await this.refreshRepos();
1213
+ refreshed = true;
1214
+ }
1187
1215
  let result;
1188
1216
  try {
1189
- result = this.resolveRepoFromCache(repoParam);
1217
+ result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
1190
1218
  }
1191
1219
  catch (err) {
1192
1220
  if (!(err instanceof RegistryAmbiguousTargetError))
1193
1221
  throw err;
1222
+ if (!mayRefresh || refreshed)
1223
+ throw err;
1194
1224
  // Stale in-memory duplicate siblings can linger after unregister; refresh
1195
1225
  // once before re-throwing so a resolved registry can disambiguate (#1658).
1196
1226
  await this.refreshRepos();
1197
- refreshedAfterAmbiguity = true;
1198
- result = this.resolveRepoFromCache(repoParam);
1227
+ refreshed = true;
1228
+ result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
1229
+ }
1230
+ // Explicit misses retain the existing one-refresh retry. Omitted targets
1231
+ // already refreshed above unless a same-snapshot caller opted out.
1232
+ if (!result && mayRefresh && !refreshed) {
1233
+ await this.refreshRepos();
1234
+ refreshed = true;
1235
+ result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
1199
1236
  }
1200
1237
  if (result) {
1201
1238
  // Issue: silent graph drift across sibling clones.
@@ -1209,15 +1246,6 @@ export class LocalBackend {
1209
1246
  });
1210
1247
  return this.applyBranchScope(result, branch);
1211
1248
  }
1212
- // Miss — refresh registry and try once more (skip if already refreshed above)
1213
- if (!refreshedAfterAmbiguity) {
1214
- await this.refreshRepos();
1215
- }
1216
- const retried = this.resolveRepoFromCache(repoParam);
1217
- if (retried) {
1218
- this.maybeWarnSiblingDrift(retried).catch(() => { });
1219
- return this.applyBranchScope(retried, branch);
1220
- }
1221
1249
  // Still no match — throw with helpful message
1222
1250
  if (this.repos.size === 0) {
1223
1251
  throw new Error('No indexed repositories. Run: gitnexus analyze');
@@ -1350,7 +1378,7 @@ export class LocalBackend {
1350
1378
  * Throws {@link RegistryAmbiguousTargetError} when `repoParam` matches
1351
1379
  * multiple handles by name and cwd cannot disambiguate (#1658).
1352
1380
  */
1353
- resolveRepoFromCache(repoParam) {
1381
+ resolveRepoFromCache(repoParam, allowCwdDefault = false) {
1354
1382
  if (this.repos.size === 0)
1355
1383
  return null;
1356
1384
  if (repoParam) {
@@ -1379,6 +1407,9 @@ export class LocalBackend {
1379
1407
  if (nameMatches.length === 1)
1380
1408
  return nameMatches[0];
1381
1409
  if (nameMatches.length > 1) {
1410
+ // Explicit duplicate aliases retain the legacy fail-closed contract:
1411
+ // only an exact cwd Git-root match may disambiguate them. Deepest path
1412
+ // containment is reserved for an omitted read-only repo (#3073).
1382
1413
  const cwdPick = this.pickRepoHandleForCwd(nameMatches);
1383
1414
  if (cwdPick)
1384
1415
  return cwdPick;
@@ -1403,26 +1434,46 @@ export class LocalBackend {
1403
1434
  if (this.repos.size === 1) {
1404
1435
  return this.repos.values().next().value;
1405
1436
  }
1437
+ if (allowCwdDefault) {
1438
+ const cwdPick = this.pickRepoHandleForCwd([...this.repos.values()], true);
1439
+ if (cwdPick)
1440
+ return cwdPick;
1441
+ }
1406
1442
  return null; // Multiple repos, no param — ambiguous
1407
1443
  }
1408
1444
  /**
1409
- * Prefer the indexed repo whose path matches the git root of process.cwd().
1445
+ * Match process.cwd() against indexed repositories.
1410
1446
  *
1411
- * In MCP stdio server mode, `process.cwd()` is the server's launch directory,
1412
- * not the agent client's cwd. If the server was started from an unrelated
1413
- * directory, `getGitRoot` returns null and duplicate-name resolution throws
1414
- * {@link RegistryAmbiguousTargetError} — callers should pass an absolute path.
1447
+ * Explicit duplicate aliases use exact Git-root matching only. Omitted
1448
+ * read-only calls opt into deepest containing-path selection. In that mode a
1449
+ * candidate must not sit above cwd's Git root, so an unindexed nested checkout
1450
+ * cannot fall through to an indexed ancestor. The `.git` ancestor fallback
1451
+ * preserves that boundary when the git executable is unavailable.
1415
1452
  */
1416
- pickRepoHandleForCwd(candidates) {
1417
- const cwdRoot = getGitRoot(process.cwd());
1418
- if (!cwdRoot)
1453
+ pickRepoHandleForCwd(candidates, allowContaining = false) {
1454
+ const cwd = process.cwd();
1455
+ const normalize = (value) => {
1456
+ const canonical = canonicalizePath(value);
1457
+ return process.platform === 'win32' ? canonical.toLowerCase() : canonical;
1458
+ };
1459
+ const isSameOrDescendant = (parent, child) => child === parent ||
1460
+ child.startsWith(parent.endsWith(path.sep) ? parent : `${parent}${path.sep}`);
1461
+ const canonicalCwd = normalize(cwd);
1462
+ const cwdRoot = getGitRoot(cwd) ?? findGitRootByDotGit(cwd);
1463
+ const canonicalRoot = cwdRoot ? normalize(cwdRoot) : null;
1464
+ if (allowContaining) {
1465
+ const containing = candidates
1466
+ .map((handle) => ({ handle, repoPath: normalize(handle.repoPath) }))
1467
+ .filter(({ repoPath }) => isSameOrDescendant(repoPath, canonicalCwd))
1468
+ .filter(({ repoPath }) => !canonicalRoot || isSameOrDescendant(canonicalRoot, repoPath))
1469
+ .sort((a, b) => b.repoPath.length - a.repoPath.length);
1470
+ if (containing.length > 0)
1471
+ return containing[0].handle;
1472
+ }
1473
+ if (!canonicalRoot)
1419
1474
  return null;
1420
- const canonicalCwd = canonicalizePath(cwdRoot);
1421
1475
  const cwdMatches = candidates.filter((handle) => {
1422
- const stored = canonicalizePath(handle.repoPath);
1423
- return process.platform === 'win32'
1424
- ? stored.toLowerCase() === canonicalCwd.toLowerCase()
1425
- : stored === canonicalCwd;
1476
+ return normalize(handle.repoPath) === canonicalRoot;
1426
1477
  });
1427
1478
  return cwdMatches.length === 1 ? cwdMatches[0] : null;
1428
1479
  }
@@ -1819,7 +1870,7 @@ export class LocalBackend {
1819
1870
  }
1820
1871
  // Resolve repo from optional param (re-reads registry on miss). An optional
1821
1872
  // `branch` param scopes the resolved handle to that branch's index (#2106).
1822
- const repo = await this.resolveRepo(p.repo, p.branch);
1873
+ const repo = await this.selectToolRepository(p.repo, p.branch, { allowCwdDefault: method !== 'rename' });
1823
1874
  switch (method) {
1824
1875
  case 'query':
1825
1876
  return this.withToolStaleness(repo, await this.query(repo, p));
@@ -5972,8 +6023,8 @@ export class LocalBackend {
5972
6023
  // retains the strongest evidence, the safer default for a blast-radius
5973
6024
  // tool. `sourceId` closes the order for edges that tie on both.
5974
6025
  const query = direction === 'upstream'
5975
- ? `MATCH (caller)-[r:CodeRelation]->(n) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence`
5976
- : `MATCH (n)-[r:CodeRelation]->(callee) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence`;
6026
+ ? `MATCH (caller)-[r:CodeRelation]->(n) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence, r.staticGated AS staticGated`
6027
+ : `MATCH (n)-[r:CodeRelation]->(callee) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence, r.staticGated AS staticGated`;
5977
6028
  try {
5978
6029
  const related = await executeParameterized(repo.lbugPath, query, {
5979
6030
  frontierIds: frontier,
@@ -5988,6 +6039,9 @@ export class LocalBackend {
5988
6039
  relType: rel.relType || rel[5],
5989
6040
  confidence: rel.confidence ?? rel[6],
5990
6041
  sourceId: String(rel.sourceId ?? rel[0] ?? ''),
6042
+ // Set only by languages that compute static gating (Zig); null/undefined
6043
+ // from older indexes or other languages reads as live.
6044
+ ...((rel.staticGated ?? rel[7]) === true ? { staticGated: true } : {}),
5991
6045
  }));
5992
6046
  // The pdg bridge is the ONE consumer here that accumulates sequentially
5993
6047
  // rather than per-node: at depth ≥ 2 an edge inherits
@@ -6061,6 +6115,9 @@ export class LocalBackend {
6061
6115
  filePath: edge.filePath,
6062
6116
  relationType,
6063
6117
  confidence: effectiveConfidence,
6118
+ // Surfaced, never acted on: traversal and ranking ignore the flag
6119
+ // (see GraphRelationship.staticGated). Absent = live or unmodelled.
6120
+ ...(edge.staticGated === true ? { staticGated: true } : {}),
6064
6121
  });
6065
6122
  }
6066
6123
  }
@@ -6736,6 +6793,17 @@ export class LocalBackend {
6736
6793
  target: params.target,
6737
6794
  direction: params.direction,
6738
6795
  };
6796
+ // Forward the target-selector params like the trace branch above.
6797
+ // @group impact used to drop target_uid/file_path/kind here, so a name
6798
+ // shared by same-named Api/Impl/Controller layers resolved ambiguously
6799
+ // in the member repo and the documented "re-call with target_uid"
6800
+ // disambiguation loop (impact tool schema) never worked in group mode.
6801
+ if (typeof params.target_uid === 'string')
6802
+ impactArgs.target_uid = params.target_uid;
6803
+ if (typeof params.file_path === 'string')
6804
+ impactArgs.file_path = params.file_path;
6805
+ if (typeof params.kind === 'string')
6806
+ impactArgs.kind = params.kind;
6739
6807
  if (params.maxDepth !== undefined)
6740
6808
  impactArgs.maxDepth = params.maxDepth;
6741
6809
  if (params.crossDepth !== undefined)
@@ -6862,7 +6930,7 @@ export class LocalBackend {
6862
6930
  * Shared by routeMap and shapeCheck to avoid N+1 query patterns.
6863
6931
  */
6864
6932
  async fetchRoutesWithConsumers(repoId, routeFilter, params) {
6865
- const rows = await executeParameterized(repoId, `
6933
+ const routeQuery = (includeRuntimeEvidence) => `
6866
6934
  MATCH (n:Route)
6867
6935
  WHERE n.id STARTS WITH 'Route:' ${routeFilter}
6868
6936
  OPTIONAL MATCH (consumer)-[r:CodeRelation]->(n)
@@ -6870,8 +6938,19 @@ export class LocalBackend {
6870
6938
  RETURN n.id AS routeId, n.name AS routeName, n.filePath AS handlerFile,
6871
6939
  n.responseKeys AS responseKeys, n.errorKeys AS errorKeys, n.middleware AS middleware,
6872
6940
  consumer.name AS consumerName, consumer.filePath AS consumerFile,
6873
- r.reason AS fetchReason, n.method AS method
6874
- `, params);
6941
+ r.reason AS fetchReason, n.method AS method${includeRuntimeEvidence
6942
+ ? ', n.runtimeConfirmed AS runtimeConfirmed, n.runtimeSource AS runtimeSource, n.runtimeStatus AS runtimeStatus'
6943
+ : ''}
6944
+ `;
6945
+ let rows;
6946
+ try {
6947
+ rows = await executeParameterized(repoId, routeQuery(true), params);
6948
+ }
6949
+ catch (error) {
6950
+ if (!isMissingRouteRuntimePropertyError(error))
6951
+ throw error;
6952
+ rows = await executeParameterized(repoId, routeQuery(false), params);
6953
+ }
6875
6954
  // Strip wrapping quotes from DB array elements — CSV COPY stores ['key'] which
6876
6955
  // LadybugDB may return as "'key'" rather than "key"
6877
6956
  const stripQuotes = (keys) => keys ? keys.map((k) => k.replace(/^['"]|['"]$/g, '')) : null;
@@ -6891,6 +6970,9 @@ export class LocalBackend {
6891
6970
  // resource). Appended last in RETURN so positional fallbacks for the
6892
6971
  // consumer/reason columns above stay stable.
6893
6972
  const method = row.method ?? row[9] ?? null;
6973
+ const runtimeConfirmed = (row.runtimeConfirmed ?? row[10]) === true;
6974
+ const runtimeSource = row.runtimeSource ?? row[11] ?? null;
6975
+ const runtimeStatus = row.runtimeStatus ?? row[12] ?? null;
6894
6976
  if (!routeMap.has(id)) {
6895
6977
  routeMap.set(id, {
6896
6978
  id,
@@ -6900,6 +6982,9 @@ export class LocalBackend {
6900
6982
  responseKeys,
6901
6983
  errorKeys,
6902
6984
  middleware,
6985
+ runtimeConfirmed,
6986
+ runtimeSource,
6987
+ runtimeStatus,
6903
6988
  consumers: [],
6904
6989
  });
6905
6990
  }
@@ -6981,6 +7066,7 @@ export class LocalBackend {
6981
7066
  route: r.name,
6982
7067
  method: r.method,
6983
7068
  handler: r.filePath,
7069
+ runtimeEvidence: routeRuntimeEvidence(r),
6984
7070
  middleware: r.middleware || [],
6985
7071
  consumers: r.consumers,
6986
7072
  flows: flowMap.get(r.id) || [],
@@ -7036,6 +7122,7 @@ export class LocalBackend {
7036
7122
  route: r.name,
7037
7123
  method: r.method,
7038
7124
  handler: r.filePath,
7125
+ runtimeEvidence: routeRuntimeEvidence(r),
7039
7126
  ...(responseKeys.length > 0 ? { responseKeys } : {}),
7040
7127
  ...(errorKeys.length > 0 ? { errorKeys } : {}),
7041
7128
  consumers,
@@ -7199,6 +7286,7 @@ export class LocalBackend {
7199
7286
  route: r.name,
7200
7287
  method: r.method,
7201
7288
  handler: r.filePath,
7289
+ runtimeEvidence: routeRuntimeEvidence(r),
7202
7290
  responseShape: {
7203
7291
  success: responseKeys,
7204
7292
  error: errorKeys,
@@ -20,10 +20,14 @@ export declare class McpRepositoryPolicy {
20
20
  private repoForArgs;
21
21
  private normalizeToolArgs;
22
22
  private listAllowedRepos;
23
- requiresExplicitRepo(backend: LocalBackend): Promise<boolean>;
23
+ toolSchemaRepoRequirements(backend: LocalBackend): Promise<{
24
+ readOnlyRequiresRepo: boolean;
25
+ mutatingRequiresRepo: boolean;
26
+ }>;
24
27
  private listReposPage;
25
28
  private callTool;
26
29
  private resolveRepo;
30
+ private selectToolRepository;
27
31
  assertResourceUri(uri: string): void;
28
32
  resourceTemplateAllowed(uriTemplate: string): boolean;
29
33
  toolAllowed(toolName: string): boolean;
@@ -134,10 +134,40 @@ export class McpRepositoryPolicy {
134
134
  };
135
135
  });
136
136
  }
137
- async requiresExplicitRepo(backend) {
138
- if (this.defaultRepo)
139
- return false;
140
- return (await this.listAllowedRepos(backend)).length > 1;
137
+ async toolSchemaRepoRequirements(backend) {
138
+ if (this.defaultRepo) {
139
+ return { readOnlyRequiresRepo: false, mutatingRequiresRepo: false };
140
+ }
141
+ // Runtime selection is based on the configured allowlist, not on which
142
+ // entries happen to remain visible in a later registry refresh. Keep the
143
+ // advertised schema aligned with repoForArgs() when that listing shrinks.
144
+ if (this.restricted) {
145
+ const requiresRepo = this.allowed.length > 1;
146
+ return {
147
+ readOnlyRequiresRepo: requiresRepo,
148
+ mutatingRequiresRepo: requiresRepo,
149
+ };
150
+ }
151
+ // One fresh listing supplies both schema decisions. Besides keeping the
152
+ // advertised contract internally consistent, this avoids doing two full
153
+ // per-repo staleness fan-outs for every tools/list request.
154
+ const visibleRepos = await this.listAllowedRepos(backend);
155
+ if (visibleRepos.length <= 1) {
156
+ return { readOnlyRequiresRepo: false, mutatingRequiresRepo: false };
157
+ }
158
+ try {
159
+ // listAllowedRepos() refreshed this backend immediately above. Resolve
160
+ // against that exact cache snapshot instead of racing another registry
161
+ // read; only read-only schemas may advertise the cwd-derived default.
162
+ await backend.selectToolRepository(undefined, undefined, {
163
+ allowCwdDefault: true,
164
+ refreshRegistry: false,
165
+ });
166
+ return { readOnlyRequiresRepo: false, mutatingRequiresRepo: true };
167
+ }
168
+ catch {
169
+ return { readOnlyRequiresRepo: true, mutatingRequiresRepo: true };
170
+ }
141
171
  }
142
172
  async listReposPage(backend, params) {
143
173
  const { limit, offset } = parseListReposPagination(params, {
@@ -186,6 +216,17 @@ export class McpRepositoryPolicy {
186
216
  const selected = this.repoForArgs(repo === undefined ? undefined : { repo });
187
217
  return backend.resolveRepo(selected?.path, branch);
188
218
  }
219
+ async selectToolRepository(backend, repo, branch, options) {
220
+ if (!this.configured)
221
+ return backend.selectToolRepository(repo, branch, options);
222
+ if (!this.restricted) {
223
+ return backend.selectToolRepository(repo ?? this.defaultRepo?.path, branch, options);
224
+ }
225
+ const selected = this.repoForArgs(repo === undefined ? undefined : { repo });
226
+ // Restricted policies never allow cwd to select outside the configured
227
+ // set; once policy supplies an explicit path, the public resolver is enough.
228
+ return backend.resolveRepo(selected?.path, branch);
229
+ }
189
230
  assertResourceUri(uri) {
190
231
  if (!this.restricted)
191
232
  return;
@@ -255,6 +296,9 @@ export class McpRepositoryPolicy {
255
296
  if (property === 'resolveRepo') {
256
297
  return (repo, branch) => policy.resolveRepo(target, repo, branch);
257
298
  }
299
+ if (property === 'selectToolRepository') {
300
+ return (repo, branch, options) => policy.selectToolRepository(target, repo, branch, options);
301
+ }
258
302
  if (property === 'getContext' && policy.restricted) {
259
303
  return (repoId) => {
260
304
  if (!repoId || !policy.uniqueAllowedContextNames.has(repoId.toLowerCase()))
@@ -254,7 +254,8 @@ async function getReposResource(backend) {
254
254
  }
255
255
  if (repos.length > 1) {
256
256
  lines.push('');
257
- lines.push('# Multiple repos indexed. Use repo parameter in tool calls:');
257
+ lines.push('# Multiple repos indexed. Read-only tools may omit repo when an MCP default is configured or GitNexus process.cwd() is inside one listed path without crossing an unindexed nested Git checkout.');
258
+ lines.push('# Otherwise—and for mutating tools without an MCP default—pass repo explicitly:');
258
259
  lines.push(`# query({search_query: "auth", repo: "${repos[0].name}"})`);
259
260
  }
260
261
  return lines.join('\n');
@@ -297,6 +298,14 @@ async function getContextResource(backend, repoName) {
297
298
  lines.push(` indexed_at: ${JSON.stringify(freshMeta?.indexedAt ?? null)}`);
298
299
  lines.push(` runner_identity: ${JSON.stringify(freshMeta?.runnerIdentity ?? null)}`);
299
300
  lines.push(` incomplete_reasons: ${JSON.stringify(incompleteReasons)}`);
301
+ lines.push(` spring_actuator: ${JSON.stringify(freshMeta?.springActuator ?? null)}`);
302
+ // Surfaced beside the Actuator flag, and it matters more than that one does:
303
+ // Actuator only annotates nodes the source pass already found, whereas
304
+ // document reading MINTS destinations and edges that have no code site at
305
+ // all. Without this line an agent reading the context sees `Destination`
306
+ // nodes rooted at `asyncapi:`-prefixed pseudo-files with nothing to say where
307
+ // they came from.
308
+ lines.push(` asyncapi_spec: ${JSON.stringify(freshMeta?.asyncApiSpec ?? null)}`);
300
309
  const indexedRunnerSchema = freshMeta?.runnerIdentity
301
310
  ?.schemaVersion;
302
311
  lines.push(` runner_identity_schema_status: ${JSON.stringify(indexedRunnerSchema === ANALYZER_RUNNER_IDENTITY_SCHEMA_VERSION
@@ -10,8 +10,8 @@
10
10
  * Tools: list_repos, query, cypher, context, impact, detect_changes, rename
11
11
  * Resources: repos, repo/{name}/context, repo/{name}/clusters, ...
12
12
  */
13
- import { createRequire } from 'module';
14
13
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
14
+ import { packageVersion } from '../core/package-version.js';
15
15
  import { CompatibleStdioServerTransport } from './compatible-stdio-transport.js';
16
16
  import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
17
17
  import { GITNEXUS_TOOLS, REPO_SCOPED_TOOLS } from './tools.js';
@@ -70,11 +70,9 @@ export function createMCPServer(backend, options = {}) {
70
70
  }
71
71
  const repositoryPolicy = options.repositoryPolicy ?? McpRepositoryPolicy.unrestricted();
72
72
  const scopedBackend = repositoryPolicy.scopeBackend(backend);
73
- const require = createRequire(import.meta.url);
74
- const pkgVersion = require('../../package.json').version;
75
73
  const server = new Server({
76
74
  name: 'gitnexus',
77
- version: pkgVersion,
75
+ version: packageVersion(),
78
76
  }, {
79
77
  capabilities: {
80
78
  tools: {},
@@ -136,11 +134,11 @@ export function createMCPServer(backend, options = {}) {
136
134
  };
137
135
  }
138
136
  });
139
- // With multiple visible repositories and no process-wide default, make the
140
- // routing requirement machine-readable. Agents then supply `repo` before the
141
- // call instead of discovering the ambiguity through a failed tool response.
137
+ // Make the effective routing contract machine-readable. Read-only tools may
138
+ // use a cwd-derived default; mutating rename remains explicit unless policy
139
+ // supplies a single/default repository.
142
140
  server.setRequestHandler(ListToolsRequestSchema, async () => {
143
- const requireRepo = await repositoryPolicy.requiresExplicitRepo(backend);
141
+ const { readOnlyRequiresRepo, mutatingRequiresRepo } = await repositoryPolicy.toolSchemaRepoRequirements(backend);
144
142
  return {
145
143
  tools: GITNEXUS_TOOLS.filter((tool) => (!readOnly || MCP_READ_ONLY_TOOLS.has(tool.name)) &&
146
144
  repositoryPolicy.toolAllowed(tool.name))
@@ -148,7 +146,8 @@ export function createMCPServer(backend, options = {}) {
148
146
  .map((tool) => ({
149
147
  name: tool.name,
150
148
  description: tool.description,
151
- inputSchema: requireRepo && REPO_SCOPED_TOOLS.has(tool.name)
149
+ inputSchema: (tool.name === 'rename' ? mutatingRequiresRepo : readOnlyRequiresRepo) &&
150
+ REPO_SCOPED_TOOLS.has(tool.name)
152
151
  ? {
153
152
  ...tool.inputSchema,
154
153
  required: [...new Set([...tool.inputSchema.required, 'repo'])],