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,391 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { constants as fsConstants } from 'node:fs';
|
|
4
|
+
import { access, chmod, copyFile, lstat, mkdir, mkdtemp, open, readFile, readdir, rename, rm, writeFile, } from 'node:fs/promises';
|
|
5
|
+
import { get as httpsGet } from 'node:https';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
import { downloadToFile, MAX_ARCHIVE_BYTES, sha256File, verifyArchiveChecksum, } from './artifact-download.js';
|
|
10
|
+
import { acquireInstallLock, moveFlowInstallLockWaitMs } from './install-lock.js';
|
|
11
|
+
import { isCompatibleMoveFlowVersion, MOVE_FLOW_RELEASE } from './release.js';
|
|
12
|
+
const DEFAULT_HTTP_TIMEOUT_MS = 30_000;
|
|
13
|
+
const MAX_CHECKSUM_BYTES = 1024 * 1024;
|
|
14
|
+
const MAX_BINARY_BYTES = 128 * 1024 * 1024;
|
|
15
|
+
const MAX_METADATA_BYTES = 64 * 1024;
|
|
16
|
+
const execFileAsync = promisify(execFile);
|
|
17
|
+
const parsePositiveInteger = (value, fallback) => {
|
|
18
|
+
const parsed = Number(value);
|
|
19
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
20
|
+
};
|
|
21
|
+
const validateReleaseCoordinates = (version, repository, tag) => {
|
|
22
|
+
if (!/^\d+\.\d+\.\d+$/.test(version)) {
|
|
23
|
+
throw new Error(`invalid move-flow version '${version}'; expected X.Y.Z`);
|
|
24
|
+
}
|
|
25
|
+
if (!isCompatibleMoveFlowVersion(version)) {
|
|
26
|
+
throw new Error(`unsupported move-flow major version '${version}'`);
|
|
27
|
+
}
|
|
28
|
+
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repository)) {
|
|
29
|
+
throw new Error(`invalid move-flow repository '${repository}'; expected owner/name`);
|
|
30
|
+
}
|
|
31
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(tag)) {
|
|
32
|
+
throw new Error(`invalid move-flow release tag '${tag}'`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const platformKey = (platform = process.platform, arch = process.arch) => {
|
|
36
|
+
if (platform === 'linux' && arch === 'x64')
|
|
37
|
+
return 'linux-x64';
|
|
38
|
+
if (platform === 'linux' && arch === 'arm64')
|
|
39
|
+
return 'linux-arm64';
|
|
40
|
+
if (platform === 'darwin' && arch === 'arm64')
|
|
41
|
+
return 'darwin-arm64';
|
|
42
|
+
if (platform === 'darwin' && arch === 'x64')
|
|
43
|
+
return 'darwin-x64';
|
|
44
|
+
if (platform === 'win32' && arch === 'x64')
|
|
45
|
+
return 'win32-x64';
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
const execFileOutput = (file, args, options) => execFileAsync(file, args, {
|
|
49
|
+
timeout: options.timeout,
|
|
50
|
+
env: options.env,
|
|
51
|
+
encoding: options.encoding ?? 'utf8',
|
|
52
|
+
}).then(({ stdout }) => String(stdout));
|
|
53
|
+
let detectedLinuxCompatibility;
|
|
54
|
+
const detectLinuxCompatibility = async () => {
|
|
55
|
+
if (process.arch === 'x64') {
|
|
56
|
+
try {
|
|
57
|
+
const cpuinfo = await readFile('/proc/cpuinfo', 'utf8');
|
|
58
|
+
if (!/(^|\s)avx2(\s|$)/m.test(cpuinfo))
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const output = await execFileOutput('ldd', ['--version'], { timeout: 3_000 });
|
|
67
|
+
const match = /(\d+)\.(\d+)/.exec(output.split('\n')[0] ?? '');
|
|
68
|
+
if (!match)
|
|
69
|
+
return true;
|
|
70
|
+
const major = Number(match[1]);
|
|
71
|
+
const minor = Number(match[2]);
|
|
72
|
+
return major < 2 || (major === 2 && minor < 34);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const linuxNeedsCompatBuild = (env) => {
|
|
79
|
+
if (process.platform !== 'linux')
|
|
80
|
+
return Promise.resolve(false);
|
|
81
|
+
if (env.GITNEXUS_MOVE_FLOW_COMPAT === '1')
|
|
82
|
+
return Promise.resolve(true);
|
|
83
|
+
detectedLinuxCompatibility ??= detectLinuxCompatibility();
|
|
84
|
+
return detectedLinuxCompatibility;
|
|
85
|
+
};
|
|
86
|
+
const releaseTargetForPlatform = async (key, env) => {
|
|
87
|
+
switch (key) {
|
|
88
|
+
case 'darwin-arm64':
|
|
89
|
+
return 'aarch64-apple-darwin';
|
|
90
|
+
case 'darwin-x64':
|
|
91
|
+
return 'x86_64-apple-darwin';
|
|
92
|
+
case 'linux-arm64':
|
|
93
|
+
return `aarch64-unknown-linux-gnu${(await linuxNeedsCompatBuild(env)) ? '-compat' : ''}`;
|
|
94
|
+
case 'linux-x64':
|
|
95
|
+
return `x86_64-unknown-linux-gnu${(await linuxNeedsCompatBuild(env)) ? '-compat' : ''}`;
|
|
96
|
+
case 'win32-x64':
|
|
97
|
+
return 'x86_64-pc-windows-msvc';
|
|
98
|
+
default:
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
export async function getMoveFlowInstallConfig(env = process.env) {
|
|
103
|
+
const key = platformKey();
|
|
104
|
+
if (!key)
|
|
105
|
+
return null;
|
|
106
|
+
const version = env.GITNEXUS_MOVE_FLOW_VERSION?.trim() || MOVE_FLOW_RELEASE.version;
|
|
107
|
+
const repository = env.GITNEXUS_MOVE_FLOW_REPO?.trim() || MOVE_FLOW_RELEASE.repository;
|
|
108
|
+
const tag = env.GITNEXUS_MOVE_FLOW_TAG?.trim() || `${MOVE_FLOW_RELEASE.tagPrefix}${version}`;
|
|
109
|
+
validateReleaseCoordinates(version, repository, tag);
|
|
110
|
+
const releaseTarget = await releaseTargetForPlatform(key, env);
|
|
111
|
+
if (!releaseTarget)
|
|
112
|
+
return null;
|
|
113
|
+
const assetName = `${tag}-${releaseTarget}.zip`;
|
|
114
|
+
if (path.basename(assetName) !== assetName)
|
|
115
|
+
throw new Error('invalid move-flow asset name');
|
|
116
|
+
const identity = createHash('sha256')
|
|
117
|
+
.update(`${repository}\0${tag}\0${assetName}`)
|
|
118
|
+
.digest('hex')
|
|
119
|
+
.slice(0, 12);
|
|
120
|
+
const cacheRoot = env.GITNEXUS_MOVE_FLOW_DIR?.trim()
|
|
121
|
+
? path.resolve(env.GITNEXUS_MOVE_FLOW_DIR)
|
|
122
|
+
: path.join(env.GITNEXUS_HOME?.trim() || path.join(os.homedir(), '.gitnexus'), 'tools', 'move-flow');
|
|
123
|
+
const installDir = path.join(cacheRoot, version, `${key}-${identity}`);
|
|
124
|
+
const binaryName = process.platform === 'win32' ? 'move-flow.exe' : 'move-flow';
|
|
125
|
+
return {
|
|
126
|
+
version,
|
|
127
|
+
repository,
|
|
128
|
+
tag,
|
|
129
|
+
releaseTarget,
|
|
130
|
+
assetName,
|
|
131
|
+
releaseBase: `https://github.com/${repository}/releases/download/${tag}`,
|
|
132
|
+
binaryName,
|
|
133
|
+
installDir,
|
|
134
|
+
binaryPath: path.join(installDir, binaryName),
|
|
135
|
+
metadataPath: path.join(installDir, 'release.json'),
|
|
136
|
+
lockPath: `${installDir}.install.lock`,
|
|
137
|
+
httpTimeoutMs: parsePositiveInteger(env.GITNEXUS_MOVE_FLOW_HTTP_TIMEOUT_MS, DEFAULT_HTTP_TIMEOUT_MS),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Resolve the configured release without downloading or starting move-flow. */
|
|
141
|
+
export async function getMoveFlowReleaseSelection(env = process.env) {
|
|
142
|
+
const config = await getMoveFlowInstallConfig(env);
|
|
143
|
+
return config
|
|
144
|
+
? {
|
|
145
|
+
version: config.version,
|
|
146
|
+
repository: config.repository,
|
|
147
|
+
tag: config.tag,
|
|
148
|
+
assetName: config.assetName,
|
|
149
|
+
}
|
|
150
|
+
: undefined;
|
|
151
|
+
}
|
|
152
|
+
export const powershellExpandArchiveInvocation = (archive, destination) => {
|
|
153
|
+
const archiveEnv = 'GITNEXUS_MOVE_FLOW_ARCHIVE_PATH';
|
|
154
|
+
const destinationEnv = 'GITNEXUS_MOVE_FLOW_DESTINATION_PATH';
|
|
155
|
+
return {
|
|
156
|
+
args: [
|
|
157
|
+
'-NoProfile',
|
|
158
|
+
'-NonInteractive',
|
|
159
|
+
'-Command',
|
|
160
|
+
`Expand-Archive -LiteralPath $env:${archiveEnv} -DestinationPath $env:${destinationEnv} -Force`,
|
|
161
|
+
],
|
|
162
|
+
env: {
|
|
163
|
+
...process.env,
|
|
164
|
+
[archiveEnv]: archive,
|
|
165
|
+
[destinationEnv]: destination,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
export const reportedMoveFlowVersion = (output) => /(?:^|\s)v?(\d+\.\d+\.\d+)(?:\s|$)/.exec(output)?.[1] ?? null;
|
|
170
|
+
const exactVersionMatches = async (binaryPath, version) => {
|
|
171
|
+
try {
|
|
172
|
+
const output = await execFileOutput(binaryPath, ['--version'], { timeout: 5_000 });
|
|
173
|
+
return reportedMoveFlowVersion(output) === version;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const expectedMetadata = (config) => ({
|
|
180
|
+
version: config.version,
|
|
181
|
+
repository: config.repository,
|
|
182
|
+
tag: config.tag,
|
|
183
|
+
assetName: config.assetName,
|
|
184
|
+
});
|
|
185
|
+
const verifiedBinary = (config, metadata) => ({
|
|
186
|
+
binaryPath: config.binaryPath,
|
|
187
|
+
version: metadata.version,
|
|
188
|
+
fingerprint: createHash('sha256')
|
|
189
|
+
.update(`${metadata.repository}\0${metadata.tag}\0${metadata.assetName}\0${metadata.binarySha256}`)
|
|
190
|
+
.digest('hex'),
|
|
191
|
+
});
|
|
192
|
+
const validCachedInstall = async (config) => {
|
|
193
|
+
let metadataHandle;
|
|
194
|
+
try {
|
|
195
|
+
// Single open, then every check reads through the handle, so the type/size
|
|
196
|
+
// gates and the JSON read cannot race a concurrent swap of the file
|
|
197
|
+
// (CodeQL js/file-system-race). O_NOFOLLOW makes the kernel reject a
|
|
198
|
+
// symlinked final component atomically on POSIX; Windows has no such flag
|
|
199
|
+
// (0 fallback) — there the fstat isFile() gate plus the downstream
|
|
200
|
+
// metadata/binary-hash validation carry the (home-dir, local-writer)
|
|
201
|
+
// threat model.
|
|
202
|
+
metadataHandle = await open(config.metadataPath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));
|
|
203
|
+
const metadataStat = await metadataHandle.stat();
|
|
204
|
+
if (!metadataStat.isFile() ||
|
|
205
|
+
metadataStat.size <= 0 ||
|
|
206
|
+
metadataStat.size > MAX_METADATA_BYTES) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
const metadata = JSON.parse(await metadataHandle.readFile({ encoding: 'utf8' }));
|
|
210
|
+
const expected = expectedMetadata(config);
|
|
211
|
+
const binaryStat = await lstat(config.binaryPath);
|
|
212
|
+
if (!binaryStat.isFile() || binaryStat.size <= 0 || binaryStat.size > MAX_BINARY_BYTES) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
await access(config.binaryPath, process.platform === 'win32' ? fsConstants.F_OK : fsConstants.X_OK);
|
|
216
|
+
if (metadata.schemaVersion !== 1 ||
|
|
217
|
+
metadata.version !== expected.version ||
|
|
218
|
+
metadata.repository !== expected.repository ||
|
|
219
|
+
metadata.tag !== expected.tag ||
|
|
220
|
+
metadata.assetName !== expected.assetName ||
|
|
221
|
+
metadata.binarySha256 !== (await sha256File(config.binaryPath))) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
if (!(await exactVersionMatches(config.binaryPath, config.version))) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return verifiedBinary(config, metadata);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
await metadataHandle?.close().catch(() => { });
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
export async function findCachedMoveFlowBinary(env = process.env) {
|
|
237
|
+
try {
|
|
238
|
+
const config = await getMoveFlowInstallConfig(env);
|
|
239
|
+
if (!config)
|
|
240
|
+
return null;
|
|
241
|
+
return validCachedInstall(config);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const extractZip = async (archive, destination) => {
|
|
248
|
+
await mkdir(destination, { recursive: true });
|
|
249
|
+
try {
|
|
250
|
+
if (process.platform === 'win32') {
|
|
251
|
+
const shell = process.env.ComSpec ? 'powershell.exe' : 'powershell';
|
|
252
|
+
const invocation = powershellExpandArchiveInvocation(archive, destination);
|
|
253
|
+
await execFileOutput(shell, invocation.args, { timeout: 30_000, env: invocation.env });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
await execFileOutput('unzip', ['-q', archive, '-d', destination], { timeout: 30_000 });
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
throw new Error(`could not extract ${path.basename(archive)} (${error instanceof Error ? error.message : String(error)}). ` +
|
|
260
|
+
'Install unzip, or set MOVE_FLOW to an existing move-flow binary.');
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
const findExtractedBinary = async (root, binaryName) => {
|
|
264
|
+
const stack = [root];
|
|
265
|
+
const names = new Set([binaryName, 'move-flow']);
|
|
266
|
+
const candidates = [];
|
|
267
|
+
while (stack.length > 0) {
|
|
268
|
+
const current = stack.pop();
|
|
269
|
+
if (!current)
|
|
270
|
+
break;
|
|
271
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
272
|
+
for (const entry of entries) {
|
|
273
|
+
const full = path.join(current, entry.name);
|
|
274
|
+
if (entry.isDirectory())
|
|
275
|
+
stack.push(full);
|
|
276
|
+
else if (entry.isFile() && names.has(entry.name))
|
|
277
|
+
candidates.push(full);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (candidates.length !== 1)
|
|
281
|
+
return null;
|
|
282
|
+
const candidate = candidates[0];
|
|
283
|
+
const binaryStat = await lstat(candidate);
|
|
284
|
+
return binaryStat.isFile() && binaryStat.size > 0 && binaryStat.size <= MAX_BINARY_BYTES
|
|
285
|
+
? candidate
|
|
286
|
+
: null;
|
|
287
|
+
};
|
|
288
|
+
export async function installMoveFlow(env = process.env) {
|
|
289
|
+
// GITNEXUS_SKIP_OPTIONAL_GRAMMARS is the umbrella opt-out for all optional
|
|
290
|
+
// binary downloads (honored by the retired postinstall probe too).
|
|
291
|
+
for (const flag of ['GITNEXUS_SKIP_MOVE_FLOW', 'GITNEXUS_SKIP_OPTIONAL_GRAMMARS']) {
|
|
292
|
+
if (env[flag] === '1') {
|
|
293
|
+
return { status: 'skipped', message: `installation disabled by ${flag}=1` };
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
let config;
|
|
297
|
+
try {
|
|
298
|
+
config = await getMoveFlowInstallConfig(env);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
return {
|
|
302
|
+
status: 'failed',
|
|
303
|
+
message: error instanceof Error ? error.message : String(error),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
if (!config) {
|
|
307
|
+
return {
|
|
308
|
+
status: 'unsupported',
|
|
309
|
+
message: `unsupported platform ${process.platform}-${process.arch}; set MOVE_FLOW to provide a binary`,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
const cached = await validCachedInstall(config);
|
|
313
|
+
if (cached) {
|
|
314
|
+
return { status: 'available', binary: cached };
|
|
315
|
+
}
|
|
316
|
+
let releaseLock;
|
|
317
|
+
let tempDir;
|
|
318
|
+
let stagedDir;
|
|
319
|
+
try {
|
|
320
|
+
releaseLock = await acquireInstallLock(config.lockPath, {
|
|
321
|
+
waitTimeoutMs: moveFlowInstallLockWaitMs(config.httpTimeoutMs),
|
|
322
|
+
});
|
|
323
|
+
const published = await validCachedInstall(config);
|
|
324
|
+
if (published) {
|
|
325
|
+
return { status: 'available', binary: published };
|
|
326
|
+
}
|
|
327
|
+
tempDir = await mkdtemp(path.join(os.tmpdir(), 'move-flow-'));
|
|
328
|
+
const archivePath = path.join(tempDir, config.assetName);
|
|
329
|
+
const sumsPath = path.join(tempDir, 'SHA256SUMS');
|
|
330
|
+
const extractDir = path.join(tempDir, 'extract');
|
|
331
|
+
await downloadToFile(`${config.releaseBase}/SHA256SUMS`, sumsPath, config.httpTimeoutMs, httpsGet, MAX_CHECKSUM_BYTES);
|
|
332
|
+
await downloadToFile(`${config.releaseBase}/${config.assetName}`, archivePath, config.httpTimeoutMs, httpsGet, MAX_ARCHIVE_BYTES);
|
|
333
|
+
const verification = await verifyArchiveChecksum(await readFile(sumsPath, 'utf8'), config.assetName, archivePath);
|
|
334
|
+
if (verification.status === 'missing') {
|
|
335
|
+
return {
|
|
336
|
+
status: 'failed',
|
|
337
|
+
message: `SHA256SUMS does not list ${config.assetName}; refusing to install`,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
if (verification.status === 'mismatch') {
|
|
341
|
+
return {
|
|
342
|
+
status: 'failed',
|
|
343
|
+
message: `checksum mismatch for ${config.assetName}; refusing to install`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
await extractZip(archivePath, extractDir);
|
|
347
|
+
const extracted = await findExtractedBinary(extractDir, config.binaryName);
|
|
348
|
+
if (!extracted) {
|
|
349
|
+
return {
|
|
350
|
+
status: 'failed',
|
|
351
|
+
message: `${config.assetName} did not contain ${config.binaryName}; refusing to install`,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
await mkdir(path.dirname(config.installDir), { recursive: true });
|
|
355
|
+
stagedDir = await mkdtemp(`${config.installDir}.partial-`);
|
|
356
|
+
const stagedBinary = path.join(stagedDir, config.binaryName);
|
|
357
|
+
await copyFile(extracted, stagedBinary);
|
|
358
|
+
if (process.platform !== 'win32')
|
|
359
|
+
await chmod(stagedBinary, 0o755);
|
|
360
|
+
if (!(await exactVersionMatches(stagedBinary, config.version))) {
|
|
361
|
+
return {
|
|
362
|
+
status: 'failed',
|
|
363
|
+
message: `installed binary did not report exact version ${config.version}; refusing to keep it`,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
const metadata = {
|
|
367
|
+
schemaVersion: 1,
|
|
368
|
+
...expectedMetadata(config),
|
|
369
|
+
archiveSha256: verification.actual,
|
|
370
|
+
binarySha256: await sha256File(stagedBinary),
|
|
371
|
+
};
|
|
372
|
+
await writeFile(path.join(stagedDir, 'release.json'), JSON.stringify(metadata, null, 2));
|
|
373
|
+
await rm(config.installDir, { recursive: true, force: true });
|
|
374
|
+
await rename(stagedDir, config.installDir);
|
|
375
|
+
stagedDir = undefined;
|
|
376
|
+
return { status: 'installed', binary: verifiedBinary(config, metadata) };
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
return {
|
|
380
|
+
status: 'failed',
|
|
381
|
+
message: `installation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
finally {
|
|
385
|
+
await Promise.allSettled([
|
|
386
|
+
tempDir && rm(tempDir, { recursive: true, force: true }),
|
|
387
|
+
stagedDir && rm(stagedDir, { recursive: true, force: true }),
|
|
388
|
+
releaseLock?.(),
|
|
389
|
+
]);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MoveFlowClient implementation that spawns `move-flow mcp` and communicates
|
|
3
|
+
* via MCP JSON-RPC over stdio (newline-delimited JSON).
|
|
4
|
+
*
|
|
5
|
+
* The move-flow binary (Rust/rmcp) is expected at `process.env.MOVE_FLOW`
|
|
6
|
+
* or on $PATH as `move-flow`.
|
|
7
|
+
*/
|
|
8
|
+
import type { MoveFactsMap, CallGraphMap } from './compiler-facts.js';
|
|
9
|
+
/**
|
|
10
|
+
* A move-flow tool call that failed in user space: the package could not be
|
|
11
|
+
* built (an `isError: true` tool result whose content text carries the
|
|
12
|
+
* diagnostic, e.g. "failed to build package `<path>`: <reason>") or the request
|
|
13
|
+
* parameters were rejected (JSON-RPC -32602 invalid_params). Distinguishes
|
|
14
|
+
* caller/input errors from transport and server faults so callers can render
|
|
15
|
+
* them as user-actionable.
|
|
16
|
+
*/
|
|
17
|
+
export declare class MoveFlowToolCallError extends Error {
|
|
18
|
+
/** JSON-RPC error code when the failure surfaced as a protocol error. */
|
|
19
|
+
readonly code?: number;
|
|
20
|
+
constructor(message: string, opts?: {
|
|
21
|
+
code?: number;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The move-flow surface GitNexus consumes. Defined here (not in the ingest
|
|
26
|
+
* phase) so the client owns its own contract and the ingest phase depends on
|
|
27
|
+
* the client, never the reverse.
|
|
28
|
+
*/
|
|
29
|
+
export interface MoveFlowClient {
|
|
30
|
+
/** Full-fidelity per-module facts (move_package_query query:"facts"). */
|
|
31
|
+
facts(packagePath: string): Promise<MoveFactsMap>;
|
|
32
|
+
/** Function-level call graph (caller qualified name → callee qualified names). */
|
|
33
|
+
callGraph(packagePath: string): Promise<CallGraphMap>;
|
|
34
|
+
/**
|
|
35
|
+
* Build status probe (move_package_status): does the package compile, and
|
|
36
|
+
* what did the compiler say. Older move-flow builds do not expose the tool -
|
|
37
|
+
* gate calls solely on `capabilities().hasStatusTool` (like `facts` on
|
|
38
|
+
* `hasFactsQuery`).
|
|
39
|
+
*/
|
|
40
|
+
packageStatus(packagePath: string): Promise<MovePackageStatus>;
|
|
41
|
+
/** Capability probe (cached): which queries this move-flow build supports. */
|
|
42
|
+
capabilities(): Promise<MoveFlowCapabilities>;
|
|
43
|
+
shutdown(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Result of `move_package_status`: whether the package builds, plus the raw
|
|
47
|
+
* text move-flow returned ("no errors or warnings" on success, the compiler
|
|
48
|
+
* diagnostics on failure).
|
|
49
|
+
*/
|
|
50
|
+
export interface MovePackageStatus {
|
|
51
|
+
ok: boolean;
|
|
52
|
+
diagnostics: string;
|
|
53
|
+
}
|
|
54
|
+
/** What a given move-flow build can answer. */
|
|
55
|
+
export interface MoveFlowCapabilities {
|
|
56
|
+
/** `facts` query available (rich, compiler-sourced per-module facts). */
|
|
57
|
+
hasFactsQuery: boolean;
|
|
58
|
+
/** `move_package_status` tool available (build status + diagnostics). */
|
|
59
|
+
hasStatusTool: boolean;
|
|
60
|
+
}
|
|
61
|
+
/** Minimal shape of an entry in an MCP `tools/list` response. */
|
|
62
|
+
export interface MoveFlowToolInfo {
|
|
63
|
+
name: string;
|
|
64
|
+
inputSchema?: unknown;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Derive move-flow capabilities from a `tools/list` response.
|
|
68
|
+
*
|
|
69
|
+
* `facts` is a *query type* on `move_package_query` (a `const` in the tool's
|
|
70
|
+
* `inputSchema` QueryType enum), not a standalone tool — so we detect it by
|
|
71
|
+
* inspecting the schema. A hypothetical future standalone `move_package_facts`
|
|
72
|
+
* tool is also honoured for forward-compatibility.
|
|
73
|
+
*
|
|
74
|
+
* Accepts either bare tool-name strings or `{ name, inputSchema }` entries.
|
|
75
|
+
*/
|
|
76
|
+
export declare function detectMoveFlowCapabilities(tools: ReadonlyArray<string | MoveFlowToolInfo>): MoveFlowCapabilities;
|
|
77
|
+
export declare class MoveFlowMcpClient implements MoveFlowClient {
|
|
78
|
+
private proc;
|
|
79
|
+
private requestId;
|
|
80
|
+
private pending;
|
|
81
|
+
private initialized;
|
|
82
|
+
private initPromise;
|
|
83
|
+
private capsPromise;
|
|
84
|
+
private binaryPath;
|
|
85
|
+
private stderrLines;
|
|
86
|
+
private static readonly MAX_STDERR;
|
|
87
|
+
private stderrContext;
|
|
88
|
+
constructor(binaryPath?: string);
|
|
89
|
+
private failProcess;
|
|
90
|
+
private ensureStarted;
|
|
91
|
+
private _start;
|
|
92
|
+
private send;
|
|
93
|
+
private request;
|
|
94
|
+
private callTool;
|
|
95
|
+
callGraph(packagePath: string): Promise<CallGraphMap>;
|
|
96
|
+
facts(packagePath: string): Promise<MoveFactsMap>;
|
|
97
|
+
packageStatus(packagePath: string): Promise<MovePackageStatus>;
|
|
98
|
+
/** Raw JSON-RPC request (non-`tools/call`), e.g. `tools/list`. */
|
|
99
|
+
private rpcRequest;
|
|
100
|
+
capabilities(): Promise<MoveFlowCapabilities>;
|
|
101
|
+
shutdown(): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
export interface ResolvedMoveFlowClient {
|
|
104
|
+
client: MoveFlowMcpClient;
|
|
105
|
+
version: string;
|
|
106
|
+
}
|
|
107
|
+
/** Construct a client for a binary that was already verified by the installer. */
|
|
108
|
+
export declare const createMoveFlowClient: (binaryPath: string) => MoveFlowMcpClient;
|
|
109
|
+
/**
|
|
110
|
+
* Probe and resolve a move-flow candidate exactly once, returning null when
|
|
111
|
+
* the binary is missing or reports an incompatible major version. When
|
|
112
|
+
* `binaryPath` is provided only that path is probed; otherwise resolution is
|
|
113
|
+
* `$MOVE_FLOW` (explicit override), then `move-flow` on `$PATH`.
|
|
114
|
+
*/
|
|
115
|
+
export declare function tryResolveMoveFlowClient(binaryPath?: string): ResolvedMoveFlowClient | null;
|