kibi-cli 1.0.1 → 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.js +3 -3
- package/dist/cli-operation-metadata.d.ts +4 -3
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +7 -5
- package/dist/cli-protocol.js +1 -1
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +7 -0
- 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 +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -10
- package/dist/commands/branch.d.ts +1 -0
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +8 -4
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +190 -44
- 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/doctor.d.ts +22 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +48 -22
- package/dist/commands/engine.d.ts +12 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +40 -0
- package/dist/commands/github-init.d.ts +1 -0
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +9 -5
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +38 -5
- package/dist/commands/migrate.d.ts +4 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +7 -7
- 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.js +1 -1
- package/dist/commands/sync/discovery.d.ts +3 -0
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +36 -28
- package/dist/commands/sync/manifest.d.ts +1 -1
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +53 -21
- 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 +25 -14
- 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 +11 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +74 -30
- 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 +14 -76
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +197 -30
- package/dist/extractors/manifest.d.ts +5 -0
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +46 -1
- package/dist/extractors/markdown.d.ts +5 -3
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +41 -24
- package/dist/extractors/playwright-cases.js +1 -1
- package/dist/extractors/relationships.d.ts +6 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +1 -1
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -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 +1 -0
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +7 -3
- 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 +2 -1
- package/dist/operations/bootstrap/activation.d.ts.map +1 -1
- package/dist/operations/bootstrap/activation.js +11 -3
- package/dist/operations/bootstrap/generate.d.ts +2 -1
- package/dist/operations/bootstrap/generate.d.ts.map +1 -1
- package/dist/operations/bootstrap/generate.js +6 -3
- package/dist/operations/bootstrap/guidance.d.ts +1 -0
- package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance.js +1 -1
- 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 +53 -46
- package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applicability.js +103 -4
- 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-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-loader.d.ts +1 -0
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +4 -3
- package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-ranker.js +4 -1
- package/dist/operations/modeling/predicate-types.d.ts +1 -1
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- 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/suggest-predicates.d.ts +3 -1
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +52 -19
- 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 +100 -32
- package/dist/operations/mutation/relationships.d.ts +1 -0
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +6 -4
- 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 -2
- package/dist/operations/mutation/source-authoring.d.ts +5 -1
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
- package/dist/operations/mutation/source-authoring.js +79 -46
- 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 +5 -2
- package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-compiler-lock.js +65 -2
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +2 -2
- package/dist/operations/mutation/symbol-refresh.d.ts +1 -0
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +10 -8
- 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 +86 -54
- 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 +46 -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 +8 -106
- package/dist/operations/planning/apply-plan.d.ts.map +1 -1
- package/dist/operations/planning/apply-plan.js +113 -36
- package/dist/operations/planning/compile-intent.d.ts +2 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +70 -14
- 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 +46 -26
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +20 -7
- 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/prolog/codec.d.ts +13 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +269 -154
- 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 +55 -17
- 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/{public → proof/producers}/playwright-case-id.d.ts +1 -1
- package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
- package/dist/{public → proof/producers}/playwright-case-id.js +3 -3
- 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/diagnostic-usage.js +6 -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 -10
- package/dist/public/impact/coverage-depth-quality.d.ts +1 -0
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +1 -1
- 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 +5 -2
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +329 -64
- package/dist/public/operations/catalog.d.ts +447 -196
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +6 -4
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +3 -7
- package/dist/public/operations/contracts.d.ts +7 -0
- package/dist/public/operations/contracts.d.ts.map +1 -1
- package/dist/public/operations/contracts.js +31 -22
- 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 +9 -9
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +17 -14
- package/dist/public/operations/index.d.ts +1 -1
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +1 -1
- package/dist/public/operations/migration-plan.d.ts +4 -3
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +23 -21
- package/dist/public/operations/node-ports.js +6 -6
- 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 -19
- package/dist/public/operations/result-envelope.d.ts +1 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -1
- package/dist/public/operations/result-envelope.js +12 -10
- package/dist/public/operations/runtime-types.d.ts +5 -0
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- 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 +7 -2
- package/dist/public/operations/specs/check.d.ts.map +1 -1
- package/dist/public/operations/specs/check.js +8 -20
- package/dist/public/operations/specs/mutation-schemas.d.ts +257 -163
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +15 -7
- package/dist/public/operations/specs/planning.d.ts +9 -0
- package/dist/public/operations/specs/planning.d.ts.map +1 -1
- package/dist/public/operations/specs/planning.js +6 -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 +19 -0
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +112 -12
- package/dist/public/operations/specs/upsert.d.ts +257 -163
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
- package/dist/public/operations/symbol-repair-plan.js +118 -3
- package/dist/public/operations/types.d.ts +1 -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 +21 -7
- package/dist/public/skills/kibi-freshness/SKILL.md +1 -1
- package/dist/public/skills/kibi-usage/SKILL.md +41 -12
- package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +6 -6
- 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 -47
- package/dist/public/telemetry-acceptance.d.ts +3 -77
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +4 -2
- package/dist/public/telemetry-remediation.js +1 -1
- package/dist/report/html-report.css +282 -0
- package/dist/report/html-report.d.ts +4 -2
- package/dist/report/html-report.d.ts.map +1 -1
- package/dist/report/html-report.js +37 -300
- 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 +14 -7
- package/dist/schemas/entity.schema.json +355 -215
- 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 +28 -0
- package/dist/traceability/evidence-model.d.ts.map +1 -1
- 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 +145 -1
- 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.js +4 -4
- 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 +138 -27
- 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 +13 -4
- package/dist/types/entities.d.ts +5 -3
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/utils/branch-resolver.d.ts +1 -0
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +7 -4
- package/dist/utils/branch-store.d.ts +6 -0
- package/dist/utils/branch-store.d.ts.map +1 -1
- package/dist/utils/branch-store.js +27 -0
- package/dist/utils/kb-paths.d.ts +1 -1
- package/dist/utils/kb-paths.d.ts.map +1 -1
- package/dist/utils/kb-paths.js +1 -1
- package/dist/utils/rule-registry.d.ts +1 -11
- 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 +12 -113
- package/dist/utils/strict-modeling.d.ts +1 -0
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +1 -1
- package/package.json +8 -11
- package/src/public/diagnostic-usage.ts +6 -6
- package/src/public/distribution-parity.ts +17 -10
- package/src/public/impact/coverage-depth-quality.ts +1 -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 +463 -72
- package/src/public/operations/catalog.ts +10 -4
- package/src/public/operations/check-executor.ts +3 -7
- package/src/public/operations/contracts.ts +38 -22
- package/src/public/operations/discovery-entities.ts +7 -0
- package/src/public/operations/discovery-executors.ts +26 -23
- package/src/public/operations/index.ts +1 -1
- package/src/public/operations/migration-plan.ts +32 -25
- package/src/public/operations/node-ports.ts +6 -6
- package/src/public/operations/repair-plan.ts +60 -23
- package/src/public/operations/result-envelope.ts +15 -10
- package/src/public/operations/runtime-types.ts +5 -0
- package/src/public/operations/specs/check-rules.generated.ts +37 -0
- package/src/public/operations/specs/check.ts +12 -21
- package/src/public/operations/specs/mutation-schemas.ts +22 -9
- package/src/public/operations/specs/planning.ts +7 -0
- package/src/public/operations/specs/proof.ts +43 -0
- package/src/public/operations/specs/reporting.ts +140 -13
- package/src/public/operations/symbol-repair-plan.ts +163 -3
- package/src/public/operations/types.ts +1 -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 +26 -10
- package/src/public/skills/kibi-freshness/SKILL.md +1 -1
- package/src/public/skills/kibi-usage/SKILL.md +41 -12
- package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/src/public/skills/kibi-usage/resources/proof.md +105 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
- package/src/public/symbol-granularity.generated.ts +41 -0
- package/src/public/symbol-granularity.ts +35 -60
- package/src/public/telemetry-acceptance-types.d.ts +98 -0
- package/src/public/telemetry-acceptance.ts +22 -100
- package/src/public/telemetry-remediation.ts +1 -1
- package/src/schemas/entity.schema.json +355 -215
- package/dist/cli-register-verification.d.ts +0 -3
- package/dist/cli-register-verification.d.ts.map +0 -1
- package/dist/cli-register-verification.js +0 -16
- package/dist/commands/verify.d.ts +0 -10
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -126
- package/dist/operations/verification/ingest-verification.d.ts +0 -29
- package/dist/operations/verification/ingest-verification.d.ts.map +0 -1
- package/dist/operations/verification/ingest-verification.js +0 -192
- package/dist/public/operations/specs/verification.d.ts +0 -78
- package/dist/public/operations/specs/verification.d.ts.map +0 -1
- package/dist/public/operations/specs/verification.js +0 -62
- package/dist/public/playwright-case-id.d.ts.map +0 -1
- package/dist/public/verification-receipt.d.ts +0 -242
- package/dist/public/verification-receipt.d.ts.map +0 -1
- package/dist/public/verification-receipt.js +0 -296
- package/dist/verification/playwright-reporter.d.ts +0 -21
- package/dist/verification/playwright-reporter.d.ts.map +0 -1
- package/dist/verification/playwright-reporter.js +0 -114
- package/src/public/operations/specs/verification.ts +0 -78
- package/src/public/playwright-case-id.ts +0 -35
- package/src/public/verification-receipt.ts +0 -412
|
@@ -20,7 +20,7 @@ import * as path from "node:path";
|
|
|
20
20
|
import { dump as dumpYAML, load as parseYAML } from "js-yaml";
|
|
21
21
|
import { coarseCoordinateSpan, coordinateIdentityHash, coordinateSourceHash, parseCoordinateArtifact, writeCoordinateArtifact, } from "../../extractors/symbol-coordinates.js";
|
|
22
22
|
import { enrichSymbolCoordinates, } from "../../extractors/symbols-coordinator.js";
|
|
23
|
-
import { COARSE_GRANULARITY_REASONS, isCoarseGranularityReason, } from "../../public/symbol-granularity.js";
|
|
23
|
+
import { COARSE_GRANULARITY_REASONS, COARSE_GRANULARITY_REASONS_PARENTHESIZED, isCoarseGranularityReason, } from "../../public/symbol-granularity.js";
|
|
24
24
|
import { resolveSymbolsManifestPaths } from "../../utils/manifest-paths.js";
|
|
25
25
|
function resolveDeps(overrides) {
|
|
26
26
|
return {
|
|
@@ -42,17 +42,16 @@ export const SYMBOLS_MANIFEST_COMMENT_BLOCK = `# symbols.yaml
|
|
|
42
42
|
# id, title, sourceFile, links, status, tags, owner, priority
|
|
43
43
|
# Generated coordinates are stored separately in symbol-coordinates.yaml.
|
|
44
44
|
# Run \`kibi sync --refresh-symbol-coordinates\` to refresh them.
|
|
45
|
+
#
|
|
46
|
+
# Coordinate refresh granularity gate:
|
|
47
|
+
# The AST extractor locates per-declaration spans for code files. When it
|
|
48
|
+
# cannot find a declaration, a title-match or whole-file coarse span is
|
|
49
|
+
# published ONLY for symbols that declare a coarse granularity_reason
|
|
50
|
+
# (${COARSE_GRANULARITY_REASONS.join(", ")}).
|
|
51
|
+
# A symbol without granularity_reason whose extraction misses gets no
|
|
52
|
+
# coordinate entry at all and is reported as failed; add symbol_role and
|
|
53
|
+
# granularity_reason to opt it into the coarse fallback.
|
|
45
54
|
`;
|
|
46
|
-
const SYMBOL_COORD_EXTENSIONS = new Set([
|
|
47
|
-
".ts",
|
|
48
|
-
".tsx",
|
|
49
|
-
".js",
|
|
50
|
-
".jsx",
|
|
51
|
-
".mts",
|
|
52
|
-
".cts",
|
|
53
|
-
".mjs",
|
|
54
|
-
".cjs",
|
|
55
|
-
]);
|
|
56
55
|
const GENERATED_COORD_FIELDS = [
|
|
57
56
|
"sourceLine",
|
|
58
57
|
"sourceColumn",
|
|
@@ -152,6 +151,19 @@ function manifestEntryIdentity(entry) {
|
|
|
152
151
|
: { granularity_reason: granularityReason }),
|
|
153
152
|
};
|
|
154
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Typed reason an eligible (code-file) symbol still has no coordinates after
|
|
156
|
+
* enrichment: the AST extractor missed and the symbol either lacks a coarse
|
|
157
|
+
* granularity_reason (so the whole-file fallback is gated off) or the
|
|
158
|
+
* fallback itself produced no span.
|
|
159
|
+
*/
|
|
160
|
+
function coarseAnchorFailureReason(entry) {
|
|
161
|
+
const reason = entry.granularity_reason;
|
|
162
|
+
if (!isCoarseGranularityReason(reason)) {
|
|
163
|
+
return `extractor produced no coordinates; add symbol_role and granularity_reason ${COARSE_GRANULARITY_REASONS_PARENTHESIZED} to enable the whole-file coarse fallback`;
|
|
164
|
+
}
|
|
165
|
+
return "extractor produced no coordinates and the whole-file coarse fallback found no span for this symbol";
|
|
166
|
+
}
|
|
155
167
|
export async function refreshManifestCoordinates(
|
|
156
168
|
// implements REQ-003
|
|
157
169
|
manifestPath, workspaceRoot, deps) {
|
|
@@ -212,8 +224,8 @@ manifestPath, workspaceRoot, deps) {
|
|
|
212
224
|
const strippedEnriched = enriched.map((current) => Object.fromEntries(Object.entries(current).filter(([field]) => !GENERATED_MANIFEST_FIELDS.has(field))));
|
|
213
225
|
parsed.symbols = strippedEnriched;
|
|
214
226
|
let refreshed = 0;
|
|
215
|
-
let failed = 0;
|
|
216
227
|
let unchanged = 0;
|
|
228
|
+
const failures = [];
|
|
217
229
|
for (let i = 0; i < before.length; i++) {
|
|
218
230
|
const previous = before[i] ?? {};
|
|
219
231
|
const current = enriched[i] ?? previous;
|
|
@@ -231,11 +243,13 @@ manifestPath, workspaceRoot, deps) {
|
|
|
231
243
|
? previous.sourceFile
|
|
232
244
|
: undefined, workspaceRoot, resolved);
|
|
233
245
|
if (eligible && !hasAllGeneratedCoordinates(current)) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
246
|
+
failures.push({
|
|
247
|
+
id: typeof current.id === "string" ? current.id : `#${i}`,
|
|
248
|
+
reason: coarseAnchorFailureReason(current),
|
|
249
|
+
});
|
|
250
|
+
continue;
|
|
238
251
|
}
|
|
252
|
+
unchanged++;
|
|
239
253
|
}
|
|
240
254
|
const dumped = resolved.dumpYAML(parsed, {
|
|
241
255
|
lineWidth: -1,
|
|
@@ -268,7 +282,26 @@ manifestPath, workspaceRoot, deps) {
|
|
|
268
282
|
}
|
|
269
283
|
throw error;
|
|
270
284
|
}
|
|
271
|
-
|
|
285
|
+
// The generated coordinates live in the artifact beside the manifest, not
|
|
286
|
+
// in the authored symbols.yaml this command also rewrites; naming the
|
|
287
|
+
// artifact keeps diff audits pointed at the file that actually changed.
|
|
288
|
+
const counts = `(refreshed=${refreshed}, unchanged=${unchanged}, failed=${failures.length})`;
|
|
289
|
+
if (coordinatesPath !== null) {
|
|
290
|
+
console.log(`\u2713 Refreshed symbol coordinates in ${path.relative(workspaceRoot, coordinatesPath)} ${counts}`);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
console.log(`\u2713 Normalized symbol manifest ${path.relative(workspaceRoot, manifestPath)} ${counts}`);
|
|
294
|
+
}
|
|
295
|
+
const maxReportedFailures = 10;
|
|
296
|
+
for (const failure of failures.slice(0, maxReportedFailures)) {
|
|
297
|
+
console.log(` failed ${failure.id}: ${failure.reason}`);
|
|
298
|
+
}
|
|
299
|
+
if (failures.length > maxReportedFailures) {
|
|
300
|
+
console.log(` ... and ${failures.length - maxReportedFailures} more failed symbol(s)`);
|
|
301
|
+
}
|
|
302
|
+
if (failures.length > 0) {
|
|
303
|
+
console.log(" Symbols without a published coordinate entry are dropped from coverage on the next plain sync until they succeed.");
|
|
304
|
+
}
|
|
272
305
|
}
|
|
273
306
|
export function hasAllGeneratedCoordinates(
|
|
274
307
|
// implements REQ-003
|
|
@@ -287,10 +320,9 @@ sourceFile, workspaceRoot, deps) {
|
|
|
287
320
|
const absolute = path.isAbsolute(sourceFile)
|
|
288
321
|
? sourceFile
|
|
289
322
|
: path.resolve(workspaceRoot, sourceFile);
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
return SYMBOL_COORD_EXTENSIONS.has(ext);
|
|
323
|
+
// Non-JS/TS files also undergo coordinate extraction through the text
|
|
324
|
+
// heuristic. A miss there must be reported just like an AST extraction miss.
|
|
325
|
+
return resolved.existsSync(absolute);
|
|
294
326
|
}
|
|
295
327
|
function isRecord(value) {
|
|
296
328
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -18,7 +18,10 @@ export declare function persistEntities(prolog: PrologProcess, results: Extracti
|
|
|
18
18
|
entityCount: number;
|
|
19
19
|
kbModified: boolean;
|
|
20
20
|
}>;
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function relationshipFailureMessage(singleError: string | undefined, batchError: string | undefined): string;
|
|
22
|
+
export declare function persistRelationships(prolog: PrologProcess, results: ExtractionResult[], shardRelationships: ExtractedRelationship[], options?: {
|
|
23
|
+
workspaceRoot?: string;
|
|
24
|
+
}): Promise<{
|
|
22
25
|
relationshipCount: number;
|
|
23
26
|
kbModified: boolean;
|
|
24
27
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/persistence.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/persistence.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiHrD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;CACrB;AA8CD,iFAAiF;AACjF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,8EAA8E;AAC9E,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,SAAS,qBAAqB,EAAE,GAC9C,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAmCD,wBAAsB,eAAe,CAEnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAiPvD;AA4BD,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,CAER;AAGD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,kBAAkB,EAAE,qBAAqB,EAAE,EAC3C,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,OAAO,CAAC;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAmO7D"}
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
import * as path from "node:path";
|
|
19
19
|
import { toPrologAtom, toPrologString } from "../../prolog/codec.js";
|
|
20
20
|
import { loadEntities } from "../../public/operations/discovery-entities.js";
|
|
21
|
-
import {
|
|
21
|
+
import { appendOnlyProofReceiptHistoryErrors } from "../../public/proof-receipt.js";
|
|
22
|
+
import { findUntrackedDocumentMatches } from "./untracked-targets.js";
|
|
22
23
|
// Field categorization for typed fact serialization
|
|
23
24
|
// NOTE: base entity fields (status, owner, priority, severity) are NOT listed here —
|
|
24
25
|
// they are emitted in the base props block above. Only fact-specific atom fields go here.
|
|
@@ -285,15 +286,15 @@ prolog, results, entityIds, options = {}) {
|
|
|
285
286
|
id: entity.id,
|
|
286
287
|
type: "test",
|
|
287
288
|
});
|
|
288
|
-
const previous = Array.isArray(existing[0]?.
|
|
289
|
-
? existing[0].
|
|
289
|
+
const previous = Array.isArray(existing[0]?.proof_receipts)
|
|
290
|
+
? existing[0].proof_receipts.filter((receipt) => receipt !== null &&
|
|
290
291
|
typeof receipt === "object" &&
|
|
291
292
|
!Array.isArray(receipt))
|
|
292
293
|
: [];
|
|
293
|
-
const next = Array.isArray(entity.
|
|
294
|
-
? entity.
|
|
294
|
+
const next = Array.isArray(entity.proof_receipts)
|
|
295
|
+
? entity.proof_receipts
|
|
295
296
|
: undefined;
|
|
296
|
-
const receiptErrors =
|
|
297
|
+
const receiptErrors = appendOnlyProofReceiptHistoryErrors(previous, next);
|
|
297
298
|
if (receiptErrors.length > 0) {
|
|
298
299
|
throw new Error(receiptErrors.join("; "));
|
|
299
300
|
}
|
|
@@ -369,11 +370,14 @@ prolog, results, entityIds, options = {}) {
|
|
|
369
370
|
if (entity.verification_perspective !== undefined) {
|
|
370
371
|
props.push(`verification_perspective=${toPrologAtom(entity.verification_perspective)}`);
|
|
371
372
|
}
|
|
372
|
-
if (entity.
|
|
373
|
-
props.push(`
|
|
373
|
+
if (entity.proof_contract !== undefined) {
|
|
374
|
+
props.push(`proof_contract=${toPrologString(JSON.stringify(entity.proof_contract))}`);
|
|
374
375
|
}
|
|
375
|
-
if (entity.
|
|
376
|
-
props.push(`
|
|
376
|
+
if (entity.proof_bindings !== undefined) {
|
|
377
|
+
props.push(`proof_bindings=${toPrologString(JSON.stringify(entity.proof_bindings))}`);
|
|
378
|
+
}
|
|
379
|
+
if (entity.proof_receipts !== undefined) {
|
|
380
|
+
props.push(`proof_receipts=${toPrologString(JSON.stringify(entity.proof_receipts))}`);
|
|
377
381
|
}
|
|
378
382
|
}
|
|
379
383
|
const propsList = `[${props.join(", ")}]`;
|
|
@@ -450,8 +454,11 @@ function semanticEntityContext(entity, sourceFile) {
|
|
|
450
454
|
}
|
|
451
455
|
return ` (${details.join("; ")})`;
|
|
452
456
|
}
|
|
457
|
+
export function relationshipFailureMessage(singleError, batchError) {
|
|
458
|
+
return singleError || batchError || "Unknown error";
|
|
459
|
+
}
|
|
453
460
|
// implements REQ-core-persistence
|
|
454
|
-
export async function persistRelationships(prolog, results, shardRelationships) {
|
|
461
|
+
export async function persistRelationships(prolog, results, shardRelationships, options = {}) {
|
|
455
462
|
let relCount = 0;
|
|
456
463
|
let kbModified = false;
|
|
457
464
|
// Build ID lookup for relationship resolution
|
|
@@ -525,9 +532,7 @@ export async function persistRelationships(prolog, results, shardRelationships)
|
|
|
525
532
|
rel: item.rel,
|
|
526
533
|
fromId: item.fromId,
|
|
527
534
|
toId: item.toId,
|
|
528
|
-
error: single.error
|
|
529
|
-
(relationshipBatchRunner ? batch.error : undefined) ||
|
|
530
|
-
"Unknown error",
|
|
535
|
+
error: relationshipFailureMessage(single.error, relationshipBatchRunner ? batch.error : undefined),
|
|
531
536
|
});
|
|
532
537
|
}
|
|
533
538
|
}
|
|
@@ -609,6 +614,12 @@ export async function persistRelationships(prolog, results, shardRelationships)
|
|
|
609
614
|
const idList = [...missingIds].sort().join(", ");
|
|
610
615
|
console.warn(`\nTip: ${missingEntities.length} relationship(s) reference ${missingIds.size} missing entity/ies: ${idList}.`);
|
|
611
616
|
console.warn(" Create the missing docs (e.g., docs/requirements/REQ-*.md) or remove stale relationships.");
|
|
617
|
+
const untrackedMatches = options.workspaceRoot !== undefined
|
|
618
|
+
? findUntrackedDocumentMatches(options.workspaceRoot, [...missingIds])
|
|
619
|
+
: new Map();
|
|
620
|
+
for (const [id, docPath] of untrackedMatches) {
|
|
621
|
+
console.warn(` Note: document for ${id} exists at ${docPath} but is untracked, so sync ignores it. Stage it with \`git add ${docPath}\` (staging is enough; no commit required) and sync again.`);
|
|
622
|
+
}
|
|
612
623
|
}
|
|
613
624
|
else if (invalidRels.length > 0) {
|
|
614
625
|
console.warn("\nTip: Check that relationship types and directions match the allowed schema (e.g., implements symbol→req, verified_by req→test).");
|
|
@@ -16,6 +16,7 @@ interface StagingDeps {
|
|
|
16
16
|
writeFileSync: typeof writeFileSync;
|
|
17
17
|
}
|
|
18
18
|
export declare function createUniqueStagingPath(currentBranch: string, rootDir: string, pid?: number, now?: number): string;
|
|
19
|
+
export declare function abandonedStagingBranch(branch: string | undefined): string | undefined;
|
|
19
20
|
export declare function cleanupAbandonedStagingDirectories(stagingPath: string, deps?: Partial<StagingDeps>): Promise<void>;
|
|
20
21
|
export declare function prepareStagingEnvironment(stagingPath: string, livePath: string, rebuild: boolean, deps?: Partial<StagingDeps>): Promise<void>;
|
|
21
22
|
export declare function atomicPublish(stagingPath: string, livePath: string, deps?: Partial<StagingDeps>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/staging.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,UAAU,WAAW;IACnB,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,aAAa,CAAC;CACrC;AA+BD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,SAAc,EACjB,GAAG,SAAa,GACf,MAAM,CAOR;AAGD,wBAAsB,kCAAkC,CACtD,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED,wBAAsB,yBAAyB,CAE7C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AA0CD,wBAAgB,aAAa,CAE3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAeN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CA6DN;AAED,wBAAgB,cAAc,CAE5B,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAKN"}
|
|
1
|
+
{"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/staging.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,UAAU,WAAW;IACnB,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,aAAa,CAAC;CACrC;AA+BD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,SAAc,EACjB,GAAG,SAAa,GACf,MAAM,CAOR;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,SAAS,CAEpB;AAGD,wBAAsB,kCAAkC,CACtD,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED,wBAAsB,yBAAyB,CAE7C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AA0CD,wBAAgB,aAAa,CAE3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAeN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CA6DN;AAED,wBAAgB,cAAc,CAE5B,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC1B,IAAI,CAKN"}
|
|
@@ -50,16 +50,19 @@ function resolveDeps(overrides) {
|
|
|
50
50
|
export function createUniqueStagingPath(currentBranch, rootDir, pid = process.pid, now = Date.now()) {
|
|
51
51
|
return path.join(rootDir, ".kb", "branches", `${currentBranch}.staging.${pid}.${now}`);
|
|
52
52
|
}
|
|
53
|
+
export function abandonedStagingBranch(branch) {
|
|
54
|
+
return branch ? branch : undefined;
|
|
55
|
+
}
|
|
53
56
|
// implements REQ-003
|
|
54
57
|
export async function cleanupAbandonedStagingDirectories(stagingPath, deps) {
|
|
55
58
|
const resolved = resolveDeps(deps);
|
|
56
59
|
const stagingDir = path.dirname(stagingPath);
|
|
57
60
|
const stagingBase = path.basename(stagingPath);
|
|
58
|
-
const match = /^(?<branch
|
|
61
|
+
const match = /^(?<branch>.*)\.staging\.(?<pid>\d+)\.(?<timestamp>\d+)$/.exec(stagingBase);
|
|
59
62
|
if (!match?.groups) {
|
|
60
63
|
return;
|
|
61
64
|
}
|
|
62
|
-
const branch = match.groups.branch;
|
|
65
|
+
const branch = abandonedStagingBranch(match.groups.branch);
|
|
63
66
|
if (!branch) {
|
|
64
67
|
return;
|
|
65
68
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface UntrackedTargetsDeps {
|
|
2
|
+
execFileSync: (file: string, args: readonly string[], options: {
|
|
3
|
+
encoding: "utf8";
|
|
4
|
+
maxBuffer: number;
|
|
5
|
+
stdio: "pipe";
|
|
6
|
+
}) => string;
|
|
7
|
+
existsSync: (path: string) => boolean;
|
|
8
|
+
readFileSync: (path: string, encoding: "utf8") => string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Match missing relationship-target ids against untracked `.kb` documents.
|
|
12
|
+
*
|
|
13
|
+
* Sync discovery intentionally enumerates only git-tracked (or
|
|
14
|
+
* pending-receipt) documents, so a freshly authored but unstaged `.kb` doc is
|
|
15
|
+
* invisible to sync while relationships that reference it fail with a
|
|
16
|
+
* misleading "Target entity does not exist". This helper powers the sync
|
|
17
|
+
* warning that tells the author to stage the document instead.
|
|
18
|
+
*
|
|
19
|
+
* Best effort by design: any git or filesystem failure yields no matches so
|
|
20
|
+
* the diagnostic can never break a sync run.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findUntrackedDocumentMatches(workspaceRoot: string, missingIds: readonly string[], deps?: Partial<UntrackedTargetsDeps>): Map<string, string>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=untracked-targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"untracked-targets.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/untracked-targets.ts"],"names":[],"mappings":"AAsBA,UAAU,oBAAoB;IAC5B,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAC5D,MAAM,CAAC;IACZ,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1D;AAQD;;;;;;;;;;;GAWG;AAEH,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,IAAI,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACvC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiDrB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Kibi — repo-local, per-branch, queryable long-term memory for software projects
|
|
3
|
+
Copyright (C) 2026 Piotr Franczyk
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
|
6
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
(at your option) any later version.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it will be useful,
|
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
GNU Affero General Public License for more details.
|
|
14
|
+
|
|
15
|
+
You should have received a copy of the GNU Affero General Public License
|
|
16
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
20
|
+
import * as path from "node:path";
|
|
21
|
+
const defaultDeps = {
|
|
22
|
+
execFileSync: (file, args, options) => execFileSync(file, args, options),
|
|
23
|
+
existsSync,
|
|
24
|
+
readFileSync,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Match missing relationship-target ids against untracked `.kb` documents.
|
|
28
|
+
*
|
|
29
|
+
* Sync discovery intentionally enumerates only git-tracked (or
|
|
30
|
+
* pending-receipt) documents, so a freshly authored but unstaged `.kb` doc is
|
|
31
|
+
* invisible to sync while relationships that reference it fail with a
|
|
32
|
+
* misleading "Target entity does not exist". This helper powers the sync
|
|
33
|
+
* warning that tells the author to stage the document instead.
|
|
34
|
+
*
|
|
35
|
+
* Best effort by design: any git or filesystem failure yields no matches so
|
|
36
|
+
* the diagnostic can never break a sync run.
|
|
37
|
+
*/
|
|
38
|
+
// implements REQ-core-persistence
|
|
39
|
+
export function findUntrackedDocumentMatches(workspaceRoot, missingIds, deps = {}) {
|
|
40
|
+
const resolved = { ...defaultDeps, ...deps };
|
|
41
|
+
const matches = new Map();
|
|
42
|
+
if (missingIds.length === 0)
|
|
43
|
+
return matches;
|
|
44
|
+
let untracked;
|
|
45
|
+
try {
|
|
46
|
+
const output = resolved.execFileSync("git", [
|
|
47
|
+
"-C",
|
|
48
|
+
workspaceRoot,
|
|
49
|
+
"ls-files",
|
|
50
|
+
"--others",
|
|
51
|
+
"--exclude-standard",
|
|
52
|
+
"-z",
|
|
53
|
+
"--",
|
|
54
|
+
".kb",
|
|
55
|
+
], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024, stdio: "pipe" });
|
|
56
|
+
untracked = output.split("\0").filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return matches;
|
|
60
|
+
}
|
|
61
|
+
const remaining = new Set(missingIds);
|
|
62
|
+
for (const relative of untracked) {
|
|
63
|
+
if (remaining.size === 0)
|
|
64
|
+
break;
|
|
65
|
+
if (!relative.endsWith(".md"))
|
|
66
|
+
continue;
|
|
67
|
+
const absolute = path.resolve(workspaceRoot, relative.replaceAll("\\", "/"));
|
|
68
|
+
if (!resolved.existsSync(absolute))
|
|
69
|
+
continue;
|
|
70
|
+
let content;
|
|
71
|
+
try {
|
|
72
|
+
content = resolved.readFileSync(absolute, "utf8");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const id = frontmatterId(content);
|
|
78
|
+
if (id !== null && remaining.has(id)) {
|
|
79
|
+
const workspaceRelative = path
|
|
80
|
+
.relative(workspaceRoot, absolute)
|
|
81
|
+
.replaceAll("\\", "/");
|
|
82
|
+
matches.set(id, workspaceRelative);
|
|
83
|
+
remaining.delete(id);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return matches;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extract `id:` from a markdown document's YAML frontmatter (the first
|
|
90
|
+
* `---` block). Documents whose id never appears in the frontmatter region
|
|
91
|
+
* are not entity candidates.
|
|
92
|
+
*/
|
|
93
|
+
function frontmatterId(content) {
|
|
94
|
+
const lines = content.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
95
|
+
if (lines[0]?.trim() !== "---")
|
|
96
|
+
return null;
|
|
97
|
+
for (let index = 1; index < lines.length && index < 64; index++) {
|
|
98
|
+
const line = lines[index] ?? "";
|
|
99
|
+
if (line.trim() === "---")
|
|
100
|
+
return null;
|
|
101
|
+
const match = line.match(/^id:\s*(?:"([^"]+)"|'([^']+)'|(\S+))/);
|
|
102
|
+
if (match) {
|
|
103
|
+
const id = (match[1] ?? match[2] ?? match[3])?.trim();
|
|
104
|
+
return id && id.length > 0 ? id : null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
package/dist/commands/sync.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type { SyncSummary } from "../diagnostics.js";
|
|
1
|
+
import type { Diagnostic, SyncSummary } from "../diagnostics.js";
|
|
2
2
|
import { acquireSymbolCompilerLock } from "../operations/mutation/symbol-compiler-lock.js";
|
|
3
3
|
import { PrologProcess } from "../prolog.js";
|
|
4
|
+
import type { PendingSourceReceiptSnapshot } from "./sync/discovery.js";
|
|
4
5
|
export declare class SyncError extends Error {
|
|
5
6
|
constructor(message: string);
|
|
6
7
|
}
|
|
8
|
+
export declare function trackedRelationshipFiles(workspaceRoot: string, relationshipsDir: string, recoverMissingPendingSources?: boolean, recoveredPendingReceiptPaths?: PendingSourceReceiptSnapshot[]): string[];
|
|
7
9
|
export interface SyncResult extends SyncSummary {
|
|
8
10
|
exitCode?: number;
|
|
9
11
|
}
|
|
@@ -24,6 +26,14 @@ interface SyncCommandRuntime {
|
|
|
24
26
|
}) => PrologProcess;
|
|
25
27
|
acquireSymbolCompilerLock?: typeof acquireSymbolCompilerLock;
|
|
26
28
|
}
|
|
29
|
+
export declare function warnFailedSourceHash(file: string, error: unknown): void;
|
|
30
|
+
export declare function rememberChangedSourceOrWarn(file: string, apply: () => void): void;
|
|
31
|
+
export declare function maybePushKbMissingDiagnostic(diagnostics: Diagnostic[], kbExists: boolean, rebuild: boolean, currentBranch: string, livePath: string): void;
|
|
32
|
+
export declare function assertRelationshipsCleared(result: {
|
|
33
|
+
success: boolean;
|
|
34
|
+
error?: string;
|
|
35
|
+
}): void;
|
|
36
|
+
export declare function maybePushDocsNotIndexedDiagnostic(diagnostics: Diagnostic[], performedFullReindex: boolean, markdownFileCount: number, entityCount: number): void;
|
|
27
37
|
export declare function syncCommand(options?: {
|
|
28
38
|
validateOnly?: boolean;
|
|
29
39
|
rebuild?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BjE,OAAO,EAEL,yBAAyB,EAE1B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAyB7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAsBxE,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAmCD,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,4BAA4B,UAAQ,EACpC,4BAA4B,GAAE,4BAA4B,EAAO,GAChE,MAAM,EAAE,CAqGV;AAqDD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,yBAAyB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAC;IAC/D,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9D;AA6DD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGvE;AAGD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,IAAI,GAChB,IAAI,CAMN;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAMP;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,UAAU,EAAE,EACzB,oBAAoB,EAAE,OAAO,EAC7B,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAGD,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,EACN,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAwnCrB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/commands/sync.js
CHANGED
|
@@ -20,7 +20,7 @@ import { createHash } from "node:crypto";
|
|
|
20
20
|
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
|
|
21
21
|
import * as path from "node:path";
|
|
22
22
|
import { branchErrorToDiagnostic, createDocsNotIndexedDiagnostic, createInvalidAuthoringDiagnostic, createKbMissingDiagnostic, formatSyncSummary, } from "../diagnostics.js";
|
|
23
|
-
import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
|
|
23
|
+
import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, formatEngineAttachmentMismatch, fsyncJournaledBranchStore, parseEngineAttachmentIdentity, readEngineAttachmentIdentity, } from "../engine.js";
|
|
24
24
|
import { isCliDebugEnabled } from "../env.js";
|
|
25
25
|
import { extractRelationshipShard, validateRelationships, } from "../extractors/relationships.js";
|
|
26
26
|
import { acquireSymbolCompilerLock, releaseSymbolCompilerLock, } from "../operations/mutation/symbol-compiler-lock.js";
|
|
@@ -71,7 +71,7 @@ function assertNoUnresolvedGitConflicts(workspaceRoot) {
|
|
|
71
71
|
throw new SyncError(`Unresolved Git conflicts block Kibi compilation; resolve these authored files first: ${conflicted.split("\n").join(", ")}`);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
|
|
74
|
+
export function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
|
|
75
75
|
let tracked;
|
|
76
76
|
try {
|
|
77
77
|
tracked = new Set(execSync("git ls-files --cached -- .kb/relationships", {
|
|
@@ -226,12 +226,41 @@ function compilerCacheFilesMatch(cache, workspaceRoot, sourceFiles, relationship
|
|
|
226
226
|
}
|
|
227
227
|
for (const file of relationshipFiles) {
|
|
228
228
|
if (cache.relationshipHashes?.[toCacheKey(workspaceRoot, file)] !==
|
|
229
|
-
hashFile(workspaceRoot, file))
|
|
229
|
+
hashFile(workspaceRoot, file))
|
|
230
230
|
return false;
|
|
231
|
-
}
|
|
232
231
|
}
|
|
233
232
|
return true;
|
|
234
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
|
+
}
|
|
235
264
|
// implements REQ-003, REQ-007
|
|
236
265
|
export async function syncCommand(options = {}, runtime = {}) {
|
|
237
266
|
const validateOnly = options.validateOnly ?? false;
|
|
@@ -470,11 +499,11 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
470
499
|
const relationshipChanged = addedShardRelationships.length > 0 ||
|
|
471
500
|
removedShardRelationships.length > 0;
|
|
472
501
|
for (const file of sourceFiles) {
|
|
473
|
-
|
|
502
|
+
rememberChangedSourceOrWarn(file, () => {
|
|
474
503
|
const key = toCacheKey(workspaceRoot, file);
|
|
475
504
|
const hash = changedSourceHashes.get(key) ?? syncCache.hashes[key];
|
|
476
505
|
if (hash === undefined)
|
|
477
|
-
|
|
506
|
+
return;
|
|
478
507
|
const lastSeen = syncCache.seenAt[key];
|
|
479
508
|
const lastSeenMs = lastSeen ? Date.parse(lastSeen) : Number.NaN;
|
|
480
509
|
const expired = !lastSeen ||
|
|
@@ -493,11 +522,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
493
522
|
changedManifestFiles.push(file);
|
|
494
523
|
}
|
|
495
524
|
}
|
|
496
|
-
}
|
|
497
|
-
catch (error) {
|
|
498
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
499
|
-
console.warn(`Warning: Failed to hash ${file}: ${message}`);
|
|
500
|
-
}
|
|
525
|
+
});
|
|
501
526
|
}
|
|
502
527
|
// A v1 cache has only whole-file hashes. Perform one compiler-metadata
|
|
503
528
|
// backfill so subsequent edits can be reduced to normalized entity deltas.
|
|
@@ -716,9 +741,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
716
741
|
}
|
|
717
742
|
const livePath = branchStorePath(workspaceRoot, currentBranch);
|
|
718
743
|
const kbExists = existsSync(livePath);
|
|
719
|
-
|
|
720
|
-
diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
|
|
721
|
-
}
|
|
744
|
+
maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath);
|
|
722
745
|
// implements REQ-core-journaled-engine-delta-sync
|
|
723
746
|
// Normal syncs are compiled directly into the long-lived single-writer
|
|
724
747
|
// engine. Rebuilds retain generation replacement semantics, and injected
|
|
@@ -734,6 +757,23 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
734
757
|
const engineProlog = engine;
|
|
735
758
|
try {
|
|
736
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
|
+
};
|
|
737
777
|
const successfulChangedSources = [
|
|
738
778
|
...changedMarkdownFiles,
|
|
739
779
|
...changedManifestFiles,
|
|
@@ -754,9 +794,19 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
754
794
|
await retractRelationships(engineProlog, exactRemovedEdges);
|
|
755
795
|
}
|
|
756
796
|
else if (relationshipChanged) {
|
|
757
|
-
const
|
|
758
|
-
|
|
759
|
-
|
|
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();
|
|
760
810
|
}
|
|
761
811
|
}
|
|
762
812
|
const entityIds = new Set();
|
|
@@ -785,9 +835,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
785
835
|
shardDeltaByKey.set(relationshipKey(relationship), relationship);
|
|
786
836
|
}
|
|
787
837
|
}
|
|
788
|
-
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [
|
|
789
|
-
...shardDeltaByKey.values(),
|
|
790
|
-
]);
|
|
838
|
+
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [...shardDeltaByKey.values()], { workspaceRoot });
|
|
791
839
|
const kbModified = removedCount > 0 ||
|
|
792
840
|
relationshipChanged ||
|
|
793
841
|
entitiesModified ||
|
|
@@ -796,7 +844,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
796
844
|
engine.invalidateCache();
|
|
797
845
|
const saveResult = await engine.save();
|
|
798
846
|
if (!saveResult.success) {
|
|
799
|
-
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"}`));
|
|
800
848
|
}
|
|
801
849
|
const evictedHashes = {};
|
|
802
850
|
const evictedSeenAt = {};
|
|
@@ -887,9 +935,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
887
935
|
].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file))));
|
|
888
936
|
if (relationshipChanged) {
|
|
889
937
|
const clearRelationships = await prolog.query("kb_retract_all_relationships");
|
|
890
|
-
|
|
891
|
-
throw new SyncError(`Failed to clear changed relationship shards: ${clearRelationships.error || "Unknown error"}`);
|
|
892
|
-
}
|
|
938
|
+
assertRelationshipsCleared(clearRelationships);
|
|
893
939
|
}
|
|
894
940
|
const { entityCount, kbModified: entitiesModified } = await persistEntities(prolog, results, entityIds);
|
|
895
941
|
const validationErrors = validateRelationships(allRelationships, entityIds);
|
|
@@ -902,7 +948,9 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
902
948
|
const danglingKeys = new Set(validationErrors.map(({ relationship: r }) => `${r.type}|${r.from}|${r.to}`));
|
|
903
949
|
const validRelationships = allRelationships.filter((r) => !danglingKeys.has(`${r.type}|${r.from}|${r.to}`));
|
|
904
950
|
// Persist relationships
|
|
905
|
-
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships
|
|
951
|
+
const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships, {
|
|
952
|
+
workspaceRoot,
|
|
953
|
+
});
|
|
906
954
|
const kbModified = entitiesModified || relationshipsModified;
|
|
907
955
|
if (validateOnly) {
|
|
908
956
|
await prolog.query("kb_detach");
|
|
@@ -1016,11 +1064,7 @@ export async function syncCommand(options = {}, runtime = {}) {
|
|
|
1016
1064
|
semanticContracts: evictedSemanticContracts,
|
|
1017
1065
|
});
|
|
1018
1066
|
published = true;
|
|
1019
|
-
|
|
1020
|
-
markdownFiles.length > 0 &&
|
|
1021
|
-
entityCount < markdownFiles.length) {
|
|
1022
|
-
diagnostics.push(createDocsNotIndexedDiagnostic(markdownFiles.length, entityCount));
|
|
1023
|
-
}
|
|
1067
|
+
maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFiles.length, entityCount);
|
|
1024
1068
|
console.log(`✓ Imported ${entityCount} entities, ${relationshipCount} relationships`);
|
|
1025
1069
|
const commit = getCurrentCommit();
|
|
1026
1070
|
const summary = withOptionalCommit({
|