kibi-cli 0.19.0 → 1.0.1
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-operation-loader.d.ts.map +1 -1
- package/dist/cli-operation-loader.js +53 -20
- package/dist/cli-operation-metadata.d.ts +20 -8
- package/dist/cli-operation-metadata.d.ts.map +1 -1
- package/dist/cli-operation-metadata.js +23 -8
- package/dist/cli-protocol.d.ts.map +1 -1
- package/dist/cli-protocol.js +38 -8
- package/dist/cli-register-foundation.d.ts.map +1 -1
- package/dist/cli-register-foundation.js +14 -2
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +26 -4
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +10 -0
- package/dist/cli-register-verification.d.ts +3 -0
- package/dist/cli-register-verification.d.ts.map +1 -0
- package/dist/cli-register-verification.js +16 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/commands/aggregated-checks.d.ts +1 -2
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +14 -9
- package/dist/commands/branch.d.ts +36 -0
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +371 -40
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +20 -67
- package/dist/commands/discovery-shared.d.ts.map +1 -1
- package/dist/commands/discovery-shared.js +10 -19
- package/dist/commands/doctor.d.ts +4 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +259 -24
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +10 -7
- package/dist/commands/gc.d.ts +5 -2
- package/dist/commands/gc.d.ts.map +1 -1
- package/dist/commands/gc.js +140 -71
- package/dist/commands/github-init.d.ts +56 -0
- package/dist/commands/github-init.d.ts.map +1 -0
- package/dist/commands/github-init.js +310 -0
- package/dist/commands/init-helpers.d.ts +1 -1
- package/dist/commands/init-helpers.d.ts.map +1 -1
- package/dist/commands/init-helpers.js +73 -25
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +79 -24
- package/dist/commands/legacy-storage-migration.d.ts +54 -0
- package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
- package/dist/commands/legacy-storage-migration.js +277 -0
- package/dist/commands/migrate.d.ts +7 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +244 -91
- package/dist/commands/report.d.ts +24 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +191 -0
- package/dist/commands/sync/cache.d.ts +16 -3
- package/dist/commands/sync/cache.d.ts.map +1 -1
- package/dist/commands/sync/cache.js +111 -4
- package/dist/commands/sync/discovery.d.ts +23 -2
- package/dist/commands/sync/discovery.d.ts.map +1 -1
- package/dist/commands/sync/discovery.js +196 -15
- package/dist/commands/sync/extraction.d.ts +8 -1
- package/dist/commands/sync/extraction.d.ts.map +1 -1
- package/dist/commands/sync/extraction.js +38 -4
- package/dist/commands/sync/manifest.d.ts +8 -5
- package/dist/commands/sync/manifest.d.ts.map +1 -1
- package/dist/commands/sync/manifest.js +142 -39
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +3 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +304 -79
- package/dist/commands/verify.d.ts +10 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +126 -0
- package/dist/diagnostics.d.ts +1 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/engine.d.ts +96 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +392 -23
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +5 -6
- package/dist/extractors/manifest.d.ts +8 -1
- package/dist/extractors/manifest.d.ts.map +1 -1
- package/dist/extractors/manifest.js +51 -9
- package/dist/extractors/markdown.d.ts +2 -1
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +21 -3
- package/dist/extractors/playwright-cases.d.ts +24 -0
- package/dist/extractors/playwright-cases.d.ts.map +1 -0
- package/dist/extractors/playwright-cases.js +126 -0
- package/dist/extractors/relationships.d.ts.map +1 -1
- package/dist/extractors/relationships.js +1 -0
- package/dist/extractors/symbol-coordinates.d.ts +81 -3
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
- package/dist/extractors/symbol-coordinates.js +389 -51
- package/dist/extractors/symbols-coordinator.js +11 -1
- package/dist/intent-search.d.ts +60 -0
- package/dist/intent-search.d.ts.map +1 -0
- package/dist/intent-search.js +433 -0
- package/dist/operations/bootstrap/activation.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/activation.js +48 -31
- package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
- package/dist/operations/bootstrap/candidates.d.ts +4 -0
- package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
- package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
- package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
- package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
- package/dist/operations/bootstrap/generate.d.ts +8 -0
- package/dist/operations/bootstrap/generate.d.ts.map +1 -0
- package/dist/operations/bootstrap/generate.js +204 -0
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
- package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/guidance.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/guidance.js +2 -0
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
- package/dist/operations/bootstrap/presentation.d.ts +15 -0
- package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
- package/dist/operations/bootstrap/presentation.js +177 -0
- package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
- package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
- package/dist/operations/bootstrap/types.d.ts.map +1 -0
- package/dist/operations/bootstrap/types.js +25 -0
- package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
- package/dist/operations/modeling/model-requirement.js +4 -17
- package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
- package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-applicability.js +276 -0
- package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
- package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-applyplan.js +100 -3
- package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
- package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-bindings.js +122 -0
- package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-catalog-4.js +155 -0
- package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference-1.js +8 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
- package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
- package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
- package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-inference.js +4 -0
- package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-loader.js +7 -0
- package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
- package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-ranker.js +156 -24
- package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-score-3.js +6 -0
- package/dist/operations/modeling/predicate-types.d.ts +34 -0
- package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
- package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
- package/dist/operations/modeling/predicate-utils.js +2 -0
- package/dist/operations/modeling/suggest-predicates.d.ts +1 -1
- package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
- package/dist/operations/modeling/suggest-predicates.js +170 -32
- package/dist/operations/mutation/delete.d.ts.map +1 -1
- package/dist/operations/mutation/delete.js +415 -19
- package/dist/operations/mutation/entity-projection.d.ts +11 -0
- package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
- package/dist/operations/mutation/entity-projection.js +14 -0
- package/dist/operations/mutation/relationships.d.ts +10 -0
- package/dist/operations/mutation/relationships.d.ts.map +1 -1
- package/dist/operations/mutation/relationships.js +71 -1
- package/dist/operations/mutation/serialization.d.ts.map +1 -1
- package/dist/operations/mutation/serialization.js +1 -0
- package/dist/operations/mutation/source-authoring.d.ts +61 -0
- package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
- package/dist/operations/mutation/source-authoring.js +543 -0
- package/dist/operations/mutation/symbol-compiler-lock.d.ts +51 -0
- package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
- package/dist/operations/mutation/symbol-compiler-lock.js +274 -0
- package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-granularity.js +34 -3
- package/dist/operations/mutation/symbol-refresh.d.ts +18 -1
- package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
- package/dist/operations/mutation/symbol-refresh.js +225 -63
- package/dist/operations/mutation/types.d.ts +57 -1
- package/dist/operations/mutation/types.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.d.ts.map +1 -1
- package/dist/operations/mutation/upsert.js +363 -24
- package/dist/operations/mutation/validation.d.ts.map +1 -1
- package/dist/operations/mutation/validation.js +1 -0
- package/dist/operations/planning/apply-plan.d.ts +117 -0
- package/dist/operations/planning/apply-plan.d.ts.map +1 -0
- package/dist/operations/planning/apply-plan.js +1437 -0
- package/dist/operations/planning/compile-intent.d.ts +106 -0
- package/dist/operations/planning/compile-intent.d.ts.map +1 -0
- package/dist/operations/planning/compile-intent.js +562 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +6 -2
- package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/clauses.js +15 -2
- package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
- package/dist/operations/semantic-advisor/types.d.ts +13 -5
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/operations/verification/ingest-verification.d.ts +29 -0
- package/dist/operations/verification/ingest-verification.d.ts.map +1 -0
- package/dist/operations/verification/ingest-verification.js +192 -0
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +2 -1
- package/dist/prolog.d.ts.map +1 -1
- package/dist/prolog.js +27 -8
- package/dist/public/branch-resolver.d.ts +1 -0
- package/dist/public/branch-resolver.d.ts.map +1 -1
- package/dist/public/branch-resolver.js +1 -0
- package/dist/public/check-types.d.ts +2 -2
- package/dist/public/check-types.d.ts.map +1 -1
- package/dist/public/check-types.js +16 -16
- package/dist/public/diagnostic-usage.d.ts.map +1 -1
- package/dist/public/diagnostic-usage.js +69 -1
- package/dist/public/distribution-parity.d.ts +1 -1
- package/dist/public/distribution-parity.d.ts.map +1 -1
- package/dist/public/distribution-parity.js +1 -0
- package/dist/public/ignore-policy.d.ts.map +1 -1
- package/dist/public/ignore-policy.js +16 -4
- package/dist/public/impact/coverage-depth-quality.d.ts +6 -1
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +21 -3
- package/dist/public/impact/full-kb-quality.d.ts +4 -2
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +61 -1
- package/dist/public/impact/manifest.d.ts.map +1 -1
- package/dist/public/impact/manifest.js +2 -5
- package/dist/public/operational-artifacts.d.ts.map +1 -1
- package/dist/public/operational-artifacts.js +7 -1
- package/dist/public/operations/catalog.d.ts +682 -67
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/catalog.js +126 -4
- package/dist/public/operations/check-executor.d.ts +2 -2
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +72 -13
- package/dist/public/operations/check-format-shared.d.ts +3 -0
- package/dist/public/operations/check-format-shared.d.ts.map +1 -1
- package/dist/public/operations/check-format-shared.js +3 -0
- package/dist/public/operations/check-helpers.d.ts +27 -2
- package/dist/public/operations/check-helpers.d.ts.map +1 -1
- package/dist/public/operations/check-helpers.js +62 -26
- package/dist/public/operations/contracts.d.ts +11 -0
- package/dist/public/operations/contracts.d.ts.map +1 -0
- package/dist/public/operations/contracts.js +325 -0
- package/dist/public/operations/discovery-executors.d.ts +37 -1
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +206 -6
- package/dist/public/operations/index.d.ts +9 -4
- package/dist/public/operations/index.d.ts.map +1 -1
- package/dist/public/operations/index.js +8 -3
- package/dist/public/operations/migration-plan.d.ts +101 -0
- package/dist/public/operations/migration-plan.d.ts.map +1 -0
- package/dist/public/operations/migration-plan.js +537 -0
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +68 -8
- package/dist/public/operations/prolog-json.d.ts +14 -0
- package/dist/public/operations/prolog-json.d.ts.map +1 -1
- package/dist/public/operations/prolog-json.js +44 -5
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +1 -0
- package/dist/public/operations/result-envelope.d.ts +13 -0
- package/dist/public/operations/result-envelope.d.ts.map +1 -0
- package/dist/public/operations/result-envelope.js +104 -0
- package/dist/public/operations/runtime-types.d.ts +97 -7
- package/dist/public/operations/runtime-types.d.ts.map +1 -1
- package/dist/public/operations/source-relationship-parity.d.ts +13 -0
- package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
- package/dist/public/operations/source-relationship-parity.js +162 -0
- package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
- package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
- package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
- package/dist/public/operations/specs/check.d.ts +4 -4
- package/dist/public/operations/specs/check.d.ts.map +1 -1
- package/dist/public/operations/specs/check.js +4 -3
- package/dist/public/operations/specs/discovery.d.ts +87 -3
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +53 -3
- package/dist/public/operations/specs/modeling.d.ts +3 -3
- package/dist/public/operations/specs/modeling.js +3 -3
- package/dist/public/operations/specs/mutation-schemas.d.ts +190 -47
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +3 -1
- package/dist/public/operations/specs/mutation.d.ts +42 -2
- package/dist/public/operations/specs/mutation.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation.js +26 -2
- package/dist/public/operations/specs/planning.d.ts +270 -0
- package/dist/public/operations/specs/planning.d.ts.map +1 -0
- package/dist/public/operations/specs/planning.js +191 -0
- package/dist/public/operations/specs/reporting.d.ts +4 -1
- package/dist/public/operations/specs/reporting.d.ts.map +1 -1
- package/dist/public/operations/specs/reporting.js +46 -1
- package/dist/public/operations/specs/upsert.d.ts +204 -47
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/specs/upsert.js +9 -0
- package/dist/public/operations/specs/verification.d.ts +78 -0
- package/dist/public/operations/specs/verification.d.ts.map +1 -0
- package/dist/public/operations/specs/verification.js +62 -0
- package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
- package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
- package/dist/public/operations/symbol-repair-plan.js +123 -0
- package/dist/public/operations/types.d.ts +52 -1
- package/dist/public/operations/types.d.ts.map +1 -1
- package/dist/public/playwright-case-id.d.ts +8 -0
- package/dist/public/playwright-case-id.d.ts.map +1 -0
- package/dist/public/playwright-case-id.js +25 -0
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +4 -2
- package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
- package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
- package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/dist/public/skills/kibi-usage/SKILL.md +115 -239
- package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/dist/public/skills/kibi-usage/resources/workflows.md +56 -3
- package/dist/public/symbol-granularity.d.ts +1 -1
- package/dist/public/symbol-granularity.d.ts.map +1 -1
- package/dist/public/symbol-granularity.js +1 -0
- package/dist/public/telemetry-acceptance.d.ts +7 -0
- package/dist/public/telemetry-acceptance.d.ts.map +1 -1
- package/dist/public/telemetry-acceptance.js +8 -1
- package/dist/public/telemetry-remediation.js +1 -1
- package/dist/public/verification-receipt.d.ts +206 -39
- package/dist/public/verification-receipt.d.ts.map +1 -1
- package/dist/public/verification-receipt.js +171 -4
- package/dist/relationships/shards.d.ts +16 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +87 -2
- package/dist/report/brand.d.ts +19 -0
- package/dist/report/brand.d.ts.map +1 -0
- package/dist/report/brand.js +112 -0
- package/dist/report/html-report.d.ts +19 -0
- package/dist/report/html-report.d.ts.map +1 -0
- package/dist/report/html-report.js +963 -0
- package/dist/report/relative-time.d.ts +4 -0
- package/dist/report/relative-time.d.ts.map +1 -0
- package/dist/report/relative-time.js +46 -0
- package/dist/report/report-view.d.ts +17 -0
- package/dist/report/report-view.d.ts.map +1 -0
- package/dist/report/report-view.js +33 -0
- package/dist/report/repository.d.ts +35 -0
- package/dist/report/repository.d.ts.map +1 -0
- package/dist/report/repository.js +151 -0
- package/dist/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runtime/cli-runtime.js +82 -22
- package/dist/schemas/entity.schema.json +1148 -273
- package/dist/traceability/evidence-model.d.ts +2 -2
- package/dist/traceability/evidence-model.d.ts.map +1 -1
- package/dist/traceability/evidence-model.js +2 -2
- package/dist/traceability/git-staged.d.ts.map +1 -1
- package/dist/traceability/git-staged.js +15 -40
- package/dist/traceability/markdown-validate.d.ts.map +1 -1
- package/dist/traceability/markdown-validate.js +12 -7
- package/dist/traceability/staged-impact-contract.d.ts +3 -3
- package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
- package/dist/traceability/staged-impact-contract.js +10 -38
- package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
- package/dist/traceability/staged-symbols-manifest.js +8 -3
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +3 -0
- package/dist/types/entities.d.ts +3 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/utils/branch-resolver.d.ts +24 -10
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +121 -38
- package/dist/utils/branch-store-locator.d.ts +23 -0
- package/dist/utils/branch-store-locator.d.ts.map +1 -0
- package/dist/utils/branch-store-locator.js +90 -0
- package/dist/utils/branch-store.d.ts +15 -0
- package/dist/utils/branch-store.d.ts.map +1 -0
- package/dist/utils/branch-store.js +130 -0
- package/dist/utils/config.d.ts +39 -37
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +107 -119
- package/dist/utils/kb-manifest.d.ts +35 -0
- package/dist/utils/kb-manifest.d.ts.map +1 -0
- package/dist/utils/kb-manifest.js +154 -0
- package/dist/utils/kb-paths.d.ts +54 -0
- package/dist/utils/kb-paths.d.ts.map +1 -0
- package/dist/utils/kb-paths.js +125 -0
- package/dist/utils/manifest-paths.d.ts +4 -4
- package/dist/utils/manifest-paths.d.ts.map +1 -1
- package/dist/utils/manifest-paths.js +8 -56
- package/dist/utils/rule-registry.d.ts +48 -20
- package/dist/utils/rule-registry.d.ts.map +1 -1
- package/dist/utils/rule-registry.js +82 -77
- package/dist/utils/schema-version.d.ts +5 -5
- package/dist/utils/schema-version.d.ts.map +1 -1
- package/dist/utils/schema-version.js +26 -6
- package/dist/utils/strict-modeling.d.ts +0 -4
- package/dist/utils/strict-modeling.d.ts.map +1 -1
- package/dist/utils/strict-modeling.js +7 -8
- package/dist/verification/playwright-reporter.d.ts +21 -0
- package/dist/verification/playwright-reporter.d.ts.map +1 -0
- package/dist/verification/playwright-reporter.js +114 -0
- package/package.json +46 -7
- package/schema/config.json +2 -2
- package/schema/manifest.json +26 -0
- package/src/public/branch-resolver.ts +1 -0
- package/src/public/check-types.ts +22 -19
- package/src/public/diagnostic-usage.ts +79 -1
- package/src/public/distribution-parity.ts +1 -0
- package/src/public/ignore-policy.ts +16 -10
- package/src/public/impact/coverage-depth-quality.ts +36 -0
- package/src/public/impact/full-kb-quality.ts +118 -5
- package/src/public/impact/manifest.ts +2 -4
- package/src/public/operational-artifacts.ts +9 -1
- package/src/public/operations/catalog.ts +146 -9
- package/src/public/operations/check-executor.ts +102 -15
- package/src/public/operations/check-format-shared.ts +6 -0
- package/src/public/operations/check-helpers.ts +74 -35
- package/src/public/operations/contracts.ts +366 -0
- package/src/public/operations/discovery-executors.ts +299 -12
- package/src/public/operations/index.ts +9 -4
- package/src/public/operations/migration-plan.ts +740 -0
- package/src/public/operations/node-ports.ts +84 -10
- package/src/public/operations/prolog-json.ts +60 -5
- package/src/public/operations/repair-plan.ts +1 -0
- package/src/public/operations/result-envelope.ts +136 -0
- package/src/public/operations/runtime-types.ts +91 -5
- package/src/public/operations/source-relationship-parity.ts +226 -0
- package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
- package/src/public/operations/specs/check.ts +4 -3
- package/src/public/operations/specs/discovery.ts +57 -3
- package/src/public/operations/specs/modeling.ts +3 -3
- package/src/public/operations/specs/mutation-schemas.ts +6 -1
- package/src/public/operations/specs/mutation.ts +27 -2
- package/src/public/operations/specs/planning.ts +234 -0
- package/src/public/operations/specs/reporting.ts +55 -1
- package/src/public/operations/specs/upsert.ts +10 -0
- package/src/public/operations/specs/verification.ts +78 -0
- package/src/public/operations/symbol-repair-plan.ts +164 -0
- package/src/public/operations/types.ts +62 -1
- package/src/public/playwright-case-id.ts +35 -0
- package/src/public/schemas/entity.ts +7 -2
- package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
- package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
- package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
- package/src/public/skills/kibi-freshness/SKILL.md +39 -9
- package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
- package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
- package/src/public/skills/kibi-traceability/SKILL.md +47 -47
- package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
- package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
- package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
- package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
- package/src/public/skills/kibi-usage/SKILL.md +115 -239
- package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
- package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
- package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
- package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
- package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
- package/src/public/skills/kibi-usage/resources/workflows.md +56 -3
- package/src/public/symbol-granularity.ts +1 -0
- package/src/public/telemetry-acceptance.ts +16 -1
- package/src/public/telemetry-remediation.ts +1 -1
- package/src/public/verification-receipt.ts +248 -6
- package/src/schemas/entity.schema.json +1148 -273
- package/templates/github/kibi-badge.yml +86 -0
- package/templates/github/kibi-report.yml +84 -0
- package/dist/operations/autopilot/activation.d.ts.map +0 -1
- package/dist/operations/autopilot/candidates.d.ts +0 -4
- package/dist/operations/autopilot/discovery.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.d.ts +0 -8
- package/dist/operations/autopilot/generate.d.ts.map +0 -1
- package/dist/operations/autopilot/generate.js +0 -112
- package/dist/operations/autopilot/presentation.d.ts +0 -13
- package/dist/operations/autopilot/presentation.d.ts.map +0 -1
- package/dist/operations/autopilot/presentation.js +0 -91
- package/dist/operations/autopilot/types.d.ts.map +0 -1
- package/dist/operations/autopilot/types.js +0 -8
- package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
- package/dist/public/skills/init-kibi/SKILL.md +0 -62
- package/src/public/skills/init-kibi/SKILL.md +0 -62
- /package/dist/operations/{autopilot → bootstrap}/activation.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
- /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
package/dist/commands/migrate.js
CHANGED
|
@@ -19,10 +19,49 @@ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from
|
|
|
19
19
|
import * as path from "node:path";
|
|
20
20
|
import { load as parseYAML } from "js-yaml";
|
|
21
21
|
import { extractSymbolsFromStagedFile } from "../traceability/symbol-extract.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
22
|
+
import { resolveBranchAttachment } from "../utils/branch-resolver.js";
|
|
23
|
+
import { defaultKbManifest, readKbManifest, readKbManifestStatus, writeKbManifest, } from "../utils/kb-manifest.js";
|
|
24
|
+
import { CANONICAL_ENTITY_PATHS } from "../utils/kb-paths.js";
|
|
24
25
|
import { LATEST_KB_SCHEMA_VERSION, getSchemaVersionStatus, normalizeSchemaVersion, } from "../utils/schema-version.js";
|
|
26
|
+
import { updateGitIgnore } from "./init-helpers.js";
|
|
27
|
+
import { applyLegacyStorageMigration, planLegacyStorageMigration, } from "./legacy-storage-migration.js";
|
|
25
28
|
const MIGRATION_AUDIT_VERSION = 1;
|
|
29
|
+
const SCHEMA_MIGRATION_STEPS = [
|
|
30
|
+
{
|
|
31
|
+
id: "config-canonical-v1",
|
|
32
|
+
from: 0,
|
|
33
|
+
to: 1,
|
|
34
|
+
description: "Preserve legacy configuration while recording canonical schema metadata.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "symbol-granularity-v2",
|
|
38
|
+
from: 1,
|
|
39
|
+
to: 2,
|
|
40
|
+
description: "Mark provable coarse traceability links as legacy-link.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "compatibility-v3",
|
|
44
|
+
from: 2,
|
|
45
|
+
to: 3,
|
|
46
|
+
description: "Record an audited compatibility no-op for schema v3.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "semantic-backfill-v4",
|
|
50
|
+
from: 3,
|
|
51
|
+
to: 4,
|
|
52
|
+
description: "Mark semantic-advisor backfill as pending without inventing claims.",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "canonical-storage-v5",
|
|
56
|
+
from: 4,
|
|
57
|
+
to: 5,
|
|
58
|
+
description: "Move Kibi knowledge into the canonical .kb/ namespace and retire .kb/config.json.",
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
function migrationStepsFor(fromVersion) {
|
|
62
|
+
const start = Math.max(0, fromVersion ?? 0);
|
|
63
|
+
return SCHEMA_MIGRATION_STEPS.filter((step) => step.from >= start);
|
|
64
|
+
}
|
|
26
65
|
function printWarning(message) {
|
|
27
66
|
console.log(`Warning: ${message}`);
|
|
28
67
|
}
|
|
@@ -31,59 +70,24 @@ function toRelativePath(cwd, filePath) {
|
|
|
31
70
|
return relativePath.length > 0 ? relativePath : path.basename(filePath);
|
|
32
71
|
}
|
|
33
72
|
function resolveMigrationBranch(cwd) {
|
|
34
|
-
const result =
|
|
73
|
+
const result = resolveBranchAttachment(cwd);
|
|
35
74
|
if ("error" in result) {
|
|
36
75
|
const isNonGitContext = result.code === "NOT_A_GIT_REPO" || result.code === "GIT_NOT_AVAILABLE";
|
|
37
76
|
if (isNonGitContext) {
|
|
38
77
|
return {
|
|
39
|
-
|
|
40
|
-
warnings: [
|
|
41
|
-
"Not in a git repository; using 'main' for migration audit metadata.",
|
|
42
|
-
],
|
|
78
|
+
error: "Not in a git repository; set KIBI_BRANCH explicitly for migration audit metadata.",
|
|
43
79
|
};
|
|
44
80
|
}
|
|
45
81
|
return {
|
|
46
82
|
error: `Failed to resolve active branch: ${result.error}`,
|
|
47
83
|
};
|
|
48
84
|
}
|
|
49
|
-
|
|
50
|
-
branch: result.branch,
|
|
51
|
-
warnings: [],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
function loadRawConfigDocument(cwd) {
|
|
55
|
-
const kbDir = path.join(cwd, ".kb");
|
|
56
|
-
const configPath = path.join(kbDir, "config.json");
|
|
57
|
-
if (!existsSync(kbDir)) {
|
|
58
|
-
return {
|
|
59
|
-
error: "Missing .kb/ directory. Run 'kibi init' before 'kibi migrate'.",
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if (!existsSync(configPath)) {
|
|
85
|
+
if (result.migrationRequired) {
|
|
63
86
|
return {
|
|
64
|
-
error:
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
try {
|
|
68
|
-
const parsed = JSON.parse(readFileSync(configPath, "utf8"));
|
|
69
|
-
if (parsed === null ||
|
|
70
|
-
Array.isArray(parsed) ||
|
|
71
|
-
typeof parsed !== "object") {
|
|
72
|
-
return {
|
|
73
|
-
error: ".kb/config.json must contain a JSON object. Fix the file and retry 'kibi migrate'.",
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
config: parsed,
|
|
78
|
-
configPath,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
83
|
-
return {
|
|
84
|
-
error: `Invalid .kb/config.json: ${message}. Fix the JSON or re-run 'kibi init'.`,
|
|
87
|
+
error: `Legacy branch attachment for '${result.gitBranch}' requires 'kibi branch migrate --from ${result.kbBranch} --to ${result.gitBranch} --apply' before schema migration.`,
|
|
85
88
|
};
|
|
86
89
|
}
|
|
90
|
+
return { branch: result.kbBranch, warnings: [] };
|
|
87
91
|
}
|
|
88
92
|
function writeJsonAtomically(filePath, value) {
|
|
89
93
|
writeTextAtomically(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
@@ -107,7 +111,7 @@ function buildMigrationAuditRecord(args) {
|
|
|
107
111
|
return {
|
|
108
112
|
auditVersion: MIGRATION_AUDIT_VERSION,
|
|
109
113
|
branch: args.branch,
|
|
110
|
-
|
|
114
|
+
manifestPath: args.manifestPath,
|
|
111
115
|
fromVersion: args.fromVersion,
|
|
112
116
|
migratedAt: args.migratedAt,
|
|
113
117
|
semanticAdvisorBackfill: args.semanticAdvisorBackfill,
|
|
@@ -115,6 +119,7 @@ function buildMigrationAuditRecord(args) {
|
|
|
115
119
|
symbolGranularityLegacyLinks: args.symbolGranularityLegacyLinks,
|
|
116
120
|
toVersion: LATEST_KB_SCHEMA_VERSION,
|
|
117
121
|
warning: args.warning,
|
|
122
|
+
steps: args.steps,
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
125
|
function normalizeSemanticAdvisorBackfill(value) {
|
|
@@ -203,13 +208,8 @@ function addLegacyReasonsToManifestText(content, symbolIds) {
|
|
|
203
208
|
return output.join("\n");
|
|
204
209
|
}
|
|
205
210
|
function migrateSymbolGranularity(options) {
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
return { count: 0, manifestPath: null };
|
|
209
|
-
}
|
|
210
|
-
const manifestPath = path.isAbsolute(configuredSymbolsPath)
|
|
211
|
-
? configuredSymbolsPath
|
|
212
|
-
: path.join(options.cwd, configuredSymbolsPath);
|
|
211
|
+
const manifestPath = options.manifestPath ??
|
|
212
|
+
path.join(options.cwd, CANONICAL_ENTITY_PATHS.symbols);
|
|
213
213
|
if (!existsSync(manifestPath)) {
|
|
214
214
|
return { count: 0, manifestPath };
|
|
215
215
|
}
|
|
@@ -263,100 +263,253 @@ function migrateSymbolGranularity(options) {
|
|
|
263
263
|
}
|
|
264
264
|
// implements REQ-003
|
|
265
265
|
export async function migrateCommand(options = {}) {
|
|
266
|
-
|
|
266
|
+
if (options.applySafe === true ||
|
|
267
|
+
options.format === "json" ||
|
|
268
|
+
(options.yes !== true && options.dryRun !== true)) {
|
|
269
|
+
return migratePlanCommand(options);
|
|
270
|
+
}
|
|
271
|
+
const cwd = path.resolve(options.workspaceRoot ?? process.cwd());
|
|
267
272
|
const branchResult = resolveMigrationBranch(cwd);
|
|
268
273
|
if ("error" in branchResult) {
|
|
269
274
|
console.error(branchResult.error);
|
|
270
275
|
return { exitCode: 1 };
|
|
271
276
|
}
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
277
|
+
const manifestStatus = readKbManifestStatus(cwd);
|
|
278
|
+
const storagePlan = planLegacyStorageMigration(cwd);
|
|
279
|
+
// Baseline for fresh workspaces driven by the internal plan executor.
|
|
280
|
+
if (options.initializeMissingConfig === true &&
|
|
281
|
+
manifestStatus.state === "missing") {
|
|
282
|
+
writeKbManifest(cwd, defaultKbManifest());
|
|
283
|
+
}
|
|
284
|
+
if (manifestStatus.state === "missing" &&
|
|
285
|
+
storagePlan.moves.length === 0 &&
|
|
286
|
+
storagePlan.legacyConfig === "absent") {
|
|
287
|
+
console.error("Missing .kb/ lifecycle state. Run 'kibi init' to create the canonical layout before migrating.");
|
|
275
288
|
return { exitCode: 1 };
|
|
276
289
|
}
|
|
277
290
|
const { branch, warnings: branchWarnings } = branchResult;
|
|
278
|
-
const
|
|
279
|
-
const
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const
|
|
286
|
-
|
|
291
|
+
const currentManifest = readKbManifest(cwd);
|
|
292
|
+
const legacySchemaVersion = normalizeSchemaVersion(storagePlan.schemaVersion);
|
|
293
|
+
const currentVersion = currentManifest?.schemaVersion ?? legacySchemaVersion;
|
|
294
|
+
const normalizedVersion = normalizeSchemaVersion(currentVersion);
|
|
295
|
+
const configStatus = getSchemaVersionStatus(normalizedVersion === null
|
|
296
|
+
? undefined
|
|
297
|
+
: { schemaVersion: normalizedVersion });
|
|
298
|
+
const needsStorageMigration = storagePlan.moves.length > 0 || storagePlan.legacyConfig !== "absent";
|
|
299
|
+
const needsSchemaUpgrade = configStatus.needsMigration || normalizedVersion === null;
|
|
300
|
+
const migrationWarning = manifestStatus.state === "invalid" || manifestStatus.state === "future"
|
|
301
|
+
? manifestStatus.warning
|
|
287
302
|
: configStatus.warning;
|
|
288
303
|
const warnings = [
|
|
289
304
|
...branchWarnings,
|
|
290
305
|
...(migrationWarning ? [migrationWarning] : []),
|
|
291
306
|
];
|
|
292
307
|
const auditPath = path.join(cwd, ".kb", "migrations", `${branch}.json`);
|
|
293
|
-
const configPathRelative = toRelativePath(cwd, configPath);
|
|
294
|
-
const auditPathRelative = toRelativePath(cwd, auditPath);
|
|
295
308
|
for (const warning of warnings) {
|
|
296
309
|
printWarning(warning);
|
|
297
310
|
}
|
|
311
|
+
if (storagePlan.blockers.length > 0) {
|
|
312
|
+
for (const blocker of storagePlan.blockers) {
|
|
313
|
+
console.error(`Blocked: ${blocker}`);
|
|
314
|
+
}
|
|
315
|
+
return { exitCode: 1 };
|
|
316
|
+
}
|
|
298
317
|
if (configStatus.currentVersion !== null &&
|
|
299
318
|
configStatus.currentVersion > configStatus.latestVersion) {
|
|
300
319
|
console.error(`Unsupported schemaVersion ${configStatus.currentVersion}. Upgrade kibi-cli before migrating this KB.`);
|
|
301
320
|
return { exitCode: 1 };
|
|
302
321
|
}
|
|
303
|
-
if (!
|
|
304
|
-
console.log(`No migration needed:
|
|
322
|
+
if (!needsStorageMigration && !needsSchemaUpgrade) {
|
|
323
|
+
console.log(`No migration needed: the KB is already at schemaVersion ${LATEST_KB_SCHEMA_VERSION} on the canonical .kb/ layout.`);
|
|
305
324
|
if (existsSync(auditPath)) {
|
|
306
|
-
console.log(`Existing migration audit metadata: ${
|
|
325
|
+
console.log(`Existing migration audit metadata: ${toRelativePath(cwd, auditPath)}`);
|
|
326
|
+
}
|
|
327
|
+
if (options.yes === true) {
|
|
328
|
+
updateGitIgnore(cwd);
|
|
307
329
|
}
|
|
308
330
|
return { exitCode: 0 };
|
|
309
331
|
}
|
|
310
|
-
const fromVersionLabel = formatSchemaVersion(
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
dryRun: options.dryRun || !options.yes,
|
|
315
|
-
});
|
|
316
|
-
const semanticAdvisorBackfill = normalizeSemanticAdvisorBackfill(config.semanticAdvisorBackfill) ??
|
|
317
|
-
"pending";
|
|
332
|
+
const fromVersionLabel = formatSchemaVersion(currentVersion, normalizedVersion);
|
|
333
|
+
const migrationSteps = migrationStepsFor(configStatus.currentVersion);
|
|
334
|
+
const symbolGranularityStep = migrationSteps.some((step) => step.id === "symbol-granularity-v2");
|
|
335
|
+
const semanticBackfillStep = migrationSteps.some((step) => step.id === "semantic-backfill-v4");
|
|
318
336
|
if (options.dryRun) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
337
|
+
if (storagePlan.moves.length > 0) {
|
|
338
|
+
console.log(`dry run: would move ${storagePlan.moves.length} legacy knowledge file(s) into .kb/:`);
|
|
339
|
+
for (const move of storagePlan.moves) {
|
|
340
|
+
console.log(` ${move.from} -> ${move.to}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (storagePlan.legacyConfig !== "absent") {
|
|
344
|
+
console.log("dry run: would retire legacy .kb/config.json after moving knowledge into .kb/.");
|
|
323
345
|
}
|
|
324
|
-
|
|
325
|
-
|
|
346
|
+
console.log(`dry run: would set schemaVersion from ${fromVersionLabel} to ${LATEST_KB_SCHEMA_VERSION} in .kb/manifest.json.`);
|
|
347
|
+
if (symbolGranularityStep) {
|
|
348
|
+
const symbolsSource = storagePlan.moves.find((move) => move.to === CANONICAL_ENTITY_PATHS.symbols)?.from ?? CANONICAL_ENTITY_PATHS.symbols;
|
|
349
|
+
const preview = migrateSymbolGranularity({
|
|
350
|
+
cwd,
|
|
351
|
+
dryRun: true,
|
|
352
|
+
manifestPath: path.join(cwd, symbolsSource),
|
|
353
|
+
});
|
|
354
|
+
if (preview.count > 0) {
|
|
355
|
+
console.log(`dry run: would mark ${preview.count} legacy coarse symbol link(s) as legacy-link.`);
|
|
356
|
+
}
|
|
326
357
|
}
|
|
358
|
+
console.log(`dry run: would write migration audit metadata to ${toRelativePath(cwd, auditPath)}.`);
|
|
327
359
|
console.log("Re-run with --yes to apply these changes.");
|
|
328
360
|
return { exitCode: 0 };
|
|
329
361
|
}
|
|
330
362
|
if (!options.yes) {
|
|
331
|
-
printWarning(
|
|
363
|
+
printWarning("Migration required for this repository.");
|
|
332
364
|
console.log("No changes applied.");
|
|
333
365
|
console.log("Use --dry-run to preview or --yes to apply the migration.");
|
|
334
366
|
return { exitCode: 0 };
|
|
335
367
|
}
|
|
336
|
-
|
|
337
|
-
|
|
368
|
+
// One-way storage cutover first: files must reach the canonical layout
|
|
369
|
+
// before the manifest records the new schema generation.
|
|
370
|
+
if (needsStorageMigration) {
|
|
371
|
+
const storageResult = applyLegacyStorageMigration(cwd, storagePlan);
|
|
372
|
+
if (storageResult.movedFiles.length > 0) {
|
|
373
|
+
console.log(`Moved ${storageResult.movedFiles.length} knowledge file(s) into the canonical .kb/ layout.`);
|
|
374
|
+
}
|
|
375
|
+
if (storageResult.retiredLegacyConfig) {
|
|
376
|
+
console.log("Retired legacy .kb/config.json.");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const symbolGranularityMigration = migrateSymbolGranularity({
|
|
380
|
+
cwd,
|
|
381
|
+
dryRun: !symbolGranularityStep || options.dryRun || !options.yes,
|
|
382
|
+
});
|
|
383
|
+
const semanticAdvisorBackfill = normalizeSemanticAdvisorBackfill(readKbManifest(cwd)?.semanticAdvisorBackfill) ??
|
|
384
|
+
normalizeSemanticAdvisorBackfill(storagePlan.semanticAdvisorBackfill) ??
|
|
385
|
+
(semanticBackfillStep || needsStorageMigration
|
|
386
|
+
? "pending"
|
|
387
|
+
: "not_applicable");
|
|
388
|
+
const existingManifest = readKbManifest(cwd) ?? defaultKbManifest();
|
|
389
|
+
writeKbManifest(cwd, {
|
|
390
|
+
...existingManifest,
|
|
338
391
|
schemaVersion: LATEST_KB_SCHEMA_VERSION,
|
|
339
392
|
semanticAdvisorBackfill,
|
|
340
|
-
};
|
|
393
|
+
});
|
|
341
394
|
const migratedAt = new Date().toISOString();
|
|
342
|
-
writeJsonAtomically(configPath, nextConfig);
|
|
343
395
|
writeJsonAtomically(auditPath, buildMigrationAuditRecord({
|
|
344
396
|
branch,
|
|
345
|
-
|
|
397
|
+
manifestPath: KB_MANIFEST_RELATIVE,
|
|
346
398
|
fromVersion: configStatus.currentVersion,
|
|
347
399
|
migratedAt,
|
|
348
400
|
semanticAdvisorBackfill,
|
|
349
401
|
symbolGranularityLegacyLinks: symbolGranularityMigration.count,
|
|
350
402
|
warning: migrationWarning,
|
|
403
|
+
steps: migrationSteps.map((step) => step.id),
|
|
351
404
|
}));
|
|
352
|
-
console.log(`Migrated
|
|
405
|
+
console.log(`Migrated the KB to schemaVersion ${LATEST_KB_SCHEMA_VERSION} on the canonical .kb/ layout (was ${fromVersionLabel}).`);
|
|
353
406
|
if (symbolGranularityMigration.count > 0) {
|
|
354
407
|
console.log(`Marked ${symbolGranularityMigration.count} existing coarse symbol link(s) as legacy-link.`);
|
|
355
408
|
}
|
|
356
409
|
if (semanticAdvisorBackfill === "pending") {
|
|
357
|
-
console.log(`Marked semantic advisor backfill as pending in ${
|
|
410
|
+
console.log(`Marked semantic advisor backfill as pending in ${KB_MANIFEST_RELATIVE}.`);
|
|
358
411
|
}
|
|
359
|
-
console.log(`Wrote migration audit metadata to ${
|
|
412
|
+
console.log(`Wrote migration audit metadata to ${toRelativePath(cwd, auditPath)}.`);
|
|
360
413
|
console.log("Migration complete. Future 'kibi migrate' runs will be a no-op.");
|
|
414
|
+
updateGitIgnore(cwd);
|
|
415
|
+
return { exitCode: 0 };
|
|
416
|
+
}
|
|
417
|
+
const KB_MANIFEST_RELATIVE = ".kb/manifest.json";
|
|
418
|
+
async function buildWorkspaceMigrationPlan(workspaceRoot = process.cwd()) {
|
|
419
|
+
const [{ createCliRuntime }, { executeOperation }, { statusSpec }, { checkSpec }, { coverageSpec }, { mergeMigrationPlans },] = await Promise.all([
|
|
420
|
+
import("../runtime/cli-runtime.js"),
|
|
421
|
+
import("../public/operations/runtime-types.js"),
|
|
422
|
+
import("../public/operations/specs/discovery.js"),
|
|
423
|
+
import("../public/operations/specs/check.js"),
|
|
424
|
+
import("../public/operations/specs/reporting.js"),
|
|
425
|
+
import("../public/operations/migration-plan.js"),
|
|
426
|
+
]);
|
|
427
|
+
const runtime = createCliRuntime({ workspaceRoot });
|
|
428
|
+
const statusResult = await executeOperation(runtime, statusSpec, {});
|
|
429
|
+
const status = statusResult.structuredContent;
|
|
430
|
+
const plans = [];
|
|
431
|
+
if (status?.migrationPlan !== undefined)
|
|
432
|
+
plans.push(status.migrationPlan);
|
|
433
|
+
const storeHealthy = status?.branchStore?.state === "healthy";
|
|
434
|
+
const schemaCurrent = status?.schemaStatus?.needsMigration !== true;
|
|
435
|
+
if (storeHealthy &&
|
|
436
|
+
schemaCurrent &&
|
|
437
|
+
status?.branchAttachment?.kind === "exact") {
|
|
438
|
+
const checkResult = await executeOperation(runtime, checkSpec, {});
|
|
439
|
+
if (checkResult.structuredContent?.migrationPlan !== undefined) {
|
|
440
|
+
plans.push(checkResult.structuredContent.migrationPlan);
|
|
441
|
+
}
|
|
442
|
+
const coverageInputs = [
|
|
443
|
+
{ by: "req", limit: 10_000, offset: 0 },
|
|
444
|
+
{ by: "symbol", limit: 10_000, offset: 0 },
|
|
445
|
+
];
|
|
446
|
+
for (const input of coverageInputs) {
|
|
447
|
+
const coverageResult = await executeOperation(runtime, coverageSpec, input);
|
|
448
|
+
if (coverageResult.structuredContent?.migrationPlan !== undefined) {
|
|
449
|
+
plans.push(coverageResult.structuredContent.migrationPlan);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (plans.length === 0) {
|
|
454
|
+
const { buildMigrationPlan } = await import("../public/operations/migration-plan.js");
|
|
455
|
+
return buildMigrationPlan({
|
|
456
|
+
evaluatedDomains: ["package", "branch", "storage", "schema"],
|
|
457
|
+
incompleteDomains: ["status"],
|
|
458
|
+
diagnostics: [
|
|
459
|
+
"Unable to assemble downstream migration domains from the current workspace state.",
|
|
460
|
+
],
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
return mergeMigrationPlans(plans);
|
|
464
|
+
}
|
|
465
|
+
async function migratePlanCommand(options) {
|
|
466
|
+
const workspaceRoot = path.resolve(options.workspaceRoot ?? process.cwd());
|
|
467
|
+
const plan = await buildWorkspaceMigrationPlan(workspaceRoot);
|
|
468
|
+
if (options.applySafe === true) {
|
|
469
|
+
if (!options.approvedPlanHash) {
|
|
470
|
+
console.error("--apply-safe requires --approved-plan-hash <sha256>.");
|
|
471
|
+
return { exitCode: 2 };
|
|
472
|
+
}
|
|
473
|
+
if (options.approvedPlanHash !== plan.planHash) {
|
|
474
|
+
console.error("Migration plan changed; regenerate the plan and approve its current hash.");
|
|
475
|
+
return { exitCode: 2 };
|
|
476
|
+
}
|
|
477
|
+
const approvedActionIds = options.approvedActionIds && options.approvedActionIds.length > 0
|
|
478
|
+
? options.approvedActionIds
|
|
479
|
+
: plan.actions
|
|
480
|
+
.filter((action) => action.state === "ready" && action.autoApplicable)
|
|
481
|
+
.map((action) => action.id);
|
|
482
|
+
if (approvedActionIds.length === 0) {
|
|
483
|
+
console.log("No approved automatic migration actions are ready.");
|
|
484
|
+
return { exitCode: 0 };
|
|
485
|
+
}
|
|
486
|
+
const [{ createCliRuntime }, { executeOperation }, { applyPlanSpec }] = await Promise.all([
|
|
487
|
+
import("../runtime/cli-runtime.js"),
|
|
488
|
+
import("../public/operations/runtime-types.js"),
|
|
489
|
+
import("../public/operations/specs/planning.js"),
|
|
490
|
+
]);
|
|
491
|
+
const result = await executeOperation(createCliRuntime({ workspaceRoot }), applyPlanSpec, { plan, approvedPlanHash: options.approvedPlanHash, approvedActionIds });
|
|
492
|
+
if (options.format === "json") {
|
|
493
|
+
console.log(JSON.stringify(result, null, 2));
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
console.log(result.content[0]?.text ?? "Migration applied.");
|
|
497
|
+
console.log(JSON.stringify(result.structuredContent, null, 2));
|
|
498
|
+
}
|
|
499
|
+
return {
|
|
500
|
+
exitCode: result.structuredContent?.outcome === "applied" ? 0 : 1,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
if (options.format === "json") {
|
|
504
|
+
console.log(JSON.stringify(plan, null, 2));
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
console.log(`Migration plan ${plan.planHash}`);
|
|
508
|
+
console.log(`Status: ${plan.status}; actions: ${plan.summary.actionCount}; automatic-ready: ${plan.actions.filter((action) => action.state === "ready" && action.autoApplicable).length}`);
|
|
509
|
+
for (const action of plan.actions) {
|
|
510
|
+
console.log(`- ${action.state} ${action.safety} ${action.code}: ${action.id}`);
|
|
511
|
+
}
|
|
512
|
+
console.log("Use --format json for structured actions, or --apply-safe with the approved plan hash.");
|
|
513
|
+
}
|
|
361
514
|
return { exitCode: 0 };
|
|
362
515
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type HtmlReportCoverage } from "../report/html-report.js";
|
|
2
|
+
import { type ReportRepository } from "../report/repository.js";
|
|
3
|
+
export type ReportOptions = Readonly<{
|
|
4
|
+
output?: string;
|
|
5
|
+
open?: boolean;
|
|
6
|
+
tag?: string;
|
|
7
|
+
limit?: string;
|
|
8
|
+
}>;
|
|
9
|
+
type ReportCoverage = Readonly<{
|
|
10
|
+
requirements: HtmlReportCoverage;
|
|
11
|
+
symbols: HtmlReportCoverage;
|
|
12
|
+
branch: string;
|
|
13
|
+
}>;
|
|
14
|
+
export type ReportCommandDeps = Readonly<{
|
|
15
|
+
loadCoverage?: (tags: readonly string[], limit: number) => Promise<ReportCoverage>;
|
|
16
|
+
openReport?: (filePath: string) => Promise<void>;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
cwd?: () => string;
|
|
19
|
+
repository?: ReportRepository;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function openReport(filePath: string): Promise<void>;
|
|
22
|
+
export declare function reportCommand(options: ReportOptions, deps?: ReportCommandDeps): Promise<string>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,gBAAgB,EAEtB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,KAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,YAAY,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,YAAY,CAAC,EAAE,CACb,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B,CAAC,CAAC;AA4HH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhE;AAeD,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAyEjB"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { coverageSpec } from "../public/operations/specs/reporting.js";
|
|
7
|
+
import { KIBI_BRAND, renderKibiBadge } from "../report/brand.js";
|
|
8
|
+
import { renderHtmlReport, } from "../report/html-report.js";
|
|
9
|
+
import { resolveReportRepository, } from "../report/repository.js";
|
|
10
|
+
import { createCliRuntime } from "../runtime/cli-runtime.js";
|
|
11
|
+
import { listGitRemotes } from "./github-init.js";
|
|
12
|
+
function gitCommitSha(cwd) {
|
|
13
|
+
try {
|
|
14
|
+
const sha = execFileSync("git", ["-C", cwd, "rev-parse", "HEAD"], {
|
|
15
|
+
encoding: "utf8",
|
|
16
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
17
|
+
}).trim();
|
|
18
|
+
return /^[0-9a-f]{7,64}$/i.test(sha) ? sha : undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function loadReportRepository(cwd, branch) {
|
|
25
|
+
const commitSha = gitCommitSha(cwd);
|
|
26
|
+
return resolveReportRepository({
|
|
27
|
+
remotes: listGitRemotes(cwd),
|
|
28
|
+
...(commitSha ? { commitSha } : {}),
|
|
29
|
+
branch,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function parseTags(value) {
|
|
33
|
+
return (value ?? "")
|
|
34
|
+
.split(",")
|
|
35
|
+
.map((item) => item.trim())
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
}
|
|
38
|
+
function parseLimit(value) {
|
|
39
|
+
const raw = (value ?? "10000").trim();
|
|
40
|
+
const limit = /^\d+$/.test(raw) ? Number(raw) : Number.NaN;
|
|
41
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100_000) {
|
|
42
|
+
throw new Error("Report limit must be an integer between 1 and 100000");
|
|
43
|
+
}
|
|
44
|
+
return limit;
|
|
45
|
+
}
|
|
46
|
+
function reportTarget(root, output) {
|
|
47
|
+
const requested = output?.trim() || "kibi-report";
|
|
48
|
+
const absolute = path.resolve(root, requested);
|
|
49
|
+
return [".html", ".htm"].includes(path.extname(absolute).toLowerCase())
|
|
50
|
+
? absolute
|
|
51
|
+
: path.join(absolute, "index.html");
|
|
52
|
+
}
|
|
53
|
+
async function executeCoverageInContext(context, tags, limit) {
|
|
54
|
+
const requirements = await coverageSpec.execute({
|
|
55
|
+
by: "req",
|
|
56
|
+
tags,
|
|
57
|
+
includePassing: true,
|
|
58
|
+
includeTransitive: true,
|
|
59
|
+
limit,
|
|
60
|
+
offset: 0,
|
|
61
|
+
}, context);
|
|
62
|
+
const symbols = await coverageSpec.execute({
|
|
63
|
+
by: "symbol",
|
|
64
|
+
tags,
|
|
65
|
+
includePassing: false,
|
|
66
|
+
includeTransitive: true,
|
|
67
|
+
// Only the complete summary is needed for the unowned-code metric.
|
|
68
|
+
limit: 0,
|
|
69
|
+
offset: 0,
|
|
70
|
+
}, context);
|
|
71
|
+
if (!requirements.structuredContent || !symbols.structuredContent) {
|
|
72
|
+
throw new Error("Coverage did not return structured report data");
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
requirements: requirements.structuredContent,
|
|
76
|
+
symbols: symbols.structuredContent,
|
|
77
|
+
branch: context.branchAttachment?.gitBranch ??
|
|
78
|
+
String(requirements.structuredContent.meta?.branch ?? "unknown"),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function loadCoverage(tags, limit) {
|
|
82
|
+
const runtime = createCliRuntime();
|
|
83
|
+
const runtimeSpec = coverageSpec;
|
|
84
|
+
const context = await runtime.open(runtimeSpec);
|
|
85
|
+
let result;
|
|
86
|
+
try {
|
|
87
|
+
result = await executeCoverageInContext(context, tags, limit);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
await runtime.close(context, { status: "error", error });
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
await runtime.close(context, { status: "success", result });
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
async function writeAtomically(filePath, contents) {
|
|
97
|
+
const directory = path.dirname(filePath);
|
|
98
|
+
const temporaryPath = path.join(directory, `.${path.basename(filePath)}.${randomUUID()}.tmp`);
|
|
99
|
+
await mkdir(directory, { recursive: true });
|
|
100
|
+
try {
|
|
101
|
+
await writeFile(temporaryPath, contents, "utf8");
|
|
102
|
+
await rename(temporaryPath, filePath);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
await rm(temporaryPath, { force: true });
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function openReport(filePath) {
|
|
110
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
111
|
+
const [command, args] = process.platform === "darwin"
|
|
112
|
+
? ["open", [fileUrl]]
|
|
113
|
+
: process.platform === "win32"
|
|
114
|
+
? ["rundll32", ["url.dll,FileProtocolHandler", fileUrl]]
|
|
115
|
+
: ["xdg-open", [fileUrl]];
|
|
116
|
+
await new Promise((resolve, reject) => {
|
|
117
|
+
const child = spawn(command, args, {
|
|
118
|
+
detached: true,
|
|
119
|
+
stdio: "ignore",
|
|
120
|
+
});
|
|
121
|
+
child.once("error", reject);
|
|
122
|
+
child.once("spawn", () => {
|
|
123
|
+
child.unref();
|
|
124
|
+
resolve();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function assertCompleteRequirementRows(coverage, limit) {
|
|
129
|
+
const total = Number(coverage.summary.total ?? 0);
|
|
130
|
+
if (Number.isFinite(total) && coverage.rows.length < total) {
|
|
131
|
+
throw new Error(`Report requires complete requirement rows, but ${coverage.rows.length} of ${total} were returned. Increase --limit above ${limit}.`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// implements REQ-kibi-html-health-report
|
|
135
|
+
export async function reportCommand(options, deps = {}) {
|
|
136
|
+
const limit = parseLimit(options.limit);
|
|
137
|
+
const tags = parseTags(options.tag);
|
|
138
|
+
const coverage = await (deps.loadCoverage ?? loadCoverage)(tags, limit);
|
|
139
|
+
assertCompleteRequirementRows(coverage.requirements, limit);
|
|
140
|
+
const now = (deps.now ?? (() => new Date()))();
|
|
141
|
+
const workspace = (deps.cwd ?? (() => process.cwd()))();
|
|
142
|
+
const html = renderHtmlReport({
|
|
143
|
+
requirements: coverage.requirements,
|
|
144
|
+
symbols: coverage.symbols,
|
|
145
|
+
branch: coverage.branch,
|
|
146
|
+
generatedAt: now,
|
|
147
|
+
repository: deps.repository ?? loadReportRepository(workspace, coverage.branch),
|
|
148
|
+
});
|
|
149
|
+
const outputPath = reportTarget(workspace, options.output);
|
|
150
|
+
const requestedOutput = options.output?.trim() || "kibi-report";
|
|
151
|
+
const outputIsHtmlFile = [".html", ".htm"].includes(path.extname(requestedOutput).toLowerCase());
|
|
152
|
+
const badgePath = outputIsHtmlFile
|
|
153
|
+
? path.join(path.dirname(outputPath), `${path.basename(outputPath, path.extname(outputPath))}.badge.svg`)
|
|
154
|
+
: path.join(path.dirname(outputPath), "badge.svg");
|
|
155
|
+
const summary = coverage.requirements.summary;
|
|
156
|
+
const total = Number(summary.total ?? 0);
|
|
157
|
+
const notApplicable = Number(summary.proofNotApplicable ?? 0);
|
|
158
|
+
const proven = Number(summary.proofProven ?? 0);
|
|
159
|
+
const currentRequirements = Math.max(0, total - notApplicable);
|
|
160
|
+
const proofPercent = currentRequirements === 0
|
|
161
|
+
? 0
|
|
162
|
+
: Math.round((proven / currentRequirements) * 100);
|
|
163
|
+
const hasContradiction = coverage.requirements.rows.some((row) => Array.isArray(row.proofGaps) &&
|
|
164
|
+
row.proofGaps.includes("blocking_contradiction"));
|
|
165
|
+
const snapshotStale = coverage.requirements.meta?.dirty === true ||
|
|
166
|
+
coverage.requirements.meta?.verificationSnapshotDirty === true;
|
|
167
|
+
const badgeMessage = currentRequirements === 0 ? "no requirements" : `${proofPercent}% proven`;
|
|
168
|
+
const badgeColor = currentRequirements === 0
|
|
169
|
+
? KIBI_BRAND.rail
|
|
170
|
+
: hasContradiction
|
|
171
|
+
? KIBI_BRAND.danger
|
|
172
|
+
: snapshotStale
|
|
173
|
+
? KIBI_BRAND.warning
|
|
174
|
+
: proofPercent === 100
|
|
175
|
+
? KIBI_BRAND.success
|
|
176
|
+
: proofPercent >= 90
|
|
177
|
+
? KIBI_BRAND.signal
|
|
178
|
+
: proofPercent >= 70
|
|
179
|
+
? KIBI_BRAND.warning
|
|
180
|
+
: KIBI_BRAND.danger;
|
|
181
|
+
const badge = renderKibiBadge(badgeMessage, badgeColor);
|
|
182
|
+
await writeAtomically(outputPath, html);
|
|
183
|
+
await writeAtomically(badgePath, badge);
|
|
184
|
+
console.log(`Kibi report written to ${outputPath}`);
|
|
185
|
+
console.log(`Kibi badge written to ${badgePath}`);
|
|
186
|
+
if (options.open === true) {
|
|
187
|
+
await (deps.openReport ?? openReport)(outputPath);
|
|
188
|
+
console.log("Opened Kibi report in the default browser");
|
|
189
|
+
}
|
|
190
|
+
return outputPath;
|
|
191
|
+
}
|