kibi-cli 1.0.1 → 2.1.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 +127 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +7 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -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-generated.d.ts +7 -0
- package/dist/commands/check-generated.d.ts.map +1 -0
- package/dist/commands/check-generated.js +192 -0
- package/dist/commands/check.d.ts +14 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +193 -46
- 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 +170 -23
- package/dist/commands/engine.d.ts +12 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +42 -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 +49 -10
- 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-explain.d.ts +10 -0
- package/dist/commands/proof-explain.d.ts.map +1 -0
- package/dist/commands/proof-explain.js +45 -0
- package/dist/commands/proof-impact.d.ts +7 -0
- package/dist/commands/proof-impact.d.ts.map +1 -0
- package/dist/commands/proof-impact.js +39 -0
- package/dist/commands/proof-migrate-legacy.d.ts +7 -0
- package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
- package/dist/commands/proof-migrate-legacy.js +45 -0
- package/dist/commands/proof-prune.d.ts +8 -0
- package/dist/commands/proof-prune.d.ts.map +1 -0
- package/dist/commands/proof-prune.js +53 -0
- package/dist/commands/prove.d.ts +37 -0
- package/dist/commands/prove.d.ts.map +1 -0
- package/dist/commands/prove.js +470 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +18 -3
- 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 +2 -1
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +55 -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 +31 -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 +17 -77
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +331 -91
- package/dist/env/bootstrap.d.ts +84 -0
- package/dist/env/bootstrap.d.ts.map +1 -0
- package/dist/env/bootstrap.js +310 -0
- 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 +7 -3
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +60 -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-coordinator.d.ts +8 -0
- package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
- package/dist/extractors/symbols-coordinator.js +40 -0
- package/dist/extractors/symbols-ts.d.ts +9 -19
- package/dist/extractors/symbols-ts.d.ts.map +1 -1
- package/dist/extractors/symbols-ts.js +34 -429
- package/dist/intent-search.d.ts +1 -0
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +11 -8
- 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 +57 -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 +4 -2
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +82 -22
- 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 +11 -89
- 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 +51 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -1
- package/dist/operations/planning/compile-intent.js +133 -17
- package/dist/operations/proof/baseline-diff.d.ts +41 -0
- package/dist/operations/proof/baseline-diff.d.ts.map +1 -0
- package/dist/operations/proof/baseline-diff.js +153 -0
- package/dist/operations/proof/explain.d.ts +75 -0
- package/dist/operations/proof/explain.d.ts.map +1 -0
- package/dist/operations/proof/explain.js +294 -0
- package/dist/operations/proof/impact.d.ts +45 -0
- package/dist/operations/proof/impact.d.ts.map +1 -0
- package/dist/operations/proof/impact.js +118 -0
- package/dist/operations/proof/ingest-proof.d.ts +34 -0
- package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
- package/dist/operations/proof/ingest-proof.js +348 -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 +92 -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/analysis-receipt.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analysis-receipt.js +3 -9
- 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 +64 -93
- 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/plugin-orchestration.d.ts +63 -0
- package/dist/operations/semantic-advisor/plugin-orchestration.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/plugin-orchestration.js +489 -0
- package/dist/operations/semantic-advisor/predicate-rules-core.d.ts +15 -2
- package/dist/operations/semantic-advisor/predicate-rules-core.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-core.js +7 -140
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +11 -12
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-launcher.js +6 -94
- package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts +16 -0
- package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-policy.js +7 -150
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts +9 -0
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-product-tail.js +7 -102
- package/dist/operations/semantic-advisor/predicate-rules-product.d.ts +13 -0
- package/dist/operations/semantic-advisor/predicate-rules-product.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/predicate-rules-product.js +7 -133
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
- package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
- package/dist/operations/semantic-advisor/types.d.ts +1 -0
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/plugins/compose-ontology-packs.d.ts +51 -0
- package/dist/plugins/compose-ontology-packs.d.ts.map +1 -0
- package/dist/plugins/compose-ontology-packs.js +257 -0
- package/dist/plugins/compose-semantic-classifier.d.ts +42 -0
- package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -0
- package/dist/plugins/compose-semantic-classifier.js +211 -0
- package/dist/plugins/external-allowlist.d.ts +10 -0
- package/dist/plugins/external-allowlist.d.ts.map +1 -0
- package/dist/plugins/external-allowlist.js +16 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +33 -0
- package/dist/plugins/load-plugin.d.ts +19 -0
- package/dist/plugins/load-plugin.d.ts.map +1 -0
- package/dist/plugins/load-plugin.js +59 -0
- package/dist/plugins/project-config.d.ts +28 -0
- package/dist/plugins/project-config.d.ts.map +1 -0
- package/dist/plugins/project-config.js +90 -0
- package/dist/plugins/registry.d.ts +93 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +338 -0
- package/dist/plugins/resolve-package.d.ts +47 -0
- package/dist/plugins/resolve-package.d.ts.map +1 -0
- package/dist/plugins/resolve-package.js +262 -0
- package/dist/plugins/source-analysis-service.d.ts +44 -0
- package/dist/plugins/source-analysis-service.d.ts.map +1 -0
- package/dist/plugins/source-analysis-service.js +232 -0
- 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 +1 -1
- 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/extractors/symbols-coordinator.d.ts +1 -1
- package/dist/public/extractors/symbols-coordinator.d.ts.map +1 -1
- package/dist/public/extractors/symbols-coordinator.js +1 -1
- package/dist/public/impact/analyzer.d.ts +1 -1
- package/dist/public/impact/analyzer.d.ts.map +1 -1
- package/dist/public/impact/analyzer.js +6 -4
- 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 +450 -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 +4 -8
- package/dist/public/operations/check-helpers.d.ts +1 -1
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +1 -1
- 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 +66 -34
- package/dist/public/operations/discovery-entities.d.ts +15 -0
- package/dist/public/operations/discovery-entities.d.ts.map +1 -1
- package/dist/public/operations/discovery-entities.js +38 -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 +39 -31
- 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/prolog-json.d.ts +1 -1
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +7 -7
- 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 +21 -1
- 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 +35 -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/discovery.d.ts +3 -0
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +3 -0
- 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 +20 -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/semantic.d.ts +1 -1
- package/dist/public/operations/specs/semantic.d.ts.map +1 -1
- package/dist/public/operations/specs/semantic.js +54 -4
- 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 +121 -4
- package/dist/public/operations/types.d.ts +6 -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 +44 -12
- package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/dist/public/skills/kibi-usage/resources/proof.md +150 -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 +53 -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 +1240 -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 +32 -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 +24 -2
- package/dist/traceability/symbol-extract.d.ts.map +1 -1
- package/dist/traceability/symbol-extract.js +64 -208
- 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 +102 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -0
- package/dist/utils/rule-registry.generated.js +131 -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 +20 -20
- package/src/public/diagnostic-usage.ts +6 -6
- package/src/public/distribution-parity.ts +17 -10
- package/src/public/extractors/symbols-coordinator.ts +1 -0
- package/src/public/impact/analyzer.ts +15 -12
- 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 +4 -8
- package/src/public/operations/check-helpers.ts +2 -2
- package/src/public/operations/contracts.ts +78 -34
- package/src/public/operations/discovery-entities.ts +53 -0
- package/src/public/operations/discovery-executors.ts +64 -48
- 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/prolog-json.ts +13 -5
- 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 +26 -2
- package/src/public/operations/specs/check-rules.generated.ts +38 -0
- package/src/public/operations/specs/check.ts +12 -21
- package/src/public/operations/specs/discovery.ts +3 -0
- 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/specs/semantic.ts +79 -17
- package/src/public/operations/symbol-repair-plan.ts +166 -7
- package/src/public/operations/types.ts +6 -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 +44 -12
- package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
- package/src/public/skills/kibi-usage/resources/proof.md +150 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
- package/src/public/symbol-granularity.generated.ts +74 -0
- package/src/public/symbol-granularity.ts +34 -59
- 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,39 @@
|
|
|
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
|
+
import { executeProofImpact, proofImpactExitCode, } from "../operations/proof/impact.js";
|
|
11
|
+
import { createCliRuntime } from "../runtime/cli-runtime.js";
|
|
12
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
13
|
+
export async function proofImpactCommand(options) {
|
|
14
|
+
const runtime = createCliRuntime();
|
|
15
|
+
const context = await runtime.open({
|
|
16
|
+
name: "kibi_proof_impact",
|
|
17
|
+
effects: [],
|
|
18
|
+
requiresProlog: true,
|
|
19
|
+
execute: async () => undefined,
|
|
20
|
+
}, {});
|
|
21
|
+
let completed = false;
|
|
22
|
+
try {
|
|
23
|
+
const { result, text } = await executeProofImpact(context);
|
|
24
|
+
if (options.json) {
|
|
25
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
process.stdout.write(text);
|
|
29
|
+
}
|
|
30
|
+
completed = true;
|
|
31
|
+
await runtime.afterSuccess({ name: "kibi_proof_impact" }, context);
|
|
32
|
+
return { exitCode: proofImpactExitCode(result) };
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await runtime.close(context, completed
|
|
36
|
+
? { status: "success", result: 0 }
|
|
37
|
+
: { status: "error", error: 1 });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-migrate-legacy.d.ts","sourceRoot":"","sources":["../../src/commands/proof-migrate-legacy.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAE/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAGH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC/B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 { executeMigrateLegacyReceipts } from "../operations/proof/migrate-legacy-receipts.js";
|
|
19
|
+
import { createCliRuntime } from "../runtime/cli-runtime.js";
|
|
20
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
21
|
+
export async function proofMigrateLegacyCommand(options) {
|
|
22
|
+
const runtime = createCliRuntime();
|
|
23
|
+
const context = await runtime.open({
|
|
24
|
+
name: "kibi_proof_migrate_legacy",
|
|
25
|
+
effects: ["kb-mutate", "workspace-write"],
|
|
26
|
+
requiresProlog: true,
|
|
27
|
+
execute: async () => undefined,
|
|
28
|
+
}, {});
|
|
29
|
+
let completed = false;
|
|
30
|
+
try {
|
|
31
|
+
const result = await executeMigrateLegacyReceipts(options.test === undefined ? {} : { testId: options.test }, context);
|
|
32
|
+
process.stdout.write(`${result.content[0]?.text ?? ""}\n`);
|
|
33
|
+
for (const row of result.structuredContent.tests) {
|
|
34
|
+
process.stdout.write(` ${row.testId}: legacy verification_receipts removed\n`);
|
|
35
|
+
}
|
|
36
|
+
completed = true;
|
|
37
|
+
await runtime.afterSuccess({ name: "kibi_proof_migrate_legacy" }, context);
|
|
38
|
+
return { exitCode: 0 };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await runtime.close(context, completed
|
|
42
|
+
? { status: "success", result: 0 }
|
|
43
|
+
: { status: "error", error: 1 });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-prune.d.ts","sourceRoot":"","sources":["../../src/commands/proof-prune.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IAEvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAGH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CA0CD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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 { executePruneReceipts } from "../operations/proof/prune-receipts.js";
|
|
19
|
+
import { createCliRuntime } from "../runtime/cli-runtime.js";
|
|
20
|
+
// implements REQ-kibi-verification-evidence-contract
|
|
21
|
+
export async function proofPruneCommand(options) {
|
|
22
|
+
const keepRaw = options.keep ?? "1";
|
|
23
|
+
const keep = Number.parseInt(keepRaw, 10);
|
|
24
|
+
if (!Number.isSafeInteger(keep) || keep < 1 || keep > 50) {
|
|
25
|
+
throw new Error("proof prune: --keep must be an integer between 1 and 50");
|
|
26
|
+
}
|
|
27
|
+
const runtime = createCliRuntime();
|
|
28
|
+
const context = await runtime.open({
|
|
29
|
+
name: "kibi_proof_prune",
|
|
30
|
+
effects: ["kb-mutate", "workspace-write"],
|
|
31
|
+
requiresProlog: true,
|
|
32
|
+
execute: async () => undefined,
|
|
33
|
+
}, {});
|
|
34
|
+
let completed = false;
|
|
35
|
+
try {
|
|
36
|
+
const result = await executePruneReceipts({
|
|
37
|
+
keep,
|
|
38
|
+
...(options.test === undefined ? {} : { testId: options.test }),
|
|
39
|
+
}, context);
|
|
40
|
+
process.stdout.write(`${result.content[0]?.text ?? ""}\n`);
|
|
41
|
+
for (const row of result.structuredContent.tests) {
|
|
42
|
+
process.stdout.write(` ${row.testId}: ${row.before} -> ${row.after} receipt(s)\n`);
|
|
43
|
+
}
|
|
44
|
+
completed = true;
|
|
45
|
+
await runtime.afterSuccess({ name: "kibi_proof_prune" }, context);
|
|
46
|
+
return { exitCode: 0 };
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await runtime.close(context, completed
|
|
50
|
+
? { status: "success", result: 0 }
|
|
51
|
+
: { status: "error", error: 1 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { executeIngestProof } from "../operations/proof/ingest-proof.js";
|
|
2
|
+
import type { ProofIntegration } from "../proof/integrations.js";
|
|
3
|
+
import type { OperationRuntime } from "../public/operations/runtime-types.js";
|
|
4
|
+
import { readWorkspaceSnapshot } from "../public/operations/workspace-snapshot.js";
|
|
5
|
+
export type ProveCommandOptions = Readonly<{
|
|
6
|
+
testId?: string;
|
|
7
|
+
requirement?: string;
|
|
8
|
+
integration?: string;
|
|
9
|
+
integrationExcept?: string;
|
|
10
|
+
all?: boolean;
|
|
11
|
+
workspaceRoot?: string;
|
|
12
|
+
}>;
|
|
13
|
+
export type ProveCommandDependencies = Readonly<{
|
|
14
|
+
runtime?: OperationRuntime;
|
|
15
|
+
ingestProof?: typeof executeIngestProof;
|
|
16
|
+
}>;
|
|
17
|
+
type SelectedTest = Record<string, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Describe which paths moved when a proof snapshot refusal fires, so
|
|
20
|
+
* consumers can see what kibi thinks changed instead of diffing by hand.
|
|
21
|
+
* Snapshot-relevant changes come first (receipt-only and ignored edits do
|
|
22
|
+
* not affect the hash), and the list is capped to keep the error readable.
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeWorkspaceDrift(snapshot: Awaited<ReturnType<typeof readWorkspaceSnapshot>>): string;
|
|
25
|
+
/**
|
|
26
|
+
* Parse a comma-separated integration selector ("a", "a,b,c") into a set of
|
|
27
|
+
* trimmed, non-empty ids. Empty selectors yield an empty set; blank items
|
|
28
|
+
* fail fast instead of silently narrowing the selection.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseIntegrationSelector(value: string | undefined, flagName: string): Set<string>;
|
|
31
|
+
export declare function testId(test: SelectedTest): string;
|
|
32
|
+
export declare function commandEnvironment(integration: ProofIntegration, commandArgv: readonly string[], snapshot: string, workspaceRoot: string, testIds: readonly string[], outputPath: string): NodeJS.ProcessEnv;
|
|
33
|
+
export declare function proveCommand(options: ProveCommandOptions, deps?: ProveCommandDependencies): Promise<{
|
|
34
|
+
exitCode: number;
|
|
35
|
+
}>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=prove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prove.d.ts","sourceRoot":"","sources":["../../src/commands/prove.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AASjE,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAYnF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CAAC;AAGH,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,kBAAkB,CAAC;CACzC,CAAC,CAAC;AAEH,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C;;;;;GAKG;AAEH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,GAC1D,MAAM,CAiBR;AAED;;;;GAIG;AAEH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,GACf,GAAG,CAAC,MAAM,CAAC,CAUb;AAQD,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEjD;AAkCD,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,UAAU,CAWnB;AA4KD,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAgL/B"}
|
|
@@ -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-verification-evidence-contract
|
|
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-verification-evidence-contract
|
|
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-verification-evidence-contract
|
|
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-verification-evidence-contract
|
|
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
|
+
}
|