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
package/dist/cli/index.js CHANGED
@@ -2,19 +2,19 @@
2
2
  // Heap re-spawn removed — only analyze.ts needs the 8GB heap (via its own ensureHeap()).
3
3
  // Removing it from here improves MCP server startup time significantly.
4
4
  import { Command } from 'commander';
5
- import { createRequire } from 'node:module';
5
+ import { packageVersion } from '../core/package-version.js';
6
6
  import { createAnalyzerLbugLazyAction, createLazyAction, createLbugLazyAction, } from './lazy-action.js';
7
7
  import { EMBEDDING_DIMS_ERROR, normalizeEmbeddingDims } from './embedding-dims.js';
8
8
  import { registerGroupCommands } from './group.js';
9
9
  import { localizeCliHelp } from './help-i18n.js';
10
10
  import { t } from './i18n/index.js';
11
- const _require = createRequire(import.meta.url);
12
- const pkg = _require('../../package.json');
11
+ import { writeCommandBanner } from './command-banner.js';
12
+ import { runProcessCliUpdateNotice } from './update-notice.js';
13
13
  const program = new Command();
14
14
  function collectCodingAgents(value, previous) {
15
15
  return [...(previous ?? []), ...value.split(',')];
16
16
  }
17
- program.name('gitnexus').description('GitNexus local CLI and MCP server').version(pkg.version);
17
+ program.name('gitnexus').description('GitNexus local CLI and MCP server').version(packageVersion());
18
18
  program
19
19
  .command('setup')
20
20
  .description('One-time setup: configure MCP for Cursor, Claude Code, Antigravity, OpenCode, CodeBuddy, Qoder, Codex')
@@ -25,6 +25,16 @@ program
25
25
  .description('Reverse `setup`: remove GitNexus MCP entries, skills, and hooks from all detected editors')
26
26
  .option('-f, --force', 'Apply the changes (default is a dry-run preview)')
27
27
  .action(createLazyAction(() => import('./uninstall.js'), 'uninstallCommand'));
28
+ program
29
+ .command('auto-sync [action]')
30
+ .description('Control scheduled repository clone/pull and analysis from GITNEXUS_HOME/watch_config.yml')
31
+ .addHelpText('after', () => t('help.autoSync.details'))
32
+ .action(createLazyAction(() => import('./auto-sync.js'), 'autoSyncCommand'));
33
+ program
34
+ .command('watch [action]')
35
+ .description('Ambiguous: use `analyze --watch` for local files, or `auto-sync` for scheduled remotes')
36
+ .addHelpText('after', () => t('help.watch.details'))
37
+ .action(createLazyAction(() => import('./watch.js'), 'watchAmbiguousCommand'));
28
38
  // Baseline of GITNEXUS_EMBEDDING_DIMS captured by the analyze preAction hook
29
39
  // before it overwrites the var, so the postAction hook can restore it. The
30
40
  // analyzeCommand env snapshot is taken AFTER this hook runs, so it cannot undo
@@ -38,7 +48,8 @@ program
38
48
  .description('Index a repository (full analysis)')
39
49
  .option('--watch', 'Keep the index current with serialized incremental refreshes')
40
50
  .option('--debounce <ms>', 'Watch quiet period before refreshing (default: 300 milliseconds)')
41
- .option('-f, --force', 'Force full re-index even if up to date')
51
+ .option('-f, --force', 'Force graph and FTS rebuild; unchanged parser output may be reused')
52
+ .option('--no-parse-cache', 'Re-parse every source file instead of replaying cached parser output')
42
53
  .option('--repair-fts', 'Repair/rebuild search FTS indexes without full re-analysis')
43
54
  .option('--embeddings [limit]', 'Enable embedding generation for semantic search (off by default). ' +
44
55
  'Optional [limit] overrides the 50,000-node safety cap; pass 0 to disable the cap entirely.')
@@ -46,7 +57,7 @@ program
46
57
  'preserves any embeddings already present in the index.')
47
58
  .option('--skills', 'Generate repo-specific skill files from detected communities ' +
48
59
  '(no-op when --index-only is also set).')
