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
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { dump as dumpYaml, load as loadYaml } from "js-yaml";
|
|
6
|
+
import { parseDocument, stringify } from "yaml";
|
|
7
|
+
import { OperationError } from "../../cli-errors.js";
|
|
8
|
+
import { CANONICAL_ENTITY_PATHS, isDerivedKbPath, } from "../../utils/kb-paths.js";
|
|
9
|
+
function digest(value) {
|
|
10
|
+
return createHash("sha256").update(value).digest("hex");
|
|
11
|
+
}
|
|
12
|
+
function pendingReceiptPath(workspaceRoot, relativePath) {
|
|
13
|
+
return path.join(workspaceRoot, ".kb", "recovery", "pending-sources", `${digest(relativePath)}.json`);
|
|
14
|
+
}
|
|
15
|
+
export function writePendingSourceReceipt(workspaceRoot, relativePath, afterHash) {
|
|
16
|
+
const receiptPath = pendingReceiptPath(workspaceRoot, relativePath);
|
|
17
|
+
fs.mkdirSync(path.dirname(receiptPath), { recursive: true, mode: 0o700 });
|
|
18
|
+
fs.writeFileSync(receiptPath, `${JSON.stringify({
|
|
19
|
+
version: 1,
|
|
20
|
+
path: relativePath,
|
|
21
|
+
afterHash,
|
|
22
|
+
createdAt: new Date().toISOString(),
|
|
23
|
+
}, null, 2)}\n`, { mode: 0o600 });
|
|
24
|
+
}
|
|
25
|
+
function authoredPath(value) {
|
|
26
|
+
if (typeof value !== "string" || !value.trim())
|
|
27
|
+
return undefined;
|
|
28
|
+
const normalized = value.replaceAll("\\", "/");
|
|
29
|
+
if (/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(normalized))
|
|
30
|
+
return undefined;
|
|
31
|
+
if (!/\.(?:md|mdx|ya?ml)$/i.test(normalized))
|
|
32
|
+
return undefined;
|
|
33
|
+
return normalized;
|
|
34
|
+
}
|
|
35
|
+
export function resolveContainedSourcePath(workspaceRoot, relative) {
|
|
36
|
+
if (path.isAbsolute(relative) ||
|
|
37
|
+
relative.split(/[\\/]/).some((part) => part === ".." || part === "")) {
|
|
38
|
+
throw new OperationError("SOURCE_PATH_INVALID", `document.path must be a workspace-relative path without traversal: ${relative}`);
|
|
39
|
+
}
|
|
40
|
+
const absolute = path.resolve(workspaceRoot, relative);
|
|
41
|
+
const root = path.resolve(workspaceRoot);
|
|
42
|
+
if (absolute !== root && !absolute.startsWith(`${root}${path.sep}`)) {
|
|
43
|
+
throw new OperationError("SOURCE_PATH_INVALID", `document.path escapes the workspace: ${relative}`);
|
|
44
|
+
}
|
|
45
|
+
const workspaceRelative = path
|
|
46
|
+
.relative(root, absolute)
|
|
47
|
+
.replaceAll(path.sep, "/");
|
|
48
|
+
if (isDerivedKbPath(workspaceRelative)) {
|
|
49
|
+
throw new OperationError("SOURCE_PATH_INVALID", `document.path cannot target Kibi's derived state under ${workspaceRelative}: ${relative}`);
|
|
50
|
+
}
|
|
51
|
+
// A symlinked existing file or parent could otherwise escape the workspace.
|
|
52
|
+
let existing = fs.existsSync(absolute) ? absolute : path.dirname(absolute);
|
|
53
|
+
while (!fs.existsSync(existing) && path.dirname(existing) !== existing) {
|
|
54
|
+
existing = path.dirname(existing);
|
|
55
|
+
}
|
|
56
|
+
const real = fs.realpathSync.native(existing);
|
|
57
|
+
if (real !== root && !real.startsWith(`${root}${path.sep}`)) {
|
|
58
|
+
throw new OperationError("SOURCE_PATH_INVALID", `document.path resolves outside the workspace: ${relative}`);
|
|
59
|
+
}
|
|
60
|
+
return absolute;
|
|
61
|
+
}
|
|
62
|
+
export function normalizeAuthoredSourcePath(workspaceRoot, source) {
|
|
63
|
+
const normalized = source.replaceAll("\\", "/");
|
|
64
|
+
const relative = path.isAbsolute(normalized)
|
|
65
|
+
? path.relative(path.resolve(workspaceRoot), path.resolve(normalized))
|
|
66
|
+
: normalized;
|
|
67
|
+
return path
|
|
68
|
+
.relative(path.resolve(workspaceRoot), resolveContainedSourcePath(workspaceRoot, relative))
|
|
69
|
+
.replaceAll(path.sep, "/");
|
|
70
|
+
}
|
|
71
|
+
function bodyAndFrontmatter(content) {
|
|
72
|
+
if (!content.startsWith("---"))
|
|
73
|
+
return { frontmatter: {}, body: content };
|
|
74
|
+
const firstEnd = content.indexOf("\n", 3);
|
|
75
|
+
if (firstEnd < 0)
|
|
76
|
+
return { frontmatter: {}, body: content };
|
|
77
|
+
const marker = content.indexOf("\n---", firstEnd);
|
|
78
|
+
if (marker < 0)
|
|
79
|
+
return { frontmatter: {}, body: content };
|
|
80
|
+
const raw = content.slice(firstEnd + 1, marker);
|
|
81
|
+
const parsed = loadYaml(raw);
|
|
82
|
+
return {
|
|
83
|
+
frontmatter: parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
|
|
84
|
+
? parsed
|
|
85
|
+
: {},
|
|
86
|
+
body: content.slice(marker + "\n---".length),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Canonical authored target for an entity type: `.kb/<lane>/<ID>.md` for
|
|
91
|
+
* markdown entities and `.kb/symbols.yaml` for symbols. Kibi owns these
|
|
92
|
+
* locations; repositories cannot relocate them.
|
|
93
|
+
*/
|
|
94
|
+
export function configuredSourceTarget(workspaceRoot, type) {
|
|
95
|
+
const laneByType = {
|
|
96
|
+
req: CANONICAL_ENTITY_PATHS.requirements,
|
|
97
|
+
scenario: CANONICAL_ENTITY_PATHS.scenarios,
|
|
98
|
+
test: CANONICAL_ENTITY_PATHS.tests,
|
|
99
|
+
adr: CANONICAL_ENTITY_PATHS.adr,
|
|
100
|
+
flag: CANONICAL_ENTITY_PATHS.flags,
|
|
101
|
+
event: CANONICAL_ENTITY_PATHS.events,
|
|
102
|
+
fact: CANONICAL_ENTITY_PATHS.facts,
|
|
103
|
+
symbol: CANONICAL_ENTITY_PATHS.symbols,
|
|
104
|
+
};
|
|
105
|
+
return laneByType[type];
|
|
106
|
+
}
|
|
107
|
+
export function hasConfiguredSourceTarget(workspaceRoot, type) {
|
|
108
|
+
return configuredSourceTarget(workspaceRoot, type) !== undefined;
|
|
109
|
+
}
|
|
110
|
+
function sourcePath(context, input, entity, existing) {
|
|
111
|
+
const requested = input.document?.path;
|
|
112
|
+
const canonical = configuredSourceTarget(context.workspaceRoot, input.type);
|
|
113
|
+
let relative = requested ?? authoredPath(existing?.source);
|
|
114
|
+
// Canonical markdown lanes name a directory; append the entity's file so
|
|
115
|
+
// upserts without document.path land in the canonical location.
|
|
116
|
+
if (relative === undefined &&
|
|
117
|
+
canonical !== undefined &&
|
|
118
|
+
!/\.(?:md|mdx|ya?ml)$/i.test(canonical)) {
|
|
119
|
+
relative = `${canonical}/${String(entity.id)}.md`;
|
|
120
|
+
}
|
|
121
|
+
else if (relative === undefined && canonical !== undefined) {
|
|
122
|
+
relative = canonical;
|
|
123
|
+
}
|
|
124
|
+
if (!relative) {
|
|
125
|
+
throw new OperationError("DOCUMENT_PATH_REQUIRED", `No writable source target is available for ${input.type}; provide document.path explicitly`);
|
|
126
|
+
}
|
|
127
|
+
// Extracted entities may carry an absolute source path even though the
|
|
128
|
+
// authored document contract is workspace-relative. Rebase paths that are
|
|
129
|
+
// inside the workspace before applying containment and symlink checks.
|
|
130
|
+
if (path.isAbsolute(relative)) {
|
|
131
|
+
const root = path.resolve(context.workspaceRoot);
|
|
132
|
+
const absolute = path.resolve(relative);
|
|
133
|
+
if (absolute !== root && !absolute.startsWith(`${root}${path.sep}`)) {
|
|
134
|
+
throw new OperationError("SOURCE_PATH_INVALID", `document.path resolves outside the workspace: ${relative}`);
|
|
135
|
+
}
|
|
136
|
+
relative = path.relative(root, absolute).replaceAll(path.sep, "/");
|
|
137
|
+
}
|
|
138
|
+
return resolveContainedSourcePath(context.workspaceRoot, relative);
|
|
139
|
+
}
|
|
140
|
+
function renderEntityDocument(input, entity, existingContent) {
|
|
141
|
+
const existing = existingContent
|
|
142
|
+
? bodyAndFrontmatter(existingContent)
|
|
143
|
+
: { frontmatter: {}, body: "" };
|
|
144
|
+
const body = input.document?.body !== undefined
|
|
145
|
+
? input.document.body
|
|
146
|
+
: existingContent !== undefined
|
|
147
|
+
? existing.body
|
|
148
|
+
: input.type === "req"
|
|
149
|
+
? `${String(entity.semantic_text ?? "").trim()}\n`
|
|
150
|
+
: "\n";
|
|
151
|
+
const frontmatter = {
|
|
152
|
+
...existing.frontmatter,
|
|
153
|
+
...Object.fromEntries(Object.entries(entity).filter(([key]) =>
|
|
154
|
+
// Runtime provenance/timestamps belong to the compiled entity, not to
|
|
155
|
+
// the authored source artifact. Keeping them out also makes the source
|
|
156
|
+
// diff deterministic across CLI and MCP transports.
|
|
157
|
+
![
|
|
158
|
+
"id",
|
|
159
|
+
"type",
|
|
160
|
+
"source",
|
|
161
|
+
"links",
|
|
162
|
+
"relationships",
|
|
163
|
+
"created_at",
|
|
164
|
+
"updated_at",
|
|
165
|
+
].includes(key))),
|
|
166
|
+
};
|
|
167
|
+
frontmatter.id = entity.id;
|
|
168
|
+
frontmatter.title ??= entity.id;
|
|
169
|
+
frontmatter.type = entity.type;
|
|
170
|
+
return `---\n${dumpYaml(frontmatter, { noRefs: true, lineWidth: -1, sortKeys: false })}---${body.startsWith("\n") ? "" : "\n"}${body}`;
|
|
171
|
+
}
|
|
172
|
+
/** Generated coordinate fields belong exclusively to `.kb/symbol-coordinates.yaml`. */
|
|
173
|
+
// implements REQ-generated-coordinate-persistence
|
|
174
|
+
export const GENERATED_SYMBOL_FIELDS = [
|
|
175
|
+
"sourceLine",
|
|
176
|
+
"sourceColumn",
|
|
177
|
+
"sourceEndLine",
|
|
178
|
+
"sourceEndColumn",
|
|
179
|
+
"coordinatesGeneratedAt",
|
|
180
|
+
];
|
|
181
|
+
function symbolManifestRecord(entity, relationships = []) {
|
|
182
|
+
const record = Object.fromEntries(Object.entries(entity).filter(([key]) => ![
|
|
183
|
+
"type",
|
|
184
|
+
"source",
|
|
185
|
+
"relationships",
|
|
186
|
+
"created_at",
|
|
187
|
+
"updated_at",
|
|
188
|
+
// Generated coordinates are compiler output. They must never enter
|
|
189
|
+
// the authored manifest, including legacy inline occurrences.
|
|
190
|
+
...GENERATED_SYMBOL_FIELDS,
|
|
191
|
+
].includes(key)));
|
|
192
|
+
if (relationships.length > 0) {
|
|
193
|
+
record.relationships = relationships.map(({ type, target }) => ({
|
|
194
|
+
type,
|
|
195
|
+
target,
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
return record;
|
|
199
|
+
}
|
|
200
|
+
export function manifestRelationships(item) {
|
|
201
|
+
if (item === null ||
|
|
202
|
+
typeof item !== "object" ||
|
|
203
|
+
!("get" in item) ||
|
|
204
|
+
typeof item.get !== "function") {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
const sequence = item.get("relationships", true);
|
|
208
|
+
if (sequence === null ||
|
|
209
|
+
typeof sequence !== "object" ||
|
|
210
|
+
!("toJSON" in sequence) ||
|
|
211
|
+
typeof sequence.toJSON !== "function") {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const value = sequence.toJSON();
|
|
215
|
+
if (!Array.isArray(value))
|
|
216
|
+
return [];
|
|
217
|
+
return value.flatMap((relationship) => {
|
|
218
|
+
if (relationship === null || typeof relationship !== "object") {
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
const candidate = relationship;
|
|
222
|
+
const type = candidate.type;
|
|
223
|
+
const target = candidate.target ?? candidate.to;
|
|
224
|
+
return typeof type === "string" && typeof target === "string"
|
|
225
|
+
? [{ type, target }]
|
|
226
|
+
: [];
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
function mergeManifestRelationships(existing, incoming, entityId) {
|
|
230
|
+
const merged = new Map();
|
|
231
|
+
for (const relationship of existing) {
|
|
232
|
+
merged.set(`${relationship.type}\u0000${relationship.target}`, {
|
|
233
|
+
type: relationship.type,
|
|
234
|
+
target: relationship.target,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
for (const relationship of incoming) {
|
|
238
|
+
if (relationship.from !== entityId ||
|
|
239
|
+
typeof relationship.type !== "string" ||
|
|
240
|
+
typeof relationship.to !== "string") {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const normalized = { type: relationship.type, target: relationship.to };
|
|
244
|
+
merged.set(`${normalized.type}\u0000${normalized.target}`, normalized);
|
|
245
|
+
}
|
|
246
|
+
return [...merged.values()].sort((left, right) => `${left.type}\u0000${left.target}`.localeCompare(`${right.type}\u0000${right.target}`));
|
|
247
|
+
}
|
|
248
|
+
function renderSymbolManifest(entity, relationships, existingContent) {
|
|
249
|
+
if (existingContent === undefined) {
|
|
250
|
+
const doc = parseDocument(stringify({
|
|
251
|
+
symbols: [
|
|
252
|
+
symbolManifestRecord(entity, mergeManifestRelationships([], relationships, String(entity.id))),
|
|
253
|
+
],
|
|
254
|
+
}));
|
|
255
|
+
return doc.toString();
|
|
256
|
+
}
|
|
257
|
+
const doc = parseDocument(existingContent);
|
|
258
|
+
const symbols = doc.get("symbols", true);
|
|
259
|
+
if (!symbols || typeof symbols !== "object" || !("items" in symbols)) {
|
|
260
|
+
throw new OperationError("SOURCE_FORMAT_INVALID", "Symbol manifest must contain a symbols array");
|
|
261
|
+
}
|
|
262
|
+
const items = symbols.items;
|
|
263
|
+
const id = String(entity.id);
|
|
264
|
+
const index = items.findIndex((item) => {
|
|
265
|
+
if (!item || typeof item !== "object" || !("get" in item))
|
|
266
|
+
return false;
|
|
267
|
+
return String(item.get("id")) === id;
|
|
268
|
+
});
|
|
269
|
+
const existingRelationships = index >= 0 ? manifestRelationships(items[index]) : [];
|
|
270
|
+
let next = symbolManifestRecord(entity, mergeManifestRelationships(existingRelationships, relationships, id));
|
|
271
|
+
if (index >= 0) {
|
|
272
|
+
// Partial symbol payloads (for example a relationship-only upsert) must
|
|
273
|
+
// never erase authored provenance from the manifest. Preserve fields the
|
|
274
|
+
// payload omits, with incoming values winning on explicit conflicts.
|
|
275
|
+
const item = items[index];
|
|
276
|
+
const previous = typeof item?.toJSON === "function" ? item.toJSON() : null;
|
|
277
|
+
if (typeof previous === "object" &&
|
|
278
|
+
previous !== null &&
|
|
279
|
+
!Array.isArray(previous)) {
|
|
280
|
+
const preserved = symbolManifestRecord(previous, []);
|
|
281
|
+
next = { ...preserved, ...next };
|
|
282
|
+
}
|
|
283
|
+
doc.setIn(["symbols", index], next);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
doc.addIn(["symbols"], next);
|
|
287
|
+
}
|
|
288
|
+
return doc.toString();
|
|
289
|
+
}
|
|
290
|
+
export function renderSourceDeletion(sourcePathValue, entityId, entityType, existingContent) {
|
|
291
|
+
const extension = path.extname(sourcePathValue).toLowerCase();
|
|
292
|
+
if (extension === ".md" || extension === ".mdx") {
|
|
293
|
+
const parsed = bodyAndFrontmatter(existingContent);
|
|
294
|
+
if (String(parsed.frontmatter.id ?? "") !== entityId) {
|
|
295
|
+
throw new OperationError("SOURCE_ENTITY_MISMATCH", `Authored document ${sourcePathValue} does not contain ${entityId}`);
|
|
296
|
+
}
|
|
297
|
+
return { mode: "delete" };
|
|
298
|
+
}
|
|
299
|
+
if (extension === ".yaml" || extension === ".yml") {
|
|
300
|
+
if (entityType !== "symbol") {
|
|
301
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `YAML deletion is supported only for symbol manifests, not ${entityType}`);
|
|
302
|
+
}
|
|
303
|
+
const doc = parseDocument(existingContent);
|
|
304
|
+
const symbols = doc.get("symbols", true);
|
|
305
|
+
if (!symbols || typeof symbols !== "object" || !("items" in symbols)) {
|
|
306
|
+
throw new OperationError("SOURCE_FORMAT_INVALID", "Symbol manifest must contain a symbols array");
|
|
307
|
+
}
|
|
308
|
+
const items = symbols.items;
|
|
309
|
+
const index = items.findIndex((item) => {
|
|
310
|
+
if (!item || typeof item !== "object" || !("get" in item))
|
|
311
|
+
return false;
|
|
312
|
+
return (String(item.get("id")) === entityId);
|
|
313
|
+
});
|
|
314
|
+
if (index < 0) {
|
|
315
|
+
throw new OperationError("SOURCE_ENTITY_MISMATCH", `Symbol manifest ${sourcePathValue} does not contain ${entityId}`);
|
|
316
|
+
}
|
|
317
|
+
doc.deleteIn(["symbols", index]);
|
|
318
|
+
return { mode: "write", body: doc.toString() };
|
|
319
|
+
}
|
|
320
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `Unsupported authored source format: ${extension || "unknown"}`);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Remove one legacy relationship declaration from an authored Markdown
|
|
324
|
+
* document. Relationship shards are the canonical relationship lane, but
|
|
325
|
+
* older entity documents may still carry `links` or typed `relationships`
|
|
326
|
+
* frontmatter. When such a declaration is explicitly deleted, patch only
|
|
327
|
+
* that record through the YAML CST so comments, ordering, and the Markdown
|
|
328
|
+
* body remain byte-stable.
|
|
329
|
+
*/
|
|
330
|
+
export function renderMarkdownRelationshipDeletion(sourcePathValue, existingContent, selector) {
|
|
331
|
+
const extension = path.extname(sourcePathValue).toLowerCase();
|
|
332
|
+
if (extension !== ".md" && extension !== ".mdx") {
|
|
333
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `Relationship declarations can only be patched in Markdown documents: ${sourcePathValue}`);
|
|
334
|
+
}
|
|
335
|
+
if (!existingContent.startsWith("---"))
|
|
336
|
+
return { body: existingContent, removed: false };
|
|
337
|
+
const firstEnd = existingContent.indexOf("\n", 3);
|
|
338
|
+
if (firstEnd < 0)
|
|
339
|
+
return { body: existingContent, removed: false };
|
|
340
|
+
const marker = existingContent.indexOf("\n---", firstEnd);
|
|
341
|
+
if (marker < 0)
|
|
342
|
+
return { body: existingContent, removed: false };
|
|
343
|
+
const frontmatter = parseDocument(existingContent.slice(firstEnd + 1, marker));
|
|
344
|
+
let removed = false;
|
|
345
|
+
for (const key of ["links", "relationships"]) {
|
|
346
|
+
const sequence = frontmatter.get(key, true);
|
|
347
|
+
if (!sequence || typeof sequence !== "object" || !("items" in sequence))
|
|
348
|
+
continue;
|
|
349
|
+
const items = sequence.items;
|
|
350
|
+
for (let index = items.length - 1; index >= 0; index -= 1) {
|
|
351
|
+
const item = items[index];
|
|
352
|
+
if (!item || typeof item !== "object")
|
|
353
|
+
continue;
|
|
354
|
+
if (key === "links" && !("get" in item)) {
|
|
355
|
+
const scalar = item;
|
|
356
|
+
const value = scalar.toJSON?.() ?? scalar.value;
|
|
357
|
+
if (typeof value === "string" &&
|
|
358
|
+
value.replace(/^kb:entity\//, "") === selector.to) {
|
|
359
|
+
frontmatter.deleteIn([key, index]);
|
|
360
|
+
removed = true;
|
|
361
|
+
}
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (!("get" in item))
|
|
365
|
+
continue;
|
|
366
|
+
const node = item;
|
|
367
|
+
const target = node.get("target") ?? node.get("to");
|
|
368
|
+
const relationType = node.get("type");
|
|
369
|
+
const matches = typeof target === "string" &&
|
|
370
|
+
target.replace(/^kb:entity\//, "") === selector.to &&
|
|
371
|
+
(key === "links" ||
|
|
372
|
+
relationType === selector.type ||
|
|
373
|
+
relationType === undefined);
|
|
374
|
+
if (matches) {
|
|
375
|
+
frontmatter.deleteIn([key, index]);
|
|
376
|
+
removed = true;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!removed)
|
|
381
|
+
return { body: existingContent, removed: false };
|
|
382
|
+
const body = existingContent.slice(marker + "\n---".length);
|
|
383
|
+
return {
|
|
384
|
+
body: `---\n${frontmatter.toString()}---${body.startsWith("\n") ? "" : "\n"}${body}`,
|
|
385
|
+
removed: true,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Remove one exact typed relationship from an authored symbol manifest. The
|
|
390
|
+
* YAML CST is edited in place so comments, ordering, and unrelated symbols or
|
|
391
|
+
* relationships remain authored content rather than being re-serialized.
|
|
392
|
+
*/
|
|
393
|
+
export function renderYamlRelationshipDeletion(sourcePathValue, existingContent, selector) {
|
|
394
|
+
const extension = path.extname(sourcePathValue).toLowerCase();
|
|
395
|
+
if (extension !== ".yaml" && extension !== ".yml") {
|
|
396
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `Relationship declarations can only be patched in YAML symbol manifests: ${sourcePathValue}`);
|
|
397
|
+
}
|
|
398
|
+
const doc = parseDocument(existingContent);
|
|
399
|
+
if (doc.errors.length > 0) {
|
|
400
|
+
throw new OperationError("SOURCE_FORMAT_INVALID", `Symbol manifest contains invalid YAML: ${doc.errors[0]?.message ?? "parse failed"}`);
|
|
401
|
+
}
|
|
402
|
+
const symbols = doc.get("symbols", true);
|
|
403
|
+
if (!symbols || typeof symbols !== "object" || !("items" in symbols)) {
|
|
404
|
+
throw new OperationError("SOURCE_FORMAT_INVALID", "Symbol manifest must contain a symbols array");
|
|
405
|
+
}
|
|
406
|
+
const items = symbols.items;
|
|
407
|
+
const symbol = items.find((item) => {
|
|
408
|
+
if (!item || typeof item !== "object" || !("get" in item))
|
|
409
|
+
return false;
|
|
410
|
+
return (String(item.get("id")) ===
|
|
411
|
+
selector.from);
|
|
412
|
+
});
|
|
413
|
+
if (!symbol || typeof symbol !== "object" || !("get" in symbol)) {
|
|
414
|
+
return { body: existingContent, removed: false };
|
|
415
|
+
}
|
|
416
|
+
const relationships = symbol.get("relationships", true);
|
|
417
|
+
if (!relationships ||
|
|
418
|
+
typeof relationships !== "object" ||
|
|
419
|
+
!("items" in relationships)) {
|
|
420
|
+
return { body: existingContent, removed: false };
|
|
421
|
+
}
|
|
422
|
+
const relationshipItems = relationships.items;
|
|
423
|
+
let removed = false;
|
|
424
|
+
for (let index = relationshipItems.length - 1; index >= 0; index -= 1) {
|
|
425
|
+
const item = relationshipItems[index];
|
|
426
|
+
if (!item || typeof item !== "object" || !("get" in item))
|
|
427
|
+
continue;
|
|
428
|
+
const node = item;
|
|
429
|
+
const type = node.get("type");
|
|
430
|
+
const target = node.get("target") ?? node.get("to");
|
|
431
|
+
const normalizedTarget = typeof target === "string"
|
|
432
|
+
? target.replace(/^kb:entity\//, "")
|
|
433
|
+
: undefined;
|
|
434
|
+
if (type === selector.type && normalizedTarget === selector.to) {
|
|
435
|
+
relationships.delete(index);
|
|
436
|
+
removed = true;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return removed
|
|
440
|
+
? { body: doc.toString(), removed: true }
|
|
441
|
+
: { body: existingContent, removed: false };
|
|
442
|
+
}
|
|
443
|
+
function renderSourceDocument(input, entity, existingContent, relativePath) {
|
|
444
|
+
const extension = path.extname(relativePath).toLowerCase();
|
|
445
|
+
if (extension === ".yaml" || extension === ".yml") {
|
|
446
|
+
if (input.type !== "symbol") {
|
|
447
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `YAML source authoring is supported only for symbol manifests, not ${input.type}`);
|
|
448
|
+
}
|
|
449
|
+
return renderSymbolManifest(entity, input.relationships ?? [], existingContent);
|
|
450
|
+
}
|
|
451
|
+
if (extension !== ".md" && extension !== ".mdx") {
|
|
452
|
+
throw new OperationError("SOURCE_FORMAT_UNSUPPORTED", `Unsupported authored source format: ${extension || "unknown"}`);
|
|
453
|
+
}
|
|
454
|
+
return renderEntityDocument(input, entity, existingContent);
|
|
455
|
+
}
|
|
456
|
+
export async function writeSourceForUpsert(input, entity, existing, context, sourceDocumentOverride) {
|
|
457
|
+
if (!context?.fs)
|
|
458
|
+
return null;
|
|
459
|
+
const absolute = sourcePath(context, input, entity, existing);
|
|
460
|
+
const relative = path
|
|
461
|
+
.relative(context.workspaceRoot, absolute)
|
|
462
|
+
.replaceAll("\\", "/");
|
|
463
|
+
let before;
|
|
464
|
+
try {
|
|
465
|
+
before = await context.fs.readFile(absolute);
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
before = undefined;
|
|
469
|
+
}
|
|
470
|
+
// Proof-receipt ingest supplies pre-patched bytes so unrelated frontmatter
|
|
471
|
+
// keeps its authored formatting (and the workspace snapshot stays stable).
|
|
472
|
+
// Only valid when the document already exists; a new document still needs
|
|
473
|
+
// the canonical render.
|
|
474
|
+
const after = before !== undefined && sourceDocumentOverride !== undefined
|
|
475
|
+
? sourceDocumentOverride
|
|
476
|
+
: renderSourceDocument(input, entity, before, relative);
|
|
477
|
+
await context.fs.mkdir(path.dirname(absolute));
|
|
478
|
+
const temporary = `${absolute}.kibi-source-${process.pid}-${randomUUID()}`;
|
|
479
|
+
try {
|
|
480
|
+
await context.fs.writeFile(temporary, after);
|
|
481
|
+
if (context.fs.rename) {
|
|
482
|
+
await context.fs.rename(temporary, absolute);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
await context.fs.writeFile(absolute, after);
|
|
486
|
+
await context.fs.unlink?.(temporary).catch(() => undefined);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// A failed rename must not leak the unique temp file into the authored
|
|
491
|
+
// tree; the published target (if any) is untouched at this point.
|
|
492
|
+
await context.fs.unlink?.(temporary).catch(() => undefined);
|
|
493
|
+
throw error;
|
|
494
|
+
}
|
|
495
|
+
const receipt = {
|
|
496
|
+
path: relative,
|
|
497
|
+
mode: "write",
|
|
498
|
+
beforeHash: before === undefined ? null : digest(before),
|
|
499
|
+
afterHash: digest(after),
|
|
500
|
+
created: before === undefined,
|
|
501
|
+
};
|
|
502
|
+
const rollback = async () => {
|
|
503
|
+
const fsPort = context.fs;
|
|
504
|
+
if (fsPort === undefined)
|
|
505
|
+
return;
|
|
506
|
+
// Compare before restore: a concurrent writer may have replaced the file
|
|
507
|
+
// after our publication. Never clobber newer bytes; keep the recovery
|
|
508
|
+
// receipt so the next sync reconciles deterministically instead.
|
|
509
|
+
let current;
|
|
510
|
+
try {
|
|
511
|
+
current = await fsPort.readFile(absolute);
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
current = undefined;
|
|
515
|
+
}
|
|
516
|
+
if (current !== undefined && digest(current) !== digest(after)) {
|
|
517
|
+
writePendingSourceReceipt(context.workspaceRoot, relative, receipt.afterHash);
|
|
518
|
+
console.warn(`Skipped source rollback for ${relative}: file changed after the Kibi write; kept concurrent content and recorded recovery metadata.`);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (before === undefined) {
|
|
522
|
+
if (fsPort.unlink)
|
|
523
|
+
await fsPort.unlink(absolute);
|
|
524
|
+
else
|
|
525
|
+
await fsPort.writeFile(absolute, "");
|
|
526
|
+
try {
|
|
527
|
+
fs.unlinkSync(pendingReceiptPath(context.workspaceRoot, relative));
|
|
528
|
+
}
|
|
529
|
+
catch {
|
|
530
|
+
// The pending receipt is advisory recovery metadata.
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
const rollbackTemp = `${absolute}.kibi-rollback-${process.pid}-${randomUUID()}`;
|
|
535
|
+
try {
|
|
536
|
+
await fsPort.writeFile(rollbackTemp, before);
|
|
537
|
+
if (fsPort.rename)
|
|
538
|
+
await fsPort.rename(rollbackTemp, absolute);
|
|
539
|
+
else {
|
|
540
|
+
await fsPort.writeFile(absolute, before);
|
|
541
|
+
await fsPort.unlink?.(rollbackTemp).catch(() => undefined);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
catch (error) {
|
|
545
|
+
await fsPort.unlink?.(rollbackTemp).catch(() => undefined);
|
|
546
|
+
throw error;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
const pendingReceipt = pendingReceiptPath(context.workspaceRoot, relative);
|
|
551
|
+
try {
|
|
552
|
+
if (receipt.afterHash !== null &&
|
|
553
|
+
(before === undefined || fs.existsSync(pendingReceipt))) {
|
|
554
|
+
writePendingSourceReceipt(context.workspaceRoot, relative, receipt.afterHash);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
catch (receiptError) {
|
|
558
|
+
// The source bytes are already published but the caller has not received
|
|
559
|
+
// the rollback handle yet. Unwind the publication here so no failed call
|
|
560
|
+
// ever leaves a half-registered source write behind.
|
|
561
|
+
try {
|
|
562
|
+
await rollback();
|
|
563
|
+
}
|
|
564
|
+
catch (rollbackError) {
|
|
565
|
+
throw new AggregateError([receiptError, rollbackError], `Source published for ${relative}, but pending receipt publication and rollback both failed; recover from the pending-source receipt or restore the authored file manually`);
|
|
566
|
+
}
|
|
567
|
+
throw receiptError;
|
|
568
|
+
}
|
|
569
|
+
return { receipt, rollback };
|
|
570
|
+
}
|
|
571
|
+
/** Resolve and normalize the canonical authored path for an entity. */
|
|
572
|
+
export function canonicalSourcePath(context, input, entity, existing) {
|
|
573
|
+
return path
|
|
574
|
+
.relative(context.workspaceRoot, sourcePath(context, input, entity, existing))
|
|
575
|
+
.replaceAll(path.sep, "/");
|
|
576
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function valueFieldHint(value: unknown): string;
|
|
2
2
|
export declare function factKindShapeHints(entity: Readonly<Record<string, unknown>>): string[];
|
|
3
|
+
export declare function assertRuleSchemaArity(argumentNames: unknown, argumentTypes: unknown): void;
|
|
3
4
|
export declare function validateFactModelingShape(entity: Readonly<Record<string, unknown>>): void;
|
|
4
5
|
//# sourceMappingURL=strict-fact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-fact.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/strict-fact.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAarD;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,MAAM,EAAE,CA+EV;AAGD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,IAAI,
|
|
1
|
+
{"version":3,"file":"strict-fact.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/strict-fact.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAarD;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,MAAM,EAAE,CA+EV;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,OAAO,EACtB,aAAa,EAAE,OAAO,GACrB,IAAI,CAUN;AAGD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,IAAI,CA+CN"}
|
|
@@ -93,6 +93,13 @@ export function factKindShapeHints(entity) {
|
|
|
93
93
|
];
|
|
94
94
|
return [];
|
|
95
95
|
}
|
|
96
|
+
export function assertRuleSchemaArity(argumentNames, argumentTypes) {
|
|
97
|
+
if (!Array.isArray(argumentNames) ||
|
|
98
|
+
!Array.isArray(argumentTypes) ||
|
|
99
|
+
argumentNames.length !== argumentTypes.length) {
|
|
100
|
+
throw new Error("Entity validation failed: rule_schema argument_names and argument_types must have equal lengths");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
96
103
|
// implements REQ-kibi-operation-interface-parity
|
|
97
104
|
export function validateFactModelingShape(entity) {
|
|
98
105
|
const hints = factKindShapeHints(entity);
|
|
@@ -123,10 +130,6 @@ export function validateFactModelingShape(entity) {
|
|
|
123
130
|
entity.rule_name.trim() === "") {
|
|
124
131
|
throw new Error("Entity validation failed: fact_kind 'rule_schema' requires rule_name");
|
|
125
132
|
}
|
|
126
|
-
|
|
127
|
-
!Array.isArray(entity.argument_types) ||
|
|
128
|
-
entity.argument_names.length !== entity.argument_types.length) {
|
|
129
|
-
throw new Error("Entity validation failed: rule_schema argument_names and argument_types must have equal lengths");
|
|
130
|
-
}
|
|
133
|
+
assertRuleSchemaArity(entity.argument_names, entity.argument_types);
|
|
131
134
|
}
|
|
132
135
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface SymbolCompilerLockFileSystem {
|
|
2
|
+
readonly mkdirSync: (target: string, options?: {
|
|
3
|
+
readonly recursive?: boolean;
|
|
4
|
+
}) => void;
|
|
5
|
+
readonly readFileSync: (target: string) => string;
|
|
6
|
+
readonly writeFileSync: (target: string, data: string, options: {
|
|
7
|
+
readonly encoding: "utf8";
|
|
8
|
+
readonly flag: "wx";
|
|
9
|
+
}) => void;
|
|
10
|
+
readonly unlinkSync: (target: string) => void;
|
|
11
|
+
readonly rmdirSync: (target: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export interface SymbolCompilerLockOptions {
|
|
14
|
+
readonly timeoutMs?: number;
|
|
15
|
+
readonly now?: () => number;
|
|
16
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
17
|
+
readonly fileSystem?: SymbolCompilerLockFileSystem;
|
|
18
|
+
readonly isProcessAlive?: (pid: number) => boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare class SymbolCompilerLockError extends Error {
|
|
21
|
+
readonly name = "SymbolCompilerLockError";
|
|
22
|
+
}
|
|
23
|
+
export interface SymbolCompilerLockHandle {
|
|
24
|
+
/**
|
|
25
|
+
* Remove this handle's validated owner metadata and then its empty lock
|
|
26
|
+
* directory. Transient cleanup errors are retried; exhausted or permanent
|
|
27
|
+
* failures leave the lock fail-closed and may require verified manual
|
|
28
|
+
* cleanup. Successful release is idempotent, and a stale handle never
|
|
29
|
+
* removes a different owner token.
|
|
30
|
+
*/
|
|
31
|
+
readonly release: () => void;
|
|
32
|
+
}
|
|
33
|
+
export declare function releaseSymbolCompilerLock(handle: SymbolCompilerLockHandle | undefined, operationFailure?: {
|
|
34
|
+
readonly error: unknown;
|
|
35
|
+
}, committed?: boolean): void;
|
|
36
|
+
/**
|
|
37
|
+
* Acquire the workspace symbol compiler lock without a callback shape, for
|
|
38
|
+
* operations whose lock must span several awaits (source publication,
|
|
39
|
+
* coordinate refresh, canonical re-extraction, and the RDF commit).
|
|
40
|
+
*/
|
|
41
|
+
export declare function acquireSymbolCompilerLock(workspaceRoot: string, options?: SymbolCompilerLockOptions): Promise<SymbolCompilerLockHandle>;
|
|
42
|
+
/**
|
|
43
|
+
* Run `operation` while holding the workspace symbol compiler lock.
|
|
44
|
+
*
|
|
45
|
+
* Atomic directory creation is the lock authority. Owner metadata is
|
|
46
|
+
* release authorization and diagnostics: every existing target, including a
|
|
47
|
+
* legacy file or a directory with missing/corrupt metadata, blocks contenders
|
|
48
|
+
* until timeout. A well-formed owner record whose holder pid is provably
|
|
49
|
+
* dead is stolen immediately instead of blocking for the full timeout;
|
|
50
|
+
* corrupt metadata and live holders stay fail-closed.
|
|
51
|
+
* Release failures propagate so successful work is never reported unlocked.
|
|
52
|
+
*/
|
|
53
|
+
export declare function withSymbolCompilerLock<T>(workspaceRoot: string, operation: () => Promise<T>, options?: SymbolCompilerLockOptions): Promise<T>;
|
|
54
|
+
//# sourceMappingURL=symbol-compiler-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-compiler-lock.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/symbol-compiler-lock.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACvC,IAAI,CAAC;IACV,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,QAAQ,CAAC,aAAa,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;KAAE,KACxD,IAAI,CAAC;IACV,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAeD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,4BAA4B,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACpD;AAGD,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAkB,IAAI,6BAA6B;CACpD;AA8MD,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAGD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,gBAAgB,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAC9C,SAAS,UAAQ,GAChB,IAAI,CAoBN;AAED;;;;GAIG;AAEH,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA2InC;AAED;;;;;;;;;;GAUG;AAEH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,CAAC,CAAC,CAWZ"}
|