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,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gitnexus-work
|
|
3
|
+
description: 'Use when executing an engineering plan produced by gitnexus-plan (or a small bounded task directly) — implements step by step with GitNexus impact checks before every symbol edit, tests from the plan''s scenarios, and detect_changes gating every commit. Examples: "/gitnexus-work docs/plans/2026-07-11-gitnexus-plan-ingestion-retry.md", "/gitnexus-work" (latest plan), "execute the plan".'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# gitnexus-work — execute a gitnexus-plan
|
|
7
|
+
|
|
8
|
+
Execute an implementation plan produced by `gitnexus-plan`, shipping it as a
|
|
9
|
+
sequence of verified, atomic commits. The plan's section 11
|
|
10
|
+
(`implementation_context` pack) is the primary machine-readable input; the
|
|
11
|
+
prose sections are its rationale. This skill **does** edit code — it is the
|
|
12
|
+
executor counterpart to the planning-only `gitnexus-plan`.
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
/gitnexus-work <plan path> # execute this plan
|
|
16
|
+
/gitnexus-work # newest docs/plans/*gitnexus-plan*.md here
|
|
17
|
+
/gitnexus-work <small task text> # direct mode, see Input triage
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Input triage
|
|
21
|
+
|
|
22
|
+
- **Plan path** (or blank → the newest `docs/plans/*gitnexus-plan*.md` under
|
|
23
|
+
the current repo root): the normal mode; continue to Phase 1. Schema-2
|
|
24
|
+
plans have a normalized repo-relative
|
|
25
|
+
`docs/plans/YYYY-MM-DD-gitnexus-plan-<3-5-word-slug>.md`
|
|
26
|
+
`generated_plan_path`. Resolve only a lexical candidate, then invoke
|
|
27
|
+
`scripts/evidence-provenance.mjs read-plan --repo <root> --generated-plan
|
|
28
|
+
<candidate>` and load only the exact bytes in its descriptor-anchored
|
|
29
|
+
receipt. Require the receipt's canonical repo-relative path to equal the
|
|
30
|
+
document's `generated_plan_path` byte-for-byte;
|
|
31
|
+
reject an external, escaping, differently scoped, or mismatched value. A
|
|
32
|
+
plan in another target repo may still be passed by explicit path. If Phase 1's
|
|
33
|
+
pre-completed check finds every §7 step of the newest plan already landed,
|
|
34
|
+
stop and ask instead of re-executing it.
|
|
35
|
+
- **Bare task text**: trivial and bounded (1–2 files, no architectural
|
|
36
|
+
decisions) → implement directly with the same discipline: `impact` before
|
|
37
|
+
every symbol edit, minimal change, tests when behavior changes,
|
|
38
|
+
verification commands taken from the repo's own scripts (package.json /
|
|
39
|
+
CI), `detect_changes` before every commit, and the shared
|
|
40
|
+
Build-current/index-current procedure before graph-dependent impact and
|
|
41
|
+
final verification. Anything larger → recommend running
|
|
42
|
+
`/gitnexus-plan` first; honor the user's choice if they decline.
|
|
43
|
+
|
|
44
|
+
## Phase 1 — Load and re-anchor the plan
|
|
45
|
+
|
|
46
|
+
1. Resolve the target repo and normalized plan candidate, then invoke this
|
|
47
|
+
skill's descriptor-anchored `scripts/evidence-provenance.mjs read-plan`
|
|
48
|
+
command exactly as
|
|
49
|
+
specified in `references/evidence-provenance.md`. Reject a missing,
|
|
50
|
+
external, escaping, symlinked, or differently scoped path. Decode and read
|
|
51
|
+
the receipt's exact `plan_bytes_base64` completely; never read or reopen the
|
|
52
|
+
lexical path directly. It is a decision artifact, not a script: scope
|
|
53
|
+
boundaries and `avoid` entries bind you; exact code is yours to write.
|
|
54
|
+
Retain the receipt's canonical `generated_plan_path` and `plan_digest` in
|
|
55
|
+
session state. Never edit the plan body.
|
|
56
|
+
2. Parse the §11 `implementation_context` pack: `acceptance_criteria`,
|
|
57
|
+
`evidence_provenance`, `primary_symbols`, `related_symbols`,
|
|
58
|
+
`files_to_modify`, `execution_path`, `pdg_constraints`,
|
|
59
|
+
`architectural_patterns`, `tests`, `verification_commands`, `risks`,
|
|
60
|
+
`assumptions`, `open_questions`, `avoid`. Compact plans carry the
|
|
61
|
+
mini-pack subset — absent optional fields are empty, not errors.
|
|
62
|
+
`evidence_provenance` is mandatory: absence or schema 1 means a legacy
|
|
63
|
+
plan, not a clean tree. Before relying on it, require exact byte-for-byte
|
|
64
|
+
equality between the read-plan receipt's canonical `generated_plan_path`
|
|
65
|
+
and `evidence_provenance.generated_plan_path`.
|
|
66
|
+
3. **Two-layer drift check — always recompute.** Even when current HEAD is the
|
|
67
|
+
same HEAD as the plan pin, recompute both the canonical global dirty digest
|
|
68
|
+
and the sorted cited-path manifest. Read
|
|
69
|
+
`references/evidence-provenance.md`, then invoke this skill's
|
|
70
|
+
`scripts/evidence-provenance.mjs` with the plan's exact
|
|
71
|
+
`generated_plan_path`, every cited manifest path, and schema version 2.
|
|
72
|
+
Never recreate its bytes in shell or prose. Schema 1 cannot be recomputed
|
|
73
|
+
unambiguously and requires conservative re-anchoring. Include
|
|
74
|
+
object kind plus HEAD/index/worktree/untracked layer digests, and classify
|
|
75
|
+
`staged`, `unstaged`, `untracked`, `deleted`, `renamed`, `mixed`,
|
|
76
|
+
and `absent` evidence. Honor the generated-plan exclusion exactly; do not
|
|
77
|
+
exclude all plans.
|
|
78
|
+
4. **Re-anchor on either mismatch.** Missing or legacy provenance, a HEAD
|
|
79
|
+
mismatch, or a global dirty digest mismatch requires a conservative
|
|
80
|
+
re-anchor before work:
|
|
81
|
+
- Diff every cited-path manifest entry. Changed cited paths — including
|
|
82
|
+
staged-only, unstaged-only, deleted, both rename endpoints, mixed
|
|
83
|
+
staged+unstaged, and disappeared untracked paths — get their cited ranges
|
|
84
|
+
re-read before reliance.
|
|
85
|
+
- Compare the current whole-tree dirty set with the pinned global digest.
|
|
86
|
+
New uncited dirty paths get a scope assessment: determine whether they
|
|
87
|
+
overlap the plan, requirements, tests, or a key technical decision; do not
|
|
88
|
+
silently ignore them merely because they are uncited.
|
|
89
|
+
- Unreadable or unclassifiable cited evidence blocks every dependent step
|
|
90
|
+
until it can be restored, read, or resolved with the user. Never substitute
|
|
91
|
+
an invented digest or treat absence as an empty file.
|
|
92
|
+
- Keep the re-anchor result in session state; never mutate the plan body.
|
|
93
|
+
Use Deepen only if reconciliation invalidates scope, requirements, a key
|
|
94
|
+
technical decision (KTD), or the planned implementation seam. Ordinary
|
|
95
|
+
byte drift that leaves those decisions valid is re-verified locally.
|
|
96
|
+
5. **Re-verify `assumptions` cheaply** (each one names what to check).
|
|
97
|
+
A failed assumption is a stop-and-replan signal for the steps that
|
|
98
|
+
depend on it, not something to code around silently.
|
|
99
|
+
6. Note `open_questions` — if one blocks a step and the answer materially
|
|
100
|
+
changes the work, ask the user before that step, not after.
|
|
101
|
+
7. **Pre-completed check.** If commits for this plan already exist on the
|
|
102
|
+
branch (a prior partial run, or a post-route-back Deepen cycle), verify
|
|
103
|
+
which §7 steps have landed at HEAD: those are skipped and reported as
|
|
104
|
+
pre-completed, and execution resumes at the first unlanded step. All
|
|
105
|
+
steps landed → report that and stop.
|
|
106
|
+
|
|
107
|
+
## Phase 2 — Environment
|
|
108
|
+
|
|
109
|
+
- On the default branch → create a feature branch named from the plan slug.
|
|
110
|
+
On a feature branch already → stay only if it is meaningful _for this
|
|
111
|
+
plan_ (name matches the plan slug, or the user confirms); otherwise
|
|
112
|
+
branch from here with the slug name.
|
|
113
|
+
- If the plan document is not yet committed, commit it now
|
|
114
|
+
(`docs(plans): add <slug> plan`) — the plan travels with the work it
|
|
115
|
+
drives, and the final review diff then includes it.
|
|
116
|
+
- Confirm the `verification_commands` from the pack actually run in this
|
|
117
|
+
checkout (dependencies installed, builds present) before starting, not
|
|
118
|
+
after the last step.
|
|
119
|
+
|
|
120
|
+
### Build-current/index-current procedure
|
|
121
|
+
|
|
122
|
+
This is the single graph-freshness procedure owned by `gitnexus-work`; it
|
|
123
|
+
applies in plan mode and direct mode. Before every graph-dependent `impact`
|
|
124
|
+
query, run the Build-current/index-current procedure. Before final graph
|
|
125
|
+
verification, run the same Build-current/index-current procedure again.
|
|
126
|
+
|
|
127
|
+
1. Capture current HEAD and working-tree provenance. Read
|
|
128
|
+
`gitnexus://repo/<name>/context` and use its typed `index.commit` and
|
|
129
|
+
`index.runner_identity` receipt — never infer analyzer identity from prose,
|
|
130
|
+
timestamps, or a path alone. Compare `index.commit` with current HEAD. A
|
|
131
|
+
current receipt has `schemaVersion: 4`, resolved runtime path/version, CLI
|
|
132
|
+
version, invoked-artifact path/digest, build
|
|
133
|
+
kind/root/canonicalization/digest, and dependency-runtime
|
|
134
|
+
manifest/lockfile/canonicalization/package-count/artifact-count/digest. Its
|
|
135
|
+
dependency canonicalization is
|
|
136
|
+
`gitnexus-analyzer-dependency-runtime-v4`. The dependency-runtime digest
|
|
137
|
+
covers resolved package metadata and complete loadable package payloads,
|
|
138
|
+
including JavaScript, JSON, native, Wasm, and parser artifacts; schema-1,
|
|
139
|
+
schema-2, and schema-3 receipts are legacy/stale (the MCP context labels
|
|
140
|
+
them `runner_identity_schema_status: legacy-or-unknown`). Require MCP
|
|
141
|
+
`index.incomplete_reasons: []`. Run the exact candidate CLI's
|
|
142
|
+
`status --json` command and require `index.runnerIdentityStatus: current`,
|
|
143
|
+
`index.incompleteReasons: []`, and top-level `status: up-to-date`. The
|
|
144
|
+
status comparator checks every semantic field while deliberately excluding
|
|
145
|
+
only diagnostic `invokedArtifact`; a worker-authored persisted receipt and
|
|
146
|
+
the CLI's live receipt may therefore differ in that field without becoming
|
|
147
|
+
stale. Missing, malformed, differently versioned, semantically unequal, or
|
|
148
|
+
incomplete receipts are unknown/stale, not a match.
|
|
149
|
+
2. Relationship-affecting committed and uncommitted edits invalidate
|
|
150
|
+
freshness after the last successful procedure run. This includes staged,
|
|
151
|
+
unstaged, untracked, deleted, or renamed analyzer/source/config changes
|
|
152
|
+
that can alter symbols or edges. Any such edit between steps requires an
|
|
153
|
+
inter-step refresh before the next graph query, even when HEAD did not move.
|
|
154
|
+
3. If the typed runner receipt is stale or unknown in an analyzer-source
|
|
155
|
+
checkout, build current local source using the verified package script. In
|
|
156
|
+
this repo: `cd gitnexus && npm run build`. Resolve the package's `bin`
|
|
157
|
+
target and run that exact artifact's `status --json` command to capture its
|
|
158
|
+
current receipt. Source/build timestamps are a conservative rebuild
|
|
159
|
+
trigger, not proof that an artifact is current.
|
|
160
|
+
4. Invoke that exact freshly built local CLI from the target repo root with
|
|
161
|
+
PDG layers enabled. In this repo:
|
|
162
|
+
`node gitnexus/dist/cli/index.js analyze --index-only --pdg`.
|
|
163
|
+
Add `--force` when the persisted receipt was absent, malformed,
|
|
164
|
+
differently versioned, or unequal so an already-up-to-date fast path cannot
|
|
165
|
+
leave legacy/stale provenance in place. The usual project-runner form,
|
|
166
|
+
`node .gitnexus/run.cjs analyze`, is acceptable only when its proven runner
|
|
167
|
+
identity resolves to that same freshly built artifact. Do not fall back to
|
|
168
|
+
an older project runner, global install, or package download after
|
|
169
|
+
resolving/building the local artifact.
|
|
170
|
+
5. Re-read index context, rerun the exact invoked CLI's `status --json`, and
|
|
171
|
+
prove the post-refresh `index.commit` equals current HEAD, MCP
|
|
172
|
+
`index.incomplete_reasons` is empty, and its complete
|
|
173
|
+
`index.runner_identity` equals status `index.runnerIdentity` (the persisted
|
|
174
|
+
receipt). Require status `index.runnerIdentityStatus: current`, empty
|
|
175
|
+
`index.incompleteReasons`, and top-level `status: up-to-date`; do not require
|
|
176
|
+
raw equality with `current.runnerIdentity` because `invokedArtifact` is a
|
|
177
|
+
diagnostic entrypoint deliberately excluded from semantic freshness.
|
|
178
|
+
Record the dirty-state digest indexed in this procedure so same-HEAD
|
|
179
|
+
uncommitted edits can invalidate it later.
|
|
180
|
+
6. Any build, refresh, metadata-read, or identity-verification failure blocks
|
|
181
|
+
graph-dependent impact work and final completion. Report the failing
|
|
182
|
+
command and evidence; do not continue on an older graph.
|
|
183
|
+
|
|
184
|
+
## Phase 3 — Execute the Implementation Sequence
|
|
185
|
+
|
|
186
|
+
Work through plan §7 step by step, in order. For each step:
|
|
187
|
+
|
|
188
|
+
1. **Fresh impact before editing.** Run the Build-current/index-current
|
|
189
|
+
procedure immediately before every graph-dependent
|
|
190
|
+
`impact {target, direction: "upstream"}` query. Then account for every
|
|
191
|
+
direct (d=1) dependent. HIGH or CRITICAL risk → surface it to the user
|
|
192
|
+
with the blast radius before proceeding (repo mandate — see AGENTS.md
|
|
193
|
+
GitNexus rules).
|
|
194
|
+
2. **Honor the constraints.** `pdg_constraints` entries state ordering and
|
|
195
|
+
dependence facts the change must preserve; `avoid` entries are hard
|
|
196
|
+
prohibitions; `architectural_patterns` name the shape to mirror (read the
|
|
197
|
+
example location before inventing one).
|
|
198
|
+
3. **Implement minimally.** The smallest change that completes the step,
|
|
199
|
+
following the surrounding code's conventions.
|
|
200
|
+
4. **Test from the plan's scenarios.** Each `tests[]` scenario (input →
|
|
201
|
+
action → expected outcome) becomes a real test in the named file. Add
|
|
202
|
+
coverage the plan missed if the step's behavior demands it; never delete
|
|
203
|
+
or weaken an assertion to make a step pass. Prove a new regression test
|
|
204
|
+
discriminates: when the failure mode is subtle, run it once against the
|
|
205
|
+
pre-fix tree (write the test before the fix, or stash the fix) and watch
|
|
206
|
+
it fail — a test that passes both ways pins nothing.
|
|
207
|
+
5. **Verify.** Run the step-relevant `verification_commands` (they carry
|
|
208
|
+
their build prerequisites; use them as written). If any part of the
|
|
209
|
+
change executes from build output — worker entrypoints, dist-shipped
|
|
210
|
+
CLIs, bundled assets — rebuild that output before every verification
|
|
211
|
+
run: a pass or fail against outdated build output is noise, and "the
|
|
212
|
+
fix doesn't work" is more often "the fix never loaded".
|
|
213
|
+
6. **Commit atomically.** `detect_changes {scope: "staged"}` before every
|
|
214
|
+
commit to confirm only the expected symbols and flows are affected
|
|
215
|
+
(repo mandate); then one conventional commit per step. Run stage →
|
|
216
|
+
`detect_changes` → commit as one unbroken sequence from the repository
|
|
217
|
+
root — interleaving other work between the gate and the commit is how
|
|
218
|
+
the gate gets skipped. Unexpected
|
|
219
|
+
affected flows → investigate before committing, not after.
|
|
220
|
+
|
|
221
|
+
A relationship-affecting implementation edit or commit invalidates the
|
|
222
|
+
procedure's prior proof. The next step must perform the required inter-step
|
|
223
|
+
refresh before its impact query; final verification refreshes again after the
|
|
224
|
+
last edit.
|
|
225
|
+
|
|
226
|
+
Steps are independently actionable: after any commit the tree is coherent.
|
|
227
|
+
If a step reveals the plan is wrong, stop that step, re-verify the affected
|
|
228
|
+
claims at HEAD, and either adapt (small, in-scope deviation — record it in
|
|
229
|
+
the commit message and final summary) or route back to `gitnexus-plan`
|
|
230
|
+
Deepen mode (structural miss) — with a one-line ask to the user when the
|
|
231
|
+
choice isn't obvious.
|
|
232
|
+
|
|
233
|
+
## Phase 4 — Finish
|
|
234
|
+
|
|
235
|
+
1. Run the full `verification_commands` suite once, at the end, even if
|
|
236
|
+
every step already passed individually.
|
|
237
|
+
2. Walk plan §13 (Definition of Done) and the pack's `acceptance_criteria`
|
|
238
|
+
item by item; anything unmet is either finished now or reported as
|
|
239
|
+
explicitly unmet — never silently dropped.
|
|
240
|
+
3. **Verify the final knowledge graph.** Before final graph verification, run
|
|
241
|
+
the same Build-current/index-current procedure after the last edit, even
|
|
242
|
+
when no commit landed or HEAD still equals the original pin. Then run
|
|
243
|
+
`detect_changes {scope: "all"}` (or the repo's equivalent final graph
|
|
244
|
+
check) against that proven-current index and account for every unexpected
|
|
245
|
+
symbol or flow. A procedure failure blocks completion.
|
|
246
|
+
4. Report: steps completed, commits made, deviations from the plan (with
|
|
247
|
+
why), assumptions that failed re-verification, DoD status, final indexed
|
|
248
|
+
commit and runner identity, and anything deferred. Test failures are
|
|
249
|
+
reported with their output, not smoothed over.
|
|
250
|
+
|
|
251
|
+
## Never
|
|
252
|
+
|
|
253
|
+
- Skip the Phase 3 gates: no symbol edit without `impact`, no commit without
|
|
254
|
+
`detect_changes`.
|
|
255
|
+
- Expand scope beyond the plan — §12's deferred follow-ups stay deferred.
|
|
256
|
+
- Mutate the plan body (committing the file verbatim in Phase 2 is not
|
|
257
|
+
mutation), weaken failing tests, or present unverified work as verified.
|
|
258
|
+
|
|
259
|
+
## Skill feedback (GitNexus repo only)
|
|
260
|
+
|
|
261
|
+
If this run exposed friction in this skill's own instructions — wrong or
|
|
262
|
+
missing guidance, a wasted tool budget, a phase that misrouted — and the repo
|
|
263
|
+
carries `eval/workflow_bench/`, append one JSON line to
|
|
264
|
+
`eval/workflow_bench/learnings.jsonl` (create the file if absent):
|
|
265
|
+
`{"skill": "gitnexus-work", "date": "YYYY-MM-DD", "task": "<one line>", "friction": "<one line>", "suggestion": "<one line>"}`.
|
|
266
|
+
Never edit this skill file itself from a live task: improvements go through
|
|
267
|
+
the offline candidate loop (`eval/workflow_bench/README.md` § Prompt and
|
|
268
|
+
skill evolution loop), where a candidate must beat the incumbent on the
|
|
269
|
+
paired benchmark before a human merges it.
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Evidence provenance serializer v2 and safe plan writer
|
|
2
|
+
|
|
3
|
+
This file is the normative byte contract for `evidence_provenance` schema 2.
|
|
4
|
+
The adjacent `scripts/evidence-provenance.mjs` is its executable definition.
|
|
5
|
+
`gitnexus-plan` and `gitnexus-work` carry byte-identical copies so either skill
|
|
6
|
+
can produce the same snapshot without relying on the other skill's install.
|
|
7
|
+
It is also the only supported write boundary for a generated plan. Never
|
|
8
|
+
recreate the digest with an ad-hoc shell pipeline or write the plan destination
|
|
9
|
+
directly.
|
|
10
|
+
|
|
11
|
+
## Invocation
|
|
12
|
+
|
|
13
|
+
From the target repository root, run the helper belonging to the active skill:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
node <skill-dir>/scripts/evidence-provenance.mjs read-plan \
|
|
17
|
+
--repo "$PWD" \
|
|
18
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`read-plan` is the only supported way to load an existing plan for Deepen or
|
|
22
|
+
execution. It emits a JSON receipt with the canonical `generated_plan_path`,
|
|
23
|
+
`bytes_read`, exact `plan_bytes_base64`, and `plan_digest` (`sha256:<hex>`).
|
|
24
|
+
Decode and consume those exact bytes; do not reopen the lexical path. Retain
|
|
25
|
+
the canonical path and digest together for the complete Deepen session; a
|
|
26
|
+
receipt for one path never authorizes another, even when their bytes match.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node <skill-dir>/scripts/evidence-provenance.mjs snapshot \
|
|
30
|
+
--repo "$PWD" \
|
|
31
|
+
--schema-version 2 \
|
|
32
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
33
|
+
--cited src/one.ts \
|
|
34
|
+
--cited test/one.test.ts
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Pass one `--cited` argument for every cited path. The helper emits the complete
|
|
38
|
+
JSON value for `evidence_provenance`; copy that value without rewriting fields.
|
|
39
|
+
`gitnexus-work` passes the plan's `schema_version`, `generated_plan_path`, and
|
|
40
|
+
every path in `cited_path_manifest`. Schema 1 is legacy and deliberately
|
|
41
|
+
rejected, so the executor must conservatively re-anchor it under schema 2.
|
|
42
|
+
|
|
43
|
+
After the snapshot is in the fully composed document, publish its exact UTF-8
|
|
44
|
+
bytes through the same helper:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node <skill-dir>/scripts/evidence-provenance.mjs write-plan \
|
|
48
|
+
--repo "$PWD" \
|
|
49
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
50
|
+
< /path/to/outside-repo-scratch-plan.md
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
For Deepen only:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
node <skill-dir>/scripts/evidence-provenance.mjs write-plan \
|
|
57
|
+
--repo "$PWD" \
|
|
58
|
+
--generated-plan docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
59
|
+
--replace \
|
|
60
|
+
--expected-plan-path docs/plans/YYYY-MM-DD-gitnexus-plan-example-change-plan.md \
|
|
61
|
+
--expected-plan-digest 'sha256:<digest-from-read-plan>' \
|
|
62
|
+
< /path/to/outside-repo-scratch-plan.md
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Initial planning never passes `--replace`; an existing destination is an
|
|
66
|
+
error. Deepen mode rewrites the same path by adding `--replace`,
|
|
67
|
+
`--expected-plan-path <generated_plan_path-from-read-plan>`, and
|
|
68
|
+
`--expected-plan-digest <plan_digest-from-that-same-receipt>`. Standard input must be
|
|
69
|
+
valid UTF-8 and at most 16 MiB. A successful write prints a JSON receipt with
|
|
70
|
+
the normalized `generated_plan_path` and `bytes_written`. A successful Deepen
|
|
71
|
+
write also returns `prior_plan_backup_git_path`, a durable Git-admin path for
|
|
72
|
+
the displaced plan. The CLI rejects every option that does not apply to its
|
|
73
|
+
selected command; the direct API likewise requires literal booleans and exact
|
|
74
|
+
digest strings rather than truthy coercion.
|
|
75
|
+
|
|
76
|
+
## Path contract
|
|
77
|
+
|
|
78
|
+
Every Git path and CLI path must be valid UTF-8, already normalized to Unicode
|
|
79
|
+
NFC, and a nonempty POSIX repo-relative path. NUL, backslash, absolute/drive
|
|
80
|
+
paths, empty components, and `.` or `..` components are rejected. The helper
|
|
81
|
+
does not silently repair or alias them. Invalid UTF-8 from Git, non-NFC names,
|
|
82
|
+
unmerged index stages, unsupported Git modes, sockets/devices/FIFOs, unreadable
|
|
83
|
+
objects, symlink traversal in a parent path component, or a repository mutation
|
|
84
|
+
observed during the snapshot fail closed.
|
|
85
|
+
|
|
86
|
+
The generated-plan path is always repo-relative under schema 2. Snapshot
|
|
87
|
+
exclusion and writing require exactly
|
|
88
|
+
`docs/plans/YYYY-MM-DD-gitnexus-plan-<3-5-word-kebab-slug>.md`, including a
|
|
89
|
+
valid calendar date; they cannot target `.git`, source, configuration, or an
|
|
90
|
+
arbitrary repo file. For compatibility with documented and legacy plans,
|
|
91
|
+
`read-plan` accepts normalized files matching `docs/plans/*gitnexus-plan*.md`,
|
|
92
|
+
while retaining the same descriptor-anchored containment checks. That read
|
|
93
|
+
compatibility does not widen the writer. External output has no schema-2
|
|
94
|
+
representation. The snapshot exclusion is one exact normalized path
|
|
95
|
+
comparison. No glob, directory, basename, or `docs/plans/`-wide exclusion is
|
|
96
|
+
permitted. If the exact path is a rename endpoint, only that endpoint record is
|
|
97
|
+
excluded.
|
|
98
|
+
|
|
99
|
+
## Safe existing-plan read contract
|
|
100
|
+
|
|
101
|
+
`read-plan` fails closed unless Linux `/proc/self/fd`, `O_DIRECTORY`, and
|
|
102
|
+
`O_NOFOLLOW` are available. It resolves the exact Git top-level, opens the
|
|
103
|
+
repository root and every plan parent as held no-follow directory descriptors,
|
|
104
|
+
rejects missing, symlink, non-directory, and escaping parents, and opens the
|
|
105
|
+
leaf with `O_NOFOLLOW`. It reads at most 16 MiB from that held file descriptor,
|
|
106
|
+
requires valid UTF-8, hashes the exact bytes, then proves both the parent chain
|
|
107
|
+
and lexical leaf still name the same held objects before returning its receipt.
|
|
108
|
+
Neither Deepen nor work may parse bytes obtained before or outside this receipt.
|
|
109
|
+
|
|
110
|
+
## Safe generated-plan write contract
|
|
111
|
+
|
|
112
|
+
The writer fails closed unless Linux `/proc/self/fd`, `O_DIRECTORY`,
|
|
113
|
+
`O_NOFOLLOW`, and Python 3 with libc `renameat2(RENAME_NOREPLACE)` support are
|
|
114
|
+
available. Python may live in `/usr/local`, a Nix profile, or another absolute
|
|
115
|
+
PATH directory, but the helper accepts only a resolved executable and
|
|
116
|
+
containing directory owned by root or the current user and not writable by
|
|
117
|
+
group/other. The resolved executable is opened without following links and
|
|
118
|
+
invoked through that held descriptor. Relative PATH entries are ignored. The plan parent and the
|
|
119
|
+
repository's Git-admin directory must also share a filesystem. It resolves
|
|
120
|
+
the target repository's exact Git top-level, opens that root and every
|
|
121
|
+
destination parent as held no-follow directory descriptors, creates missing
|
|
122
|
+
parents relative to those descriptors, and proves the descriptor and lexical
|
|
123
|
+
chains still identify the same directories at the write boundary. A symlink
|
|
124
|
+
or non-directory parent, an escaping resolved path, a symlink/non-regular final
|
|
125
|
+
target, or a parent swap is an error.
|
|
126
|
+
|
|
127
|
+
The writer creates a random exclusive temporary file relative to the held final
|
|
128
|
+
parent descriptor and keeps its no-follow descriptor open. It writes and
|
|
129
|
+
flushes the bytes, binds the temporary name to the opened inode, and hashes the
|
|
130
|
+
open file before publication. Immediately before publication it revalidates
|
|
131
|
+
the parent and the temporary path, inode, size, and digest. Publication uses an
|
|
132
|
+
atomic no-replace move relative to the held directory descriptor. Initial mode
|
|
133
|
+
therefore cannot overwrite a destination that appears after the absent check.
|
|
134
|
+
The writer then flushes the directory and revalidates the committed path by
|
|
135
|
+
opening it with `O_NOFOLLOW`, hashing both the original temporary fd and the
|
|
136
|
+
path-bound fd, and performing a second descriptor-anchored path identity check
|
|
137
|
+
after hashing. A detected mutation or replacement aborts instead of accepting
|
|
138
|
+
mixed-era output.
|
|
139
|
+
|
|
140
|
+
`--replace` accepts only a pre-existing regular file and is reserved for
|
|
141
|
+
Deepen; without it, accidental overwrite is rejected. It also requires the
|
|
142
|
+
exact canonical `generated_plan_path` and `plan_digest` from the same session's
|
|
143
|
+
`read-plan` receipt. The expected path must exactly equal the write
|
|
144
|
+
destination, so identical bytes from one plan cannot authorize another plan.
|
|
145
|
+
Immediately before
|
|
146
|
+
preservation, the writer hashes the still-held prior-plan fd and rejects any
|
|
147
|
+
digest, inode, or path mismatch, including same-inode edits and changes between
|
|
148
|
+
read and write. It then atomically moves the current destination without
|
|
149
|
+
replacement to a random `gitnexus-plan-backups/` file under the resolved
|
|
150
|
+
Git-admin directory and verifies the moved inode and digest against that held
|
|
151
|
+
fd. Only then does it publish the new plan with the same atomic no-replace
|
|
152
|
+
primitive. A destination that reappears at either boundary is left untouched.
|
|
153
|
+
|
|
154
|
+
Every newly created plan or vault directory is fsynced and then fsynced into
|
|
155
|
+
its containing directory. Every cross-directory preservation move fsyncs both
|
|
156
|
+
its source and destination directories before success or a recovery path is
|
|
157
|
+
reported. After temporary bytes exist, a failed publication or verification preserves
|
|
158
|
+
every available prior, displaced, unpublished, or intended plan in that
|
|
159
|
+
Git-admin vault before reporting failure. Each reported recovery is reopened
|
|
160
|
+
from a freshly resolved Git root and verified before the error names it as
|
|
161
|
+
`git-path:gitnexus-plan-backups/<random-name>`. Resolve that value with
|
|
162
|
+
`git rev-parse --git-path gitnexus-plan-backups/<random-name>`; never interpret
|
|
163
|
+
it as a repo-relative working-tree path. This remains valid if the held plan
|
|
164
|
+
parent was renamed after publication. The writer never reports recovery
|
|
165
|
+
through a stale lexical parent and never performs an identity-check-then-unlink
|
|
166
|
+
rollback that could delete a racer's replacement. Read-only or unsupported
|
|
167
|
+
checkouts produce a blocking error. Callers must not bypass the helper,
|
|
168
|
+
redirect to an external path, or weaken these checks.
|
|
169
|
+
|
|
170
|
+
## Canonical bytes
|
|
171
|
+
|
|
172
|
+
The `global_dirty_digest.value` is lowercase SHA-256 (without a `sha256:`
|
|
173
|
+
prefix) over this byte stream. All textual values are their exact UTF-8 bytes.
|
|
174
|
+
`NUL` below is one `0x00` byte.
|
|
175
|
+
|
|
176
|
+
1. Prefix fields, each followed by NUL, then one additional NUL:
|
|
177
|
+
`gitnexus-evidence-provenance`, `schema_version`, `2`.
|
|
178
|
+
2. Zero or more records sorted by unsigned lexicographic comparison of the
|
|
179
|
+
normalized path's UTF-8 bytes. Locale and filesystem order are forbidden.
|
|
180
|
+
3. Each record is `record` + NUL, then the following fixed-order sequence of
|
|
181
|
+
`field-name` + NUL + `field-value` + NUL pairs, then one additional NUL:
|
|
182
|
+
`path`, `state`, `head_kind`, `index_kind`, `worktree_kind`,
|
|
183
|
+
`untracked_kind`, `rename_from`, `rename_to`, `head_digest`,
|
|
184
|
+
`index_digest`, `worktree_digest`, `untracked_digest`.
|
|
185
|
+
4. The literal `absent` represents every unavailable rename endpoint, object
|
|
186
|
+
kind, and layer digest in canonical bytes. It is never an empty string.
|
|
187
|
+
|
|
188
|
+
The schema's canonicalization literal is exactly
|
|
189
|
+
`gitnexus-evidence-provenance-v2 NUL-framed UTF-8 records`. The fixed field
|
|
190
|
+
count plus the extra NUL after prefix/record makes framing unambiguous; values
|
|
191
|
+
cannot contain NUL. Duplicate normalized paths are rejected.
|
|
192
|
+
|
|
193
|
+
## Records, renames, and states
|
|
194
|
+
|
|
195
|
+
The raw dirty set comes from Git porcelain v2 with NUL termination, all
|
|
196
|
+
untracked files, submodule inspection enabled, a fixed 50% rename threshold,
|
|
197
|
+
and both `diff.renameLimit=0` and `status.renameLimit=0`, so repository config
|
|
198
|
+
cannot cap rename candidates. Raw porcelain facts that share a path are merged
|
|
199
|
+
into one canonical record. A rename contributes two endpoint facts:
|
|
200
|
+
|
|
201
|
+
- old endpoint: `path=<old>`, `rename_from=absent`, `rename_to=<new>`;
|
|
202
|
+
- new endpoint: `path=<new>`, `rename_from=<old>`, `rename_to=absent`.
|
|
203
|
+
|
|
204
|
+
Both normally have state `renamed`; record sorting, not old/new role,
|
|
205
|
+
determines order. A worktree-dirty rename destination or any endpoint that also
|
|
206
|
+
has another fact is `mixed`, with rename metadata retained. When either endpoint
|
|
207
|
+
is cited, the cited manifest expands to include both.
|
|
208
|
+
|
|
209
|
+
Ordinary `XY` status maps to `mixed` when index and worktree columns are both
|
|
210
|
+
dirty, otherwise `deleted` for a deletion, `staged` for index-only change, and
|
|
211
|
+
`unstaged` for worktree-only change. `?` is `untracked`. Multiple distinct
|
|
212
|
+
facts for the same path become `mixed`; a staged deletion plus a recreated file
|
|
213
|
+
therefore retains HEAD/index facts while the filesystem object is recorded in
|
|
214
|
+
the untracked layer. `? child/` is Git's embedded-directory marker: the trailing
|
|
215
|
+
slash is removed before path normalization and `child` is materialized as one
|
|
216
|
+
bounded directory object. A cited path outside the dirty set is `clean`,
|
|
217
|
+
`untracked` when it exists only outside Git layers, or `absent` when no layer
|
|
218
|
+
exists.
|
|
219
|
+
|
|
220
|
+
## Object and digest rules
|
|
221
|
+
|
|
222
|
+
Every present layer digest is `sha256:<lowercase-hex>`:
|
|
223
|
+
|
|
224
|
+
- HEAD regular/symlink: SHA-256 of the exact Git blob bytes. HEAD directory:
|
|
225
|
+
SHA-256 of the exact raw Git tree bytes. HEAD gitlink: SHA-256 of the ASCII
|
|
226
|
+
object ID stored by the tree.
|
|
227
|
+
- Index regular/symlink: SHA-256 of the stage-0 Git blob bytes. Index gitlink:
|
|
228
|
+
SHA-256 of its ASCII object ID. The index has no directory layer. Any
|
|
229
|
+
non-stage-0 entry is rejected.
|
|
230
|
+
- Tracked worktree regular: raw file bytes, opened without following symlinks.
|
|
231
|
+
Symlink: raw link-target bytes. Gitlink: ASCII object ID at the checked-out
|
|
232
|
+
nested HEAD, but only after `rev-parse --show-toplevel` proves that the
|
|
233
|
+
directory itself is the nested repository root, `HEAD` resolves there, and
|
|
234
|
+
porcelain v2 reports no staged, unstaged, untracked, or ignored nested changes. The
|
|
235
|
+
same root, HEAD, and clean-status proof is repeated by the mutation guard. A
|
|
236
|
+
dirty, empty, uninitialized, or parent-falling-through gitlink fails closed.
|
|
237
|
+
Directory: the v1 directory stream described below.
|
|
238
|
+
- A path absent from both HEAD and index places the filesystem object in the
|
|
239
|
+
`untracked` layer and marks `worktree` absent. A Git-backed path places it in
|
|
240
|
+
`worktree` and marks `untracked` absent. A missing layer uses literal
|
|
241
|
+
`absent` for both kind and digest; an empty file is the SHA-256 of zero bytes.
|
|
242
|
+
|
|
243
|
+
Filesystem directory bytes use prefix fields
|
|
244
|
+
`gitnexus-evidence-directory`, `schema_version`, `1`, the same NUL framing,
|
|
245
|
+
and recursive entries sorted by unsigned UTF-8 relative-path bytes. Each entry
|
|
246
|
+
has fixed fields `path`, `kind`, `digest`. A single bottom-up filesystem walk
|
|
247
|
+
visits each node once and returns each child digest plus the flattened subtree
|
|
248
|
+
needed to preserve those canonical bytes; links are never followed. When the
|
|
249
|
+
directory is proven to be an exact nested Git top-level, only its administrative
|
|
250
|
+
`.git` entry is excluded. Every other child, including working files and nested
|
|
251
|
+
directories, remains evidence.
|
|
252
|
+
|
|
253
|
+
Each directory object is bounded to 10,000 visited entries, depth 256, and 256
|
|
254
|
+
MiB of regular-file content. Exceeding a bound fails closed. These bounds apply
|
|
255
|
+
independently to each top-level directory object materialized by a record.
|
|
256
|
+
|
|
257
|
+
HEAD objects are read only from the full object ID captured at snapshot start;
|
|
258
|
+
the symbolic `HEAD` name is never re-resolved for layers. Index layers are
|
|
259
|
+
parsed from one captured stage-0 listing. The helper guards the corresponding
|
|
260
|
+
HEAD/ref/reflog controls and raw index file, compares the captured listing at
|
|
261
|
+
the end, and rejects ordinary A-to-B-to-A mutations instead of accepting
|
|
262
|
+
mixed-era layers.
|
|
263
|
+
|
|
264
|
+
Regular files are read through an `O_NOFOLLOW` descriptor with before/after
|
|
265
|
+
identity checks. Symlinks use lstat/readlink/lstat; directories record identity
|
|
266
|
+
before and after their inventory. The helper also compares raw porcelain-v2
|
|
267
|
+
status and HEAD at the start and end, then rechecks filesystem guards. An
|
|
268
|
+
absent cited path holds a no-follow descriptor for the nearest existing parent
|
|
269
|
+
and records the first missing component or leaf; that anchored absence is
|
|
270
|
+
checked both before and after the final Git status pass, so a newly created
|
|
271
|
+
ignored path cannot evade porcelain. Any observed race rejects the snapshot
|
|
272
|
+
rather than emitting mixed-era evidence.
|