49
- .option('--skip-agents-md', 'Skip updating the gitnexus section in AGENTS.md and CLAUDE.md')
60
+ .option('--skip-agents-md', 'Skip updating the gitnexus section in AGENTS.md and CLAUDE.md. Does not skip standard skills in .claude/skills or .agents/skills; use --skip-skills for those. Community skills from --skills are unaffected.')
50
61
  .option('--pdg', 'Build the control-flow-graph / PDG substrate (BasicBlock nodes + CFG edges) ' +
51
62
  'for supported languages. Opt-in; off by default. (#2081 M1)')
52
63
  .option('--default-branch <branch>', 'Default branch used in the generated regression-compare example (base_ref). ' +
@@ -73,6 +84,10 @@ program
73
84
  .option('--wal-checkpoint-threshold <bytes>', 'LadybugDB WAL auto-checkpoint threshold in bytes during analyze ' +
74
85
  '(integer >= -1; default: 67108864 = 64 MiB; -1 keeps Ladybug stock ~16 MiB).')
75
86
  .option('--workers <n>', 'Parse worker pool size (>=1). Default: cores-1 capped at 16, auto-sized to the repo.')
87
+ .option('--spring-actuator <path>', 'Import local Spring Boot Actuator JSON snapshots (mappings, beans, conditions, ' +
88
+ 'configprops, env). Explicit opt-in; disabled by default.')
89
+ .option('--asyncapi-spec <path>', 'Read AsyncAPI 3.x documents from this directory or file and resolve broker ' +
90
+ 'addresses from them. Explicit opt-in; disabled by default.')
76
91
  .option('--embedding-threads <n>', 'Limit local ONNX embedding CPU threads')
77
92
  .option('--embedding-batch-size <n>', 'Number of nodes per embedding batch')
78
93
  .option('--embedding-sub-batch-size <n>', 'Number of chunks per embedding model call')
@@ -149,7 +164,7 @@ program
149
164
  .option('--http', 'Serve MCP over HTTP instead of stdio (for remote clients)')
150
165
  .option('-p, --port <port>', 'HTTP port (only with --http). Default: 3000', '3000')
151
166
  .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')
152
- .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.')
167
+ .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, which also enables MCP Bearer auth on gitnexus serve's /api/mcp route. Required for a non-loopback bind (--host 0.0.0.0/::), which otherwise refuses to start.")
153
168
  .action(createLbugLazyAction(() => import('./mcp.js'), 'mcpCommand'));
154
169
  program
155
170
  .command('list')
@@ -165,6 +180,10 @@ program
165
180
  .command('doctor')
166
181
  .description('Show runtime platform capabilities and embedding configuration')
167
182
  .action(createLazyAction(() => import('./doctor.js'), 'doctorCommand'));
183
+ program
184
+ .command('update')
185
+ .description('Install the latest published GitNexus globally (`npm i -g gitnexus@<x.y.z>`).')
186
+ .action(createLazyAction(() => import('./update.js'), 'updateCommand'));
168
187
  program
169
188
  .command('embeddings')
170
189
  .description('Manage the on-demand local embedding runtime')
@@ -309,6 +328,14 @@ program
309
328
  .option('--host <host>', 'Bind address or resolvable hostname (default: 127.0.0.1; non-loopback requires GITNEXUS_AUTH_TOKEN; hostnames resolve to IPv4)')
310
329
  .option('--idle-timeout <seconds>', 'Auto-shutdown after N seconds idle (0 = disabled)', '0')
311
330
  .action(createLbugLazyAction(() => import('./eval-server.js'), 'evalServerCommand'));
331
+ program.command('__update-check', { hidden: true }).action(async () => {
332
+ const { refresh } = await import('../core/update-check.js');
333
+ await refresh();
334
+ });
312
335
  registerGroupCommands(program);
313
336
  localizeCliHelp(program);
337
+ program.hook('preAction', (_thisCommand, actionCommand) => {
338
+ writeCommandBanner(actionCommand);
339
+ });
340
+ runProcessCliUpdateNotice(packageVersion());
314
341
  program.parse(process.argv);
package/dist/cli/mcp.d.ts CHANGED
@@ -26,9 +26,24 @@
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
+ import type { UpdateState } from '../core/update-check.js';
30
+ interface McpUpdateLogger {
31
+ info(bindings: Record<string, unknown>, message: string): unknown;
32
+ }
33
+ interface McpUpdateChecker {
34
+ evaluate(): Promise<UpdateState | null>;
35
+ armUpdateRefreshScheduler(onState: (state: UpdateState | null) => void): () => void;
36
+ }
37
+ type LoadMcpUpdateChecker = () => Promise<McpUpdateChecker>;
38
+ /**
39
+ * Start the process-scoped MCP update adapter after its transport startup
40
+ * boundary. All failures stay inside this best-effort side channel.
41
+ */
42
+ export declare function startMcpUpdateNotifier(logger: McpUpdateLogger, loadChecker?: LoadMcpUpdateChecker): Promise<void>;
29
43
  export declare const mcpCommand: (options?: {
30
44
  http?: boolean;
31
45
  port?: string;
32
46
  host?: string;
33
47
  authToken?: string;
34
48
  }) => Promise<void>;
49
+ export {};
package/dist/cli/mcp.js CHANGED
@@ -27,6 +27,48 @@
27
27
  * `gitnexus/test/integration/mcp/import-closure.test.ts` enforces this.
28
28
  */
29
29
  import { installGlobalStdoutSentinel } from '../mcp/stdio-context.js';
30
+ const announcedUpdateVersions = new Set();
31
+ /**
32
+ * Start the process-scoped MCP update adapter after its transport startup
33
+ * boundary. All failures stay inside this best-effort side channel.
34
+ */
35
+ export async function startMcpUpdateNotifier(logger, loadChecker = () => import('../core/update-check.js')) {
36
+ let checker;
37
+ try {
38
+ checker = await loadChecker();
39
+ }
40
+ catch {
41
+ return;
42
+ }
43
+ const announce = (state) => {
44
+ try {
45
+ if (!state?.updateAvailable ||
46
+ !state.latestVersion ||
47
+ announcedUpdateVersions.has(state.latestVersion)) {
48
+ return;
49
+ }
50
+ announcedUpdateVersions.add(state.latestVersion);
51
+ logger.info({ event: 'gitnexus.update_available', latestVersion: state.latestVersion }, 'GitNexus update available');
52
+ }
53
+ catch {
54
+ // Logging must never escape into MCP startup or scheduler promises.
55
+ }
56
+ };
57
+ try {
58
+ announce(await checker.evaluate());
59
+ }
60
+ catch {
61
+ // Cache evaluation and any detached refresh are best-effort.
62
+ }
63
+ let stop;
64
+ try {
65
+ stop = checker.armUpdateRefreshScheduler(announce);
66
+ }
67
+ catch {
68
+ return;
69
+ }
70
+ process.once('exit', () => stop?.());
71
+ }
30
72
  export const mcpCommand = async (options) => {
31
73
  // Install the global stdout sentinel as the very first thing — before
32
74
  // ANY other module loads. The static-import closure above is leaf-only
@@ -94,8 +136,10 @@ export const mcpCommand = async (options) => {
94
136
  logger.error({ err: err instanceof Error ? err.message : err }, 'Failed to start the MCP HTTP server');
95
137
  process.exit(1);
96
138
  }
139
+ void startMcpUpdateNotifier(logger).catch(() => { });
97
140
  return;
98
141
  }
99
142
  // Start MCP server (serves all repos, discovers new ones lazily)
100
143
  await startMCPServer(backend, repositoryPolicy);
144
+ void startMcpUpdateNotifier(logger).catch(() => { });
101
145
  };
