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
|
@@ -19,12 +19,13 @@ import { LBUG_ID_PROBE_BATCH_SIZE, LBUG_QUERY_BATCH_SIZE } from '../../core/lbug
|
|
|
19
19
|
import { chunk, mapConcurrent } from '../../lib/utils.js';
|
|
20
20
|
import { pathSuffixOf } from './path-predicate.js';
|
|
21
21
|
import { toOneBasedLine } from '../../core/ingestion/utils/line-base.js';
|
|
22
|
+
import { isTestFilePath } from '../../core/ingestion/utils/test-file-path.js';
|
|
22
23
|
import { isWalCorruptionError, WAL_RECOVERY_SUGGESTION } from '../../core/lbug/lbug-config.js';
|
|
23
24
|
// Embedding imports are lazy (dynamic import) to avoid loading onnxruntime-node
|
|
24
25
|
// at MCP server startup — crashes on unsupported Node ABI versions (#89)
|
|
25
26
|
// git utilities available if needed
|
|
26
27
|
// import { isGitRepo, getCurrentCommit, getGitRoot } from '../../storage/git.js';
|
|
27
|
-
import { parseDiffHunks, coalesceHunksByPath, hunksOverlapRange, getCanonicalRepoRoot, getGitRoot, } from '../../storage/git.js';
|
|
28
|
+
import { parseDiffHunks, coalesceHunksByPath, hunksOverlapRange, findGitRootByDotGit, getCanonicalRepoRoot, getGitRoot, } from '../../storage/git.js';
|
|
28
29
|
import { realpathSync } from 'fs';
|
|
29
30
|
import { listRegisteredRepos, cleanupOldKuzuFiles, canonicalizePath, getStoragePaths, loadMeta, RegistryAmbiguousTargetError, } from '../../storage/repo-manager.js';
|
|
30
31
|
import { GroupService, } from '../../core/group/service.js';
|
|
@@ -190,30 +191,8 @@ function normalizeToolParams(method, params) {
|
|
|
190
191
|
}
|
|
191
192
|
// AI context generation is CLI-only (gitnexus analyze)
|
|
192
193
|
// import { generateAIContextFiles } from '../../cli/ai-context.js';
|
|
193
|
-
/**
|
|
194
|
-
|
|
195
|
-
* Matches common test file patterns across all supported languages.
|
|
196
|
-
*/
|
|
197
|
-
export function isTestFilePath(filePath) {
|
|
198
|
-
if (!filePath)
|
|
199
|
-
return false;
|
|
200
|
-
const p = filePath.toLowerCase().replace(/\\/g, '/');
|
|
201
|
-
return (p.includes('.test.') ||
|
|
202
|
-
p.includes('.spec.') ||
|
|
203
|
-
p.includes('__tests__/') ||
|
|
204
|
-
p.includes('__mocks__/') ||
|
|
205
|
-
p.includes('/test/') ||
|
|
206
|
-
p.includes('/tests/') ||
|
|
207
|
-
p.includes('/testing/') ||
|
|
208
|
-
p.includes('/fixtures/') ||
|
|
209
|
-
p.endsWith('_test.go') ||
|
|
210
|
-
p.endsWith('_test.py') ||
|
|
211
|
-
p.endsWith('_spec.rb') ||
|
|
212
|
-
p.endsWith('_test.rb') ||
|
|
213
|
-
p.includes('/spec/') ||
|
|
214
|
-
p.includes('/test_') ||
|
|
215
|
-
p.includes('/conftest.'));
|
|
216
|
-
}
|
|
194
|
+
/** Shared predicate; re-exported so MCP importers keep the old public name. */
|
|
195
|
+
export { isTestFilePath };
|
|
217
196
|
/** Valid LadybugDB node labels for safe Cypher query construction */
|
|
218
197
|
export const VALID_NODE_LABELS = new Set([
|
|
219
198
|
'File',
|
|
@@ -245,6 +224,7 @@ export const VALID_NODE_LABELS = new Set([
|
|
|
245
224
|
'Module',
|
|
246
225
|
'Route',
|
|
247
226
|
'Tool',
|
|
227
|
+
'Destination',
|
|
248
228
|
]);
|
|
249
229
|
/** Valid relation types for impact analysis filtering */
|
|
250
230
|
export const VALID_RELATION_TYPES = new Set([
|
|
@@ -288,6 +268,15 @@ export const VALID_RELATION_TYPES = new Set([
|
|
|
288
268
|
// impact defaults do not silently widen; target enrichment still surfaces
|
|
289
269
|
// advised/proxied state on ordinary impact calls.
|
|
290
270
|
'ADVISED_BY',
|
|
271
|
+
// Async messaging edges. Valid for an explicit `relationTypes` filter —
|
|
272
|
+
// "who else publishes to the topic this handler reads?" — but deliberately
|
|
273
|
+
// NOT in the default impact relTypes, on the HANDLES_ROUTE precedent: a
|
|
274
|
+
// shared broker destination is a high-degree hub, and admitting it by
|
|
275
|
+
// default would pull every unrelated producer of a busy topic into an
|
|
276
|
+
// ordinary blast radius. No IMPACT_RELATION_CONFIDENCE entry either, so the
|
|
277
|
+
// 0.5 unknown-type floor applies (WRAPS/FETCHES/INJECTS precedent).
|
|
278
|
+
'PUBLISHES_TO',
|
|
279
|
+
'CONSUMES_FROM',
|
|
291
280
|
]);
|
|
292
281
|
/**
|
|
293
282
|
* Relation types the #1858 epistemic-boundary probe keys on. Kept as
|
|
@@ -666,6 +655,9 @@ export function buildDetectChangesDiffArgs(scope, baseRef) {
|
|
|
666
655
|
'diff',
|
|
667
656
|
'--ignore-cr-at-eol',
|
|
668
657
|
'--no-ext-diff',
|
|
658
|
+
// color.ui=always prefixes `+++ b/` with ANSI, so parseDiffHunks sees zero
|
|
659
|
+
// files and the CLI used to print a clean "No changes detected." (#3131).
|
|
660
|
+
'--color=never',
|
|
669
661
|
'--src-prefix=a/',
|
|
670
662
|
'--dst-prefix=b/',
|
|
671
663
|
];
|
|
@@ -694,6 +686,18 @@ export function buildDetectChangesDiffArgs(scope, baseRef) {
|
|
|
694
686
|
* (#2054).
|
|
695
687
|
*/
|
|
696
688
|
export const REPO_ID_HASH_LENGTH = 6;
|
|
689
|
+
const routeRuntimeEvidence = (route) => ({
|
|
690
|
+
confirmed: route.runtimeConfirmed,
|
|
691
|
+
...(route.runtimeSource === null ? {} : { source: route.runtimeSource }),
|
|
692
|
+
...(route.runtimeStatus === null ? {} : { status: route.runtimeStatus }),
|
|
693
|
+
});
|
|
694
|
+
const isMissingRouteRuntimePropertyError = (error) => {
|
|
695
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
696
|
+
return (['runtimeConfirmed', 'runtimeSource', 'runtimeStatus'].some((property) => message.includes(property)) &&
|
|
697
|
+
(/cannot find property/i.test(message) ||
|
|
698
|
+
/property .* does not exist/i.test(message) ||
|
|
699
|
+
/property .* not found/i.test(message)));
|
|
700
|
+
};
|
|
697
701
|
/**
|
|
698
702
|
* Validate and normalise `list_repos` pagination arguments.
|
|
699
703
|
*
|
|
@@ -1179,23 +1183,56 @@ export class LocalBackend {
|
|
|
1179
1183
|
* - If only 1 repo, use it
|
|
1180
1184
|
* - If 0 or multiple without param, throw with helpful message
|
|
1181
1185
|
*
|
|
1182
|
-
*
|
|
1183
|
-
*
|
|
1186
|
+
* Re-reads the registry before an omitted implicit target or after an
|
|
1187
|
+
* explicit miss, so long-running servers see newly indexed repositories.
|
|
1184
1188
|
*/
|
|
1185
1189
|
async resolveRepo(repoParam, branch) {
|
|
1186
|
-
|
|
1190
|
+
return this.selectToolRepository(repoParam, branch);
|
|
1191
|
+
}
|
|
1192
|
+
/**
|
|
1193
|
+
* Internal resolver variant for CLI/MCP tool routing and discovery.
|
|
1194
|
+
* - If repoParam is given, match by name or path
|
|
1195
|
+
* - If only 1 repo, use it
|
|
1196
|
+
* - If multiple repos exist and repoParam is omitted, callers may opt in to
|
|
1197
|
+
* the registered repo containing process.cwd()
|
|
1198
|
+
* - If 0 repos exist, or cwd cannot disambiguate multiple repos, throw
|
|
1199
|
+
*
|
|
1200
|
+
* Omitted-repo resolution re-reads the registry before accepting any
|
|
1201
|
+
* implicit target, including a cached singleton. A caller that just obtained
|
|
1202
|
+
* a fresh registry snapshot may disable that refresh explicitly.
|
|
1203
|
+
*/
|
|
1204
|
+
async selectToolRepository(repoParam, branch, options = {}) {
|
|
1205
|
+
const allowCwdDefault = options.allowCwdDefault === true;
|
|
1206
|
+
const mayRefresh = options.refreshRegistry !== false;
|
|
1207
|
+
let refreshed = false;
|
|
1208
|
+
// A cached singleton is also an implicit choice: another process may have
|
|
1209
|
+
// registered a second repo since init, which must not let a repo-less
|
|
1210
|
+
// mutating call bypass the multi-repo ambiguity guard.
|
|
1211
|
+
if (!repoParam && mayRefresh) {
|
|
1212
|
+
await this.refreshRepos();
|
|
1213
|
+
refreshed = true;
|
|
1214
|
+
}
|
|
1187
1215
|
let result;
|
|
1188
1216
|
try {
|
|
1189
|
-
result = this.resolveRepoFromCache(repoParam);
|
|
1217
|
+
result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
|
|
1190
1218
|
}
|
|
1191
1219
|
catch (err) {
|
|
1192
1220
|
if (!(err instanceof RegistryAmbiguousTargetError))
|
|
1193
1221
|
throw err;
|
|
1222
|
+
if (!mayRefresh || refreshed)
|
|
1223
|
+
throw err;
|
|
1194
1224
|
// Stale in-memory duplicate siblings can linger after unregister; refresh
|
|
1195
1225
|
// once before re-throwing so a resolved registry can disambiguate (#1658).
|
|
1196
1226
|
await this.refreshRepos();
|
|
1197
|
-
|
|
1198
|
-
result = this.resolveRepoFromCache(repoParam);
|
|
1227
|
+
refreshed = true;
|
|
1228
|
+
result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
|
|
1229
|
+
}
|
|
1230
|
+
// Explicit misses retain the existing one-refresh retry. Omitted targets
|
|
1231
|
+
// already refreshed above unless a same-snapshot caller opted out.
|
|
1232
|
+
if (!result && mayRefresh && !refreshed) {
|
|
1233
|
+
await this.refreshRepos();
|
|
1234
|
+
refreshed = true;
|
|
1235
|
+
result = this.resolveRepoFromCache(repoParam, allowCwdDefault);
|
|
1199
1236
|
}
|
|
1200
1237
|
if (result) {
|
|
1201
1238
|
// Issue: silent graph drift across sibling clones.
|
|
@@ -1209,15 +1246,6 @@ export class LocalBackend {
|
|
|
1209
1246
|
});
|
|
1210
1247
|
return this.applyBranchScope(result, branch);
|
|
1211
1248
|
}
|
|
1212
|
-
// Miss — refresh registry and try once more (skip if already refreshed above)
|
|
1213
|
-
if (!refreshedAfterAmbiguity) {
|
|
1214
|
-
await this.refreshRepos();
|
|
1215
|
-
}
|
|
1216
|
-
const retried = this.resolveRepoFromCache(repoParam);
|
|
1217
|
-
if (retried) {
|
|
1218
|
-
this.maybeWarnSiblingDrift(retried).catch(() => { });
|
|
1219
|
-
return this.applyBranchScope(retried, branch);
|
|
1220
|
-
}
|
|
1221
1249
|
// Still no match — throw with helpful message
|
|
1222
1250
|
if (this.repos.size === 0) {
|
|
1223
1251
|
throw new Error('No indexed repositories. Run: gitnexus analyze');
|
|
@@ -1350,7 +1378,7 @@ export class LocalBackend {
|
|
|
1350
1378
|
* Throws {@link RegistryAmbiguousTargetError} when `repoParam` matches
|
|
1351
1379
|
* multiple handles by name and cwd cannot disambiguate (#1658).
|
|
1352
1380
|
*/
|
|
1353
|
-
resolveRepoFromCache(repoParam) {
|
|
1381
|
+
resolveRepoFromCache(repoParam, allowCwdDefault = false) {
|
|
1354
1382
|
if (this.repos.size === 0)
|
|
1355
1383
|
return null;
|
|
1356
1384
|
if (repoParam) {
|
|
@@ -1379,6 +1407,9 @@ export class LocalBackend {
|
|
|
1379
1407
|
if (nameMatches.length === 1)
|
|
1380
1408
|
return nameMatches[0];
|
|
1381
1409
|
if (nameMatches.length > 1) {
|
|
1410
|
+
// Explicit duplicate aliases retain the legacy fail-closed contract:
|
|
1411
|
+
// only an exact cwd Git-root match may disambiguate them. Deepest path
|
|
1412
|
+
// containment is reserved for an omitted read-only repo (#3073).
|
|
1382
1413
|
const cwdPick = this.pickRepoHandleForCwd(nameMatches);
|
|
1383
1414
|
if (cwdPick)
|
|
1384
1415
|
return cwdPick;
|
|
@@ -1403,26 +1434,46 @@ export class LocalBackend {
|
|
|
1403
1434
|
if (this.repos.size === 1) {
|
|
1404
1435
|
return this.repos.values().next().value;
|
|
1405
1436
|
}
|
|
1437
|
+
if (allowCwdDefault) {
|
|
1438
|
+
const cwdPick = this.pickRepoHandleForCwd([...this.repos.values()], true);
|
|
1439
|
+
if (cwdPick)
|
|
1440
|
+
return cwdPick;
|
|
1441
|
+
}
|
|
1406
1442
|
return null; // Multiple repos, no param — ambiguous
|
|
1407
1443
|
}
|
|
1408
1444
|
/**
|
|
1409
|
-
*
|
|
1445
|
+
* Match process.cwd() against indexed repositories.
|
|
1410
1446
|
*
|
|
1411
|
-
*
|
|
1412
|
-
*
|
|
1413
|
-
*
|
|
1414
|
-
*
|
|
1447
|
+
* Explicit duplicate aliases use exact Git-root matching only. Omitted
|
|
1448
|
+
* read-only calls opt into deepest containing-path selection. In that mode a
|
|
1449
|
+
* candidate must not sit above cwd's Git root, so an unindexed nested checkout
|
|
1450
|
+
* cannot fall through to an indexed ancestor. The `.git` ancestor fallback
|
|
1451
|
+
* preserves that boundary when the git executable is unavailable.
|
|
1415
1452
|
*/
|
|
1416
|
-
pickRepoHandleForCwd(candidates) {
|
|
1417
|
-
const
|
|
1418
|
-
|
|
1453
|
+
pickRepoHandleForCwd(candidates, allowContaining = false) {
|
|
1454
|
+
const cwd = process.cwd();
|
|
1455
|
+
const normalize = (value) => {
|
|
1456
|
+
const canonical = canonicalizePath(value);
|
|
1457
|
+
return process.platform === 'win32' ? canonical.toLowerCase() : canonical;
|
|
1458
|
+
};
|
|
1459
|
+
const isSameOrDescendant = (parent, child) => child === parent ||
|
|
1460
|
+
child.startsWith(parent.endsWith(path.sep) ? parent : `${parent}${path.sep}`);
|
|
1461
|
+
const canonicalCwd = normalize(cwd);
|
|
1462
|
+
const cwdRoot = getGitRoot(cwd) ?? findGitRootByDotGit(cwd);
|
|
1463
|
+
const canonicalRoot = cwdRoot ? normalize(cwdRoot) : null;
|
|
1464
|
+
if (allowContaining) {
|
|
1465
|
+
const containing = candidates
|
|
1466
|
+
.map((handle) => ({ handle, repoPath: normalize(handle.repoPath) }))
|
|
1467
|
+
.filter(({ repoPath }) => isSameOrDescendant(repoPath, canonicalCwd))
|
|
1468
|
+
.filter(({ repoPath }) => !canonicalRoot || isSameOrDescendant(canonicalRoot, repoPath))
|
|
1469
|
+
.sort((a, b) => b.repoPath.length - a.repoPath.length);
|
|
1470
|
+
if (containing.length > 0)
|
|
1471
|
+
return containing[0].handle;
|
|
1472
|
+
}
|
|
1473
|
+
if (!canonicalRoot)
|
|
1419
1474
|
return null;
|
|
1420
|
-
const canonicalCwd = canonicalizePath(cwdRoot);
|
|
1421
1475
|
const cwdMatches = candidates.filter((handle) => {
|
|
1422
|
-
|
|
1423
|
-
return process.platform === 'win32'
|
|
1424
|
-
? stored.toLowerCase() === canonicalCwd.toLowerCase()
|
|
1425
|
-
: stored === canonicalCwd;
|
|
1476
|
+
return normalize(handle.repoPath) === canonicalRoot;
|
|
1426
1477
|
});
|
|
1427
1478
|
return cwdMatches.length === 1 ? cwdMatches[0] : null;
|
|
1428
1479
|
}
|
|
@@ -1819,7 +1870,7 @@ export class LocalBackend {
|
|
|
1819
1870
|
}
|
|
1820
1871
|
// Resolve repo from optional param (re-reads registry on miss). An optional
|
|
1821
1872
|
// `branch` param scopes the resolved handle to that branch's index (#2106).
|
|
1822
|
-
const repo = await this.
|
|
1873
|
+
const repo = await this.selectToolRepository(p.repo, p.branch, { allowCwdDefault: method !== 'rename' });
|
|
1823
1874
|
switch (method) {
|
|
1824
1875
|
case 'query':
|
|
1825
1876
|
return this.withToolStaleness(repo, await this.query(repo, p));
|
|
@@ -5972,8 +6023,8 @@ export class LocalBackend {
|
|
|
5972
6023
|
// retains the strongest evidence, the safer default for a blast-radius
|
|
5973
6024
|
// tool. `sourceId` closes the order for edges that tie on both.
|
|
5974
6025
|
const query = direction === 'upstream'
|
|
5975
|
-
? `MATCH (caller)-[r:CodeRelation]->(n) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence`
|
|
5976
|
-
: `MATCH (n)-[r:CodeRelation]->(callee) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence`;
|
|
6026
|
+
? `MATCH (caller)-[r:CodeRelation]->(n) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence, r.staticGated AS staticGated`
|
|
6027
|
+
: `MATCH (n)-[r:CodeRelation]->(callee) WHERE n.id IN $frontierIds AND r.type IN $relTypes${confidenceFilter} RETURN n.id AS sourceId, callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence, r.staticGated AS staticGated`;
|
|
5977
6028
|
try {
|
|
5978
6029
|
const related = await executeParameterized(repo.lbugPath, query, {
|
|
5979
6030
|
frontierIds: frontier,
|
|
@@ -5988,6 +6039,9 @@ export class LocalBackend {
|
|
|
5988
6039
|
relType: rel.relType || rel[5],
|
|
5989
6040
|
confidence: rel.confidence ?? rel[6],
|
|
5990
6041
|
sourceId: String(rel.sourceId ?? rel[0] ?? ''),
|
|
6042
|
+
// Set only by languages that compute static gating (Zig); null/undefined
|
|
6043
|
+
// from older indexes or other languages reads as live.
|
|
6044
|
+
...((rel.staticGated ?? rel[7]) === true ? { staticGated: true } : {}),
|
|
5991
6045
|
}));
|
|
5992
6046
|
// The pdg bridge is the ONE consumer here that accumulates sequentially
|
|
5993
6047
|
// rather than per-node: at depth ≥ 2 an edge inherits
|
|
@@ -6061,6 +6115,9 @@ export class LocalBackend {
|
|
|
6061
6115
|
filePath: edge.filePath,
|
|
6062
6116
|
relationType,
|
|
6063
6117
|
confidence: effectiveConfidence,
|
|
6118
|
+
// Surfaced, never acted on: traversal and ranking ignore the flag
|
|
6119
|
+
// (see GraphRelationship.staticGated). Absent = live or unmodelled.
|
|
6120
|
+
...(edge.staticGated === true ? { staticGated: true } : {}),
|
|
6064
6121
|
});
|
|
6065
6122
|
}
|
|
6066
6123
|
}
|
|
@@ -6736,6 +6793,17 @@ export class LocalBackend {
|
|
|
6736
6793
|
target: params.target,
|
|
6737
6794
|
direction: params.direction,
|
|
6738
6795
|
};
|
|
6796
|
+
// Forward the target-selector params like the trace branch above.
|
|
6797
|
+
// @group impact used to drop target_uid/file_path/kind here, so a name
|
|
6798
|
+
// shared by same-named Api/Impl/Controller layers resolved ambiguously
|
|
6799
|
+
// in the member repo and the documented "re-call with target_uid"
|
|
6800
|
+
// disambiguation loop (impact tool schema) never worked in group mode.
|
|
6801
|
+
if (typeof params.target_uid === 'string')
|
|
6802
|
+
impactArgs.target_uid = params.target_uid;
|
|
6803
|
+
if (typeof params.file_path === 'string')
|
|
6804
|
+
impactArgs.file_path = params.file_path;
|
|
6805
|
+
if (typeof params.kind === 'string')
|
|
6806
|
+
impactArgs.kind = params.kind;
|
|
6739
6807
|
if (params.maxDepth !== undefined)
|
|
6740
6808
|
impactArgs.maxDepth = params.maxDepth;
|
|
6741
6809
|
if (params.crossDepth !== undefined)
|
|
@@ -6862,7 +6930,7 @@ export class LocalBackend {
|
|
|
6862
6930
|
* Shared by routeMap and shapeCheck to avoid N+1 query patterns.
|
|
6863
6931
|
*/
|
|
6864
6932
|
async fetchRoutesWithConsumers(repoId, routeFilter, params) {
|
|
6865
|
-
const
|
|
6933
|
+
const routeQuery = (includeRuntimeEvidence) => `
|
|
6866
6934
|
MATCH (n:Route)
|
|
6867
6935
|
WHERE n.id STARTS WITH 'Route:' ${routeFilter}
|
|
6868
6936
|
OPTIONAL MATCH (consumer)-[r:CodeRelation]->(n)
|
|
@@ -6870,8 +6938,19 @@ export class LocalBackend {
|
|
|
6870
6938
|
RETURN n.id AS routeId, n.name AS routeName, n.filePath AS handlerFile,
|
|
6871
6939
|
n.responseKeys AS responseKeys, n.errorKeys AS errorKeys, n.middleware AS middleware,
|
|
6872
6940
|
consumer.name AS consumerName, consumer.filePath AS consumerFile,
|
|
6873
|
-
r.reason AS fetchReason, n.method AS method
|
|
6874
|
-
|
|
6941
|
+
r.reason AS fetchReason, n.method AS method${includeRuntimeEvidence
|
|
6942
|
+
? ', n.runtimeConfirmed AS runtimeConfirmed, n.runtimeSource AS runtimeSource, n.runtimeStatus AS runtimeStatus'
|
|
6943
|
+
: ''}
|
|
6944
|
+
`;
|
|
6945
|
+
let rows;
|
|
6946
|
+
try {
|
|
6947
|
+
rows = await executeParameterized(repoId, routeQuery(true), params);
|
|
6948
|
+
}
|
|
6949
|
+
catch (error) {
|
|
6950
|
+
if (!isMissingRouteRuntimePropertyError(error))
|
|
6951
|
+
throw error;
|
|
6952
|
+
rows = await executeParameterized(repoId, routeQuery(false), params);
|
|
6953
|
+
}
|
|
6875
6954
|
// Strip wrapping quotes from DB array elements — CSV COPY stores ['key'] which
|
|
6876
6955
|
// LadybugDB may return as "'key'" rather than "key"
|
|
6877
6956
|
const stripQuotes = (keys) => keys ? keys.map((k) => k.replace(/^['"]|['"]$/g, '')) : null;
|
|
@@ -6891,6 +6970,9 @@ export class LocalBackend {
|
|
|
6891
6970
|
// resource). Appended last in RETURN so positional fallbacks for the
|
|
6892
6971
|
// consumer/reason columns above stay stable.
|
|
6893
6972
|
const method = row.method ?? row[9] ?? null;
|
|
6973
|
+
const runtimeConfirmed = (row.runtimeConfirmed ?? row[10]) === true;
|
|
6974
|
+
const runtimeSource = row.runtimeSource ?? row[11] ?? null;
|
|
6975
|
+
const runtimeStatus = row.runtimeStatus ?? row[12] ?? null;
|
|
6894
6976
|
if (!routeMap.has(id)) {
|
|
6895
6977
|
routeMap.set(id, {
|
|
6896
6978
|
id,
|
|
@@ -6900,6 +6982,9 @@ export class LocalBackend {
|
|
|
6900
6982
|
responseKeys,
|
|
6901
6983
|
errorKeys,
|
|
6902
6984
|
middleware,
|
|
6985
|
+
runtimeConfirmed,
|
|
6986
|
+
runtimeSource,
|
|
6987
|
+
runtimeStatus,
|
|
6903
6988
|
consumers: [],
|
|
6904
6989
|
});
|
|
6905
6990
|
}
|
|
@@ -6981,6 +7066,7 @@ export class LocalBackend {
|
|
|
6981
7066
|
route: r.name,
|
|
6982
7067
|
method: r.method,
|
|
6983
7068
|
handler: r.filePath,
|
|
7069
|
+
runtimeEvidence: routeRuntimeEvidence(r),
|
|
6984
7070
|
middleware: r.middleware || [],
|
|
6985
7071
|
consumers: r.consumers,
|
|
6986
7072
|
flows: flowMap.get(r.id) || [],
|
|
@@ -7036,6 +7122,7 @@ export class LocalBackend {
|
|
|
7036
7122
|
route: r.name,
|
|
7037
7123
|
method: r.method,
|
|
7038
7124
|
handler: r.filePath,
|
|
7125
|
+
runtimeEvidence: routeRuntimeEvidence(r),
|
|
7039
7126
|
...(responseKeys.length > 0 ? { responseKeys } : {}),
|
|
7040
7127
|
...(errorKeys.length > 0 ? { errorKeys } : {}),
|
|
7041
7128
|
consumers,
|
|
@@ -7199,6 +7286,7 @@ export class LocalBackend {
|
|
|
7199
7286
|
route: r.name,
|
|
7200
7287
|
method: r.method,
|
|
7201
7288
|
handler: r.filePath,
|
|
7289
|
+
runtimeEvidence: routeRuntimeEvidence(r),
|
|
7202
7290
|
responseShape: {
|
|
7203
7291
|
success: responseKeys,
|
|
7204
7292
|
error: errorKeys,
|
|
@@ -20,10 +20,14 @@ export declare class McpRepositoryPolicy {
|
|
|
20
20
|
private repoForArgs;
|
|
21
21
|
private normalizeToolArgs;
|
|
22
22
|
private listAllowedRepos;
|
|
23
|
-
|
|
23
|
+
toolSchemaRepoRequirements(backend: LocalBackend): Promise<{
|
|
24
|
+
readOnlyRequiresRepo: boolean;
|
|
25
|
+
mutatingRequiresRepo: boolean;
|
|
26
|
+
}>;
|
|
24
27
|
private listReposPage;
|
|
25
28
|
private callTool;
|
|
26
29
|
private resolveRepo;
|
|
30
|
+
private selectToolRepository;
|
|
27
31
|
assertResourceUri(uri: string): void;
|
|
28
32
|
resourceTemplateAllowed(uriTemplate: string): boolean;
|
|
29
33
|
toolAllowed(toolName: string): boolean;
|
|
@@ -134,10 +134,40 @@ export class McpRepositoryPolicy {
|
|
|
134
134
|
};
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
|
-
async
|
|
138
|
-
if (this.defaultRepo)
|
|
139
|
-
return false;
|
|
140
|
-
|
|
137
|
+
async toolSchemaRepoRequirements(backend) {
|
|
138
|
+
if (this.defaultRepo) {
|
|
139
|
+
return { readOnlyRequiresRepo: false, mutatingRequiresRepo: false };
|
|
140
|
+
}
|
|
141
|
+
// Runtime selection is based on the configured allowlist, not on which
|
|
142
|
+
// entries happen to remain visible in a later registry refresh. Keep the
|
|
143
|
+
// advertised schema aligned with repoForArgs() when that listing shrinks.
|
|
144
|
+
if (this.restricted) {
|
|
145
|
+
const requiresRepo = this.allowed.length > 1;
|
|
146
|
+
return {
|
|
147
|
+
readOnlyRequiresRepo: requiresRepo,
|
|
148
|
+
mutatingRequiresRepo: requiresRepo,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// One fresh listing supplies both schema decisions. Besides keeping the
|
|
152
|
+
// advertised contract internally consistent, this avoids doing two full
|
|
153
|
+
// per-repo staleness fan-outs for every tools/list request.
|
|
154
|
+
const visibleRepos = await this.listAllowedRepos(backend);
|
|
155
|
+
if (visibleRepos.length <= 1) {
|
|
156
|
+
return { readOnlyRequiresRepo: false, mutatingRequiresRepo: false };
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
// listAllowedRepos() refreshed this backend immediately above. Resolve
|
|
160
|
+
// against that exact cache snapshot instead of racing another registry
|
|
161
|
+
// read; only read-only schemas may advertise the cwd-derived default.
|
|
162
|
+
await backend.selectToolRepository(undefined, undefined, {
|
|
163
|
+
allowCwdDefault: true,
|
|
164
|
+
refreshRegistry: false,
|
|
165
|
+
});
|
|
166
|
+
return { readOnlyRequiresRepo: false, mutatingRequiresRepo: true };
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return { readOnlyRequiresRepo: true, mutatingRequiresRepo: true };
|
|
170
|
+
}
|
|
141
171
|
}
|
|
142
172
|
async listReposPage(backend, params) {
|
|
143
173
|
const { limit, offset } = parseListReposPagination(params, {
|
|
@@ -186,6 +216,17 @@ export class McpRepositoryPolicy {
|
|
|
186
216
|
const selected = this.repoForArgs(repo === undefined ? undefined : { repo });
|
|
187
217
|
return backend.resolveRepo(selected?.path, branch);
|
|
188
218
|
}
|
|
219
|
+
async selectToolRepository(backend, repo, branch, options) {
|
|
220
|
+
if (!this.configured)
|
|
221
|
+
return backend.selectToolRepository(repo, branch, options);
|
|
222
|
+
if (!this.restricted) {
|
|
223
|
+
return backend.selectToolRepository(repo ?? this.defaultRepo?.path, branch, options);
|
|
224
|
+
}
|
|
225
|
+
const selected = this.repoForArgs(repo === undefined ? undefined : { repo });
|
|
226
|
+
// Restricted policies never allow cwd to select outside the configured
|
|
227
|
+
// set; once policy supplies an explicit path, the public resolver is enough.
|
|
228
|
+
return backend.resolveRepo(selected?.path, branch);
|
|
229
|
+
}
|
|
189
230
|
assertResourceUri(uri) {
|
|
190
231
|
if (!this.restricted)
|
|
191
232
|
return;
|
|
@@ -255,6 +296,9 @@ export class McpRepositoryPolicy {
|
|
|
255
296
|
if (property === 'resolveRepo') {
|
|
256
297
|
return (repo, branch) => policy.resolveRepo(target, repo, branch);
|
|
257
298
|
}
|
|
299
|
+
if (property === 'selectToolRepository') {
|
|
300
|
+
return (repo, branch, options) => policy.selectToolRepository(target, repo, branch, options);
|
|
301
|
+
}
|
|
258
302
|
if (property === 'getContext' && policy.restricted) {
|
|
259
303
|
return (repoId) => {
|
|
260
304
|
if (!repoId || !policy.uniqueAllowedContextNames.has(repoId.toLowerCase()))
|
package/dist/mcp/resources.js
CHANGED
|
@@ -254,7 +254,8 @@ async function getReposResource(backend) {
|
|
|
254
254
|
}
|
|
255
255
|
if (repos.length > 1) {
|
|
256
256
|
lines.push('');
|
|
257
|
-
lines.push('# Multiple repos indexed.
|
|
257
|
+
lines.push('# Multiple repos indexed. Read-only tools may omit repo when an MCP default is configured or GitNexus process.cwd() is inside one listed path without crossing an unindexed nested Git checkout.');
|
|
258
|
+
lines.push('# Otherwise—and for mutating tools without an MCP default—pass repo explicitly:');
|
|
258
259
|
lines.push(`# query({search_query: "auth", repo: "${repos[0].name}"})`);
|
|
259
260
|
}
|
|
260
261
|
return lines.join('\n');
|
|
@@ -297,6 +298,14 @@ async function getContextResource(backend, repoName) {
|
|
|
297
298
|
lines.push(` indexed_at: ${JSON.stringify(freshMeta?.indexedAt ?? null)}`);
|
|
298
299
|
lines.push(` runner_identity: ${JSON.stringify(freshMeta?.runnerIdentity ?? null)}`);
|
|
299
300
|
lines.push(` incomplete_reasons: ${JSON.stringify(incompleteReasons)}`);
|
|
301
|
+
lines.push(` spring_actuator: ${JSON.stringify(freshMeta?.springActuator ?? null)}`);
|
|
302
|
+
// Surfaced beside the Actuator flag, and it matters more than that one does:
|
|
303
|
+
// Actuator only annotates nodes the source pass already found, whereas
|
|
304
|
+
// document reading MINTS destinations and edges that have no code site at
|
|
305
|
+
// all. Without this line an agent reading the context sees `Destination`
|
|
306
|
+
// nodes rooted at `asyncapi:`-prefixed pseudo-files with nothing to say where
|
|
307
|
+
// they came from.
|
|
308
|
+
lines.push(` asyncapi_spec: ${JSON.stringify(freshMeta?.asyncApiSpec ?? null)}`);
|
|
300
309
|
const indexedRunnerSchema = freshMeta?.runnerIdentity
|
|
301
310
|
?.schemaVersion;
|
|
302
311
|
lines.push(` runner_identity_schema_status: ${JSON.stringify(indexedRunnerSchema === ANALYZER_RUNNER_IDENTITY_SCHEMA_VERSION
|
package/dist/mcp/server.js
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* Tools: list_repos, query, cypher, context, impact, detect_changes, rename
|
|
11
11
|
* Resources: repos, repo/{name}/context, repo/{name}/clusters, ...
|
|
12
12
|
*/
|
|
13
|
-
import { createRequire } from 'module';
|
|
14
13
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
14
|
+
import { packageVersion } from '../core/package-version.js';
|
|
15
15
|
import { CompatibleStdioServerTransport } from './compatible-stdio-transport.js';
|
|
16
16
|
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
17
17
|
import { GITNEXUS_TOOLS, REPO_SCOPED_TOOLS } from './tools.js';
|
|
@@ -70,11 +70,9 @@ export function createMCPServer(backend, options = {}) {
|
|
|
70
70
|
}
|
|
71
71
|
const repositoryPolicy = options.repositoryPolicy ?? McpRepositoryPolicy.unrestricted();
|
|
72
72
|
const scopedBackend = repositoryPolicy.scopeBackend(backend);
|
|
73
|
-
const require = createRequire(import.meta.url);
|
|
74
|
-
const pkgVersion = require('../../package.json').version;
|
|
75
73
|
const server = new Server({
|
|
76
74
|
name: 'gitnexus',
|
|
77
|
-
version:
|
|
75
|
+
version: packageVersion(),
|
|
78
76
|
}, {
|
|
79
77
|
capabilities: {
|
|
80
78
|
tools: {},
|
|
@@ -136,11 +134,11 @@ export function createMCPServer(backend, options = {}) {
|
|
|
136
134
|
};
|
|
137
135
|
}
|
|
138
136
|
});
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
//
|
|
137
|
+
// Make the effective routing contract machine-readable. Read-only tools may
|
|
138
|
+
// use a cwd-derived default; mutating rename remains explicit unless policy
|
|
139
|
+
// supplies a single/default repository.
|
|
142
140
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
143
|
-
const
|
|
141
|
+
const { readOnlyRequiresRepo, mutatingRequiresRepo } = await repositoryPolicy.toolSchemaRepoRequirements(backend);
|
|
144
142
|
return {
|
|
145
143
|
tools: GITNEXUS_TOOLS.filter((tool) => (!readOnly || MCP_READ_ONLY_TOOLS.has(tool.name)) &&
|
|
146
144
|
repositoryPolicy.toolAllowed(tool.name))
|
|
@@ -148,7 +146,8 @@ export function createMCPServer(backend, options = {}) {
|
|
|
148
146
|
.map((tool) => ({
|
|
149
147
|
name: tool.name,
|
|
150
148
|
description: tool.description,
|
|
151
|
-
inputSchema:
|
|
149
|
+
inputSchema: (tool.name === 'rename' ? mutatingRequiresRepo : readOnlyRequiresRepo) &&
|
|
150
|
+
REPO_SCOPED_TOOLS.has(tool.name)
|
|
152
151
|
? {
|
|
153
152
|
...tool.inputSchema,
|
|
154
153
|
required: [...new Set([...tool.inputSchema.required, 'repo'])],
|