gitnexus 1.6.10-rc.21 → 1.6.10-rc.211
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 +212 -22
- package/dist/_shared/graph/types.d.ts +27 -8
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +4 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.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 +19 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +23 -10
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.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 +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +124 -1
- 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/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.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/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +297 -5
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +10 -2
- package/dist/cli/ai-context.js +128 -61
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +25 -114
- package/dist/cli/analyze.js +194 -36
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +23 -0
- package/dist/cli/doctor.js +72 -9
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +128 -9
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +23 -2
- package/dist/cli/help-i18n.js +3 -0
- package/dist/cli/i18n/en.d.ts +17 -8
- package/dist/cli/i18n/en.js +19 -8
- package/dist/cli/i18n/resources.d.ts +26 -8
- package/dist/cli/i18n/zh-CN.d.ts +9 -0
- package/dist/cli/i18n/zh-CN.js +17 -8
- package/dist/cli/index.js +16 -9
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +30 -7
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/skill-gen.js +88 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +75 -7
- package/dist/cli/uninstall.js +7 -2
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +59 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +31 -4
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +154 -0
- package/dist/core/analyzer-identity.js +2158 -0
- package/dist/core/augmentation/engine.js +95 -76
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +8 -5
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +24 -1
- package/dist/core/embeddings/embedding-pipeline.js +341 -19
- package/dist/core/embeddings/http-client.d.ts +10 -2
- package/dist/core/embeddings/http-client.js +282 -47
- package/dist/core/embeddings/node-module-compat.d.ts +4 -2
- package/dist/core/embeddings/node-module-compat.js +4 -2
- package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
- package/dist/core/embeddings/runtime-install.js +1 -1
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.js +5 -27
- package/dist/core/group/cross-impact.d.ts +21 -0
- package/dist/core/group/cross-impact.js +128 -15
- package/dist/core/group/cross-trace.js +27 -16
- package/dist/core/group/extractors/http-patterns/java.js +91 -14
- package/dist/core/group/extractors/http-patterns/node.js +19 -0
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/service.js +10 -1
- package/dist/core/group/storage.js +2 -33
- package/dist/core/group/types.d.ts +18 -0
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +80 -0
- package/dist/core/index-freshness.js +120 -0
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +88 -83
- package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
- package/dist/core/ingestion/di-extractors/index.js +17 -18
- package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
- package/dist/core/ingestion/di-extractors/spring.js +87 -3
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/emit-references.js +4 -0
- package/dist/core/ingestion/filesystem-walker.js +16 -12
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +27 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +428 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +27 -8
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +20 -1
- package/dist/core/ingestion/language-config.js +18 -23
- package/dist/core/ingestion/language-provider.d.ts +133 -7
- package/dist/core/ingestion/languages/c/captures.js +63 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +26 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +222 -3
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +62 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +44 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +686 -16
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +8 -1
- package/dist/core/ingestion/languages/go/captures.js +142 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +7 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +321 -49
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +39 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +35 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-di.js +160 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +76 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +278 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +232 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +197 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +47 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +20 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +359 -51
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +229 -7
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +53 -5
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -3
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
- package/dist/core/ingestion/languages/ruby/captures.js +200 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +52 -1
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +48 -6
- package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
- package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +99 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +288 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +340 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +291 -0
- package/dist/core/ingestion/languages/typescript.js +87 -1
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/parsing-processor.js +32 -1
- package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
- package/dist/core/ingestion/pipeline-phases/di.js +275 -157
- package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
- package/dist/core/ingestion/pipeline-phases/index.js +3 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
- package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +27 -3
- package/dist/core/ingestion/pipeline.js +62 -12
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +78 -6
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +864 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +109 -24
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +617 -59
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +15 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +56 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +46 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +19 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +64 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +968 -56
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +688 -5
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +311 -14
- package/dist/core/ingestion/utils/ast-helpers.js +745 -48
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +153 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +72 -0
- package/dist/core/ingestion/workers/callable-id.js +116 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +409 -39
- package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
- package/dist/core/ingestion/workers/worker-pool.js +133 -25
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +80 -17
- package/dist/core/lbug/extension-load-error.d.ts +2 -2
- package/dist/core/lbug/extension-load-error.js +44 -27
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +32 -7
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +337 -3
- package/dist/core/lbug/lbug-adapter.js +772 -67
- package/dist/core/lbug/lbug-config.d.ts +93 -6
- package/dist/core/lbug/lbug-config.js +269 -9
- package/dist/core/lbug/native-check.d.ts +39 -0
- package/dist/core/lbug/native-check.js +323 -46
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -7
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +162 -3
- package/dist/core/lbug/schema.js +392 -157
- package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
- package/dist/core/lbug/sidecar-recovery.js +1 -1
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +12 -7
- package/dist/core/run-analyze.d.ts +150 -3
- package/dist/core/run-analyze.js +1562 -151
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +167 -2
- package/dist/core/search/fts-indexes.js +264 -10
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +37 -5
- package/dist/core/wiki/llm-client.js +88 -17
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +3 -0
- package/dist/mcp/local/bean-metadata.js +46 -0
- package/dist/mcp/local/local-backend.d.ts +167 -6
- package/dist/mcp/local/local-backend.js +1756 -405
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +35 -0
- package/dist/mcp/repository-policy.js +333 -0
- package/dist/mcp/resources.js +34 -7
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +48 -18
- package/dist/mcp/tools.d.ts +8 -8
- package/dist/mcp/tools.js +91 -20
- package/dist/server/analyze-job.d.ts +40 -2
- package/dist/server/analyze-job.js +30 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +3 -2
- package/dist/server/analyze-worker-core.js +15 -3
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +200 -155
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +165 -0
- package/dist/storage/git.js +352 -3
- package/dist/storage/index-lock.d.ts +83 -0
- package/dist/storage/index-lock.js +654 -0
- package/dist/storage/parse-cache.js +482 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +235 -1
- package/dist/storage/repo-manager.d.ts +29 -309
- package/dist/storage/repo-manager.js +187 -165
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +20 -12
- package/scripts/cross-platform-shard.ts +143 -0
- package/scripts/cross-platform-tests.ts +94 -0
- package/scripts/ensure-fts.ts +14 -3
- package/scripts/run-cross-platform.ts +36 -10
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +147 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +309 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2366 -0
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +279 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +272 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-DIzEQ1JJ.js +626 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
- package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/chunk-6L755F7B-CMhLBxi2.js +1 -0
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
- package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +70 -0
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/chunk-VJFVEZTB-CX66F2ep.js +206 -0
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +3 -0
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-B4eB4dNZ.js → index-BBNl0qfX.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
- package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
- package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/requirementDiagram-RASO5HTO-B-l8InpK.js +84 -0
- package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/timeline-definition-WJXWRH4I-DUfp1R3E.js +120 -0
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +17 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
- package/web/assets/agent-DNYDy-KA.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
- package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
- package/web/assets/chunk-2T2R6R2M-pkw2oXHH.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-zxhDWgyF.js +0 -124
- package/web/assets/chunk-7J6CGLKN-AmkN8jJN.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-INKRHTLW-D9BM9HWZ.js +0 -70
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-tD2F6wxK.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LCXTWHL2-Ba9JK-6F.js +0 -231
- package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
- package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
- package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BJusEiGe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-BCpUlARQ.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
- package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
- package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
- package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
- package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DIPVUIQ6.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-D3YC_xyg.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
- package/web/assets/src-BNCXICdA.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BQX2ossk.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -15,8 +15,189 @@
|
|
|
15
15
|
* `linkStatus: 'unresolved'`.
|
|
16
16
|
*/
|
|
17
17
|
import { resolvePhpImportInternal } from '../../import-resolvers/php.js';
|
|
18
|
+
import { perFileSet } from '../../import-resolvers/per-file-set.js';
|
|
19
|
+
import { getWorkspaceFileIndex } from '../../import-resolvers/workspace-file-index.js';
|
|
18
20
|
import { readFileSync } from 'node:fs';
|
|
19
21
|
import { join } from 'node:path';
|
|
22
|
+
function normalizePhpPath(value) {
|
|
23
|
+
return value.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
24
|
+
}
|
|
25
|
+
function namespaceDirectories(targetRaw, composerConfig, resolved) {
|
|
26
|
+
const directories = new Set();
|
|
27
|
+
if (resolved !== null) {
|
|
28
|
+
const normalizedResolved = normalizePhpPath(resolved);
|
|
29
|
+
const separator = normalizedResolved.lastIndexOf('/');
|
|
30
|
+
if (separator >= 0)
|
|
31
|
+
directories.add(normalizedResolved.slice(0, separator));
|
|
32
|
+
}
|
|
33
|
+
if (composerConfig === null)
|
|
34
|
+
return [...directories];
|
|
35
|
+
const normalizedTarget = normalizePhpPath(targetRaw);
|
|
36
|
+
const mappings = [...composerConfig.psr4.entries()].sort((left, right) => {
|
|
37
|
+
const lengthDifference = right[0].length - left[0].length;
|
|
38
|
+
return lengthDifference !== 0 ? lengthDifference : left[0].localeCompare(right[0]);
|
|
39
|
+
});
|
|
40
|
+
for (const [namespacePrefix, directoryPrefix] of mappings) {
|
|
41
|
+
const normalizedPrefix = normalizePhpPath(namespacePrefix);
|
|
42
|
+
if (normalizedTarget !== normalizedPrefix &&
|
|
43
|
+
!normalizedTarget.startsWith(`${normalizedPrefix}/`)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const remainder = normalizedTarget.slice(normalizedPrefix.length).replace(/^\//, '');
|
|
47
|
+
const separator = remainder.lastIndexOf('/');
|
|
48
|
+
const relativeNamespace = separator >= 0 ? remainder.slice(0, separator) : '';
|
|
49
|
+
directories.add(normalizePhpPath(relativeNamespace === '' ? directoryPrefix : `${directoryPrefix}/${relativeNamespace}`));
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
return [...directories];
|
|
53
|
+
}
|
|
54
|
+
function parentDirectory(filePath) {
|
|
55
|
+
const normalizedPath = normalizePhpPath(filePath);
|
|
56
|
+
const separator = normalizedPath.lastIndexOf('/');
|
|
57
|
+
return separator < 0 ? '' : normalizedPath.slice(0, separator);
|
|
58
|
+
}
|
|
59
|
+
function directoryAliases(filePath) {
|
|
60
|
+
const normalizedPath = normalizePhpPath(filePath);
|
|
61
|
+
const separator = normalizedPath.lastIndexOf('/');
|
|
62
|
+
if (separator < 0)
|
|
63
|
+
return [''];
|
|
64
|
+
const parent = normalizedPath.slice(0, separator);
|
|
65
|
+
const aliases = new Set([parent]);
|
|
66
|
+
const segments = parent.split('/').filter(Boolean);
|
|
67
|
+
for (let index = 0; index < segments.length; index++) {
|
|
68
|
+
aliases.add(segments.slice(index).join('/'));
|
|
69
|
+
}
|
|
70
|
+
return [...aliases];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Directory alias → the files under it, built once per pass.
|
|
74
|
+
*
|
|
75
|
+
* A scope-resolution pass shares one stable `parsedFiles` array across imports,
|
|
76
|
+
* so the array identity is the memo key — see `perFileSet`.
|
|
77
|
+
*/
|
|
78
|
+
const filesByDirectory = perFileSet((parsedFiles) => {
|
|
79
|
+
const mutable = new Map();
|
|
80
|
+
for (const parsed of parsedFiles) {
|
|
81
|
+
for (const directory of directoryAliases(parsed.filePath)) {
|
|
82
|
+
const files = mutable.get(directory) ?? [];
|
|
83
|
+
files.push(parsed);
|
|
84
|
+
mutable.set(directory, files);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return mutable;
|
|
88
|
+
});
|
|
89
|
+
/** Memoized on the `allFilePaths` Set identity, like `getWorkspaceFileIndex`. */
|
|
90
|
+
const getPhpWorkspaceIndex = perFileSet((allFilePaths) => {
|
|
91
|
+
// The Set is passed THROUGH to the shared cache, never copied — a defensive
|
|
92
|
+
// `new Set(...)` here or in `scope-resolver.ts` would hand both WeakMaps a
|
|
93
|
+
// fresh key per import and silently restore O(imports × files) (#1918 P1).
|
|
94
|
+
const { normalized, all, index } = getWorkspaceFileIndex(allFilePaths);
|
|
95
|
+
/**
|
|
96
|
+
* Whole-path-lowercase → the first PROPER-suffix match, the correction `get`
|
|
97
|
+
* applies to a whole-path hit from the shared index.
|
|
98
|
+
*
|
|
99
|
+
* DEFERRED, and deferred all the way to the branch that reads it rather than
|
|
100
|
+
* to the first `get`. The builder walks every slash of every path and
|
|
101
|
+
* lowercases a slice at each, so it is O(paths × depth) in both time and
|
|
102
|
+
* allocation — measured 46.0 ms at 32 000 paths on the PHP arm of
|
|
103
|
+
* `bench/import-target/`, filling a map that held ZERO entries, because it
|
|
104
|
+
* can only hold one when some file's whole path is also a proper suffix of
|
|
105
|
+
* another's. Most repos never produce that, and the ones that do reach this
|
|
106
|
+
* branch only for the imports that actually hit a whole path. Pure function
|
|
107
|
+
* of `normalized`/`all`, both of which the returned object already retains,
|
|
108
|
+
* so building it late is behaviour-identical and retains nothing new.
|
|
109
|
+
*
|
|
110
|
+
* `wholePathLower` is a scratch set of the builder, not state: nothing reads
|
|
111
|
+
* it afterwards, so deferring the map defers it too.
|
|
112
|
+
*/
|
|
113
|
+
let firstProperSuffixMatch = null;
|
|
114
|
+
const getFirstProperSuffixMatch = () => {
|
|
115
|
+
if (firstProperSuffixMatch !== null)
|
|
116
|
+
return firstProperSuffixMatch;
|
|
117
|
+
const wholePathLower = new Set();
|
|
118
|
+
for (const path of normalized)
|
|
119
|
+
wholePathLower.add(path.toLowerCase());
|
|
120
|
+
// Only the suffixes that a whole path can shadow are worth storing; see the
|
|
121
|
+
// header. Built from `normalized`, so it costs no traversal of the Set.
|
|
122
|
+
const built = new Map();
|
|
123
|
+
for (let i = 0; i < normalized.length; i++) {
|
|
124
|
+
const lower = normalized[i].toLowerCase();
|
|
125
|
+
for (let slash = lower.indexOf('/'); slash >= 0; slash = lower.indexOf('/', slash + 1)) {
|
|
126
|
+
const suffix = lower.slice(slash + 1);
|
|
127
|
+
if (!wholePathLower.has(suffix))
|
|
128
|
+
continue;
|
|
129
|
+
if (!built.has(suffix))
|
|
130
|
+
built.set(suffix, all[i]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
firstProperSuffixMatch = built;
|
|
134
|
+
return built;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Raw directory → the files directly in it, for `getFilesInDir`.
|
|
138
|
+
*
|
|
139
|
+
* DEFERRED for the same reason as the shared `dirMap` (#2903), and here the
|
|
140
|
+
* case is stronger: `getFilesInDir` has exactly one caller,
|
|
141
|
+
* `import-resolvers/php.ts`'s PSR-4 function/constant fallback, and that
|
|
142
|
+
* caller sits inside `if (composerConfig) { … }`. `resolvePhpImportTarget`
|
|
143
|
+
* hard-codes `composerConfig: null`, so on the LanguageProvider path the map
|
|
144
|
+
* is statically unreachable; on the ScopeResolver path it is reachable only
|
|
145
|
+
* in a repo that has a parseable `composer.json` with `autoload.psr-4`.
|
|
146
|
+
* Measured 6.8 ms / 3.56 MiB at 32 000 paths, paid by every PHP repo without
|
|
147
|
+
* one. Pure function of `all`, which the returned object retains.
|
|
148
|
+
*/
|
|
149
|
+
let filesByRawDirectory = null;
|
|
150
|
+
const getFilesByRawDirectory = () => {
|
|
151
|
+
if (filesByRawDirectory !== null)
|
|
152
|
+
return filesByRawDirectory;
|
|
153
|
+
// Raw paths, not normalized: the scan this replaces tests `f.startsWith(...)`
|
|
154
|
+
// against the Set's own strings, so a backslash path is a miss there and must
|
|
155
|
+
// stay a miss here. Insertion order is Set order, so `[0]` is the file the
|
|
156
|
+
// scan would have returned first.
|
|
157
|
+
const built = new Map();
|
|
158
|
+
for (const raw of all) {
|
|
159
|
+
const separator = raw.lastIndexOf('/');
|
|
160
|
+
if (separator < 0)
|
|
161
|
+
continue;
|
|
162
|
+
const directory = raw.slice(0, separator);
|
|
163
|
+
const bucket = built.get(directory);
|
|
164
|
+
if (bucket === undefined)
|
|
165
|
+
built.set(directory, [raw]);
|
|
166
|
+
else
|
|
167
|
+
bucket.push(raw);
|
|
168
|
+
}
|
|
169
|
+
filesByRawDirectory = built;
|
|
170
|
+
return built;
|
|
171
|
+
};
|
|
172
|
+
const suffixIndex = {
|
|
173
|
+
get: (suffix) => {
|
|
174
|
+
const hit = index.getInsensitive(suffix);
|
|
175
|
+
if (hit === undefined)
|
|
176
|
+
return undefined;
|
|
177
|
+
const lower = suffix.toLowerCase();
|
|
178
|
+
// A proper-suffix hit is already the scan's answer: the shared map holds
|
|
179
|
+
// the first file matching EITHER way, so nothing earlier matched at all.
|
|
180
|
+
if (hit.replace(/\\/g, '/').toLowerCase() !== lower)
|
|
181
|
+
return hit;
|
|
182
|
+
// Whole-path hit — invisible to `endsWith('/' + S)`. The scan keeps going.
|
|
183
|
+
// The only branch that needs the correction map, hence the only one that
|
|
184
|
+
// builds it.
|
|
185
|
+
return getFirstProperSuffixMatch().get(lower);
|
|
186
|
+
},
|
|
187
|
+
// Site 1 must stay a no-op, and `suffixResolve` folds this into `get`.
|
|
188
|
+
getInsensitive: () => undefined,
|
|
189
|
+
getFilesInDir: (dirSuffix, extension) => {
|
|
190
|
+
// `nsDirPrefix` is `nsDir` when it already ends in `/`, else `nsDir + '/'`
|
|
191
|
+
// — either way the directory is `nsDir` minus one trailing slash.
|
|
192
|
+
const directory = dirSuffix.endsWith('/') ? dirSuffix.slice(0, -1) : dirSuffix;
|
|
193
|
+
const bucket = getFilesByRawDirectory().get(directory);
|
|
194
|
+
if (bucket === undefined)
|
|
195
|
+
return [];
|
|
196
|
+
return bucket.filter((file) => file.endsWith(extension));
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
return { normalized, all, suffixIndex };
|
|
200
|
+
});
|
|
20
201
|
// ─── loadResolutionConfig ──────────────────────────────────────────────────
|
|
21
202
|
/**
|
|
22
203
|
* Load and parse `composer.json` from the repo root. Returns a
|
|
@@ -74,11 +255,11 @@ export function resolvePhpImportTarget(parsedImport, workspaceIndex) {
|
|
|
74
255
|
return null;
|
|
75
256
|
if (parsedImport.targetRaw === null || parsedImport.targetRaw === '')
|
|
76
257
|
return null;
|
|
258
|
+
// Cast, not copy: `getPhpWorkspaceIndex` memoizes on this exact Set object.
|
|
77
259
|
const allFiles = ctx.allFilePaths;
|
|
78
|
-
const
|
|
79
|
-
const allFileList = [...allFiles];
|
|
260
|
+
const { normalized, all, suffixIndex } = getPhpWorkspaceIndex(allFiles);
|
|
80
261
|
return resolvePhpImportInternal(parsedImport.targetRaw, null, // composerConfig not available through LanguageProvider path
|
|
81
|
-
allFiles,
|
|
262
|
+
allFiles, normalized, all, suffixIndex);
|
|
82
263
|
}
|
|
83
264
|
/**
|
|
84
265
|
* ScopeResolver-shaped adapter: `(targetRaw, fromFile, allFilePaths, resolutionConfig?) → string | null`.
|
|
@@ -87,14 +268,55 @@ export function resolvePhpImportTarget(parsedImport, workspaceIndex) {
|
|
|
87
268
|
* (a `ComposerConfig | null` loaded once per workspace by
|
|
88
269
|
* `loadPhpComposerConfig`) and threads it into `resolvePhpImportInternal`.
|
|
89
270
|
*/
|
|
90
|
-
export function resolvePhpImportTargetInternal(targetRaw, _fromFile, allFilePaths, resolutionConfig) {
|
|
271
|
+
export function resolvePhpImportTargetInternal(targetRaw, _fromFile, allFilePaths, resolutionConfig, context) {
|
|
91
272
|
if (targetRaw === '')
|
|
92
273
|
return null;
|
|
93
274
|
const composerConfig = resolutionConfig !== undefined && resolutionConfig !== null
|
|
94
275
|
? resolutionConfig
|
|
95
276
|
: null;
|
|
277
|
+
// Cast, not copy: `getPhpWorkspaceIndex` memoizes on this exact Set object.
|
|
96
278
|
const allFiles = allFilePaths;
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
|
|
279
|
+
const { normalized, all, suffixIndex } = getPhpWorkspaceIndex(allFiles);
|
|
280
|
+
const resolved = resolvePhpImportInternal(targetRaw, composerConfig, allFiles, normalized, all, suffixIndex);
|
|
281
|
+
const parsedImport = context?.parsedImport;
|
|
282
|
+
const symbolKind = parsedImport?.kind === 'named' || parsedImport?.kind === 'alias'
|
|
283
|
+
? parsedImport.importedSymbolKind
|
|
284
|
+
: undefined;
|
|
285
|
+
if (context === undefined ||
|
|
286
|
+
parsedImport === undefined ||
|
|
287
|
+
(symbolKind !== 'function' && symbolKind !== 'const')) {
|
|
288
|
+
return resolved;
|
|
289
|
+
}
|
|
290
|
+
const importedName = targetRaw.replace(/\\/g, '/').split('/').filter(Boolean).at(-1);
|
|
291
|
+
if (importedName === undefined)
|
|
292
|
+
return resolved;
|
|
293
|
+
const directories = namespaceDirectories(targetRaw, composerConfig, resolved);
|
|
294
|
+
const directoryIndex = filesByDirectory(context.parsedFiles);
|
|
295
|
+
const candidateFiles = [
|
|
296
|
+
...new Set(directories.flatMap((directory) => {
|
|
297
|
+
const files = directoryIndex.get(normalizePhpPath(directory)) ?? [];
|
|
298
|
+
// A suffix alias can match directories under different roots (for
|
|
299
|
+
// example app/Models and vendor/pkg/app/Models). Picking either root
|
|
300
|
+
// would be a guess, so fail closed to the composer resolution instead.
|
|
301
|
+
const distinctParents = new Set(files.map((file) => parentDirectory(file.filePath)));
|
|
302
|
+
return distinctParents.size > 1 ? [] : files;
|
|
303
|
+
})),
|
|
304
|
+
];
|
|
305
|
+
const expectedType = symbolKind === 'function' ? 'Function' : 'Variable';
|
|
306
|
+
const declaringFiles = candidateFiles.filter((parsed) => parsed.localDefs.some((def) => {
|
|
307
|
+
if (def.type !== expectedType)
|
|
308
|
+
return false;
|
|
309
|
+
const simpleName = (def.qualifiedName ?? '').split(/[\\.]/).at(-1);
|
|
310
|
+
return simpleName === importedName;
|
|
311
|
+
}));
|
|
312
|
+
if (declaringFiles.length > 1)
|
|
313
|
+
return null;
|
|
314
|
+
if (declaringFiles.length === 1)
|
|
315
|
+
return declaringFiles[0].filePath;
|
|
316
|
+
// PHP constants are not currently emitted as local definitions. A single
|
|
317
|
+
// file in the namespace directory is still unambiguous; multiple files must
|
|
318
|
+
// fail closed rather than inheriting Set iteration order.
|
|
319
|
+
if (symbolKind === 'const' && candidateFiles.length === 1)
|
|
320
|
+
return candidateFiles[0].filePath;
|
|
321
|
+
return resolved;
|
|
100
322
|
}
|
|
@@ -16,12 +16,18 @@ export function interpretPhpImport(captures) {
|
|
|
16
16
|
const sourceCap = captures['@import.source'];
|
|
17
17
|
const nameCap = captures['@import.name'];
|
|
18
18
|
const aliasCap = captures['@import.alias'];
|
|
19
|
+
const symbolKindCap = captures['@import.symbol-kind'];
|
|
19
20
|
const kind = kindCap?.text;
|
|
20
21
|
if (kind === undefined || sourceCap === undefined)
|
|
21
22
|
return null;
|
|
22
23
|
const source = sourceCap.text.trim();
|
|
23
24
|
if (source === '')
|
|
24
25
|
return null;
|
|
26
|
+
const importedSymbolKind = symbolKindCap?.text === 'function' || symbolKindCap?.text === 'const'
|
|
27
|
+
? symbolKindCap.text
|
|
28
|
+
: kind === 'function' || kind === 'const'
|
|
29
|
+
? kind
|
|
30
|
+
: 'type';
|
|
25
31
|
switch (kind) {
|
|
26
32
|
case 'namespace': {
|
|
27
33
|
// `use Foo\Bar;` — PHP `use` is a NAMED import (binds the class
|
|
@@ -34,6 +40,7 @@ export function interpretPhpImport(captures) {
|
|
|
34
40
|
localName,
|
|
35
41
|
importedName: localName,
|
|
36
42
|
targetRaw: source,
|
|
43
|
+
importedSymbolKind,
|
|
37
44
|
};
|
|
38
45
|
}
|
|
39
46
|
case 'alias': {
|
|
@@ -50,6 +57,7 @@ export function interpretPhpImport(captures) {
|
|
|
50
57
|
importedName,
|
|
51
58
|
alias,
|
|
52
59
|
targetRaw: source,
|
|
60
|
+
importedSymbolKind,
|
|
53
61
|
};
|
|
54
62
|
}
|
|
55
63
|
case 'function': {
|
|
@@ -61,6 +69,7 @@ export function interpretPhpImport(captures) {
|
|
|
61
69
|
localName,
|
|
62
70
|
importedName: localName,
|
|
63
71
|
targetRaw: source,
|
|
72
|
+
importedSymbolKind,
|
|
64
73
|
};
|
|
65
74
|
}
|
|
66
75
|
case 'const': {
|
|
@@ -71,6 +80,7 @@ export function interpretPhpImport(captures) {
|
|
|
71
80
|
localName,
|
|
72
81
|
importedName: localName,
|
|
73
82
|
targetRaw: source,
|
|
83
|
+
importedSymbolKind,
|
|
74
84
|
};
|
|
75
85
|
}
|
|
76
86
|
default:
|
|
@@ -84,6 +84,23 @@ const PHP_SCOPE_QUERY = `
|
|
|
84
84
|
(function_definition
|
|
85
85
|
name: (name) @declaration.name) @declaration.function
|
|
86
86
|
|
|
87
|
+
;; Closure assigned to a variable: $handler = function () {...}; or fn() => ...;
|
|
88
|
+
;; Anchor discipline (same contract as javascript/query.ts): @declaration.function
|
|
89
|
+
;; sits on the INNER anonymous_function / arrow_function, NOT on the
|
|
90
|
+
;; assignment_expression wrapper. That aligns anchor.range with the
|
|
91
|
+
;; @scope.function range above, so pass2AttachDeclarations attaches the
|
|
92
|
+
;; declaration to the CLOSURE's own scope rather than the enclosing function's.
|
|
93
|
+
;; Without this the closure scope owns no callable def and
|
|
94
|
+
;; pickCallerCallableDef falls through to the enclosing callable, making the
|
|
95
|
+
;; closure a call TARGET but never a call SOURCE (#2699).
|
|
96
|
+
(assignment_expression
|
|
97
|
+
left: (variable_name) @declaration.name
|
|
98
|
+
right: (anonymous_function) @declaration.function)
|
|
99
|
+
|
|
100
|
+
(assignment_expression
|
|
101
|
+
left: (variable_name) @declaration.name
|
|
102
|
+
right: (arrow_function) @declaration.function)
|
|
103
|
+
|
|
87
104
|
;; ── Declarations — properties ─────────────────────────────────────────────
|
|
88
105
|
|
|
89
106
|
;; PHP 7.4+ typed property: private UserRepo $repo;
|
|
@@ -104,6 +121,20 @@ const PHP_SCOPE_QUERY = `
|
|
|
104
121
|
(property_element
|
|
105
122
|
name: (variable_name) @declaration.name)) @declaration.variable
|
|
106
123
|
|
|
124
|
+
;; ── Declarations — closure bindings (#2693) ───────────────────────────────
|
|
125
|
+
;; A dollar-name bound to a closure (fn(x) => x, or function(x){...}) IS a
|
|
126
|
+
;; callable. PHP emitted the callable-flow seed and invoke for it already, but
|
|
127
|
+
;; nothing DECLARED the name, so the flow pass had no SymbolDefinition to attach
|
|
128
|
+
;; the seed to and the call stayed unresolved.
|
|
129
|
+
;; Restricted to a closure value: declaring every PHP assignment would mint defs
|
|
130
|
+
;; repo-wide for no resolution benefit.
|
|
131
|
+
(assignment_expression
|
|
132
|
+
left: (variable_name (name) @declaration.name)
|
|
133
|
+
right: (arrow_function)) @declaration.variable
|
|
134
|
+
(assignment_expression
|
|
135
|
+
left: (variable_name (name) @declaration.name)
|
|
136
|
+
right: (anonymous_function)) @declaration.variable
|
|
137
|
+
|
|
107
138
|
;; ── Imports — namespace_use_declaration ───────────────────────────────────
|
|
108
139
|
;;
|
|
109
140
|
;; Captures ALL forms: plain, alias, function/const qualifiers, and grouped.
|
|
@@ -308,7 +308,7 @@ const phpScopeResolver = {
|
|
|
308
308
|
language: SupportedLanguages.PHP,
|
|
309
309
|
languageProvider: phpProvider,
|
|
310
310
|
importEdgeReason: 'php-scope: use',
|
|
311
|
-
resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig) => resolvePhpImportTargetInternal(targetRaw, fromFile, allFilePaths, resolutionConfig),
|
|
311
|
+
resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig, context) => resolvePhpImportTargetInternal(targetRaw, fromFile, allFilePaths, resolutionConfig, context),
|
|
312
312
|
loadResolutionConfig: (repoPath) => loadPhpComposerConfig(repoPath),
|
|
313
313
|
// PHP LEGB-like precedence: local > import/namespace/reexport > wildcard.
|
|
314
314
|
// The per-scope id is unused by phpMergeBindings (tier ordering computed
|
|
@@ -19,6 +19,7 @@ interface PythonArityMetadata {
|
|
|
19
19
|
readonly parameterCount: number | undefined;
|
|
20
20
|
readonly requiredParameterCount: number | undefined;
|
|
21
21
|
readonly parameterTypes: readonly string[] | undefined;
|
|
22
|
+
readonly parameterNames: readonly string[];
|
|
22
23
|
}
|
|
23
24
|
export declare function computePythonArityMetadata(fnNode: SyntaxNode): PythonArityMetadata;
|
|
24
25
|
export {};
|
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
* 1. **Per-name import statements** — `import a, b` and
|
|
9
9
|
* `from m import x, y` decompose to one match per imported name
|
|
10
10
|
* (see `import-decomposer.ts`).
|
|
11
|
-
* 2. **Receiver type bindings** —
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* receiver (see `receiver-binding.ts`).
|
|
11
|
+
* 2. **Receiver type bindings** — methods emit an implicit `self` / `cls`
|
|
12
|
+
* binding, and `__init__` assignments from annotated parameters emit
|
|
13
|
+
* class-scoped instance-field bindings (see `receiver-binding.ts`).
|
|
15
14
|
*
|
|
16
15
|
* Pure given the input source text. No I/O, no globals consulted.
|
|
17
16
|
*/
|
|
@@ -8,23 +8,41 @@
|
|
|
8
8
|
* 1. **Per-name import statements** — `import a, b` and
|
|
9
9
|
* `from m import x, y` decompose to one match per imported name
|
|
10
10
|
* (see `import-decomposer.ts`).
|
|
11
|
-
* 2. **Receiver type bindings** —
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* receiver (see `receiver-binding.ts`).
|
|
11
|
+
* 2. **Receiver type bindings** — methods emit an implicit `self` / `cls`
|
|
12
|
+
* binding, and `__init__` assignments from annotated parameters emit
|
|
13
|
+
* class-scoped instance-field bindings (see `receiver-binding.ts`).
|
|
15
14
|
*
|
|
16
15
|
* Pure given the input source text. No I/O, no globals consulted.
|
|
17
16
|
*/
|
|
18
17
|
import { nodeToCapture, syntheticCapture, walkNamedTree, } from '../../utils/ast-helpers.js';
|
|
19
18
|
import { splitImportStatement } from './import-decomposer.js';
|
|
20
19
|
import { getPythonParser, getPythonScopeQuery } from './query.js';
|
|
21
|
-
import { synthesizeReceiverTypeBinding } from './receiver-binding.js';
|
|
20
|
+
import { synthesizeConstructorFieldTypeBindings, synthesizeReceiverTypeBinding, } from './receiver-binding.js';
|
|
22
21
|
import { synthesizeDependsReferences } from './depends-references.js';
|
|
23
22
|
import { computePythonArityMetadata } from './arity-metadata.js';
|
|
24
23
|
import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
|
|
25
24
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
26
25
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
27
26
|
import { pythonFunctionDefinitionLabel } from './simple-hooks.js';
|
|
27
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
28
|
+
import { synthesizeReceiverChainCapture } from '../../utils/receiver-chain-captures.js';
|
|
29
|
+
const PYTHON_CALLABLE_CAPTURE_OPTIONS = {
|
|
30
|
+
functionNodeTypes: new Set(['function_definition', 'lambda']),
|
|
31
|
+
callNodeTypes: new Set(['call']),
|
|
32
|
+
parameterListNodeTypes: new Set(['parameters', 'argument_list']),
|
|
33
|
+
parameterNodeTypes: new Set([
|
|
34
|
+
'identifier',
|
|
35
|
+
'default_parameter',
|
|
36
|
+
'typed_parameter',
|
|
37
|
+
'typed_default_parameter',
|
|
38
|
+
'list_splat_pattern',
|
|
39
|
+
'dictionary_splat_pattern',
|
|
40
|
+
]),
|
|
41
|
+
bindingNodeTypes: new Set(['assignment', 'named_expression']),
|
|
42
|
+
assignmentNodeTypes: new Set(['assignment', 'named_expression']),
|
|
43
|
+
identifierNodeTypes: new Set(['identifier']),
|
|
44
|
+
functionScopedValueBindings: true,
|
|
45
|
+
};
|
|
28
46
|
export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
29
47
|
// Skip the parse when the caller (the scope-resolution orchestrator's
|
|
30
48
|
// `treeCache`) already produced a Tree for this source — empty under
|
|
@@ -89,11 +107,23 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
89
107
|
}
|
|
90
108
|
else {
|
|
91
109
|
// Defensive fallback: emit the raw match.
|
|
110
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
111
|
+
// expression, so resolution can type it by folding over structure
|
|
112
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
113
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
114
|
+
// all leave `grouped` untouched.
|
|
115
|
+
synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
|
|
92
116
|
out.push(grouped);
|
|
93
117
|
}
|
|
94
118
|
continue;
|
|
95
119
|
}
|
|
96
120
|
if (grouped['@scope.function'] !== undefined) {
|
|
121
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
122
|
+
// expression, so resolution can type it by folding over structure
|
|
123
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
124
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
125
|
+
// all leave `grouped` untouched.
|
|
126
|
+
synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
|
|
97
127
|
out.push(grouped);
|
|
98
128
|
// `@scope.function` is captured directly on the `function_definition`
|
|
99
129
|
// node (query: `(function_definition) @scope.function`), so it IS the
|
|
@@ -101,9 +131,14 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
101
131
|
const scopeNode = nodeMap['@scope.function'];
|
|
102
132
|
const fnNode = scopeNode.type === 'function_definition' ? scopeNode : null;
|
|
103
133
|
if (fnNode !== null) {
|
|
134
|
+
const parameterNames = computePythonArityMetadata(fnNode).parameterNames;
|
|
135
|
+
if (parameterNames.length > 0) {
|
|
136
|
+
grouped['@scope.lexical-names'] = syntheticCapture('@scope.lexical-names', fnNode, JSON.stringify(parameterNames));
|
|
137
|
+
}
|
|
104
138
|
const synth = synthesizeReceiverTypeBinding(fnNode);
|
|
105
139
|
if (synth !== null)
|
|
106
140
|
out.push(synth);
|
|
141
|
+
out.push(...synthesizeConstructorFieldTypeBindings(fnNode));
|
|
107
142
|
for (const depRef of synthesizeDependsReferences(fnNode))
|
|
108
143
|
out.push(depRef);
|
|
109
144
|
}
|
|
@@ -139,12 +174,25 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
139
174
|
grouped['@declaration.parameter-types'] = syntheticCapture('@declaration.parameter-types', fnNode, JSON.stringify(arity.parameterTypes));
|
|
140
175
|
}
|
|
141
176
|
}
|
|
177
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
178
|
+
// expression, so resolution can type it by folding over structure
|
|
179
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
180
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
181
|
+
// all leave `grouped` untouched.
|
|
182
|
+
synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
|
|
142
183
|
out.push(grouped);
|
|
143
184
|
continue;
|
|
144
185
|
}
|
|
186
|
+
// Structural receiver chain for a call whose receiver is itself an
|
|
187
|
+
// expression, so resolution can type it by folding over structure
|
|
188
|
+
// instead of re-parsing the receiver's source text. Self-gating: a
|
|
189
|
+
// non-call match, an absent receiver, or a chain with no nameable base
|
|
190
|
+
// all leave `grouped` untouched.
|
|
191
|
+
synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
|
|
145
192
|
out.push(grouped);
|
|
146
193
|
}
|
|
147
194
|
out.push(...synthesizePythonInheritanceReferences(tree.rootNode));
|
|
195
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, PYTHON_CALLABLE_CAPTURE_OPTIONS));
|
|
148
196
|
return out;
|
|
149
197
|
}
|
|
150
198
|
/**
|
|
@@ -10,7 +10,18 @@
|
|
|
10
10
|
* carry everything `interpretPythonImport` needs to recover the original
|
|
11
11
|
* `ParsedImport` shape — see `interpret.ts`.
|
|
12
12
|
*/
|
|
13
|
-
import { findChild, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
|
|
13
|
+
import { findAncestorBeforeBoundary, findChild, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
|
|
14
|
+
/**
|
|
15
|
+
* The only two constructs that stop a module-level `from m import x` from
|
|
16
|
+
* publishing `x` as `<module>.x`. Python has no block scope, so an import
|
|
17
|
+
* under `if` / `try` / `for` / `with` still publishes when its branch runs —
|
|
18
|
+
* verified against CPython 3.11; only `def` and `class` bodies suppress it.
|
|
19
|
+
*/
|
|
20
|
+
const PUBLICATION_SUPPRESSING_ANCESTORS = new Set([
|
|
21
|
+
'function_definition',
|
|
22
|
+
'class_definition',
|
|
23
|
+
]);
|
|
24
|
+
const NO_BOUNDARY = new Set();
|
|
14
25
|
export function splitImportStatement(stmtNode) {
|
|
15
26
|
if (stmtNode.type === 'import_statement')
|
|
16
27
|
return splitImportStmt(stmtNode);
|
|
@@ -54,6 +65,8 @@ function splitImportFromStmt(stmtNode) {
|
|
|
54
65
|
const out = [];
|
|
55
66
|
const moduleField = stmtNode.childForFieldName('module_name');
|
|
56
67
|
const moduleText = moduleField?.text ?? '';
|
|
68
|
+
// Once per statement, not once per name.
|
|
69
|
+
const publishesToModule = findAncestorBeforeBoundary(stmtNode, PUBLICATION_SUPPRESSING_ANCESTORS, NO_BOUNDARY) === null;
|
|
57
70
|
// Wildcard? tree-sitter-python represents `*` as a `wildcard_import`
|
|
58
71
|
// child and emits no name children.
|
|
59
72
|
const wildcardChild = findChild(stmtNode, 'wildcard_import');
|
|
@@ -79,6 +92,7 @@ function splitImportFromStmt(stmtNode) {
|
|
|
79
92
|
source: moduleText,
|
|
80
93
|
name: child.text,
|
|
81
94
|
atNode: child,
|
|
95
|
+
publishesToModule,
|
|
82
96
|
}));
|
|
83
97
|
}
|
|
84
98
|
else if (child.type === 'aliased_import') {
|
|
@@ -91,6 +105,7 @@ function splitImportFromStmt(stmtNode) {
|
|
|
91
105
|
name: dotted.text,
|
|
92
106
|
alias: alias.text,
|
|
93
107
|
atNode: child,
|
|
108
|
+
publishesToModule,
|
|
94
109
|
}));
|
|
95
110
|
}
|
|
96
111
|
}
|
|
@@ -108,5 +123,11 @@ function buildImportMatch(stmtNode, spec) {
|
|
|
108
123
|
if (spec.alias !== undefined) {
|
|
109
124
|
m['@import.alias'] = syntheticCapture('@import.alias', spec.atNode, spec.alias);
|
|
110
125
|
}
|
|
126
|
+
// Anchored at `spec.atNode`, never `stmtNode`: `anchorCaptureFor` picks the
|
|
127
|
+
// broadest span with a strict `>`, so a statement-wide span here would tie
|
|
128
|
+
// with `@import.statement` and let key order decide the anchor.
|
|
129
|
+
if (spec.publishesToModule === true) {
|
|
130
|
+
m['@import.publishes'] = syntheticCapture('@import.publishes', spec.atNode, 'module');
|
|
131
|
+
}
|
|
111
132
|
return m;
|
|
112
133
|
}
|
|
@@ -9,12 +9,53 @@
|
|
|
9
9
|
* Returning `null` lets the finalize algorithm mark the edge as
|
|
10
10
|
* `linkStatus: 'unresolved'`.
|
|
11
11
|
*/
|
|
12
|
-
import type { ParsedImport, WorkspaceIndex } from '../../../../_shared/index.js';
|
|
12
|
+
import type { ParsedFile, ParsedImport, WorkspaceIndex } from '../../../../_shared/index.js';
|
|
13
13
|
export interface PythonResolveContext {
|
|
14
14
|
readonly fromFile: string;
|
|
15
15
|
/** `ReadonlySet` so the orchestrator's stable run-level set flows straight
|
|
16
16
|
* through to `getPythonFileIndex`'s `WeakMap` key (built once per run, not
|
|
17
17
|
* copied per import). The whole resolver chain only reads the set. */
|
|
18
18
|
readonly allFilePaths: ReadonlySet<string>;
|
|
19
|
+
/** Optional parsed workspace used to preserve a package's explicit export
|
|
20
|
+
* when it collides with a same-named concrete submodule. */
|
|
21
|
+
readonly parsedFiles?: readonly ParsedFile[];
|
|
19
22
|
}
|
|
20
23
|
export declare function resolvePythonImportTarget(parsedImport: ParsedImport, workspaceIndex: WorkspaceIndex): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* A named Python import is a namespace handle only when its resolved file is
|
|
26
|
+
* the concrete submodule formed by appending the imported name. This keeps
|
|
27
|
+
* ordinary symbol imports on the named-binding path.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isPythonImportedModule(parsedImport: ParsedImport, targetFile: string, fromFile: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The receiver spellings `import a.b.c` makes callable, and the file each one
|
|
32
|
+
* names (#2826).
|
|
33
|
+
*
|
|
34
|
+
* `import a.b.c` binds ONE name — `a` — but makes three attribute paths
|
|
35
|
+
* reachable, and they name three different files:
|
|
36
|
+
*
|
|
37
|
+
* a → a/__init__.py
|
|
38
|
+
* a.b → a/b/__init__.py
|
|
39
|
+
* a.b.c → a/b/c.py (the edge's own target)
|
|
40
|
+
*
|
|
41
|
+
* The shared default keyed `a` to the LEAF, which is wrong in both directions:
|
|
42
|
+
* `a.helper()` resolved into `a/b/c.py` whenever that module happened to export
|
|
43
|
+
* `helper`, and `a.b.mid()` resolved to nothing.
|
|
44
|
+
*
|
|
45
|
+
* Returns `undefined` — meaning "use the shared default" — for every spelling
|
|
46
|
+
* where the bound name is not the path's root:
|
|
47
|
+
* - `import single` — no dotted path to expand;
|
|
48
|
+
* - `import a.b as x` — binds only `x`; writing `a.b.f()` there is a
|
|
49
|
+
* NameError, so `a.b` must NOT become a key;
|
|
50
|
+
* - `from pkg import db` — reclassified to a namespace edge whose
|
|
51
|
+
* importPath is the bare name `db`.
|
|
52
|
+
*
|
|
53
|
+
* Prefix files are proposed, not asserted: `moduleFileExists` drops any that
|
|
54
|
+
* the workspace did not parse, so a PEP-420 namespace package (no
|
|
55
|
+
* `__init__.py`) contributes no key rather than one pointing at a missing file.
|
|
56
|
+
*/
|
|
57
|
+
export declare function pythonNamespaceReceiverPaths(edge: {
|
|
58
|
+
readonly localName: string;
|
|
59
|
+
readonly importPath: string;
|
|
60
|
+
readonly targetFile: string;
|
|
61
|
+
}, moduleFileExists: (filePath: string) => boolean): readonly (readonly [string, string])[] | undefined;
|