@@ -7,11 +7,12 @@
7
7
  * prebuilds activated via node-gyp-build. All can be skipped via
8
8
  * GITNEXUS_SKIP_OPTIONAL_GRAMMARS=1 (postinstall scripts), or can silently
9
9
  * soft-fail when no prebuild matches the host platform (and a source build was
10
- * unavailable / not attempted).
10
+ * unavailable / not attempted). tree-sitter-zig is the one npm-installed
11
+ * optionalDependency in the list; its `probe` overrides the vendored load.
11
12
  *
12
13
  * Either path produces the same observable: the .node binding is absent
13
14
  * at runtime. This helper detects that condition and surfaces a single
14
- * stderr line per missing grammar so users learn why .dart/.proto/.swift/.kt
15
+ * stderr line per missing grammar so users learn why .dart/.proto/.swift/.kt/.zig
15
16
  * support is unavailable instead of silently getting a degraded index.
16
17
  */
17
18
  /**
@@ -7,17 +7,20 @@
7
7
  * prebuilds activated via node-gyp-build. All can be skipped via
8
8
  * GITNEXUS_SKIP_OPTIONAL_GRAMMARS=1 (postinstall scripts), or can silently
9
9
  * soft-fail when no prebuild matches the host platform (and a source build was
10
- * unavailable / not attempted).
10
+ * unavailable / not attempted). tree-sitter-zig is the one npm-installed
11
+ * optionalDependency in the list; its `probe` overrides the vendored load.
11
12
  *
12
13
  * Either path produces the same observable: the .node binding is absent
13
14
  * at runtime. This helper detects that condition and surfaces a single
14
- * stderr line per missing grammar so users learn why .dart/.proto/.swift/.kt
15
+ * stderr line per missing grammar so users learn why .dart/.proto/.swift/.kt/.zig
15
16
  * support is unavailable instead of silently getting a degraded index.
16
17
  */
