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,14 @@
|
|
|
1
|
+
import { type CaptureMatch } from '../../../../_shared/index.js';
|
|
2
|
+
import type { CaptureMap } from '../../language-provider.js';
|
|
3
|
+
import type { MethodExtractor } from '../../method-types.js';
|
|
4
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
5
|
+
/** Java records synthesize one public, zero-argument accessor per component. */
|
|
6
|
+
export declare const javaRecordMethodExtractor: MethodExtractor;
|
|
7
|
+
/** Scope declarations matching the structure-phase synthetic accessor nodes. */
|
|
8
|
+
export declare function synthesizeJavaRecordComponentAccessorCaptures(rootNode: SyntaxNode): CaptureMatch[];
|
|
9
|
+
/**
|
|
10
|
+
* The structure query sees every record component. Suppress that synthetic
|
|
11
|
+
* definition when the record body provides the canonical zero-argument
|
|
12
|
+
* accessor explicitly, leaving the explicit method as the single authority.
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldSkipJavaRecordComponentDefinition(captureMap: CaptureMap): boolean;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
2
|
+
import { createMethodExtractor } from '../../method-extractors/generic.js';
|
|
3
|
+
import { javaMethodConfig } from '../../method-extractors/configs/jvm.js';
|
|
4
|
+
import { extractAnnotations } from '../../field-extractors/configs/helpers.js';
|
|
5
|
+
import { nodeToCapture, syntheticCapture } from '../../utils/ast-helpers.js';
|
|
6
|
+
const javaExplicitMethodExtractor = createMethodExtractor(javaMethodConfig);
|
|
7
|
+
function recordComponents(recordNode) {
|
|
8
|
+
const parameters = recordNode.childForFieldName('parameters');
|
|
9
|
+
if (parameters === null)
|
|
10
|
+
return [];
|
|
11
|
+
return parameters.namedChildren.filter((node) => node !== null && (node.type === 'formal_parameter' || node.type === 'spread_parameter'));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A record component is named by a real `identifier` and nothing else.
|
|
15
|
+
*
|
|
16
|
+
* Two node shapes reach this that are not one, and both would mint a graph node
|
|
17
|
+
* for source that does not compile:
|
|
18
|
+
*
|
|
19
|
+
* - `record M(int x, y) {}` — a dropped type. tree-sitter recovers by
|
|
20
|
+
* synthesizing `name: (MISSING identifier)`, a zero-width node whose text is
|
|
21
|
+
* `''`. It still satisfies the query's `name: (identifier)`, so testing the
|
|
22
|
+
* node TYPE alone does not reject it.
|
|
23
|
+
* - `record R(int _) {}` — the grammar declares both `formal_parameter.name`
|
|
24
|
+
* and `variable_declarator.name` as `identifier | underscore_pattern`, and
|
|
25
|
+
* `_` parses with no error at all. `_` is illegal as a component name, and
|
|
26
|
+
* admitting it here while the query rejects it is what let the structure and
|
|
27
|
+
* scope paths disagree.
|
|
28
|
+
*
|
|
29
|
+
* Same degenerate-node shape as `javaBaseLookupNameNode` in captures.ts (#2935).
|
|
30
|
+
*/
|
|
31
|
+
function isRecordComponentName(node) {
|
|
32
|
+
return (node !== null &&
|
|
33
|
+
node !== undefined &&
|
|
34
|
+
node.type === 'identifier' &&
|
|
35
|
+
!node.isMissing &&
|
|
36
|
+
node.text.length > 0);
|
|
37
|
+
}
|
|
38
|
+
function recordComponentNameNode(component) {
|
|
39
|
+
const name = component.type === 'formal_parameter'
|
|
40
|
+
? component.childForFieldName('name')
|
|
41
|
+
: (component.namedChildren
|
|
42
|
+
.find((node) => node?.type === 'variable_declarator')
|
|
43
|
+
?.childForFieldName('name') ?? null);
|
|
44
|
+
return isRecordComponentName(name) ? name : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Memoised per record node. `shouldSkipJavaRecordComponentDefinition` is called
|
|
48
|
+
* once per component capture, so recomputing this would rescan the whole record
|
|
49
|
+
* body per component — O(components x body members) for a single record. The
|
|
50
|
+
* scope-capture path hoists the call out of its own loop instead; this cache is
|
|
51
|
+
* what gives the structure path the same cost. Keyed weakly on the AST node, so
|
|
52
|
+
* it drops with the tree at the end of the file's parse.
|
|
53
|
+
*/
|
|
54
|
+
const explicitZeroArgAccessorNamesCache = new WeakMap();
|
|
55
|
+
function explicitZeroArgAccessorNames(recordNode) {
|
|
56
|
+
const memoized = explicitZeroArgAccessorNamesCache.get(recordNode);
|
|
57
|
+
if (memoized !== undefined)
|
|
58
|
+
return memoized;
|
|
59
|
+
const names = computeExplicitZeroArgAccessorNames(recordNode);
|
|
60
|
+
explicitZeroArgAccessorNamesCache.set(recordNode, names);
|
|
61
|
+
return names;
|
|
62
|
+
}
|
|
63
|
+
function computeExplicitZeroArgAccessorNames(recordNode) {
|
|
64
|
+
const names = new Set();
|
|
65
|
+
const body = recordNode.childForFieldName('body');
|
|
66
|
+
if (body === null)
|
|
67
|
+
return names;
|
|
68
|
+
for (const node of body.namedChildren) {
|
|
69
|
+
if (node === null || node.type !== 'method_declaration')
|
|
70
|
+
continue;
|
|
71
|
+
const name = node.childForFieldName('name')?.text;
|
|
72
|
+
const parameters = node.childForFieldName('parameters');
|
|
73
|
+
const parameterCount = parameters?.namedChildren.filter((parameter) => parameter !== null &&
|
|
74
|
+
(parameter.type === 'formal_parameter' || parameter.type === 'spread_parameter')).length ?? 0;
|
|
75
|
+
if (name !== undefined && parameterCount === 0)
|
|
76
|
+
names.add(name);
|
|
77
|
+
}
|
|
78
|
+
return names;
|
|
79
|
+
}
|
|
80
|
+
function recordComponentReturnType(component) {
|
|
81
|
+
const typeNode = component.childForFieldName('type') ??
|
|
82
|
+
(component.type === 'spread_parameter'
|
|
83
|
+
? component.namedChildren.find((node) => node?.type !== 'modifiers' && node?.type !== 'variable_declarator')
|
|
84
|
+
: undefined);
|
|
85
|
+
const type = typeNode?.text;
|
|
86
|
+
if (type === undefined)
|
|
87
|
+
return null;
|
|
88
|
+
return component.type === 'spread_parameter' ? `${type}[]` : type;
|
|
89
|
+
}
|
|
90
|
+
function implicitAccessorInfo(component, context) {
|
|
91
|
+
const name = recordComponentNameNode(component)?.text;
|
|
92
|
+
if (name === undefined)
|
|
93
|
+
return null;
|
|
94
|
+
return {
|
|
95
|
+
name,
|
|
96
|
+
receiverType: null,
|
|
97
|
+
returnType: recordComponentReturnType(component),
|
|
98
|
+
parameters: [],
|
|
99
|
+
visibility: 'public',
|
|
100
|
+
isStatic: false,
|
|
101
|
+
isAbstract: false,
|
|
102
|
+
isFinal: false,
|
|
103
|
+
// JLS 8.10.3 / 9.7.4: a component annotation reaches the generated accessor
|
|
104
|
+
// when its @Target admits METHOD (or TYPE_USE, in the return-type position).
|
|
105
|
+
// ponytail: over-approximate — we propagate every component annotation,
|
|
106
|
+
// because @Target lives in another file and parsing is per-file, so the
|
|
107
|
+
// target set is not knowable here. Nothing reads Method annotations today:
|
|
108
|
+
// `annotations` is not a column in METHOD_SCHEMA/FUNCTION_SCHEMA
|
|
109
|
+
// (src/core/lbug/schema.ts), so it lives only in the in-memory graph for one
|
|
110
|
+
// analyze run, and the sole in-memory reader (springDiFieldMatcher) is gated
|
|
111
|
+
// to `Property` nodes. If that column is ever added, revisit this: the set
|
|
112
|
+
// would then become an agent-visible claim that may over-state the target.
|
|
113
|
+
annotations: extractAnnotations(component, 'modifiers'),
|
|
114
|
+
sourceFile: context.filePath,
|
|
115
|
+
line: component.startPosition.row + 1,
|
|
116
|
+
column: component.startPosition.column,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Java records synthesize one public, zero-argument accessor per component. */
|
|
120
|
+
export const javaRecordMethodExtractor = {
|
|
121
|
+
...javaExplicitMethodExtractor,
|
|
122
|
+
language: SupportedLanguages.Java,
|
|
123
|
+
extract(node, context) {
|
|
124
|
+
const extracted = javaExplicitMethodExtractor.extract(node, context);
|
|
125
|
+
if (extracted === null || node.type !== 'record_declaration')
|
|
126
|
+
return extracted;
|
|
127
|
+
const explicitAccessors = explicitZeroArgAccessorNames(node);
|
|
128
|
+
const implicitAccessors = recordComponents(node)
|
|
129
|
+
.filter((component) => {
|
|
130
|
+
const name = recordComponentNameNode(component)?.text;
|
|
131
|
+
return name !== undefined && !explicitAccessors.has(name);
|
|
132
|
+
})
|
|
133
|
+
.map((component) => implicitAccessorInfo(component, context))
|
|
134
|
+
.filter((method) => method !== null);
|
|
135
|
+
return { ...extracted, methods: [...extracted.methods, ...implicitAccessors] };
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
/** Scope declarations matching the structure-phase synthetic accessor nodes. */
|
|
139
|
+
export function synthesizeJavaRecordComponentAccessorCaptures(rootNode) {
|
|
140
|
+
const captures = [];
|
|
141
|
+
for (const recordNode of rootNode.descendantsOfType('record_declaration')) {
|
|
142
|
+
const explicitAccessors = explicitZeroArgAccessorNames(recordNode);
|
|
143
|
+
for (const component of recordComponents(recordNode)) {
|
|
144
|
+
const nameNode = recordComponentNameNode(component);
|
|
145
|
+
const returnType = recordComponentReturnType(component);
|
|
146
|
+
if (nameNode === null || returnType === null || explicitAccessors.has(nameNode.text))
|
|
147
|
+
continue;
|
|
148
|
+
captures.push({
|
|
149
|
+
'@scope.function': nodeToCapture('@scope.function', component),
|
|
150
|
+
});
|
|
151
|
+
captures.push({
|
|
152
|
+
'@declaration.method': nodeToCapture('@declaration.method', component),
|
|
153
|
+
'@declaration.name': nodeToCapture('@declaration.name', nameNode),
|
|
154
|
+
'@declaration.parameter-count': syntheticCapture('@declaration.parameter-count', component, '0'),
|
|
155
|
+
'@declaration.required-parameter-count': syntheticCapture('@declaration.required-parameter-count', component, '0'),
|
|
156
|
+
'@declaration.return-type': syntheticCapture('@declaration.return-type', component, returnType),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return captures;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* The structure query sees every record component. Suppress that synthetic
|
|
164
|
+
* definition when the record body provides the canonical zero-argument
|
|
165
|
+
* accessor explicitly, leaving the explicit method as the single authority.
|
|
166
|
+
*/
|
|
167
|
+
export function shouldSkipJavaRecordComponentDefinition(captureMap) {
|
|
168
|
+
const component = captureMap['definition.method'];
|
|
169
|
+
if (component?.type !== 'formal_parameter' && component?.type !== 'spread_parameter') {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const parameters = component.parent;
|
|
173
|
+
const recordNode = parameters?.parent;
|
|
174
|
+
if (parameters?.type !== 'formal_parameters' || recordNode?.type !== 'record_declaration') {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
// Same predicate the scope path applies, so the two can never disagree about
|
|
178
|
+
// which components have an accessor. The query's `name: (identifier)` is
|
|
179
|
+
// satisfied by tree-sitter's zero-width MISSING recovery token, so the
|
|
180
|
+
// structure path has to re-check what the query cannot express.
|
|
181
|
+
const nameNode = captureMap['name'];
|
|
182
|
+
if (!isRecordComponentName(nameNode))
|
|
183
|
+
return true;
|
|
184
|
+
return explicitZeroArgAccessorNames(recordNode).has(nameNode.text);
|
|
185
|
+
}
|
|
@@ -13,26 +13,59 @@ import { followChainPostFinalize } from '../../scope-resolution/passes/imported-
|
|
|
13
13
|
import { javaProvider } from '../java.js';
|
|
14
14
|
import { javaArityCompatibility, javaMergeBindings, resolveJavaImportTarget, } from './index.js';
|
|
15
15
|
import { populateJavaPackageSiblings } from './package-siblings.js';
|
|
16
|
+
import { attachSpringBeanCandidateMetadata } from './spring-bean-metadata.js';
|
|
17
|
+
import { attachJavaSpringAopMetadata } from './spring-aop.js';
|
|
18
|
+
import { attachJavaSpringConfigBindings } from './spring-config-bindings.js';
|
|
19
|
+
import { attachJavaSpringConditionalMetadata } from './spring-conditionals.js';
|
|
20
|
+
import { attachJavaSpringDiMetadata } from './spring-di.js';
|
|
21
|
+
import { attachJavaSpringNonHttpHandlerMetadata } from './spring-non-http-handlers.js';
|
|
22
|
+
import { applyJavaCaptureSideChannel, clearJavaClassAnnotationFacts, } from './capture-side-channel.js';
|
|
23
|
+
import { clearJavaPackageFacts } from './package-facts.js';
|
|
16
24
|
const javaScopeResolver = {
|
|
17
25
|
language: SupportedLanguages.Java,
|
|
18
26
|
languageProvider: javaProvider,
|
|
19
27
|
importEdgeReason: 'java-scope: import',
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
loadResolutionConfig: () => {
|
|
29
|
+
// Worker capture facts are process-local and outlive a single analysis in
|
|
30
|
+
// server mode. This hook runs once before each Java workspace pass, before
|
|
31
|
+
// ParsedFile side channels are restored for the current files.
|
|
32
|
+
clearJavaClassAnnotationFacts();
|
|
33
|
+
clearJavaPackageFacts();
|
|
34
|
+
return undefined;
|
|
35
|
+
},
|
|
36
|
+
resolveImportTarget: (targetRaw, fromFile, allFilePaths, _resolutionConfig, context) => {
|
|
37
|
+
// `context.parsedFiles` is the whole input now: a Java import names a type
|
|
38
|
+
// in a DECLARED package, and the declarations live on those files (#2953).
|
|
39
|
+
const ws = { fromFile, allFilePaths, parsedFiles: context?.parsedFiles };
|
|
22
40
|
return resolveJavaImportTarget({ kind: 'named', localName: '_', importedName: '_', targetRaw }, ws);
|
|
23
41
|
},
|
|
24
42
|
mergeBindings: (existing, incoming) => [...javaMergeBindings([...existing, ...incoming])],
|
|
25
43
|
arityCompatibility: (callsite, def) => javaArityCompatibility(def, callsite),
|
|
26
44
|
buildMro: buildJavaMro,
|
|
27
45
|
populateOwners: (parsed) => populateClassOwnedMembers(parsed),
|
|
46
|
+
applyCaptureSideChannel: applyJavaCaptureSideChannel,
|
|
28
47
|
isSuperReceiver: (text) => text.trim() === 'super',
|
|
29
48
|
fieldFallbackOnMethodLookup: false,
|
|
30
49
|
propagatesReturnTypesAcrossImports: true,
|
|
31
50
|
collapseMemberCallsByCallerTarget: true,
|
|
32
51
|
hoistTypeBindingsToModule: true,
|
|
33
52
|
stripReceiverCastExpressions: true,
|
|
53
|
+
// #2550: every Java method belongs to a class instance — a free call may
|
|
54
|
+
// resolve to a Method only when the caller's enclosing class chain
|
|
55
|
+
// (self + MRO) contains the method's owner. Closes the finalize-bucket
|
|
56
|
+
// leak (unqualified `run()` matching an unrelated same-file anonymous
|
|
57
|
+
// class's method). C# is the intended next adopter.
|
|
58
|
+
freeCallsRequireInstanceOwnership: true,
|
|
34
59
|
populateNamespaceSiblings: populateJavaPackageSiblings,
|
|
35
60
|
populateRangeBindings: populateJavaCrossFileReturnTypes,
|
|
61
|
+
emitPostResolutionEdges: (graph, parsedFiles, nodeLookup, indexes, ctx) => {
|
|
62
|
+
attachSpringBeanCandidateMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
63
|
+
attachJavaSpringAopMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
64
|
+
attachJavaSpringConditionalMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
65
|
+
attachJavaSpringDiMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
66
|
+
attachJavaSpringNonHttpHandlerMetadata(graph, parsedFiles, nodeLookup, indexes);
|
|
67
|
+
attachJavaSpringConfigBindings(graph, parsedFiles, nodeLookup, indexes, ctx);
|
|
68
|
+
},
|
|
36
69
|
};
|
|
37
70
|
export { javaScopeResolver };
|
|
38
71
|
function populateJavaCrossFileReturnTypes(parsedFiles, indexes) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type SpringAopOwnerFact } from '../../frameworks/spring/aop.js';
|
|
2
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
3
|
+
import { type JavaAnnotationSyntaxFact } from './spring-di.js';
|
|
4
|
+
export type JavaSpringAopAnnotationFact = JavaAnnotationSyntaxFact;
|
|
5
|
+
export type JavaSpringAopFact = SpringAopOwnerFact<JavaSpringAopAnnotationFact>;
|
|
6
|
+
/**
|
|
7
|
+
* Capture Spring AOP syntax while Java's existing class traversal already has
|
|
8
|
+
* the AST node in hand. Import/FQN resolution and pointcut matching remain in
|
|
9
|
+
* the shared post-resolution layer.
|
|
10
|
+
*/
|
|
11
|
+
export declare function captureJavaSpringAopFacts(classNode: SyntaxNode, filePath: string): JavaSpringAopFact[];
|
|
12
|
+
export declare const attachJavaSpringAopMetadata: (graph: import("../../../graph/types.js").KnowledgeGraph, parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], nodeLookup: import("../../scope-resolution/graph-bridge/node-lookup.js").GraphNodeLookup, indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes) => void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import { createSpringAopMetadataAttacher, hasSpringAopRelevantAnnotation, } from '../../frameworks/spring/aop.js';
|
|
3
|
+
import { nodeToCapture } from '../../utils/ast-helpers.js';
|
|
4
|
+
import { getJavaSpringAopFacts } from './capture-side-channel.js';
|
|
5
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
6
|
+
import { javaSpringAnnotationFacts } from './spring-di.js';
|
|
7
|
+
function scopeId(filePath, node, kind) {
|
|
8
|
+
return makeScopeId({
|
|
9
|
+
filePath,
|
|
10
|
+
range: nodeToCapture('@spring-aop.owner', node).range,
|
|
11
|
+
kind,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Capture Spring AOP syntax while Java's existing class traversal already has
|
|
16
|
+
* the AST node in hand. Import/FQN resolution and pointcut matching remain in
|
|
17
|
+
* the shared post-resolution layer.
|
|
18
|
+
*/
|
|
19
|
+
export function captureJavaSpringAopFacts(classNode, filePath) {
|
|
20
|
+
const facts = [];
|
|
21
|
+
const classAnnotations = javaSpringAnnotationFacts(classNode);
|
|
22
|
+
if (hasSpringAopRelevantAnnotation(classAnnotations)) {
|
|
23
|
+
facts.push({
|
|
24
|
+
ownerScopeId: scopeId(filePath, classNode, 'Class'),
|
|
25
|
+
ownerKind: 'class',
|
|
26
|
+
annotations: classAnnotations,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const body = classNode.childForFieldName('body');
|
|
30
|
+
if (body === null)
|
|
31
|
+
return facts;
|
|
32
|
+
for (const member of body.namedChildren) {
|
|
33
|
+
if (member.type !== 'method_declaration')
|
|
34
|
+
continue;
|
|
35
|
+
const annotations = javaSpringAnnotationFacts(member);
|
|
36
|
+
if (!hasSpringAopRelevantAnnotation(annotations))
|
|
37
|
+
continue;
|
|
38
|
+
facts.push({
|
|
39
|
+
ownerScopeId: scopeId(filePath, member, 'Function'),
|
|
40
|
+
ownerKind: 'callable',
|
|
41
|
+
annotations,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return facts;
|
|
45
|
+
}
|
|
46
|
+
export const attachJavaSpringAopMetadata = createSpringAopMetadataAttacher({
|
|
47
|
+
getFacts: getJavaSpringAopFacts,
|
|
48
|
+
isPackageVisibilityIncomplete: isJavaPackageSiblingVisibilityIncomplete,
|
|
49
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/** Java wiring for the language-neutral Spring candidate engine. */
|
|
2
|
+
export declare const attachSpringBeanCandidateMetadata: (graph: import("../../../graph/types.js").KnowledgeGraph, parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], nodeLookup: import("../../scope-resolution/graph-bridge/node-lookup.js").GraphNodeLookup, indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes) => void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createSpringBeanCandidateAttacher } from '../../frameworks/spring/bean-candidates.js';
|
|
2
|
+
import { getJavaClassAnnotationFacts } from './capture-side-channel.js';
|
|
3
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
4
|
+
/** Java wiring for the language-neutral Spring candidate engine. */
|
|
5
|
+
export const attachSpringBeanCandidateMetadata = createSpringBeanCandidateAttacher({
|
|
6
|
+
getClassAnnotationFacts: getJavaClassAnnotationFacts,
|
|
7
|
+
isPackageVisibilityIncomplete: isJavaPackageSiblingVisibilityIncomplete,
|
|
8
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SpringConditionalOwnerFact } from '../../frameworks/spring/conditionals.js';
|
|
2
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
3
|
+
import { type JavaAnnotationSyntaxFact } from './spring-di.js';
|
|
4
|
+
export type JavaSpringConditionalAnnotationFact = JavaAnnotationSyntaxFact;
|
|
5
|
+
export type JavaSpringConditionalFact = SpringConditionalOwnerFact<JavaSpringConditionalAnnotationFact>;
|
|
6
|
+
/**
|
|
7
|
+
* Capture Spring condition syntax while Java's existing class traversal already
|
|
8
|
+
* has the AST node in hand. Framework/FQN semantics are resolved later.
|
|
9
|
+
*/
|
|
10
|
+
export declare function captureJavaSpringConditionalFacts(classNode: SyntaxNode, filePath: string): JavaSpringConditionalFact[];
|
|
11
|
+
export declare const attachJavaSpringConditionalMetadata: (graph: import("../../../graph/types.js").KnowledgeGraph, parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], nodeLookup: import("../../scope-resolution/graph-bridge/node-lookup.js").GraphNodeLookup, indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes) => void;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import { createSpringConditionalMetadataAttacher, hasSpringConditionalRelevantAnnotation, } from '../../frameworks/spring/conditionals.js';
|
|
3
|
+
import { nodeToCapture } from '../../utils/ast-helpers.js';
|
|
4
|
+
import { getJavaSpringConditionalFacts } from './capture-side-channel.js';
|
|
5
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
6
|
+
import { javaSpringAnnotationFacts } from './spring-di.js';
|
|
7
|
+
function scopeId(filePath, node, kind) {
|
|
8
|
+
return makeScopeId({
|
|
9
|
+
filePath,
|
|
10
|
+
range: nodeToCapture('@spring-condition.owner', node).range,
|
|
11
|
+
kind,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Capture Spring condition syntax while Java's existing class traversal already
|
|
16
|
+
* has the AST node in hand. Framework/FQN semantics are resolved later.
|
|
17
|
+
*/
|
|
18
|
+
export function captureJavaSpringConditionalFacts(classNode, filePath) {
|
|
19
|
+
const facts = [];
|
|
20
|
+
const classAnnotations = javaSpringAnnotationFacts(classNode);
|
|
21
|
+
if (hasSpringConditionalRelevantAnnotation(classAnnotations)) {
|
|
22
|
+
facts.push({
|
|
23
|
+
ownerScopeId: scopeId(filePath, classNode, 'Class'),
|
|
24
|
+
ownerKind: 'class',
|
|
25
|
+
annotations: classAnnotations,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const body = classNode.childForFieldName('body');
|
|
29
|
+
if (body === null)
|
|
30
|
+
return facts;
|
|
31
|
+
for (const member of body.namedChildren) {
|
|
32
|
+
if (member.type !== 'method_declaration')
|
|
33
|
+
continue;
|
|
34
|
+
const annotations = javaSpringAnnotationFacts(member);
|
|
35
|
+
if (!hasSpringConditionalRelevantAnnotation(annotations))
|
|
36
|
+
continue;
|
|
37
|
+
facts.push({
|
|
38
|
+
ownerScopeId: scopeId(filePath, member, 'Function'),
|
|
39
|
+
ownerKind: 'callable',
|
|
40
|
+
annotations,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return facts;
|
|
44
|
+
}
|
|
45
|
+
export const attachJavaSpringConditionalMetadata = createSpringConditionalMetadataAttacher({
|
|
46
|
+
getFacts: getJavaSpringConditionalFacts,
|
|
47
|
+
isPackageVisibilityIncomplete: isJavaPackageSiblingVisibilityIncomplete,
|
|
48
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
2
|
+
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
3
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
4
|
+
import { type ParsedFile, type ScopeId } from '../../../../_shared/index.js';
|
|
5
|
+
import { type SpringConfigConsumer } from '../../frameworks/spring/config-bindings.js';
|
|
6
|
+
import { type SyntaxNode } from '../../utils/ast-helpers.js';
|
|
7
|
+
export interface JavaSpringConfigConsumerFact {
|
|
8
|
+
readonly consumer: SpringConfigConsumer;
|
|
9
|
+
readonly annotationName: string;
|
|
10
|
+
readonly classScopeId: ScopeId;
|
|
11
|
+
}
|
|
12
|
+
/** Extract statically readable Spring placeholder keys from a Java annotation. */
|
|
13
|
+
export declare function parseValuePlaceholderKeys(annotation: SyntaxNode): string[];
|
|
14
|
+
/** Extract `prefix`/`value` (or the positional value) from the annotation. */
|
|
15
|
+
export declare function parseConfigurationPropertiesPrefix(annotation: SyntaxNode): string | null;
|
|
16
|
+
/** Collect config facts from the Java parser's existing AST (no reparse). */
|
|
17
|
+
export declare function captureJavaSpringConfigConsumerFacts(root: SyntaxNode, filePath: string): JavaSpringConfigConsumerFact[];
|
|
18
|
+
/** Parse Java consumers for focused unit tests; production reuses the worker AST. */
|
|
19
|
+
export declare function extractJavaSpringConfigConsumers(source: string): SpringConfigConsumer[];
|
|
20
|
+
/** Java ScopeResolver post-resolution hook for Spring configuration consumers. */
|
|
21
|
+
export declare function attachJavaSpringConfigBindings(graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], _nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes, _ctx: {
|
|
22
|
+
readonly fileContents: ReadonlyMap<string, string>;
|
|
23
|
+
}): void;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import { bindSpringConfigConsumers, } from '../../frameworks/spring/config-bindings.js';
|
|
3
|
+
import { createSpringAnnotationNameResolver } from '../../frameworks/spring/bean-candidates.js';
|
|
4
|
+
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
5
|
+
import { nodeToCapture } from '../../utils/ast-helpers.js';
|
|
6
|
+
import { getJavaParser } from './query.js';
|
|
7
|
+
import { getJavaSpringConfigConsumerFacts } from './capture-side-channel.js';
|
|
8
|
+
import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
9
|
+
const VALUE_ANNOTATION = 'org.springframework.beans.factory.annotation.Value';
|
|
10
|
+
const CONFIGURATION_PROPERTIES_ANNOTATION = 'org.springframework.boot.context.properties.ConfigurationProperties';
|
|
11
|
+
function collectJavaImports(root) {
|
|
12
|
+
const exact = new Set();
|
|
13
|
+
const wildcard = new Set();
|
|
14
|
+
const localTypes = new Set();
|
|
15
|
+
for (const node of root.descendantsOfType('import_declaration')) {
|
|
16
|
+
const imported = node.text
|
|
17
|
+
.replace(/^\s*import\s+(?:static\s+)?/, '')
|
|
18
|
+
.replace(/;\s*$/, '')
|
|
19
|
+
.trim();
|
|
20
|
+
if (imported.endsWith('.*'))
|
|
21
|
+
wildcard.add(imported.slice(0, -2));
|
|
22
|
+
else
|
|
23
|
+
exact.add(imported);
|
|
24
|
+
}
|
|
25
|
+
for (const type of [
|
|
26
|
+
'class_declaration',
|
|
27
|
+
'interface_declaration',
|
|
28
|
+
'enum_declaration',
|
|
29
|
+
'record_declaration',
|
|
30
|
+
'annotation_type_declaration',
|
|
31
|
+
]) {
|
|
32
|
+
for (const node of root.descendantsOfType(type)) {
|
|
33
|
+
const name = node.childForFieldName('name')?.text;
|
|
34
|
+
if (name)
|
|
35
|
+
localTypes.add(name);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { exact, wildcard, localTypes };
|
|
39
|
+
}
|
|
40
|
+
function annotationsOn(node) {
|
|
41
|
+
const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
|
|
42
|
+
if (modifiers === undefined)
|
|
43
|
+
return [];
|
|
44
|
+
const annotations = [];
|
|
45
|
+
for (const child of modifiers.namedChildren) {
|
|
46
|
+
if (child.type !== 'annotation' && child.type !== 'marker_annotation')
|
|
47
|
+
continue;
|
|
48
|
+
const name = child.childForFieldName('name')?.text ?? child.firstNamedChild?.text;
|
|
49
|
+
if (name)
|
|
50
|
+
annotations.push({ name, node: child });
|
|
51
|
+
}
|
|
52
|
+
return annotations;
|
|
53
|
+
}
|
|
54
|
+
function resolvesToAnnotation(rawName, canonicalName, imports) {
|
|
55
|
+
if (rawName.includes('.'))
|
|
56
|
+
return rawName === canonicalName;
|
|
57
|
+
if (imports.localTypes.has(rawName))
|
|
58
|
+
return false;
|
|
59
|
+
if (imports.exact.has(canonicalName))
|
|
60
|
+
return true;
|
|
61
|
+
const packageName = canonicalName.slice(0, canonicalName.lastIndexOf('.'));
|
|
62
|
+
return imports.wildcard.has(packageName);
|
|
63
|
+
}
|
|
64
|
+
function decodeJavaStringLiteral(literal) {
|
|
65
|
+
const delimiterLength = literal.startsWith('"""') && literal.endsWith('"""') ? 3 : 1;
|
|
66
|
+
return literal
|
|
67
|
+
.slice(delimiterLength, -delimiterLength)
|
|
68
|
+
.replace(/\\u([0-9a-fA-F]{4})/g, (_match, hex) => String.fromCharCode(Number.parseInt(hex, 16)))
|
|
69
|
+
.replace(/\\(["'\\btnfr])/g, (_match, escaped) => {
|
|
70
|
+
const controls = {
|
|
71
|
+
b: '\b',
|
|
72
|
+
t: '\t',
|
|
73
|
+
n: '\n',
|
|
74
|
+
f: '\f',
|
|
75
|
+
r: '\r',
|
|
76
|
+
};
|
|
77
|
+
return controls[escaped] ?? escaped;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function javaStringLiterals(annotation) {
|
|
81
|
+
return annotation
|
|
82
|
+
.descendantsOfType('string_literal')
|
|
83
|
+
.map((literal) => decodeJavaStringLiteral(literal.text));
|
|
84
|
+
}
|
|
85
|
+
/** Extract statically readable Spring placeholder keys from a Java annotation. */
|
|
86
|
+
export function parseValuePlaceholderKeys(annotation) {
|
|
87
|
+
const keys = new Set();
|
|
88
|
+
for (const literal of javaStringLiterals(annotation)) {
|
|
89
|
+
for (const match of literal.matchAll(/\$\{([^{}]+)\}/g)) {
|
|
90
|
+
const key = match[1].split(':', 1)[0].trim();
|
|
91
|
+
if (/^[A-Za-z0-9_.-]+$/.test(key))
|
|
92
|
+
keys.add(key);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return [...keys];
|
|
96
|
+
}
|
|
97
|
+
/** Extract `prefix`/`value` (or the positional value) from the annotation. */
|
|
98
|
+
export function parseConfigurationPropertiesPrefix(annotation) {
|
|
99
|
+
const named = annotation.descendantsOfType('element_value_pair').find((pair) => {
|
|
100
|
+
const key = pair.childForFieldName('key')?.text;
|
|
101
|
+
return key === 'prefix' || key === 'value';
|
|
102
|
+
});
|
|
103
|
+
const namedValue = named?.childForFieldName('value');
|
|
104
|
+
const argumentsNode = annotation.childForFieldName('arguments');
|
|
105
|
+
const literalNode = (namedValue?.type === 'string_literal'
|
|
106
|
+
? namedValue
|
|
107
|
+
: namedValue?.descendantsOfType('string_literal')[0]) ??
|
|
108
|
+
(named === undefined
|
|
109
|
+
? argumentsNode?.namedChildren.find((child) => child.type === 'string_literal')
|
|
110
|
+
: undefined);
|
|
111
|
+
if (literalNode === undefined)
|
|
112
|
+
return null;
|
|
113
|
+
const prefix = decodeJavaStringLiteral(literalNode.text)
|
|
114
|
+
.trim()
|
|
115
|
+
.replace(/^\.+|\.+$/g, '');
|
|
116
|
+
return /^[A-Za-z0-9_.-]+$/.test(prefix) ? prefix : null;
|
|
117
|
+
}
|
|
118
|
+
function classScopeId(filePath, declaration) {
|
|
119
|
+
return makeScopeId({
|
|
120
|
+
filePath,
|
|
121
|
+
range: nodeToCapture('@scope.class', declaration).range,
|
|
122
|
+
kind: 'Class',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function enclosingClass(node) {
|
|
126
|
+
let current = node.parent;
|
|
127
|
+
while (current !== null) {
|
|
128
|
+
if (current.type === 'class_declaration' || current.type === 'record_declaration') {
|
|
129
|
+
return current;
|
|
130
|
+
}
|
|
131
|
+
current = current.parent;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
/** Collect config facts from the Java parser's existing AST (no reparse). */
|
|
136
|
+
export function captureJavaSpringConfigConsumerFacts(root, filePath) {
|
|
137
|
+
const imports = collectJavaImports(root);
|
|
138
|
+
const facts = [];
|
|
139
|
+
for (const field of root.descendantsOfType('field_declaration')) {
|
|
140
|
+
const annotations = annotationsOn(field).filter((annotation) => resolvesToAnnotation(annotation.name, VALUE_ANNOTATION, imports));
|
|
141
|
+
if (annotations.length === 0)
|
|
142
|
+
continue;
|
|
143
|
+
const owner = enclosingClass(field);
|
|
144
|
+
if (owner === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
for (const declarator of field.namedChildren.filter((child) => child.type === 'variable_declarator')) {
|
|
147
|
+
const fieldName = declarator.childForFieldName('name')?.text;
|
|
148
|
+
if (!fieldName)
|
|
149
|
+
continue;
|
|
150
|
+
for (const annotation of annotations) {
|
|
151
|
+
const keys = parseValuePlaceholderKeys(annotation.node);
|
|
152
|
+
if (keys.length > 0) {
|
|
153
|
+
facts.push({
|
|
154
|
+
consumer: { kind: 'value', fieldName, line: field.startPosition.row + 1, keys },
|
|
155
|
+
annotationName: annotation.name,
|
|
156
|
+
classScopeId: classScopeId(filePath, owner),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const type of ['class_declaration', 'record_declaration']) {
|
|
163
|
+
for (const declaration of root.descendantsOfType(type)) {
|
|
164
|
+
const className = declaration.childForFieldName('name')?.text;
|
|
165
|
+
if (!className)
|
|
166
|
+
continue;
|
|
167
|
+
for (const annotation of annotationsOn(declaration)) {
|
|
168
|
+
if (!resolvesToAnnotation(annotation.name, CONFIGURATION_PROPERTIES_ANNOTATION, imports)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const prefix = parseConfigurationPropertiesPrefix(annotation.node);
|
|
172
|
+
if (prefix !== null) {
|
|
173
|
+
facts.push({
|
|
174
|
+
consumer: {
|
|
175
|
+
kind: 'configuration-properties',
|
|
176
|
+
className,
|
|
177
|
+
line: declaration.startPosition.row + 1,
|
|
178
|
+
prefix,
|
|
179
|
+
},
|
|
180
|
+
annotationName: annotation.name,
|
|
181
|
+
classScopeId: classScopeId(filePath, declaration),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return facts;
|
|
188
|
+
}
|
|
189
|
+
/** Parse Java consumers for focused unit tests; production reuses the worker AST. */
|
|
190
|
+
export function extractJavaSpringConfigConsumers(source) {
|
|
191
|
+
const tree = parseSourceSafe(getJavaParser(), source);
|
|
192
|
+
return captureJavaSpringConfigConsumerFacts(tree.rootNode, '<memory>').map((fact) => fact.consumer);
|
|
193
|
+
}
|
|
194
|
+
/** Java ScopeResolver post-resolution hook for Spring configuration consumers. */
|
|
195
|
+
export function attachJavaSpringConfigBindings(graph, parsedFiles, _nodeLookup, indexes, _ctx) {
|
|
196
|
+
const resolveAnnotation = createSpringAnnotationNameResolver(indexes);
|
|
197
|
+
const recognizedAnnotations = new Set([VALUE_ANNOTATION, CONFIGURATION_PROPERTIES_ANNOTATION]);
|
|
198
|
+
const batches = [];
|
|
199
|
+
for (const parsed of parsedFiles) {
|
|
200
|
+
const consumers = [];
|
|
201
|
+
for (const fact of getJavaSpringConfigConsumerFacts(parsed.filePath)) {
|
|
202
|
+
const classScope = indexes.scopeTree.getScope(fact.classScopeId);
|
|
203
|
+
if (classScope === undefined || classScope.kind !== 'Class')
|
|
204
|
+
continue;
|
|
205
|
+
const expectedAnnotation = fact.consumer.kind === 'value' ? VALUE_ANNOTATION : CONFIGURATION_PROPERTIES_ANNOTATION;
|
|
206
|
+
const enclosingScope = fact.consumer.kind === 'value' ? classScope.id : classScope.parent;
|
|
207
|
+
const resolved = resolveAnnotation(fact.annotationName, parsed, enclosingScope, recognizedAnnotations, isJavaPackageSiblingVisibilityIncomplete(parsed.filePath));
|
|
208
|
+
if (resolved === expectedAnnotation)
|
|
209
|
+
consumers.push(fact.consumer);
|
|
210
|
+
}
|
|
211
|
+
if (consumers.length > 0)
|
|
212
|
+
batches.push({ filePath: parsed.filePath, consumers });
|
|
213
|
+
}
|
|
214
|
+
bindSpringConfigConsumers(graph, batches);
|
|
215
|
+
}
|