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
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one per-file-set index behind Python import resolution, plus the two
|
|
3
|
+
* importer-chain memos that ride inside it.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this is its own module
|
|
6
|
+
*
|
|
7
|
+
* Everything here is derived from `allFilePaths` and nothing here is specific
|
|
8
|
+
* to either CALLER, and there are two of them on opposite sides of a layer
|
|
9
|
+
* boundary: `import-resolvers/python.ts` resolves the single-segment bare tier
|
|
10
|
+
* and `languages/python/import-target.ts` resolves the dotted tiers. The second
|
|
11
|
+
* imports the first, so the index could not live in either without the other
|
|
12
|
+
* reaching back through a cycle — it used to live in `import-target.ts`, which
|
|
13
|
+
* is why the bare tier had no O(1) proof of absence and probed the whole
|
|
14
|
+
* ancestor chain for every `import os`.
|
|
15
|
+
*
|
|
16
|
+
* The shape is the one `workspace-file-index.ts` and `package-dir-index.ts`
|
|
17
|
+
* already use in this directory: an interface, one `perFileSet` builder, and
|
|
18
|
+
* query functions taking the index.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The importer's ancestor directories, CLOSEST FIRST and excluding the
|
|
22
|
+
* workspace root — `["backend/routers", "backend"]` for `backend/routers/x.py`
|
|
23
|
+
* — memoized per importer DIRECTORY for the lifetime of the pass.
|
|
24
|
+
*
|
|
25
|
+
* This is the #2913 fix. Both consumers used to rebuild the chain inline, one
|
|
26
|
+
* `dirParts.slice(0, i).join('/')` per component, on EVERY import: a per-import
|
|
27
|
+
* cost proportional to the importer's path depth, and quadratic in characters,
|
|
28
|
+
* on a file index that is itself depth-free. Real Python layouts are deep
|
|
29
|
+
* (`src/pkg/sub/feature/impl/mod.py` is ordinary), so the resolver was 6.8x
|
|
30
|
+
* slower on a deep corpus than on a shallow one holding the file count fixed,
|
|
31
|
+
* where every other language sat between 1.0x and 3.4x.
|
|
32
|
+
*
|
|
33
|
+
* A directory's ancestors are a pure function of the directory, and a pass
|
|
34
|
+
* resolves many imports per file, so one entry serves every import issued from
|
|
35
|
+
* anywhere in that directory.
|
|
36
|
+
*
|
|
37
|
+
* ## Lifetime and memory
|
|
38
|
+
*
|
|
39
|
+
* The Map lives INSIDE the per-file-set index, so it is reclaimed with the file
|
|
40
|
+
* set it was reached through (`perFileSet` is a `WeakMap`): it cannot leak
|
|
41
|
+
* across passes or repos, and there is no invalidation rule to get wrong. It is
|
|
42
|
+
* filled lazily, so it holds one entry per directory that actually ISSUES a
|
|
43
|
+
* Python import, never one per file and never one per directory in the repo —
|
|
44
|
+
* the bound #2649 (kernel-scale OOM) asks for. Each entry's strings are
|
|
45
|
+
* `slice`s of the longest one, so a chain costs pointers rather than a copy of
|
|
46
|
+
* the path per component.
|
|
47
|
+
*
|
|
48
|
+
* The derived key is the importer's directory exactly as the old inline code
|
|
49
|
+
* computed it — `norm.split('/').slice(0, -1).join('/')`, which for a path
|
|
50
|
+
* without a separator is `''` (a root-level importer, whose chain is empty).
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* The importer's own directory, normalized — the key BOTH per-directory memos
|
|
54
|
+
* below are stored under.
|
|
55
|
+
*
|
|
56
|
+
* One exported derivation rather than one per accessor: the two memos live in
|
|
57
|
+
* the same index and must agree on what "the importer's directory" is, and a
|
|
58
|
+
* caller that already holds the directory (the bare-import tier computes it for
|
|
59
|
+
* its own proximity check) should not pay for it twice. It was three copies of
|
|
60
|
+
* `replace / lastIndexOf / slice` across two modules before, byte-identical by
|
|
61
|
+
* inspection and by nothing else.
|
|
62
|
+
*/
|
|
63
|
+
export declare function importerDirOf(fromFile: string): string;
|
|
64
|
+
export declare function importerAncestors(index: PythonFileIndex, importerDir: string): readonly string[];
|
|
65
|
+
/**
|
|
66
|
+
* Per-file-set index for Python import resolution, memoized on the
|
|
67
|
+
* `allFilePaths` Set object (the same Set is passed for every import in a run,
|
|
68
|
+
* so the index is built once and reused). Replaces the per-import O(files)
|
|
69
|
+
* scans in `resolveAbsoluteFromFiles` (suffix match) and `hasRepoCandidate`
|
|
70
|
+
* (package-existence gate) with O(1)/O(bucket) lookups.
|
|
71
|
+
*
|
|
72
|
+
* - `normSet`: every file path, normalized to forward slashes (for the exact
|
|
73
|
+
* `f === rootFile|initFile` membership checks). It IS derivable from the two
|
|
74
|
+
* buckets below — both probes could be a `.some(c => c.norm === …)` over
|
|
75
|
+
* `byBasename.get(rootFile)` / `byInitParent.get(initFile)` — and it is kept
|
|
76
|
+
* anyway, deliberately. `byBasename` is keyed on the BASENAME, so its bucket
|
|
77
|
+
* for a common Python file name is not small and grows with the repo: on a
|
|
78
|
+
* 9 000-file service tree, `utils.py`, `models.py` and `views.py` hold 1 000
|
|
79
|
+
* entries each. `import utils` would then scan every `utils.py` in the
|
|
80
|
+
* workspace on every import — a per-import cost proportional to corpus size,
|
|
81
|
+
* which is the exact defect class #2901/#2902/#2908 removed. The Set trades
|
|
82
|
+
* ~1.6 MB at 32 000 files, against a 6.4 MB reading, to keep both probes
|
|
83
|
+
* O(1). Do not "simplify" it away without re-measuring that bucket.
|
|
84
|
+
* - `byBasename`: last path component (e.g. `models.py`, `__init__.py`) ->
|
|
85
|
+
* all `{ raw, norm }` candidates, so suffix matches can be gathered from the
|
|
86
|
+
* relevant bucket and the exact tie-break applied across ALL of them.
|
|
87
|
+
* - `byInitParent`: `__init__.py` files keyed by their last TWO components
|
|
88
|
+
* (`<parentDir>/__init__.py`). The package suffix lookup (`pkg.sub` ->
|
|
89
|
+
* `…/sub/__init__.py`) targets only same-named package dirs via this map
|
|
90
|
+
* instead of scanning every `__init__.py` in the repo — the common
|
|
91
|
+
* multi-segment import path no longer scales with package count
|
|
92
|
+
* (PR #1918 review P2b). `__init__.py` files stay in `byBasename` too, for
|
|
93
|
+
* the rarer explicit `pkg.__init__` import that resolves via the module
|
|
94
|
+
* (`…<lastSeg>.py`) lookup.
|
|
95
|
+
* - `dirPrefixes`: every directory prefix of a `.py` file, trailing-slashed
|
|
96
|
+
* (`a/b/c.py` -> `a/`, `a/b/`), for "is there a .py file under `<dir>/`".
|
|
97
|
+
* - `nestedDirNames`: the NAME of every such directory that has a non-empty
|
|
98
|
+
* parent (`a/b/c.py` -> `b`, not `a`), which is exactly the set of segments
|
|
99
|
+
* `hasRepoCandidate`'s ancestor walk can ever match — so a segment absent
|
|
100
|
+
* from it settles the walk in one lookup (#2913).
|
|
101
|
+
* - `ancestorsByDir`: the per-importer-directory ancestor-chain memo behind
|
|
102
|
+
* `importerAncestors`. The one structure here that is NOT derived from the
|
|
103
|
+
* file set: it is filled lazily, from the importer paths the pass actually
|
|
104
|
+
* resolves against, and lives here so it dies with the pass.
|
|
105
|
+
* - `bareImportPrefixesByDir`: the same idea for the OTHER chain — the
|
|
106
|
+
* sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
|
|
107
|
+
* walk probes. A different sequence, not a different spelling: see
|
|
108
|
+
* `importerBarePrefixes`. Two memos in one index rather than two indexes,
|
|
109
|
+
* because they are keyed on the same thing and must die together.
|
|
110
|
+
*
|
|
111
|
+
* Exported for `test/unit/scope-resolution/python/python-importer-ancestors.test.ts`
|
|
112
|
+
* and `test/unit/import-resolvers/python-importer-prefixes.test.ts`, which read
|
|
113
|
+
* the two memos after driving the production adapters. No counter ships for
|
|
114
|
+
* either — the Map IS the memo, and its SIZE is the assertion: one entry per
|
|
115
|
+
* importer directory, however many imports were resolved. Everything else about
|
|
116
|
+
* the index stays internal.
|
|
117
|
+
*/
|
|
118
|
+
export interface PythonFileIndex {
|
|
119
|
+
readonly normSet: Set<string>;
|
|
120
|
+
readonly byBasename: Map<string, {
|
|
121
|
+
raw: string;
|
|
122
|
+
norm: string;
|
|
123
|
+
}[]>;
|
|
124
|
+
readonly byInitParent: Map<string, {
|
|
125
|
+
raw: string;
|
|
126
|
+
norm: string;
|
|
127
|
+
}[]>;
|
|
128
|
+
readonly dirPrefixes: Set<string>;
|
|
129
|
+
readonly nestedDirNames: Set<string>;
|
|
130
|
+
readonly ancestorsByDir: Map<string, readonly string[]>;
|
|
131
|
+
readonly bareImportPrefixesByDir: Map<string, readonly string[]>;
|
|
132
|
+
}
|
|
133
|
+
export declare const getPythonFileIndex: (key: ReadonlySet<string>) => PythonFileIndex;
|
|
134
|
+
/**
|
|
135
|
+
* The sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
|
|
136
|
+
* bare-import walk probes, in order, for an importer sitting in `importerDir` —
|
|
137
|
+
* memoized per DIRECTORY for the lifetime of the pass, in the same index and
|
|
138
|
+
* for the same reasons as `importerAncestors`.
|
|
139
|
+
*
|
|
140
|
+
* ## Why this is not `ancestorsByDir`
|
|
141
|
+
*
|
|
142
|
+
* A DIFFERENT SEQUENCE, not a different spelling. For `backend/routers/cron.py`:
|
|
143
|
+
*
|
|
144
|
+
* importerAncestors ["backend/routers", "backend"]
|
|
145
|
+
* importerBarePrefixes ["backend/", ""]
|
|
146
|
+
*
|
|
147
|
+
* Three differences, each load-bearing:
|
|
148
|
+
*
|
|
149
|
+
* 1. `importerAncestors` opens with the importer's OWN directory; this walk
|
|
150
|
+
* does not, because its proximity check has already probed that directory.
|
|
151
|
+
* 2. This walk ENDS at the workspace root (`""`, which probes `<module>.py`
|
|
152
|
+
* unprefixed); `importerAncestors` stops short of it, because
|
|
153
|
+
* `resolveAbsoluteFromFiles` probes the root before its walk instead.
|
|
154
|
+
* 3. `importerAncestors` drops empty components (`filter(Boolean)`); this walk
|
|
155
|
+
* keeps them, and the difference decides real resolutions — for
|
|
156
|
+
* `/abs/a/b/mod.py` this walk probes `/abs/a/`, `/abs/`, `""`, `""` where a
|
|
157
|
+
* filtered chain would probe `abs/a/b/`, `abs/a/`, `abs/`, none of which is
|
|
158
|
+
* a prefix of any file in an absolute-path workspace.
|
|
159
|
+
*
|
|
160
|
+
* So the two cannot share one chain without changing which files resolve. They
|
|
161
|
+
* do share the index, the key and the lifetime, which is what actually matters
|
|
162
|
+
* for #2649: both are filled lazily, hold one entry per directory that ISSUES
|
|
163
|
+
* an import, and die with the pass because the index does.
|
|
164
|
+
*/
|
|
165
|
+
export declare function importerBarePrefixes(index: PythonFileIndex, importerDir: string): readonly string[];
|
|
166
|
+
/**
|
|
167
|
+
* "No file anywhere in the workspace can be `<X>/<segment>.py` or
|
|
168
|
+
* `<X>/<segment>/__init__.py`, for ANY prefix `<X>`" — in two Map lookups.
|
|
169
|
+
*
|
|
170
|
+
* This is a PROOF OF ABSENCE, not a heuristic filter, and it is what lets the
|
|
171
|
+
* single-segment bare walk skip itself entirely. Both shapes it rules out are
|
|
172
|
+
* the only two shapes that walk probes: a probe `${prefix}${segment}.py` that
|
|
173
|
+
* is a member of the file set is a path with no backslash (the prefix comes
|
|
174
|
+
* from a normalized importer and the guard below rejects a segment carrying
|
|
175
|
+
* one), so it equals its own normalized form and its basename is exactly
|
|
176
|
+
* `${segment}.py` — which puts it in `byBasename`. A probe
|
|
177
|
+
* `${prefix}${segment}/__init__.py` that is a member likewise has parent
|
|
178
|
+
* directory name exactly `segment`, non-empty, which puts it in `byInitParent`
|
|
179
|
+
* whether or not `prefix` is empty. So a miss in both buckets means every probe
|
|
180
|
+
* the walk would issue is guaranteed to miss.
|
|
181
|
+
*
|
|
182
|
+
* Two inputs cannot be proven absent and get `false` — walk as before:
|
|
183
|
+
*
|
|
184
|
+
* - the EMPTY segment (a target spelled with a trailing dot).
|
|
185
|
+
* `byInitParent` skips `__init__.py` files whose parent directory name is
|
|
186
|
+
* empty, so its absence proves nothing. Same carve-out
|
|
187
|
+
* `resolveAbsoluteFromFiles` makes for `lastSeg === ''`.
|
|
188
|
+
* - a segment containing a BACKSLASH. The buckets are keyed on normalized
|
|
189
|
+
* paths, so a raw `a\b.py` is filed under basename `b.py`; a probe for the
|
|
190
|
+
* segment `a\b` would look up `a\b.py`, miss, and wrongly conclude absence
|
|
191
|
+
* while `allFilePaths.has('a\\b.py')` is true. Not reachable from a Python
|
|
192
|
+
* import statement, but this function is a proof and a proof has no
|
|
193
|
+
* unstated preconditions.
|
|
194
|
+
*
|
|
195
|
+
* The dotted tier in `languages/python/import-target.ts` asks the same question
|
|
196
|
+
* of the same two buckets and is deliberately NOT routed through here: it needs
|
|
197
|
+
* the candidate ARRAYS for its suffix fallback, so it does the two `get`s it
|
|
198
|
+
* already needs and derives the answer, rather than paying two extra `has`
|
|
199
|
+
* lookups per import to share four lines.
|
|
200
|
+
*/
|
|
201
|
+
export declare function pythonSegmentAbsent(index: PythonFileIndex, segment: string): boolean;
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one per-file-set index behind Python import resolution, plus the two
|
|
3
|
+
* importer-chain memos that ride inside it.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this is its own module
|
|
6
|
+
*
|
|
7
|
+
* Everything here is derived from `allFilePaths` and nothing here is specific
|
|
8
|
+
* to either CALLER, and there are two of them on opposite sides of a layer
|
|
9
|
+
* boundary: `import-resolvers/python.ts` resolves the single-segment bare tier
|
|
10
|
+
* and `languages/python/import-target.ts` resolves the dotted tiers. The second
|
|
11
|
+
* imports the first, so the index could not live in either without the other
|
|
12
|
+
* reaching back through a cycle — it used to live in `import-target.ts`, which
|
|
13
|
+
* is why the bare tier had no O(1) proof of absence and probed the whole
|
|
14
|
+
* ancestor chain for every `import os`.
|
|
15
|
+
*
|
|
16
|
+
* The shape is the one `workspace-file-index.ts` and `package-dir-index.ts`
|
|
17
|
+
* already use in this directory: an interface, one `perFileSet` builder, and
|
|
18
|
+
* query functions taking the index.
|
|
19
|
+
*/
|
|
20
|
+
import { perFileSet } from './per-file-set.js';
|
|
21
|
+
/**
|
|
22
|
+
* The importer's ancestor directories, CLOSEST FIRST and excluding the
|
|
23
|
+
* workspace root — `["backend/routers", "backend"]` for `backend/routers/x.py`
|
|
24
|
+
* — memoized per importer DIRECTORY for the lifetime of the pass.
|
|
25
|
+
*
|
|
26
|
+
* This is the #2913 fix. Both consumers used to rebuild the chain inline, one
|
|
27
|
+
* `dirParts.slice(0, i).join('/')` per component, on EVERY import: a per-import
|
|
28
|
+
* cost proportional to the importer's path depth, and quadratic in characters,
|
|
29
|
+
* on a file index that is itself depth-free. Real Python layouts are deep
|
|
30
|
+
* (`src/pkg/sub/feature/impl/mod.py` is ordinary), so the resolver was 6.8x
|
|
31
|
+
* slower on a deep corpus than on a shallow one holding the file count fixed,
|
|
32
|
+
* where every other language sat between 1.0x and 3.4x.
|
|
33
|
+
*
|
|
34
|
+
* A directory's ancestors are a pure function of the directory, and a pass
|
|
35
|
+
* resolves many imports per file, so one entry serves every import issued from
|
|
36
|
+
* anywhere in that directory.
|
|
37
|
+
*
|
|
38
|
+
* ## Lifetime and memory
|
|
39
|
+
*
|
|
40
|
+
* The Map lives INSIDE the per-file-set index, so it is reclaimed with the file
|
|
41
|
+
* set it was reached through (`perFileSet` is a `WeakMap`): it cannot leak
|
|
42
|
+
* across passes or repos, and there is no invalidation rule to get wrong. It is
|
|
43
|
+
* filled lazily, so it holds one entry per directory that actually ISSUES a
|
|
44
|
+
* Python import, never one per file and never one per directory in the repo —
|
|
45
|
+
* the bound #2649 (kernel-scale OOM) asks for. Each entry's strings are
|
|
46
|
+
* `slice`s of the longest one, so a chain costs pointers rather than a copy of
|
|
47
|
+
* the path per component.
|
|
48
|
+
*
|
|
49
|
+
* The derived key is the importer's directory exactly as the old inline code
|
|
50
|
+
* computed it — `norm.split('/').slice(0, -1).join('/')`, which for a path
|
|
51
|
+
* without a separator is `''` (a root-level importer, whose chain is empty).
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* The importer's own directory, normalized — the key BOTH per-directory memos
|
|
55
|
+
* below are stored under.
|
|
56
|
+
*
|
|
57
|
+
* One exported derivation rather than one per accessor: the two memos live in
|
|
58
|
+
* the same index and must agree on what "the importer's directory" is, and a
|
|
59
|
+
* caller that already holds the directory (the bare-import tier computes it for
|
|
60
|
+
* its own proximity check) should not pay for it twice. It was three copies of
|
|
61
|
+
* `replace / lastIndexOf / slice` across two modules before, byte-identical by
|
|
62
|
+
* inspection and by nothing else.
|
|
63
|
+
*/
|
|
64
|
+
export function importerDirOf(fromFile) {
|
|
65
|
+
const norm = fromFile.replace(/\\/g, '/');
|
|
66
|
+
const lastSlash = norm.lastIndexOf('/');
|
|
67
|
+
return lastSlash === -1 ? '' : norm.slice(0, lastSlash);
|
|
68
|
+
}
|
|
69
|
+
export function importerAncestors(index, importerDir) {
|
|
70
|
+
const memoized = index.ancestorsByDir.get(importerDir);
|
|
71
|
+
if (memoized !== undefined)
|
|
72
|
+
return memoized;
|
|
73
|
+
const built = buildImporterAncestors(importerDir);
|
|
74
|
+
index.ancestorsByDir.set(importerDir, built);
|
|
75
|
+
return built;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* `["a/b/c", "a/b", "a"]` for `a/b/c`. Empty components are dropped first, so
|
|
79
|
+
* an absolute `/a/b` yields `["a/b", "a"]` — matching the `filter(Boolean)` the
|
|
80
|
+
* two inline walks did, and with it the absolute-path gating pinned by
|
|
81
|
+
* `python-import-target-parity.test.ts` (PR #1918 review P3a).
|
|
82
|
+
*/
|
|
83
|
+
function buildImporterAncestors(importerDir) {
|
|
84
|
+
const chain = [];
|
|
85
|
+
const parts = importerDir.split('/').filter(Boolean);
|
|
86
|
+
if (parts.length === 0)
|
|
87
|
+
return chain;
|
|
88
|
+
chain.push(parts.join('/'));
|
|
89
|
+
for (let i = 1; i < parts.length; i++) {
|
|
90
|
+
const child = chain[i - 1];
|
|
91
|
+
chain.push(child.slice(0, child.lastIndexOf('/')));
|
|
92
|
+
}
|
|
93
|
+
return chain;
|
|
94
|
+
}
|
|
95
|
+
export const getPythonFileIndex = perFileSet((allFilePaths) => {
|
|
96
|
+
// Runs on a cache miss only. That it happens once per run and not once per
|
|
97
|
+
// import is asserted by counting traversals of the Set itself, in
|
|
98
|
+
// `test/integration/python-import-index-reuse.test.ts` — the PR #1918 review
|
|
99
|
+
// P1 guard (#2909).
|
|
100
|
+
const normSet = new Set();
|
|
101
|
+
const byBasename = new Map();
|
|
102
|
+
const byInitParent = new Map();
|
|
103
|
+
const dirPrefixes = new Set();
|
|
104
|
+
const nestedDirNames = new Set();
|
|
105
|
+
for (const raw of allFilePaths) {
|
|
106
|
+
const norm = raw.replace(/\\/g, '/');
|
|
107
|
+
// Python import resolution only ever queries `.py` paths: module `<seg>.py`
|
|
108
|
+
// and package `<seg>/__init__.py` membership (normSet), `<lastSeg>.py` /
|
|
109
|
+
// `__init__.py` basename buckets (byBasename), and `.py` directory prefixes
|
|
110
|
+
// (dirPrefixes). Non-`.py` files can never match any of those, so skip them
|
|
111
|
+
// — they were dead weight in every structure on polyglot monorepos
|
|
112
|
+
// (PR #1918 review P3b; dirPrefixes was already `.py`-gated).
|
|
113
|
+
if (!norm.endsWith('.py'))
|
|
114
|
+
continue;
|
|
115
|
+
normSet.add(norm);
|
|
116
|
+
// ONE entry object per file, shared by both buckets below: a package file
|
|
117
|
+
// lands in `byBasename` and `byInitParent`, and two literals for the same
|
|
118
|
+
// `(raw, norm)` pair cost ~40 B each on every `__init__.py`.
|
|
119
|
+
const entry = { raw, norm };
|
|
120
|
+
const lastSlash = norm.lastIndexOf('/');
|
|
121
|
+
const base = lastSlash >= 0 ? norm.slice(lastSlash + 1) : norm;
|
|
122
|
+
// `set(base, [entry])` rather than `set(base, [])` then `push`: an empty
|
|
123
|
+
// array literal that is immediately pushed to makes V8 grow the backing
|
|
124
|
+
// store to its 16-slot minimum, so every bucket holding ONE file retains
|
|
125
|
+
// 15 empty pointer slots — 128 B — for the whole pass. `byBasename` has
|
|
126
|
+
// roughly one bucket per file, which made that the dominant term in this
|
|
127
|
+
// index: measured 5.50 MiB against 1.60 MiB for the one-element form at
|
|
128
|
+
// 32 000 `.py` paths, byte-identical contents. Same shape as
|
|
129
|
+
// `languages/php/import-target.ts`'s directory buckets.
|
|
130
|
+
const bucket = byBasename.get(base);
|
|
131
|
+
if (bucket === undefined)
|
|
132
|
+
byBasename.set(base, [entry]);
|
|
133
|
+
else
|
|
134
|
+
bucket.push(entry);
|
|
135
|
+
// Package files also get a parent-keyed bucket so a `pkg.sub` lookup hits
|
|
136
|
+
// only `…/sub/__init__.py` candidates, not every `__init__.py` (P2b).
|
|
137
|
+
if (base === '__init__.py' && lastSlash >= 0) {
|
|
138
|
+
const dir = norm.slice(0, lastSlash);
|
|
139
|
+
const parentSlash = dir.lastIndexOf('/');
|
|
140
|
+
const parentName = parentSlash >= 0 ? dir.slice(parentSlash + 1) : dir;
|
|
141
|
+
if (parentName) {
|
|
142
|
+
const initKey = `${parentName}/__init__.py`;
|
|
143
|
+
const ib = byInitParent.get(initKey);
|
|
144
|
+
if (ib === undefined)
|
|
145
|
+
byInitParent.set(initKey, [entry]);
|
|
146
|
+
else
|
|
147
|
+
ib.push(entry);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Directory prefixes: every slash-terminated prefix of the path (every
|
|
151
|
+
// index just past a '/', up to and including the file's own directory).
|
|
152
|
+
// Scanning the FULL normalized path — including any leading '/' for
|
|
153
|
+
// absolute paths — makes `dirPrefixes.has(X)` match exactly when the old
|
|
154
|
+
// gate's `f.startsWith(X)` (X always ends in '/') matched. The previous
|
|
155
|
+
// split+`filter(Boolean)` dropped the leading empty component, so an
|
|
156
|
+
// absolute file `/repo/svc/x.py` yielded `repo/svc/` (no leading slash) and
|
|
157
|
+
// gate-passed where `"/repo/svc/x.py".startsWith("repo/svc/")` is false
|
|
158
|
+
// (PR #1918 review P3a). For relative paths the set is identical.
|
|
159
|
+
//
|
|
160
|
+
// The walk runs from the DEEPEST prefix outward and stops at the first
|
|
161
|
+
// one already recorded. Every prefix is added together with all of its
|
|
162
|
+
// own ancestors, so a hit proves the rest of the chain is already there —
|
|
163
|
+
// which makes the second and later files of a directory cost ONE lookup
|
|
164
|
+
// instead of one insert per path component. This build was the last part
|
|
165
|
+
// of Python's resolution that still scaled with path depth (#2913): the
|
|
166
|
+
// same 400-file corpus moved sixteen directories down went from 800
|
|
167
|
+
// inserts to 7200, for the same ~120 distinct prefixes.
|
|
168
|
+
//
|
|
169
|
+
// `nestedDirNames` rides the same walk. A directory prefix has the shape
|
|
170
|
+
// `<parent>/<name>/` — the only shape `hasRepoCandidate`'s check (3)
|
|
171
|
+
// probes — exactly when another slash precedes it at index > 0. Index 0
|
|
172
|
+
// is excluded on purpose: `a/` and `/` name a directory whose parent is
|
|
173
|
+
// empty, which check (2) already answers and which the ancestor walk
|
|
174
|
+
// (non-empty ancestors only) never probes.
|
|
175
|
+
for (let i = lastSlash; i >= 0; i--) {
|
|
176
|
+
if (norm[i] !== '/')
|
|
177
|
+
continue;
|
|
178
|
+
const dirPrefix = norm.slice(0, i + 1);
|
|
179
|
+
if (dirPrefixes.has(dirPrefix))
|
|
180
|
+
break;
|
|
181
|
+
dirPrefixes.add(dirPrefix);
|
|
182
|
+
const parentSlash = i > 0 ? norm.lastIndexOf('/', i - 1) : -1;
|
|
183
|
+
if (parentSlash > 0)
|
|
184
|
+
nestedDirNames.add(norm.slice(parentSlash + 1, i));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
normSet,
|
|
189
|
+
byBasename,
|
|
190
|
+
byInitParent,
|
|
191
|
+
dirPrefixes,
|
|
192
|
+
nestedDirNames,
|
|
193
|
+
ancestorsByDir: new Map(),
|
|
194
|
+
bareImportPrefixesByDir: new Map(),
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* The sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
|
|
199
|
+
* bare-import walk probes, in order, for an importer sitting in `importerDir` —
|
|
200
|
+
* memoized per DIRECTORY for the lifetime of the pass, in the same index and
|
|
201
|
+
* for the same reasons as `importerAncestors`.
|
|
202
|
+
*
|
|
203
|
+
* ## Why this is not `ancestorsByDir`
|
|
204
|
+
*
|
|
205
|
+
* A DIFFERENT SEQUENCE, not a different spelling. For `backend/routers/cron.py`:
|
|
206
|
+
*
|
|
207
|
+
* importerAncestors ["backend/routers", "backend"]
|
|
208
|
+
* importerBarePrefixes ["backend/", ""]
|
|
209
|
+
*
|
|
210
|
+
* Three differences, each load-bearing:
|
|
211
|
+
*
|
|
212
|
+
* 1. `importerAncestors` opens with the importer's OWN directory; this walk
|
|
213
|
+
* does not, because its proximity check has already probed that directory.
|
|
214
|
+
* 2. This walk ENDS at the workspace root (`""`, which probes `<module>.py`
|
|
215
|
+
* unprefixed); `importerAncestors` stops short of it, because
|
|
216
|
+
* `resolveAbsoluteFromFiles` probes the root before its walk instead.
|
|
217
|
+
* 3. `importerAncestors` drops empty components (`filter(Boolean)`); this walk
|
|
218
|
+
* keeps them, and the difference decides real resolutions — for
|
|
219
|
+
* `/abs/a/b/mod.py` this walk probes `/abs/a/`, `/abs/`, `""`, `""` where a
|
|
220
|
+
* filtered chain would probe `abs/a/b/`, `abs/a/`, `abs/`, none of which is
|
|
221
|
+
* a prefix of any file in an absolute-path workspace.
|
|
222
|
+
*
|
|
223
|
+
* So the two cannot share one chain without changing which files resolve. They
|
|
224
|
+
* do share the index, the key and the lifetime, which is what actually matters
|
|
225
|
+
* for #2649: both are filled lazily, hold one entry per directory that ISSUES
|
|
226
|
+
* an import, and die with the pass because the index does.
|
|
227
|
+
*/
|
|
228
|
+
export function importerBarePrefixes(index, importerDir) {
|
|
229
|
+
const memoized = index.bareImportPrefixesByDir.get(importerDir);
|
|
230
|
+
if (memoized !== undefined)
|
|
231
|
+
return memoized;
|
|
232
|
+
const built = buildImporterBarePrefixes(importerDir);
|
|
233
|
+
index.bareImportPrefixesByDir.set(importerDir, built);
|
|
234
|
+
return built;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* `["a/b/", "a/", ""]` for `a/b/c` — every proper ancestor of `importerDir`,
|
|
238
|
+
* closest first, slash-terminated, ending at the workspace root.
|
|
239
|
+
*
|
|
240
|
+
* Cutting the string at each `lastIndexOf('/')` walks the same ancestors the
|
|
241
|
+
* pre-#2913-followup `dirParts.slice(0, i).join('/')` produced, INCLUDING the
|
|
242
|
+
* empty components a `filter(Boolean)` would have dropped: `/abs/a/b` yields
|
|
243
|
+
* `["/abs/a/", "/abs/", "", ""]`, the second `""` being the `i === 0` step that
|
|
244
|
+
* followed the leading empty component. Byte-identical sequences, duplicates
|
|
245
|
+
* kept, so the probes this feeds are unchanged in content, order and count.
|
|
246
|
+
*/
|
|
247
|
+
function buildImporterBarePrefixes(importerDir) {
|
|
248
|
+
const prefixes = [];
|
|
249
|
+
let dir = importerDir;
|
|
250
|
+
let slash = dir.lastIndexOf('/');
|
|
251
|
+
while (slash !== -1) {
|
|
252
|
+
dir = dir.slice(0, slash);
|
|
253
|
+
prefixes.push(dir === '' ? '' : `${dir}/`);
|
|
254
|
+
slash = dir.lastIndexOf('/');
|
|
255
|
+
}
|
|
256
|
+
prefixes.push('');
|
|
257
|
+
return prefixes;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* "No file anywhere in the workspace can be `<X>/<segment>.py` or
|
|
261
|
+
* `<X>/<segment>/__init__.py`, for ANY prefix `<X>`" — in two Map lookups.
|
|
262
|
+
*
|
|
263
|
+
* This is a PROOF OF ABSENCE, not a heuristic filter, and it is what lets the
|
|
264
|
+
* single-segment bare walk skip itself entirely. Both shapes it rules out are
|
|
265
|
+
* the only two shapes that walk probes: a probe `${prefix}${segment}.py` that
|
|
266
|
+
* is a member of the file set is a path with no backslash (the prefix comes
|
|
267
|
+
* from a normalized importer and the guard below rejects a segment carrying
|
|
268
|
+
* one), so it equals its own normalized form and its basename is exactly
|
|
269
|
+
* `${segment}.py` — which puts it in `byBasename`. A probe
|
|
270
|
+
* `${prefix}${segment}/__init__.py` that is a member likewise has parent
|
|
271
|
+
* directory name exactly `segment`, non-empty, which puts it in `byInitParent`
|
|
272
|
+
* whether or not `prefix` is empty. So a miss in both buckets means every probe
|
|
273
|
+
* the walk would issue is guaranteed to miss.
|
|
274
|
+
*
|
|
275
|
+
* Two inputs cannot be proven absent and get `false` — walk as before:
|
|
276
|
+
*
|
|
277
|
+
* - the EMPTY segment (a target spelled with a trailing dot).
|
|
278
|
+
* `byInitParent` skips `__init__.py` files whose parent directory name is
|
|
279
|
+
* empty, so its absence proves nothing. Same carve-out
|
|
280
|
+
* `resolveAbsoluteFromFiles` makes for `lastSeg === ''`.
|
|
281
|
+
* - a segment containing a BACKSLASH. The buckets are keyed on normalized
|
|
282
|
+
* paths, so a raw `a\b.py` is filed under basename `b.py`; a probe for the
|
|
283
|
+
* segment `a\b` would look up `a\b.py`, miss, and wrongly conclude absence
|
|
284
|
+
* while `allFilePaths.has('a\\b.py')` is true. Not reachable from a Python
|
|
285
|
+
* import statement, but this function is a proof and a proof has no
|
|
286
|
+
* unstated preconditions.
|
|
287
|
+
*
|
|
288
|
+
* The dotted tier in `languages/python/import-target.ts` asks the same question
|
|
289
|
+
* of the same two buckets and is deliberately NOT routed through here: it needs
|
|
290
|
+
* the candidate ARRAYS for its suffix fallback, so it does the two `get`s it
|
|
291
|
+
* already needs and derives the answer, rather than paying two extra `has`
|
|
292
|
+
* lookups per import to share four lines.
|
|
293
|
+
*/
|
|
294
|
+
export function pythonSegmentAbsent(index, segment) {
|
|
295
|
+
if (segment === '' || segment.includes('\\'))
|
|
296
|
+
return false;
|
|
297
|
+
if (index.byBasename.has(`${segment}.py`))
|
|
298
|
+
return false;
|
|
299
|
+
if (index.byInitParent.has(`${segment}/__init__.py`))
|
|
300
|
+
return false;
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Strategy lives in configs/python.ts.
|
|
6
6
|
* This file contains the shared internal helper used by the strategy and tests.
|
|
7
7
|
*/
|
|
8
|
+
import { getPythonFileIndex, importerBarePrefixes, importerDirOf, pythonSegmentAbsent, } from './python-file-index.js';
|
|
8
9
|
import { tryResolveWithExtensions } from './utils.js';
|
|
9
10
|
/**
|
|
10
11
|
* Resolve a Python import to a file path (low-level helper).
|
|
@@ -43,8 +44,24 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
|
|
|
43
44
|
const pathLike = importPath.replace(/\./g, '/');
|
|
44
45
|
if (pathLike.includes('/'))
|
|
45
46
|
return null;
|
|
46
|
-
//
|
|
47
|
-
|
|
47
|
+
// O(1) proof of absence, before any probing. Every probe below — the two
|
|
48
|
+
// proximity probes and the two per ancestor step — has the shape
|
|
49
|
+
// `<X>/<pathLike>.py` or `<X>/<pathLike>/__init__.py`, and
|
|
50
|
+
// `pythonSegmentAbsent` answers "no file in the workspace has EITHER shape,
|
|
51
|
+
// for any prefix" in two Map lookups on the index the dotted tiers already
|
|
52
|
+
// build. That is `true` for `os`, `sys`, `django` and every other
|
|
53
|
+
// distribution the repo does not vendor — i.e. for most imports in most
|
|
54
|
+
// Python repos — and it retires the whole walk for them instead of running
|
|
55
|
+
// it to the workspace root. It is exact, not a filter: a miss here means
|
|
56
|
+
// every probe the walk would have issued was guaranteed to miss.
|
|
57
|
+
const index = getPythonFileIndex(allFiles);
|
|
58
|
+
if (pythonSegmentAbsent(index, pathLike))
|
|
59
|
+
return null;
|
|
60
|
+
// One derivation, shared with the index's other per-directory memo — see
|
|
61
|
+
// `importerDirOf`. It replaced `split('/').slice(0, -1).join('/')`: identical
|
|
62
|
+
// for every input (a path with no separator has no directory, which is `''`
|
|
63
|
+
// both ways) without the per-import array of one element per path component.
|
|
64
|
+
const importerDir = importerDirOf(currentFile);
|
|
48
65
|
// Proximity check — only applies when the importer lives in a subdirectory.
|
|
49
66
|
// Root-level importers (importerDir === '') skip straight to the ancestor
|
|
50
67
|
// walk below, which handles the root case correctly (prefix becomes '').
|
|
@@ -59,10 +76,12 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
|
|
|
59
76
|
// importer's directory to find the module in an ancestor, preferring the closest match.
|
|
60
77
|
// This prevents cross-language misresolution (e.g., Python `from middleware import X`
|
|
61
78
|
// resolving to a TypeScript middleware.ts via suffix matching). Issue #417.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
//
|
|
80
|
+
// The prefixes come from `importerBarePrefixes`, built ONCE per importer
|
|
81
|
+
// directory per pass and stored in the same index consulted above. Rebuilding
|
|
82
|
+
// them here — `dirParts.slice(0, i).join('/')`, one array and one string per
|
|
83
|
+
// path component — was the last per-import ancestor walk left after #2913.
|
|
84
|
+
for (const prefix of importerBarePrefixes(index, importerDir)) {
|
|
66
85
|
if (allFiles.has(`${prefix}${pathLike}/__init__.py`))
|
|
67
86
|
return `${prefix}${pathLike}/__init__.py`;
|
|
68
87
|
if (allFiles.has(`${prefix}${pathLike}.py`))
|
|
@@ -11,4 +11,4 @@ import type { SuffixIndex } from './utils.js';
|
|
|
11
11
|
* require_relative paths are pre-normalized to './' prefix by the caller.
|
|
12
12
|
* require paths use suffix matching (gem-style paths like 'json', 'net/http').
|
|
13
13
|
*/
|
|
14
|
-
export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
|
|
14
|
+
export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: readonly string[], allFileList: readonly string[], index?: SuffixIndex): string | null;
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
* Resolve Rust use-path to a file (low-level helper).
|
|
9
9
|
* Handles crate::, super::, self:: prefixes and :: path separators.
|
|
10
10
|
*/
|
|
11
|
-
export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles:
|
|
11
|
+
export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles: ReadonlySet<string>): string | null;
|
|
12
12
|
/**
|
|
13
13
|
* Try to resolve a Rust module path to a file.
|
|
14
14
|
* Tries: path.rs, path/mod.rs, and with the last segment stripped
|
|
15
15
|
* (last segment might be a symbol name, not a module).
|
|
16
16
|
*/
|
|
17
|
-
export declare function tryRustModulePath(modulePath: string, allFiles:
|
|
17
|
+
export declare function tryRustModulePath(modulePath: string, allFiles: ReadonlySet<string>): string | null;
|
|
@@ -20,7 +20,7 @@ export declare const RESOLVE_CACHE_CAP = 100000;
|
|
|
20
20
|
* Java wildcards and Go package imports are handled by the scope-resolution
|
|
21
21
|
* phase because they resolve to multiple files.
|
|
22
22
|
*/
|
|
23
|
-
export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: string[], normalizedFileList: string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
|
|
23
|
+
export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: readonly string[], normalizedFileList: readonly string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
|
|
24
24
|
/**
|
|
25
25
|
* Standard single-file resolution (TS/JS/C/C++ and fallback for other languages).
|
|
26
26
|
* Handles relative imports, tsconfig path aliases, and suffix matching.
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Extracted from import-resolution.ts to co-locate types with their consumers.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
import type { SwiftPackageConfig } from '../language-config.js';
|
|
6
|
+
import type { ImportConfigs } from '../language-config.js';
|
|
8
7
|
import type { SuffixIndex } from './utils.js';
|
|
9
8
|
import type { SupportedLanguages } from '../../../_shared/index.js';
|
|
10
9
|
/**
|
|
@@ -21,16 +20,6 @@ export type ImportResult = {
|
|
|
21
20
|
files: string[];
|
|
22
21
|
dirSuffix: string;
|
|
23
22
|
} | null;
|
|
24
|
-
/** Bundled language-specific configs loaded once per ingestion run. */
|
|
25
|
-
export interface ImportConfigs {
|
|
26
|
-
tsconfigPaths: TsconfigPaths | null;
|
|
27
|
-
goModule: GoModuleConfig | null;
|
|
28
|
-
composerConfig: ComposerConfig | null;
|
|
29
|
-
swiftPackageConfig: SwiftPackageConfig | null;
|
|
30
|
-
csharpConfigs: CSharpProjectConfig[];
|
|
31
|
-
/** In-repo namespace evidence gating C# suffix-fallback resolution (#1881). */
|
|
32
|
-
csharpNamespaces?: CSharpNamespaceEvidence;
|
|
33
|
-
}
|
|
34
23
|
/** Pre-built lookup structures for import resolution. Build once, reuse across chunks. */
|
|
35
24
|
export interface ImportResolutionContext {
|
|
36
25
|
allFilePaths: Set<string>;
|