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.
- package/README.md +95 -26
- package/dist/_shared/graph/types.d.ts +81 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -1
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +1 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +4 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +4 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +15 -0
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +4 -0
- package/dist/cli/ai-context.js +90 -14
- package/dist/cli/analyze-config.js +14 -0
- package/dist/cli/analyze-options.d.ts +14 -0
- package/dist/cli/analyze-watch.d.ts +20 -0
- package/dist/cli/analyze-watch.js +434 -0
- package/dist/cli/analyze.js +27 -9
- package/dist/cli/auto-sync.d.ts +1 -0
- package/dist/cli/auto-sync.js +107 -0
- package/dist/cli/command-banner.d.ts +15 -0
- package/dist/cli/command-banner.js +42 -0
- package/dist/cli/detect-changes-format.js +21 -0
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.js +14 -0
- package/dist/cli/group.js +7 -1
- package/dist/cli/help-i18n.js +4 -0
- package/dist/cli/i18n/en.d.ts +18 -3
- package/dist/cli/i18n/en.js +18 -3
- package/dist/cli/i18n/resources.d.ts +33 -3
- package/dist/cli/i18n/zh-CN.d.ts +15 -0
- package/dist/cli/i18n/zh-CN.js +18 -3
- package/dist/cli/index.js +34 -7
- package/dist/cli/mcp.d.ts +15 -0
- package/dist/cli/mcp.js +44 -0
- package/dist/cli/optional-grammars.d.ts +3 -2
- package/dist/cli/optional-grammars.js +19 -3
- package/dist/cli/setup.js +41 -15
- package/dist/cli/update-notice.d.ts +34 -0
- package/dist/cli/update-notice.js +91 -0
- package/dist/cli/update.d.ts +21 -0
- package/dist/cli/update.js +93 -0
- package/dist/cli/watch.d.ts +1 -20
- package/dist/cli/watch.js +5 -371
- package/dist/core/analysis-feature-registry.d.ts +2 -0
- package/dist/core/analysis-feature-registry.js +15 -0
- package/dist/core/analyzer-identity.js +21 -3
- package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
- package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
- package/dist/core/auto-sync/config.d.ts +33 -0
- package/dist/core/auto-sync/config.js +320 -0
- package/dist/core/auto-sync/index.d.ts +6 -0
- package/dist/core/auto-sync/index.js +6 -0
- package/dist/core/auto-sync/path-security.d.ts +9 -0
- package/dist/core/auto-sync/path-security.js +251 -0
- package/dist/core/auto-sync/repo.d.ts +1 -0
- package/dist/core/auto-sync/repo.js +6 -0
- package/dist/core/auto-sync/runner.d.ts +44 -0
- package/dist/core/auto-sync/runner.js +428 -0
- package/dist/core/auto-sync/starter.d.ts +50 -0
- package/dist/core/auto-sync/starter.js +497 -0
- package/dist/core/auto-sync/state.d.ts +37 -0
- package/dist/core/auto-sync/state.js +119 -0
- package/dist/core/group/config-parser.js +8 -1
- package/dist/core/group/cross-impact.d.ts +3 -0
- package/dist/core/group/cross-impact.js +36 -4
- package/dist/core/group/extractors/http-patterns/java.js +22 -8
- package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
- package/dist/core/group/extractors/http-patterns/node.js +145 -8
- package/dist/core/group/extractors/http-patterns/python.js +11 -7
- package/dist/core/group/extractors/http-route-extractor.js +63 -17
- package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
- package/dist/core/group/group-lock.js +5 -6
- package/dist/core/group/normalization.d.ts +38 -1
- package/dist/core/group/normalization.js +59 -3
- package/dist/core/group/service.d.ts +11 -0
- package/dist/core/group/service.js +13 -1
- package/dist/core/group/storage.js +2 -2
- package/dist/core/group/sync.d.ts +24 -1
- package/dist/core/group/sync.js +46 -8
- package/dist/core/group/types.d.ts +13 -0
- package/dist/core/incremental/derived-writeback.d.ts +36 -0
- package/dist/core/incremental/derived-writeback.js +68 -0
- package/dist/core/incremental/spring-config-drift.d.ts +12 -0
- package/dist/core/incremental/spring-config-drift.js +46 -0
- package/dist/core/incremental/subgraph-extract.d.ts +7 -4
- package/dist/core/incremental/subgraph-extract.js +30 -5
- package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
- package/dist/core/ingestion/asyncapi/document.js +758 -0
- package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
- package/dist/core/ingestion/asyncapi/protocol.js +203 -0
- package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
- package/dist/core/ingestion/call-processor.js +3 -1
- package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
- package/dist/core/ingestion/class-extractors/generic.js +4 -1
- package/dist/core/ingestion/class-types.d.ts +6 -2
- package/dist/core/ingestion/destination-key.d.ts +59 -0
- package/dist/core/ingestion/destination-key.js +61 -0
- package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
- package/dist/core/ingestion/entry-point-scoring.js +8 -44
- package/dist/core/ingestion/export-detection.d.ts +37 -0
- package/dist/core/ingestion/export-detection.js +60 -0
- package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
- package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
- package/dist/core/ingestion/field-extractors/generic.js +12 -1
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
- package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
- package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
- package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
- package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
- package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
- package/dist/core/ingestion/import-resolvers/zig.js +193 -0
- package/dist/core/ingestion/language-config.d.ts +177 -0
- package/dist/core/ingestion/language-config.js +719 -0
- package/dist/core/ingestion/language-provider.d.ts +178 -1
- package/dist/core/ingestion/language-provider.js +22 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
- package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
- package/dist/core/ingestion/languages/java/captures.js +22 -1
- package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
- package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
- package/dist/core/ingestion/languages/java/spring-di.js +44 -2
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
- package/dist/core/ingestion/languages/java.js +18 -8
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
- package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
- package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
- package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
- package/dist/core/ingestion/languages/kotlin.js +24 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/rust/query.js +8 -8
- package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
- package/dist/core/ingestion/languages/zig/captures.js +2070 -0
- package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
- package/dist/core/ingestion/languages/zig/index.js +4 -0
- package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
- package/dist/core/ingestion/languages/zig/interpret.js +176 -0
- package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
- package/dist/core/ingestion/languages/zig/query.js +426 -0
- package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
- package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
- package/dist/core/ingestion/languages/zig.d.ts +32 -0
- package/dist/core/ingestion/languages/zig.js +130 -0
- package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
- package/dist/core/ingestion/method-extractors/generic.js +16 -4
- package/dist/core/ingestion/method-types.d.ts +10 -4
- package/dist/core/ingestion/model/field-registry.d.ts +3 -3
- package/dist/core/ingestion/model/field-registry.js +11 -7
- package/dist/core/ingestion/model/method-registry.d.ts +3 -3
- package/dist/core/ingestion/model/method-registry.js +13 -8
- package/dist/core/ingestion/model/registration-table.js +3 -0
- package/dist/core/ingestion/model/type-registry.js +8 -4
- package/dist/core/ingestion/pipeline-phases/di.js +47 -14
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
- package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
- package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
- package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
- package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
- package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
- package/dist/core/ingestion/pipeline.d.ts +30 -1
- package/dist/core/ingestion/pipeline.js +52 -14
- package/dist/core/ingestion/resolve-references.js +5 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
- package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
- package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
- package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
- package/dist/core/ingestion/route-extractors/spring.js +9 -5
- package/dist/core/ingestion/scope-extractor.js +8 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
- package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
- package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
- package/dist/core/ingestion/tree-sitter-queries.js +161 -0
- package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
- package/dist/core/ingestion/type-extractors/zig.js +17 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
- package/dist/core/ingestion/utils/ast-helpers.js +124 -6
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
- package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
- package/dist/core/ingestion/utils/test-file-path.js +87 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
- package/dist/core/ingestion/workers/parse-worker.js +85 -14
- package/dist/core/install-context.d.ts +4 -0
- package/dist/core/install-context.js +152 -0
- package/dist/core/lbug/csv-generator.d.ts +10 -1
- package/dist/core/lbug/csv-generator.js +92 -22
- package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
- package/dist/core/lbug/graph-emit-sink.js +4 -2
- package/dist/core/lbug/lbug-adapter.d.ts +100 -5
- package/dist/core/lbug/lbug-adapter.js +236 -24
- package/dist/core/lbug/schema.d.ts +6 -5
- package/dist/core/lbug/schema.js +84 -22
- package/dist/core/net/url-guard.d.ts +6 -0
- package/dist/core/net/url-guard.js +147 -0
- package/dist/core/package-version.d.ts +5 -0
- package/dist/core/package-version.js +10 -0
- package/dist/core/run-analyze.d.ts +21 -4
- package/dist/core/run-analyze.js +426 -117
- package/dist/core/search/fts-indexes.d.ts +19 -1
- package/dist/core/search/fts-indexes.js +28 -1
- package/dist/core/tree-sitter/parser-loader.js +16 -0
- package/dist/core/update-cache.d.ts +39 -0
- package/dist/core/update-cache.js +141 -0
- package/dist/core/update-check.d.ts +31 -0
- package/dist/core/update-check.js +274 -0
- package/dist/mcp/local/local-backend.d.ts +27 -13
- package/dist/mcp/local/local-backend.js +148 -60
- package/dist/mcp/repository-policy.d.ts +5 -1
- package/dist/mcp/repository-policy.js +48 -4
- package/dist/mcp/resources.js +10 -1
- package/dist/mcp/server.js +8 -9
- package/dist/mcp/tools.js +32 -22
- package/dist/server/analyze-launch.d.ts +2 -0
- package/dist/server/analyze-launch.js +2 -0
- package/dist/server/analyze-worker-protocol.d.ts +6 -1
- package/dist/server/analyze-worker.d.ts +1 -0
- package/dist/server/analyze-worker.js +38 -20
- package/dist/server/api.d.ts +5 -1
- package/dist/server/api.js +105 -88
- package/dist/server/git-clone.d.ts +40 -16
- package/dist/server/git-clone.js +253 -199
- package/dist/server/grep-params.d.ts +18 -0
- package/dist/server/grep-params.js +83 -0
- package/dist/server/grep-scan.d.ts +23 -0
- package/dist/server/grep-scan.js +107 -0
- package/dist/server/grep-worker.d.ts +1 -0
- package/dist/server/grep-worker.js +12 -0
- package/dist/server/mcp-http.d.ts +8 -0
- package/dist/server/mcp-http.js +16 -1
- package/dist/server/update-controller.d.ts +29 -0
- package/dist/server/update-controller.js +82 -0
- package/dist/storage/file-lock.d.ts +15 -0
- package/dist/storage/file-lock.js +155 -0
- package/dist/storage/fs-atomic.d.ts +24 -0
- package/dist/storage/fs-atomic.js +86 -2
- package/dist/storage/global-dir.d.ts +2 -0
- package/dist/storage/global-dir.js +6 -0
- package/dist/storage/parse-cache.d.ts +45 -7
- package/dist/storage/parse-cache.js +189 -42
- package/dist/storage/parsedfile-store.d.ts +41 -60
- package/dist/storage/parsedfile-store.js +247 -171
- package/dist/storage/repo-manager.d.ts +10 -4
- package/dist/storage/repo-manager.js +35 -25
- package/dist/storage/repo-meta.d.ts +34 -0
- package/dist/storage/v8-sidecar.d.ts +48 -0
- package/dist/storage/v8-sidecar.js +347 -0
- package/dist/types/pipeline.d.ts +14 -0
- package/dist/utils/process-identity.d.ts +2 -0
- package/dist/utils/process-identity.js +35 -0
- package/package.json +10 -4
- package/scripts/assert-web-assets.mjs +35 -0
- package/scripts/build-web.js +72 -0
- package/scripts/build.js +31 -28
- package/scripts/cross-platform-tests.ts +5 -0
- package/skills/gitnexus-cli.md +5 -1
- package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
- package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
- package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
- package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
- package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
- package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
- package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
- package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
- package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
- package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
- package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
- package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
- package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
- package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
- package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
- package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
- package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
- package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
- package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
- package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
- package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
- package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
- package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
- package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
- package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
- package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
- package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
- package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
- package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
- package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
- package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
- package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
- package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
- package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
- package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
- package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
- package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
- package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
- package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
- package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
- package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
- package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
- package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
- package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
- package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
- package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
- package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
- package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
- package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
- package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
- package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
- package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
- package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
- package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
- package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
- package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
- package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
- package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
- package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
- package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
- package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
- package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
- package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
- package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
- package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
- package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
- package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
- package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
- package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
- package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
- package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
- package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
- package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
- package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
- package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
- package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
- package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
- package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
- package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
- package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
- package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
- package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
- package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
- package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
- package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
- package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
- package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
- package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
- package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
- package/web/assets/src-Df5C1Nz4.js +1 -0
- package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
- package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
- package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
- package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
- package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
- package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
- package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
- package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
- package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
- package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
- package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
- package/web/index.html +19 -17
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
- package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
- package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
- package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
- package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
- package/web/assets/src-C5sx_gMp.js +0 -1
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
- /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 {
|
|
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
|
-
|
|
12
|
-
|
|
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(
|
|
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
|
|
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>',
|
|
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
|
-
|
|
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
|
|
30
|
-
|
|
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@${
|
|
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
|
-
|
|
951
|
-
|
|
952
|
-
|
|
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
|
-
|
|
956
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
992
|
-
|
|
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
|
+
}
|
package/dist/cli/watch.d.ts
CHANGED
|
@@ -1,20 +1 @@
|
|
|
1
|
-
|
|
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>;
|