gitnexus 1.6.9 → 1.6.10-aptos.1
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 +236 -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 +205 -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 +16 -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 +14 -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 +74 -0
- package/dist/core/move/consistency.js +182 -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 +52 -0
- package/dist/core/move/move-ingest.js +403 -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 +9 -3
- package/dist/core/run-analyze.js +1002 -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/dist/types/pipeline.d.ts +7 -0
- 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,74 @@
|
|
|
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
|
+
/** Package skipped: move-flow could not build it (skip-and-warn, #2624). */
|
|
11
|
+
| 'package-build-failed'
|
|
12
|
+
/** Package skipped pre-flight: Move.toml [addresses] has `_` placeholders
|
|
13
|
+
* move-flow cannot resolve (it has no dev-mode build). */
|
|
14
|
+
| 'unresolved-named-address'
|
|
15
|
+
/** Package ingested, but its build carries compiler errors - move-flow
|
|
16
|
+
* silently omits inferred facts (acquires) from such builds. */
|
|
17
|
+
| 'degraded-package-facts';
|
|
18
|
+
severity: MoveConsistencySeverity;
|
|
19
|
+
message: string;
|
|
20
|
+
details?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/** A sources-but-empty-facts package plus what `move_package_status` said
|
|
23
|
+
* (`null` = build status unavailable: older move-flow, or probe failure). */
|
|
24
|
+
export interface EmptyFactsPackage {
|
|
25
|
+
pkgRoot: string;
|
|
26
|
+
moveFileCount: number;
|
|
27
|
+
status: MovePackageStatus | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Severity policy for a package whose facts came back `{}` despite .move
|
|
31
|
+
* sources: compiling -> warning (likely test-only, elided from facts), failing
|
|
32
|
+
* -> error carrying the compiler diagnostics, status unavailable -> pessimistic
|
|
33
|
+
* error. Pure mapping - probing the status (client I/O) stays in the phase.
|
|
34
|
+
*/
|
|
35
|
+
export declare function emptyFactsIssue(pkg: EmptyFactsPackage): MoveConsistencyIssue;
|
|
36
|
+
/**
|
|
37
|
+
* A package skipped because move-flow could not build it (skip-and-warn).
|
|
38
|
+
* Warning, not error: the analyze continues and the skip is surfaced in the
|
|
39
|
+
* CLI summary; GITNEXUS_MOVE_STRICT=1 restores the historical fatal behavior.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildFailedIssue(pkg: {
|
|
42
|
+
pkgRoot: string;
|
|
43
|
+
moveFileCount: number;
|
|
44
|
+
diagnostics: string;
|
|
45
|
+
}): MoveConsistencyIssue;
|
|
46
|
+
/**
|
|
47
|
+
* A package skipped pre-flight: its Move.toml `[addresses]` contains `_`
|
|
48
|
+
* placeholders. move-flow's `move_package_query` has no dev-mode, so the build
|
|
49
|
+
* would always fail with "Unresolved addresses" - skip with the remedy instead.
|
|
50
|
+
*/
|
|
51
|
+
export declare function unresolvedAddressIssue(pkg: {
|
|
52
|
+
pkgRoot: string;
|
|
53
|
+
moveFileCount: number;
|
|
54
|
+
placeholders: string[];
|
|
55
|
+
}): MoveConsistencyIssue;
|
|
56
|
+
/**
|
|
57
|
+
* A package that WAS ingested but whose build carries compiler errors.
|
|
58
|
+
* move-flow still serves structurally complete facts for such builds but
|
|
59
|
+
* silently drops inference-stage output (`acquiresInferred`), so the graph is
|
|
60
|
+
* missing ACQUIRES edges/properties — surface it instead of implying full
|
|
61
|
+
* fidelity. (Commonly: a framework dependency newer than move-flow's pinned
|
|
62
|
+
* compiler, e.g. spec pragmas it does not recognize.)
|
|
63
|
+
*/
|
|
64
|
+
export declare function degradedFactsIssue(pkg: {
|
|
65
|
+
pkgRoot: string;
|
|
66
|
+
diagnostics: string;
|
|
67
|
+
}): MoveConsistencyIssue;
|
|
68
|
+
/**
|
|
69
|
+
* The persistent CLI-summary warnings for a run's Move issues: the three
|
|
70
|
+
* skip/degrade codes are operator-actionable and must survive past the
|
|
71
|
+
* scrolling progress bar (same rationale as the FTS warning, #1161).
|
|
72
|
+
*/
|
|
73
|
+
export declare function cliWarningsFromIssues(issues: readonly MoveConsistencyIssue[]): string[];
|
|
74
|
+
export declare function validateMoveIngestOutput(graph: KnowledgeGraph, moveIngest: MoveIngestOutput): MoveConsistencyIssue[];
|
|
@@ -0,0 +1,182 @@
|
|
|
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
|
+
/** First non-empty line of a compiler diagnostic blob (for one-line summaries). */
|
|
39
|
+
function firstDiagnosticLine(diagnostics) {
|
|
40
|
+
if (!diagnostics)
|
|
41
|
+
return '';
|
|
42
|
+
for (const line of diagnostics.split('\n')) {
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (trimmed)
|
|
45
|
+
return trimmed;
|
|
46
|
+
}
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A package skipped because move-flow could not build it (skip-and-warn).
|
|
51
|
+
* Warning, not error: the analyze continues and the skip is surfaced in the
|
|
52
|
+
* CLI summary; GITNEXUS_MOVE_STRICT=1 restores the historical fatal behavior.
|
|
53
|
+
*/
|
|
54
|
+
export function buildFailedIssue(pkg) {
|
|
55
|
+
const firstLine = firstDiagnosticLine(pkg.diagnostics);
|
|
56
|
+
return {
|
|
57
|
+
code: 'package-build-failed',
|
|
58
|
+
severity: 'warning',
|
|
59
|
+
message: `Move package skipped — move-flow could not build it` +
|
|
60
|
+
(firstLine ? ` (${firstLine})` : '') +
|
|
61
|
+
`: ${pkg.pkgRoot}. Fix the package or exclude its directory via .gitnexusignore; ` +
|
|
62
|
+
`set GITNEXUS_MOVE_STRICT=1 to make build failures fatal.`,
|
|
63
|
+
details: {
|
|
64
|
+
packageRoot: pkg.pkgRoot,
|
|
65
|
+
moveFileCount: pkg.moveFileCount,
|
|
66
|
+
diagnostics: pkg.diagnostics,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A package skipped pre-flight: its Move.toml `[addresses]` contains `_`
|
|
72
|
+
* placeholders. move-flow's `move_package_query` has no dev-mode, so the build
|
|
73
|
+
* would always fail with "Unresolved addresses" - skip with the remedy instead.
|
|
74
|
+
*/
|
|
75
|
+
export function unresolvedAddressIssue(pkg) {
|
|
76
|
+
return {
|
|
77
|
+
code: 'unresolved-named-address',
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
message: `Move package skipped — named address(es) ${pkg.placeholders.join(', ')} are "_" ` +
|
|
80
|
+
`placeholders in Move.toml (move-flow cannot build dev-mode): ${pkg.pkgRoot}. ` +
|
|
81
|
+
`Set concrete addresses in [addresses] or exclude the directory via .gitnexusignore.`,
|
|
82
|
+
details: {
|
|
83
|
+
packageRoot: pkg.pkgRoot,
|
|
84
|
+
moveFileCount: pkg.moveFileCount,
|
|
85
|
+
placeholders: pkg.placeholders,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A package that WAS ingested but whose build carries compiler errors.
|
|
91
|
+
* move-flow still serves structurally complete facts for such builds but
|
|
92
|
+
* silently drops inference-stage output (`acquiresInferred`), so the graph is
|
|
93
|
+
* missing ACQUIRES edges/properties — surface it instead of implying full
|
|
94
|
+
* fidelity. (Commonly: a framework dependency newer than move-flow's pinned
|
|
95
|
+
* compiler, e.g. spec pragmas it does not recognize.)
|
|
96
|
+
*/
|
|
97
|
+
export function degradedFactsIssue(pkg) {
|
|
98
|
+
const firstLine = firstDiagnosticLine(pkg.diagnostics);
|
|
99
|
+
return {
|
|
100
|
+
code: 'degraded-package-facts',
|
|
101
|
+
severity: 'warning',
|
|
102
|
+
message: `Move package compiled with errors — compiler-inferred facts (acquires) may be ` +
|
|
103
|
+
`incomplete` +
|
|
104
|
+
(firstLine ? ` (${firstLine})` : '') +
|
|
105
|
+
`: ${pkg.pkgRoot}`,
|
|
106
|
+
details: { packageRoot: pkg.pkgRoot, diagnostics: pkg.diagnostics },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The persistent CLI-summary warnings for a run's Move issues: the three
|
|
111
|
+
* skip/degrade codes are operator-actionable and must survive past the
|
|
112
|
+
* scrolling progress bar (same rationale as the FTS warning, #1161).
|
|
113
|
+
*/
|
|
114
|
+
export function cliWarningsFromIssues(issues) {
|
|
115
|
+
const surfaced = [
|
|
116
|
+
'package-build-failed',
|
|
117
|
+
'unresolved-named-address',
|
|
118
|
+
'degraded-package-facts',
|
|
119
|
+
];
|
|
120
|
+
return issues.filter((i) => surfaced.includes(i.code)).map((i) => i.message);
|
|
121
|
+
}
|
|
122
|
+
export function validateMoveIngestOutput(graph, moveIngest) {
|
|
123
|
+
const issues = [];
|
|
124
|
+
for (const [moduleQualified, filePath] of moveIngest.moduleFileMap) {
|
|
125
|
+
if (!filePath.endsWith('.move')) {
|
|
126
|
+
issues.push({
|
|
127
|
+
code: 'malformed-source-evidence',
|
|
128
|
+
severity: 'warning',
|
|
129
|
+
message: `Move module ${moduleQualified} has non-Move source evidence: ${filePath}`,
|
|
130
|
+
details: { moduleQualified, filePath },
|
|
131
|
+
});
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const fileNode = graph.getNode(`File:${filePath}`);
|
|
135
|
+
const knownSource = moveIngest.ingestedFiles.has(filePath) || !!fileNode;
|
|
136
|
+
if (!knownSource) {
|
|
137
|
+
issues.push({
|
|
138
|
+
code: 'malformed-source-evidence',
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
message: `Move module ${moduleQualified} points at a source file not seen by ingestion: ${filePath}`,
|
|
141
|
+
details: { moduleQualified, filePath },
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const [packageRoot, callGraph] of moveIngest.callGraphByPackage) {
|
|
146
|
+
for (const [callerQualified, callees] of Object.entries(callGraph)) {
|
|
147
|
+
const callerModule = moveModuleQualifiedName(callerQualified);
|
|
148
|
+
if (moveIngest.modulePackageMap.has(callerModule) &&
|
|
149
|
+
!moveIngest.functionNodeMap.has(callerQualified)) {
|
|
150
|
+
issues.push({
|
|
151
|
+
code: 'missing-owned-caller',
|
|
152
|
+
severity: 'warning',
|
|
153
|
+
message: `Move call graph caller has package ownership but no function node: ${callerQualified}`,
|
|
154
|
+
details: { packageRoot, callerQualified },
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
for (const calleeQualified of callees) {
|
|
158
|
+
const calleeModule = moveModuleQualifiedName(calleeQualified);
|
|
159
|
+
if (!moveIngest.modulePackageMap.has(calleeModule))
|
|
160
|
+
continue;
|
|
161
|
+
if (moveIngest.functionNodeMap.has(calleeQualified))
|
|
162
|
+
continue;
|
|
163
|
+
issues.push({
|
|
164
|
+
code: 'missing-owned-callee',
|
|
165
|
+
severity: 'warning',
|
|
166
|
+
message: `Move call graph callee belongs to this repo but has no function node: ${calleeQualified}`,
|
|
167
|
+
details: { packageRoot, callerQualified, calleeQualified },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const dropped = moveIngest.droppedResourceRefs;
|
|
173
|
+
if (dropped && dropped.length > 0) {
|
|
174
|
+
issues.push({
|
|
175
|
+
code: 'unresolved-resource-target',
|
|
176
|
+
severity: 'warning',
|
|
177
|
+
message: `${dropped.length} resource read/write/acquires target(s) could not be resolved.`,
|
|
178
|
+
details: { count: dropped.length, sample: dropped.slice(0, 5) },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return issues;
|
|
182
|
+
}
|
|
@@ -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;
|