18
+ import { createRequire } from 'node:module';
17
19
  import { SupportedLanguages } from '../_shared/index.js';
18
20
  import { isGrammarRuntimeSkipped } from '../core/tree-sitter/parser-loader.js';
19
21
  import { requireVendoredGrammar } from '../core/tree-sitter/vendored-grammars.js';
20
22
  import { cliWarn } from './cli-message.js';
23
+ const _require = createRequire(import.meta.url);
21
24
  const OPTIONAL_GRAMMARS = [
22
25
  {
23
26
  name: 'tree-sitter-dart',
@@ -38,6 +41,14 @@ const OPTIONAL_GRAMMARS = [
38
41
  extensions: ['.kt', '.kts'],
39
42
  language: SupportedLanguages.Kotlin,
40
43
  },
44
+ {
45
+ name: 'tree-sitter-zig',
46
+ pkg: '@tree-sitter-grammars/tree-sitter-zig',
47
+ extensions: ['.zig'],
48
+ language: SupportedLanguages.Zig,
49
+ // npm optionalDependency, not vendored — probe via plain require.
50
+ probe: () => _require('@tree-sitter-grammars/tree-sitter-zig'),
51
+ },
41
52
  ];
42
53
  /**
43
54
  * The file extensions backed by an optional grammar — the single source for
@@ -73,7 +84,12 @@ export function detectMissingOptionalGrammars() {
73
84
  continue;
74
85
  }
75
86
  try {
76
- requireVendoredGrammar(g.pkg);
87
+ if (g.probe !== undefined) {
88
+ g.probe();
89
+ }
90
+ else {
91
+ requireVendoredGrammar(g.pkg);
92
+ }
77
93
  }
78
94
  catch (err) {
79
95
  const code = err?.code;
package/dist/cli/setup.js CHANGED
@@ -9,10 +9,10 @@ import fs from 'fs/promises';
9
9
  import path from 'path';
10
10
  import os from 'os';
11
11
  import { execFile, execFileSync } from 'child_process';
12
- import { createRequire } from 'module';
13
12
  import { promisify } from 'util';
14
13
  import { fileURLToPath } from 'url';
15
14
  import { parseTree, modify, applyEdits, parse as parseJsonc } from 'jsonc-parser';
15
+ import { packageVersion } from '../core/package-version.js';
16
16
  import { getGlobalDir } from '../storage/repo-manager.js';
17
17
  import { getEditorTargets, mcpTarget, skillTarget, hookTarget, detectIndentation, isEnoent, } from './editor-targets.js';
18
18
  const __filename = fileURLToPath(import.meta.url);
@@ -26,15 +26,14 @@ const execFileAsync = promisify(execFile);
26
26
  // re-stamped every release by scripts/sync-plugin-manifests.mjs (#2445),
27
27
  // since they too execute `gitnexus@<version>` on connect. Only the READMEs
28
28
  // stay on `gitnexus@latest` — they're quickstart docs, not executed state.
29
- const _require = createRequire(import.meta.url);
30
- const _pkg = _require('../../package.json');
31
- if (typeof _pkg.version !== 'string' || !_pkg.version) {
29
+ const PKG_VERSION = packageVersion();
30
+ if (!PKG_VERSION) {
32
31
  throw new Error('gitnexus/package.json#version is missing or not a string — cannot generate MCP fallback config.');
33
32
  }
34
33
  // Version-pinned ref for the persisted MCP entry — deliberately distinct from
35
34
  // the cjs's exported `gitnexus@latest` hint ref (resolve-analyze-cmd.cjs); the
36
35
  // two are not unified (see the comment above and that file's MCP_PINNED_REF).
37
- const MCP_PINNED_REF = `gitnexus@${_pkg.version}`;
36
+ const MCP_PINNED_REF = `gitnexus@${PKG_VERSION}`;
38
37
  /**
39
38
  * Build the `command` string written into an editor's hook settings, which the
40
39
  * editor shell-evaluates. `hookPath` is already forward-slash-normalized.
@@ -947,15 +946,29 @@ async function installSkillsTo(targetDir) {
947
946
  for (const [skillName, source] of skillSources) {
948
947
  const skillDir = path.join(targetDir, skillName);
949
948
  try {
950
- if (source.isDirectory) {
951
- const dirSource = path.join(skillsRoot, skillName);
952
- await copyDirRecursive(dirSource, skillDir);
949
+ const sourceSkillPath = source.isDirectory
950
+ ? path.join(skillsRoot, skillName, 'SKILL.md')
951
+ : path.join(skillsRoot, `${skillName}.md`);
952
+ const destinationSkillPath = path.join(skillDir, 'SKILL.md');
953
+ const [sourceSkillContent, destinationSkillContent] = await Promise.all([
954
+ fs.readFile(sourceSkillPath, 'utf-8'),
955
+ fs.readFile(destinationSkillPath, 'utf-8').catch((err) => {
956
+ if (!isEnoent(err))
957
+ throw err;
958
+ return null;
959
+ }),
960
+ ]);
961
+ const preserved = destinationSkillContent !== null && destinationSkillContent !== sourceSkillContent;
962
+ if (preserved && !source.isDirectory) {
963
+ console.log(`[gitnexus] preserved customized skill ${destinationSkillPath}; ` +
964
+ 'delete the file and rerun setup to refresh it.');
953
965
  }
954
- else {
955
- const flatSource = path.join(skillsRoot, `${skillName}.md`);
956
- const content = await fs.readFile(flatSource, 'utf-8');
966
+ else if (source.isDirectory) {
967
+ await copyDirRecursive(path.join(skillsRoot, skillName), skillDir);
968
+ }
969
+ else if (!preserved) {
957
970
  await fs.mkdir(skillDir, { recursive: true });
958
- await fs.writeFile(path.join(skillDir, 'SKILL.md'), content, 'utf-8');
971
+ await fs.writeFile(destinationSkillPath, sourceSkillContent, 'utf-8');
959
972
  }
960
973
  // A directory superseded by a shipped rename is warned about, never
961
974
  // deleted: the installer cannot prove it owns the contents (users
@@ -968,7 +981,8 @@ async function installSkillsTo(targetDir) {
968
981
  `left ${legacyDir} in place — delete it manually if you have not customized it.`);
969
982
  }
970
983
  }
971
- installed.push(skillName);
984
+ if (!preserved)
985
+ installed.push(skillName);
972
986
  }
973
987
  catch {
974
988
  // Source skill not found — skip
@@ -987,10 +1001,22 @@ async function copyDirRecursive(src, dest) {
987
1001
  const destPath = path.join(dest, entry.name);
988
1002
  if (entry.isDirectory()) {
989
1003
  await copyDirRecursive(srcPath, destPath);
1004
+ continue;
990
1005
  }
991
- else {
992
- await fs.copyFile(srcPath, destPath);
1006
+ const [srcBuf, destBuf] = await Promise.all([
1007
+ fs.readFile(srcPath),
1008
+ fs.readFile(destPath).catch((err) => {
1009
+ if (!isEnoent(err))
1010
+ throw err;
1011
+ return null;
1012
+ }),
1013
+ ]);
1014
+ if (destBuf !== null && !destBuf.equals(srcBuf)) {
1015
+ console.log(`[gitnexus] preserved customized skill ${destPath}; ` +
1016
+ 'delete the file and rerun setup to refresh it.');
1017
+ continue;
993
1018
  }
1019
+ await fs.writeFile(destPath, srcBuf);
994
1020
  }
995
1021
  }
996
1022
  /**
@@ -0,0 +1,34 @@
1
+ import { type ValidatedUpdateCache } from '../core/update-cache.js';
2
+ type SpawnResult = {
3
+ unref(): void;
4
+ };
5
+ type SpawnLike = (command: string, args: readonly string[], options: {
6
+ detached: true;
7
+ stdio: 'ignore';
8
+ windowsHide: true;
9
+ }) => SpawnResult;
10
+ export interface CliUpdateNoticeDependencies {
11
+ argv: string[];
12
+ env: NodeJS.ProcessEnv;
13
+ installedVersion: string;
14
+ isTTY: boolean | undefined;
15
+ eligible: boolean;
16
+ now: number;
17
+ readCache: (options: {
18
+ env: NodeJS.ProcessEnv;
19
+ now: number;
20
+ }) => ValidatedUpdateCache | null;
21
+ writeStderr: (line: string) => unknown;
22
+ spawn: SpawnLike;
23
+ }
24
+ export declare function updateNoticeText(installedVersion: string, latestVersion: string): string;
25
+ /** Shared cache-gated notice line used by the CLI banner and `doctor`. */
26
+ export declare function cachedUpdateNoticeLine(options: {
27
+ installedVersion: string;
28
+ eligible: boolean;
29
+ env: NodeJS.ProcessEnv;
30
+ readCache: () => ValidatedUpdateCache | null;
31
+ }): string | null;
32
+ export declare function runCliUpdateNotice(deps: CliUpdateNoticeDependencies): void;
33
+ export declare function runProcessCliUpdateNotice(installedVersion: string): void;
34
+ export {};
@@ -0,0 +1,91 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { updateEligibleInstallSync } from '../core/install-context.js';
3
+ import { isNewerVersion, readValidatedUpdateCacheSync, updateNotifierOptedOut, updateRefreshInProgress, } from '../core/update-cache.js';
4
+ import { t } from './i18n/index.js';
5
+ const EXCLUDED_COMMANDS = new Set([
6
+ 'augment',
7
+ 'mcp',
8
+ 'serve',
9
+ 'eval-server',
10
+ 'update',
11
+ '__update-check',
12
+ ]);
13
+ const EXCLUDED_FLAGS = new Set(['--help', '-h', '--version', '-V']);
14
+ function excludedInvocation(argv) {
15
+ const args = argv.slice(2);
16
+ if (args.some((arg) => EXCLUDED_FLAGS.has(arg)))
17
+ return true;
18
+ const command = args.find((arg) => !arg.startsWith('-'));
19
+ return command !== undefined && EXCLUDED_COMMANDS.has(command);
20
+ }
21
+ export function updateNoticeText(installedVersion, latestVersion) {
22
+ return t('update.available', { installedVersion, latestVersion });
23
+ }
24
+ /** Shared cache-gated notice line used by the CLI banner and `doctor`. */
25
+ export function cachedUpdateNoticeLine(options) {
26
+ try {
27
+ if (!options.eligible || updateNotifierOptedOut(options.env))
28
+ return null;
29
+ const cache = options.readCache();
30
+ if (!cache?.latestVersion || !isNewerVersion(options.installedVersion, cache.latestVersion)) {
31
+ return null;
32
+ }
33
+ return updateNoticeText(options.installedVersion, cache.latestVersion);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ export function runCliUpdateNotice(deps) {
40
+ try {
41
+ if (deps.isTTY !== true ||
42
+ updateNotifierOptedOut(deps.env) ||
43
+ !deps.eligible ||
44
+ excludedInvocation(deps.argv)) {
45
+ return;
46
+ }
47
+ const cache = deps.readCache({ env: deps.env, now: deps.now });
48
+ if (cache?.latestVersion && isNewerVersion(deps.installedVersion, cache.latestVersion)) {
49
+ deps.writeStderr(`${updateNoticeText(deps.installedVersion, cache.latestVersion)}\n`);
50
+ }
51
+ if (cache === null || cache.stale) {
52
+ // Coalesce parallel invocations: when a live process holds the refresh
53
+ // lock, its refresh covers us, so don't fork another CLI.
54
+ if (!updateRefreshInProgress(deps.env)) {
55
+ try {
56
+ deps
57
+ .spawn(process.execPath, [deps.argv[1] ?? '', '__update-check'], {
58
+ detached: true,
59
+ stdio: 'ignore',
60
+ windowsHide: true,
61
+ })
62
+ .unref();
63
+ }
64
+ catch {
65
+ // Update refresh is best-effort and must never reach Commander parsing.
66
+ }
67
+ }
68
+ }
69
+ }
70
+ catch {
71
+ // Cache reads and all adapter logic fail open.
72
+ }
73
+ }
74
+ export function runProcessCliUpdateNotice(installedVersion) {
75
+ if (process.stderr.isTTY !== true ||
76
+ updateNotifierOptedOut(process.env) ||
77
+ excludedInvocation(process.argv)) {
78
+ return;
79
+ }
80
+ runCliUpdateNotice({
81
+ argv: process.argv,
82
+ env: process.env,
83
+ installedVersion,
84
+ isTTY: process.stderr.isTTY,
85
+ eligible: updateEligibleInstallSync(),
86
+ now: Date.now(),
87
+ readCache: readValidatedUpdateCacheSync,
88
+ writeStderr: (line) => process.stderr.write(line),
89
+ spawn: nodeSpawn,
90
+ });
91
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Explicit `gitnexus update`: refresh the latest dist-tag, then install
3
+ * `gitnexus@<version>` globally with npm — the same shape as `claude update`
4
+ * / `codex update`. Other commands only notify; they never spawn npm.
5
+ */
6
+ import { type UpdateState } from '../core/update-check.js';
7
+ export declare const UPDATE_PACKAGE = "gitnexus";
8
+ export interface UpdateCommandDependencies {
9
+ installedVersion: string;
10
+ refresh: (options: {
11
+ eligible: true;
12
+ ignoreOptOut: true;
13
+ installedVersion: string;
14
+ }) => Promise<UpdateState | null>;
15
+ writeStdout: (line: string) => void;
16
+ runInstall: (version: string) => Promise<number>;
17
+ setExitCode: (code: number) => void;
18
+ }
19
+ export declare function updateInstallArgs(version: string): string[];
20
+ export declare function updateInstallCommand(version: string): string;
21
+ export declare function updateCommand(maybeDeps?: unknown): Promise<void>;
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Explicit `gitnexus update`: refresh the latest dist-tag, then install
3
+ * `gitnexus@<version>` globally with npm — the same shape as `claude update`
4
+ * / `codex update`. Other commands only notify; they never spawn npm.
5
+ */
6
+ import { spawn } from 'node:child_process';
7
+ import { homedir } from 'node:os';
8
+ import { composeWin32NpmCommand } from '../core/embeddings/runtime-install.js';
9
+ import { packageVersion } from '../core/package-version.js';
10
+ import { STRICT_UPDATE_VERSION } from '../core/update-cache.js';
11
+ import { refresh } from '../core/update-check.js';
12
+ import { t } from './i18n/index.js';
13
+ export const UPDATE_PACKAGE = 'gitnexus';
14
+ function defaultInstalledVersion() {
15
+ return packageVersion();
16
+ }
17
+ export function updateInstallArgs(version) {
18
+ return ['i', '-g', `${UPDATE_PACKAGE}@${version}`];
19
+ }
20
+ export function updateInstallCommand(version) {
21
+ return `npm ${updateInstallArgs(version).join(' ')}`;
22
+ }
23
+ function isTestDeps(value) {
24
+ return (typeof value === 'object' &&
25
+ value !== null &&
26
+ ('refresh' in value || 'runInstall' in value || 'writeStdout' in value));
27
+ }
28
+ function defaultRunInstall(version) {
29
+ const args = updateInstallArgs(version);
30
+ return new Promise((resolve, reject) => {
31
+ const child = process.platform === 'win32'
32
+ ? spawn(composeWin32NpmCommand(args), {
33
+ cwd: homedir(),
34
+ windowsHide: true,
35
+ shell: true,
36
+ stdio: 'inherit',
37
+ })
38
+ : spawn('npm', args, {
39
+ cwd: homedir(),
40
+ windowsHide: true,
41
+ stdio: 'inherit',
42
+ });
43
+ child.on('error', reject);
44
+ child.on('exit', (code, signal) => {
45
+ resolve(signal ? 1 : (code ?? 1));
46
+ });
47
+ });
48
+ }
49
+ export async function updateCommand(maybeDeps) {
50
+ const deps = isTestDeps(maybeDeps) ? maybeDeps : {};
51
+ const installedVersion = deps.installedVersion ?? defaultInstalledVersion();
52
+ const runRefresh = deps.refresh ?? refresh;
53
+ const writeStdout = deps.writeStdout ?? ((line) => console.log(line));
54
+ const runInstall = deps.runInstall ?? defaultRunInstall;
55
+ const setExitCode = deps.setExitCode ??
56
+ ((code) => {
57
+ process.exitCode = code;
58
+ });
59
+ const state = await runRefresh({
60
+ eligible: true,
61
+ ignoreOptOut: true,
62
+ installedVersion,
63
+ });
64
+ const latestVersion = state?.latestVersion && STRICT_UPDATE_VERSION.test(state.latestVersion)
65
+ ? state.latestVersion
66
+ : undefined;
67
+ if (state?.updateAvailable && latestVersion) {
68
+ writeStdout(t('update.available', { installedVersion, latestVersion }));
69
+ writeStdout(t('update.installing', { command: updateInstallCommand(latestVersion) }));
70
+ try {
71
+ const code = await runInstall(latestVersion);
72
+ if (code !== 0) {
73
+ writeStdout(t('update.installFailed', { command: updateInstallCommand(latestVersion) }));
74
+ setExitCode(code);
75
+ return;
76
+ }
77
+ }
78
+ catch (error) {
79
+ writeStdout(t('update.installError', {
80
+ message: error instanceof Error ? error.message : String(error),
81
+ }));
82
+ setExitCode(1);
83
+ return;
84
+ }
85
+ writeStdout(t('update.installed', { version: latestVersion }));
86
+ return;
87
+ }
88
+ if (latestVersion) {
89
+ writeStdout(t('update.current', { installedVersion }));
90
+ return;
91
+ }
92
+ writeStdout(t('update.checkFailed'));
93
+ }
@@ -1,20 +1 @@
1
- import { type AnalyzeOptions as CoreAnalyzeOptions } from '../core/run-analyze.js';
2
- import type { AnalyzerRunnerIdentity } from '../storage/repo-manager.js';
3
- import type { AnalyzeOptions } from './analyze-options.js';
4
- import { type WatchRefreshError } from './watch-queue.js';
5
- export type WatchCliOptions = AnalyzeOptions;
6
- export declare function isRelevantWatchPath(filePath: string): boolean;
7
- export interface WatchEnvironmentBaseline {
8
- readonly maxFileSize: string | undefined;
9
- readonly workerTimeout: string | undefined;
10
- readonly verbose: string | undefined;
11
- }
12
- export declare function resolveWatchOptions(repoPath: string, cli: WatchCliOptions, baseline: WatchEnvironmentBaseline, reportIgnoredConfig?: (names: readonly string[]) => void): Promise<CoreAnalyzeOptions>;
13
- export interface WatchFileLoop {
14
- readonly waitForIdle: () => Promise<void>;
15
- readonly close: () => Promise<void>;
16
- }
17
- export declare function shouldStopAfterWatchRefreshFailure(error: unknown, paths: readonly string[]): boolean;
18
- /** Start the real filesystem watcher with bounded, serialized refreshes. */
19
- export declare function startWatchFileLoop(repoPath: string, debounceMs: number, refresh: (paths: readonly string[]) => Promise<void>, onError: WatchRefreshError, onWatcherError?: (error: unknown) => void): Promise<WatchFileLoop>;
20
- export declare function watchCommandWithRunnerIdentity(runnerIdentityAtBootstrap: AnalyzerRunnerIdentity, inputPath?: string, cliOptions?: WatchCliOptions): Promise<void>;
1
+ export declare function watchAmbiguousCommand(_action?: string): Promise<void>;