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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// gitnexus/src/core/ingestion/call-extractors/zig-static-gating.ts
|
|
2
|
+
/** Maximum recursion depth when evaluating a boolean condition expression. */
|
|
3
|
+
const MAX_COND_DEPTH = 4;
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Phase 2: per-file extraction
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/** Cap on alias-chain hops walked when resolving `const A = B; const B = C; ...`. */
|
|
8
|
+
const MAX_ALIAS_HOPS = 5;
|
|
9
|
+
/**
|
|
10
|
+
* Walk the top-level of a Zig source file and collect known-bool
|
|
11
|
+
* constants. Two passes:
|
|
12
|
+
*
|
|
13
|
+
* Pass 1: collect every top-level `const X = <expr>` where the RHS
|
|
14
|
+
* is either a `boolean` literal (recorded in `literals`) or
|
|
15
|
+
* a single `identifier` (recorded in `aliases`).
|
|
16
|
+
* Pass 2: walk each alias entry up to `MAX_ALIAS_HOPS` hops; if the
|
|
17
|
+
* chain terminates at a known-bool literal, record `X` with
|
|
18
|
+
* the literal's value. Cycles, chains exceeding the cap, and
|
|
19
|
+
* chains exiting file scope (unknown identifier at the root)
|
|
20
|
+
* bail to "unknown".
|
|
21
|
+
*
|
|
22
|
+
* Only `const` decls qualify (not `var`). The function is permissive
|
|
23
|
+
* about modifier tokens (`pub`, type annotation) — it reads only the
|
|
24
|
+
* identifier name and the RHS expression shape.
|
|
25
|
+
*/
|
|
26
|
+
export function buildZigBoolConstMap(rootNode) {
|
|
27
|
+
const literals = new Map();
|
|
28
|
+
const aliases = new Map();
|
|
29
|
+
for (const child of rootNode.namedChildren) {
|
|
30
|
+
if (child.type !== 'variable_declaration')
|
|
31
|
+
continue;
|
|
32
|
+
const entry = extractBoolConstOrAlias(child);
|
|
33
|
+
if (!entry)
|
|
34
|
+
continue;
|
|
35
|
+
if (entry.kind === 'literal') {
|
|
36
|
+
literals.set(entry.name, entry.value);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
aliases.set(entry.name, entry.aliasOf);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Pass 2: resolve alias chains.
|
|
43
|
+
for (const [name, target] of aliases) {
|
|
44
|
+
const resolved = resolveAliasChain(name, target, literals, aliases);
|
|
45
|
+
if (resolved !== undefined) {
|
|
46
|
+
literals.set(name, resolved);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return literals;
|
|
50
|
+
}
|
|
51
|
+
function resolveAliasChain(start, firstTarget, literals, aliases) {
|
|
52
|
+
// Walk: start → firstTarget → aliases.get(firstTarget) → ... up to MAX_ALIAS_HOPS.
|
|
53
|
+
// Cycle protection via a visited set seeded with `start` itself.
|
|
54
|
+
const visited = new Set();
|
|
55
|
+
visited.add(start);
|
|
56
|
+
let current = firstTarget;
|
|
57
|
+
for (let hop = 0; hop < MAX_ALIAS_HOPS; hop++) {
|
|
58
|
+
if (visited.has(current))
|
|
59
|
+
return undefined; // cycle
|
|
60
|
+
visited.add(current);
|
|
61
|
+
const lit = literals.get(current);
|
|
62
|
+
if (lit !== undefined)
|
|
63
|
+
return lit;
|
|
64
|
+
const next = aliases.get(current);
|
|
65
|
+
if (next === undefined)
|
|
66
|
+
return undefined; // chain exits file scope or hits unknown
|
|
67
|
+
current = next;
|
|
68
|
+
}
|
|
69
|
+
return undefined; // hop cap exceeded
|
|
70
|
+
}
|
|
71
|
+
function extractBoolConstOrAlias(decl) {
|
|
72
|
+
// Require `const` and exclude `var`. tree-sitter-zig parses both with
|
|
73
|
+
// the same `variable_declaration` shape; the qualifier is an anonymous
|
|
74
|
+
// child token. A `pub var FOO = false;` is mutable global state — its
|
|
75
|
+
// initial value is NOT a comptime constant and must not feed gating.
|
|
76
|
+
let isConst = false;
|
|
77
|
+
let isVar = false;
|
|
78
|
+
for (let i = 0; i < decl.childCount; i++) {
|
|
79
|
+
const c = decl.child(i);
|
|
80
|
+
if (!c || c.isNamed)
|
|
81
|
+
continue;
|
|
82
|
+
if (c.type === 'const')
|
|
83
|
+
isConst = true;
|
|
84
|
+
else if (c.type === 'var')
|
|
85
|
+
isVar = true;
|
|
86
|
+
}
|
|
87
|
+
if (!isConst || isVar)
|
|
88
|
+
return null;
|
|
89
|
+
let name;
|
|
90
|
+
let value;
|
|
91
|
+
let aliasOf;
|
|
92
|
+
for (const c of decl.namedChildren) {
|
|
93
|
+
if (c.type === 'identifier' && name === undefined) {
|
|
94
|
+
name = c.text;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (c.type === 'boolean') {
|
|
98
|
+
const t = c.text;
|
|
99
|
+
if (t === 'true')
|
|
100
|
+
value = true;
|
|
101
|
+
else if (t === 'false')
|
|
102
|
+
value = false;
|
|
103
|
+
}
|
|
104
|
+
else if (c.type === 'identifier' && name !== undefined && aliasOf === undefined) {
|
|
105
|
+
// Second `identifier` child is the RHS alias target:
|
|
106
|
+
// `const B = A;` → name='B', aliasOf='A'.
|
|
107
|
+
aliasOf = c.text;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (name === undefined)
|
|
111
|
+
return null;
|
|
112
|
+
if (value !== undefined)
|
|
113
|
+
return { kind: 'literal', name, value };
|
|
114
|
+
if (aliasOf !== undefined)
|
|
115
|
+
return { kind: 'alias', name, aliasOf };
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
export function collectZigStaticGatedRanges(rootNode, localBools, importAliases, lookupBoolsForPath) {
|
|
119
|
+
const out = [];
|
|
120
|
+
for (const node of rootNode.descendantsOfType(['if_statement', 'if_expression'])) {
|
|
121
|
+
const cond = findIfCondition(node);
|
|
122
|
+
const result = cond
|
|
123
|
+
? evalCond(cond, localBools, importAliases, lookupBoolsForPath, 0)
|
|
124
|
+
: undefined;
|
|
125
|
+
let dead = null;
|
|
126
|
+
if (node.type === 'if_statement') {
|
|
127
|
+
if (result === false)
|
|
128
|
+
dead = node.childForFieldName('body');
|
|
129
|
+
if (result === true)
|
|
130
|
+
dead = node.namedChildren.find((c) => c.type === 'else_clause') ?? null;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const arms = ifExpressionArms(node);
|
|
134
|
+
if (result === false)
|
|
135
|
+
dead = arms.consequence;
|
|
136
|
+
if (result === true)
|
|
137
|
+
dead = arms.alternative;
|
|
138
|
+
}
|
|
139
|
+
if (dead) {
|
|
140
|
+
out.push({
|
|
141
|
+
startLine: dead.startPosition.row + 1,
|
|
142
|
+
startCol: dead.startPosition.column,
|
|
143
|
+
endLine: dead.endPosition.row + 1,
|
|
144
|
+
endCol: dead.endPosition.column,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The two arms of an `if_expression` (`const x = if (c) a else b;`). Unlike
|
|
152
|
+
* `if_statement` the grammar gives them no field names and no `else_clause`
|
|
153
|
+
* wrapper: the consequence is the first named child after the closing `)`
|
|
154
|
+
* of the condition, the alternative is the first named child after the
|
|
155
|
+
* anonymous `else` token. Either may be absent.
|
|
156
|
+
*/
|
|
157
|
+
function ifExpressionArms(node) {
|
|
158
|
+
let consequence = null;
|
|
159
|
+
let alternative = null;
|
|
160
|
+
let slot = 'none';
|
|
161
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
162
|
+
const c = node.child(i);
|
|
163
|
+
if (!c)
|
|
164
|
+
continue;
|
|
165
|
+
if (!c.isNamed) {
|
|
166
|
+
if (c.type === ')' && slot === 'none')
|
|
167
|
+
slot = 'consequence';
|
|
168
|
+
else if (c.type === 'else')
|
|
169
|
+
slot = 'alternative';
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (slot === 'consequence' && !consequence)
|
|
173
|
+
consequence = c;
|
|
174
|
+
else if (slot === 'alternative' && !alternative)
|
|
175
|
+
alternative = c;
|
|
176
|
+
}
|
|
177
|
+
return { consequence, alternative };
|
|
178
|
+
}
|
|
179
|
+
/** Is a (1-based line, 0-based col) position inside one of `ranges`? */
|
|
180
|
+
export function isPositionStaticGated(line, col, ranges) {
|
|
181
|
+
for (const r of ranges) {
|
|
182
|
+
if (line < r.startLine || line > r.endLine)
|
|
183
|
+
continue;
|
|
184
|
+
if (line === r.startLine && col < r.startCol)
|
|
185
|
+
continue;
|
|
186
|
+
if (line === r.endLine && col >= r.endCol)
|
|
187
|
+
continue;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
/** Pick the condition node out of an `if_statement`. The condition is
|
|
193
|
+
* the first named child (the body / else branches come after). */
|
|
194
|
+
function findIfCondition(ifNode) {
|
|
195
|
+
return ifNode.namedChildren[0] ?? null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Evaluate a boolean condition expression to a tribool.
|
|
199
|
+
*
|
|
200
|
+
* Handles only the shapes we can resolve symbolically; everything else
|
|
201
|
+
* returns `undefined` ("unknown — treat as live").
|
|
202
|
+
*/
|
|
203
|
+
function evalCond(node, localBools, importAliases, lookupBoolsForPath, depth) {
|
|
204
|
+
if (depth > MAX_COND_DEPTH)
|
|
205
|
+
return undefined;
|
|
206
|
+
switch (node.type) {
|
|
207
|
+
case 'boolean': {
|
|
208
|
+
// Bare literal: `if (false)`.
|
|
209
|
+
if (node.text === 'true')
|
|
210
|
+
return true;
|
|
211
|
+
if (node.text === 'false')
|
|
212
|
+
return false;
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
case 'identifier': {
|
|
216
|
+
// Bare flag check: `if (FOO)`.
|
|
217
|
+
const v = localBools.get(node.text);
|
|
218
|
+
return v === undefined ? undefined : v;
|
|
219
|
+
}
|
|
220
|
+
case 'field_expression': {
|
|
221
|
+
// `cfg.FOO` — alias hop.
|
|
222
|
+
const obj = node.namedChildren[0];
|
|
223
|
+
const member = node.namedChildren[1];
|
|
224
|
+
if (obj?.type !== 'identifier' || member?.type !== 'identifier') {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
const targetFile = importAliases.get(obj.text);
|
|
228
|
+
if (!targetFile)
|
|
229
|
+
return undefined;
|
|
230
|
+
const targetBools = lookupBoolsForPath(targetFile);
|
|
231
|
+
if (!targetBools)
|
|
232
|
+
return undefined;
|
|
233
|
+
const v = targetBools.get(member.text);
|
|
234
|
+
return v === undefined ? undefined : v;
|
|
235
|
+
}
|
|
236
|
+
case 'binary_expression': {
|
|
237
|
+
// `lhs and rhs` / `lhs or rhs` / `lhs == rhs` / `lhs != rhs`.
|
|
238
|
+
const op = findOperatorToken(node);
|
|
239
|
+
const lhs = node.namedChildren[0];
|
|
240
|
+
const rhs = node.namedChildren[1];
|
|
241
|
+
if (!lhs || !rhs)
|
|
242
|
+
return undefined;
|
|
243
|
+
const l = evalCond(lhs, localBools, importAliases, lookupBoolsForPath, depth + 1);
|
|
244
|
+
const r = evalCond(rhs, localBools, importAliases, lookupBoolsForPath, depth + 1);
|
|
245
|
+
if (op === 'and') {
|
|
246
|
+
// `false and *` = false; `* and false` = false.
|
|
247
|
+
if (l === false || r === false)
|
|
248
|
+
return false;
|
|
249
|
+
if (l === true && r === true)
|
|
250
|
+
return true;
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
if (op === 'or') {
|
|
254
|
+
// Only `false or false` is provably false.
|
|
255
|
+
if (l === false && r === false)
|
|
256
|
+
return false;
|
|
257
|
+
if (l === true || r === true)
|
|
258
|
+
return true;
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
if (op === '==') {
|
|
262
|
+
// Equality folds when both sides are known booleans.
|
|
263
|
+
// `FOO == false` ↔ `!FOO`; `FOO == true` ↔ `FOO`.
|
|
264
|
+
if (l === undefined || r === undefined)
|
|
265
|
+
return undefined;
|
|
266
|
+
return l === r;
|
|
267
|
+
}
|
|
268
|
+
if (op === '!=') {
|
|
269
|
+
if (l === undefined || r === undefined)
|
|
270
|
+
return undefined;
|
|
271
|
+
return l !== r;
|
|
272
|
+
}
|
|
273
|
+
// Other comparison ops (<, >, …) — not booleans we can prove.
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
case 'parenthesized_expression': {
|
|
277
|
+
// `(cond)`: transparent.
|
|
278
|
+
const inner = node.namedChildren[0];
|
|
279
|
+
if (!inner)
|
|
280
|
+
return undefined;
|
|
281
|
+
return evalCond(inner, localBools, importAliases, lookupBoolsForPath, depth + 1);
|
|
282
|
+
}
|
|
283
|
+
case 'error_union_type': {
|
|
284
|
+
// tree-sitter-zig has no unary `!` node: prefix `!cond` (boolean
|
|
285
|
+
// negation) parses as `error_union_type` because the same `!` token
|
|
286
|
+
// introduces error-union types. In condition position that reading is
|
|
287
|
+
// never a type, so negate whatever the operand folds to: an
|
|
288
|
+
// identifier, a literal, or a parenthesized compound like `!(A and B)`.
|
|
289
|
+
const inner = node.namedChildren[0];
|
|
290
|
+
if (!inner)
|
|
291
|
+
return undefined;
|
|
292
|
+
const v = evalCond(inner, localBools, importAliases, lookupBoolsForPath, depth + 1);
|
|
293
|
+
if (v === undefined)
|
|
294
|
+
return undefined;
|
|
295
|
+
return !v;
|
|
296
|
+
}
|
|
297
|
+
default:
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Pull the textual operator (e.g. "and", "or") out of a
|
|
303
|
+
* `binary_expression`. In tree-sitter-zig, the operator is an
|
|
304
|
+
* anonymous child token whose `type` equals the operator string.
|
|
305
|
+
*/
|
|
306
|
+
function findOperatorToken(binExpr) {
|
|
307
|
+
for (let i = 0; i < binExpr.childCount; i++) {
|
|
308
|
+
const c = binExpr.child(i);
|
|
309
|
+
if (!c)
|
|
310
|
+
continue;
|
|
311
|
+
if (!c.isNamed) {
|
|
312
|
+
// Anonymous tokens for these ops carry their text as the type.
|
|
313
|
+
if (c.type === 'and' || c.type === 'or' || c.type === '==' || c.type === '!=') {
|
|
314
|
+
return c.type;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
@@ -324,7 +324,9 @@ export function resolveRouteHandlerSymbols(model, extractedRoutes, decoratorRout
|
|
|
324
324
|
: uniqueById(model.methods.lookupAllByOwner(owner.nodeId, member))?.nodeId;
|
|
325
325
|
};
|
|
326
326
|
const claim = (routePath, prefix, httpMethod, symbolId) => {
|
|
327
|
-
|
|
327
|
+
// An empty path is a valid, pathless mapping and normalizes to either `/`
|
|
328
|
+
// or its class/router prefix. Only null means the extractor had no route.
|
|
329
|
+
if (routePath === null)
|
|
328
330
|
return;
|
|
329
331
|
const url = normalizeExtractedRoutePath(routePath, prefix);
|
|
330
332
|
const key = routeNodeKey(normalizeRouteMethod(httpMethod), url);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
2
|
+
import { isZigFileStruct, ZIG_CONTAINER_TYPES, zigContainerLabel, zigContainerName, } from '../../languages/zig/captures.js';
|
|
3
|
+
/**
|
|
4
|
+
* Zig containers (struct/enum/union/opaque) are anonymous in the grammar:
|
|
5
|
+
*
|
|
6
|
+
* const Point = struct { ... };
|
|
7
|
+
* pub fn List(comptime T: type) type { return struct { ... }; }
|
|
8
|
+
* fn build() void { const R = struct { ... }; sort(struct { fn lt … }.lt); }
|
|
9
|
+
*
|
|
10
|
+
* The identity is the binding name (first identifier of the parent
|
|
11
|
+
* variable_declaration), the generic type constructor's name, or — for a
|
|
12
|
+
* FUNCTION-LOCAL or ANONYMOUS container — a synthesized `host$Name` /
|
|
13
|
+
* `host$N` (F8). `zigContainerName` is the single source shared with the
|
|
14
|
+
* field/method extractors and the owner walk, so owner ids and node ids
|
|
15
|
+
* agree by construction. Which of the (up to three) ZIG_QUERIES rules that
|
|
16
|
+
* match one container gets to mint it is decided by the provider's
|
|
17
|
+
* `shouldSkipDefinitionCapture` (`isZigRedundantContainerCapture`).
|
|
18
|
+
*/
|
|
19
|
+
const extractZigContainerName = (node, filePath) => zigContainerName(node, filePath);
|
|
20
|
+
const extractZigContainerType = (node) => {
|
|
21
|
+
// The file itself, when it declares top-level fields (file-struct); a
|
|
22
|
+
// namespace-only file is not a type — `extract` then yields no symbol.
|
|
23
|
+
if (node.type === 'source_file')
|
|
24
|
+
return isZigFileStruct(node) ? 'Struct' : undefined;
|
|
25
|
+
return zigContainerLabel(node);
|
|
26
|
+
};
|
|
27
|
+
export const zigClassConfig = {
|
|
28
|
+
language: SupportedLanguages.Zig,
|
|
29
|
+
typeDeclarationNodes: [...ZIG_CONTAINER_TYPES, 'source_file'],
|
|
30
|
+
extractName: extractZigContainerName,
|
|
31
|
+
extractType: extractZigContainerType,
|
|
32
|
+
};
|
|
@@ -45,6 +45,7 @@ const CLASS_LIKE_LABELS = new Set([
|
|
|
45
45
|
'Interface',
|
|
46
46
|
'Enum',
|
|
47
47
|
'Record',
|
|
48
|
+
'Union',
|
|
48
49
|
]);
|
|
49
50
|
const extractScopeSegmentsFromNode = (scopeNode, scopeNameNodeTypes) => {
|
|
50
51
|
const nameNode = scopeNode.childForFieldName?.('name') ??
|
|
@@ -100,7 +101,9 @@ export function createClassExtractor(config) {
|
|
|
100
101
|
const extract = (node, fallback) => {
|
|
101
102
|
if (!typeDeclarationSet.has(node.type))
|
|
102
103
|
return null;
|
|
103
|
-
const name = config.extractName?.(node
|
|
104
|
+
const name = config.extractName?.(node, fallback?.filePath) ??
|
|
105
|
+
extractTypeNameFromNode(node) ??
|
|
106
|
+
fallback?.name;
|
|
104
107
|
const type = config.extractType?.(node) ??
|
|
105
108
|
DEFAULT_LABEL_BY_NODE_TYPE[node.type] ??
|
|
106
109
|
(isClassLikeLabel(fallback?.type) ? fallback.type : undefined);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NodeLabel, SupportedLanguages } from '../../_shared/index.js';
|
|
2
2
|
import type { SyntaxNode } from './utils/ast-helpers.js';
|
|
3
|
-
export type ClassLikeNodeLabel = Extract<NodeLabel, 'Class' | 'Struct' | 'Interface' | 'Enum' | 'Record'>;
|
|
3
|
+
export type ClassLikeNodeLabel = Extract<NodeLabel, 'Class' | 'Struct' | 'Interface' | 'Enum' | 'Record' | 'Union'>;
|
|
4
4
|
export interface ExtractedClassSymbol {
|
|
5
5
|
name: string;
|
|
6
6
|
type: ClassLikeNodeLabel;
|
|
@@ -32,6 +32,8 @@ export interface ClassExtractor {
|
|
|
32
32
|
extract(node: SyntaxNode, fallback?: {
|
|
33
33
|
name?: string;
|
|
34
34
|
type?: NodeLabel | null;
|
|
35
|
+
/** Repo-relative path of the file being extracted, when known. */
|
|
36
|
+
filePath?: string;
|
|
35
37
|
}): ExtractedClassSymbol | null;
|
|
36
38
|
extractQualifiedName(node: SyntaxNode, simpleName: string): string | null;
|
|
37
39
|
/**
|
|
@@ -61,7 +63,9 @@ export interface ClassExtractionConfig {
|
|
|
61
63
|
*/
|
|
62
64
|
qualifiedNodeId?: boolean;
|
|
63
65
|
scopeNameNodeTypes?: string[];
|
|
64
|
-
|
|
66
|
+
/** `filePath` is supplied when known (definition-phase extraction) — a
|
|
67
|
+
* language whose file IS a type names it from the path. */
|
|
68
|
+
extractName?: (node: SyntaxNode, filePath?: string) => string | undefined;
|
|
65
69
|
extractType?: (node: SyntaxNode) => ClassLikeNodeLabel | undefined;
|
|
66
70
|
extractScopeSegments?: (node: SyntaxNode) => string[] | null | undefined;
|
|
67
71
|
extractTemplateArguments?: (node: SyntaxNode) => string[] | undefined;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared destination-identity keying — the async counterpart of `routeNodeKey`
|
|
3
|
+
* in `route-extractors/route-path.ts`.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately OUTSIDE `frameworks/spring/`, and for the same reason
|
|
6
|
+
* `routeNodeKey` sits outside the routes phase: the identity has to be mintable
|
|
7
|
+
* by anything that names a broker address, so a Node Kafka client or a Celery
|
|
8
|
+
* task queue can land on the very node a Spring publisher minted. A key that
|
|
9
|
+
* lived in the Spring module would force every other producer to import Spring,
|
|
10
|
+
* or — worse — let each one invent its own spelling, and two spellings of one
|
|
11
|
+
* address is precisely the missed connection this overlay exists to make.
|
|
12
|
+
*
|
|
13
|
+
* `broker` is a plain `string`, NOT the Spring `SpringDestinationBroker` union.
|
|
14
|
+
* Importing that union here is the dependency this module exists to avoid, and
|
|
15
|
+
* widening it costs nothing that matters: the union is a subtype of `string`,
|
|
16
|
+
* so a Spring caller passes its own values unchanged, while a future
|
|
17
|
+
* non-Spring caller stays free to attest to a broker Spring has no name for.
|
|
18
|
+
* The trade is real but small — this signature cannot reject a misspelled
|
|
19
|
+
* broker — and it is the same trade `routeNodeKey` makes by taking `method` as
|
|
20
|
+
* a `string` rather than an HTTP-verb union. Pure string logic, no
|
|
21
|
+
* dependencies.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The `Destination` node identity: `(broker, address)` when the broker is
|
|
25
|
+
* known, falling back to the address alone when it is not.
|
|
26
|
+
*
|
|
27
|
+
* The broker belongs IN the key, exactly as the HTTP verb belongs in
|
|
28
|
+
* `routeNodeKey`. `GET /x` and `POST /x` are two nodes, both fully joinable,
|
|
29
|
+
* and neither is punished for the other's existence; `kafka orders` and
|
|
30
|
+
* `rabbit orders` are two nodes on the same terms. A Kafka topic and a Rabbit
|
|
31
|
+
* queue that happen to share a name are two places, and one node for both would
|
|
32
|
+
* report a publisher and a subscriber as connected when nothing connects them.
|
|
33
|
+
*
|
|
34
|
+
* The known objection is that the broker is INFERRED — from a receiver's name,
|
|
35
|
+
* from an annotation table — so a wrong guess splits a pair that is really one.
|
|
36
|
+
* That is true and it is the cost. It is worth paying because the alternative
|
|
37
|
+
* tried first was worse: withdrawing the address from every site that named it
|
|
38
|
+
* split the pair even when the guess was RIGHT, since one unrelated third party
|
|
39
|
+
* writing the same word anywhere in the repository was enough to disconnect
|
|
40
|
+
* everybody on that spelling. Putting the broker in the key bounds the damage
|
|
41
|
+
* of a wrong guess to the one pair it was wrong about, instead of spreading it
|
|
42
|
+
* to every pair that shares an address with a stranger.
|
|
43
|
+
*
|
|
44
|
+
* ── THE ADDRESS-ONLY FALLBACK IS UNREACHABLE TODAY ──────────────────────
|
|
45
|
+
*
|
|
46
|
+
* `SpringDestinationCandidate.broker` is REQUIRED, and every annotation rule
|
|
47
|
+
* and every producer template supplies one, so no Spring caller can reach the
|
|
48
|
+
* `undefined` branch. It is written anyway, and on purpose: the parameter shape
|
|
49
|
+
* is the contract this module offers the next language, and the next language
|
|
50
|
+
* may well capture an address without being able to attest to a broker (a bare
|
|
51
|
+
* `queue.publish(name)` in a dynamic language, a binding that names only a
|
|
52
|
+
* channel). Degrading to address-only is the right answer there — silence about
|
|
53
|
+
* the broker is not a claim about it, and refusing to key such a site at all
|
|
54
|
+
* would lose a real destination over a value nobody disagreed about.
|
|
55
|
+
*
|
|
56
|
+
* Because the branch is dead, it is covered by testing THIS function directly
|
|
57
|
+
* rather than by a pipeline test staged to look as though a phase reached it.
|
|
58
|
+
*/
|
|
59
|
+
export declare function destinationNodeKey(broker: string | undefined, address: string): string;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared destination-identity keying — the async counterpart of `routeNodeKey`
|
|
3
|
+
* in `route-extractors/route-path.ts`.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately OUTSIDE `frameworks/spring/`, and for the same reason
|
|
6
|
+
* `routeNodeKey` sits outside the routes phase: the identity has to be mintable
|
|
7
|
+
* by anything that names a broker address, so a Node Kafka client or a Celery
|
|
8
|
+
* task queue can land on the very node a Spring publisher minted. A key that
|
|
9
|
+
* lived in the Spring module would force every other producer to import Spring,
|
|
10
|
+
* or — worse — let each one invent its own spelling, and two spellings of one
|
|
11
|
+
* address is precisely the missed connection this overlay exists to make.
|
|
12
|
+
*
|
|
13
|
+
* `broker` is a plain `string`, NOT the Spring `SpringDestinationBroker` union.
|
|
14
|
+
* Importing that union here is the dependency this module exists to avoid, and
|
|
15
|
+
* widening it costs nothing that matters: the union is a subtype of `string`,
|
|
16
|
+
* so a Spring caller passes its own values unchanged, while a future
|
|
17
|
+
* non-Spring caller stays free to attest to a broker Spring has no name for.
|
|
18
|
+
* The trade is real but small — this signature cannot reject a misspelled
|
|
19
|
+
* broker — and it is the same trade `routeNodeKey` makes by taking `method` as
|
|
20
|
+
* a `string` rather than an HTTP-verb union. Pure string logic, no
|
|
21
|
+
* dependencies.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The `Destination` node identity: `(broker, address)` when the broker is
|
|
25
|
+
* known, falling back to the address alone when it is not.
|
|
26
|
+
*
|
|
27
|
+
* The broker belongs IN the key, exactly as the HTTP verb belongs in
|
|
28
|
+
* `routeNodeKey`. `GET /x` and `POST /x` are two nodes, both fully joinable,
|
|
29
|
+
* and neither is punished for the other's existence; `kafka orders` and
|
|
30
|
+
* `rabbit orders` are two nodes on the same terms. A Kafka topic and a Rabbit
|
|
31
|
+
* queue that happen to share a name are two places, and one node for both would
|
|
32
|
+
* report a publisher and a subscriber as connected when nothing connects them.
|
|
33
|
+
*
|
|
34
|
+
* The known objection is that the broker is INFERRED — from a receiver's name,
|
|
35
|
+
* from an annotation table — so a wrong guess splits a pair that is really one.
|
|
36
|
+
* That is true and it is the cost. It is worth paying because the alternative
|
|
37
|
+
* tried first was worse: withdrawing the address from every site that named it
|
|
38
|
+
* split the pair even when the guess was RIGHT, since one unrelated third party
|
|
39
|
+
* writing the same word anywhere in the repository was enough to disconnect
|
|
40
|
+
* everybody on that spelling. Putting the broker in the key bounds the damage
|
|
41
|
+
* of a wrong guess to the one pair it was wrong about, instead of spreading it
|
|
42
|
+
* to every pair that shares an address with a stranger.
|
|
43
|
+
*
|
|
44
|
+
* ── THE ADDRESS-ONLY FALLBACK IS UNREACHABLE TODAY ──────────────────────
|
|
45
|
+
*
|
|
46
|
+
* `SpringDestinationCandidate.broker` is REQUIRED, and every annotation rule
|
|
47
|
+
* and every producer template supplies one, so no Spring caller can reach the
|
|
48
|
+
* `undefined` branch. It is written anyway, and on purpose: the parameter shape
|
|
49
|
+
* is the contract this module offers the next language, and the next language
|
|
50
|
+
* may well capture an address without being able to attest to a broker (a bare
|
|
51
|
+
* `queue.publish(name)` in a dynamic language, a binding that names only a
|
|
52
|
+
* channel). Degrading to address-only is the right answer there — silence about
|
|
53
|
+
* the broker is not a claim about it, and refusing to key such a site at all
|
|
54
|
+
* would lose a real destination over a value nobody disagreed about.
|
|
55
|
+
*
|
|
56
|
+
* Because the branch is dead, it is covered by testing THIS function directly
|
|
57
|
+
* rather than by a pipeline test staged to look as though a phase reached it.
|
|
58
|
+
*/
|
|
59
|
+
export function destinationNodeKey(broker, address) {
|
|
60
|
+
return broker ? `${broker} ${address}` : address;
|
|
61
|
+
}
|
|
@@ -29,8 +29,12 @@ export interface EntryPointScoreResult {
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function calculateEntryPointScore(name: string, language: SupportedLanguages, isExported: boolean, callerCount: number, calleeCount: number, filePath?: string): EntryPointScoreResult;
|
|
31
31
|
/**
|
|
32
|
-
* Check if a file path is a test file (should be excluded from entry points)
|
|
33
|
-
*
|
|
32
|
+
* Check if a file path is a test file (should be excluded from entry points).
|
|
33
|
+
*
|
|
34
|
+
* Delegates to the shared predicate in `utils/test-file-path.ts`. This used to be
|
|
35
|
+
* a second, hand-maintained copy that had drifted from the one backing the MCP
|
|
36
|
+
* `includeTests` flag — see that module's header. Re-exported under this name so
|
|
37
|
+
* existing importers are unaffected.
|
|
34
38
|
*/
|
|
35
39
|
export declare function isTestFile(filePath: string): boolean;
|
|
36
40
|
/**
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { detectFrameworkFromPath } from './framework-detection.js';
|
|
13
13
|
import { providers } from './languages/index.js';
|
|
14
|
+
import { isTestFilePath } from './utils/test-file-path.js';
|
|
14
15
|
// ============================================================================
|
|
15
16
|
// NAME PATTERNS
|
|
16
17
|
// ============================================================================
|
|
@@ -127,52 +128,15 @@ export function calculateEntryPointScore(name, language, isExported, callerCount
|
|
|
127
128
|
// HELPER FUNCTIONS
|
|
128
129
|
// ============================================================================
|
|
129
130
|
/**
|
|
130
|
-
* Check if a file path is a test file (should be excluded from entry points)
|
|
131
|
-
*
|
|
131
|
+
* Check if a file path is a test file (should be excluded from entry points).
|
|
132
|
+
*
|
|
133
|
+
* Delegates to the shared predicate in `utils/test-file-path.ts`. This used to be
|
|
134
|
+
* a second, hand-maintained copy that had drifted from the one backing the MCP
|
|
135
|
+
* `includeTests` flag — see that module's header. Re-exported under this name so
|
|
136
|
+
* existing importers are unaffected.
|
|
132
137
|
*/
|
|
133
138
|
export function isTestFile(filePath) {
|
|
134
|
-
|
|
135
|
-
return (
|
|
136
|
-
// JavaScript/TypeScript test patterns
|
|
137
|
-
p.includes('.test.') ||
|
|
138
|
-
p.includes('.spec.') ||
|
|
139
|
-
p.includes('__tests__/') ||
|
|
140
|
-
p.includes('__mocks__/') ||
|
|
141
|
-
// Generic test folders
|
|
142
|
-
p.includes('/test/') ||
|
|
143
|
-
p.includes('/tests/') ||
|
|
144
|
-
p.includes('/testing/') ||
|
|
145
|
-
// Python test patterns
|
|
146
|
-
p.endsWith('_test.py') ||
|
|
147
|
-
p.includes('/test_') ||
|
|
148
|
-
// Go test patterns
|
|
149
|
-
p.endsWith('_test.go') ||
|
|
150
|
-
// Java test patterns
|
|
151
|
-
p.includes('/src/test/') ||
|
|
152
|
-
// Rust test patterns (inline tests are different, but test files)
|
|
153
|
-
p.includes('/tests/') ||
|
|
154
|
-
// Swift/iOS test patterns
|
|
155
|
-
p.endsWith('tests.swift') ||
|
|
156
|
-
p.endsWith('test.swift') ||
|
|
157
|
-
p.includes('uitests/') ||
|
|
158
|
-
// C# test patterns
|
|
159
|
-
p.endsWith('tests.cs') ||
|
|
160
|
-
p.endsWith('test.cs') ||
|
|
161
|
-
p.includes('.tests/') ||
|
|
162
|
-
p.includes('.test/') ||
|
|
163
|
-
p.includes('.integrationtests/') ||
|
|
164
|
-
p.includes('.unittests/') ||
|
|
165
|
-
p.includes('/testproject/') ||
|
|
166
|
-
// PHP/Laravel test patterns
|
|
167
|
-
p.endsWith('test.php') ||
|
|
168
|
-
p.endsWith('spec.php') ||
|
|
169
|
-
p.includes('/tests/feature/') ||
|
|
170
|
-
p.includes('/tests/unit/') ||
|
|
171
|
-
// Ruby test patterns
|
|
172
|
-
p.endsWith('_spec.rb') ||
|
|
173
|
-
p.endsWith('_test.rb') ||
|
|
174
|
-
p.includes('/spec/') ||
|
|
175
|
-
p.includes('/test/fixtures/'));
|
|
139
|
+
return isTestFilePath(filePath);
|
|
176
140
|
}
|
|
177
141
|
/**
|
|
178
142
|
* Check if a file path is likely a utility/helper file
|
|
@@ -56,3 +56,40 @@ export declare const swiftExportChecker: ExportChecker;
|
|
|
56
56
|
export declare const rubyExportChecker: ExportChecker;
|
|
57
57
|
/** Dart: public if no leading underscore (convention, same as Python). */
|
|
58
58
|
export declare const dartExportChecker: ExportChecker;
|
|
59
|
+
/**
|
|
60
|
+
* Zig: walk to the enclosing decl, scan its direct children for an unnamed `pub`
|
|
61
|
+
* or `export` keyword token (tree-sitter-zig models both as anonymous keyword
|
|
62
|
+
* children of function_declaration / variable_declaration). Two different
|
|
63
|
+
* facts share this one flag, on purpose:
|
|
64
|
+
* - `pub` is Zig-module visibility — reachable from another `.zig` file
|
|
65
|
+
* through `@import`;
|
|
66
|
+
* - `export` is C-ABI linkage (`export fn add(...)`) — the symbol lands in
|
|
67
|
+
* the object file for FFI callers, and it never carries `pub`.
|
|
68
|
+
* `isExported` means "visible outside this compilation unit" graph-wide (C uses
|
|
69
|
+
* external linkage for the same flag), so both qualify. The `visibility`
|
|
70
|
+
* property is the Zig-only fact and is `pub`-only — see `hasZigPubKeyword`:
|
|
71
|
+
* an `export fn` without `pub` is public to C and PRIVATE to other Zig files.
|
|
72
|
+
* Container fields (struct/enum variants) are public if their enclosing
|
|
73
|
+
* variable_declaration is public.
|
|
74
|
+
*
|
|
75
|
+
* The walk stops at the FIRST declaration it reaches: a `fn` inside
|
|
76
|
+
* `pub const T = struct { … }` carries its own `pub` (or not), independent of
|
|
77
|
+
* the container's. Continuing up to the wrapper marked every private method of
|
|
78
|
+
* a public container as exported.
|
|
79
|
+
*/
|
|
80
|
+
export declare const zigExportChecker: ExportChecker;
|
|
81
|
+
/**
|
|
82
|
+
* Does this Zig declaration carry a `pub` or `export` keyword child? Feeds
|
|
83
|
+
* `isExported` (visible outside the compilation unit — to Zig importers OR to
|
|
84
|
+
* C callers).
|
|
85
|
+
*/
|
|
86
|
+
export declare function hasZigVisibilityKeyword(declNode: SyntaxNode): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Does this Zig declaration carry a `pub` keyword child? Feeds `visibility`,
|
|
89
|
+
* the Zig-module fact: per the language reference, only `pub` declarations are
|
|
90
|
+
* accessible from another file via `@import`; `export` alone gives C linkage
|
|
91
|
+
* and leaves the declaration private to Zig code. So `export fn c_add` reports
|
|
92
|
+
* `isExported: true` (FFI surface) with `visibility: 'private'` (Zig surface)
|
|
93
|
+
* — two facts, two properties, deliberately not one.
|
|
94
|
+
*/
|
|
95
|
+
export declare function hasZigPubKeyword(declNode: SyntaxNode): boolean;
|