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,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase: moveIngest
|
|
3
|
+
*
|
|
4
|
+
* Compiler-first Move ingestion via the move-flow MCP server. **No raw Move
|
|
5
|
+
* source is ever read.** The `facts` query is the ONLY ingestion path: if the
|
|
6
|
+
* move-flow build doesn't expose it, the phase fails fast with a clear upgrade
|
|
7
|
+
* error before touching any package. Call edges come from the `call_graph`
|
|
8
|
+
* query.
|
|
9
|
+
*
|
|
10
|
+
* Note: move-flow's `facts` query elides all `#[test]` and `#[test_only]`
|
|
11
|
+
* symbols (functions, structs, constants). The graph therefore contains only
|
|
12
|
+
* production symbols; queries to find test functions or exclude tests from
|
|
13
|
+
* impact do not need a symbol-level test filter.
|
|
14
|
+
*
|
|
15
|
+
* @deps structure
|
|
16
|
+
* @reads scannedFiles (from structure phase)
|
|
17
|
+
* @writes graph (Module/Function/Struct/Enum/EnumVariant/Const nodes +
|
|
18
|
+
* CALLS/DEFINES/CONTAINS/FRIEND_OF/READS_RESOURCE/WRITES_RESOURCE/
|
|
19
|
+
* ACQUIRES/USES_TYPE/ENTRY_POINT_OF/IMPORTS edges)
|
|
20
|
+
*/
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { getPhaseOutput } from '../ingestion/pipeline-phases/types.js';
|
|
23
|
+
import { MOVE_EDGE_REASON, moveRepoRelativePath } from './constants.js';
|
|
24
|
+
import { MoveFlowToolCallError, } from './mcp-client.js';
|
|
25
|
+
import { buildLocalNameIndex, mapFactsToGraph, resolveFriendEdges, resolveLambdaHostEdges, resolveResourceEdges, resolveTypeRefEdges, } from './facts-mapper.js';
|
|
26
|
+
import { moveModuleNodeId, moveModuleQualifiedName, moveRelId } from './symbol-id.js';
|
|
27
|
+
import { emptyFactsIssue, validateMoveIngestOutput, } from './consistency.js';
|
|
28
|
+
import { createMoveEntryPointEdges } from './entry-points.js';
|
|
29
|
+
function createState() {
|
|
30
|
+
return {
|
|
31
|
+
ingestedFiles: new Set(),
|
|
32
|
+
moduleFileMap: new Map(),
|
|
33
|
+
functionNodeMap: new Map(),
|
|
34
|
+
structNodeMap: new Map(),
|
|
35
|
+
modulePackageMap: new Map(),
|
|
36
|
+
filePackageMap: new Map(),
|
|
37
|
+
callGraphByPackage: new Map(),
|
|
38
|
+
pendingResource: [],
|
|
39
|
+
pendingFriends: [],
|
|
40
|
+
pendingTypeRef: [],
|
|
41
|
+
pendingLambdaHosts: [],
|
|
42
|
+
droppedResourceRefs: [],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function toOutput(state, packageRoots, consistencyIssues = []) {
|
|
46
|
+
return {
|
|
47
|
+
ingestedFiles: state.ingestedFiles,
|
|
48
|
+
packageRoots,
|
|
49
|
+
moduleFileMap: state.moduleFileMap,
|
|
50
|
+
functionNodeMap: state.functionNodeMap,
|
|
51
|
+
structNodeMap: state.structNodeMap,
|
|
52
|
+
modulePackageMap: state.modulePackageMap,
|
|
53
|
+
filePackageMap: state.filePackageMap,
|
|
54
|
+
callGraphByPackage: state.callGraphByPackage,
|
|
55
|
+
droppedResourceRefs: state.droppedResourceRefs,
|
|
56
|
+
consistencyIssues,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Add a mapped package's nodes/edges to the graph and merge its identity maps. */
|
|
60
|
+
function applyMapped(graph, mapped, pkgRoot, state) {
|
|
61
|
+
for (const node of mapped.nodes)
|
|
62
|
+
graph.addNode(node);
|
|
63
|
+
for (const rel of mapped.edges)
|
|
64
|
+
graph.addRelationship(rel);
|
|
65
|
+
for (const [qn, file] of mapped.moduleFileMap) {
|
|
66
|
+
state.moduleFileMap.set(qn, file);
|
|
67
|
+
state.modulePackageMap.set(qn, pkgRoot);
|
|
68
|
+
state.filePackageMap.set(file, pkgRoot);
|
|
69
|
+
}
|
|
70
|
+
for (const [qn, id] of mapped.functionNodeMap)
|
|
71
|
+
state.functionNodeMap.set(qn, id);
|
|
72
|
+
for (const [qn, id] of mapped.structNodeMap)
|
|
73
|
+
state.structNodeMap.set(qn, id);
|
|
74
|
+
state.pendingResource.push(...mapped.pendingResource);
|
|
75
|
+
state.pendingFriends.push(...mapped.pendingFriends);
|
|
76
|
+
state.pendingTypeRef.push(...mapped.pendingTypeRef);
|
|
77
|
+
state.pendingLambdaHosts.push(...mapped.pendingLambdaHosts);
|
|
78
|
+
}
|
|
79
|
+
export function createMoveIngestPhase(client) {
|
|
80
|
+
return {
|
|
81
|
+
name: 'standaloneIngest',
|
|
82
|
+
deps: ['structure'],
|
|
83
|
+
async execute(ctx, deps) {
|
|
84
|
+
const { scannedFiles, totalFiles } = getPhaseOutput(deps, 'structure');
|
|
85
|
+
const packageRoots = [
|
|
86
|
+
...new Set(scannedFiles
|
|
87
|
+
.map((f) => f.path)
|
|
88
|
+
.filter((p) => p.endsWith('Move.toml'))
|
|
89
|
+
.map((p) => path.dirname(path.resolve(ctx.repoPath, p)))),
|
|
90
|
+
].sort();
|
|
91
|
+
if (!client || packageRoots.length === 0) {
|
|
92
|
+
return toOutput(createState(), packageRoots);
|
|
93
|
+
}
|
|
94
|
+
const { hasFactsQuery, hasStatusTool } = await client.capabilities();
|
|
95
|
+
if (!hasFactsQuery) {
|
|
96
|
+
// userActionable: rendered as a one-liner without a stack — the fix is
|
|
97
|
+
// an operator action (upgrade move-flow), not a code bug.
|
|
98
|
+
throw Object.assign(new Error('move-flow is too old — upgrade to a build that exposes `move_package_query { query: "facts" }`.'), { userActionable: true });
|
|
99
|
+
}
|
|
100
|
+
const state = createState();
|
|
101
|
+
// Group scanned .move files by their (innermost) owning package. Files
|
|
102
|
+
// are marked as ingested per package only AFTER its facts arrive, so a
|
|
103
|
+
// package whose facts come back empty is left un-ingested rather than
|
|
104
|
+
// silently absent from the graph (the generic parse phase still sees it).
|
|
105
|
+
const moveFilesByPackage = new Map();
|
|
106
|
+
for (const f of scannedFiles) {
|
|
107
|
+
if (!f.path.endsWith('.move'))
|
|
108
|
+
continue;
|
|
109
|
+
const abs = path.resolve(ctx.repoPath, f.path);
|
|
110
|
+
// Boundary-safe: bare startsWith would let a sibling directory sharing
|
|
111
|
+
// a name prefix (pkg_ab vs root pkg_a) claim the file.
|
|
112
|
+
const owners = packageRoots.filter((root) => {
|
|
113
|
+
const prefix = root.endsWith(path.sep) ? root : root + path.sep;
|
|
114
|
+
return abs.startsWith(prefix);
|
|
115
|
+
});
|
|
116
|
+
if (owners.length === 0)
|
|
117
|
+
continue;
|
|
118
|
+
const owner = owners.reduce((a, b) => (b.length > a.length ? b : a));
|
|
119
|
+
const files = moveFilesByPackage.get(owner) ?? [];
|
|
120
|
+
files.push(moveRepoRelativePath(abs, ctx.repoPath));
|
|
121
|
+
moveFilesByPackage.set(owner, files);
|
|
122
|
+
}
|
|
123
|
+
const emptyFactsPackages = [];
|
|
124
|
+
// Pass 1: per-package nodes/edges (all packages first, so cross-package
|
|
125
|
+
// CALLS in Pass 2 can resolve callees in later packages).
|
|
126
|
+
for (const pkgRoot of packageRoots) {
|
|
127
|
+
ctx.onProgress({
|
|
128
|
+
phase: 'moveIngest',
|
|
129
|
+
percent: 18,
|
|
130
|
+
message: `Ingesting Move package: ${path.basename(pkgRoot)}`,
|
|
131
|
+
stats: { filesProcessed: 0, totalFiles, nodesCreated: ctx.graph.nodeCount },
|
|
132
|
+
});
|
|
133
|
+
let callGraphData;
|
|
134
|
+
let factsMap;
|
|
135
|
+
try {
|
|
136
|
+
callGraphData = await client.callGraph(pkgRoot);
|
|
137
|
+
factsMap = await client.facts(pkgRoot);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (err instanceof MoveFlowToolCallError) {
|
|
141
|
+
// userActionable: rendered as a one-liner without a stack - a Move
|
|
142
|
+
// package that does not build (bad manifest, missing dependency,
|
|
143
|
+
// nonexistent path) is an operator problem, not a code bug.
|
|
144
|
+
throw Object.assign(new Error(`move-flow could not build Move package ${pkgRoot}: ${err.message}`), { userActionable: true });
|
|
145
|
+
}
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
const pkgMoveFiles = moveFilesByPackage.get(pkgRoot) ?? [];
|
|
149
|
+
if (Object.keys(factsMap).length === 0 && pkgMoveFiles.length > 0) {
|
|
150
|
+
// Facts `{}` is ambiguous: syntax-broken packages return it as a
|
|
151
|
+
// SUCCESS (the compiler diagnostic only surfaces via
|
|
152
|
+
// `move_package_status`), but so do valid packages whose every item
|
|
153
|
+
// is `#[test]`/`#[test_only]` (elided from facts - see file header).
|
|
154
|
+
// Cross-check the build status to tell them apart; either way skip
|
|
155
|
+
// the package (its files stay un-ingested) and record an issue.
|
|
156
|
+
emptyFactsPackages.push({
|
|
157
|
+
pkgRoot,
|
|
158
|
+
moveFileCount: pkgMoveFiles.length,
|
|
159
|
+
status: await probePackageStatus(client, pkgRoot, hasStatusTool),
|
|
160
|
+
});
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// Only past the gate: a skipped package must have zero footprint in
|
|
164
|
+
// Pass 2 linking and consistency validation.
|
|
165
|
+
state.callGraphByPackage.set(pkgRoot, callGraphData);
|
|
166
|
+
for (const rel of pkgMoveFiles)
|
|
167
|
+
state.ingestedFiles.add(rel);
|
|
168
|
+
applyMapped(ctx.graph, mapFactsToGraph(factsMap, pkgRoot, ctx.repoPath), pkgRoot, state);
|
|
169
|
+
}
|
|
170
|
+
// Pass 2+: link edges that need the full cross-package node index.
|
|
171
|
+
linkCallEdges(ctx.graph, state);
|
|
172
|
+
linkLambdaHostEdges(ctx.graph, state);
|
|
173
|
+
linkResourceAndFriendEdges(ctx.graph, state);
|
|
174
|
+
linkFileImports(ctx.graph, state);
|
|
175
|
+
linkFileModuleContains(ctx.graph, state);
|
|
176
|
+
const output = toOutput(state, packageRoots);
|
|
177
|
+
createMoveEntryPointEdges(ctx.graph, output);
|
|
178
|
+
const consistencyIssues = emptyFactsPackages.map(emptyFactsIssue);
|
|
179
|
+
consistencyIssues.push(...validateMoveIngestOutput(ctx.graph, output));
|
|
180
|
+
reportConsistencyIssues(ctx, consistencyIssues);
|
|
181
|
+
return { ...output, consistencyIssues };
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// --- Empty-facts discrimination ---
|
|
186
|
+
/** Cross-check the build status of a sources-but-empty-facts package.
|
|
187
|
+
* `null` = status unavailable (no status tool, or the probe itself failed). */
|
|
188
|
+
async function probePackageStatus(client, pkgRoot, hasStatusTool) {
|
|
189
|
+
if (!hasStatusTool)
|
|
190
|
+
return null;
|
|
191
|
+
try {
|
|
192
|
+
return await client.packageStatus(pkgRoot);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Probe failure -> cannot discriminate; fall back to the pessimistic issue.
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** CALLS edges from each package's call graph (resolved across all packages). */
|
|
200
|
+
function linkCallEdges(graph, state) {
|
|
201
|
+
for (const callGraph of state.callGraphByPackage.values()) {
|
|
202
|
+
for (const [callerQualified, callees] of Object.entries(callGraph)) {
|
|
203
|
+
const callerId = state.functionNodeMap.get(callerQualified);
|
|
204
|
+
if (!callerId)
|
|
205
|
+
continue;
|
|
206
|
+
for (const calleeQualified of callees) {
|
|
207
|
+
const calleeId = state.functionNodeMap.get(calleeQualified);
|
|
208
|
+
if (!calleeId)
|
|
209
|
+
continue;
|
|
210
|
+
graph.addRelationship({
|
|
211
|
+
id: moveRelId(callerId, 'CALLS', calleeId, MOVE_EDGE_REASON.calls),
|
|
212
|
+
sourceId: callerId,
|
|
213
|
+
targetId: calleeId,
|
|
214
|
+
type: 'CALLS',
|
|
215
|
+
confidence: 1.0,
|
|
216
|
+
reason: MOVE_EDGE_REASON.calls,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* CALLS edges from each `__lambda__N__host` function back to its host. move-flow
|
|
224
|
+
* synthesises lambdas as standalone functions but does NOT include the host-to-
|
|
225
|
+
* lambda link in `call_graph` — without it, upstream traversal from the lambda
|
|
226
|
+
* dead-ends and processes that route through a callback (e.g. market_callbacks
|
|
227
|
+
* → settle_trade) lose the bridge.
|
|
228
|
+
*/
|
|
229
|
+
function linkLambdaHostEdges(graph, state) {
|
|
230
|
+
resolveLambdaHostEdges(state.pendingLambdaHosts, state.functionNodeMap, (rel) => graph.addRelationship(rel));
|
|
231
|
+
}
|
|
232
|
+
/** Resource/friend edges from facts, resolved after all package nodes exist. */
|
|
233
|
+
function linkResourceAndFriendEdges(graph, state) {
|
|
234
|
+
const structIdsByLocalName = buildLocalNameIndex(state.structNodeMap);
|
|
235
|
+
resolveResourceEdges(state.pendingResource, state.structNodeMap, structIdsByLocalName, (rel) => graph.addRelationship(rel), (pending) => state.droppedResourceRefs.push({ fnNodeId: pending.fnNodeId, target: pending.target }), (pending) => state.droppedResourceRefs.push({ fnNodeId: pending.fnNodeId, target: pending.target }));
|
|
236
|
+
resolveFriendEdges(state.pendingFriends, state.moduleFileMap, (rel) => graph.addRelationship(rel));
|
|
237
|
+
resolveTypeRefEdges(state.pendingTypeRef, state.structNodeMap, structIdsByLocalName, (rel) => {
|
|
238
|
+
graph.addRelationship(rel);
|
|
239
|
+
addUsedType(graph, rel.sourceId, rel.targetId);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function addUsedType(graph, functionNodeId, typeNodeId) {
|
|
243
|
+
const fnNode = graph.getNode(functionNodeId);
|
|
244
|
+
const typeNode = graph.getNode(typeNodeId);
|
|
245
|
+
const qualifiedName = typeNode?.properties.qualifiedName;
|
|
246
|
+
// Only Function nodes carry `usedTypes` - resource-group membership USES_TYPE
|
|
247
|
+
// edges have a Struct source and must not grow the property there.
|
|
248
|
+
if (!fnNode || fnNode.label !== 'Function' || typeof qualifiedName !== 'string')
|
|
249
|
+
return;
|
|
250
|
+
const current = Array.isArray(fnNode.properties.usedTypes) ? fnNode.properties.usedTypes : [];
|
|
251
|
+
if (current.includes(qualifiedName))
|
|
252
|
+
return;
|
|
253
|
+
fnNode.properties.usedTypes = [...current, qualifiedName];
|
|
254
|
+
}
|
|
255
|
+
/** File→File IMPORTS derived from cross-module CALLS (deduped against existing). */
|
|
256
|
+
function linkFileImports(graph, state) {
|
|
257
|
+
const seen = new Set();
|
|
258
|
+
for (const r of graph.iterRelationshipsByType('IMPORTS')) {
|
|
259
|
+
if (!r.sourceId.startsWith('File:') || !r.targetId.startsWith('File:'))
|
|
260
|
+
continue;
|
|
261
|
+
seen.add(`${r.sourceId.slice(5)}\0${r.targetId.slice(5)}`);
|
|
262
|
+
}
|
|
263
|
+
for (const callGraph of state.callGraphByPackage.values()) {
|
|
264
|
+
for (const [callerQualified, callees] of Object.entries(callGraph)) {
|
|
265
|
+
const callerFile = state.moduleFileMap.get(moveModuleQualifiedName(callerQualified));
|
|
266
|
+
if (!callerFile)
|
|
267
|
+
continue;
|
|
268
|
+
for (const calleeQualified of callees) {
|
|
269
|
+
const calleeFile = state.moduleFileMap.get(moveModuleQualifiedName(calleeQualified));
|
|
270
|
+
if (!calleeFile || calleeFile === callerFile)
|
|
271
|
+
continue;
|
|
272
|
+
const key = `${callerFile}\0${calleeFile}`;
|
|
273
|
+
if (seen.has(key))
|
|
274
|
+
continue;
|
|
275
|
+
seen.add(key);
|
|
276
|
+
const sourceFileId = `File:${callerFile}`;
|
|
277
|
+
const targetFileId = `File:${calleeFile}`;
|
|
278
|
+
if (graph.getNode(sourceFileId) && graph.getNode(targetFileId)) {
|
|
279
|
+
graph.addRelationship({
|
|
280
|
+
id: moveRelId(sourceFileId, 'IMPORTS', targetFileId, MOVE_EDGE_REASON.crossModuleDependency),
|
|
281
|
+
sourceId: sourceFileId,
|
|
282
|
+
targetId: targetFileId,
|
|
283
|
+
type: 'IMPORTS',
|
|
284
|
+
confidence: 0.9,
|
|
285
|
+
reason: MOVE_EDGE_REASON.crossModuleDependency,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** File→Module CONTAINS where the File node exists (from the structure phase). */
|
|
293
|
+
function linkFileModuleContains(graph, state) {
|
|
294
|
+
for (const [qn, file] of state.moduleFileMap) {
|
|
295
|
+
const fileNodeId = `File:${file}`;
|
|
296
|
+
const moduleNodeId = moveModuleNodeId(qn, file);
|
|
297
|
+
if (graph.getNode(fileNodeId) && graph.getNode(moduleNodeId)) {
|
|
298
|
+
graph.addRelationship({
|
|
299
|
+
id: moveRelId(fileNodeId, 'CONTAINS', moduleNodeId, MOVE_EDGE_REASON.moduleInFile),
|
|
300
|
+
sourceId: fileNodeId,
|
|
301
|
+
targetId: moduleNodeId,
|
|
302
|
+
type: 'CONTAINS',
|
|
303
|
+
confidence: 1.0,
|
|
304
|
+
reason: MOVE_EDGE_REASON.moduleInFile,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** Surface consistency errors so they reach a human/log (not just the output). */
|
|
310
|
+
function reportConsistencyIssues(ctx, issues) {
|
|
311
|
+
const errors = issues.filter((i) => i.severity === 'error');
|
|
312
|
+
if (errors.length === 0)
|
|
313
|
+
return;
|
|
314
|
+
ctx.onProgress({
|
|
315
|
+
phase: 'moveIngest',
|
|
316
|
+
percent: 22,
|
|
317
|
+
message: `Move ingest: ${errors.length} consistency error(s) (e.g. ${errors[0].message})`,
|
|
318
|
+
stats: { filesProcessed: 0, totalFiles: 0, nodesCreated: ctx.graph.nodeCount },
|
|
319
|
+
});
|
|
320
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MoveCompilerIdentity } from './constants.js';
|
|
2
|
+
import { type MoveFlowMcpClient, type ResolvedMoveFlowClient } from './mcp-client.js';
|
|
3
|
+
import { type MoveFlowInstallResult, type VerifiedMoveFlowBinary } from './install.js';
|
|
4
|
+
export interface ProvisionedMoveFlow {
|
|
5
|
+
client: MoveFlowMcpClient;
|
|
6
|
+
identity: MoveCompilerIdentity;
|
|
7
|
+
}
|
|
8
|
+
export interface MoveFlowProvisionOptions {
|
|
9
|
+
onLog?: (message: string) => void;
|
|
10
|
+
install?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface MoveFlowProvisionDependencies {
|
|
13
|
+
resolveClient: (binaryPath?: string) => ResolvedMoveFlowClient | null;
|
|
14
|
+
createClient: (binaryPath: string) => MoveFlowMcpClient;
|
|
15
|
+
findCached: () => Promise<VerifiedMoveFlowBinary | null>;
|
|
16
|
+
install: () => Promise<MoveFlowInstallResult>;
|
|
17
|
+
}
|
|
18
|
+
/** Resolve move-flow after the caller has already detected Move code. */
|
|
19
|
+
export declare function ensureMoveFlowRuntime(options?: MoveFlowProvisionOptions, dependencies?: MoveFlowProvisionDependencies): Promise<ProvisionedMoveFlow | null>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createMoveFlowClient, tryResolveMoveFlowClient, } from './mcp-client.js';
|
|
3
|
+
import { findCachedMoveFlowBinary, installMoveFlow, } from './install.js';
|
|
4
|
+
import { isCompatibleMoveFlowVersion, MOVE_FLOW_RELEASE } from './release.js';
|
|
5
|
+
const installAttempts = new WeakMap();
|
|
6
|
+
const defaultDependencies = {
|
|
7
|
+
resolveClient: tryResolveMoveFlowClient,
|
|
8
|
+
createClient: createMoveFlowClient,
|
|
9
|
+
findCached: findCachedMoveFlowBinary,
|
|
10
|
+
install: installMoveFlow,
|
|
11
|
+
};
|
|
12
|
+
const localIdentity = (source, locator, version) => ({
|
|
13
|
+
version,
|
|
14
|
+
source,
|
|
15
|
+
fingerprint: createHash('sha256').update(`${source}\0${locator}\0${version}`).digest('hex'),
|
|
16
|
+
});
|
|
17
|
+
const verifiedRuntime = (binary, dependencies) => isCompatibleMoveFlowVersion(binary.version)
|
|
18
|
+
? {
|
|
19
|
+
client: dependencies.createClient(binary.binaryPath),
|
|
20
|
+
identity: {
|
|
21
|
+
version: binary.version,
|
|
22
|
+
source: 'release',
|
|
23
|
+
fingerprint: binary.fingerprint,
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
: null;
|
|
27
|
+
const getInstallAttempt = (dependencies) => {
|
|
28
|
+
const active = installAttempts.get(dependencies);
|
|
29
|
+
if (active)
|
|
30
|
+
return active;
|
|
31
|
+
const created = Promise.resolve().then(dependencies.install);
|
|
32
|
+
installAttempts.set(dependencies, created);
|
|
33
|
+
void created.then((result) => {
|
|
34
|
+
if (result.binary && installAttempts.get(dependencies) === created) {
|
|
35
|
+
installAttempts.delete(dependencies);
|
|
36
|
+
}
|
|
37
|
+
}, () => { });
|
|
38
|
+
return created;
|
|
39
|
+
};
|
|
40
|
+
/** Resolve move-flow after the caller has already detected Move code. */
|
|
41
|
+
export async function ensureMoveFlowRuntime(options = {}, dependencies = defaultDependencies) {
|
|
42
|
+
const explicitPath = process.env.MOVE_FLOW;
|
|
43
|
+
if (explicitPath) {
|
|
44
|
+
const resolved = dependencies.resolveClient(explicitPath);
|
|
45
|
+
if (resolved) {
|
|
46
|
+
return {
|
|
47
|
+
client: resolved.client,
|
|
48
|
+
identity: localIdentity('explicit', explicitPath, resolved.version),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
options.onLog?.(`MOVE_FLOW points to an unavailable binary (${explicitPath}); automatic installation was skipped.`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const cached = await dependencies.findCached();
|
|
55
|
+
if (cached) {
|
|
56
|
+
const runtime = verifiedRuntime(cached, dependencies);
|
|
57
|
+
if (runtime)
|
|
58
|
+
return runtime;
|
|
59
|
+
}
|
|
60
|
+
const existing = dependencies.resolveClient();
|
|
61
|
+
if (existing) {
|
|
62
|
+
// The locator must be stable across shells: $PATH itself differs between
|
|
63
|
+
// terminals/CI steps, and a fingerprint churn forces a full re-index.
|
|
64
|
+
return {
|
|
65
|
+
client: existing.client,
|
|
66
|
+
identity: localIdentity('path', 'move-flow', existing.version),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (options.install === false)
|
|
70
|
+
return null;
|
|
71
|
+
options.onLog?.(`Move code detected; ensuring move-flow ${MOVE_FLOW_RELEASE.version} is available.`);
|
|
72
|
+
let result;
|
|
73
|
+
try {
|
|
74
|
+
result = await getInstallAttempt(dependencies);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
options.onLog?.(`move-flow installation failed: ${err instanceof Error ? err.message : String(err)}; ` +
|
|
78
|
+
'.move files will not be indexed.');
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (!result.binary) {
|
|
82
|
+
options.onLog?.(`move-flow is unavailable${result.message ? `: ${result.message}` : ''}; ` +
|
|
83
|
+
'.move files will not be indexed.');
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const runtime = verifiedRuntime(result.binary, dependencies);
|
|
87
|
+
if (!runtime) {
|
|
88
|
+
options.onLog?.(`move-flow ${result.binary.version} is protocol-incompatible; .move files will not be indexed.`);
|
|
89
|
+
}
|
|
90
|
+
return runtime;
|
|
91
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const MOVE_FLOW_RELEASE = {
|
|
2
|
+
version: '2.0.0',
|
|
3
|
+
repository: 'aptos-labs/aptos-ai',
|
|
4
|
+
tagPrefix: 'move-flow-v',
|
|
5
|
+
};
|
|
6
|
+
const COMPATIBLE_MAJOR = Number(MOVE_FLOW_RELEASE.version.split('.')[0]);
|
|
7
|
+
export const isCompatibleMoveFlowVersion = (version) => {
|
|
8
|
+
const match = /^(\d+)\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.exec(version);
|
|
9
|
+
return match !== null && Number(match[1]) === COMPATIBLE_MAJOR;
|
|
10
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Move symbol identity helpers.
|
|
3
|
+
*
|
|
4
|
+
* Move symbols need the fully-qualified address/module path in their graph IDs.
|
|
5
|
+
* File path + local name is not unique when a file contains multiple modules or
|
|
6
|
+
* two named-address packages expose the same local names.
|
|
7
|
+
*/
|
|
8
|
+
export interface ParsedMoveModuleName {
|
|
9
|
+
address: string;
|
|
10
|
+
moduleName: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseMoveModuleQualifiedName(qualifiedName: string): ParsedMoveModuleName;
|
|
13
|
+
export declare function moveModuleQualifiedName(symbolQualifiedName: string): string;
|
|
14
|
+
export declare function moveLocalName(qualifiedName: string): string;
|
|
15
|
+
export declare function moveShortSymbol(qualifiedName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Deterministic relationship id: re-analysis is reproducible and edges dedup
|
|
18
|
+
* by id. `reason` is part of the key so edges differing only by reason
|
|
19
|
+
* (e.g. USES_TYPE param vs return) stay distinct.
|
|
20
|
+
*/
|
|
21
|
+
export declare function moveRelId(sourceId: string, type: string, targetId: string, reason: string): string;
|
|
22
|
+
export declare function moveModuleNodeId(moduleQualifiedName: string, filePath: string): string;
|
|
23
|
+
export declare function moveFunctionNodeId(functionQualifiedName: string, filePath: string): string;
|
|
24
|
+
export declare function moveStructNodeId(structQualifiedName: string, filePath: string): string;
|
|
25
|
+
export declare function moveEnumNodeId(enumQualifiedName: string, filePath: string): string;
|
|
26
|
+
export declare function moveConstNodeId(constQualifiedName: string, filePath: string): string;
|
|
27
|
+
export declare function moveEnumVariantNodeId(enumQualifiedName: string, variantName: string, filePath: string): string;
|
|
28
|
+
export declare function moveFieldNodeId(structQualifiedName: string, fieldName: string, filePath: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Parse `__lambda__<n>__<host>` into the host function's local name, or null
|
|
31
|
+
* when the input is not a lambda symbol. move-flow synthesises lambdas as
|
|
32
|
+
* Function symbols whose names follow this convention so they can be referenced
|
|
33
|
+
* by the call graph; the host is always in the same module as the lambda.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseMoveLambdaHostName(localName: string): string | null;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Move symbol identity helpers.
|
|
3
|
+
*
|
|
4
|
+
* Move symbols need the fully-qualified address/module path in their graph IDs.
|
|
5
|
+
* File path + local name is not unique when a file contains multiple modules or
|
|
6
|
+
* two named-address packages expose the same local names.
|
|
7
|
+
*/
|
|
8
|
+
export function parseMoveModuleQualifiedName(qualifiedName) {
|
|
9
|
+
const sep = qualifiedName.indexOf('::');
|
|
10
|
+
if (sep === -1)
|
|
11
|
+
return { address: '', moduleName: qualifiedName };
|
|
12
|
+
return { address: qualifiedName.slice(0, sep), moduleName: qualifiedName.slice(sep + 2) };
|
|
13
|
+
}
|
|
14
|
+
export function moveModuleQualifiedName(symbolQualifiedName) {
|
|
15
|
+
const sep = symbolQualifiedName.lastIndexOf('::');
|
|
16
|
+
return sep === -1 ? symbolQualifiedName : symbolQualifiedName.slice(0, sep);
|
|
17
|
+
}
|
|
18
|
+
export function moveLocalName(qualifiedName) {
|
|
19
|
+
const sep = qualifiedName.lastIndexOf('::');
|
|
20
|
+
return sep === -1 ? qualifiedName : qualifiedName.slice(sep + 2);
|
|
21
|
+
}
|
|
22
|
+
export function moveShortSymbol(qualifiedName) {
|
|
23
|
+
const moduleQualified = moveModuleQualifiedName(qualifiedName);
|
|
24
|
+
const { moduleName } = parseMoveModuleQualifiedName(moduleQualified);
|
|
25
|
+
return `${moduleName}::${moveLocalName(qualifiedName)}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Deterministic relationship id: re-analysis is reproducible and edges dedup
|
|
29
|
+
* by id. `reason` is part of the key so edges differing only by reason
|
|
30
|
+
* (e.g. USES_TYPE param vs return) stay distinct.
|
|
31
|
+
*/
|
|
32
|
+
export function moveRelId(sourceId, type, targetId, reason) {
|
|
33
|
+
return `rel:${type}:${sourceId}->${targetId}:${reason}`;
|
|
34
|
+
}
|
|
35
|
+
export function moveModuleNodeId(moduleQualifiedName, filePath) {
|
|
36
|
+
return `Module:${filePath}:${moduleQualifiedName}`;
|
|
37
|
+
}
|
|
38
|
+
export function moveFunctionNodeId(functionQualifiedName, filePath) {
|
|
39
|
+
return `Function:${filePath}:${functionQualifiedName}`;
|
|
40
|
+
}
|
|
41
|
+
export function moveStructNodeId(structQualifiedName, filePath) {
|
|
42
|
+
return `Struct:${filePath}:${structQualifiedName}`;
|
|
43
|
+
}
|
|
44
|
+
export function moveEnumNodeId(enumQualifiedName, filePath) {
|
|
45
|
+
return `Enum:${filePath}:${enumQualifiedName}`;
|
|
46
|
+
}
|
|
47
|
+
export function moveConstNodeId(constQualifiedName, filePath) {
|
|
48
|
+
return `Const:${filePath}:${constQualifiedName}`;
|
|
49
|
+
}
|
|
50
|
+
export function moveEnumVariantNodeId(enumQualifiedName, variantName, filePath) {
|
|
51
|
+
return `EnumVariant:${filePath}:${enumQualifiedName}::${variantName}`;
|
|
52
|
+
}
|
|
53
|
+
export function moveFieldNodeId(structQualifiedName, fieldName, filePath) {
|
|
54
|
+
return `Property:${filePath}:${structQualifiedName}.${fieldName}`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse `__lambda__<n>__<host>` into the host function's local name, or null
|
|
58
|
+
* when the input is not a lambda symbol. move-flow synthesises lambdas as
|
|
59
|
+
* Function symbols whose names follow this convention so they can be referenced
|
|
60
|
+
* by the call graph; the host is always in the same module as the lambda.
|
|
61
|
+
*/
|
|
62
|
+
export function parseMoveLambdaHostName(localName) {
|
|
63
|
+
const match = /^__lambda__\d+__(.+)$/.exec(localName);
|
|
64
|
+
return match ? match[1] : null;
|
|
65
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny extractor for Move type expressions returned by move-flow facts.
|
|
3
|
+
*
|
|
4
|
+
* Input examples: `&CoinStore<Pool<T>>`, `vector<u8>`,
|
|
5
|
+
* `aptos_framework::coin::CoinStore<T>`.
|
|
6
|
+
*
|
|
7
|
+
* Output is the ordered list of type-name tokens that could resolve to a graph
|
|
8
|
+
* struct or enum. References and primitives are stripped; outer and inner
|
|
9
|
+
* generic type names are both returned.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractTypeNames(typeExpr: string): string[];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny extractor for Move type expressions returned by move-flow facts.
|
|
3
|
+
*
|
|
4
|
+
* Input examples: `&CoinStore<Pool<T>>`, `vector<u8>`,
|
|
5
|
+
* `aptos_framework::coin::CoinStore<T>`.
|
|
6
|
+
*
|
|
7
|
+
* Output is the ordered list of type-name tokens that could resolve to a graph
|
|
8
|
+
* struct or enum. References and primitives are stripped; outer and inner
|
|
9
|
+
* generic type names are both returned.
|
|
10
|
+
*/
|
|
11
|
+
const MOVE_PRIMITIVES = new Set([
|
|
12
|
+
'bool',
|
|
13
|
+
'u8',
|
|
14
|
+
'u16',
|
|
15
|
+
'u32',
|
|
16
|
+
'u64',
|
|
17
|
+
'u128',
|
|
18
|
+
'u256',
|
|
19
|
+
'address',
|
|
20
|
+
'signer',
|
|
21
|
+
'&signer',
|
|
22
|
+
'vector',
|
|
23
|
+
]);
|
|
24
|
+
export function extractTypeNames(typeExpr) {
|
|
25
|
+
if (!typeExpr)
|
|
26
|
+
return [];
|
|
27
|
+
const expr = typeExpr.trim().replace(/^&(mut\s+)?/, '');
|
|
28
|
+
if (MOVE_PRIMITIVES.has(expr))
|
|
29
|
+
return [];
|
|
30
|
+
const tokens = [];
|
|
31
|
+
for (const raw of expr.split(/[<>,]/)) {
|
|
32
|
+
const name = raw.trim().replace(/^&(mut\s+)?/, '');
|
|
33
|
+
if (!name || MOVE_PRIMITIVES.has(name))
|
|
34
|
+
continue;
|
|
35
|
+
tokens.push(name);
|
|
36
|
+
}
|
|
37
|
+
return tokens;
|
|
38
|
+
}
|
|
@@ -19,6 +19,5 @@ export interface RuntimeCapabilities {
|
|
|
19
19
|
export declare const DEFAULT_EXACT_SCAN_LIMIT = 10000;
|
|
20
20
|
export declare const getExactScanLimit: () => number;
|
|
21
21
|
export declare const getRuntimeFingerprint: () => RuntimeFingerprint;
|
|
22
|
-
export declare const isVectorExtensionSupportedByPlatform: (platform?: NodeJS.Platform) => boolean;
|
|
23
22
|
export declare const getRuntimeCapabilities: () => RuntimeCapabilities;
|
|
24
23
|
export declare const defaultEmbeddingThreads: () => number;
|