kibi-cli 0.19.0 → 2.0.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/dist/cli-errors.d.ts +3 -1
- package/dist/cli-errors.d.ts.map +1 -1
- package/dist/cli-errors.js +4 -1
- package/dist/cli-json-command.d.ts +1 -0
- package/dist/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +13 -4
- package/dist/cli-operation-loader.d.ts.map +1 -1
- package/dist/cli-operation-loader.js +53 -20
- package/dist/cli-operation-metadata.d.ts +21 -8
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +27 -10
- package/dist/cli-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +38 -8
- package/dist/cli-register-foundation.d.ts.map +1 -1
- package/dist/cli-register-foundation.js +14 -2
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +33 -4
- package/dist/cli-register-proof.d.ts +3 -0
- package/dist/cli-register-proof.d.ts.map +1 -0
- package/dist/cli-register-proof.js +103 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +11 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -8
- package/dist/commands/aggregated-checks.d.ts +1 -2
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +14 -9
- package/dist/commands/branch.d.ts +37 -0
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +375 -40
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +209 -110
- package/dist/commands/coverage.d.ts +1 -0
- package/dist/commands/coverage.d.ts.map +1 -1
- package/dist/commands/coverage.js +6 -0
- package/dist/commands/discovery-shared.d.ts.map +1 -1
- package/dist/commands/discovery-shared.js +10 -19
- package/dist/commands/doctor.d.ts +26 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +291 -30
- package/dist/commands/engine.d.ts +12 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +50 -7
- package/dist/commands/gc.d.ts +5 -2
- package/dist/commands/gc.d.ts.map +1 -1
- package/dist/commands/gc.js +140 -71
- package/dist/commands/github-init.d.ts +57 -0
- package/dist/commands/github-init.d.ts.map +1 -0
- package/dist/commands/github-init.js +314 -0
- package/dist/commands/init-helpers.d.ts +1 -1
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +109 -28
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +79 -24
- package/dist/commands/legacy-storage-migration.d.ts +54 -0
- package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
- package/dist/commands/legacy-storage-migration.js +277 -0
- package/dist/commands/migrate.d.ts +11 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +249 -96
- package/dist/commands/proof-migrate-legacy.d.ts +7 -0
- package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
- package/dist/commands/proof-migrate-legacy.js +45 -0
- package/dist/commands/proof-prune.d.ts +8 -0
- package/dist/commands/proof-prune.d.ts.map +1 -0
- package/dist/commands/proof-prune.js +53 -0
- package/dist/commands/prove.d.ts +37 -0
- package/dist/commands/prove.d.ts.map +1 -0
- package/dist/commands/prove.js +470 -0
- package/dist/commands/report.d.ts +24 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +191 -0
- package/dist/commands/sync/cache.d.ts +16 -3
- package/dist/commands/sync/cache.d.ts.map +1 -1
- package/dist/commands/sync/cache.js +111 -4
- package/dist/commands/sync/discovery.d.ts +26 -2
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +204 -15
- package/dist/commands/sync/extraction.d.ts +8 -1
- package/dist/commands/sync/extraction.d.ts.map +1 -1
- package/dist/commands/sync/extraction.js +38 -4
- package/dist/commands/sync/manifest.d.ts +9 -6
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +195 -60
- package/dist/commands/sync/persistence.d.ts +4 -1
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +26 -12
- package/dist/commands/sync/staging.d.ts +1 -0
- package/dist/commands/sync/staging.d.ts.map +1 -1
- package/dist/commands/sync/staging.js +5 -2
- package/dist/commands/sync/untracked-targets.d.ts +24 -0
- package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
- package/dist/commands/sync/untracked-targets.js +108 -0
- package/dist/commands/sync.d.ts +17 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +375 -106
- package/dist/diagnostics.d.ts +1 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/engine-daemon.d.ts +3 -1
- package/dist/engine-daemon.d.ts.map +1 -1
- package/dist/engine-daemon.js +49 -20
- package/dist/engine.d.ts +34 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +578 -42
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +5 -6
- package/dist/extractors/manifest.d.ts +13 -1
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +97 -10
- package/dist/extractors/markdown.d.ts +5 -2
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +47 -12
- package/dist/extractors/playwright-cases.d.ts +24 -0
- package/dist/extractors/playwright-cases.d.ts.map +1 -0
- package/dist/extractors/playwright-cases.js +126 -0
- package/dist/extractors/relationships.d.ts +6 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +2 -1
- package/dist/extractors/symbol-coordinates.d.ts +81 -3
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
- package/dist/extractors/symbol-coordinates.js +389 -51
- package/dist/extractors/symbols-coordinator.js +11 -1
- package/dist/extractors/symbols-ts.d.ts +1 -0
- package/dist/extractors/symbols-ts.d.ts.map +1 -1
- package/dist/extractors/symbols-ts.js +142 -67
- package/dist/intent-search.d.ts +61 -0
- package/dist/intent-search.d.ts.map +1 -0
- package/dist/intent-search.js +437 -0
- package/dist/logic/ir.d.ts +1 -0
- package/dist/logic/ir.d.ts.map +1 -1
- package/dist/logic/ir.js +1 -1
- package/dist/operations/bootstrap/activation.d.ts +5 -0
- package/dist/operations/bootstrap/activation.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/activation.js +58 -33
- package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
- package/dist/operations/bootstrap/candidates.d.ts +4 -0
- package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
- package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
- package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
- package/dist/operations/bootstrap/generate.d.ts +9 -0
- package/dist/operations/bootstrap/generate.d.ts.map +1 -0
- package/dist/operations/bootstrap/generate.js +207 -0
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
- package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +3 -2
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/guidance.js +3 -1
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
- package/dist/operations/bootstrap/presentation.d.ts +15 -0
- package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
- package/dist/operations/bootstrap/presentation.js +177 -0
- package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
- package/dist/operations/bootstrap/types.d.ts.map +1 -0
- package/dist/operations/bootstrap/types.js +25 -0
- package/dist/operations/modeling/model-requirement.d.ts +5 -0
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +57 -63
- package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
- package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-applicability.js +375 -0
- package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
- package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applyplan.js +100 -3
- package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
- package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-bindings.js +122 -0
- package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-2.js +18 -2
- package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-3.js +17 -1
- package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-4.js +155 -0
- package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
- package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-catalog-5.js +291 -0
- package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog.js +4 -0
- package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference-1.js +8 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
- package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference.js +4 -0
- package/dist/operations/modeling/predicate-loader.d.ts +1 -0
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +11 -3
- package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
- package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-ranker.js +159 -24
- package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-score-3.js +6 -0
- package/dist/operations/modeling/predicate-types.d.ts +35 -1
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
- package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
- package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
- package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-utils.js +2 -0
- package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +203 -32
- package/dist/operations/mutation/contradictions.d.ts +2 -1
- package/dist/operations/mutation/contradictions.d.ts.map +1 -1
- package/dist/operations/mutation/contradictions.js +26 -5
- package/dist/operations/mutation/delete.d.ts +3 -0
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +483 -19
- package/dist/operations/mutation/entity-projection.d.ts +11 -0
- package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
- package/dist/operations/mutation/entity-projection.js +14 -0
- package/dist/operations/mutation/relationships.d.ts +11 -0
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +77 -5
- package/dist/operations/mutation/saga.d.ts +51 -0
- package/dist/operations/mutation/saga.d.ts.map +1 -0
- package/dist/operations/mutation/saga.js +67 -0
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +3 -1
- package/dist/operations/mutation/source-authoring.d.ts +65 -0
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
- package/dist/operations/mutation/source-authoring.js +576 -0
- package/dist/operations/mutation/strict-fact.d.ts +1 -0
- package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
- package/dist/operations/mutation/strict-fact.js +8 -5
- package/dist/operations/mutation/symbol-compiler-lock.d.ts +54 -0
- package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
- package/dist/operations/mutation/symbol-compiler-lock.js +337 -0
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +35 -4
- package/dist/operations/mutation/symbol-refresh.d.ts +19 -1
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +227 -63
- package/dist/operations/mutation/types.d.ts +57 -1
- package/dist/operations/mutation/types.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.d.ts +18 -2
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +403 -32
- package/dist/operations/mutation/validate-upsert.js +2 -2
- package/dist/operations/mutation/validation.d.ts.map +1 -1
- package/dist/operations/mutation/validation.js +47 -4
- package/dist/operations/mutation/warnings.d.ts +1 -0
- package/dist/operations/mutation/warnings.d.ts.map +1 -1
- package/dist/operations/mutation/warnings.js +7 -5
- package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
- package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
- package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
- package/dist/operations/planning/apply-plan.d.ts +19 -0
- package/dist/operations/planning/apply-plan.d.ts.map +1 -0
- package/dist/operations/planning/apply-plan.js +1514 -0
- package/dist/operations/planning/compile-intent.d.ts +108 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -0
- package/dist/operations/planning/compile-intent.js +618 -0
- package/dist/operations/proof/ingest-proof.d.ts +34 -0
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
- package/dist/operations/proof/ingest-proof.js +307 -0
- package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
- package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
- package/dist/operations/proof/migrate-legacy-receipts.js +88 -0
- package/dist/operations/proof/prune-receipts.d.ts +35 -0
- package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
- package/dist/operations/proof/prune-receipts.js +91 -0
- package/dist/operations/proof/receipt-document.d.ts +29 -0
- package/dist/operations/proof/receipt-document.d.ts.map +1 -0
- package/dist/operations/proof/receipt-document.js +117 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +52 -28
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +35 -9
- package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
- package/dist/operations/semantic-advisor/types.d.ts +13 -5
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/prolog/codec.d.ts +13 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +269 -153
- package/dist/prolog/error-terms.d.ts +47 -0
- package/dist/prolog/error-terms.d.ts.map +1 -0
- package/dist/prolog/error-terms.js +334 -0
- package/dist/prolog/janitor.d.ts +50 -0
- package/dist/prolog/janitor.d.ts.map +1 -0
- package/dist/prolog/janitor.js +154 -0
- package/dist/prolog/store-lock.d.ts +45 -0
- package/dist/prolog/store-lock.d.ts.map +1 -0
- package/dist/prolog/store-lock.js +195 -0
- package/dist/prolog.d.ts +7 -0
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +82 -25
- package/dist/proof/evaluate.d.ts +27 -0
- package/dist/proof/evaluate.d.ts.map +1 -0
- package/dist/proof/evaluate.js +151 -0
- package/dist/proof/inspect.d.ts +12 -0
- package/dist/proof/inspect.d.ts.map +1 -0
- package/dist/proof/inspect.js +236 -0
- package/dist/proof/integrations.d.ts +35 -0
- package/dist/proof/integrations.d.ts.map +1 -0
- package/dist/proof/integrations.js +123 -0
- package/dist/proof/producers/junit-adapter.d.ts +26 -0
- package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
- package/dist/proof/producers/junit-adapter.js +186 -0
- package/dist/proof/producers/playwright-case-id.d.ts +8 -0
- package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
- package/dist/proof/producers/playwright-case-id.js +25 -0
- package/dist/proof/producers/playwright-reporter.d.ts +27 -0
- package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
- package/dist/proof/producers/playwright-reporter.js +138 -0
- package/dist/proof/producers/tap-adapter.d.ts +10 -0
- package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
- package/dist/proof/producers/tap-adapter.js +200 -0
- package/dist/proof/receipt-outcome.d.ts +2 -0
- package/dist/proof/receipt-outcome.d.ts.map +1 -0
- package/dist/proof/receipt-outcome.js +1 -0
- package/dist/public/branch-resolver.d.ts +1 -0
- package/dist/public/branch-resolver.d.ts.map +1 -1
- package/dist/public/branch-resolver.js +1 -0
- package/dist/public/check-types.d.ts +2 -2
- package/dist/public/check-types.d.ts.map +1 -1
- package/dist/public/check-types.js +16 -16
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +74 -6
- package/dist/public/distribution-parity.d.ts +7 -1
- package/dist/public/distribution-parity.d.ts.map +1 -1
- package/dist/public/distribution-parity.js +15 -9
- package/dist/public/ignore-policy.d.ts.map +1 -1
- package/dist/public/ignore-policy.js +16 -4
- package/dist/public/impact/coverage-depth-quality.d.ts +7 -1
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +22 -4
- package/dist/public/impact/diagnostics.d.ts.map +1 -1
- package/dist/public/impact/diagnostics.js +2 -2
- package/dist/public/impact/diff-meaning.d.ts +1 -0
- package/dist/public/impact/diff-meaning.d.ts.map +1 -1
- package/dist/public/impact/diff-meaning.js +5 -2
- package/dist/public/impact/full-kb-quality.d.ts +7 -2
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +364 -39
- package/dist/public/impact/manifest.d.ts.map +1 -1
- package/dist/public/impact/manifest.js +2 -5
- package/dist/public/operational-artifacts.d.ts.map +1 -1
- package/dist/public/operational-artifacts.js +7 -1
- package/dist/public/operations/catalog.d.ts +900 -34
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +130 -6
- package/dist/public/operations/check-executor.d.ts +2 -2
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +68 -13
- package/dist/public/operations/check-format-shared.d.ts +3 -0
- package/dist/public/operations/check-format-shared.d.ts.map +1 -1
- package/dist/public/operations/check-format-shared.js +3 -0
- package/dist/public/operations/check-helpers.d.ts +27 -2
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +62 -26
- package/dist/public/operations/contracts.d.ts +18 -0
- package/dist/public/operations/contracts.d.ts.map +1 -0
- package/dist/public/operations/contracts.js +334 -0
- package/dist/public/operations/discovery-entities.d.ts +3 -0
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +4 -0
- package/dist/public/operations/discovery-executors.d.ts +43 -7
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +216 -13
- package/dist/public/operations/index.d.ts +9 -4
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +8 -3
- package/dist/public/operations/migration-plan.d.ts +102 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -0
- package/dist/public/operations/migration-plan.js +539 -0
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +71 -11
- package/dist/public/operations/prolog-json.d.ts +14 -0
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +44 -5
- package/dist/public/operations/repair-plan.d.ts +3 -3
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +49 -18
- package/dist/public/operations/result-envelope.d.ts +14 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -0
- package/dist/public/operations/result-envelope.js +106 -0
- package/dist/public/operations/runtime-types.d.ts +102 -7
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/source-relationship-parity.d.ts +13 -0
- package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
- package/dist/public/operations/source-relationship-parity.js +162 -0
- package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
- package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
- package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
- package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
- package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
- package/dist/public/operations/specs/check-rules.generated.js +34 -0
- package/dist/public/operations/specs/check.d.ts +9 -4
- package/dist/public/operations/specs/check.d.ts.map +1 -1
- package/dist/public/operations/specs/check.js +10 -21
- package/dist/public/operations/specs/discovery.d.ts +87 -3
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +53 -3
- package/dist/public/operations/specs/modeling.d.ts +3 -3
- package/dist/public/operations/specs/modeling.js +3 -3
- package/dist/public/operations/specs/mutation-schemas.d.ts +251 -14
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +16 -6
- package/dist/public/operations/specs/mutation.d.ts +42 -2
- package/dist/public/operations/specs/mutation.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation.js +26 -2
- package/dist/public/operations/specs/planning.d.ts +279 -0
- package/dist/public/operations/specs/planning.d.ts.map +1 -0
- package/dist/public/operations/specs/planning.js +197 -0
- package/dist/public/operations/specs/proof.d.ts +212 -0
- package/dist/public/operations/specs/proof.d.ts.map +1 -0
- package/dist/public/operations/specs/proof.js +30 -0
- package/dist/public/operations/specs/reporting.d.ts +23 -1
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +156 -11
- package/dist/public/operations/specs/upsert.d.ts +265 -14
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +9 -0
- package/dist/public/operations/symbol-repair-plan.d.ts +22 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
- package/dist/public/operations/symbol-repair-plan.js +238 -0
- package/dist/public/operations/types.d.ts +52 -1
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/proof-fingerprint.d.ts +54 -0
- package/dist/public/proof-fingerprint.d.ts.map +1 -0
- package/dist/public/proof-fingerprint.js +141 -0
- package/dist/public/proof-protocol.d.ts +354 -0
- package/dist/public/proof-protocol.d.ts.map +1 -0
- package/dist/public/proof-protocol.js +454 -0
- package/dist/public/proof-receipt.d.ts +279 -0
- package/dist/public/proof-receipt.d.ts.map +1 -0
- package/dist/public/proof-receipt.js +377 -0
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +22 -6
- package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
- package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
- package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/dist/public/skills/kibi-usage/SKILL.md +136 -231
- package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
- package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +57 -4
- package/dist/public/symbol-granularity.d.ts +3 -14
- package/dist/public/symbol-granularity.d.ts.map +1 -1
- package/dist/public/symbol-granularity.generated.d.ts +16 -0
- package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
- package/dist/public/symbol-granularity.generated.js +20 -0
- package/dist/public/symbol-granularity.js +6 -46
- package/dist/public/telemetry-acceptance.d.ts +3 -70
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +11 -2
- package/dist/public/telemetry-remediation.js +1 -1
- package/dist/relationships/shards.d.ts +16 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +87 -2
- package/dist/report/brand.d.ts +19 -0
- package/dist/report/brand.d.ts.map +1 -0
- package/dist/report/brand.js +112 -0
- package/dist/report/html-report.css +282 -0
- package/dist/report/html-report.d.ts +21 -0
- package/dist/report/html-report.d.ts.map +1 -0
- package/dist/report/html-report.js +700 -0
- package/dist/report/relative-time.d.ts +4 -0
- package/dist/report/relative-time.d.ts.map +1 -0
- package/dist/report/relative-time.js +46 -0
- package/dist/report/report-view.d.ts +17 -0
- package/dist/report/report-view.d.ts.map +1 -0
- package/dist/report/report-view.js +33 -0
- package/dist/report/repository.d.ts +35 -0
- package/dist/report/repository.d.ts.map +1 -0
- package/dist/report/repository.js +151 -0
- package/dist/runtime/cli-runtime.d.ts +2 -0
- package/dist/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runtime/cli-runtime.js +90 -23
- package/dist/schemas/entity.schema.json +1254 -239
- package/dist/search-ranking.d.ts +1 -0
- package/dist/search-ranking.d.ts.map +1 -1
- package/dist/search-ranking.js +3 -0
- package/dist/traceability/evidence-model.d.ts +30 -2
- package/dist/traceability/evidence-model.d.ts.map +1 -1
- package/dist/traceability/evidence-model.js +2 -2
- package/dist/traceability/git-staged.d.ts +20 -0
- package/dist/traceability/git-staged.d.ts.map +1 -1
- package/dist/traceability/git-staged.js +156 -37
- package/dist/traceability/markdown-validate.d.ts.map +1 -1
- package/dist/traceability/markdown-validate.js +12 -7
- package/dist/traceability/staged-diagnostics.d.ts +7 -0
- package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
- package/dist/traceability/staged-diagnostics.js +78 -7
- package/dist/traceability/staged-file-coverage.d.ts +33 -0
- package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
- package/dist/traceability/staged-file-coverage.js +284 -0
- package/dist/traceability/staged-impact-contract.d.ts +3 -3
- package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
- package/dist/traceability/staged-impact-contract.js +12 -40
- package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
- package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
- package/dist/traceability/staged-symbols-manifest.js +142 -26
- package/dist/traceability/symbol-extract.d.ts +5 -0
- package/dist/traceability/symbol-extract.d.ts.map +1 -1
- package/dist/traceability/symbol-extract.js +1 -1
- package/dist/traceability/temp-kb.d.ts +2 -0
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +14 -2
- package/dist/types/entities.d.ts +5 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/utils/branch-resolver.d.ts +25 -10
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +124 -38
- package/dist/utils/branch-store-locator.d.ts +23 -0
- package/dist/utils/branch-store-locator.d.ts.map +1 -0
- package/dist/utils/branch-store-locator.js +90 -0
- package/dist/utils/branch-store.d.ts +21 -0
- package/dist/utils/branch-store.d.ts.map +1 -0
- package/dist/utils/branch-store.js +157 -0
- package/dist/utils/config.d.ts +39 -37
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +107 -119
- package/dist/utils/kb-manifest.d.ts +35 -0
- package/dist/utils/kb-manifest.d.ts.map +1 -0
- package/dist/utils/kb-manifest.js +154 -0
- package/dist/utils/kb-paths.d.ts +54 -0
- package/dist/utils/kb-paths.d.ts.map +1 -0
- package/dist/utils/kb-paths.js +125 -0
- package/dist/utils/manifest-paths.d.ts +4 -4
- package/dist/utils/manifest-paths.d.ts.map +1 -1
- package/dist/utils/manifest-paths.js +8 -56
- package/dist/utils/rule-registry.d.ts +42 -24
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.d.ts +97 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -0
- package/dist/utils/rule-registry.generated.js +125 -0
- package/dist/utils/rule-registry.js +52 -148
- package/dist/utils/schema-version.d.ts +5 -5
- package/dist/utils/schema-version.d.ts.map +1 -1
- package/dist/utils/schema-version.js +26 -6
- package/dist/utils/strict-modeling.d.ts +1 -4
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +8 -9
- package/package.json +47 -11
- package/schema/config.json +2 -2
- package/schema/manifest.json +26 -0
- package/src/public/branch-resolver.ts +1 -0
- package/src/public/check-types.ts +22 -19
- package/src/public/diagnostic-usage.ts +84 -6
- package/src/public/distribution-parity.ts +17 -9
- package/src/public/ignore-policy.ts +16 -10
- package/src/public/impact/coverage-depth-quality.ts +37 -1
- package/src/public/impact/diagnostics.ts +2 -1
- package/src/public/impact/diff-meaning.ts +11 -4
- package/src/public/impact/full-kb-quality.ts +545 -41
- package/src/public/impact/manifest.ts +2 -4
- package/src/public/operational-artifacts.ts +9 -1
- package/src/public/operations/catalog.ts +153 -10
- package/src/public/operations/check-executor.ts +98 -15
- package/src/public/operations/check-format-shared.ts +6 -0
- package/src/public/operations/check-helpers.ts +74 -35
- package/src/public/operations/contracts.ts +382 -0
- package/src/public/operations/discovery-entities.ts +7 -0
- package/src/public/operations/discovery-executors.ts +315 -25
- package/src/public/operations/index.ts +9 -4
- package/src/public/operations/migration-plan.ts +747 -0
- package/src/public/operations/node-ports.ts +87 -13
- package/src/public/operations/prolog-json.ts +60 -5
- package/src/public/operations/repair-plan.ts +60 -22
- package/src/public/operations/result-envelope.ts +141 -0
- package/src/public/operations/runtime-types.ts +96 -5
- package/src/public/operations/source-relationship-parity.ts +226 -0
- package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
- package/src/public/operations/specs/check-rules.generated.ts +37 -0
- package/src/public/operations/specs/check.ts +14 -22
- package/src/public/operations/specs/discovery.ts +57 -3
- package/src/public/operations/specs/modeling.ts +3 -3
- package/src/public/operations/specs/mutation-schemas.ts +24 -6
- package/src/public/operations/specs/mutation.ts +27 -2
- package/src/public/operations/specs/planning.ts +241 -0
- package/src/public/operations/specs/proof.ts +43 -0
- package/src/public/operations/specs/reporting.ts +193 -12
- package/src/public/operations/specs/upsert.ts +10 -0
- package/src/public/operations/symbol-repair-plan.ts +324 -0
- package/src/public/operations/types.ts +62 -1
- package/src/public/proof-fingerprint.ts +216 -0
- package/src/public/proof-protocol-types.d.ts +96 -0
- package/src/public/proof-protocol.ts +589 -0
- package/src/public/proof-receipt.ts +499 -0
- package/src/public/schemas/entity.ts +27 -6
- package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/src/public/skills/kibi-freshness/SKILL.md +39 -9
- package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/src/public/skills/kibi-traceability/SKILL.md +47 -47
- package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/src/public/skills/kibi-usage/SKILL.md +136 -231
- package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/src/public/skills/kibi-usage/resources/proof.md +105 -0
- package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +57 -4
- package/src/public/symbol-granularity.generated.ts +41 -0
- package/src/public/symbol-granularity.ts +35 -59
- package/src/public/telemetry-acceptance-types.d.ts +98 -0
- package/src/public/telemetry-acceptance.ts +30 -93
- package/src/public/telemetry-remediation.ts +1 -1
- package/src/schemas/entity.schema.json +1254 -239
- package/templates/github/kibi-badge.yml +86 -0
- package/templates/github/kibi-report.yml +84 -0
- package/dist/operations/autopilot/activation.d.ts +0 -4
- package/dist/operations/autopilot/activation.d.ts.map +0 -1
- package/dist/operations/autopilot/candidates.d.ts +0 -4
- package/dist/operations/autopilot/discovery.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.d.ts +0 -8
- package/dist/operations/autopilot/generate.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.js +0 -112
- package/dist/operations/autopilot/guidance.d.ts.map +0 -1
- package/dist/operations/autopilot/presentation.d.ts +0 -13
- package/dist/operations/autopilot/presentation.d.ts.map +0 -1
- package/dist/operations/autopilot/presentation.js +0 -91
- package/dist/operations/autopilot/types.d.ts.map +0 -1
- package/dist/operations/autopilot/types.js +0 -8
- package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
- package/dist/public/skills/init-kibi/SKILL.md +0 -62
- package/dist/public/verification-receipt.d.ts +0 -75
- package/dist/public/verification-receipt.d.ts.map +0 -1
- package/dist/public/verification-receipt.js +0 -129
- package/src/public/skills/init-kibi/SKILL.md +0 -62
- package/src/public/verification-receipt.ts +0 -170
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
package/dist/commands/sync.js
CHANGED
|
@@ -16,20 +16,23 @@
|
|
|
16
16
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
import { execSync } from "node:child_process";
|
|
19
|
-
import {
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
|
|
20
21
|
import * as path from "node:path";
|
|
21
22
|
import { branchErrorToDiagnostic, createDocsNotIndexedDiagnostic, createInvalidAuthoringDiagnostic, createKbMissingDiagnostic, formatSyncSummary, } from "../diagnostics.js";
|
|
22
|
-
import { EngineClient, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
|
|
23
|
+
import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, formatEngineAttachmentMismatch, fsyncJournaledBranchStore, parseEngineAttachmentIdentity, readEngineAttachmentIdentity, } from "../engine.js";
|
|
23
24
|
import { isCliDebugEnabled } from "../env.js";
|
|
24
25
|
import { extractRelationshipShard, validateRelationships, } from "../extractors/relationships.js";
|
|
26
|
+
import { acquireSymbolCompilerLock, releaseSymbolCompilerLock, } from "../operations/mutation/symbol-compiler-lock.js";
|
|
25
27
|
import { analyzeSemanticAdvisorInput } from "../operations/semantic-advisor/analyze-prose.js";
|
|
26
28
|
import { validateSemanticInventoryBoundary } from "../operations/semantic-advisor/ingestion-boundary.js";
|
|
27
29
|
import { PrologProcess } from "../prolog.js";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
30
|
+
import { resolveBranchAttachment } from "../utils/branch-resolver.js";
|
|
31
|
+
import { branchStoreManifestPath, branchStorePath, ensureBranchStoreManifest, expectedBranchStoreManifest, } from "../utils/branch-store-locator.js";
|
|
32
|
+
import { loadEntityPaths } from "../utils/config.js";
|
|
33
|
+
import { SYNC_CACHE_TTL_MS, SYNC_CACHE_VERSION, hashFile, hashManifestWithCoordinates, hashNormalized, readSyncCache, toCacheKey, writeSyncCache, } from "./sync/cache.js";
|
|
34
|
+
import { clearRecoveredPendingSourceReceipts, discoverSourceFiles, } from "./sync/discovery.js";
|
|
35
|
+
import { normalizeExtractionSources, processExtractions, } from "./sync/extraction.js";
|
|
33
36
|
import { refreshManifestCoordinates } from "./sync/manifest.js";
|
|
34
37
|
import { persistEntities, persistRelationships, retractEntitiesById, retractEntitiesForSources, retractEntityRelationshipsById, retractRelationships, } from "./sync/persistence.js";
|
|
35
38
|
import { atomicPublish, atomicPublishGeneration, cleanupStaging, createUniqueStagingPath, prepareStagingEnvironment, } from "./sync/staging.js";
|
|
@@ -49,6 +52,111 @@ function relationshipFromKey(key) {
|
|
|
49
52
|
}
|
|
50
53
|
return { type, from, to };
|
|
51
54
|
}
|
|
55
|
+
function assertNoUnresolvedGitConflicts(workspaceRoot) {
|
|
56
|
+
let conflicted = "";
|
|
57
|
+
try {
|
|
58
|
+
conflicted = execSync("git diff --name-only --diff-filter=U --", {
|
|
59
|
+
cwd: workspaceRoot,
|
|
60
|
+
encoding: "utf8",
|
|
61
|
+
timeout: 5000,
|
|
62
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
63
|
+
}).trim();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// A non-Git workspace is handled by branch resolution below. Do not turn
|
|
67
|
+
// a missing Git binary into a misleading conflict diagnostic.
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (conflicted) {
|
|
71
|
+
throw new SyncError(`Unresolved Git conflicts block Kibi compilation; resolve these authored files first: ${conflicted.split("\n").join(", ")}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
|
|
75
|
+
let tracked;
|
|
76
|
+
try {
|
|
77
|
+
tracked = new Set(execSync("git ls-files --cached -- .kb/relationships", {
|
|
78
|
+
cwd: workspaceRoot,
|
|
79
|
+
encoding: "utf8",
|
|
80
|
+
timeout: 5000,
|
|
81
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
82
|
+
})
|
|
83
|
+
.split("\n")
|
|
84
|
+
.filter(Boolean)
|
|
85
|
+
.map((file) => file.replaceAll("\\", "/")));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// A non-Git workspace has no tracked relationship inputs. The caller's
|
|
89
|
+
// branch resolver will produce the user-facing attachment diagnostic.
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
const pending = new Set();
|
|
93
|
+
const pendingRoot = path.join(workspaceRoot, ".kb", "recovery", "pending-sources");
|
|
94
|
+
if (existsSync(pendingRoot)) {
|
|
95
|
+
for (const receiptName of readdirSync(pendingRoot)) {
|
|
96
|
+
if (!receiptName.endsWith(".json"))
|
|
97
|
+
continue;
|
|
98
|
+
let receipt;
|
|
99
|
+
try {
|
|
100
|
+
receipt = JSON.parse(readFileSync(path.join(pendingRoot, receiptName), "utf8"));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Malformed receipts are left for explicit recovery diagnostics. They
|
|
104
|
+
// must never make an unrelated relationship shard disappear silently.
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (typeof receipt.path !== "string" ||
|
|
108
|
+
typeof receipt.afterHash !== "string") {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const relative = receipt.path.replaceAll("\\", "/");
|
|
112
|
+
if (!relative.startsWith(".kb/relationships/"))
|
|
113
|
+
continue;
|
|
114
|
+
const absolute = path.resolve(workspaceRoot, relative);
|
|
115
|
+
if (!absolute.startsWith(`${path.resolve(workspaceRoot)}${path.sep}`)) {
|
|
116
|
+
throw new SyncError(`Pending source path escapes workspace: ${relative}`);
|
|
117
|
+
}
|
|
118
|
+
if (!existsSync(absolute)) {
|
|
119
|
+
if (recoverMissingPendingSources) {
|
|
120
|
+
const receiptPath = path.join(pendingRoot, receiptName);
|
|
121
|
+
if (!recoveredPendingReceiptPaths.some((candidate) => candidate.receiptPath === receiptPath)) {
|
|
122
|
+
recoveredPendingReceiptPaths.push({
|
|
123
|
+
receiptPath,
|
|
124
|
+
path: relative,
|
|
125
|
+
afterHash: receipt.afterHash,
|
|
126
|
+
rawHash: createHash("sha256")
|
|
127
|
+
.update(readFileSync(receiptPath))
|
|
128
|
+
.digest("hex"),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
throw new SyncError(`Pending source is missing: ${relative}`);
|
|
134
|
+
}
|
|
135
|
+
const actual = createHash("sha256")
|
|
136
|
+
.update(readFileSync(absolute))
|
|
137
|
+
.digest("hex");
|
|
138
|
+
if (actual !== receipt.afterHash) {
|
|
139
|
+
throw new SyncError(`Pending source hash drift blocks sync for ${relative}`);
|
|
140
|
+
}
|
|
141
|
+
pending.add(relative);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
return readdirSync(relationshipsDir)
|
|
146
|
+
.filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
|
|
147
|
+
.map((file) => path.join(relationshipsDir, file))
|
|
148
|
+
.filter((file) => {
|
|
149
|
+
const relative = path
|
|
150
|
+
.relative(workspaceRoot, file)
|
|
151
|
+
.replaceAll(path.sep, "/");
|
|
152
|
+
return tracked.has(relative) || pending.has(relative);
|
|
153
|
+
})
|
|
154
|
+
.sort();
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
52
160
|
function normalizedEntityHash(result) {
|
|
53
161
|
const entity = { ...result.entity };
|
|
54
162
|
// Manifest defaults are generated at extraction time. They must not turn a
|
|
@@ -63,6 +171,16 @@ function normalizedEntityHash(result) {
|
|
|
63
171
|
.sort((left, right) => left.localeCompare(right)),
|
|
64
172
|
});
|
|
65
173
|
}
|
|
174
|
+
// implements REQ-kibi-proposition-complete-ingestion
|
|
175
|
+
function semanticBoundaryRelationships(result, shardRelationships) {
|
|
176
|
+
const relationships = new Map();
|
|
177
|
+
for (const relationship of [...result.relationships, ...shardRelationships]) {
|
|
178
|
+
if (relationship.from !== result.entity.id)
|
|
179
|
+
continue;
|
|
180
|
+
relationships.set(relationshipKey(relationship), relationship);
|
|
181
|
+
}
|
|
182
|
+
return [...relationships.values()];
|
|
183
|
+
}
|
|
66
184
|
async function checkpointNoopSync(workspaceRoot, branch) {
|
|
67
185
|
const engine = new EngineClient({
|
|
68
186
|
workspaceRoot,
|
|
@@ -83,8 +201,8 @@ async function checkpointNoopSync(workspaceRoot, branch) {
|
|
|
83
201
|
function compilerCacheHasEntityDelta(cache) {
|
|
84
202
|
return (cache.entityHashes !== undefined && cache.sourceEntityIds !== undefined);
|
|
85
203
|
}
|
|
86
|
-
function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
|
|
87
|
-
const sourceKeys = sourceFiles.map(toCacheKey);
|
|
204
|
+
function compilerCacheIsFresh(cache, workspaceRoot, sourceFiles, nowMs) {
|
|
205
|
+
const sourceKeys = sourceFiles.map((file) => toCacheKey(workspaceRoot, file));
|
|
88
206
|
if (Object.keys(cache.hashes).some((key) => !sourceKeys.includes(key))) {
|
|
89
207
|
return false;
|
|
90
208
|
}
|
|
@@ -97,36 +215,71 @@ function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
|
|
|
97
215
|
nowMs - lastSeenMs <= SYNC_CACHE_TTL_MS);
|
|
98
216
|
});
|
|
99
217
|
}
|
|
100
|
-
function compilerCacheFilesMatch(cache, sourceFiles, relationshipFiles) {
|
|
218
|
+
function compilerCacheFilesMatch(cache, workspaceRoot, sourceFiles, relationshipFiles, sourceHashOf) {
|
|
101
219
|
for (const file of sourceFiles) {
|
|
102
|
-
if (cache.hashes[toCacheKey(file)] !==
|
|
220
|
+
if (cache.hashes[toCacheKey(workspaceRoot, file)] !== sourceHashOf(file))
|
|
103
221
|
return false;
|
|
104
222
|
}
|
|
105
|
-
const relationshipKeys = new Set(relationshipFiles.map(toCacheKey));
|
|
223
|
+
const relationshipKeys = new Set(relationshipFiles.map((file) => toCacheKey(workspaceRoot, file)));
|
|
106
224
|
if (Object.keys(cache.relationshipHashes ?? {}).some((key) => !relationshipKeys.has(key))) {
|
|
107
225
|
return false;
|
|
108
226
|
}
|
|
109
227
|
for (const file of relationshipFiles) {
|
|
110
|
-
if (cache.relationshipHashes?.[toCacheKey(file)] !==
|
|
228
|
+
if (cache.relationshipHashes?.[toCacheKey(workspaceRoot, file)] !==
|
|
229
|
+
hashFile(workspaceRoot, file))
|
|
111
230
|
return false;
|
|
112
|
-
}
|
|
113
231
|
}
|
|
114
232
|
return true;
|
|
115
233
|
}
|
|
234
|
+
export function warnFailedSourceHash(file, error) {
|
|
235
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
236
|
+
console.warn(`Warning: Failed to hash ${file}: ${message}`);
|
|
237
|
+
}
|
|
238
|
+
// implements REQ-003, REQ-007
|
|
239
|
+
export function rememberChangedSourceOrWarn(file, apply) {
|
|
240
|
+
try {
|
|
241
|
+
apply();
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
warnFailedSourceHash(file, error);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export function maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath) {
|
|
248
|
+
if (!kbExists && !rebuild) {
|
|
249
|
+
diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export function assertRelationshipsCleared(result) {
|
|
253
|
+
if (!result.success) {
|
|
254
|
+
throw new SyncError(`Failed to clear changed relationship shards: ${result.error || "Unknown error"}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
export function maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFileCount, entityCount) {
|
|
258
|
+
if (performedFullReindex &&
|
|
259
|
+
markdownFileCount > 0 &&
|
|
260
|
+
entityCount < markdownFileCount) {
|
|
261
|
+
diagnostics.push(createDocsNotIndexedDiagnostic(markdownFileCount, entityCount));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
116
264
|
// implements REQ-003, REQ-007
|
|
117
265
|
export async function syncCommand(options = {}, runtime = {}) {
|
|
118
266
|
const validateOnly = options.validateOnly ?? false;
|
|
119
267
|
const rebuild = options.rebuild ?? false;
|
|
268
|
+
const recoveryBackupPath = options.recoveryBackupPath;
|
|
269
|
+
const workspaceRoot = path.resolve(options.workspaceRoot ?? process.cwd());
|
|
120
270
|
const startTime = Date.now();
|
|
121
271
|
const diagnostics = [];
|
|
122
272
|
const entityCounts = {};
|
|
123
273
|
let published = false;
|
|
124
274
|
let currentBranch;
|
|
125
275
|
let stagingPath;
|
|
276
|
+
let publicationLease;
|
|
277
|
+
let compilerLock;
|
|
278
|
+
let operationFailure;
|
|
126
279
|
const getCurrentCommit = () => {
|
|
127
280
|
try {
|
|
128
281
|
return execSync("git rev-parse HEAD", {
|
|
129
|
-
cwd:
|
|
282
|
+
cwd: workspaceRoot,
|
|
130
283
|
encoding: "utf8",
|
|
131
284
|
timeout: 5000,
|
|
132
285
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -138,30 +291,60 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
138
291
|
};
|
|
139
292
|
const withOptionalCommit = (value, commit) => commit !== undefined ? { ...value, commit } : value;
|
|
140
293
|
try {
|
|
294
|
+
if (!validateOnly) {
|
|
295
|
+
compilerLock = await (runtime.acquireSymbolCompilerLock ?? acquireSymbolCompilerLock)(workspaceRoot);
|
|
296
|
+
}
|
|
297
|
+
assertNoUnresolvedGitConflicts(workspaceRoot);
|
|
141
298
|
// Branch resolution
|
|
142
|
-
const branchResult =
|
|
299
|
+
const branchResult = resolveBranchAttachment(workspaceRoot);
|
|
143
300
|
if ("error" in branchResult) {
|
|
144
301
|
const diagnostic = branchErrorToDiagnostic(branchResult.code, branchResult.error);
|
|
145
302
|
diagnostics.push(diagnostic);
|
|
146
303
|
console.error(`Failed to resolve active branch: ${branchResult.error}`);
|
|
147
304
|
throw new SyncError(`Failed to resolve active branch: ${branchResult.error}`);
|
|
148
305
|
}
|
|
149
|
-
|
|
306
|
+
if (branchResult.migrationRequired && !validateOnly) {
|
|
307
|
+
throw new SyncError(`Sync blocked: KB is attached through legacy branch storage for '${branchResult.gitBranch}'. Run 'kibi branch migrate --from ${branchResult.kbBranch} --to ${branchResult.gitBranch} --apply' first.`);
|
|
308
|
+
}
|
|
309
|
+
currentBranch = branchResult.kbBranch;
|
|
150
310
|
// Cut over legacy branches before creating a staging copy. If another
|
|
151
311
|
// CLI/MCP operation has an engine attached, stop that single writer so the
|
|
152
312
|
// atomic publish below cannot race its RDF lock.
|
|
153
|
-
const livePathForEngine =
|
|
154
|
-
if (!validateOnly) {
|
|
313
|
+
const livePathForEngine = branchStorePath(workspaceRoot, currentBranch);
|
|
314
|
+
if (!validateOnly && recoveryBackupPath === undefined) {
|
|
315
|
+
ensureBranchStoreManifest(workspaceRoot, currentBranch);
|
|
155
316
|
await ensureJournaledBranchStoreAsync(livePathForEngine);
|
|
317
|
+
}
|
|
318
|
+
const needsExclusiveGenerationPublish = !validateOnly && (rebuild || recoveryBackupPath !== undefined);
|
|
319
|
+
if (needsExclusiveGenerationPublish) {
|
|
320
|
+
// Recovery intentionally avoids attaching the broken live store. The
|
|
321
|
+
// clean rebuild is compiled into staging and published only after it
|
|
322
|
+
// can be reopened successfully.
|
|
156
323
|
const existingEngine = new EngineClient({
|
|
157
|
-
workspaceRoot
|
|
324
|
+
workspaceRoot,
|
|
158
325
|
branch: currentBranch,
|
|
159
326
|
timeout: 2_000,
|
|
327
|
+
allowPublicationLock: true,
|
|
160
328
|
});
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
329
|
+
const engineSocketExists = existsSync(engineSocketPath(workspaceRoot, currentBranch));
|
|
330
|
+
try {
|
|
331
|
+
publicationLease = acquireEnginePublicationLease(workspaceRoot, currentBranch);
|
|
332
|
+
// This client is explicitly allowed to attach under its own lease so
|
|
333
|
+
// a daemon that appeared between the socket probe and lease creation
|
|
334
|
+
// is still stopped before publication.
|
|
335
|
+
if (engineSocketExists ||
|
|
336
|
+
existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
|
|
337
|
+
await existingEngine.start(false);
|
|
338
|
+
}
|
|
339
|
+
if (existingEngine.isRunning()) {
|
|
340
|
+
await existingEngine.stop(false);
|
|
341
|
+
}
|
|
342
|
+
else if (engineSocketExists ||
|
|
343
|
+
existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
|
|
344
|
+
throw new SyncError(`Kibi engine socket remains present but is not reachable: ${engineSocketPath(workspaceRoot, currentBranch)}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
165
348
|
await existingEngine.terminate();
|
|
166
349
|
}
|
|
167
350
|
}
|
|
@@ -169,9 +352,11 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
169
352
|
// eslint-disable-next-line no-console
|
|
170
353
|
console.log("[kibi-debug] currentBranch:", currentBranch);
|
|
171
354
|
}
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
|
|
355
|
+
const paths = loadEntityPaths(workspaceRoot);
|
|
356
|
+
const { markdownFiles, manifestFiles, relationshipsDir, recoveredPendingReceiptPaths, } = await discoverSourceFiles(workspaceRoot, {
|
|
357
|
+
trackedOnly: true,
|
|
358
|
+
recoverMissingPendingSources: recoveryBackupPath !== undefined,
|
|
359
|
+
});
|
|
175
360
|
if (isCliDebugEnabled()) {
|
|
176
361
|
// eslint-disable-next-line no-console
|
|
177
362
|
console.log("[kibi-debug] markdownFiles:", markdownFiles.length);
|
|
@@ -179,28 +364,30 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
179
364
|
console.log("[kibi-debug] manifestFiles:", manifestFiles.length);
|
|
180
365
|
}
|
|
181
366
|
const sourceFiles = [...markdownFiles, ...manifestFiles].sort();
|
|
182
|
-
const cachePath = path.join(
|
|
367
|
+
const cachePath = path.join(livePathForEngine, "sync-cache.json");
|
|
183
368
|
const syncCache = readSyncCache(cachePath);
|
|
184
369
|
const nowIso = new Date().toISOString();
|
|
185
370
|
const nowMs = Date.now();
|
|
186
|
-
const currentSourceKeys = new Set(sourceFiles.map(toCacheKey));
|
|
371
|
+
const currentSourceKeys = new Set(sourceFiles.map((file) => toCacheKey(workspaceRoot, file)));
|
|
187
372
|
const relationshipShardFiles = existsSync(relationshipsDir)
|
|
188
|
-
?
|
|
189
|
-
.filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
|
|
190
|
-
.map((file) => path.join(relationshipsDir, file))
|
|
191
|
-
.sort()
|
|
373
|
+
? trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoveryBackupPath !== undefined, recoveredPendingReceiptPaths)
|
|
192
374
|
: [];
|
|
193
375
|
// No-op is a first-class compiler result. Hashing the configured inputs is
|
|
194
376
|
// sufficient when normalized entity/shard inventories are already fresh;
|
|
195
377
|
// avoid rebuilding maps and rediscovering RDF state for the common path.
|
|
378
|
+
// Symbol manifests hash together with their generated coordinate artifact
|
|
379
|
+
// so artifact-only changes never masquerade as no-ops.
|
|
380
|
+
const fastPathSourceHashOf = (file) => manifestFiles.includes(file)
|
|
381
|
+
? hashManifestWithCoordinates(workspaceRoot, file, path.join(path.dirname(file), "symbol-coordinates.yaml"))
|
|
382
|
+
: hashFile(workspaceRoot, file);
|
|
196
383
|
if (!validateOnly &&
|
|
197
384
|
!rebuild &&
|
|
198
385
|
!options.refreshSymbolCoordinates &&
|
|
199
386
|
runtime.createProlog === undefined &&
|
|
200
387
|
compilerCacheHasEntityDelta(syncCache) &&
|
|
201
|
-
compilerCacheIsFresh(syncCache, sourceFiles, nowMs) &&
|
|
202
|
-
compilerCacheFilesMatch(syncCache, sourceFiles, relationshipShardFiles)) {
|
|
203
|
-
await checkpointNoopSync(
|
|
388
|
+
compilerCacheIsFresh(syncCache, workspaceRoot, sourceFiles, nowMs) &&
|
|
389
|
+
compilerCacheFilesMatch(syncCache, workspaceRoot, sourceFiles, relationshipShardFiles, fastPathSourceHashOf)) {
|
|
390
|
+
await checkpointNoopSync(workspaceRoot, currentBranch);
|
|
204
391
|
console.log("✓ Imported 0 entities, 0 relationships (no changes)");
|
|
205
392
|
return withOptionalCommit({
|
|
206
393
|
branch: currentBranch,
|
|
@@ -214,10 +401,30 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
214
401
|
exitCode: 0,
|
|
215
402
|
}, getCurrentCommit());
|
|
216
403
|
}
|
|
404
|
+
// Explicit coordinate refresh must precede fingerprinting so the manifest
|
|
405
|
+
// overlay that is persisted into RDF observes the newly generated
|
|
406
|
+
// coordinates. Refresh failures are fatal: cache state may never advance
|
|
407
|
+
// on a partially published compiler dependency.
|
|
408
|
+
const refreshedManifestKeys = new Set();
|
|
409
|
+
if (!validateOnly && options.refreshSymbolCoordinates) {
|
|
410
|
+
for (const file of manifestFiles) {
|
|
411
|
+
await refreshManifestCoordinates(file, workspaceRoot, {
|
|
412
|
+
refreshSymbolCoordinates: options.refreshSymbolCoordinates,
|
|
413
|
+
});
|
|
414
|
+
refreshedManifestKeys.add(toCacheKey(workspaceRoot, file));
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// The generated coordinate artifact is a compiler dependency of every
|
|
418
|
+
// symbol manifest: its existence, emptiness, content, and deletion must
|
|
419
|
+
// all change the effective source hash even when authored YAML is stable.
|
|
420
|
+
const coordinatesPathForManifest = (manifestFile) => path.join(path.dirname(manifestFile), "symbol-coordinates.yaml");
|
|
421
|
+
const effectiveSourceHash = (file) => manifestFiles.includes(file)
|
|
422
|
+
? hashManifestWithCoordinates(workspaceRoot, file, coordinatesPathForManifest(file))
|
|
423
|
+
: hashFile(workspaceRoot, file);
|
|
217
424
|
const changedSourceHashes = new Map();
|
|
218
425
|
for (const file of sourceFiles) {
|
|
219
|
-
const key = toCacheKey(file);
|
|
220
|
-
const hash =
|
|
426
|
+
const key = toCacheKey(workspaceRoot, file);
|
|
427
|
+
const hash = effectiveSourceHash(file);
|
|
221
428
|
if (syncCache.hashes[key] !== hash)
|
|
222
429
|
changedSourceHashes.set(key, hash);
|
|
223
430
|
}
|
|
@@ -243,14 +450,14 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
243
450
|
// sync rather than deleting their last known-good entities.
|
|
244
451
|
const deletedSourceFiles = Object.keys(syncCache.hashes)
|
|
245
452
|
.filter((key) => !currentSourceKeys.has(key))
|
|
246
|
-
.map((key) => path.resolve(
|
|
453
|
+
.map((key) => path.resolve(workspaceRoot, key));
|
|
247
454
|
const currentRelationshipKeys = new Set();
|
|
248
455
|
for (const shardPath of relationshipShardFiles) {
|
|
249
|
-
const key = toCacheKey(shardPath);
|
|
456
|
+
const key = toCacheKey(workspaceRoot, shardPath);
|
|
250
457
|
currentRelationshipKeys.add(key);
|
|
251
458
|
let hash;
|
|
252
459
|
try {
|
|
253
|
-
hash = hashFile(shardPath);
|
|
460
|
+
hash = hashFile(workspaceRoot, shardPath);
|
|
254
461
|
nextRelationshipHashes[key] = hash;
|
|
255
462
|
}
|
|
256
463
|
catch (error) {
|
|
@@ -292,11 +499,11 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
292
499
|
const relationshipChanged = addedShardRelationships.length > 0 ||
|
|
293
500
|
removedShardRelationships.length > 0;
|
|
294
501
|
for (const file of sourceFiles) {
|
|
295
|
-
|
|
296
|
-
const key = toCacheKey(file);
|
|
502
|
+
rememberChangedSourceOrWarn(file, () => {
|
|
503
|
+
const key = toCacheKey(workspaceRoot, file);
|
|
297
504
|
const hash = changedSourceHashes.get(key) ?? syncCache.hashes[key];
|
|
298
505
|
if (hash === undefined)
|
|
299
|
-
|
|
506
|
+
return;
|
|
300
507
|
const lastSeen = syncCache.seenAt[key];
|
|
301
508
|
const lastSeenMs = lastSeen ? Date.parse(lastSeen) : Number.NaN;
|
|
302
509
|
const expired = !lastSeen ||
|
|
@@ -315,11 +522,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
315
522
|
changedManifestFiles.push(file);
|
|
316
523
|
}
|
|
317
524
|
}
|
|
318
|
-
}
|
|
319
|
-
catch (error) {
|
|
320
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
321
|
-
console.warn(`Warning: Failed to hash ${file}: ${message}`);
|
|
322
|
-
}
|
|
525
|
+
});
|
|
323
526
|
}
|
|
324
527
|
// A v1 cache has only whole-file hashes. Perform one compiler-metadata
|
|
325
528
|
// backfill so subsequent edits can be reduced to normalized entity deltas.
|
|
@@ -334,31 +537,24 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
334
537
|
changedManifestFiles.push(file);
|
|
335
538
|
}
|
|
336
539
|
}
|
|
337
|
-
//
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
await refreshManifestCoordinates(file, process.cwd(), {
|
|
345
|
-
refreshSymbolCoordinates: options.refreshSymbolCoordinates,
|
|
346
|
-
});
|
|
347
|
-
if (!changedManifestFiles.includes(file)) {
|
|
348
|
-
changedManifestFiles.push(file);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
catch (error) {
|
|
352
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
353
|
-
console.warn(`Warning: Failed to refresh symbol coordinates in ${file}: ${message}`);
|
|
354
|
-
}
|
|
540
|
+
// Explicitly requested refreshes force coordinate-bearing symbols through
|
|
541
|
+
// extraction and RDF persistence even when normalized entity hashes match
|
|
542
|
+
// the cached state, repairing warm-cache RDF divergence.
|
|
543
|
+
for (const file of manifestFiles) {
|
|
544
|
+
if (!refreshedManifestKeys.has(toCacheKey(workspaceRoot, file)) ||
|
|
545
|
+
changedManifestFiles.includes(file)) {
|
|
546
|
+
continue;
|
|
355
547
|
}
|
|
548
|
+
changedManifestFiles.push(file);
|
|
549
|
+
}
|
|
550
|
+
for (const key of refreshedManifestKeys) {
|
|
551
|
+
forceEntitySourceKeys.add(key);
|
|
356
552
|
}
|
|
357
553
|
const performedFullReindex = changedMarkdownFiles.length === markdownFiles.length &&
|
|
358
554
|
changedManifestFiles.length === manifestFiles.length;
|
|
359
|
-
const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly);
|
|
555
|
+
const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly, workspaceRoot);
|
|
360
556
|
const { failedCacheKeys, errors } = extraction;
|
|
361
|
-
const extractedResults = extraction.results;
|
|
557
|
+
const extractedResults = normalizeExtractionSources(extraction.results, workspaceRoot);
|
|
362
558
|
const nextEntityHashes = {
|
|
363
559
|
...(syncCache.entityHashes ?? {}),
|
|
364
560
|
};
|
|
@@ -373,12 +569,20 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
373
569
|
!validateOnly &&
|
|
374
570
|
!rebuild &&
|
|
375
571
|
runtime.createProlog === undefined;
|
|
376
|
-
|
|
572
|
+
// Re-materialize every authored shard edge whenever a source entity is
|
|
573
|
+
// refreshed. Entity-delta sync retracts outgoing relationships for changed
|
|
574
|
+
// entities before persisting their extracted relationships. Manifest
|
|
575
|
+
// entities commonly carry no inline links, so a manifest-only edit (for
|
|
576
|
+
// example, a generated coordinate refresh) would otherwise drop valid
|
|
577
|
+
// shard-only edges and leave the cache claiming they were already synced.
|
|
578
|
+
const materializeAllRelationships = !useEntityDelta ||
|
|
579
|
+
changedMarkdownFiles.length > 0 ||
|
|
580
|
+
changedManifestFiles.length > 0;
|
|
377
581
|
const allRelationships = materializeAllRelationships
|
|
378
582
|
? Object.values(nextShardRelationships).flat().map(relationshipFromKey)
|
|
379
583
|
: [...addedShardRelationships, ...removedShardRelationships];
|
|
380
584
|
for (const deletedSource of deletedSourceFiles) {
|
|
381
|
-
const sourceKey = toCacheKey(deletedSource);
|
|
585
|
+
const sourceKey = toCacheKey(workspaceRoot, deletedSource);
|
|
382
586
|
for (const id of nextSourceEntityIds[sourceKey] ?? []) {
|
|
383
587
|
removedEntityIds.add(id);
|
|
384
588
|
delete nextEntityHashes[id];
|
|
@@ -387,7 +591,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
387
591
|
}
|
|
388
592
|
const resultsBySource = new Map();
|
|
389
593
|
for (const result of extractedResults) {
|
|
390
|
-
const sourceKey = toCacheKey(result.entity.source);
|
|
594
|
+
const sourceKey = toCacheKey(workspaceRoot, result.entity.source);
|
|
391
595
|
const sourceResults = resultsBySource.get(sourceKey) ?? [];
|
|
392
596
|
sourceResults.push(result);
|
|
393
597
|
resultsBySource.set(sourceKey, sourceResults);
|
|
@@ -396,7 +600,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
396
600
|
...changedMarkdownFiles,
|
|
397
601
|
...changedManifestFiles,
|
|
398
602
|
]) {
|
|
399
|
-
const sourceKey = toCacheKey(changedSource);
|
|
603
|
+
const sourceKey = toCacheKey(workspaceRoot, changedSource);
|
|
400
604
|
if (failedCacheKeys.has(sourceKey))
|
|
401
605
|
continue;
|
|
402
606
|
const sourceResults = resultsBySource.get(sourceKey) ?? [];
|
|
@@ -425,15 +629,16 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
425
629
|
for (const result of extractedResults) {
|
|
426
630
|
if (result.entity.type !== "req")
|
|
427
631
|
continue;
|
|
428
|
-
const key = toCacheKey(result.entity.source);
|
|
632
|
+
const key = toCacheKey(workspaceRoot, result.entity.source);
|
|
633
|
+
const relationships = semanticBoundaryRelationships(result, allRelationships);
|
|
429
634
|
const payload = {
|
|
430
635
|
type: result.entity.type,
|
|
431
636
|
id: result.entity.id,
|
|
432
637
|
properties: result.entity,
|
|
433
|
-
relationships
|
|
638
|
+
relationships,
|
|
434
639
|
};
|
|
435
640
|
const semantic = analyzeSemanticAdvisorInput({ payload });
|
|
436
|
-
const boundary = validateSemanticInventoryBoundary(payload,
|
|
641
|
+
const boundary = validateSemanticInventoryBoundary(payload, relationships, semantic.receipt);
|
|
437
642
|
const previousSemanticHash = syncCache.semanticHashes[key];
|
|
438
643
|
const advertisedContract = result.entity.semantic_inventory_version !== undefined ||
|
|
439
644
|
result.entity.semantic_source_hash !== undefined ||
|
|
@@ -504,6 +709,12 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
504
709
|
evictedSemanticContracts[key] = nextSemanticContracts[key] === true;
|
|
505
710
|
}
|
|
506
711
|
}
|
|
712
|
+
// The durable KB checkpoint must precede the cache write: if the
|
|
713
|
+
// checkpoint fails, cached fingerprints must stay stale so the next
|
|
714
|
+
// sync recompiles instead of trusting uncommitted compiler output.
|
|
715
|
+
if (runtime.createProlog === undefined) {
|
|
716
|
+
await checkpointNoopSync(workspaceRoot, currentBranch);
|
|
717
|
+
}
|
|
507
718
|
writeSyncCache(cachePath, {
|
|
508
719
|
version: SYNC_CACHE_VERSION,
|
|
509
720
|
hashes: evictedHashes,
|
|
@@ -515,9 +726,6 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
515
726
|
semanticHashes: evictedSemanticHashes,
|
|
516
727
|
semanticContracts: evictedSemanticContracts,
|
|
517
728
|
});
|
|
518
|
-
if (runtime.createProlog === undefined) {
|
|
519
|
-
await checkpointNoopSync(process.cwd(), currentBranch);
|
|
520
|
-
}
|
|
521
729
|
console.log("✓ Imported 0 entities, 0 relationships (no changes)");
|
|
522
730
|
return withOptionalCommit({
|
|
523
731
|
branch: currentBranch,
|
|
@@ -531,11 +739,9 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
531
739
|
exitCode: 0,
|
|
532
740
|
}, getCurrentCommit());
|
|
533
741
|
}
|
|
534
|
-
const livePath =
|
|
742
|
+
const livePath = branchStorePath(workspaceRoot, currentBranch);
|
|
535
743
|
const kbExists = existsSync(livePath);
|
|
536
|
-
|
|
537
|
-
diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
|
|
538
|
-
}
|
|
744
|
+
maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath);
|
|
539
745
|
// implements REQ-core-journaled-engine-delta-sync
|
|
540
746
|
// Normal syncs are compiled directly into the long-lived single-writer
|
|
541
747
|
// engine. Rebuilds retain generation replacement semantics, and injected
|
|
@@ -544,17 +750,34 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
544
750
|
// for a one-symbol or relationship-only change.
|
|
545
751
|
if (!validateOnly && !rebuild && runtime.createProlog === undefined) {
|
|
546
752
|
const engine = new EngineClient({
|
|
547
|
-
workspaceRoot
|
|
753
|
+
workspaceRoot,
|
|
548
754
|
branch: currentBranch,
|
|
549
755
|
timeout: 120_000,
|
|
550
756
|
});
|
|
551
757
|
const engineProlog = engine;
|
|
552
758
|
try {
|
|
553
759
|
await engine.start();
|
|
760
|
+
const describeAttachment = async () => {
|
|
761
|
+
const live = readEngineAttachmentIdentity(livePath);
|
|
762
|
+
try {
|
|
763
|
+
const status = await engine.queryStatusJson();
|
|
764
|
+
return {
|
|
765
|
+
live,
|
|
766
|
+
attached: parseEngineAttachmentIdentity(status.bindings.JsonString),
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
catch {
|
|
770
|
+
return { live, attached: null };
|
|
771
|
+
}
|
|
772
|
+
};
|
|
773
|
+
const mutationFailure = async (operation, cause) => {
|
|
774
|
+
const { live, attached } = await describeAttachment();
|
|
775
|
+
return `${cause}; ${formatEngineAttachmentMismatch(operation, live, attached)}`;
|
|
776
|
+
};
|
|
554
777
|
const successfulChangedSources = [
|
|
555
778
|
...changedMarkdownFiles,
|
|
556
779
|
...changedManifestFiles,
|
|
557
|
-
].filter((file) => !failedCacheKeys.has(toCacheKey(file)));
|
|
780
|
+
].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file)));
|
|
558
781
|
const removedCount = useEntityDelta
|
|
559
782
|
? await retractEntitiesById(engineProlog, [...removedEntityIds])
|
|
560
783
|
: await retractEntitiesForSources(engineProlog, [
|
|
@@ -571,9 +794,19 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
571
794
|
await retractRelationships(engineProlog, exactRemovedEdges);
|
|
572
795
|
}
|
|
573
796
|
else if (relationshipChanged) {
|
|
574
|
-
const
|
|
575
|
-
|
|
576
|
-
|
|
797
|
+
const clearChangedShards = async () => {
|
|
798
|
+
const cleared = await engine.query("kb_retract_all_relationships");
|
|
799
|
+
if (!cleared.success) {
|
|
800
|
+
throw new SyncError(await mutationFailure("kb_retract_all_relationships", `Failed to clear changed relationship shards: ${cleared.error || "Unknown error"}`));
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
try {
|
|
804
|
+
await clearChangedShards();
|
|
805
|
+
}
|
|
806
|
+
catch {
|
|
807
|
+
await engine.stop().catch(() => undefined);
|
|
808
|
+
await engine.start();
|
|
809
|
+
await clearChangedShards();
|
|
577
810
|
}
|
|
578
811
|
}
|
|
579
812
|
const entityIds = new Set();
|
|
@@ -591,7 +824,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
591
824
|
}
|
|
592
825
|
const danglingKeys = new Set(validationErrors.map(({ relationship }) => `${relationship.type}|${relationship.from}|${relationship.to}`));
|
|
593
826
|
const shardDeltaByKey = new Map();
|
|
594
|
-
const shardCandidates = useEntityDelta
|
|
827
|
+
const shardCandidates = useEntityDelta && !materializeAllRelationships
|
|
595
828
|
? [
|
|
596
829
|
...addedShardRelationships,
|
|
597
830
|
...allRelationships.filter((relationship) => changedEntityIds.has(relationship.from)),
|
|
@@ -602,9 +835,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
602
835
|
shardDeltaByKey.set(relationshipKey(relationship), relationship);
|
|
603
836
|
}
|
|
604
837
|
}
|
|
605
|
-
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [
|
|
606
|
-
...shardDeltaByKey.values(),
|
|
607
|
-
]);
|
|
838
|
+
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [...shardDeltaByKey.values()], { workspaceRoot });
|
|
608
839
|
const kbModified = removedCount > 0 ||
|
|
609
840
|
relationshipChanged ||
|
|
610
841
|
entitiesModified ||
|
|
@@ -613,7 +844,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
613
844
|
engine.invalidateCache();
|
|
614
845
|
const saveResult = await engine.save();
|
|
615
846
|
if (!saveResult.success) {
|
|
616
|
-
throw new SyncError(`Failed to save journaled KB: ${saveResult.error || "Unknown error"}`);
|
|
847
|
+
throw new SyncError(await mutationFailure("kb_save", `Failed to save journaled KB: ${saveResult.error || "Unknown error"}`));
|
|
617
848
|
}
|
|
618
849
|
const evictedHashes = {};
|
|
619
850
|
const evictedSeenAt = {};
|
|
@@ -665,7 +896,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
665
896
|
await engine.terminate();
|
|
666
897
|
}
|
|
667
898
|
}
|
|
668
|
-
stagingPath = createUniqueStagingPath(currentBranch,
|
|
899
|
+
stagingPath = createUniqueStagingPath(currentBranch, workspaceRoot);
|
|
669
900
|
const runtimeContext = {
|
|
670
901
|
currentBranch,
|
|
671
902
|
livePath,
|
|
@@ -674,6 +905,12 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
674
905
|
validateOnly,
|
|
675
906
|
};
|
|
676
907
|
await prepareStagingEnvironment(stagingPath, livePath, rebuild);
|
|
908
|
+
// Staging is a new compiled artifact, so install the exact identity fence
|
|
909
|
+
// before the engine attaches. The manifest is published with the staged
|
|
910
|
+
// store during the atomic swap.
|
|
911
|
+
if (!existsSync(branchStoreManifestPath(stagingPath))) {
|
|
912
|
+
writeFileSync(branchStoreManifestPath(stagingPath), `${JSON.stringify(expectedBranchStoreManifest(currentBranch), null, 2)}\n`, { mode: 0o600 });
|
|
913
|
+
}
|
|
677
914
|
try {
|
|
678
915
|
const prolog = runtime.createProlog?.({ timeout: 120000 }) ??
|
|
679
916
|
new PrologProcess({ timeout: 120000 });
|
|
@@ -695,12 +932,10 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
695
932
|
...changedMarkdownFiles,
|
|
696
933
|
...changedManifestFiles,
|
|
697
934
|
...deletedSourceFiles,
|
|
698
|
-
].filter((file) => !failedCacheKeys.has(toCacheKey(file))));
|
|
935
|
+
].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file))));
|
|
699
936
|
if (relationshipChanged) {
|
|
700
937
|
const clearRelationships = await prolog.query("kb_retract_all_relationships");
|
|
701
|
-
|
|
702
|
-
throw new SyncError(`Failed to clear changed relationship shards: ${clearRelationships.error || "Unknown error"}`);
|
|
703
|
-
}
|
|
938
|
+
assertRelationshipsCleared(clearRelationships);
|
|
704
939
|
}
|
|
705
940
|
const { entityCount, kbModified: entitiesModified } = await persistEntities(prolog, results, entityIds);
|
|
706
941
|
const validationErrors = validateRelationships(allRelationships, entityIds);
|
|
@@ -713,7 +948,9 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
713
948
|
const danglingKeys = new Set(validationErrors.map(({ relationship: r }) => `${r.type}|${r.from}|${r.to}`));
|
|
714
949
|
const validRelationships = allRelationships.filter((r) => !danglingKeys.has(`${r.type}|${r.from}|${r.to}`));
|
|
715
950
|
// Persist relationships
|
|
716
|
-
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships
|
|
951
|
+
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships, {
|
|
952
|
+
workspaceRoot,
|
|
953
|
+
});
|
|
717
954
|
const kbModified = entitiesModified || relationshipsModified;
|
|
718
955
|
if (validateOnly) {
|
|
719
956
|
await prolog.query("kb_detach");
|
|
@@ -760,14 +997,45 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
760
997
|
await prolog.query("kb_detach");
|
|
761
998
|
await prolog.terminate();
|
|
762
999
|
const journaledLive = existsSync(path.join(livePath, "storage.json"));
|
|
763
|
-
if (
|
|
1000
|
+
if (recoveryBackupPath !== undefined) {
|
|
1001
|
+
if (!existsSync(livePath)) {
|
|
1002
|
+
throw new SyncError(`Recovery target disappeared before publication: ${livePath}`);
|
|
1003
|
+
}
|
|
1004
|
+
if (existsSync(recoveryBackupPath)) {
|
|
1005
|
+
throw new SyncError(`Recovery backup path already exists: ${recoveryBackupPath}`);
|
|
1006
|
+
}
|
|
1007
|
+
mkdirSync(path.dirname(recoveryBackupPath), { recursive: true });
|
|
1008
|
+
// Same-filesystem renames give us a recoverable two-step publication:
|
|
1009
|
+
// the original bytes stay at the reported backup path if anything
|
|
1010
|
+
// later needs forensic inspection.
|
|
1011
|
+
renameSync(livePath, recoveryBackupPath);
|
|
1012
|
+
try {
|
|
1013
|
+
renameSync(stagingPath, livePath);
|
|
1014
|
+
}
|
|
1015
|
+
catch (error) {
|
|
1016
|
+
renameSync(recoveryBackupPath, livePath);
|
|
1017
|
+
throw error;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
else if (rebuild && journaledLive) {
|
|
764
1021
|
atomicPublishGeneration(stagingPath, livePath);
|
|
765
1022
|
}
|
|
766
1023
|
else {
|
|
767
1024
|
atomicPublish(stagingPath, livePath);
|
|
768
1025
|
}
|
|
769
1026
|
fsyncJournaledBranchStore(livePath);
|
|
770
|
-
|
|
1027
|
+
try {
|
|
1028
|
+
if (recoveryBackupPath !== undefined &&
|
|
1029
|
+
recoveredPendingReceiptPaths.length > 0) {
|
|
1030
|
+
clearRecoveredPendingSourceReceipts(workspaceRoot, recoveredPendingReceiptPaths);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
finally {
|
|
1034
|
+
// Receipt compare-and-delete can fail closed after publication when a
|
|
1035
|
+
// newer receipt wins a race. Staging bytes are still disposable;
|
|
1036
|
+
// leave the published store and surface the pending intent error.
|
|
1037
|
+
cleanupStaging(stagingPath);
|
|
1038
|
+
}
|
|
771
1039
|
const evictedHashes = {};
|
|
772
1040
|
const evictedSeenAt = {};
|
|
773
1041
|
const evictedSemanticHashes = {};
|
|
@@ -796,11 +1064,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
796
1064
|
semanticContracts: evictedSemanticContracts,
|
|
797
1065
|
});
|
|
798
1066
|
published = true;
|
|
799
|
-
|
|
800
|
-
markdownFiles.length > 0 &&
|
|
801
|
-
entityCount < markdownFiles.length) {
|
|
802
|
-
diagnostics.push(createDocsNotIndexedDiagnostic(markdownFiles.length, entityCount));
|
|
803
|
-
}
|
|
1067
|
+
maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFiles.length, entityCount);
|
|
804
1068
|
console.log(`✓ Imported ${entityCount} entities, ${relationshipCount} relationships`);
|
|
805
1069
|
const commit = getCurrentCommit();
|
|
806
1070
|
const summary = withOptionalCommit({
|
|
@@ -822,6 +1086,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
822
1086
|
}
|
|
823
1087
|
}
|
|
824
1088
|
catch (error) {
|
|
1089
|
+
operationFailure = { error };
|
|
825
1090
|
if (stagingPath) {
|
|
826
1091
|
cleanupStaging(stagingPath);
|
|
827
1092
|
}
|
|
@@ -846,5 +1111,9 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
846
1111
|
}
|
|
847
1112
|
throw error;
|
|
848
1113
|
}
|
|
1114
|
+
finally {
|
|
1115
|
+
publicationLease?.release();
|
|
1116
|
+
releaseSymbolCompilerLock(compilerLock, operationFailure);
|
|
1117
|
+
}
|
|
849
1118
|
}
|
|
850
1119
|
export { normalizeMarkdownPath } from "./sync/discovery.js";
|