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,179 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
3
|
+
import { rename, rm } from 'node:fs/promises';
|
|
4
|
+
import { get as httpsGet } from 'node:https';
|
|
5
|
+
import { Transform } from 'node:stream';
|
|
6
|
+
import { pipeline } from 'node:stream/promises';
|
|
7
|
+
import { setTimeout as wait } from 'node:timers/promises';
|
|
8
|
+
export const MAX_ARCHIVE_BYTES = 256 * 1024 * 1024;
|
|
9
|
+
const MAX_REDIRECTS = 5;
|
|
10
|
+
const MAX_ATTEMPTS = 3;
|
|
11
|
+
const RETRYABLE_CODES = new Set([
|
|
12
|
+
'EAI_AGAIN',
|
|
13
|
+
'ECONNREFUSED',
|
|
14
|
+
'ECONNRESET',
|
|
15
|
+
'EPIPE',
|
|
16
|
+
'ETIMEDOUT',
|
|
17
|
+
'ERR_STREAM_PREMATURE_CLOSE',
|
|
18
|
+
'ENETDOWN',
|
|
19
|
+
'ENETUNREACH',
|
|
20
|
+
]);
|
|
21
|
+
class RetryableDownloadError extends Error {
|
|
22
|
+
retryAfterMs;
|
|
23
|
+
constructor(message, retryAfterMs = 0) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.retryAfterMs = retryAfterMs;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const parseRetryAfter = (value) => {
|
|
29
|
+
const raw = Array.isArray(value) ? value[0] : value;
|
|
30
|
+
if (!raw)
|
|
31
|
+
return 0;
|
|
32
|
+
const seconds = Number(raw);
|
|
33
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
34
|
+
return seconds * 1_000;
|
|
35
|
+
const date = Date.parse(raw);
|
|
36
|
+
return Number.isFinite(date) ? Math.max(0, date - Date.now()) : 0;
|
|
37
|
+
};
|
|
38
|
+
const safeRequestLabel = (target) => {
|
|
39
|
+
const parsed = new URL(target);
|
|
40
|
+
return `${parsed.origin}${parsed.pathname}`;
|
|
41
|
+
};
|
|
42
|
+
const isRetryableError = (error) => error instanceof RetryableDownloadError ||
|
|
43
|
+
(error instanceof Error && RETRYABLE_CODES.has(error.code ?? ''));
|
|
44
|
+
const downloadAttempt = async (initialUrl, partial, deadline, get, maxBytes) => {
|
|
45
|
+
if (new URL(initialUrl).protocol !== 'https:') {
|
|
46
|
+
throw new Error('move-flow downloads require HTTPS');
|
|
47
|
+
}
|
|
48
|
+
let target = initialUrl;
|
|
49
|
+
for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects += 1) {
|
|
50
|
+
const remaining = deadline - Date.now();
|
|
51
|
+
if (remaining <= 0)
|
|
52
|
+
throw new Error('download timed out');
|
|
53
|
+
const result = await new Promise((resolve, reject) => {
|
|
54
|
+
let activeResponse = null;
|
|
55
|
+
let pipelineStarted = false;
|
|
56
|
+
const req = get(target, {}, (response) => {
|
|
57
|
+
const status = response.statusCode ?? 0;
|
|
58
|
+
if (status >= 300 && status < 400 && response.headers.location) {
|
|
59
|
+
let redirect;
|
|
60
|
+
try {
|
|
61
|
+
redirect = new URL(response.headers.location, target);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
response.destroy();
|
|
65
|
+
reject(new Error(`invalid redirect from ${safeRequestLabel(target)}`));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
response.destroy();
|
|
69
|
+
if (redirect.protocol !== 'https:') {
|
|
70
|
+
reject(new Error(`refusing non-HTTPS redirect to ${redirect.protocol}`));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
resolve({ redirect: redirect.toString() });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (status !== 200) {
|
|
77
|
+
response.destroy();
|
|
78
|
+
const message = `HTTP ${status} for ${safeRequestLabel(target)}`;
|
|
79
|
+
if (status === 408 || status === 429 || status >= 500) {
|
|
80
|
+
reject(new RetryableDownloadError(message, parseRetryAfter(response.headers['retry-after'])));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
reject(new Error(message));
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const rawLength = response.headers['content-length'];
|
|
88
|
+
const contentLength = Number(Array.isArray(rawLength) ? rawLength[0] : rawLength);
|
|
89
|
+
if (Number.isFinite(contentLength) && contentLength > maxBytes) {
|
|
90
|
+
response.destroy();
|
|
91
|
+
reject(new Error(`download exceeds ${maxBytes} bytes`));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
let received = 0;
|
|
95
|
+
const limit = new Transform({
|
|
96
|
+
transform(chunk, _encoding, callback) {
|
|
97
|
+
received += chunk.length;
|
|
98
|
+
callback(received > maxBytes ? new Error(`download exceeds ${maxBytes} bytes`) : null, chunk);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
activeResponse = response;
|
|
102
|
+
pipelineStarted = true;
|
|
103
|
+
void pipeline(response, limit, createWriteStream(partial)).then(() => resolve({}), reject);
|
|
104
|
+
});
|
|
105
|
+
const timeout = setTimeout(() => req.destroy(Object.assign(new Error('download timed out'), { code: 'ETIMEDOUT' })), Math.max(1, remaining));
|
|
106
|
+
req.once('close', () => clearTimeout(timeout));
|
|
107
|
+
req.once('error', (error) => {
|
|
108
|
+
if (pipelineStarted) {
|
|
109
|
+
// Once the body pipeline owns the response, it must be the only
|
|
110
|
+
// operation that settles this attempt. Otherwise cleanup/retry can
|
|
111
|
+
// reuse the partial path while the old response is still writing.
|
|
112
|
+
activeResponse?.destroy(error);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
reject(error);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
if (!result.redirect)
|
|
119
|
+
return;
|
|
120
|
+
target = result.redirect;
|
|
121
|
+
}
|
|
122
|
+
throw new Error('too many redirects');
|
|
123
|
+
};
|
|
124
|
+
export const downloadToFile = async (url, destination, timeoutMs, get = httpsGet, maxBytes = MAX_ARCHIVE_BYTES) => {
|
|
125
|
+
const partial = `${destination}.partial`;
|
|
126
|
+
const deadline = Date.now() + timeoutMs;
|
|
127
|
+
try {
|
|
128
|
+
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt += 1) {
|
|
129
|
+
await rm(partial, { force: true });
|
|
130
|
+
try {
|
|
131
|
+
await downloadAttempt(url, partial, deadline, get, maxBytes);
|
|
132
|
+
await rename(partial, destination);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
await rm(partial, { force: true });
|
|
137
|
+
if (!isRetryableError(error) || attempt === MAX_ATTEMPTS)
|
|
138
|
+
throw error;
|
|
139
|
+
const retryAfter = error instanceof RetryableDownloadError ? error.retryAfterMs : attempt * 100;
|
|
140
|
+
const remaining = deadline - Date.now();
|
|
141
|
+
if (remaining <= 1)
|
|
142
|
+
throw error;
|
|
143
|
+
await wait(Math.min(Math.max(0, retryAfter), remaining - 1));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await rm(partial, { force: true });
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
export const sha256File = async (file) => {
|
|
152
|
+
const hash = createHash('sha256');
|
|
153
|
+
for await (const chunk of createReadStream(file))
|
|
154
|
+
hash.update(chunk);
|
|
155
|
+
return hash.digest('hex');
|
|
156
|
+
};
|
|
157
|
+
export const expectedSha = (sumsText, assetName) => {
|
|
158
|
+
for (const raw of sumsText.split('\n')) {
|
|
159
|
+
const line = raw.trim();
|
|
160
|
+
if (!line)
|
|
161
|
+
continue;
|
|
162
|
+
const standard = /^([0-9a-f]{64})[ \t*]+(\S.*)$/i.exec(line);
|
|
163
|
+
if (standard && standard[2] === assetName)
|
|
164
|
+
return standard[1].toLowerCase();
|
|
165
|
+
const bsd = /^SHA256\s*\((.*)\)\s*=\s*([0-9a-f]{64})$/i.exec(line);
|
|
166
|
+
if (bsd && bsd[1] === assetName)
|
|
167
|
+
return bsd[2].toLowerCase();
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
};
|
|
171
|
+
export const verifyArchiveChecksum = async (sumsText, assetName, archivePath) => {
|
|
172
|
+
const expected = expectedSha(sumsText, assetName);
|
|
173
|
+
if (!expected)
|
|
174
|
+
return { status: 'missing' };
|
|
175
|
+
const actual = await sha256File(archivePath);
|
|
176
|
+
return actual === expected
|
|
177
|
+
? { status: 'match', expected, actual }
|
|
178
|
+
: { status: 'mismatch', expected, actual };
|
|
179
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalized compiler facts for Move.
|
|
3
|
+
*
|
|
4
|
+
* `move-flow` is the authoritative source for package/module/function facts.
|
|
5
|
+
* This module keeps the raw MCP shapes in one place and exposes a stable,
|
|
6
|
+
* parsed representation that downstream projections can consume without
|
|
7
|
+
* re-querying move-flow or reparsing signatures independently.
|
|
8
|
+
*/
|
|
9
|
+
export interface MoveFlowConstant {
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
export type CallGraphMap = Record<string, string[]>;
|
|
15
|
+
/** A generic type parameter as reported by the facts query. */
|
|
16
|
+
export interface MoveFactsTypeParam {
|
|
17
|
+
name: string;
|
|
18
|
+
abilities: string[];
|
|
19
|
+
isPhantom: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** A struct field or enum-variant field. */
|
|
22
|
+
export interface MoveFactsField {
|
|
23
|
+
/** Field name, or the positional index (`"0"`, `"1"`, …) for positional fields. */
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
positional: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A parsed attribute. Recursive shape: nested `args` and assignment `value`s
|
|
30
|
+
* are serialized (keys absent when none/empty, per serde skip rules). Examples:
|
|
31
|
+
* `{ name: "view" }`
|
|
32
|
+
* `{ name: "lint::skip", args: [{ name: "needless_bool" }] }`
|
|
33
|
+
* `{ name: "resource_group_member", args: [{ name: "group", value: "0xa::vault::Group" }] }`
|
|
34
|
+
*/
|
|
35
|
+
export interface MoveFactsAttribute {
|
|
36
|
+
name: string;
|
|
37
|
+
/** Assignment value, e.g. `group = "0xa::vault::Group"` -> `"0xa::vault::Group"`. */
|
|
38
|
+
value?: string;
|
|
39
|
+
/** Nested attribute arguments (recursive). */
|
|
40
|
+
args?: MoveFactsAttribute[];
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
/** A `friend` declaration target. */
|
|
44
|
+
export interface MoveFactsFriend {
|
|
45
|
+
module: string;
|
|
46
|
+
}
|
|
47
|
+
/** One enum variant. */
|
|
48
|
+
export interface MoveFactsVariant {
|
|
49
|
+
name: string;
|
|
50
|
+
kind: 'unit' | 'positional' | 'named';
|
|
51
|
+
fields: MoveFactsField[];
|
|
52
|
+
attributes: MoveFactsAttribute[];
|
|
53
|
+
}
|
|
54
|
+
/** AST-derived resource access for a function. Every value is a
|
|
55
|
+
* fully-qualified type expression such as `"0xa::vault::Holding"`
|
|
56
|
+
* (lowercase, non-zero-padded hex addresses). */
|
|
57
|
+
export interface MoveFactsResourceAccess {
|
|
58
|
+
reads: string[];
|
|
59
|
+
writes: string[];
|
|
60
|
+
}
|
|
61
|
+
/** A function as reported by the facts query. */
|
|
62
|
+
export interface MoveFactsFunction {
|
|
63
|
+
name: string;
|
|
64
|
+
file?: string;
|
|
65
|
+
span?: [number, number];
|
|
66
|
+
visibility: string;
|
|
67
|
+
isEntry: boolean;
|
|
68
|
+
isInline: boolean;
|
|
69
|
+
isNative: boolean;
|
|
70
|
+
isView: boolean;
|
|
71
|
+
attributes?: MoveFactsAttribute[];
|
|
72
|
+
typeParams?: MoveFactsTypeParam[];
|
|
73
|
+
params?: {
|
|
74
|
+
name: string;
|
|
75
|
+
type: string;
|
|
76
|
+
}[];
|
|
77
|
+
/**
|
|
78
|
+
* Return types, one entry per tuple element: `[]` for no return, one entry
|
|
79
|
+
* for a scalar, N entries for a tuple.
|
|
80
|
+
*/
|
|
81
|
+
returnTypes: string[];
|
|
82
|
+
/** Fully-qualified resource names the function acquires (e.g. `0xa::coin::CoinStore`). */
|
|
83
|
+
acquiresInferred?: string[];
|
|
84
|
+
resourceAccess?: MoveFactsResourceAccess;
|
|
85
|
+
/** Compiler-synthesized lambda-lifted function. */
|
|
86
|
+
isLambdaLifted?: boolean;
|
|
87
|
+
/** Host function's local name for lambda-lifted functions (resolved through
|
|
88
|
+
* nested closures by move-flow). */
|
|
89
|
+
definedIn?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* A struct or enum as reported by the facts query. move-flow groups both under
|
|
93
|
+
* the module's `structs` array and distinguishes them by `kind`.
|
|
94
|
+
*/
|
|
95
|
+
export interface MoveFactsType {
|
|
96
|
+
kind: 'struct' | 'enum';
|
|
97
|
+
name: string;
|
|
98
|
+
file?: string;
|
|
99
|
+
span?: [number, number];
|
|
100
|
+
abilities: string[];
|
|
101
|
+
typeParams: MoveFactsTypeParam[];
|
|
102
|
+
/** Present for structs. */
|
|
103
|
+
fields?: MoveFactsField[];
|
|
104
|
+
/** Present for enums. */
|
|
105
|
+
variants?: MoveFactsVariant[];
|
|
106
|
+
attributes: MoveFactsAttribute[];
|
|
107
|
+
}
|
|
108
|
+
/** Per-module facts. */
|
|
109
|
+
export interface MoveFactsModule {
|
|
110
|
+
file?: string;
|
|
111
|
+
span?: [number, number];
|
|
112
|
+
friends?: MoveFactsFriend[];
|
|
113
|
+
attributes?: MoveFactsAttribute[];
|
|
114
|
+
functions?: MoveFactsFunction[];
|
|
115
|
+
/** Structs *and* enums (each tagged by `kind`), per the facts `structs` key. */
|
|
116
|
+
structs?: MoveFactsType[];
|
|
117
|
+
constants?: MoveFlowConstant[];
|
|
118
|
+
}
|
|
119
|
+
/** The full facts query response: qualified module name → facts. */
|
|
120
|
+
export type MoveFactsMap = Record<string, MoveFactsModule>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalized compiler facts for Move.
|
|
3
|
+
*
|
|
4
|
+
* `move-flow` is the authoritative source for package/module/function facts.
|
|
5
|
+
* This module keeps the raw MCP shapes in one place and exposes a stable,
|
|
6
|
+
* parsed representation that downstream projections can consume without
|
|
7
|
+
* re-querying move-flow or reparsing signatures independently.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { KnowledgeGraph } from '../graph/types.js';
|
|
2
|
+
import type { MovePackageStatus } from './mcp-client.js';
|
|
3
|
+
import type { MoveIngestOutput } from './move-ingest.js';
|
|
4
|
+
export type MoveConsistencySeverity = 'warning' | 'error';
|
|
5
|
+
export interface MoveConsistencyIssue {
|
|
6
|
+
code: 'missing-owned-caller' | 'missing-owned-callee' | 'malformed-source-evidence' | 'unresolved-resource-target'
|
|
7
|
+
/** Package with .move sources returned facts `{}` - severity policy in
|
|
8
|
+
* `emptyFactsIssue` below. */
|
|
9
|
+
| 'empty-package-facts';
|
|
10
|
+
severity: MoveConsistencySeverity;
|
|
11
|
+
message: string;
|
|
12
|
+
details?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
/** A sources-but-empty-facts package plus what `move_package_status` said
|
|
15
|
+
* (`null` = build status unavailable: older move-flow, or probe failure). */
|
|
16
|
+
export interface EmptyFactsPackage {
|
|
17
|
+
pkgRoot: string;
|
|
18
|
+
moveFileCount: number;
|
|
19
|
+
status: MovePackageStatus | null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Severity policy for a package whose facts came back `{}` despite .move
|
|
23
|
+
* sources: compiling -> warning (likely test-only, elided from facts), failing
|
|
24
|
+
* -> error carrying the compiler diagnostics, status unavailable -> pessimistic
|
|
25
|
+
* error. Pure mapping - probing the status (client I/O) stays in the phase.
|
|
26
|
+
*/
|
|
27
|
+
export declare function emptyFactsIssue(pkg: EmptyFactsPackage): MoveConsistencyIssue;
|
|
28
|
+
export declare function validateMoveIngestOutput(graph: KnowledgeGraph, moveIngest: MoveIngestOutput): MoveConsistencyIssue[];
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { moveModuleQualifiedName } from './symbol-id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Severity policy for a package whose facts came back `{}` despite .move
|
|
4
|
+
* sources: compiling -> warning (likely test-only, elided from facts), failing
|
|
5
|
+
* -> error carrying the compiler diagnostics, status unavailable -> pessimistic
|
|
6
|
+
* error. Pure mapping - probing the status (client I/O) stays in the phase.
|
|
7
|
+
*/
|
|
8
|
+
export function emptyFactsIssue(pkg) {
|
|
9
|
+
const { pkgRoot, moveFileCount, status } = pkg;
|
|
10
|
+
if (status === null) {
|
|
11
|
+
return {
|
|
12
|
+
code: 'empty-package-facts',
|
|
13
|
+
severity: 'error',
|
|
14
|
+
message: `Move package produced no facts despite containing .move sources ` +
|
|
15
|
+
`(does it compile? check \`move_package_status\`): ${pkgRoot}`,
|
|
16
|
+
details: { packageRoot: pkgRoot, moveFileCount },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (status.ok) {
|
|
20
|
+
return {
|
|
21
|
+
code: 'empty-package-facts',
|
|
22
|
+
severity: 'warning',
|
|
23
|
+
message: `Move package compiles but produced no facts - likely test-only ` +
|
|
24
|
+
`(#[test]/#[test_only] items are elided); its .move files stay un-ingested: ${pkgRoot}`,
|
|
25
|
+
details: { packageRoot: pkgRoot, moveFileCount },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const firstLine = status.diagnostics.split('\n', 1)[0]?.trim();
|
|
29
|
+
return {
|
|
30
|
+
code: 'empty-package-facts',
|
|
31
|
+
severity: 'error',
|
|
32
|
+
message: `Move package produced no facts because it does not compile` +
|
|
33
|
+
(firstLine ? ` (${firstLine})` : '') +
|
|
34
|
+
`: ${pkgRoot}`,
|
|
35
|
+
details: { packageRoot: pkgRoot, moveFileCount, diagnostics: status.diagnostics },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function validateMoveIngestOutput(graph, moveIngest) {
|
|
39
|
+
const issues = [];
|
|
40
|
+
for (const [moduleQualified, filePath] of moveIngest.moduleFileMap) {
|
|
41
|
+
if (!filePath.endsWith('.move')) {
|
|
42
|
+
issues.push({
|
|
43
|
+
code: 'malformed-source-evidence',
|
|
44
|
+
severity: 'warning',
|
|
45
|
+
message: `Move module ${moduleQualified} has non-Move source evidence: ${filePath}`,
|
|
46
|
+
details: { moduleQualified, filePath },
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const fileNode = graph.getNode(`File:${filePath}`);
|
|
51
|
+
const knownSource = moveIngest.ingestedFiles.has(filePath) || !!fileNode;
|
|
52
|
+
if (!knownSource) {
|
|
53
|
+
issues.push({
|
|
54
|
+
code: 'malformed-source-evidence',
|
|
55
|
+
severity: 'warning',
|
|
56
|
+
message: `Move module ${moduleQualified} points at a source file not seen by ingestion: ${filePath}`,
|
|
57
|
+
details: { moduleQualified, filePath },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const [packageRoot, callGraph] of moveIngest.callGraphByPackage) {
|
|
62
|
+
for (const [callerQualified, callees] of Object.entries(callGraph)) {
|
|
63
|
+
const callerModule = moveModuleQualifiedName(callerQualified);
|
|
64
|
+
if (moveIngest.modulePackageMap.has(callerModule) &&
|
|
65
|
+
!moveIngest.functionNodeMap.has(callerQualified)) {
|
|
66
|
+
issues.push({
|
|
67
|
+
code: 'missing-owned-caller',
|
|
68
|
+
severity: 'warning',
|
|
69
|
+
message: `Move call graph caller has package ownership but no function node: ${callerQualified}`,
|
|
70
|
+
details: { packageRoot, callerQualified },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
for (const calleeQualified of callees) {
|
|
74
|
+
const calleeModule = moveModuleQualifiedName(calleeQualified);
|
|
75
|
+
if (!moveIngest.modulePackageMap.has(calleeModule))
|
|
76
|
+
continue;
|
|
77
|
+
if (moveIngest.functionNodeMap.has(calleeQualified))
|
|
78
|
+
continue;
|
|
79
|
+
issues.push({
|
|
80
|
+
code: 'missing-owned-callee',
|
|
81
|
+
severity: 'warning',
|
|
82
|
+
message: `Move call graph callee belongs to this repo but has no function node: ${calleeQualified}`,
|
|
83
|
+
details: { packageRoot, callerQualified, calleeQualified },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const dropped = moveIngest.droppedResourceRefs;
|
|
89
|
+
if (dropped && dropped.length > 0) {
|
|
90
|
+
issues.push({
|
|
91
|
+
code: 'unresolved-resource-target',
|
|
92
|
+
severity: 'warning',
|
|
93
|
+
message: `${dropped.length} resource read/write/acquires target(s) could not be resolved.`,
|
|
94
|
+
details: { count: dropped.length, sample: dropped.slice(0, 5) },
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return issues;
|
|
98
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Move/Aptos constants and helpers — single source of truth for the
|
|
3
|
+
* magic strings that span the mapper, the ingest phase, the entry-point linker,
|
|
4
|
+
* and the MCP backend. A typo in any duplicated literal silently breaks a query
|
|
5
|
+
* with no compile error, so they live here.
|
|
6
|
+
*/
|
|
7
|
+
/** `NodeProperties.language` tag for every Move symbol. */
|
|
8
|
+
export declare const MOVE_LANGUAGE = "move";
|
|
9
|
+
/**
|
|
10
|
+
* Parsed Move attribute names of interest. The mapper persists the full
|
|
11
|
+
* attribute list on every Function node as `attributes: STRING[]`, so the
|
|
12
|
+
* canonical Cypher query is `WHERE '<name>' IN f.attributes`. These constants
|
|
13
|
+
* exist so the mapper, downstream filters, and tests share a typo-resistant
|
|
14
|
+
* single source of truth for the names that matter (compiler attribute names
|
|
15
|
+
* follow the move-flow `facts` payload verbatim).
|
|
16
|
+
*/
|
|
17
|
+
export declare const MOVE_ATTR: {
|
|
18
|
+
readonly EVENT: "event";
|
|
19
|
+
/** `#[persistent]` — vault burn reentrancy guard and similar invariants. */
|
|
20
|
+
readonly PERSISTENT: "persistent";
|
|
21
|
+
/** `#[randomness]` — randomness-attestation entry function. */
|
|
22
|
+
readonly RANDOMNESS: "randomness";
|
|
23
|
+
/** `#[deprecated]` — marked obsolete; flagged by Move lints. */
|
|
24
|
+
readonly DEPRECATED: "deprecated";
|
|
25
|
+
/** `#[lint::skip(...)]` — suppresses one or more Move lints. */
|
|
26
|
+
readonly LINT_SKIP: "lint::skip";
|
|
27
|
+
/** `#[resource_group(scope = ...)]` - declares a resource group. */
|
|
28
|
+
readonly RESOURCE_GROUP: "resource_group";
|
|
29
|
+
/** `#[resource_group_member(group = <qualified struct>)]` - group membership. */
|
|
30
|
+
readonly RESOURCE_GROUP_MEMBER: "resource_group_member";
|
|
31
|
+
/** `#[verify_only]` — visible to the Move Prover only; excluded from runtime. */
|
|
32
|
+
readonly VERIFY_ONLY: "verify_only";
|
|
33
|
+
/** `#[view]` — read-only view function. */
|
|
34
|
+
readonly VIEW: "view";
|
|
35
|
+
};
|
|
36
|
+
/** Move struct abilities of interest. */
|
|
37
|
+
export declare const MOVE_ABILITY: {
|
|
38
|
+
readonly KEY: "key";
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* `reason` strings for Move graph edges.
|
|
42
|
+
*
|
|
43
|
+
* Note on `friend`: move-flow's `friends` array on a module is a *compiler-
|
|
44
|
+
* derived* set that conflates two source-level concepts: explicit
|
|
45
|
+
* `friend X::Y;` declarations and the Move-2 cross-module visibility that
|
|
46
|
+
* `package fun` (and friend-restricted `public(friend)`) implicitly grants.
|
|
47
|
+
* The facts payload does not preserve which of the two produced each entry,
|
|
48
|
+
* so the `move-friend-or-package` reason is intentionally ambiguous; a
|
|
49
|
+
* downstream filter (e.g. re-parsing source) is needed to distinguish them.
|
|
50
|
+
*/
|
|
51
|
+
export declare const MOVE_EDGE_REASON: {
|
|
52
|
+
readonly definesFunction: "move-module-defines-function";
|
|
53
|
+
readonly definesStruct: "move-module-defines-struct";
|
|
54
|
+
readonly definesEnum: "move-module-defines-enum";
|
|
55
|
+
readonly definesConst: "move-module-defines-const";
|
|
56
|
+
readonly containsVariant: "move-enum-contains-variant";
|
|
57
|
+
readonly friend: "move-friend-or-package";
|
|
58
|
+
readonly calls: "move-compiler-call-graph";
|
|
59
|
+
readonly crossModuleDependency: "move-cross-module-dependency";
|
|
60
|
+
readonly moduleInFile: "move-module-in-file";
|
|
61
|
+
readonly readsResource: "move-reads_resource";
|
|
62
|
+
readonly writesResource: "move-writes_resource";
|
|
63
|
+
readonly acquires: "move-acquires";
|
|
64
|
+
readonly fnParamType: "move-fn-param-type";
|
|
65
|
+
readonly fnReturnType: "move-fn-return-type";
|
|
66
|
+
readonly resourceGroupMember: "move-resource-group-member";
|
|
67
|
+
readonly hasField: "move-struct-has-field";
|
|
68
|
+
readonly lambdaHost: "move-lambda-of-host";
|
|
69
|
+
readonly entryFunction: "move-entry-function";
|
|
70
|
+
readonly viewFunction: "move-view-function";
|
|
71
|
+
};
|
|
72
|
+
/** Error-code constant naming convention (e.g. `E_NOT_REGISTERED`). */
|
|
73
|
+
export declare const ERROR_CODE_PATTERN: RegExp;
|
|
74
|
+
/** True when a file can change compiler facts for an entire Move package. */
|
|
75
|
+
export declare function isMoveCompilerInputPath(filePath: string): boolean;
|
|
76
|
+
export interface MoveCompilerIdentity {
|
|
77
|
+
version: string;
|
|
78
|
+
source: 'release' | 'explicit' | 'path';
|
|
79
|
+
fingerprint: string;
|
|
80
|
+
}
|
|
81
|
+
/** Dynamic release coordinates used to produce a managed move-flow runtime. */
|
|
82
|
+
export interface MoveFlowReleaseSelection {
|
|
83
|
+
version: string;
|
|
84
|
+
repository: string;
|
|
85
|
+
tag: string;
|
|
86
|
+
assetName: string;
|
|
87
|
+
}
|
|
88
|
+
/** Legacy metadata with recorded Move inputs is treated conservatively. */
|
|
89
|
+
export declare function persistedMoveGraphRequiresCompiler(moveIngestAvailable: boolean | undefined, fileHashes: Record<string, string> | undefined): boolean;
|
|
90
|
+
/** Decide whether managed provisioning must run before the clean-repo fast path. */
|
|
91
|
+
export declare function shouldProvisionMoveFlowBeforeFastPath(hasMovePackages: boolean, persistedGraphRequiresCompiler: boolean, indexedCompiler: MoveCompilerIdentity | undefined, indexedRelease: MoveFlowReleaseSelection | undefined, desiredRelease: MoveFlowReleaseSelection | undefined): boolean;
|
|
92
|
+
/** Compiler-backed facts must be rebuilt when their producer changes. */
|
|
93
|
+
export declare function moveCompilerRequiresFullRebuild(hasMovePackages: boolean, compiler: MoveCompilerIdentity | undefined, indexedWithCompiler: boolean | undefined, indexedCompiler: MoveCompilerIdentity | undefined): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Make an absolute path repo-relative so node IDs and `File:` node links align.
|
|
96
|
+
* Returns the input unchanged when `repoPath` is absent or non-matching.
|
|
97
|
+
*/
|
|
98
|
+
export declare function moveRepoRelativePath(absPath: string, repoPath?: string): string;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Move/Aptos constants and helpers — single source of truth for the
|
|
3
|
+
* magic strings that span the mapper, the ingest phase, the entry-point linker,
|
|
4
|
+
* and the MCP backend. A typo in any duplicated literal silently breaks a query
|
|
5
|
+
* with no compile error, so they live here.
|
|
6
|
+
*/
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
/** `NodeProperties.language` tag for every Move symbol. */
|
|
9
|
+
export const MOVE_LANGUAGE = 'move';
|
|
10
|
+
/**
|
|
11
|
+
* Parsed Move attribute names of interest. The mapper persists the full
|
|
12
|
+
* attribute list on every Function node as `attributes: STRING[]`, so the
|
|
13
|
+
* canonical Cypher query is `WHERE '<name>' IN f.attributes`. These constants
|
|
14
|
+
* exist so the mapper, downstream filters, and tests share a typo-resistant
|
|
15
|
+
* single source of truth for the names that matter (compiler attribute names
|
|
16
|
+
* follow the move-flow `facts` payload verbatim).
|
|
17
|
+
*/
|
|
18
|
+
export const MOVE_ATTR = {
|
|
19
|
+
EVENT: 'event',
|
|
20
|
+
/** `#[persistent]` — vault burn reentrancy guard and similar invariants. */
|
|
21
|
+
PERSISTENT: 'persistent',
|
|
22
|
+
/** `#[randomness]` — randomness-attestation entry function. */
|
|
23
|
+
RANDOMNESS: 'randomness',
|
|
24
|
+
/** `#[deprecated]` — marked obsolete; flagged by Move lints. */
|
|
25
|
+
DEPRECATED: 'deprecated',
|
|
26
|
+
/** `#[lint::skip(...)]` — suppresses one or more Move lints. */
|
|
27
|
+
LINT_SKIP: 'lint::skip',
|
|
28
|
+
/** `#[resource_group(scope = ...)]` - declares a resource group. */
|
|
29
|
+
RESOURCE_GROUP: 'resource_group',
|
|
30
|
+
/** `#[resource_group_member(group = <qualified struct>)]` - group membership. */
|
|
31
|
+
RESOURCE_GROUP_MEMBER: 'resource_group_member',
|
|
32
|
+
/** `#[verify_only]` — visible to the Move Prover only; excluded from runtime. */
|
|
33
|
+
VERIFY_ONLY: 'verify_only',
|
|
34
|
+
/** `#[view]` — read-only view function. */
|
|
35
|
+
VIEW: 'view',
|
|
36
|
+
};
|
|
37
|
+
/** Move struct abilities of interest. */
|
|
38
|
+
export const MOVE_ABILITY = {
|
|
39
|
+
KEY: 'key',
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* `reason` strings for Move graph edges.
|
|
43
|
+
*
|
|
44
|
+
* Note on `friend`: move-flow's `friends` array on a module is a *compiler-
|
|
45
|
+
* derived* set that conflates two source-level concepts: explicit
|
|
46
|
+
* `friend X::Y;` declarations and the Move-2 cross-module visibility that
|
|
47
|
+
* `package fun` (and friend-restricted `public(friend)`) implicitly grants.
|
|
48
|
+
* The facts payload does not preserve which of the two produced each entry,
|
|
49
|
+
* so the `move-friend-or-package` reason is intentionally ambiguous; a
|
|
50
|
+
* downstream filter (e.g. re-parsing source) is needed to distinguish them.
|
|
51
|
+
*/
|
|
52
|
+
export const MOVE_EDGE_REASON = {
|
|
53
|
+
definesFunction: 'move-module-defines-function',
|
|
54
|
+
definesStruct: 'move-module-defines-struct',
|
|
55
|
+
definesEnum: 'move-module-defines-enum',
|
|
56
|
+
definesConst: 'move-module-defines-const',
|
|
57
|
+
containsVariant: 'move-enum-contains-variant',
|
|
58
|
+
friend: 'move-friend-or-package',
|
|
59
|
+
calls: 'move-compiler-call-graph',
|
|
60
|
+
crossModuleDependency: 'move-cross-module-dependency',
|
|
61
|
+
moduleInFile: 'move-module-in-file',
|
|
62
|
+
// Resource-access edges (function → resource struct)
|
|
63
|
+
readsResource: 'move-reads_resource',
|
|
64
|
+
writesResource: 'move-writes_resource',
|
|
65
|
+
acquires: 'move-acquires',
|
|
66
|
+
fnParamType: 'move-fn-param-type',
|
|
67
|
+
fnReturnType: 'move-fn-return-type',
|
|
68
|
+
// Struct -> resource-group struct (from `#[resource_group_member(group = ...)]`)
|
|
69
|
+
resourceGroupMember: 'move-resource-group-member',
|
|
70
|
+
// Field edges (struct → field)
|
|
71
|
+
hasField: 'move-struct-has-field',
|
|
72
|
+
// Lambda → host edges (host fn → __lambda__N__host)
|
|
73
|
+
lambdaHost: 'move-lambda-of-host',
|
|
74
|
+
// Entry-point edge reasons (ENTRY_POINT_OF)
|
|
75
|
+
entryFunction: 'move-entry-function',
|
|
76
|
+
viewFunction: 'move-view-function',
|
|
77
|
+
};
|
|
78
|
+
/** Error-code constant naming convention (e.g. `E_NOT_REGISTERED`). */
|
|
79
|
+
export const ERROR_CODE_PATTERN = /^E[_A-Z]/;
|
|
80
|
+
/** True when a file can change compiler facts for an entire Move package. */
|
|
81
|
+
export function isMoveCompilerInputPath(filePath) {
|
|
82
|
+
const normalized = filePath.replaceAll('\\', '/');
|
|
83
|
+
const basename = normalized.slice(normalized.lastIndexOf('/') + 1);
|
|
84
|
+
return normalized.endsWith('.move') || basename === 'Move.toml' || basename === 'Move.lock';
|
|
85
|
+
}
|
|
86
|
+
function sameMoveFlowReleaseSelection(left, right) {
|
|
87
|
+
return (left !== undefined &&
|
|
88
|
+
right !== undefined &&
|
|
89
|
+
left.version === right.version &&
|
|
90
|
+
left.repository === right.repository &&
|
|
91
|
+
left.tag === right.tag &&
|
|
92
|
+
left.assetName === right.assetName);
|
|
93
|
+
}
|
|
94
|
+
/** Legacy metadata with recorded Move inputs is treated conservatively. */
|
|
95
|
+
export function persistedMoveGraphRequiresCompiler(moveIngestAvailable, fileHashes) {
|
|
96
|
+
if (moveIngestAvailable !== undefined)
|
|
97
|
+
return moveIngestAvailable;
|
|
98
|
+
return Object.keys(fileHashes ?? {}).some(isMoveCompilerInputPath);
|
|
99
|
+
}
|
|
100
|
+
/** Decide whether managed provisioning must run before the clean-repo fast path. */
|
|
101
|
+
export function shouldProvisionMoveFlowBeforeFastPath(hasMovePackages, persistedGraphRequiresCompiler, indexedCompiler, indexedRelease, desiredRelease) {
|
|
102
|
+
if (!hasMovePackages)
|
|
103
|
+
return false;
|
|
104
|
+
if (!persistedGraphRequiresCompiler)
|
|
105
|
+
return true;
|
|
106
|
+
if (!indexedCompiler)
|
|
107
|
+
return true;
|
|
108
|
+
if (indexedCompiler.source !== 'release')
|
|
109
|
+
return false;
|
|
110
|
+
return !sameMoveFlowReleaseSelection(indexedRelease, desiredRelease);
|
|
111
|
+
}
|
|
112
|
+
/** Compiler-backed facts must be rebuilt when their producer changes. */
|
|
113
|
+
export function moveCompilerRequiresFullRebuild(hasMovePackages, compiler, indexedWithCompiler, indexedCompiler) {
|
|
114
|
+
if (!hasMovePackages || !compiler)
|
|
115
|
+
return false;
|
|
116
|
+
return (indexedWithCompiler !== true ||
|
|
117
|
+
!indexedCompiler ||
|
|
118
|
+
indexedCompiler.version !== compiler.version ||
|
|
119
|
+
indexedCompiler.source !== compiler.source ||
|
|
120
|
+
indexedCompiler.fingerprint !== compiler.fingerprint);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Make an absolute path repo-relative so node IDs and `File:` node links align.
|
|
124
|
+
* Returns the input unchanged when `repoPath` is absent or non-matching.
|
|
125
|
+
*/
|
|
126
|
+
export function moveRepoRelativePath(absPath, repoPath) {
|
|
127
|
+
if (!repoPath)
|
|
128
|
+
return absPath;
|
|
129
|
+
const relative = path.relative(repoPath, absPath);
|
|
130
|
+
if (relative === '')
|
|
131
|
+
return relative;
|
|
132
|
+
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
133
|
+
return absPath;
|
|
134
|
+
}
|
|
135
|
+
return relative.replaceAll(path.sep, '/');
|
|
136
|
+
}
|