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
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
const REF_PREFIX_RE = /^&\s*(mut\s+)?/;
|
|
2
2
|
const PTR_PREFIX_RE = /^\*\s*(const|mut)?\s*/;
|
|
3
|
+
const DYN_PREFIX_RE = /^dyn\s+/;
|
|
3
4
|
const ENUM_VARIANT_NAMES = new Set(['Some', 'None', 'Ok', 'Err']);
|
|
5
|
+
// `dyn Trait`, `&dyn Trait`, `Box<dyn Trait>` all name a trait object whose
|
|
6
|
+
// receiver-dispatch target is the trait itself (#2604) — strip the `dyn`
|
|
7
|
+
// keyword and any auto-trait/lifetime bound list (`dyn Trait + Send`) down to
|
|
8
|
+
// the principal trait name. Reference/pointer sigils are stripped by the
|
|
9
|
+
// caller first; wrapper unwrapping (Box<T> etc.) runs before this so the
|
|
10
|
+
// unwrapped inner text still gets the same treatment.
|
|
11
|
+
function stripDynBound(t) {
|
|
12
|
+
if (!DYN_PREFIX_RE.test(t))
|
|
13
|
+
return t;
|
|
14
|
+
t = t.replace(DYN_PREFIX_RE, '');
|
|
15
|
+
const plus = t.indexOf('+');
|
|
16
|
+
if (plus !== -1)
|
|
17
|
+
t = t.slice(0, plus);
|
|
18
|
+
return t.trim();
|
|
19
|
+
}
|
|
4
20
|
// ─── interpretImport ──────────────────────────────────────────────────────
|
|
5
21
|
export function interpretRustImport(captures) {
|
|
6
22
|
const kind = captures['@import.kind']?.text;
|
|
@@ -104,6 +120,7 @@ export function normalizeRustTypeName(text) {
|
|
|
104
120
|
if (inner !== null)
|
|
105
121
|
t = inner;
|
|
106
122
|
}
|
|
123
|
+
t = stripDynBound(t);
|
|
107
124
|
const bracket = t.indexOf('<');
|
|
108
125
|
if (bracket !== -1)
|
|
109
126
|
t = t.slice(0, bracket);
|
|
@@ -168,6 +185,7 @@ function normalizeRustReturnType(text) {
|
|
|
168
185
|
}
|
|
169
186
|
}
|
|
170
187
|
}
|
|
188
|
+
t = stripDynBound(t);
|
|
171
189
|
const bracket = t.indexOf('<');
|
|
172
190
|
if (bracket !== -1)
|
|
173
191
|
t = t.slice(0, bracket);
|
|
@@ -9,6 +9,7 @@ const RUST_SCOPE_QUERY = `
|
|
|
9
9
|
(enum_item) @scope.class
|
|
10
10
|
(union_item) @scope.class
|
|
11
11
|
(function_item) @scope.function
|
|
12
|
+
(function_signature_item) @scope.function
|
|
12
13
|
(closure_expression) @scope.function
|
|
13
14
|
(block) @scope.block
|
|
14
15
|
(if_expression) @scope.block
|
|
@@ -54,6 +55,14 @@ const RUST_SCOPE_QUERY = `
|
|
|
54
55
|
(function_item
|
|
55
56
|
name: (identifier) @declaration.name) @declaration.function
|
|
56
57
|
|
|
58
|
+
;; Declarations — trait method signature (required method, no body,
|
|
59
|
+
;; e.g. fn foo(self) -> T; inside a trait body). Without this, an abstract
|
|
60
|
+
;; trait method is invisible to scope resolution — never owned by its
|
|
61
|
+
;; trait's Class scope, so a dyn Trait receiver can never dispatch to
|
|
62
|
+
;; it (#2604).
|
|
63
|
+
(function_signature_item
|
|
64
|
+
name: (identifier) @declaration.name) @declaration.function
|
|
65
|
+
|
|
57
66
|
;; Declarations — struct fields
|
|
58
67
|
(field_declaration
|
|
59
68
|
name: (field_identifier) @declaration.name
|
|
@@ -75,6 +75,12 @@ export function populateRustRangeBindings(parsedFiles, _indexes, ctx) {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
// Publish per-type member bindings for the whole workspace before resolving
|
|
79
|
+
// assignments. Otherwise an importer processed before its defining file can
|
|
80
|
+
// miss a field or identity-method type solely because of file order.
|
|
81
|
+
const scopeMap = new Map(parsed.scopes.map((scope) => [scope.id, scope]));
|
|
82
|
+
processFieldTypeBindings(tree.rootNode, parsed, scopeMap);
|
|
83
|
+
processIdentityMethodBindings(parsed);
|
|
78
84
|
}
|
|
79
85
|
for (const parsed of parsedFiles) {
|
|
80
86
|
const sourceText = ctx.fileContents.get(parsed.filePath);
|
|
@@ -103,8 +109,6 @@ export function populateRustRangeBindings(parsedFiles, _indexes, ctx) {
|
|
|
103
109
|
const moduleScope = parsed.scopes.find((s) => s.kind === 'Module');
|
|
104
110
|
if (moduleScope === undefined)
|
|
105
111
|
continue;
|
|
106
|
-
processFieldTypeBindings(tree.rootNode, parsed, scopeMap);
|
|
107
|
-
processIdentityMethodBindings(parsed);
|
|
108
112
|
processForLoops(tree.rootNode, parsed, scopeMap, moduleScope, allReturnTypes);
|
|
109
113
|
processPatternBindings(tree.rootNode, parsed, scopeMap, moduleScope);
|
|
110
114
|
processStructDestructuring(tree.rootNode, parsed, scopeMap, moduleScope, allFieldTypes);
|
|
@@ -41,8 +41,19 @@ import { getSwiftParser, getSwiftScopeQuery } from './query.js';
|
|
|
41
41
|
import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
|
|
42
42
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
43
43
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
44
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
44
45
|
/** Declaration anchors that carry function-like arity metadata. */
|
|
45
46
|
const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.constructor'];
|
|
47
|
+
const SWIFT_CALLABLE_CAPTURE_OPTIONS = {
|
|
48
|
+
functionNodeTypes: new Set(['function_declaration', 'lambda_literal']),
|
|
49
|
+
callNodeTypes: new Set(['call_expression']),
|
|
50
|
+
parameterListNodeTypes: new Set(['value_arguments']),
|
|
51
|
+
parameterNodeTypes: new Set(['parameter']),
|
|
52
|
+
bindingNodeTypes: new Set(['property_declaration']),
|
|
53
|
+
assignmentNodeTypes: new Set(['assignment']),
|
|
54
|
+
identifierNodeTypes: new Set(['simple_identifier', 'type_identifier']),
|
|
55
|
+
extractFunctionParameters: (node) => node.namedChildren.filter((child) => child !== null && child.type === 'parameter'),
|
|
56
|
+
};
|
|
46
57
|
/** tree-sitter-swift node types that carry arity. */
|
|
47
58
|
const FUNCTION_NODE_TYPES = [
|
|
48
59
|
'function_declaration',
|
|
@@ -257,6 +268,7 @@ export function emitSwiftScopeCaptures(sourceText, _filePath, cachedTree) {
|
|
|
257
268
|
// legacy heritage-capture leg (removed in #942), which the worker pipeline
|
|
258
269
|
// drops for registry-primary languages (issue #1951).
|
|
259
270
|
out.push(...synthesizeSwiftInheritanceReferences(tree.rootNode));
|
|
271
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, SWIFT_CALLABLE_CAPTURE_OPTIONS));
|
|
260
272
|
return out;
|
|
261
273
|
}
|
|
262
274
|
/**
|
|
@@ -33,6 +33,7 @@ import { computeTsArityMetadata } from './arity-metadata.js';
|
|
|
33
33
|
import { isArrayMethodCallbackArrow } from './array-callback.js';
|
|
34
34
|
import { getTreeSitterBufferSize } from '../../constants.js';
|
|
35
35
|
import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
|
|
36
|
+
import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
|
|
36
37
|
import { deriveDefaultExportHocName, isBlockedDefaultExportHoc, isDefaultExportHocFunctionNode, } from '../../ts-js-hoc-utils.js';
|
|
37
38
|
/** tree-sitter-typescript node types for function-like scopes that may
|
|
38
39
|
* carry a synthesized `this` binding. Kept in sync with the
|
|
@@ -55,6 +56,25 @@ const CALL_TAGS = [
|
|
|
55
56
|
'@reference.call.member',
|
|
56
57
|
'@reference.call.constructor',
|
|
57
58
|
];
|
|
59
|
+
const TS_CALLABLE_CAPTURE_OPTIONS = {
|
|
60
|
+
functionNodeTypes: new Set(FUNCTION_NODE_TYPES),
|
|
61
|
+
callNodeTypes: new Set(['call_expression']),
|
|
62
|
+
parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
|
|
63
|
+
parameterNodeTypes: new Set([
|
|
64
|
+
'required_parameter',
|
|
65
|
+
'optional_parameter',
|
|
66
|
+
'rest_pattern',
|
|
67
|
+
'identifier',
|
|
68
|
+
]),
|
|
69
|
+
bindingNodeTypes: new Set(['variable_declarator']),
|
|
70
|
+
assignmentNodeTypes: new Set(['assignment_expression', 'augmented_assignment_expression']),
|
|
71
|
+
identifierNodeTypes: new Set([
|
|
72
|
+
'identifier',
|
|
73
|
+
'property_identifier',
|
|
74
|
+
'shorthand_property_identifier_pattern',
|
|
75
|
+
'private_property_identifier',
|
|
76
|
+
]),
|
|
77
|
+
};
|
|
58
78
|
function pickFirstCapture(grouped, tags) {
|
|
59
79
|
for (const tag of tags) {
|
|
60
80
|
const cap = grouped[tag];
|
|
@@ -344,6 +364,7 @@ export function emitTsScopeCaptures(sourceText, filePath, cachedTree) {
|
|
|
344
364
|
synthesizeForOfMapTupleBindings(tree.rootNode, out);
|
|
345
365
|
synthesizeInstanceofNarrowings(tree.rootNode, out);
|
|
346
366
|
synthesizeTsInheritanceReferences(tree.rootNode, out);
|
|
367
|
+
out.push(...synthesizeCallableFlowCaptures(tree.rootNode, TS_CALLABLE_CAPTURE_OPTIONS));
|
|
347
368
|
return out;
|
|
348
369
|
}
|
|
349
370
|
/**
|
|
@@ -202,7 +202,8 @@ function isProjectLocalPath(source) {
|
|
|
202
202
|
/** True when `absPath` is `repoRoot` itself or lives beneath it. */
|
|
203
203
|
function isWithinRepo(repoRoot, absPath) {
|
|
204
204
|
const root = path.resolve(repoRoot);
|
|
205
|
-
|
|
205
|
+
const safeRoot = root.endsWith(path.sep) ? root : root + path.sep;
|
|
206
|
+
return absPath === root || absPath.startsWith(safeRoot);
|
|
206
207
|
}
|
|
207
208
|
async function resolveExtension(base) {
|
|
208
209
|
const directFile = await firstExistingFile([...FILE_EXTENSIONS.map((ext) => base + ext), base]);
|
|
@@ -96,6 +96,23 @@ const TYPESCRIPT_SCOPE_QUERY = `
|
|
|
96
96
|
(arrow_function) @scope.function
|
|
97
97
|
(function_expression) @scope.function
|
|
98
98
|
|
|
99
|
+
;; Object literals (the { ... } value expression, NOT object_type or
|
|
100
|
+
;; object_pattern) get their own scope boundary. Without it, a
|
|
101
|
+
;; method_definition/property-arrow's auto-hoist (scope-extractor.ts)
|
|
102
|
+
;; has nowhere to stop and leaks the name past the literal into whatever
|
|
103
|
+
;; lexically encloses it -- e.g. 'export default { async fetch(req) {} }'
|
|
104
|
+
;; would bind fetch at Module scope, letting an unrelated same-file
|
|
105
|
+
;; fetch(...) call (the platform global) incorrectly resolve to it
|
|
106
|
+
;; (#2545). Object (not Block or Class): object-literal members are
|
|
107
|
+
;; reachable only via property access, never as bare identifiers -- not
|
|
108
|
+
;; even by a SIBLING property's function body, unlike a real Block
|
|
109
|
+
;; (if/for/while, where a nested closure legitimately sees a sibling
|
|
110
|
+
;; let/const) or a Class (implicit-this sibling dispatch). Scope-chain
|
|
111
|
+
;; walkers (scope-resolution/scope/walkers.ts) skip an Object scope's
|
|
112
|
+
;; own bindings entirely while still treating it as a hoist boundary
|
|
113
|
+
;; (#2551).
|
|
114
|
+
(object) @scope.object
|
|
115
|
+
|
|
99
116
|
;; Type aliases that contain an object_type are structurally class-like —
|
|
100
117
|
;; they define a shape with named members. Emit @scope.class so the
|
|
101
118
|
;; field-extractor's type-alias-with-object-type handling (in
|
|
@@ -987,6 +1004,26 @@ const TYPESCRIPT_SCOPE_QUERY = `
|
|
|
987
1004
|
(member_expression
|
|
988
1005
|
object: (_) @reference.receiver
|
|
989
1006
|
property: (property_identifier) @reference.name) @reference.read.member
|
|
1007
|
+
|
|
1008
|
+
;; References — value position (#2437): a function identifier assigned as an
|
|
1009
|
+
;; object-literal property value (\`{ emitScopeCaptures: emitCppScopeCaptures }\`)
|
|
1010
|
+
;; or shorthand (\`{ emitHook }\`). Resolution keeps only callable targets
|
|
1011
|
+
;; (MethodRegistry), so plain-value pairs (\`{ port: DEFAULT_PORT }\`) emit
|
|
1012
|
+
;; nothing; the emitted edge is a reference-class USES (registration ≠
|
|
1013
|
+
;; invocation). \`@reference.property-key\` records the key so the
|
|
1014
|
+
;; property-dispatch pass can synthesize CALLS at \`x.<key>()\` sites; for
|
|
1015
|
+
;; shorthand the key IS the name (both tags on one node). Two separate
|
|
1016
|
+
;; patterns — never combined in \`[...]\` (tree-sitter 0.21 drops alternation
|
|
1017
|
+
;; siblings around predicates). Destructuring shorthand is a different node
|
|
1018
|
+
;; (\`shorthand_property_identifier_pattern\`), so \`const { a } = o\` cannot
|
|
1019
|
+
;; match; string/computed keys carry no \`property_identifier\` and register
|
|
1020
|
+
;; without a dispatch key.
|
|
1021
|
+
(pair
|
|
1022
|
+
key: (property_identifier) @reference.property-key
|
|
1023
|
+
value: (identifier) @reference.name @reference.value-ref)
|
|
1024
|
+
|
|
1025
|
+
(object
|
|
1026
|
+
(shorthand_property_identifier) @reference.name @reference.property-key @reference.value-ref)
|
|
990
1027
|
`;
|
|
991
1028
|
/**
|
|
992
1029
|
* JSX-only query suffix. Appended to the base query when compiling
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import { generateId } from '../../lib/utils.js';
|
|
10
|
+
import { toZeroBasedLine } from './utils/line-base.js';
|
|
10
11
|
const HEADING_RE = /^(#{1,6})\s+(.+)$/;
|
|
11
12
|
const LINK_RE = /\[([^\]]*)\]\(([^)]+)\)/g;
|
|
12
13
|
const MD_EXTENSIONS = new Set(['.md', '.mdx']);
|
|
@@ -59,8 +60,8 @@ export const processMarkdown = (graph, files, allPathSet) => {
|
|
|
59
60
|
properties: {
|
|
60
61
|
name: heading,
|
|
61
62
|
filePath: file.path,
|
|
62
|
-
startLine: lineNum,
|
|
63
|
-
endLine,
|
|
63
|
+
startLine: toZeroBasedLine(lineNum),
|
|
64
|
+
endLine: toZeroBasedLine(endLine),
|
|
64
65
|
level,
|
|
65
66
|
description: `h${level}`,
|
|
66
67
|
},
|
|
@@ -116,6 +116,7 @@ const LABEL_BEHAVIOR = {
|
|
|
116
116
|
Section: 'inert',
|
|
117
117
|
Route: 'inert',
|
|
118
118
|
Tool: 'inert',
|
|
119
|
+
EnumVariant: 'inert',
|
|
119
120
|
// Taint/PDG substrate (issue #2080) — a control-flow node, never a
|
|
120
121
|
// symbol-resolution target. Inert: file index only, no owner scope.
|
|
121
122
|
BasicBlock: 'inert',
|
|
@@ -3,7 +3,7 @@ import type { SymbolTableWriter } from './model/index.js';
|
|
|
3
3
|
import { type ExportedTypeMap } from './call-processor.js';
|
|
4
4
|
import type { ParsedFile } from '../../_shared/index.js';
|
|
5
5
|
import { WorkerPool } from './workers/worker-pool.js';
|
|
6
|
-
import type { ParseWorkerResult, ExtractedRoute, ExtractedFetchCall, ExtractedDecoratorRoute, ExtractedToolDef, FileScopeBindings, ExtractedORMQuery, FetchWrapperDef } from './workers/parse-worker.js';
|
|
6
|
+
import type { ParseWorkerResult, ExtractedRoute, ExtractedFetchCall, ExtractedDecoratorRoute, ExtractedModuleConstants, ExtractedToolDef, FileScopeBindings, ExtractedORMQuery, FetchWrapperDef } from './workers/parse-worker.js';
|
|
7
7
|
import type { ExtractedRouterConstructorPrefix, ExtractedRouterImport, ExtractedRouterInclude, ExtractedRouterModuleAlias } from './route-extractors/fastapi-router-bindings.js';
|
|
8
8
|
import type { SharedSpringType } from './route-extractors/spring-shared.js';
|
|
9
9
|
export type FileProgressCallback = (current: number, total: number, filePath: string) => void;
|
|
@@ -16,6 +16,8 @@ export interface WorkerExtractedData {
|
|
|
16
16
|
routerImports: ExtractedRouterImport[];
|
|
17
17
|
routerConstructorPrefixes: ExtractedRouterConstructorPrefix[];
|
|
18
18
|
routerModuleAliases: ExtractedRouterModuleAlias[];
|
|
19
|
+
/** Per-file Python module constants for cross-file route-path resolution (#2391). */
|
|
20
|
+
moduleConstants: ExtractedModuleConstants[];
|
|
19
21
|
toolDefs: ExtractedToolDef[];
|
|
20
22
|
ormQueries: ExtractedORMQuery[];
|
|
21
23
|
/** Project-wide Spring class/interface views for the #2288 inheritance pass. */
|
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { getLanguageFromFilename } from '../../_shared/index.js';
|
|
2
2
|
import { accumulateExportedTypesFromParsedNode } from './call-processor.js';
|
|
3
3
|
import { logger } from '../logger.js';
|
|
4
|
+
function compareText(left, right) {
|
|
5
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
6
|
+
}
|
|
7
|
+
function sourceLine(node) {
|
|
8
|
+
const value = node.properties.startLine;
|
|
9
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : Number.MAX_SAFE_INTEGER;
|
|
10
|
+
}
|
|
11
|
+
function compareParsedNodeSourceOrder(left, right) {
|
|
12
|
+
const leftPath = typeof left.properties.filePath === 'string' ? left.properties.filePath : '';
|
|
13
|
+
const rightPath = typeof right.properties.filePath === 'string' ? right.properties.filePath : '';
|
|
14
|
+
const fileOrder = compareText(leftPath, rightPath);
|
|
15
|
+
if (fileOrder !== 0)
|
|
16
|
+
return fileOrder;
|
|
17
|
+
const leftLine = sourceLine(left);
|
|
18
|
+
const rightLine = sourceLine(right);
|
|
19
|
+
if (leftLine !== rightLine)
|
|
20
|
+
return leftLine < rightLine ? -1 : 1;
|
|
21
|
+
return compareText(left.id, right.id);
|
|
22
|
+
}
|
|
23
|
+
function nodesInSourceOrder(nodes) {
|
|
24
|
+
for (let index = 1; index < nodes.length; index++) {
|
|
25
|
+
if (compareParsedNodeSourceOrder(nodes[index - 1], nodes[index]) > 0) {
|
|
26
|
+
return [...nodes].sort(compareParsedNodeSourceOrder);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return nodes;
|
|
30
|
+
}
|
|
4
31
|
// ============================================================================
|
|
5
32
|
// Worker-based parallel parsing
|
|
6
33
|
// ============================================================================
|
|
@@ -24,13 +51,18 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
|
|
|
24
51
|
const allRouterImports = [];
|
|
25
52
|
const allRouterConstructorPrefixes = [];
|
|
26
53
|
const allRouterModuleAliases = [];
|
|
54
|
+
const allModuleConstants = [];
|
|
27
55
|
const allSpringTypes = [];
|
|
28
56
|
const allToolDefs = [];
|
|
29
57
|
const allORMQueries = [];
|
|
30
58
|
const fileScopeBindingsByFile = [];
|
|
31
59
|
const allParsedFiles = [];
|
|
32
60
|
for (const result of chunkResults) {
|
|
33
|
-
|
|
61
|
+
// Worker jobs and input files are already merged in stable start-index/path
|
|
62
|
+
// order. Canonicalize the final per-result node boundary once so graph
|
|
63
|
+
// insertion, cache replay, and first-wins graph indexes share source order.
|
|
64
|
+
// The common already-ordered path stays allocation-free and linear.
|
|
65
|
+
for (const node of nodesInSourceOrder(result.nodes)) {
|
|
34
66
|
graph.addNode({
|
|
35
67
|
id: node.id,
|
|
36
68
|
label: node.label,
|
|
@@ -76,6 +108,8 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
|
|
|
76
108
|
}
|
|
77
109
|
for (const item of result.routerModuleAliases ?? [])
|
|
78
110
|
allRouterModuleAliases.push(item);
|
|
111
|
+
for (const item of result.moduleConstants ?? [])
|
|
112
|
+
allModuleConstants.push(item);
|
|
79
113
|
for (const item of result.springTypes ?? [])
|
|
80
114
|
allSpringTypes.push(item);
|
|
81
115
|
for (const item of result.toolDefs)
|
|
@@ -99,6 +133,7 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
|
|
|
99
133
|
routerImports: allRouterImports,
|
|
100
134
|
routerConstructorPrefixes: allRouterConstructorPrefixes,
|
|
101
135
|
routerModuleAliases: allRouterModuleAliases,
|
|
136
|
+
moduleConstants: allModuleConstants,
|
|
102
137
|
toolDefs: allToolDefs,
|
|
103
138
|
ormQueries: allORMQueries,
|
|
104
139
|
springTypes: allSpringTypes,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { scanPhase, type ScanOutput } from './scan.js';
|
|
8
8
|
export { structurePhase, type StructureOutput } from './structure.js';
|
|
9
|
+
export { emptyStandaloneIngestPhase, type StandaloneIngestOutput } from './standalone-ingest.js';
|
|
9
10
|
export { markdownPhase, type MarkdownOutput } from './markdown.js';
|
|
10
11
|
export { cobolPhase, type CobolOutput } from './cobol.js';
|
|
11
12
|
export { parsePhase, type ParseOutput } from './parse.js';
|
|
@@ -14,6 +15,7 @@ export { toolsPhase, type ToolsOutput, type ToolDef } from './tools.js';
|
|
|
14
15
|
export { ormPhase, type ORMOutput } from './orm.js';
|
|
15
16
|
export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
|
|
16
17
|
export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
|
|
18
|
+
export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
|
|
17
19
|
export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
|
|
18
20
|
export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
|
|
19
21
|
export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// ── Phase exports (in dependency order) ────────────────────────────────────
|
|
8
8
|
export { scanPhase } from './scan.js';
|
|
9
9
|
export { structurePhase } from './structure.js';
|
|
10
|
+
export { emptyStandaloneIngestPhase } from './standalone-ingest.js';
|
|
10
11
|
export { markdownPhase } from './markdown.js';
|
|
11
12
|
export { cobolPhase } from './cobol.js';
|
|
12
13
|
export { parsePhase } from './parse.js';
|
|
@@ -15,6 +16,7 @@ export { toolsPhase } from './tools.js';
|
|
|
15
16
|
export { ormPhase } from './orm.js';
|
|
16
17
|
export { crossFilePhase } from './cross-file.js';
|
|
17
18
|
export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
|
|
19
|
+
export { springConfigPhase } from './spring-config.js';
|
|
18
20
|
export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
|
|
19
21
|
export { taintSummariesPhase } from './taint-summaries.js';
|
|
20
22
|
export { callSummariesPhase } from './call-summaries.js';
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulator.js';
|
|
18
18
|
import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
|
|
19
19
|
import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
|
|
20
|
-
import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
|
|
20
|
+
import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
|
|
21
21
|
import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
|
|
22
22
|
import { processRoutesFromExtracted, resolveRouteHandlerSymbols, buildExportedTypeMapFromGraph, } from '../call-processor.js';
|
|
23
23
|
import { createSemanticModel } from '../model/index.js';
|
|
@@ -28,6 +28,7 @@ import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
|
|
|
28
28
|
import { getProvider, providers } from '../languages/index.js';
|
|
29
29
|
import { createWorkerPool, workerPoolDisabledByEnv, resolveAutoPoolSize, WorkerPoolInitializationError, WorkerPoolDisabledError, } from '../workers/worker-pool.js';
|
|
30
30
|
import { normalizeExtractedRoutePath } from '../route-extractors/route-path.js';
|
|
31
|
+
import { resolveOperands, } from '../route-extractors/python-const-resolver.js';
|
|
31
32
|
import { resolveInheritedSpringRoutes, } from '../route-extractors/spring-shared.js';
|
|
32
33
|
import fs from 'node:fs';
|
|
33
34
|
import path from 'node:path';
|
|
@@ -277,7 +278,8 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
277
278
|
const skippedByLang = new Map();
|
|
278
279
|
for (const f of scannedFiles) {
|
|
279
280
|
const lang = getLanguageFromFilename(f.path);
|
|
280
|
-
|
|
281
|
+
const provider = lang === null ? undefined : getProvider(lang);
|
|
282
|
+
if (lang && provider?.parseStrategy !== 'standalone' && !isLanguageAvailable(lang)) {
|
|
281
283
|
skippedByLang.set(lang, (skippedByLang.get(lang) || 0) + 1);
|
|
282
284
|
}
|
|
283
285
|
}
|
|
@@ -464,6 +466,9 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
464
466
|
const allRouterImports = [];
|
|
465
467
|
const allRouterConstructorPrefixes = [];
|
|
466
468
|
const allRouterModuleAliases = [];
|
|
469
|
+
// Per-file Python module constants (#2391); resolved into decorator route paths
|
|
470
|
+
// below, after cross-file aggregation, alongside the include_router prefix pass.
|
|
471
|
+
const allModuleConstants = [];
|
|
467
472
|
const allSpringTypes = [];
|
|
468
473
|
const allToolDefs = [];
|
|
469
474
|
const allORMQueries = [];
|
|
@@ -610,6 +615,10 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
610
615
|
for (const item of chunkWorkerData.routerModuleAliases)
|
|
611
616
|
allRouterModuleAliases.push(item);
|
|
612
617
|
}
|
|
618
|
+
if (chunkWorkerData.moduleConstants?.length) {
|
|
619
|
+
for (const item of chunkWorkerData.moduleConstants)
|
|
620
|
+
allModuleConstants.push(item);
|
|
621
|
+
}
|
|
613
622
|
if (chunkWorkerData.springTypes?.length) {
|
|
614
623
|
for (const item of chunkWorkerData.springTypes)
|
|
615
624
|
allSpringTypes.push(item);
|
|
@@ -769,6 +778,17 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
769
778
|
// Cache miss: dispatch to workers, capture the raw results, store
|
|
770
779
|
// them under the chunk hash for the next run.
|
|
771
780
|
chunkCacheMisses++;
|
|
781
|
+
if (durableParsedFileDir !== undefined && chunkHash !== null) {
|
|
782
|
+
try {
|
|
783
|
+
await prepareDurableParsedFileChunk(durableParsedFileDir, chunkHash);
|
|
784
|
+
}
|
|
785
|
+
catch (err) {
|
|
786
|
+
// The durable store is an optimization — degrade like the restore
|
|
787
|
+
// path does instead of failing the analyze. Workers recreate the
|
|
788
|
+
// directory on write, so at worst the old generation lingers.
|
|
789
|
+
logger.warn({ err, chunkHash: chunkHash.slice(0, 8) }, 'parsedfile-cache: could not reset durable chunk generation; continuing');
|
|
790
|
+
}
|
|
791
|
+
}
|
|
772
792
|
const progressForChunk = (current, _total, filePath) => {
|
|
773
793
|
const globalCurrent = filesParsedSoFar + current;
|
|
774
794
|
// Parse phase covers 20-70 (M2). Deferred extraction handles 70-95.
|
|
@@ -925,6 +945,40 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
925
945
|
}
|
|
926
946
|
// FastAPI router-prefix resolution (cross-file).
|
|
927
947
|
//
|
|
948
|
+
// #2391: resolve non-literal FastAPI decorator route paths (imported/composed
|
|
949
|
+
// string constants) BEFORE the include_router/APIRouter prefix pass below, so a
|
|
950
|
+
// resolved path is then prefix-joined like any literal path. Each such route
|
|
951
|
+
// carries `routePathExpr`/`routePathOperands` and an empty `routePath`; we fold
|
|
952
|
+
// the operands against the repo-wide, file-path-keyed constant map. On failure
|
|
953
|
+
// we DROP the route (KTD5 skip floor) rather than emit a phantom `POST /`.
|
|
954
|
+
if (allDecoratorRoutes.some((dr) => dr.routePathExpr !== undefined)) {
|
|
955
|
+
const repoConstants = new Map();
|
|
956
|
+
for (const { filePath, constants } of allModuleConstants) {
|
|
957
|
+
repoConstants.set(filePath, constants);
|
|
958
|
+
}
|
|
959
|
+
const resolvedRoutes = [];
|
|
960
|
+
let skipped = 0;
|
|
961
|
+
for (const dr of allDecoratorRoutes) {
|
|
962
|
+
if (dr.routePathExpr === undefined) {
|
|
963
|
+
resolvedRoutes.push(dr);
|
|
964
|
+
continue;
|
|
965
|
+
}
|
|
966
|
+
const value = dr.routePathOperands
|
|
967
|
+
? resolveOperands(dr.filePath, dr.routePathOperands, repoConstants)
|
|
968
|
+
: null;
|
|
969
|
+
if (value === null) {
|
|
970
|
+
skipped++;
|
|
971
|
+
continue;
|
|
972
|
+
}
|
|
973
|
+
resolvedRoutes.push({ ...dr, routePath: value });
|
|
974
|
+
}
|
|
975
|
+
allDecoratorRoutes.length = 0;
|
|
976
|
+
for (const dr of resolvedRoutes)
|
|
977
|
+
allDecoratorRoutes.push(dr);
|
|
978
|
+
if (isDev && skipped > 0) {
|
|
979
|
+
logger.info(` 🧩 Resolved composed route constants; ${skipped} unresolved route(s) skipped`);
|
|
980
|
+
}
|
|
981
|
+
}
|
|
928
982
|
// Workers emit two kinds of records per Python file:
|
|
929
983
|
// • `routerIncludes` — every `app.include_router(<routerExpr>, prefix='/x')`
|
|
930
984
|
// site, where `routerExpr` is either `<module>.router` (Shape A) or a
|
|
@@ -48,8 +48,6 @@ export interface ParseOutput {
|
|
|
48
48
|
model: MutableSemanticModel;
|
|
49
49
|
/** Pass-through: all file paths for downstream phases. */
|
|
50
50
|
readonly allPaths: readonly string[];
|
|
51
|
-
/** Pass-through: shared `allPathSet` from structure (built once, not per-phase). */
|
|
52
|
-
readonly allPathSet: ReadonlySet<string>;
|
|
53
51
|
/** Pass-through: total file count for progress reporting. */
|
|
54
52
|
totalFiles: number;
|
|
55
53
|
/**
|
|
@@ -19,14 +19,23 @@ import { getPhaseOutput } from './types.js';
|
|
|
19
19
|
import { runChunkedParseAndResolve } from './parse-impl.js';
|
|
20
20
|
export const parsePhase = {
|
|
21
21
|
name: 'parse',
|
|
22
|
-
deps: ['structure', 'markdown', 'cobol'],
|
|
22
|
+
deps: ['structure', 'standaloneIngest', 'markdown', 'cobol'],
|
|
23
23
|
async execute(ctx, deps) {
|
|
24
|
-
const
|
|
24
|
+
const structure = getPhaseOutput(deps, 'structure');
|
|
25
|
+
const { totalFiles } = structure;
|
|
26
|
+
// Files claimed by a standalone ingester must not be parsed a second time.
|
|
27
|
+
const standaloneIngest = getPhaseOutput(deps, 'standaloneIngest');
|
|
28
|
+
const ingested = standaloneIngest.ingestedFiles;
|
|
29
|
+
const scannedFiles = ingested.size
|
|
30
|
+
? structure.scannedFiles.filter((f) => !ingested.has(f.path))
|
|
31
|
+
: structure.scannedFiles;
|
|
32
|
+
const allPaths = ingested.size
|
|
33
|
+
? structure.allPaths.filter((p) => !ingested.has(p))
|
|
34
|
+
: structure.allPaths;
|
|
25
35
|
const result = await runChunkedParseAndResolve(ctx.graph, scannedFiles, allPaths, totalFiles, ctx.repoPath, ctx.pipelineStart, ctx.onProgress, ctx.options);
|
|
26
36
|
return {
|
|
27
37
|
...result,
|
|
28
38
|
allPaths,
|
|
29
|
-
allPathSet,
|
|
30
39
|
totalFiles,
|
|
31
40
|
};
|
|
32
41
|
},
|
|
@@ -13,4 +13,12 @@ import { type ProcessDetectionResult } from '../process-processor.js';
|
|
|
13
13
|
export interface ProcessesOutput {
|
|
14
14
|
processResult: ProcessDetectionResult;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Compute the dynamic max-processes budget from the symbol count.
|
|
18
|
+
*
|
|
19
|
+
* Scales proportionally (symbolCount / 10) with a floor of 20.
|
|
20
|
+
* Prior to #2198 this was capped at 300 via `Math.min(300, …)`,
|
|
21
|
+
* silently truncating process detection on large repositories.
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeDynamicMaxProcesses(symbolCount: number): number;
|
|
16
24
|
export declare const processesPhase: PipelinePhase<ProcessesOutput>;
|
|
@@ -14,6 +14,16 @@ import { generateId } from '../../../lib/utils.js';
|
|
|
14
14
|
import { routeNodeKey } from '../route-extractors/route-path.js';
|
|
15
15
|
import { isDev } from '../utils/env.js';
|
|
16
16
|
import { logger } from '../../logger.js';
|
|
17
|
+
/**
|
|
18
|
+
* Compute the dynamic max-processes budget from the symbol count.
|
|
19
|
+
*
|
|
20
|
+
* Scales proportionally (symbolCount / 10) with a floor of 20.
|
|
21
|
+
* Prior to #2198 this was capped at 300 via `Math.min(300, …)`,
|
|
22
|
+
* silently truncating process detection on large repositories.
|
|
23
|
+
*/
|
|
24
|
+
export function computeDynamicMaxProcesses(symbolCount) {
|
|
25
|
+
return Math.max(20, Math.round(symbolCount / 10));
|
|
26
|
+
}
|
|
17
27
|
export const processesPhase = {
|
|
18
28
|
name: 'processes',
|
|
19
29
|
// `structure` supplies `totalFiles` (progress counter) without the spurious
|
|
@@ -37,7 +47,7 @@ export const processesPhase = {
|
|
|
37
47
|
if (n.label !== 'File')
|
|
38
48
|
symbolCount++;
|
|
39
49
|
});
|
|
40
|
-
const dynamicMaxProcesses =
|
|
50
|
+
const dynamicMaxProcesses = computeDynamicMaxProcesses(symbolCount);
|
|
41
51
|
const processResult = await processProcesses(ctx.graph, communityResult.memberships, (message, progress) => {
|
|
42
52
|
const processProgress = 99 + progress * 0.01;
|
|
43
53
|
ctx.onProgress({
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase: springConfig
|
|
3
|
+
*
|
|
4
|
+
* Adds key-only nodes for statically readable Spring
|
|
5
|
+
* `application*.properties` / `application*.yml` / `application*.yaml` files.
|
|
6
|
+
* Language-specific ScopeResolver hooks attach consumers later. Configuration
|
|
7
|
+
* values are deliberately never copied into the graph because they may contain
|
|
8
|
+
* credentials and key identity is sufficient for impact analysis.
|
|
9
|
+
*
|
|
10
|
+
* @deps structure
|
|
11
|
+
* @reads Spring application configuration files
|
|
12
|
+
* @writes Property nodes and DEFINES edges
|
|
13
|
+
*/
|
|
14
|
+
import type { PipelinePhase } from './types.js';
|
|
15
|
+
export interface SpringConfigKey {
|
|
16
|
+
readonly key: string;
|
|
17
|
+
readonly filePath: string;
|
|
18
|
+
readonly line: number;
|
|
19
|
+
readonly profile?: string;
|
|
20
|
+
readonly format: 'properties' | 'yaml';
|
|
21
|
+
}
|
|
22
|
+
interface SpringConfigFile {
|
|
23
|
+
readonly filePath: string;
|
|
24
|
+
readonly profile?: string;
|
|
25
|
+
readonly format: SpringConfigKey['format'];
|
|
26
|
+
}
|
|
27
|
+
export interface SpringConfigOutput {
|
|
28
|
+
readonly configKeys: number;
|
|
29
|
+
}
|
|
30
|
+
/** Match only Spring Boot's conventional application config file names. */
|
|
31
|
+
export declare function classifySpringConfigFile(filePath: string): SpringConfigFile | null;
|
|
32
|
+
/** Parse `.properties` keys without retaining their values. */
|
|
33
|
+
export declare function parseSpringProperties(content: string, filePath: string, profile?: string): SpringConfigKey[];
|
|
34
|
+
/** Parse and flatten YAML leaves without retaining their values. */
|
|
35
|
+
export declare function parseSpringYaml(content: string, filePath: string, profile?: string): SpringConfigKey[];
|
|
36
|
+
export declare const springConfigPhase: PipelinePhase<SpringConfigOutput>;
|
|
37
|
+
export {};
|