gitnexus 1.6.9 → 1.6.10-aptos.0
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 +211 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.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/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.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 +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +197 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- 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/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -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.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- 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 +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -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 +26 -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/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- 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.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- 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 +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -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-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- 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 +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -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 +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- 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.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- 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 +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- 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/standalone-ingest.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +5 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- 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 +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +28 -0
- package/dist/core/move/consistency.js +98 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +49 -0
- package/dist/core/move/move-ingest.js +320 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +3 -3
- package/dist/core/run-analyze.js +1001 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- 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 +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -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 +272 -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 +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -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-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const UNKNOWN_JVM_PACKAGE_FACT = Object.freeze({ status: 'unknown' });
|
|
2
|
+
/** Validate a package fact restored from an opaque worker payload. */
|
|
3
|
+
export function isJvmPackageFact(value) {
|
|
4
|
+
if (value === null || typeof value !== 'object')
|
|
5
|
+
return false;
|
|
6
|
+
const fact = value;
|
|
7
|
+
return (fact.status === 'unknown' || (fact.status === 'known' && typeof fact.packageName === 'string'));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create one language-local package fact store.
|
|
11
|
+
*
|
|
12
|
+
* Package facts are captured while the language's scope extractor already
|
|
13
|
+
* owns a tree-sitter Tree, then serialized through ParsedFile's side-channel.
|
|
14
|
+
* Resolution hooks consume only this plain data and never parse source again.
|
|
15
|
+
*/
|
|
16
|
+
export function createJvmPackageFactStore(options) {
|
|
17
|
+
const factsByFile = new Map();
|
|
18
|
+
return {
|
|
19
|
+
clear: () => factsByFile.clear(),
|
|
20
|
+
capture: (filePath, root) => factsByFile.set(filePath, extractJvmPackageFact(root, options)),
|
|
21
|
+
set: (filePath, fact) => factsByFile.set(filePath, fact),
|
|
22
|
+
get: (filePath) => factsByFile.get(filePath),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function extractJvmPackageFact(root, options) {
|
|
26
|
+
const packageNode = root.namedChildren.find((child) => child.type === options.packageNodeType);
|
|
27
|
+
if (packageNode === undefined) {
|
|
28
|
+
// A syntax error elsewhere in a default-package file does not make its
|
|
29
|
+
// package ambiguous. Only a top-level ERROR that contains the reserved
|
|
30
|
+
// package keyword is evidence of a malformed package header.
|
|
31
|
+
const malformedHeader = root.namedChildren.some((child) => child.type === 'ERROR' && /\bpackage\b/.test(child.text));
|
|
32
|
+
return malformedHeader ? UNKNOWN_JVM_PACKAGE_FACT : { status: 'known', packageName: '' };
|
|
33
|
+
}
|
|
34
|
+
const nameNode = packageNode.namedChildren.find((child) => options.packageNameNodeTypes.includes(child.type));
|
|
35
|
+
const packageName = nameNode?.text.trim();
|
|
36
|
+
if (packageNode.hasError || packageName === undefined || packageName.length === 0) {
|
|
37
|
+
return UNKNOWN_JVM_PACKAGE_FACT;
|
|
38
|
+
}
|
|
39
|
+
return { status: 'known', packageName };
|
|
40
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ParsedFile } from '../../../../_shared/index.js';
|
|
2
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
3
|
+
import type { JvmPackageFact } from './package-facts.js';
|
|
4
|
+
export interface JvmPackageSiblingOptions {
|
|
5
|
+
readonly languageLabel: string;
|
|
6
|
+
readonly getPackageFact: (filePath: string) => JvmPackageFact | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface JvmPackageSiblingVisibility {
|
|
9
|
+
readonly populateNamespaceSiblings: (parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, ctx: {
|
|
10
|
+
readonly fileContents: ReadonlyMap<string, string>;
|
|
11
|
+
}) => void;
|
|
12
|
+
readonly isVisibilityIncomplete: (filePath: string) => boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function createJvmPackageSiblingVisibility(options: JvmPackageSiblingOptions): JvmPackageSiblingVisibility;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { logger } from '../../../logger.js';
|
|
2
|
+
import { isClassLike } from '../../scope-resolution/scope/walkers.js';
|
|
3
|
+
const MAX_PACKAGE_FILES = 500;
|
|
4
|
+
export function createJvmPackageSiblingVisibility(options) {
|
|
5
|
+
const incompleteFiles = new Set();
|
|
6
|
+
function populateNamespaceSiblings(parsedFiles, indexes, ctx) {
|
|
7
|
+
incompleteFiles.clear();
|
|
8
|
+
const buckets = new Map();
|
|
9
|
+
const unknownPackageFiles = new Set();
|
|
10
|
+
const parsedPaths = new Set(parsedFiles.map((parsed) => parsed.filePath));
|
|
11
|
+
// A file that failed scope extraction has no ParsedFile or side-channel,
|
|
12
|
+
// but it may still declare a shadowing type in any package. Keep its source
|
|
13
|
+
// path in the uncertainty set without re-parsing it on the main thread.
|
|
14
|
+
for (const filePath of ctx.fileContents.keys()) {
|
|
15
|
+
if (!parsedPaths.has(filePath))
|
|
16
|
+
unknownPackageFiles.add(filePath);
|
|
17
|
+
}
|
|
18
|
+
for (const parsed of parsedFiles) {
|
|
19
|
+
const packageFact = options.getPackageFact(parsed.filePath);
|
|
20
|
+
if (!ctx.fileContents.has(parsed.filePath) || packageFact?.status !== 'known') {
|
|
21
|
+
incompleteFiles.add(parsed.filePath);
|
|
22
|
+
unknownPackageFiles.add(parsed.filePath);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const packageName = packageFact.packageName;
|
|
26
|
+
const bucket = buckets.get(packageName) ?? { parsed: [], moduleScopes: [] };
|
|
27
|
+
buckets.set(packageName, bucket);
|
|
28
|
+
bucket.parsed.push(parsed);
|
|
29
|
+
const moduleScope = parsed.scopes.find((scope) => scope.kind === 'Module');
|
|
30
|
+
if (moduleScope !== undefined) {
|
|
31
|
+
bucket.moduleScopes.push({ filePath: parsed.filePath, scope: moduleScope });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// A file whose package cannot be proven may shadow a wildcard-imported
|
|
35
|
+
// type in any package. Conservatively disable wildcard attribution for the
|
|
36
|
+
// language workspace while leaving explicit/FQN imports available.
|
|
37
|
+
if (unknownPackageFiles.size > 0) {
|
|
38
|
+
for (const parsed of parsedFiles)
|
|
39
|
+
incompleteFiles.add(parsed.filePath);
|
|
40
|
+
logger.warn(`[${options.languageLabel}-package-siblings] ${unknownPackageFiles.size} file(s) lacked reliable package facts; wildcard attribution disabled for this language workspace`);
|
|
41
|
+
}
|
|
42
|
+
const augmentations = indexes.bindingAugmentations;
|
|
43
|
+
for (const bucket of buckets.values()) {
|
|
44
|
+
if (bucket.moduleScopes.length < 2)
|
|
45
|
+
continue;
|
|
46
|
+
if (bucket.moduleScopes.length > MAX_PACKAGE_FILES) {
|
|
47
|
+
for (const parsed of bucket.parsed)
|
|
48
|
+
incompleteFiles.add(parsed.filePath);
|
|
49
|
+
logger.warn(`[${options.languageLabel}-package-siblings] skipping package with ${bucket.moduleScopes.length} files (cap=${MAX_PACKAGE_FILES}); same-package implicit visibility disabled for this package`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const classDefs = [];
|
|
53
|
+
for (const parsed of bucket.parsed) {
|
|
54
|
+
const moduleScopeId = parsed.scopes.find((scope) => scope.kind === 'Module')?.id;
|
|
55
|
+
for (const scope of parsed.scopes) {
|
|
56
|
+
if (scope.kind !== 'Class' || scope.parent !== moduleScopeId)
|
|
57
|
+
continue;
|
|
58
|
+
const def = scope.ownedDefs.find((candidate) => isClassLike(candidate.type));
|
|
59
|
+
if (def !== undefined)
|
|
60
|
+
classDefs.push({ def, filePath: parsed.filePath });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const { filePath, scope } of bucket.moduleScopes) {
|
|
64
|
+
let scopeAug = augmentations.get(scope.id);
|
|
65
|
+
if (scopeAug === undefined) {
|
|
66
|
+
scopeAug = new Map();
|
|
67
|
+
augmentations.set(scope.id, scopeAug);
|
|
68
|
+
}
|
|
69
|
+
const proximityCache = new Map();
|
|
70
|
+
const candidates = classDefs.filter((candidate) => candidate.filePath !== filePath);
|
|
71
|
+
for (const candidate of candidates) {
|
|
72
|
+
if (!proximityCache.has(candidate.filePath)) {
|
|
73
|
+
proximityCache.set(candidate.filePath, sharedSegmentCount(candidate.filePath, filePath));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
candidates.sort((a, b) => (proximityCache.get(b.filePath) ?? 0) - (proximityCache.get(a.filePath) ?? 0));
|
|
77
|
+
const injectedIds = new Set();
|
|
78
|
+
for (const { def } of candidates) {
|
|
79
|
+
if (injectedIds.has(def.nodeId) || def.qualifiedName === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
injectedIds.add(def.nodeId);
|
|
82
|
+
const simpleName = def.qualifiedName.includes('.')
|
|
83
|
+
? def.qualifiedName.slice(def.qualifiedName.lastIndexOf('.') + 1)
|
|
84
|
+
: def.qualifiedName;
|
|
85
|
+
const bindings = scopeAug.get(simpleName) ?? [];
|
|
86
|
+
if (!scopeAug.has(simpleName))
|
|
87
|
+
scopeAug.set(simpleName, bindings);
|
|
88
|
+
bindings.push({ def, origin: 'namespace' });
|
|
89
|
+
}
|
|
90
|
+
const typeBindings = scope.typeBindings;
|
|
91
|
+
for (const sibling of bucket.moduleScopes) {
|
|
92
|
+
if (sibling.filePath === filePath)
|
|
93
|
+
continue;
|
|
94
|
+
for (const [name, ref] of sibling.scope.typeBindings) {
|
|
95
|
+
if (!typeBindings.has(name))
|
|
96
|
+
typeBindings.set(name, ref);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (const sibling of bucket.parsed) {
|
|
100
|
+
if (sibling.filePath === filePath)
|
|
101
|
+
continue;
|
|
102
|
+
for (const siblingScope of sibling.scopes) {
|
|
103
|
+
if (siblingScope.kind !== 'Class')
|
|
104
|
+
continue;
|
|
105
|
+
for (const [name, ref] of siblingScope.typeBindings) {
|
|
106
|
+
if (ref.source !== 'self' && !typeBindings.has(name))
|
|
107
|
+
typeBindings.set(name, ref);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
populateNamespaceSiblings,
|
|
116
|
+
isVisibilityIncomplete: (filePath) => incompleteFiles.has(filePath),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function sharedSegmentCount(a, b) {
|
|
120
|
+
const aSegments = a.replace(/\\/g, '/').split('/');
|
|
121
|
+
const bSegments = b.replace(/\\/g, '/').split('/');
|
|
122
|
+
let index = 0;
|
|
123
|
+
while (index < aSegments.length &&
|
|
124
|
+
index < bSegments.length &&
|
|
125
|
+
aSegments[index] === bSegments[index]) {
|
|
126
|
+
index++;
|
|
127
|
+
}
|
|
128
|
+
return index;
|
|
129
|
+
}
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* - `companionScopesByFile` (companion-scopes.ts) — the `ScopeId`s that came
|
|
8
8
|
* from a `companion_object` AST node, recorded via `markCompanionScope`
|
|
9
9
|
* from the `@scope.companion` marker capture.
|
|
10
|
+
* - Spring Bean class-annotation facts collected during the same scope-query
|
|
11
|
+
* traversal, consumed only after imports and package visibility finalize.
|
|
12
|
+
* - A JVM package fact read from the already-parsed root, so package-sibling
|
|
13
|
+
* visibility never re-parses Kotlin source on the main thread.
|
|
10
14
|
*
|
|
11
15
|
* On the worker path that map is filled in the WORKER process and lost across
|
|
12
16
|
* the worker→main MessageChannel (and the disk-backed parsedfile-store),
|
|
@@ -25,10 +29,13 @@
|
|
|
25
29
|
* The single generic `ParsedFile.captureSideChannel` field is shared with C++,
|
|
26
30
|
* which is safe because each file is one language (a `.kt` file uses the kotlin
|
|
27
31
|
* provider, a `.cpp` file the cpp provider). The payload is self-describing
|
|
28
|
-
* (`{ kind: 'kotlin', companionScopes }`) so
|
|
29
|
-
* only restores kotlin state and ignores a
|
|
32
|
+
* (`{ kind: 'kotlin', companionScopes, packageFact, classAnnotations }`) so
|
|
33
|
+
* `applyKotlinCaptureSideChannel` only restores kotlin state and ignores a
|
|
34
|
+
* foreign-shaped snapshot.
|
|
30
35
|
*/
|
|
31
36
|
import type { ParsedFile, ScopeId } from '../../../../_shared/index.js';
|
|
37
|
+
import { type ClassAnnotationFact } from '../../frameworks/spring/bean-candidates.js';
|
|
38
|
+
import { type JvmPackageFact } from '../jvm/package-facts.js';
|
|
32
39
|
/**
|
|
33
40
|
* Plain JSON-serializable snapshot of the per-file Kotlin capture-time
|
|
34
41
|
* side-channel. Carried opaquely on `ParsedFile.captureSideChannel`. The
|
|
@@ -39,10 +46,17 @@ export interface KotlinCaptureSideChannel {
|
|
|
39
46
|
readonly kind: 'kotlin';
|
|
40
47
|
/** Companion-object scope ids recorded for this file. */
|
|
41
48
|
readonly companionScopes: readonly ScopeId[];
|
|
49
|
+
/** Package visibility captured from the existing Kotlin AST. */
|
|
50
|
+
readonly packageFact: JvmPackageFact;
|
|
51
|
+
/** Class annotation syntax collected by the existing scope traversal. */
|
|
52
|
+
readonly classAnnotations: readonly ClassAnnotationFact[];
|
|
42
53
|
}
|
|
54
|
+
export declare function clearKotlinClassAnnotationFacts(): void;
|
|
55
|
+
export declare function setKotlinClassAnnotationFacts(filePath: string, facts: readonly ClassAnnotationFact[]): void;
|
|
56
|
+
export declare function getKotlinClassAnnotationFacts(filePath: string): readonly ClassAnnotationFact[];
|
|
43
57
|
/**
|
|
44
58
|
* `LanguageProvider.collectCaptureSideChannel` implementation for Kotlin.
|
|
45
|
-
* Returns `undefined` when this file recorded no
|
|
59
|
+
* Returns `undefined` when this file recorded no side-channel state at all, so
|
|
46
60
|
* the produced `ParsedFile` carries the field only when there's data to ship.
|
|
47
61
|
*/
|
|
48
62
|
export declare function collectKotlinCaptureSideChannel(filePath: string): KotlinCaptureSideChannel | undefined;
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* - `companionScopesByFile` (companion-scopes.ts) — the `ScopeId`s that came
|
|
8
8
|
* from a `companion_object` AST node, recorded via `markCompanionScope`
|
|
9
9
|
* from the `@scope.companion` marker capture.
|
|
10
|
+
* - Spring Bean class-annotation facts collected during the same scope-query
|
|
11
|
+
* traversal, consumed only after imports and package visibility finalize.
|
|
12
|
+
* - A JVM package fact read from the already-parsed root, so package-sibling
|
|
13
|
+
* visibility never re-parses Kotlin source on the main thread.
|
|
10
14
|
*
|
|
11
15
|
* On the worker path that map is filled in the WORKER process and lost across
|
|
12
16
|
* the worker→main MessageChannel (and the disk-backed parsedfile-store),
|
|
@@ -25,20 +29,42 @@
|
|
|
25
29
|
* The single generic `ParsedFile.captureSideChannel` field is shared with C++,
|
|
26
30
|
* which is safe because each file is one language (a `.kt` file uses the kotlin
|
|
27
31
|
* provider, a `.cpp` file the cpp provider). The payload is self-describing
|
|
28
|
-
* (`{ kind: 'kotlin', companionScopes }`) so
|
|
29
|
-
* only restores kotlin state and ignores a
|
|
32
|
+
* (`{ kind: 'kotlin', companionScopes, packageFact, classAnnotations }`) so
|
|
33
|
+
* `applyKotlinCaptureSideChannel` only restores kotlin state and ignores a
|
|
34
|
+
* foreign-shaped snapshot.
|
|
30
35
|
*/
|
|
36
|
+
import { createClassAnnotationFactStore, } from '../../frameworks/spring/bean-candidates.js';
|
|
37
|
+
import { isJvmPackageFact, UNKNOWN_JVM_PACKAGE_FACT, } from '../jvm/package-facts.js';
|
|
31
38
|
import { getCompanionScopesForFile, markCompanionScope } from './companion-scopes.js';
|
|
39
|
+
import { getKotlinPackageFact, setKotlinPackageFact } from './package-facts.js';
|
|
40
|
+
const classAnnotations = createClassAnnotationFactStore();
|
|
41
|
+
export function clearKotlinClassAnnotationFacts() {
|
|
42
|
+
classAnnotations.clear();
|
|
43
|
+
}
|
|
44
|
+
export function setKotlinClassAnnotationFacts(filePath, facts) {
|
|
45
|
+
classAnnotations.set(filePath, facts);
|
|
46
|
+
}
|
|
47
|
+
export function getKotlinClassAnnotationFacts(filePath) {
|
|
48
|
+
return classAnnotations.get(filePath);
|
|
49
|
+
}
|
|
32
50
|
/**
|
|
33
51
|
* `LanguageProvider.collectCaptureSideChannel` implementation for Kotlin.
|
|
34
|
-
* Returns `undefined` when this file recorded no
|
|
52
|
+
* Returns `undefined` when this file recorded no side-channel state at all, so
|
|
35
53
|
* the produced `ParsedFile` carries the field only when there's data to ship.
|
|
36
54
|
*/
|
|
37
55
|
export function collectKotlinCaptureSideChannel(filePath) {
|
|
38
56
|
const companionScopes = getCompanionScopesForFile(filePath);
|
|
39
|
-
|
|
57
|
+
const annotationFacts = classAnnotations.get(filePath);
|
|
58
|
+
const packageFact = getKotlinPackageFact(filePath);
|
|
59
|
+
if (companionScopes.length === 0 && annotationFacts.length === 0 && packageFact === undefined) {
|
|
40
60
|
return undefined;
|
|
41
|
-
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
kind: 'kotlin',
|
|
64
|
+
companionScopes,
|
|
65
|
+
packageFact: packageFact ?? UNKNOWN_JVM_PACKAGE_FACT,
|
|
66
|
+
classAnnotations: annotationFacts,
|
|
67
|
+
};
|
|
42
68
|
}
|
|
43
69
|
/**
|
|
44
70
|
* `ScopeResolver.applyCaptureSideChannel` implementation for Kotlin. Reads the
|
|
@@ -50,11 +76,19 @@ export function collectKotlinCaptureSideChannel(filePath) {
|
|
|
50
76
|
*/
|
|
51
77
|
export function applyKotlinCaptureSideChannel(parsed) {
|
|
52
78
|
const data = parsed.captureSideChannel;
|
|
53
|
-
if (data === undefined ||
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
if (data === undefined ||
|
|
80
|
+
data === null ||
|
|
81
|
+
typeof data !== 'object' ||
|
|
82
|
+
data.kind !== 'kotlin' ||
|
|
83
|
+
!Array.isArray(data.companionScopes) ||
|
|
84
|
+
!Array.isArray(data.classAnnotations)) {
|
|
85
|
+
classAnnotations.set(parsed.filePath, []);
|
|
86
|
+
setKotlinPackageFact(parsed.filePath, UNKNOWN_JVM_PACKAGE_FACT);
|
|
56
87
|
return;
|
|
88
|
+
}
|
|
57
89
|
for (const scopeId of data.companionScopes) {
|
|
58
90
|
markCompanionScope(parsed.filePath, scopeId);
|
|
59
91
|
}
|
|
92
|
+
classAnnotations.set(parsed.filePath, data.classAnnotations);
|
|
93
|
+
setKotlinPackageFact(parsed.filePath, isJvmPackageFact(data.packageFact) ? data.packageFact : UNKNOWN_JVM_PACKAGE_FACT);
|
|
60
94
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { makeScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import { materializeClassAnnotationFacts, recordClassAnnotationCapture, } from '../../frameworks/spring/bean-candidates.js';
|
|
2
3
|
import { nodeIfType, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
|
|
3
4
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
4
5
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
@@ -9,7 +10,45 @@ import { normalizeKotlinType } from './interpret.js';
|
|
|
9
10
|
import { synthesizeKotlinReceiverBinding } from './receiver-binding.js';
|
|
10
11
|
import { getKotlinParser, getKotlinScopeQuery } from './query.js';
|
|
11
12
|
import { markCompanionScope } from './companion-scopes.js';
|
|
13
|
+
import { setKotlinClassAnnotationFacts } from './capture-side-channel.js';
|
|
14
|
+
import { captureKotlinPackageFact } from './package-facts.js';
|
|
15
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
12
16
|
const FUNCTION_DECL_TAGS = ['@declaration.function'];
|
|
17
|
+
const KOTLIN_CALLABLE_CAPTURE_OPTIONS = {
|
|
18
|
+
functionNodeTypes: new Set(['function_declaration', 'anonymous_function', 'lambda_literal']),
|
|
19
|
+
callNodeTypes: new Set(['call_expression']),
|
|
20
|
+
parameterListNodeTypes: new Set(['function_value_parameters', 'value_arguments']),
|
|
21
|
+
parameterNodeTypes: new Set(['parameter']),
|
|
22
|
+
bindingNodeTypes: new Set(['property_declaration']),
|
|
23
|
+
assignmentNodeTypes: new Set(['assignment']),
|
|
24
|
+
identifierNodeTypes: new Set(['simple_identifier', 'type_identifier']),
|
|
25
|
+
callableReferenceNodeTypes: new Set(['callable_reference']),
|
|
26
|
+
callableProtocolMethods: new Set(['invoke']),
|
|
27
|
+
functionName: (node) => node.namedChildren.find((child) => child !== null && child.type === 'simple_identifier')?.text,
|
|
28
|
+
extractAssignment: (node) => {
|
|
29
|
+
// tree-sitter-kotlin's `assignment` node is FIELDLESS (positional
|
|
30
|
+
// `directly_assignable_expression` then the value), so the shared
|
|
31
|
+
// field-based fallback returned nothing and nested reassignments
|
|
32
|
+
// (`chosen = ::target` inside a block) never produced flow facts
|
|
33
|
+
// (#2522 review, shallow-coverage gap).
|
|
34
|
+
if (node.type === 'assignment') {
|
|
35
|
+
const named = node.namedChildren.filter((child) => child !== null);
|
|
36
|
+
if (named.length < 2)
|
|
37
|
+
return undefined;
|
|
38
|
+
return { destination: named[0], source: named[named.length - 1] };
|
|
39
|
+
}
|
|
40
|
+
if (node.type !== 'property_declaration')
|
|
41
|
+
return undefined;
|
|
42
|
+
if (!node.children.some((child) => child.text === '='))
|
|
43
|
+
return undefined;
|
|
44
|
+
const destination = node.namedChildren.find((child) => child !== null && child.type === 'variable_declaration');
|
|
45
|
+
const source = [...node.namedChildren]
|
|
46
|
+
.reverse()
|
|
47
|
+
.find((child) => child !== null && child.id !== destination?.id && child.type !== 'binding_pattern_kind');
|
|
48
|
+
return destination === undefined || source === undefined ? undefined : { destination, source };
|
|
49
|
+
},
|
|
50
|
+
normalizeQualifiedName: (raw) => raw.replaceAll('::', '.'),
|
|
51
|
+
};
|
|
13
52
|
export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
|
|
14
53
|
let tree = cachedTree;
|
|
15
54
|
if (tree === undefined) {
|
|
@@ -21,7 +60,9 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
|
|
|
21
60
|
else {
|
|
22
61
|
recordKotlinCacheHit();
|
|
23
62
|
}
|
|
63
|
+
captureKotlinPackageFact(filePath, tree.rootNode);
|
|
24
64
|
const out = [];
|
|
65
|
+
const classAnnotations = new Map();
|
|
25
66
|
const returnTypes = collectKotlinReturnTypeTexts(tree.rootNode);
|
|
26
67
|
out.push(...synthesizeKotlinLocalAssignmentBindings(tree.rootNode, returnTypes));
|
|
27
68
|
out.push(...synthesizeKotlinLoopBindings(tree.rootNode, returnTypes));
|
|
@@ -44,6 +85,15 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
|
|
|
44
85
|
}
|
|
45
86
|
if (Object.keys(grouped).length === 0)
|
|
46
87
|
continue;
|
|
88
|
+
const annotatedClass = grouped['@class-annotation.class'];
|
|
89
|
+
const annotationName = grouped['@class-annotation.name'];
|
|
90
|
+
if (annotatedClass !== undefined && annotationName !== undefined) {
|
|
91
|
+
const classNode = nodeIfType(groupedNodes['@class-annotation.class'], 'class_declaration');
|
|
92
|
+
if (classNode !== null && isKotlinBeanCandidateClass(classNode)) {
|
|
93
|
+
recordClassAnnotationCapture(classAnnotations, filePath, annotatedClass, annotationName.text);
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
47
97
|
// Companion-object marker (#1756 / U4). The `@scope.companion`
|
|
48
98
|
// capture is a side-channel marker — it shares its range with the
|
|
49
99
|
// existing `(companion_object) @scope.class` rule, so the Class
|
|
@@ -176,8 +226,17 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
|
|
|
176
226
|
if (extensionFallback !== null)
|
|
177
227
|
out.push(extensionFallback);
|
|
178
228
|
}
|
|
229
|
+
setKotlinClassAnnotationFacts(filePath, materializeClassAnnotationFacts(classAnnotations));
|
|
230
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, KOTLIN_CALLABLE_CAPTURE_OPTIONS));
|
|
179
231
|
return out;
|
|
180
232
|
}
|
|
233
|
+
function isKotlinBeanCandidateClass(classNode) {
|
|
234
|
+
if (classNode.children.some((child) => child.type === 'interface' || child.type === 'enum')) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
const modifiers = classNode.namedChildren.find((child) => child.type === 'modifiers');
|
|
238
|
+
return !modifiers?.namedChildren.some((child) => child.type === 'class_modifier' && child.text.trim() === 'annotation');
|
|
239
|
+
}
|
|
181
240
|
/**
|
|
182
241
|
* Synthesize `@reference.inherits` captures from Kotlin `class_declaration`
|
|
183
242
|
* delegation specifiers so the registry-primary scope-resolution path emits
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type JvmPackageFact, type JvmPackageSyntaxNode } from '../jvm/package-facts.js';
|
|
2
|
+
export declare const clearKotlinPackageFacts: () => void;
|
|
3
|
+
export declare const captureKotlinPackageFact: (filePath: string, root: JvmPackageSyntaxNode) => void;
|
|
4
|
+
export declare const setKotlinPackageFact: (filePath: string, fact: JvmPackageFact) => void;
|
|
5
|
+
export declare const getKotlinPackageFact: (filePath: string) => JvmPackageFact | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createJvmPackageFactStore, } from '../jvm/package-facts.js';
|
|
2
|
+
const kotlinPackageFacts = createJvmPackageFactStore({
|
|
3
|
+
packageNodeType: 'package_header',
|
|
4
|
+
packageNameNodeTypes: ['identifier'],
|
|
5
|
+
});
|
|
6
|
+
export const clearKotlinPackageFacts = () => kotlinPackageFacts.clear();
|
|
7
|
+
export const captureKotlinPackageFact = (filePath, root) => kotlinPackageFacts.capture(filePath, root);
|
|
8
|
+
export const setKotlinPackageFact = (filePath, fact) => kotlinPackageFacts.set(filePath, fact);
|
|
9
|
+
export const getKotlinPackageFact = (filePath) => kotlinPackageFacts.get(filePath);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const populateKotlinPackageSiblings: (parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes, ctx: {
|
|
2
|
+
readonly fileContents: ReadonlyMap<string, string>;
|
|
3
|
+
}) => void;
|
|
4
|
+
export declare const isKotlinPackageSiblingVisibilityIncomplete: (filePath: string) => boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createJvmPackageSiblingVisibility } from '../jvm/package-siblings.js';
|
|
2
|
+
import { getKotlinPackageFact } from './package-facts.js';
|
|
3
|
+
const kotlinPackageSiblingVisibility = createJvmPackageSiblingVisibility({
|
|
4
|
+
languageLabel: 'kotlin',
|
|
5
|
+
getPackageFact: getKotlinPackageFact,
|
|
6
|
+
});
|
|
7
|
+
export const populateKotlinPackageSiblings = kotlinPackageSiblingVisibility.populateNamespaceSiblings;
|
|
8
|
+
export const isKotlinPackageSiblingVisibilityIncomplete = kotlinPackageSiblingVisibility.isVisibilityIncomplete;
|
|
@@ -15,6 +15,12 @@ const KOTLIN_SCOPE_QUERY = `
|
|
|
15
15
|
(class_declaration) @scope.class
|
|
16
16
|
(object_declaration) @scope.class
|
|
17
17
|
(companion_object) @scope.class
|
|
18
|
+
;; Anonymous object expression: \`val h = object { fun fetch() {} }\`
|
|
19
|
+
;; (distinct from the named \`object_declaration\`/\`companion_object\` above).
|
|
20
|
+
;; Without its own scope, a method's auto-hoist (scope-extractor.ts) has
|
|
21
|
+
;; nowhere to stop and leaks the name past the literal into the enclosing
|
|
22
|
+
;; scope -- the same failure mode fixed for TS/JS object literals (#2545).
|
|
23
|
+
(object_literal) @scope.class
|
|
18
24
|
(function_declaration) @scope.function
|
|
19
25
|
|
|
20
26
|
;; Secondary-constructor body scope (issue #1919 review CF1). A
|
|
@@ -91,6 +97,19 @@ const KOTLIN_SCOPE_QUERY = `
|
|
|
91
97
|
(type_alias
|
|
92
98
|
(type_identifier) @declaration.name) @declaration.type_alias
|
|
93
99
|
|
|
100
|
+
;; Class annotation syntax is carried to post-resolution enrichment. Keeping
|
|
101
|
+
;; this in the existing scope query avoids a second AST traversal. Eligibility
|
|
102
|
+
;; filtering (class vs interface/enum/annotation class) happens in captures.ts.
|
|
103
|
+
(class_declaration
|
|
104
|
+
(modifiers
|
|
105
|
+
[
|
|
106
|
+
(annotation
|
|
107
|
+
(user_type) @class-annotation.name)
|
|
108
|
+
(annotation
|
|
109
|
+
(constructor_invocation
|
|
110
|
+
(user_type) @class-annotation.name))
|
|
111
|
+
])) @class-annotation.class
|
|
112
|
+
|
|
94
113
|
;; Declarations — functions / methods / properties
|
|
95
114
|
(function_declaration
|
|
96
115
|
(simple_identifier) @declaration.name) @declaration.function
|
|
@@ -5,8 +5,11 @@ import { isClassLike } from '../../scope-resolution/scope/walkers.js';
|
|
|
5
5
|
import { kotlinProvider } from '../kotlin.js';
|
|
6
6
|
import { kotlinArityCompatibility, kotlinMergeBindings, populateKotlinOwners, resolveKotlinImportTarget, } from './index.js';
|
|
7
7
|
import { clearCompanionScopes } from './companion-scopes.js';
|
|
8
|
-
import { applyKotlinCaptureSideChannel } from './capture-side-channel.js';
|
|
8
|
+
import { applyKotlinCaptureSideChannel, clearKotlinClassAnnotationFacts, } from './capture-side-channel.js';
|
|
9
9
|
import { isKotlinStaticOnly } from './owners.js';
|
|
10
|
+
import { populateKotlinPackageSiblings } from './package-siblings.js';
|
|
11
|
+
import { attachKotlinSpringBeanCandidateMetadata } from './spring-bean-metadata.js';
|
|
12
|
+
import { clearKotlinPackageFacts } from './package-facts.js';
|
|
10
13
|
/**
|
|
11
14
|
* Kotlin scope resolver for RFC #909 Ring 3.
|
|
12
15
|
*
|
|
@@ -57,6 +60,8 @@ export const kotlinScopeResolver = {
|
|
|
57
60
|
// `undefined` because Kotlin has no external resolution config
|
|
58
61
|
// to load.
|
|
59
62
|
clearCompanionScopes();
|
|
63
|
+
clearKotlinClassAnnotationFacts();
|
|
64
|
+
clearKotlinPackageFacts();
|
|
60
65
|
return undefined;
|
|
61
66
|
},
|
|
62
67
|
resolveImportTarget: (targetRaw, fromFile, allFilePaths) => {
|
|
@@ -89,6 +94,9 @@ export const kotlinScopeResolver = {
|
|
|
89
94
|
propagatesReturnTypesAcrossImports: true,
|
|
90
95
|
collapseMemberCallsByCallerTarget: false,
|
|
91
96
|
hoistTypeBindingsToModule: true,
|
|
97
|
+
postExtractSourceTextPolicy: 'uncached-files',
|
|
98
|
+
populateNamespaceSiblings: populateKotlinPackageSiblings,
|
|
99
|
+
emitPostResolutionEdges: attachKotlinSpringBeanCandidateMetadata,
|
|
92
100
|
};
|
|
93
101
|
/**
|
|
94
102
|
* Kotlin MRO builder — extends `defaultLinearize` (EXTENDS-only) with
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/** Kotlin wiring for the language-neutral Spring candidate engine. */
|
|
2
|
+
export declare const attachKotlinSpringBeanCandidateMetadata: (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 { getKotlinClassAnnotationFacts } from './capture-side-channel.js';
|
|
3
|
+
import { isKotlinPackageSiblingVisibilityIncomplete } from './package-siblings.js';
|
|
4
|
+
/** Kotlin wiring for the language-neutral Spring candidate engine. */
|
|
5
|
+
export const attachKotlinSpringBeanCandidateMetadata = createSpringBeanCandidateAttacher({
|
|
6
|
+
getClassAnnotationFacts: getKotlinClassAnnotationFacts,
|
|
7
|
+
isPackageVisibilityIncomplete: isKotlinPackageSiblingVisibilityIncomplete,
|
|
8
|
+
});
|
|
@@ -167,12 +167,11 @@ export const kotlinProvider = defineLanguage({
|
|
|
167
167
|
emitScopeCaptures: emitKotlinScopeCaptures,
|
|
168
168
|
// ── #2195 PDG layer: Kotlin CFG visitor (vendored grammar) ──
|
|
169
169
|
cfgVisitor: createKotlinCfgVisitor(),
|
|
170
|
-
// Worker-side: snapshot
|
|
171
|
-
// `emitKotlinScopeCaptures` just populated
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
// edges on the worker path. See `kotlin/capture-side-channel.ts`.
|
|
170
|
+
// Worker-side: snapshot companion-scope marks, package visibility, and
|
|
171
|
+
// class-annotation facts `emitKotlinScopeCaptures` just populated into plain
|
|
172
|
+
// data on `ParsedFile.captureSideChannel`, so the main thread can restore all
|
|
173
|
+
// three via `applyCaptureSideChannel` WITHOUT a re-parse (#1983). See
|
|
174
|
+
// `kotlin/capture-side-channel.ts`.
|
|
176
175
|
// `assertCloneable` is a runtime identity; it makes a future non-serializable
|
|
177
176
|
// value in the side-channel payload a compile error here, at the source, rather
|
|
178
177
|
// than a DataCloneError at the worker boundary (#2143).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const moveProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Move Language Provider (stub).
|
|
3
|
+
*
|
|
4
|
+
* Move/Aptos is ingested compiler-first via the move-flow MCP server in the
|
|
5
|
+
* `moveIngest` phase — GitNexus never tree-sits or regex-scans Move source.
|
|
6
|
+
* This provider exists only to satisfy the exhaustive `SupportedLanguages`
|
|
7
|
+
* provider table; it declares no extensions, so `.move` files are never routed
|
|
8
|
+
* through the generic tree-sitter / scope-resolution pipeline (the `parse`
|
|
9
|
+
* phase additionally excludes every file ingested by `moveIngest`).
|
|
10
|
+
*/
|
|
11
|
+
import { SupportedLanguages } from '../../../_shared/index.js';
|
|
12
|
+
import { defineLanguage } from '../language-provider.js';
|
|
13
|
+
export const moveProvider = defineLanguage({
|
|
14
|
+
id: SupportedLanguages.Move,
|
|
15
|
+
parseStrategy: 'standalone',
|
|
16
|
+
extensions: [], // .move files are handled by the moveIngest phase, not here
|
|
17
|
+
entryPointPatterns: [],
|
|
18
|
+
astFrameworkPatterns: [],
|
|
19
|
+
treeSitterQueries: '',
|
|
20
|
+
typeConfig: {
|
|
21
|
+
declarationNodeTypes: new Set(),
|
|
22
|
+
extractDeclaration: () => null,
|
|
23
|
+
extractParameter: () => null,
|
|
24
|
+
},
|
|
25
|
+
exportChecker: () => false,
|
|
26
|
+
importResolver: () => null,
|
|
27
|
+
});
|
|
@@ -38,6 +38,36 @@ import { getPhpParser, getPhpScopeQuery } from './query.js';
|
|
|
38
38
|
import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
|
|
39
39
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
40
40
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
41
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
42
|
+
const PHP_CALLABLE_CAPTURE_OPTIONS = {
|
|
43
|
+
functionNodeTypes: new Set([
|
|
44
|
+
'function_definition',
|
|
45
|
+
'method_declaration',
|
|
46
|
+
'anonymous_function',
|
|
47
|
+
'arrow_function',
|
|
48
|
+
]),
|
|
49
|
+
callNodeTypes: new Set(['function_call_expression']),
|
|
50
|
+
parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
|
|
51
|
+
// tree-sitter-php has no 'optional_parameter' node (defaults ride on
|
|
52
|
+
// simple_parameter); property promotion is constructor-only and carries no
|
|
53
|
+
// callable-flow value (#2522 review).
|
|
54
|
+
parameterNodeTypes: new Set(['simple_parameter', 'variadic_parameter']),
|
|
55
|
+
bindingNodeTypes: new Set(['assignment_expression']),
|
|
56
|
+
assignmentNodeTypes: new Set(['assignment_expression']),
|
|
57
|
+
identifierNodeTypes: new Set(['name', 'qualified_name', 'namespace_name']),
|
|
58
|
+
functionScopedValueBindings: true,
|
|
59
|
+
emitCanonicalInvokeReference: true,
|
|
60
|
+
extractCallableReference: (node) => {
|
|
61
|
+
if (node.type !== 'function_call_expression')
|
|
62
|
+
return undefined;
|
|
63
|
+
const args = node.childForFieldName('arguments');
|
|
64
|
+
const isFirstClass = args?.namedChildren.some((child) => child !== null && child.type === 'variadic_placeholder') === true;
|
|
65
|
+
const target = node.childForFieldName('function');
|
|
66
|
+
if (!isFirstClass || target === null || target.type === 'variable_name')
|
|
67
|
+
return undefined;
|
|
68
|
+
return { name: target.text.replace(/^\\+/, ''), anchor: target };
|
|
69
|
+
},
|
|
70
|
+
};
|
|
41
71
|
/** Declaration anchors that carry function-like arity metadata. */
|
|
42
72
|
const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.function'];
|
|
43
73
|
/** tree-sitter-php node types that the method extractor accepts. */
|
|
@@ -220,6 +250,15 @@ export function emitPhpScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
220
250
|
// the backing `arguments` node. Mirrors C#'s pattern (csharp/captures.ts
|
|
221
251
|
// lines 149-186). PHP needs this for arity-based dispatch (Cluster H).
|
|
222
252
|
const callTag = ['@reference.call.free', '@reference.call.member', '@reference.call.constructor'].find((t) => grouped[t] !== undefined);
|
|
253
|
+
if (callTag !== undefined) {
|
|
254
|
+
const possibleFirstClass = nodeIfType(nodeMap[callTag], 'function_call_expression');
|
|
255
|
+
const argumentsNode = possibleFirstClass?.childForFieldName('arguments');
|
|
256
|
+
if (argumentsNode?.namedChildren.some((child) => child !== null && child.type === 'variadic_placeholder') === true) {
|
|
257
|
+
// PHP 8.1 `target(...)` creates a Closure; it does not invoke target.
|
|
258
|
+
// Callable-flow synthesis below owns this site as a seed.
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
223
262
|
if (callTag !== undefined && grouped['@reference.arity'] === undefined) {
|
|
224
263
|
const callNode = nodeIfType(nodeMap[callTag], 'function_call_expression', 'member_call_expression', 'nullsafe_member_call_expression', 'scoped_call_expression', 'object_creation_expression');
|
|
225
264
|
if (callNode !== null) {
|
|
@@ -242,6 +281,7 @@ export function emitPhpScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
242
281
|
out.push(grouped);
|
|
243
282
|
}
|
|
244
283
|
out.push(...synthesizePhpInheritanceReferences(tree.rootNode));
|
|
284
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, PHP_CALLABLE_CAPTURE_OPTIONS));
|
|
245
285
|
return out;
|
|
246
286
|
}
|
|
247
287
|
// ─── PHP inheritance synthesis ───────────────────────────────────────────────
|