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
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { executeIngestProof } from "../operations/proof/ingest-proof.js";
|
|
5
|
+
import { PROOF_RUNS_DIR, loadProofIntegrations, resolveIntegration, } from "../proof/integrations.js";
|
|
6
|
+
import { convertJUnitXml } from "../proof/producers/junit-adapter.js";
|
|
7
|
+
import { convertTap } from "../proof/producers/tap-adapter.js";
|
|
8
|
+
import { loadEntities } from "../public/operations/discovery-entities.js";
|
|
9
|
+
import { ingestProofSpec } from "../public/operations/specs/proof.js";
|
|
10
|
+
import { readWorkspaceSnapshot } from "../public/operations/workspace-snapshot.js";
|
|
11
|
+
import { PROOF_RUN_VERSION, proofBindingsErrors, proofRunArtifactErrors, } from "../public/proof-protocol.js";
|
|
12
|
+
import { createCliRuntime } from "../runtime/cli-runtime.js";
|
|
13
|
+
/**
|
|
14
|
+
* Describe which paths moved when a proof snapshot refusal fires, so
|
|
15
|
+
* consumers can see what kibi thinks changed instead of diffing by hand.
|
|
16
|
+
* Snapshot-relevant changes come first (receipt-only and ignored edits do
|
|
17
|
+
* not affect the hash), and the list is capped to keep the error readable.
|
|
18
|
+
*/
|
|
19
|
+
// implements REQ-kibi-proof-evidence-protocol
|
|
20
|
+
export function describeWorkspaceDrift(snapshot) {
|
|
21
|
+
if (!snapshot.available)
|
|
22
|
+
return " (workspace snapshot unavailable)";
|
|
23
|
+
const changes = snapshot.snapshot.changes ?? [];
|
|
24
|
+
const relevant = changes.filter((change) => change.snapshotRelevant);
|
|
25
|
+
const pool = relevant.length > 0
|
|
26
|
+
? relevant
|
|
27
|
+
: changes.filter((change) => !change.snapshotRelevant);
|
|
28
|
+
if (pool.length === 0) {
|
|
29
|
+
return " (git reported no workspace changes; the hash drift may come from file content that git treats as unchanged)";
|
|
30
|
+
}
|
|
31
|
+
const maxPaths = 10;
|
|
32
|
+
const listed = pool
|
|
33
|
+
.slice(0, maxPaths)
|
|
34
|
+
.map((change) => `${change.status.trim() || "M"} ${change.path}`);
|
|
35
|
+
const more = pool.length - listed.length;
|
|
36
|
+
return `; changed: ${listed.join(", ")}${more > 0 ? ` (+${more} more)` : ""}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse a comma-separated integration selector ("a", "a,b,c") into a set of
|
|
40
|
+
* trimmed, non-empty ids. Empty selectors yield an empty set; blank items
|
|
41
|
+
* fail fast instead of silently narrowing the selection.
|
|
42
|
+
*/
|
|
43
|
+
// implements REQ-kibi-proof-evidence-protocol
|
|
44
|
+
export function parseIntegrationSelector(value, flagName) {
|
|
45
|
+
if (value === undefined || value.trim() === "")
|
|
46
|
+
return new Set();
|
|
47
|
+
const ids = new Set();
|
|
48
|
+
for (const raw of value.split(",")) {
|
|
49
|
+
const id = raw.trim();
|
|
50
|
+
if (id === "")
|
|
51
|
+
throw new Error(`prove: ${flagName} contains an empty integration id`);
|
|
52
|
+
ids.add(id);
|
|
53
|
+
}
|
|
54
|
+
return ids;
|
|
55
|
+
}
|
|
56
|
+
function withId(entity) {
|
|
57
|
+
if (typeof entity.id !== "string" || entity.id === "")
|
|
58
|
+
throw new Error("prove: loaded test entity is missing an id");
|
|
59
|
+
return entity;
|
|
60
|
+
}
|
|
61
|
+
export function testId(test) {
|
|
62
|
+
return String(test.id);
|
|
63
|
+
}
|
|
64
|
+
function parseContract(test) {
|
|
65
|
+
const contract = test.proof_contract;
|
|
66
|
+
if (contract === null ||
|
|
67
|
+
typeof contract !== "object" ||
|
|
68
|
+
Array.isArray(contract))
|
|
69
|
+
return null;
|
|
70
|
+
return contract;
|
|
71
|
+
}
|
|
72
|
+
async function runChild(commandArgv, cwd, env) {
|
|
73
|
+
const [command, ...args] = commandArgv;
|
|
74
|
+
if (!command)
|
|
75
|
+
throw new Error("prove: integration command argv must be non-empty");
|
|
76
|
+
return await new Promise((resolve, reject) => {
|
|
77
|
+
const child = spawn(command, args, {
|
|
78
|
+
cwd,
|
|
79
|
+
env,
|
|
80
|
+
shell: false,
|
|
81
|
+
stdio: "inherit",
|
|
82
|
+
});
|
|
83
|
+
child.once("error", reject);
|
|
84
|
+
child.once("close", (code) => resolve(code ?? 1));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// implements REQ-kibi-proof-evidence-protocol
|
|
88
|
+
export function commandEnvironment(integration, commandArgv, snapshot, workspaceRoot, testIds, outputPath) {
|
|
89
|
+
return {
|
|
90
|
+
...process.env,
|
|
91
|
+
KIBI_PROOF_RUN: "1",
|
|
92
|
+
KIBI_PROOF_OUTPUT: outputPath,
|
|
93
|
+
KIBI_PROOF_SNAPSHOT: snapshot,
|
|
94
|
+
KIBI_PROOF_COMMAND_ARGV: JSON.stringify(commandArgv),
|
|
95
|
+
KIBI_PROOF_INTEGRATION: integration.id,
|
|
96
|
+
KIBI_PROOF_WORKSPACE: workspaceRoot,
|
|
97
|
+
KIBI_PROOF_TEST_IDS: JSON.stringify(testIds),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function collectBindings(tests) {
|
|
101
|
+
const bindings = [];
|
|
102
|
+
for (const test of tests) {
|
|
103
|
+
const raw = test.proof_bindings;
|
|
104
|
+
if (raw === undefined || raw === null)
|
|
105
|
+
continue;
|
|
106
|
+
if (!Array.isArray(raw))
|
|
107
|
+
continue;
|
|
108
|
+
const errors = proofBindingsErrors(raw);
|
|
109
|
+
if (errors.length > 0)
|
|
110
|
+
throw new Error(`prove: test ${test.id} has invalid proof_bindings: ${errors.join("; ")}`);
|
|
111
|
+
for (const entry of raw) {
|
|
112
|
+
const row = entry;
|
|
113
|
+
bindings.push({
|
|
114
|
+
symbol_id: String(row.symbol_id),
|
|
115
|
+
target: String(row.target),
|
|
116
|
+
...(row.native_id !== undefined
|
|
117
|
+
? { native_id: String(row.native_id) }
|
|
118
|
+
: {}),
|
|
119
|
+
...(row.aliases !== undefined
|
|
120
|
+
? { aliases: row.aliases.map(String) }
|
|
121
|
+
: {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return bindings;
|
|
126
|
+
}
|
|
127
|
+
function dedupeObligations(tests) {
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
const results = [];
|
|
130
|
+
for (const test of tests) {
|
|
131
|
+
const contract = parseContract(test);
|
|
132
|
+
if (!contract)
|
|
133
|
+
continue;
|
|
134
|
+
for (const obligation of contract.required_proofs) {
|
|
135
|
+
const key = `${obligation.target}\0${obligation.symbol_id}`;
|
|
136
|
+
if (seen.has(key))
|
|
137
|
+
continue;
|
|
138
|
+
seen.add(key);
|
|
139
|
+
results.push({
|
|
140
|
+
symbol_id: obligation.symbol_id,
|
|
141
|
+
target: obligation.target,
|
|
142
|
+
outcome: "passed",
|
|
143
|
+
binding: "aggregate_run",
|
|
144
|
+
attempts: { status: "unavailable" },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
function markAggregateFailure(results) {
|
|
151
|
+
return results.map((result) => ({ ...result, outcome: "failed" }));
|
|
152
|
+
}
|
|
153
|
+
async function selectTests(context, options) {
|
|
154
|
+
// Paginated: loading every test entity with full props in one query can
|
|
155
|
+
// exceed the Prolog output buffer once receipt histories grow.
|
|
156
|
+
const loadAll = async () => {
|
|
157
|
+
const pageSize = 25;
|
|
158
|
+
const all = [];
|
|
159
|
+
for (let offset = 0;; offset += pageSize) {
|
|
160
|
+
const page = await loadEntities(context.prolog, {
|
|
161
|
+
type: "test",
|
|
162
|
+
limit: pageSize,
|
|
163
|
+
offset,
|
|
164
|
+
});
|
|
165
|
+
all.push(...page);
|
|
166
|
+
if (page.length < pageSize)
|
|
167
|
+
return all;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
let candidates = [];
|
|
171
|
+
if (options.testId) {
|
|
172
|
+
const found = await loadEntities(context.prolog, {
|
|
173
|
+
id: options.testId,
|
|
174
|
+
type: "test",
|
|
175
|
+
});
|
|
176
|
+
candidates = found.map(withId);
|
|
177
|
+
}
|
|
178
|
+
else if (options.requirement) {
|
|
179
|
+
const requirementId = options.requirement;
|
|
180
|
+
const scenarioResult = await context.prolog?.query(`findall([S,T], (kb_relationship(specified_by, '${requirementId}', S), (kb_relationship(verified_by, S, T) ; kb_relationship(validates, T, S)), kb_entity(T, test, _)), Rows)`);
|
|
181
|
+
const rowsRaw = scenarioResult?.success
|
|
182
|
+
? scenarioResult.bindings.Rows
|
|
183
|
+
: undefined;
|
|
184
|
+
const ids = new Set();
|
|
185
|
+
if (typeof rowsRaw === "string") {
|
|
186
|
+
for (const match of rowsRaw.matchAll(/\[['"]?([^,\]]+)['"]?,['"]?([^,\]]+)['"]?\]/g)) {
|
|
187
|
+
const test = match[2];
|
|
188
|
+
if (test)
|
|
189
|
+
ids.add(test.trim());
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const directResult = await context.prolog?.query(`findall(T, (kb_relationship(validates, T, '${requirementId}'), kb_entity(T, test, _)), Rows)`);
|
|
193
|
+
const directRaw = directResult?.success
|
|
194
|
+
? directResult.bindings.Rows
|
|
195
|
+
: undefined;
|
|
196
|
+
if (typeof directRaw === "string") {
|
|
197
|
+
for (const match of directRaw.matchAll(/\[?['"]?([A-Za-z0-9_-]+)['"]?\]?/g)) {
|
|
198
|
+
const candidate = match[1];
|
|
199
|
+
if (candidate?.startsWith("TEST-"))
|
|
200
|
+
ids.add(candidate);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const all = await loadAll();
|
|
204
|
+
candidates = all.filter((entity) => ids.has(String(entity.id))).map(withId);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
candidates = (await loadAll()).map(withId);
|
|
208
|
+
}
|
|
209
|
+
const selected = candidates.filter((entity) => parseContract(entity) !== null);
|
|
210
|
+
const includeIds = parseIntegrationSelector(options.integration, "--integration");
|
|
211
|
+
const excludeIds = parseIntegrationSelector(options.integrationExcept, "--integration-except");
|
|
212
|
+
if (includeIds.size === 0 && excludeIds.size === 0)
|
|
213
|
+
return selected;
|
|
214
|
+
const filtered = selected.filter((entity) => {
|
|
215
|
+
const contract = parseContract(entity);
|
|
216
|
+
if (!contract)
|
|
217
|
+
return false;
|
|
218
|
+
if (includeIds.size > 0 && !includeIds.has(contract.integration))
|
|
219
|
+
return false;
|
|
220
|
+
if (excludeIds.size > 0 && excludeIds.has(contract.integration))
|
|
221
|
+
return false;
|
|
222
|
+
return true;
|
|
223
|
+
});
|
|
224
|
+
if (filtered.length === 0 && includeIds.size + excludeIds.size > 0) {
|
|
225
|
+
const requested = [
|
|
226
|
+
...(includeIds.size > 0
|
|
227
|
+
? [`integrations: ${[...includeIds].sort().join(", ")}`]
|
|
228
|
+
: []),
|
|
229
|
+
...(excludeIds.size > 0
|
|
230
|
+
? [`excluding: ${[...excludeIds].sort().join(", ")}`]
|
|
231
|
+
: []),
|
|
232
|
+
].join("; ");
|
|
233
|
+
throw new Error(`prove: no proof-bearing tests match the integration selector (${requested})`);
|
|
234
|
+
}
|
|
235
|
+
return filtered;
|
|
236
|
+
}
|
|
237
|
+
function summarize(result) {
|
|
238
|
+
const parts = [`passed ${result.passed}`, `failed ${result.failed}`];
|
|
239
|
+
if (result.unchanged > 0)
|
|
240
|
+
parts.push(`unchanged ${result.unchanged}`);
|
|
241
|
+
return parts.join(", ");
|
|
242
|
+
}
|
|
243
|
+
// implements REQ-kibi-proof-evidence-protocol
|
|
244
|
+
export async function proveCommand(options, deps = {}) {
|
|
245
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
246
|
+
const ingestProof = deps.ingestProof ?? executeIngestProof;
|
|
247
|
+
const runtime = deps.runtime ??
|
|
248
|
+
createCliRuntime(options.workspaceRoot === undefined ? {} : { workspaceRoot });
|
|
249
|
+
const context = await runtime.open(ingestProofSpec, {
|
|
250
|
+
...(options.workspaceRoot === undefined ? {} : { workspaceRoot }),
|
|
251
|
+
});
|
|
252
|
+
let completed = false;
|
|
253
|
+
try {
|
|
254
|
+
const integrations = loadProofIntegrations(context.workspaceRoot);
|
|
255
|
+
if (!integrations.available)
|
|
256
|
+
throw new Error(`prove: ${integrations.error}`);
|
|
257
|
+
const selected = await selectTests(context, options);
|
|
258
|
+
if (selected.length === 0) {
|
|
259
|
+
process.stdout.write(`${JSON.stringify({ proved: 0, failed: 0, message: "no proof-bearing tests selected" })}\n`);
|
|
260
|
+
completed = true;
|
|
261
|
+
return { exitCode: 0 };
|
|
262
|
+
}
|
|
263
|
+
const before = await readWorkspaceSnapshot(context);
|
|
264
|
+
if (!before.available)
|
|
265
|
+
throw new Error(`prove: ${before.error}`);
|
|
266
|
+
const snapshot = before.snapshot.hash;
|
|
267
|
+
// Packed contracts run in separate processes; one shared packed-tarball
|
|
268
|
+
// cache area per campaign snapshot replaces dozens of repeated packs and
|
|
269
|
+
// installs with a single population. The snapshot hash is the provenance
|
|
270
|
+
// key: different workspace state never sees another campaign's artifacts.
|
|
271
|
+
process.env.KIBI_E2E_PACK_CACHE_KEY ??= snapshot;
|
|
272
|
+
const groups = new Map();
|
|
273
|
+
for (const test of selected) {
|
|
274
|
+
const contract = parseContract(test);
|
|
275
|
+
if (!contract)
|
|
276
|
+
continue;
|
|
277
|
+
const list = groups.get(contract.integration) ?? [];
|
|
278
|
+
list.push(test);
|
|
279
|
+
groups.set(contract.integration, list);
|
|
280
|
+
}
|
|
281
|
+
const runsDir = path.join(context.workspaceRoot, PROOF_RUNS_DIR);
|
|
282
|
+
await mkdir(runsDir, { recursive: true });
|
|
283
|
+
const ingestResults = [];
|
|
284
|
+
const failures = [];
|
|
285
|
+
for (const [integrationId, tests] of groups) {
|
|
286
|
+
const integration = resolveIntegration(integrations.integrations, integrationId);
|
|
287
|
+
if (!integration) {
|
|
288
|
+
failures.push(`integration '${integrationId}' (required by ${tests.map((t) => t.id).join(", ")}) is not configured in .kb/proof/integrations.json`);
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const commandArgv = [...integration.command];
|
|
292
|
+
const artifactPath = path.resolve(context.workspaceRoot, integration.artifact ??
|
|
293
|
+
path.join(PROOF_RUNS_DIR, `${integrationId}.json`));
|
|
294
|
+
await mkdir(path.dirname(artifactPath), { recursive: true });
|
|
295
|
+
await rm(artifactPath, { force: true });
|
|
296
|
+
const env = commandEnvironment(integration, commandArgv, snapshot, context.workspaceRoot, tests.map((test) => String(test.id)), artifactPath);
|
|
297
|
+
const startedAt = new Date().toISOString();
|
|
298
|
+
let exitCode;
|
|
299
|
+
try {
|
|
300
|
+
exitCode = await runChild(commandArgv, context.workspaceRoot, env);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
failures.push(`integration '${integrationId}' failed to start: ${error instanceof Error ? error.message : String(error)}`);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const finishedAt = new Date().toISOString();
|
|
307
|
+
let artifact;
|
|
308
|
+
try {
|
|
309
|
+
artifact = await buildArtifact({
|
|
310
|
+
integration,
|
|
311
|
+
commandArgv,
|
|
312
|
+
exitCode,
|
|
313
|
+
startedAt,
|
|
314
|
+
finishedAt,
|
|
315
|
+
artifactPath,
|
|
316
|
+
snapshot,
|
|
317
|
+
tests,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
failures.push(`integration '${integrationId}': ${error instanceof Error ? error.message : String(error)}`);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
const artifactErrors = proofRunArtifactErrors(artifact);
|
|
325
|
+
if (artifactErrors.length > 0) {
|
|
326
|
+
failures.push(`integration '${integrationId}' produced an invalid kibi.proof-run.v1 artifact: ${artifactErrors.join("; ")}`);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
await mkdir(path.dirname(artifactPath), { recursive: true });
|
|
330
|
+
await writeFile(artifactPath, `${JSON.stringify(artifact, null, 2)}\n`, "utf8");
|
|
331
|
+
const afterRun = await readWorkspaceSnapshot(context);
|
|
332
|
+
if (!afterRun.available || afterRun.snapshot.hash !== snapshot) {
|
|
333
|
+
failures.push(`integration '${integrationId}' changed the tracked workspace during proof execution; proof is bound to snapshot ${snapshot}${describeWorkspaceDrift(afterRun)}`);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const ingested = await ingestProof({
|
|
337
|
+
snapshot,
|
|
338
|
+
artifact: artifact,
|
|
339
|
+
testIds: tests.map((test) => String(test.id)),
|
|
340
|
+
}, context);
|
|
341
|
+
ingestResults.push(ingested.structuredContent);
|
|
342
|
+
const afterIngest = await readWorkspaceSnapshot(context);
|
|
343
|
+
if (!afterIngest.available || afterIngest.snapshot.hash !== snapshot) {
|
|
344
|
+
failures.push(`the tracked workspace changed while receipts were applied; re-run kibi prove${describeWorkspaceDrift(afterIngest)}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const passed = ingestResults.reduce((sum, result) => sum + result.passed, 0);
|
|
348
|
+
const failed = ingestResults.reduce((sum, result) => sum + result.failed, 0);
|
|
349
|
+
const unchanged = ingestResults.reduce((sum, result) => sum + result.unchanged, 0);
|
|
350
|
+
const summary = {
|
|
351
|
+
proved: passed,
|
|
352
|
+
failed,
|
|
353
|
+
unchanged,
|
|
354
|
+
runs: ingestResults.map((result) => ({
|
|
355
|
+
integration: result.integration,
|
|
356
|
+
summary: summarize(result),
|
|
357
|
+
results: result.results,
|
|
358
|
+
})),
|
|
359
|
+
...(failures.length > 0 ? { failures } : {}),
|
|
360
|
+
};
|
|
361
|
+
process.stdout.write(`${JSON.stringify(summary)}\n`);
|
|
362
|
+
completed = true;
|
|
363
|
+
await runtime.afterSuccess(ingestProofSpec, context);
|
|
364
|
+
return { exitCode: failures.length > 0 || failed > 0 ? 1 : 0 };
|
|
365
|
+
}
|
|
366
|
+
finally {
|
|
367
|
+
await runtime.close(context, completed
|
|
368
|
+
? { status: "success", result: 0 }
|
|
369
|
+
: { status: "error", error: 1 });
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function buildArtifact(input) {
|
|
373
|
+
const { integration, commandArgv, exitCode, startedAt, finishedAt, artifactPath, snapshot, tests, } = input;
|
|
374
|
+
const run = (outcome) => ({
|
|
375
|
+
outcome,
|
|
376
|
+
exit_code: exitCode,
|
|
377
|
+
started_at: startedAt,
|
|
378
|
+
finished_at: finishedAt,
|
|
379
|
+
});
|
|
380
|
+
if (integration.producer === "command") {
|
|
381
|
+
const results = dedupeObligations(tests);
|
|
382
|
+
return {
|
|
383
|
+
version: PROOF_RUN_VERSION,
|
|
384
|
+
producer: {
|
|
385
|
+
name: "kibi-command-producer",
|
|
386
|
+
...(integration.producer_version !== undefined
|
|
387
|
+
? { version: integration.producer_version }
|
|
388
|
+
: {}),
|
|
389
|
+
},
|
|
390
|
+
integration: integration.id,
|
|
391
|
+
command_argv: [...commandArgv],
|
|
392
|
+
code_snapshot: snapshot,
|
|
393
|
+
environment: {
|
|
394
|
+
os: process.platform,
|
|
395
|
+
arch: process.arch,
|
|
396
|
+
runtime: { name: "node", version: process.version },
|
|
397
|
+
},
|
|
398
|
+
run: run(exitCode === 0 ? "passed" : "failed"),
|
|
399
|
+
proof_results: exitCode === 0 ? results : markAggregateFailure(results),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
if (integration.producer === "junit" || integration.producer === "tap") {
|
|
403
|
+
const nativePath = integration.artifact;
|
|
404
|
+
if (!nativePath)
|
|
405
|
+
throw new Error(`producer '${integration.producer}' requires an artifact path in .kb/proof/integrations.json`);
|
|
406
|
+
let native;
|
|
407
|
+
try {
|
|
408
|
+
native = await readFile(path.resolve(context_path(nativePath)), "utf8");
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
throw new Error(`producer '${integration.producer}' did not produce its native report at ${nativePath}`);
|
|
412
|
+
}
|
|
413
|
+
const bindings = collectBindings(tests);
|
|
414
|
+
const conversion = integration.producer === "junit"
|
|
415
|
+
? convertJUnitXml(native, bindings)
|
|
416
|
+
: convertTap(native, bindings);
|
|
417
|
+
if (conversion.fatal) {
|
|
418
|
+
throw new Error(`producer '${integration.producer}' rejected its native report${conversion.diagnostics.length > 0 ? `: ${conversion.diagnostics.join("; ")}` : ""}`);
|
|
419
|
+
}
|
|
420
|
+
if (conversion.results.length === 0)
|
|
421
|
+
throw new Error(`producer '${integration.producer}' produced no bound proof results${conversion.diagnostics.length > 0 ? `: ${conversion.diagnostics.join("; ")}` : ""}`);
|
|
422
|
+
return {
|
|
423
|
+
version: PROOF_RUN_VERSION,
|
|
424
|
+
producer: {
|
|
425
|
+
name: `kibi-${integration.producer}-adapter`,
|
|
426
|
+
...(integration.producer_version !== undefined
|
|
427
|
+
? { version: integration.producer_version }
|
|
428
|
+
: {}),
|
|
429
|
+
},
|
|
430
|
+
integration: integration.id,
|
|
431
|
+
command_argv: [...commandArgv],
|
|
432
|
+
code_snapshot: snapshot,
|
|
433
|
+
environment: {
|
|
434
|
+
os: process.platform,
|
|
435
|
+
arch: process.arch,
|
|
436
|
+
runtime: { name: "node", version: process.version },
|
|
437
|
+
},
|
|
438
|
+
run: run(conversion.results.every((result) => result.outcome === "passed")
|
|
439
|
+
? "passed"
|
|
440
|
+
: "failed"),
|
|
441
|
+
proof_results: conversion.results,
|
|
442
|
+
...(conversion.diagnostics.length > 0
|
|
443
|
+
? { diagnostics: conversion.diagnostics }
|
|
444
|
+
: {}),
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
// Self-emitting producers (playwright and custom): read the emitted
|
|
448
|
+
// kibi.proof-run.v1 artifact and enforce the process outcome.
|
|
449
|
+
let parsed;
|
|
450
|
+
try {
|
|
451
|
+
parsed = JSON.parse(await readFile(artifactPath, "utf8"));
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
throw new Error(`producer '${integration.producer}' did not emit a readable kibi.proof-run.v1 artifact at ${artifactPath}`);
|
|
455
|
+
}
|
|
456
|
+
const artifact = parsed;
|
|
457
|
+
const runRecord = parsed.run;
|
|
458
|
+
const reportedOutcome = runRecord?.outcome;
|
|
459
|
+
if (exitCode !== 0) {
|
|
460
|
+
if (reportedOutcome === "passed") {
|
|
461
|
+
throw new Error(`producer '${integration.producer}' reported run.outcome 'passed' but the process exited with code ${exitCode}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return artifact;
|
|
465
|
+
}
|
|
466
|
+
function context_path(nativePath) {
|
|
467
|
+
return path.isAbsolute(nativePath)
|
|
468
|
+
? nativePath
|
|
469
|
+
: path.join(process.cwd(), nativePath);
|
|
470
|
+
}
|
package/dist/commands/report.js
CHANGED
|
@@ -163,7 +163,7 @@ export async function reportCommand(options, deps = {}) {
|
|
|
163
163
|
const hasContradiction = coverage.requirements.rows.some((row) => Array.isArray(row.proofGaps) &&
|
|
164
164
|
row.proofGaps.includes("blocking_contradiction"));
|
|
165
165
|
const snapshotStale = coverage.requirements.meta?.dirty === true ||
|
|
166
|
-
coverage.requirements.meta?.
|
|
166
|
+
coverage.requirements.meta?.proofSnapshotDirty === true;
|
|
167
167
|
const badgeMessage = currentRequirements === 0 ? "no requirements" : `${proofPercent}% proven`;
|
|
168
168
|
const badgeColor = currentRequirements === 0
|
|
169
169
|
? KIBI_BRAND.rail
|
|
@@ -18,6 +18,9 @@ export type PendingSourceReceiptSnapshot = Readonly<{
|
|
|
18
18
|
afterHash: string;
|
|
19
19
|
rawHash: string;
|
|
20
20
|
}>;
|
|
21
|
+
export declare function isFsEnoent(error: unknown): boolean;
|
|
22
|
+
export declare function readTextOrEnoent(absolute: string): string | null;
|
|
23
|
+
export declare function unlinkOrEnoent(absolute: string): boolean;
|
|
21
24
|
export declare function clearRecoveredPendingSourceReceipts(cwd: string, receipts: readonly PendingSourceReceiptSnapshot[]): void;
|
|
22
25
|
export declare function normalizeMarkdownPath(pattern: string | undefined): string | null;
|
|
23
26
|
export declare function discoverSourceFiles(cwd: string, options?: DiscoveryOptions): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/discovery.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,+EAA+E;IAC/E,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAyFH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOlD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUxD;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,SAAS,4BAA4B,EAAE,GAChD,IAAI,CA6CN;AAsBD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,GAAG,IAAI,CAIf;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;IACT,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,4BAA4B,EAAE,4BAA4B,EAAE,CAAC;CAC9D,CAAC,CA+FD"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { execFile } from "node:child_process";
|
|
19
19
|
import { createHash } from "node:crypto";
|
|
20
|
+
import * as fs from "node:fs";
|
|
20
21
|
import { existsSync, readFileSync, readdirSync, unlinkSync } from "node:fs";
|
|
21
22
|
import * as path from "node:path";
|
|
22
23
|
import { promisify } from "node:util";
|
|
@@ -89,6 +90,33 @@ function pendingSourcePaths(cwd, recoverMissing) {
|
|
|
89
90
|
}
|
|
90
91
|
return { paths, recoveredReceipts };
|
|
91
92
|
}
|
|
93
|
+
export function isFsEnoent(error) {
|
|
94
|
+
return (error !== null &&
|
|
95
|
+
typeof error === "object" &&
|
|
96
|
+
"code" in error &&
|
|
97
|
+
error.code === "ENOENT");
|
|
98
|
+
}
|
|
99
|
+
export function readTextOrEnoent(absolute) {
|
|
100
|
+
try {
|
|
101
|
+
return fs.readFileSync(absolute, "utf8");
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (isFsEnoent(error))
|
|
105
|
+
return null;
|
|
106
|
+
throw new Error(`Failed to inspect pending source receipt for ${absolute}: ${error instanceof Error ? error.message : String(error)}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function unlinkOrEnoent(absolute) {
|
|
110
|
+
try {
|
|
111
|
+
fs.unlinkSync(absolute);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (isFsEnoent(error))
|
|
116
|
+
return false;
|
|
117
|
+
throw new Error(`Failed to retire pending source receipt for ${absolute}: ${error instanceof Error ? error.message : String(error)}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
92
120
|
export function clearRecoveredPendingSourceReceipts(cwd, receipts) {
|
|
93
121
|
const root = path.resolve(cwd, ".kb", "recovery", "pending-sources");
|
|
94
122
|
for (const receipt of receipts) {
|
|
@@ -103,19 +131,9 @@ export function clearRecoveredPendingSourceReceipts(cwd, receipts) {
|
|
|
103
131
|
// because it has the same receipt filename. Failing closed here is
|
|
104
132
|
// important: publication may have completed, but recovery must not claim
|
|
105
133
|
// that pending intent was retired when a newer intent remains.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
if (error !== null &&
|
|
112
|
-
typeof error === "object" &&
|
|
113
|
-
"code" in error &&
|
|
114
|
-
error.code === "ENOENT") {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
throw new Error(`Failed to inspect pending source receipt for ${receipt.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
118
|
-
}
|
|
134
|
+
const raw = readTextOrEnoent(absolute);
|
|
135
|
+
if (raw === null)
|
|
136
|
+
continue;
|
|
119
137
|
const rawHash = createHash("sha256").update(raw).digest("hex");
|
|
120
138
|
if (rawHash !== receipt.rawHash) {
|
|
121
139
|
throw new Error(`Pending source receipt changed during recovery for ${receipt.path}; refusing to retire newer receipt`);
|
|
@@ -131,20 +149,7 @@ export function clearRecoveredPendingSourceReceipts(cwd, receipts) {
|
|
|
131
149
|
current.afterHash !== receipt.afterHash) {
|
|
132
150
|
throw new Error(`Pending source receipt changed during recovery for ${receipt.path}; refusing to retire newer receipt`);
|
|
133
151
|
}
|
|
134
|
-
|
|
135
|
-
unlinkSync(absolute);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
if (error !== null &&
|
|
139
|
-
typeof error === "object" &&
|
|
140
|
-
"code" in error &&
|
|
141
|
-
error.code === "ENOENT") {
|
|
142
|
-
// Another recovery or source publication may have consumed it
|
|
143
|
-
// already; cleanup is idempotent for that case.
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
throw new Error(`Failed to retire pending source receipt for ${receipt.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
147
|
-
}
|
|
152
|
+
unlinkOrEnoent(absolute);
|
|
148
153
|
}
|
|
149
154
|
}
|
|
150
155
|
function filterTracked(cwd, files, tracked, pending) {
|
|
@@ -183,11 +188,14 @@ export async function discoverSourceFiles(cwd, options = {}) {
|
|
|
183
188
|
absolute: true,
|
|
184
189
|
ignore: [...MARKDOWN_DISCOVERY_IGNORE],
|
|
185
190
|
});
|
|
186
|
-
let entityMarkdownFiles = markdownFiles.filter((file) => !file.endsWith("/README.md"));
|
|
191
|
+
let entityMarkdownFiles = (Array.isArray(markdownFiles) ? markdownFiles : []).filter((file) => !file.endsWith("/README.md"));
|
|
187
192
|
let manifestFiles = await fg(CANONICAL_ENTITY_PATHS.symbols, {
|
|
188
193
|
cwd,
|
|
189
194
|
absolute: true,
|
|
190
195
|
});
|
|
196
|
+
if (!Array.isArray(manifestFiles)) {
|
|
197
|
+
manifestFiles = [];
|
|
198
|
+
}
|
|
191
199
|
const recoveredPendingReceiptPaths = [];
|
|
192
200
|
if (options.trackedOnly) {
|
|
193
201
|
const tracked = await gitTrackedPaths(cwd);
|
|
@@ -16,7 +16,7 @@ interface ManifestDeps {
|
|
|
16
16
|
writeCoordinateArtifact: typeof writeCoordinateArtifact;
|
|
17
17
|
resolveSymbolsManifestPaths: typeof resolveSymbolsManifestPaths;
|
|
18
18
|
}
|
|
19
|
-
export declare const SYMBOLS_MANIFEST_COMMENT_BLOCK
|
|
19
|
+
export declare const SYMBOLS_MANIFEST_COMMENT_BLOCK: string;
|
|
20
20
|
/**
|
|
21
21
|
* Coarse symbol anchors for which AST per-declaration coordinates are not
|
|
22
22
|
* expected.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAML,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/manifest.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAML,uBAAuB,EACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,0BAA0B,EAG3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,2BAA2B,EAAE,OAAO,2BAA2B,CAAC;CACjE;AAkBD,eAAO,MAAM,8BAA8B,QAc1C,CAAC;AAaF;;;;;;;;;GASG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAG7E;AAoHD,wBAAsB,0BAA0B,CAE9C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAqMf;AAED,wBAAgB,0BAA0B,CAExC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAOT;AAED,wBAAgB,8BAA8B,CAE5C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC3B,OAAO,CAUT"}
|