kibi-cli 0.19.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. package/dist/cli-errors.d.ts +3 -1
  2. package/dist/cli-errors.d.ts.map +1 -1
  3. package/dist/cli-errors.js +4 -1
  4. package/dist/cli-json-command.d.ts +1 -0
  5. package/dist/cli-json-command.d.ts.map +1 -1
  6. package/dist/cli-json-command.js +13 -4
  7. package/dist/cli-operation-loader.d.ts.map +1 -1
  8. package/dist/cli-operation-loader.js +53 -20
  9. package/dist/cli-operation-metadata.d.ts +21 -8
  10. package/dist/cli-operation-metadata.d.ts.map +1 -1
  11. package/dist/cli-operation-metadata.js +27 -10
  12. package/dist/cli-protocol.d.ts.map +1 -1
  13. package/dist/cli-protocol.js +38 -8
  14. package/dist/cli-register-foundation.d.ts.map +1 -1
  15. package/dist/cli-register-foundation.js +14 -2
  16. package/dist/cli-register-maintenance.d.ts.map +1 -1
  17. package/dist/cli-register-maintenance.js +33 -4
  18. package/dist/cli-register-proof.d.ts +3 -0
  19. package/dist/cli-register-proof.d.ts.map +1 -0
  20. package/dist/cli-register-proof.js +103 -0
  21. package/dist/cli-register-reporting.d.ts.map +1 -1
  22. package/dist/cli-register-reporting.js +11 -0
  23. package/dist/cli.d.ts +4 -0
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +17 -8
  26. package/dist/commands/aggregated-checks.d.ts +1 -2
  27. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  28. package/dist/commands/aggregated-checks.js +14 -9
  29. package/dist/commands/branch.d.ts +37 -0
  30. package/dist/commands/branch.d.ts.map +1 -1
  31. package/dist/commands/branch.js +375 -40
  32. package/dist/commands/check.d.ts +14 -0
  33. package/dist/commands/check.d.ts.map +1 -1
  34. package/dist/commands/check.js +209 -110
  35. package/dist/commands/coverage.d.ts +1 -0
  36. package/dist/commands/coverage.d.ts.map +1 -1
  37. package/dist/commands/coverage.js +6 -0
  38. package/dist/commands/discovery-shared.d.ts.map +1 -1
  39. package/dist/commands/discovery-shared.js +10 -19
  40. package/dist/commands/doctor.d.ts +26 -1
  41. package/dist/commands/doctor.d.ts.map +1 -1
  42. package/dist/commands/doctor.js +291 -30
  43. package/dist/commands/engine.d.ts +12 -0
  44. package/dist/commands/engine.d.ts.map +1 -1
  45. package/dist/commands/engine.js +50 -7
  46. package/dist/commands/gc.d.ts +5 -2
  47. package/dist/commands/gc.d.ts.map +1 -1
  48. package/dist/commands/gc.js +140 -71
  49. package/dist/commands/github-init.d.ts +57 -0
  50. package/dist/commands/github-init.d.ts.map +1 -0
  51. package/dist/commands/github-init.js +314 -0
  52. package/dist/commands/init-helpers.d.ts +1 -1
  53. package/dist/commands/init-helpers.d.ts.map +1 -1
  54. package/dist/commands/init-helpers.js +109 -28
  55. package/dist/commands/init.d.ts +2 -0
  56. package/dist/commands/init.d.ts.map +1 -1
  57. package/dist/commands/init.js +79 -24
  58. package/dist/commands/legacy-storage-migration.d.ts +54 -0
  59. package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
  60. package/dist/commands/legacy-storage-migration.js +277 -0
  61. package/dist/commands/migrate.d.ts +11 -0
  62. package/dist/commands/migrate.d.ts.map +1 -1
  63. package/dist/commands/migrate.js +249 -96
  64. package/dist/commands/proof-migrate-legacy.d.ts +7 -0
  65. package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
  66. package/dist/commands/proof-migrate-legacy.js +45 -0
  67. package/dist/commands/proof-prune.d.ts +8 -0
  68. package/dist/commands/proof-prune.d.ts.map +1 -0
  69. package/dist/commands/proof-prune.js +53 -0
  70. package/dist/commands/prove.d.ts +37 -0
  71. package/dist/commands/prove.d.ts.map +1 -0
  72. package/dist/commands/prove.js +470 -0
  73. package/dist/commands/report.d.ts +24 -0
  74. package/dist/commands/report.d.ts.map +1 -0
  75. package/dist/commands/report.js +191 -0
  76. package/dist/commands/sync/cache.d.ts +16 -3
  77. package/dist/commands/sync/cache.d.ts.map +1 -1
  78. package/dist/commands/sync/cache.js +111 -4
  79. package/dist/commands/sync/discovery.d.ts +26 -2
  80. package/dist/commands/sync/discovery.d.ts.map +1 -1
  81. package/dist/commands/sync/discovery.js +204 -15
  82. package/dist/commands/sync/extraction.d.ts +8 -1
  83. package/dist/commands/sync/extraction.d.ts.map +1 -1
  84. package/dist/commands/sync/extraction.js +38 -4
  85. package/dist/commands/sync/manifest.d.ts +9 -6
  86. package/dist/commands/sync/manifest.d.ts.map +1 -1
  87. package/dist/commands/sync/manifest.js +195 -60
  88. package/dist/commands/sync/persistence.d.ts +4 -1
  89. package/dist/commands/sync/persistence.d.ts.map +1 -1
  90. package/dist/commands/sync/persistence.js +26 -12
  91. package/dist/commands/sync/staging.d.ts +1 -0
  92. package/dist/commands/sync/staging.d.ts.map +1 -1
  93. package/dist/commands/sync/staging.js +5 -2
  94. package/dist/commands/sync/untracked-targets.d.ts +24 -0
  95. package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
  96. package/dist/commands/sync/untracked-targets.js +108 -0
  97. package/dist/commands/sync.d.ts +17 -1
  98. package/dist/commands/sync.d.ts.map +1 -1
  99. package/dist/commands/sync.js +375 -106
  100. package/dist/diagnostics.d.ts +1 -1
  101. package/dist/diagnostics.d.ts.map +1 -1
  102. package/dist/engine-daemon.d.ts +3 -1
  103. package/dist/engine-daemon.d.ts.map +1 -1
  104. package/dist/engine-daemon.js +49 -20
  105. package/dist/engine.d.ts +34 -3
  106. package/dist/engine.d.ts.map +1 -1
  107. package/dist/engine.js +578 -42
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/env.js +5 -6
  110. package/dist/extractors/manifest.d.ts +13 -1
  111. package/dist/extractors/manifest.d.ts.map +1 -1
  112. package/dist/extractors/manifest.js +97 -10
  113. package/dist/extractors/markdown.d.ts +5 -2
  114. package/dist/extractors/markdown.d.ts.map +1 -1
  115. package/dist/extractors/markdown.js +47 -12
  116. package/dist/extractors/playwright-cases.d.ts +24 -0
  117. package/dist/extractors/playwright-cases.d.ts.map +1 -0
  118. package/dist/extractors/playwright-cases.js +126 -0
  119. package/dist/extractors/relationships.d.ts +6 -0
  120. package/dist/extractors/relationships.d.ts.map +1 -1
  121. package/dist/extractors/relationships.js +2 -1
  122. package/dist/extractors/symbol-coordinates.d.ts +81 -3
  123. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  124. package/dist/extractors/symbol-coordinates.js +389 -51
  125. package/dist/extractors/symbols-coordinator.js +11 -1
  126. package/dist/extractors/symbols-ts.d.ts +1 -0
  127. package/dist/extractors/symbols-ts.d.ts.map +1 -1
  128. package/dist/extractors/symbols-ts.js +142 -67
  129. package/dist/intent-search.d.ts +61 -0
  130. package/dist/intent-search.d.ts.map +1 -0
  131. package/dist/intent-search.js +437 -0
  132. package/dist/logic/ir.d.ts +1 -0
  133. package/dist/logic/ir.d.ts.map +1 -1
  134. package/dist/logic/ir.js +1 -1
  135. package/dist/operations/bootstrap/activation.d.ts +5 -0
  136. package/dist/operations/bootstrap/activation.d.ts.map +1 -0
  137. package/dist/operations/{autopilot → bootstrap}/activation.js +58 -33
  138. package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
  139. package/dist/operations/bootstrap/candidates.d.ts +4 -0
  140. package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
  141. package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
  142. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
  143. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
  144. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
  145. package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
  146. package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
  147. package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
  148. package/dist/operations/bootstrap/generate.d.ts +9 -0
  149. package/dist/operations/bootstrap/generate.d.ts.map +1 -0
  150. package/dist/operations/bootstrap/generate.js +207 -0
  151. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
  152. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
  153. package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
  154. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +3 -2
  155. package/dist/operations/bootstrap/guidance.d.ts.map +1 -0
  156. package/dist/operations/{autopilot → bootstrap}/guidance.js +3 -1
  157. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
  158. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
  159. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
  160. package/dist/operations/bootstrap/presentation.d.ts +15 -0
  161. package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
  162. package/dist/operations/bootstrap/presentation.js +177 -0
  163. package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
  164. package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
  165. package/dist/operations/bootstrap/types.d.ts.map +1 -0
  166. package/dist/operations/bootstrap/types.js +25 -0
  167. package/dist/operations/modeling/model-requirement.d.ts +5 -0
  168. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  169. package/dist/operations/modeling/model-requirement.js +57 -63
  170. package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
  171. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
  172. package/dist/operations/modeling/predicate-applicability.js +375 -0
  173. package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
  174. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  175. package/dist/operations/modeling/predicate-applyplan.js +100 -3
  176. package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
  177. package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
  178. package/dist/operations/modeling/predicate-bindings.js +122 -0
  179. package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
  180. package/dist/operations/modeling/predicate-catalog-2.js +18 -2
  181. package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
  182. package/dist/operations/modeling/predicate-catalog-3.js +17 -1
  183. package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
  184. package/dist/operations/modeling/predicate-catalog-4.js +155 -0
  185. package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
  186. package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
  187. package/dist/operations/modeling/predicate-catalog-5.js +291 -0
  188. package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
  189. package/dist/operations/modeling/predicate-catalog.js +4 -0
  190. package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
  191. package/dist/operations/modeling/predicate-inference-1.js +8 -0
  192. package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
  193. package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
  194. package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
  195. package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
  196. package/dist/operations/modeling/predicate-inference.js +4 -0
  197. package/dist/operations/modeling/predicate-loader.d.ts +1 -0
  198. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  199. package/dist/operations/modeling/predicate-loader.js +11 -3
  200. package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
  201. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  202. package/dist/operations/modeling/predicate-ranker.js +159 -24
  203. package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
  204. package/dist/operations/modeling/predicate-score-3.js +6 -0
  205. package/dist/operations/modeling/predicate-types.d.ts +35 -1
  206. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  207. package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
  208. package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
  209. package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
  210. package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
  211. package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
  212. package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
  213. package/dist/operations/modeling/predicate-utils.js +2 -0
  214. package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
  215. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  216. package/dist/operations/modeling/suggest-predicates.js +203 -32
  217. package/dist/operations/mutation/contradictions.d.ts +2 -1
  218. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  219. package/dist/operations/mutation/contradictions.js +26 -5
  220. package/dist/operations/mutation/delete.d.ts +3 -0
  221. package/dist/operations/mutation/delete.d.ts.map +1 -1
  222. package/dist/operations/mutation/delete.js +483 -19
  223. package/dist/operations/mutation/entity-projection.d.ts +11 -0
  224. package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
  225. package/dist/operations/mutation/entity-projection.js +14 -0
  226. package/dist/operations/mutation/relationships.d.ts +11 -0
  227. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  228. package/dist/operations/mutation/relationships.js +77 -5
  229. package/dist/operations/mutation/saga.d.ts +51 -0
  230. package/dist/operations/mutation/saga.d.ts.map +1 -0
  231. package/dist/operations/mutation/saga.js +67 -0
  232. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  233. package/dist/operations/mutation/serialization.js +3 -1
  234. package/dist/operations/mutation/source-authoring.d.ts +65 -0
  235. package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
  236. package/dist/operations/mutation/source-authoring.js +576 -0
  237. package/dist/operations/mutation/strict-fact.d.ts +1 -0
  238. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  239. package/dist/operations/mutation/strict-fact.js +8 -5
  240. package/dist/operations/mutation/symbol-compiler-lock.d.ts +54 -0
  241. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
  242. package/dist/operations/mutation/symbol-compiler-lock.js +337 -0
  243. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  244. package/dist/operations/mutation/symbol-granularity.js +35 -4
  245. package/dist/operations/mutation/symbol-refresh.d.ts +19 -1
  246. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  247. package/dist/operations/mutation/symbol-refresh.js +227 -63
  248. package/dist/operations/mutation/types.d.ts +57 -1
  249. package/dist/operations/mutation/types.d.ts.map +1 -1
  250. package/dist/operations/mutation/upsert.d.ts +18 -2
  251. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  252. package/dist/operations/mutation/upsert.js +403 -32
  253. package/dist/operations/mutation/validate-upsert.js +2 -2
  254. package/dist/operations/mutation/validation.d.ts.map +1 -1
  255. package/dist/operations/mutation/validation.js +47 -4
  256. package/dist/operations/mutation/warnings.d.ts +1 -0
  257. package/dist/operations/mutation/warnings.d.ts.map +1 -1
  258. package/dist/operations/mutation/warnings.js +7 -5
  259. package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
  260. package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
  261. package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
  262. package/dist/operations/planning/apply-plan.d.ts +19 -0
  263. package/dist/operations/planning/apply-plan.d.ts.map +1 -0
  264. package/dist/operations/planning/apply-plan.js +1514 -0
  265. package/dist/operations/planning/compile-intent.d.ts +108 -0
  266. package/dist/operations/planning/compile-intent.d.ts.map +1 -0
  267. package/dist/operations/planning/compile-intent.js +618 -0
  268. package/dist/operations/proof/ingest-proof.d.ts +34 -0
  269. package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
  270. package/dist/operations/proof/ingest-proof.js +307 -0
  271. package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
  272. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
  273. package/dist/operations/proof/migrate-legacy-receipts.js +88 -0
  274. package/dist/operations/proof/prune-receipts.d.ts +35 -0
  275. package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
  276. package/dist/operations/proof/prune-receipts.js +91 -0
  277. package/dist/operations/proof/receipt-document.d.ts +29 -0
  278. package/dist/operations/proof/receipt-document.d.ts.map +1 -0
  279. package/dist/operations/proof/receipt-document.js +117 -0
  280. package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
  281. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  282. package/dist/operations/semantic-advisor/analyze-prose.js +52 -28
  283. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  284. package/dist/operations/semantic-advisor/clauses.js +35 -9
  285. package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
  286. package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
  287. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
  288. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
  289. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
  290. package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
  291. package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
  292. package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
  293. package/dist/operations/semantic-advisor/types.d.ts +13 -5
  294. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  295. package/dist/prolog/codec.d.ts +13 -1
  296. package/dist/prolog/codec.d.ts.map +1 -1
  297. package/dist/prolog/codec.js +269 -153
  298. package/dist/prolog/error-terms.d.ts +47 -0
  299. package/dist/prolog/error-terms.d.ts.map +1 -0
  300. package/dist/prolog/error-terms.js +334 -0
  301. package/dist/prolog/janitor.d.ts +50 -0
  302. package/dist/prolog/janitor.d.ts.map +1 -0
  303. package/dist/prolog/janitor.js +154 -0
  304. package/dist/prolog/store-lock.d.ts +45 -0
  305. package/dist/prolog/store-lock.d.ts.map +1 -0
  306. package/dist/prolog/store-lock.js +195 -0
  307. package/dist/prolog.d.ts +7 -0
  308. package/dist/prolog.d.ts.map +1 -1
  309. package/dist/prolog.js +82 -25
  310. package/dist/proof/evaluate.d.ts +27 -0
  311. package/dist/proof/evaluate.d.ts.map +1 -0
  312. package/dist/proof/evaluate.js +151 -0
  313. package/dist/proof/inspect.d.ts +12 -0
  314. package/dist/proof/inspect.d.ts.map +1 -0
  315. package/dist/proof/inspect.js +236 -0
  316. package/dist/proof/integrations.d.ts +35 -0
  317. package/dist/proof/integrations.d.ts.map +1 -0
  318. package/dist/proof/integrations.js +123 -0
  319. package/dist/proof/producers/junit-adapter.d.ts +26 -0
  320. package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
  321. package/dist/proof/producers/junit-adapter.js +186 -0
  322. package/dist/proof/producers/playwright-case-id.d.ts +8 -0
  323. package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
  324. package/dist/proof/producers/playwright-case-id.js +25 -0
  325. package/dist/proof/producers/playwright-reporter.d.ts +27 -0
  326. package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
  327. package/dist/proof/producers/playwright-reporter.js +138 -0
  328. package/dist/proof/producers/tap-adapter.d.ts +10 -0
  329. package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
  330. package/dist/proof/producers/tap-adapter.js +200 -0
  331. package/dist/proof/receipt-outcome.d.ts +2 -0
  332. package/dist/proof/receipt-outcome.d.ts.map +1 -0
  333. package/dist/proof/receipt-outcome.js +1 -0
  334. package/dist/public/branch-resolver.d.ts +1 -0
  335. package/dist/public/branch-resolver.d.ts.map +1 -1
  336. package/dist/public/branch-resolver.js +1 -0
  337. package/dist/public/check-types.d.ts +2 -2
  338. package/dist/public/check-types.d.ts.map +1 -1
  339. package/dist/public/check-types.js +16 -16
  340. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  341. package/dist/public/diagnostic-usage.js +74 -6
  342. package/dist/public/distribution-parity.d.ts +7 -1
  343. package/dist/public/distribution-parity.d.ts.map +1 -1
  344. package/dist/public/distribution-parity.js +15 -9
  345. package/dist/public/ignore-policy.d.ts.map +1 -1
  346. package/dist/public/ignore-policy.js +16 -4
  347. package/dist/public/impact/coverage-depth-quality.d.ts +7 -1
  348. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  349. package/dist/public/impact/coverage-depth-quality.js +22 -4
  350. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  351. package/dist/public/impact/diagnostics.js +2 -2
  352. package/dist/public/impact/diff-meaning.d.ts +1 -0
  353. package/dist/public/impact/diff-meaning.d.ts.map +1 -1
  354. package/dist/public/impact/diff-meaning.js +5 -2
  355. package/dist/public/impact/full-kb-quality.d.ts +7 -2
  356. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  357. package/dist/public/impact/full-kb-quality.js +364 -39
  358. package/dist/public/impact/manifest.d.ts.map +1 -1
  359. package/dist/public/impact/manifest.js +2 -5
  360. package/dist/public/operational-artifacts.d.ts.map +1 -1
  361. package/dist/public/operational-artifacts.js +7 -1
  362. package/dist/public/operations/catalog.d.ts +900 -34
  363. package/dist/public/operations/catalog.d.ts.map +1 -1
  364. package/dist/public/operations/catalog.js +130 -6
  365. package/dist/public/operations/check-executor.d.ts +2 -2
  366. package/dist/public/operations/check-executor.d.ts.map +1 -1
  367. package/dist/public/operations/check-executor.js +68 -13
  368. package/dist/public/operations/check-format-shared.d.ts +3 -0
  369. package/dist/public/operations/check-format-shared.d.ts.map +1 -1
  370. package/dist/public/operations/check-format-shared.js +3 -0
  371. package/dist/public/operations/check-helpers.d.ts +27 -2
  372. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  373. package/dist/public/operations/check-helpers.js +62 -26
  374. package/dist/public/operations/contracts.d.ts +18 -0
  375. package/dist/public/operations/contracts.d.ts.map +1 -0
  376. package/dist/public/operations/contracts.js +334 -0
  377. package/dist/public/operations/discovery-entities.d.ts +3 -0
  378. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  379. package/dist/public/operations/discovery-entities.js +4 -0
  380. package/dist/public/operations/discovery-executors.d.ts +43 -7
  381. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  382. package/dist/public/operations/discovery-executors.js +216 -13
  383. package/dist/public/operations/index.d.ts +9 -4
  384. package/dist/public/operations/index.d.ts.map +1 -1
  385. package/dist/public/operations/index.js +8 -3
  386. package/dist/public/operations/migration-plan.d.ts +102 -0
  387. package/dist/public/operations/migration-plan.d.ts.map +1 -0
  388. package/dist/public/operations/migration-plan.js +539 -0
  389. package/dist/public/operations/node-ports.d.ts.map +1 -1
  390. package/dist/public/operations/node-ports.js +71 -11
  391. package/dist/public/operations/prolog-json.d.ts +14 -0
  392. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  393. package/dist/public/operations/prolog-json.js +44 -5
  394. package/dist/public/operations/repair-plan.d.ts +3 -3
  395. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  396. package/dist/public/operations/repair-plan.js +49 -18
  397. package/dist/public/operations/result-envelope.d.ts +14 -0
  398. package/dist/public/operations/result-envelope.d.ts.map +1 -0
  399. package/dist/public/operations/result-envelope.js +106 -0
  400. package/dist/public/operations/runtime-types.d.ts +102 -7
  401. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  402. package/dist/public/operations/source-relationship-parity.d.ts +13 -0
  403. package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
  404. package/dist/public/operations/source-relationship-parity.js +162 -0
  405. package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
  406. package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
  407. package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
  408. package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
  409. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
  410. package/dist/public/operations/specs/check-rules.generated.js +34 -0
  411. package/dist/public/operations/specs/check.d.ts +9 -4
  412. package/dist/public/operations/specs/check.d.ts.map +1 -1
  413. package/dist/public/operations/specs/check.js +10 -21
  414. package/dist/public/operations/specs/discovery.d.ts +87 -3
  415. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  416. package/dist/public/operations/specs/discovery.js +53 -3
  417. package/dist/public/operations/specs/modeling.d.ts +3 -3
  418. package/dist/public/operations/specs/modeling.js +3 -3
  419. package/dist/public/operations/specs/mutation-schemas.d.ts +251 -14
  420. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  421. package/dist/public/operations/specs/mutation-schemas.js +16 -6
  422. package/dist/public/operations/specs/mutation.d.ts +42 -2
  423. package/dist/public/operations/specs/mutation.d.ts.map +1 -1
  424. package/dist/public/operations/specs/mutation.js +26 -2
  425. package/dist/public/operations/specs/planning.d.ts +279 -0
  426. package/dist/public/operations/specs/planning.d.ts.map +1 -0
  427. package/dist/public/operations/specs/planning.js +197 -0
  428. package/dist/public/operations/specs/proof.d.ts +212 -0
  429. package/dist/public/operations/specs/proof.d.ts.map +1 -0
  430. package/dist/public/operations/specs/proof.js +30 -0
  431. package/dist/public/operations/specs/reporting.d.ts +23 -1
  432. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  433. package/dist/public/operations/specs/reporting.js +156 -11
  434. package/dist/public/operations/specs/upsert.d.ts +265 -14
  435. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  436. package/dist/public/operations/specs/upsert.js +9 -0
  437. package/dist/public/operations/symbol-repair-plan.d.ts +22 -0
  438. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
  439. package/dist/public/operations/symbol-repair-plan.js +238 -0
  440. package/dist/public/operations/types.d.ts +52 -1
  441. package/dist/public/operations/types.d.ts.map +1 -1
  442. package/dist/public/proof-fingerprint.d.ts +54 -0
  443. package/dist/public/proof-fingerprint.d.ts.map +1 -0
  444. package/dist/public/proof-fingerprint.js +141 -0
  445. package/dist/public/proof-protocol.d.ts +354 -0
  446. package/dist/public/proof-protocol.d.ts.map +1 -0
  447. package/dist/public/proof-protocol.js +454 -0
  448. package/dist/public/proof-receipt.d.ts +279 -0
  449. package/dist/public/proof-receipt.d.ts.map +1 -0
  450. package/dist/public/proof-receipt.js +377 -0
  451. package/dist/public/schemas/entity.d.ts.map +1 -1
  452. package/dist/public/schemas/entity.js +22 -6
  453. package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
  454. package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  455. package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  456. package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  457. package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  458. package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
  459. package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  460. package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  461. package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  462. package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
  463. package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  464. package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  465. package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  466. package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
  467. package/dist/public/skills/kibi-usage/SKILL.md +136 -231
  468. package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  469. package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  470. package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
  471. package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
  472. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  473. package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  474. package/dist/public/skills/kibi-usage/resources/workflows.md +57 -4
  475. package/dist/public/symbol-granularity.d.ts +3 -14
  476. package/dist/public/symbol-granularity.d.ts.map +1 -1
  477. package/dist/public/symbol-granularity.generated.d.ts +16 -0
  478. package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
  479. package/dist/public/symbol-granularity.generated.js +20 -0
  480. package/dist/public/symbol-granularity.js +6 -46
  481. package/dist/public/telemetry-acceptance.d.ts +3 -70
  482. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  483. package/dist/public/telemetry-acceptance.js +11 -2
  484. package/dist/public/telemetry-remediation.js +1 -1
  485. package/dist/relationships/shards.d.ts +16 -0
  486. package/dist/relationships/shards.d.ts.map +1 -1
  487. package/dist/relationships/shards.js +87 -2
  488. package/dist/report/brand.d.ts +19 -0
  489. package/dist/report/brand.d.ts.map +1 -0
  490. package/dist/report/brand.js +112 -0
  491. package/dist/report/html-report.css +282 -0
  492. package/dist/report/html-report.d.ts +21 -0
  493. package/dist/report/html-report.d.ts.map +1 -0
  494. package/dist/report/html-report.js +700 -0
  495. package/dist/report/relative-time.d.ts +4 -0
  496. package/dist/report/relative-time.d.ts.map +1 -0
  497. package/dist/report/relative-time.js +46 -0
  498. package/dist/report/report-view.d.ts +17 -0
  499. package/dist/report/report-view.d.ts.map +1 -0
  500. package/dist/report/report-view.js +33 -0
  501. package/dist/report/repository.d.ts +35 -0
  502. package/dist/report/repository.d.ts.map +1 -0
  503. package/dist/report/repository.js +151 -0
  504. package/dist/runtime/cli-runtime.d.ts +2 -0
  505. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  506. package/dist/runtime/cli-runtime.js +90 -23
  507. package/dist/schemas/entity.schema.json +1254 -239
  508. package/dist/search-ranking.d.ts +1 -0
  509. package/dist/search-ranking.d.ts.map +1 -1
  510. package/dist/search-ranking.js +3 -0
  511. package/dist/traceability/evidence-model.d.ts +30 -2
  512. package/dist/traceability/evidence-model.d.ts.map +1 -1
  513. package/dist/traceability/evidence-model.js +2 -2
  514. package/dist/traceability/git-staged.d.ts +20 -0
  515. package/dist/traceability/git-staged.d.ts.map +1 -1
  516. package/dist/traceability/git-staged.js +156 -37
  517. package/dist/traceability/markdown-validate.d.ts.map +1 -1
  518. package/dist/traceability/markdown-validate.js +12 -7
  519. package/dist/traceability/staged-diagnostics.d.ts +7 -0
  520. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  521. package/dist/traceability/staged-diagnostics.js +78 -7
  522. package/dist/traceability/staged-file-coverage.d.ts +33 -0
  523. package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
  524. package/dist/traceability/staged-file-coverage.js +284 -0
  525. package/dist/traceability/staged-impact-contract.d.ts +3 -3
  526. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  527. package/dist/traceability/staged-impact-contract.js +12 -40
  528. package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
  529. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  530. package/dist/traceability/staged-symbols-manifest.js +142 -26
  531. package/dist/traceability/symbol-extract.d.ts +5 -0
  532. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  533. package/dist/traceability/symbol-extract.js +1 -1
  534. package/dist/traceability/temp-kb.d.ts +2 -0
  535. package/dist/traceability/temp-kb.d.ts.map +1 -1
  536. package/dist/traceability/temp-kb.js +14 -2
  537. package/dist/types/entities.d.ts +5 -0
  538. package/dist/types/entities.d.ts.map +1 -1
  539. package/dist/utils/branch-resolver.d.ts +25 -10
  540. package/dist/utils/branch-resolver.d.ts.map +1 -1
  541. package/dist/utils/branch-resolver.js +124 -38
  542. package/dist/utils/branch-store-locator.d.ts +23 -0
  543. package/dist/utils/branch-store-locator.d.ts.map +1 -0
  544. package/dist/utils/branch-store-locator.js +90 -0
  545. package/dist/utils/branch-store.d.ts +21 -0
  546. package/dist/utils/branch-store.d.ts.map +1 -0
  547. package/dist/utils/branch-store.js +157 -0
  548. package/dist/utils/config.d.ts +39 -37
  549. package/dist/utils/config.d.ts.map +1 -1
  550. package/dist/utils/config.js +107 -119
  551. package/dist/utils/kb-manifest.d.ts +35 -0
  552. package/dist/utils/kb-manifest.d.ts.map +1 -0
  553. package/dist/utils/kb-manifest.js +154 -0
  554. package/dist/utils/kb-paths.d.ts +54 -0
  555. package/dist/utils/kb-paths.d.ts.map +1 -0
  556. package/dist/utils/kb-paths.js +125 -0
  557. package/dist/utils/manifest-paths.d.ts +4 -4
  558. package/dist/utils/manifest-paths.d.ts.map +1 -1
  559. package/dist/utils/manifest-paths.js +8 -56
  560. package/dist/utils/rule-registry.d.ts +42 -24
  561. package/dist/utils/rule-registry.d.ts.map +1 -1
  562. package/dist/utils/rule-registry.generated.d.ts +97 -0
  563. package/dist/utils/rule-registry.generated.d.ts.map +1 -0
  564. package/dist/utils/rule-registry.generated.js +125 -0
  565. package/dist/utils/rule-registry.js +52 -148
  566. package/dist/utils/schema-version.d.ts +5 -5
  567. package/dist/utils/schema-version.d.ts.map +1 -1
  568. package/dist/utils/schema-version.js +26 -6
  569. package/dist/utils/strict-modeling.d.ts +1 -4
  570. package/dist/utils/strict-modeling.d.ts.map +1 -1
  571. package/dist/utils/strict-modeling.js +8 -9
  572. package/package.json +47 -11
  573. package/schema/config.json +2 -2
  574. package/schema/manifest.json +26 -0
  575. package/src/public/branch-resolver.ts +1 -0
  576. package/src/public/check-types.ts +22 -19
  577. package/src/public/diagnostic-usage.ts +84 -6
  578. package/src/public/distribution-parity.ts +17 -9
  579. package/src/public/ignore-policy.ts +16 -10
  580. package/src/public/impact/coverage-depth-quality.ts +37 -1
  581. package/src/public/impact/diagnostics.ts +2 -1
  582. package/src/public/impact/diff-meaning.ts +11 -4
  583. package/src/public/impact/full-kb-quality.ts +545 -41
  584. package/src/public/impact/manifest.ts +2 -4
  585. package/src/public/operational-artifacts.ts +9 -1
  586. package/src/public/operations/catalog.ts +153 -10
  587. package/src/public/operations/check-executor.ts +98 -15
  588. package/src/public/operations/check-format-shared.ts +6 -0
  589. package/src/public/operations/check-helpers.ts +74 -35
  590. package/src/public/operations/contracts.ts +382 -0
  591. package/src/public/operations/discovery-entities.ts +7 -0
  592. package/src/public/operations/discovery-executors.ts +315 -25
  593. package/src/public/operations/index.ts +9 -4
  594. package/src/public/operations/migration-plan.ts +747 -0
  595. package/src/public/operations/node-ports.ts +87 -13
  596. package/src/public/operations/prolog-json.ts +60 -5
  597. package/src/public/operations/repair-plan.ts +60 -22
  598. package/src/public/operations/result-envelope.ts +141 -0
  599. package/src/public/operations/runtime-types.ts +96 -5
  600. package/src/public/operations/source-relationship-parity.ts +226 -0
  601. package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
  602. package/src/public/operations/specs/check-rules.generated.ts +37 -0
  603. package/src/public/operations/specs/check.ts +14 -22
  604. package/src/public/operations/specs/discovery.ts +57 -3
  605. package/src/public/operations/specs/modeling.ts +3 -3
  606. package/src/public/operations/specs/mutation-schemas.ts +24 -6
  607. package/src/public/operations/specs/mutation.ts +27 -2
  608. package/src/public/operations/specs/planning.ts +241 -0
  609. package/src/public/operations/specs/proof.ts +43 -0
  610. package/src/public/operations/specs/reporting.ts +193 -12
  611. package/src/public/operations/specs/upsert.ts +10 -0
  612. package/src/public/operations/symbol-repair-plan.ts +324 -0
  613. package/src/public/operations/types.ts +62 -1
  614. package/src/public/proof-fingerprint.ts +216 -0
  615. package/src/public/proof-protocol-types.d.ts +96 -0
  616. package/src/public/proof-protocol.ts +589 -0
  617. package/src/public/proof-receipt.ts +499 -0
  618. package/src/public/schemas/entity.ts +27 -6
  619. package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
  620. package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  621. package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  622. package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  623. package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  624. package/src/public/skills/kibi-freshness/SKILL.md +39 -9
  625. package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  626. package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  627. package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  628. package/src/public/skills/kibi-traceability/SKILL.md +47 -47
  629. package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  630. package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  631. package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  632. package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
  633. package/src/public/skills/kibi-usage/SKILL.md +136 -231
  634. package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  635. package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  636. package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
  637. package/src/public/skills/kibi-usage/resources/proof.md +105 -0
  638. package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  639. package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  640. package/src/public/skills/kibi-usage/resources/workflows.md +57 -4
  641. package/src/public/symbol-granularity.generated.ts +41 -0
  642. package/src/public/symbol-granularity.ts +35 -59
  643. package/src/public/telemetry-acceptance-types.d.ts +98 -0
  644. package/src/public/telemetry-acceptance.ts +30 -93
  645. package/src/public/telemetry-remediation.ts +1 -1
  646. package/src/schemas/entity.schema.json +1254 -239
  647. package/templates/github/kibi-badge.yml +86 -0
  648. package/templates/github/kibi-report.yml +84 -0
  649. package/dist/operations/autopilot/activation.d.ts +0 -4
  650. package/dist/operations/autopilot/activation.d.ts.map +0 -1
  651. package/dist/operations/autopilot/candidates.d.ts +0 -4
  652. package/dist/operations/autopilot/discovery.d.ts.map +0 -1
  653. package/dist/operations/autopilot/generate.d.ts +0 -8
  654. package/dist/operations/autopilot/generate.d.ts.map +0 -1
  655. package/dist/operations/autopilot/generate.js +0 -112
  656. package/dist/operations/autopilot/guidance.d.ts.map +0 -1
  657. package/dist/operations/autopilot/presentation.d.ts +0 -13
  658. package/dist/operations/autopilot/presentation.d.ts.map +0 -1
  659. package/dist/operations/autopilot/presentation.js +0 -91
  660. package/dist/operations/autopilot/types.d.ts.map +0 -1
  661. package/dist/operations/autopilot/types.js +0 -8
  662. package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
  663. package/dist/public/skills/init-kibi/SKILL.md +0 -62
  664. package/dist/public/verification-receipt.d.ts +0 -75
  665. package/dist/public/verification-receipt.d.ts.map +0 -1
  666. package/dist/public/verification-receipt.js +0 -129
  667. package/src/public/skills/init-kibi/SKILL.md +0 -62
  668. package/src/public/verification-receipt.ts +0 -170
  669. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
  670. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
  671. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
  672. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
@@ -0,0 +1,470 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { executeIngestProof } from "../operations/proof/ingest-proof.js";
5
+ import { PROOF_RUNS_DIR, loadProofIntegrations, resolveIntegration, } from "../proof/integrations.js";
6
+ import { convertJUnitXml } from "../proof/producers/junit-adapter.js";
7
+ import { convertTap } from "../proof/producers/tap-adapter.js";
8
+ import { loadEntities } from "../public/operations/discovery-entities.js";
9
+ import { ingestProofSpec } from "../public/operations/specs/proof.js";
10
+ import { readWorkspaceSnapshot } from "../public/operations/workspace-snapshot.js";
11
+ import { PROOF_RUN_VERSION, proofBindingsErrors, proofRunArtifactErrors, } from "../public/proof-protocol.js";
12
+ import { createCliRuntime } from "../runtime/cli-runtime.js";
13
+ /**
14
+ * Describe which paths moved when a proof snapshot refusal fires, so
15
+ * consumers can see what kibi thinks changed instead of diffing by hand.
16
+ * Snapshot-relevant changes come first (receipt-only and ignored edits do
17
+ * not affect the hash), and the list is capped to keep the error readable.
18
+ */
19
+ // implements REQ-kibi-proof-evidence-protocol
20
+ export function describeWorkspaceDrift(snapshot) {
21
+ if (!snapshot.available)
22
+ return " (workspace snapshot unavailable)";
23
+ const changes = snapshot.snapshot.changes ?? [];
24
+ const relevant = changes.filter((change) => change.snapshotRelevant);
25
+ const pool = relevant.length > 0
26
+ ? relevant
27
+ : changes.filter((change) => !change.snapshotRelevant);
28
+ if (pool.length === 0) {
29
+ return " (git reported no workspace changes; the hash drift may come from file content that git treats as unchanged)";
30
+ }
31
+ const maxPaths = 10;
32
+ const listed = pool
33
+ .slice(0, maxPaths)
34
+ .map((change) => `${change.status.trim() || "M"} ${change.path}`);
35
+ const more = pool.length - listed.length;
36
+ return `; changed: ${listed.join(", ")}${more > 0 ? ` (+${more} more)` : ""}`;
37
+ }
38
+ /**
39
+ * Parse a comma-separated integration selector ("a", "a,b,c") into a set of
40
+ * trimmed, non-empty ids. Empty selectors yield an empty set; blank items
41
+ * fail fast instead of silently narrowing the selection.
42
+ */
43
+ // implements REQ-kibi-proof-evidence-protocol
44
+ export function parseIntegrationSelector(value, flagName) {
45
+ if (value === undefined || value.trim() === "")
46
+ return new Set();
47
+ const ids = new Set();
48
+ for (const raw of value.split(",")) {
49
+ const id = raw.trim();
50
+ if (id === "")
51
+ throw new Error(`prove: ${flagName} contains an empty integration id`);
52
+ ids.add(id);
53
+ }
54
+ return ids;
55
+ }
56
+ function withId(entity) {
57
+ if (typeof entity.id !== "string" || entity.id === "")
58
+ throw new Error("prove: loaded test entity is missing an id");
59
+ return entity;
60
+ }
61
+ export function testId(test) {
62
+ return String(test.id);
63
+ }
64
+ function parseContract(test) {
65
+ const contract = test.proof_contract;
66
+ if (contract === null ||
67
+ typeof contract !== "object" ||
68
+ Array.isArray(contract))
69
+ return null;
70
+ return contract;
71
+ }
72
+ async function runChild(commandArgv, cwd, env) {
73
+ const [command, ...args] = commandArgv;
74
+ if (!command)
75
+ throw new Error("prove: integration command argv must be non-empty");
76
+ return await new Promise((resolve, reject) => {
77
+ const child = spawn(command, args, {
78
+ cwd,
79
+ env,
80
+ shell: false,
81
+ stdio: "inherit",
82
+ });
83
+ child.once("error", reject);
84
+ child.once("close", (code) => resolve(code ?? 1));
85
+ });
86
+ }
87
+ // implements REQ-kibi-proof-evidence-protocol
88
+ export function commandEnvironment(integration, commandArgv, snapshot, workspaceRoot, testIds, outputPath) {
89
+ return {
90
+ ...process.env,
91
+ KIBI_PROOF_RUN: "1",
92
+ KIBI_PROOF_OUTPUT: outputPath,
93
+ KIBI_PROOF_SNAPSHOT: snapshot,
94
+ KIBI_PROOF_COMMAND_ARGV: JSON.stringify(commandArgv),
95
+ KIBI_PROOF_INTEGRATION: integration.id,
96
+ KIBI_PROOF_WORKSPACE: workspaceRoot,
97
+ KIBI_PROOF_TEST_IDS: JSON.stringify(testIds),
98
+ };
99
+ }
100
+ function collectBindings(tests) {
101
+ const bindings = [];
102
+ for (const test of tests) {
103
+ const raw = test.proof_bindings;
104
+ if (raw === undefined || raw === null)
105
+ continue;
106
+ if (!Array.isArray(raw))
107
+ continue;
108
+ const errors = proofBindingsErrors(raw);
109
+ if (errors.length > 0)
110
+ throw new Error(`prove: test ${test.id} has invalid proof_bindings: ${errors.join("; ")}`);
111
+ for (const entry of raw) {
112
+ const row = entry;
113
+ bindings.push({
114
+ symbol_id: String(row.symbol_id),
115
+ target: String(row.target),
116
+ ...(row.native_id !== undefined
117
+ ? { native_id: String(row.native_id) }
118
+ : {}),
119
+ ...(row.aliases !== undefined
120
+ ? { aliases: row.aliases.map(String) }
121
+ : {}),
122
+ });
123
+ }
124
+ }
125
+ return bindings;
126
+ }
127
+ function dedupeObligations(tests) {
128
+ const seen = new Set();
129
+ const results = [];
130
+ for (const test of tests) {
131
+ const contract = parseContract(test);
132
+ if (!contract)
133
+ continue;
134
+ for (const obligation of contract.required_proofs) {
135
+ const key = `${obligation.target}\0${obligation.symbol_id}`;
136
+ if (seen.has(key))
137
+ continue;
138
+ seen.add(key);
139
+ results.push({
140
+ symbol_id: obligation.symbol_id,
141
+ target: obligation.target,
142
+ outcome: "passed",
143
+ binding: "aggregate_run",
144
+ attempts: { status: "unavailable" },
145
+ });
146
+ }
147
+ }
148
+ return results;
149
+ }
150
+ function markAggregateFailure(results) {
151
+ return results.map((result) => ({ ...result, outcome: "failed" }));
152
+ }
153
+ async function selectTests(context, options) {
154
+ // Paginated: loading every test entity with full props in one query can
155
+ // exceed the Prolog output buffer once receipt histories grow.
156
+ const loadAll = async () => {
157
+ const pageSize = 25;
158
+ const all = [];
159
+ for (let offset = 0;; offset += pageSize) {
160
+ const page = await loadEntities(context.prolog, {
161
+ type: "test",
162
+ limit: pageSize,
163
+ offset,
164
+ });
165
+ all.push(...page);
166
+ if (page.length < pageSize)
167
+ return all;
168
+ }
169
+ };
170
+ let candidates = [];
171
+ if (options.testId) {
172
+ const found = await loadEntities(context.prolog, {
173
+ id: options.testId,
174
+ type: "test",
175
+ });
176
+ candidates = found.map(withId);
177
+ }
178
+ else if (options.requirement) {
179
+ const requirementId = options.requirement;
180
+ const scenarioResult = await context.prolog?.query(`findall([S,T], (kb_relationship(specified_by, '${requirementId}', S), (kb_relationship(verified_by, S, T) ; kb_relationship(validates, T, S)), kb_entity(T, test, _)), Rows)`);
181
+ const rowsRaw = scenarioResult?.success
182
+ ? scenarioResult.bindings.Rows
183
+ : undefined;
184
+ const ids = new Set();
185
+ if (typeof rowsRaw === "string") {
186
+ for (const match of rowsRaw.matchAll(/\[['"]?([^,\]]+)['"]?,['"]?([^,\]]+)['"]?\]/g)) {
187
+ const test = match[2];
188
+ if (test)
189
+ ids.add(test.trim());
190
+ }
191
+ }
192
+ const directResult = await context.prolog?.query(`findall(T, (kb_relationship(validates, T, '${requirementId}'), kb_entity(T, test, _)), Rows)`);
193
+ const directRaw = directResult?.success
194
+ ? directResult.bindings.Rows
195
+ : undefined;
196
+ if (typeof directRaw === "string") {
197
+ for (const match of directRaw.matchAll(/\[?['"]?([A-Za-z0-9_-]+)['"]?\]?/g)) {
198
+ const candidate = match[1];
199
+ if (candidate?.startsWith("TEST-"))
200
+ ids.add(candidate);
201
+ }
202
+ }
203
+ const all = await loadAll();
204
+ candidates = all.filter((entity) => ids.has(String(entity.id))).map(withId);
205
+ }
206
+ else {
207
+ candidates = (await loadAll()).map(withId);
208
+ }
209
+ const selected = candidates.filter((entity) => parseContract(entity) !== null);
210
+ const includeIds = parseIntegrationSelector(options.integration, "--integration");
211
+ const excludeIds = parseIntegrationSelector(options.integrationExcept, "--integration-except");
212
+ if (includeIds.size === 0 && excludeIds.size === 0)
213
+ return selected;
214
+ const filtered = selected.filter((entity) => {
215
+ const contract = parseContract(entity);
216
+ if (!contract)
217
+ return false;
218
+ if (includeIds.size > 0 && !includeIds.has(contract.integration))
219
+ return false;
220
+ if (excludeIds.size > 0 && excludeIds.has(contract.integration))
221
+ return false;
222
+ return true;
223
+ });
224
+ if (filtered.length === 0 && includeIds.size + excludeIds.size > 0) {
225
+ const requested = [
226
+ ...(includeIds.size > 0
227
+ ? [`integrations: ${[...includeIds].sort().join(", ")}`]
228
+ : []),
229
+ ...(excludeIds.size > 0
230
+ ? [`excluding: ${[...excludeIds].sort().join(", ")}`]
231
+ : []),
232
+ ].join("; ");
233
+ throw new Error(`prove: no proof-bearing tests match the integration selector (${requested})`);
234
+ }
235
+ return filtered;
236
+ }
237
+ function summarize(result) {
238
+ const parts = [`passed ${result.passed}`, `failed ${result.failed}`];
239
+ if (result.unchanged > 0)
240
+ parts.push(`unchanged ${result.unchanged}`);
241
+ return parts.join(", ");
242
+ }
243
+ // implements REQ-kibi-proof-evidence-protocol
244
+ export async function proveCommand(options, deps = {}) {
245
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
246
+ const ingestProof = deps.ingestProof ?? executeIngestProof;
247
+ const runtime = deps.runtime ??
248
+ createCliRuntime(options.workspaceRoot === undefined ? {} : { workspaceRoot });
249
+ const context = await runtime.open(ingestProofSpec, {
250
+ ...(options.workspaceRoot === undefined ? {} : { workspaceRoot }),
251
+ });
252
+ let completed = false;
253
+ try {
254
+ const integrations = loadProofIntegrations(context.workspaceRoot);
255
+ if (!integrations.available)
256
+ throw new Error(`prove: ${integrations.error}`);
257
+ const selected = await selectTests(context, options);
258
+ if (selected.length === 0) {
259
+ process.stdout.write(`${JSON.stringify({ proved: 0, failed: 0, message: "no proof-bearing tests selected" })}\n`);
260
+ completed = true;
261
+ return { exitCode: 0 };
262
+ }
263
+ const before = await readWorkspaceSnapshot(context);
264
+ if (!before.available)
265
+ throw new Error(`prove: ${before.error}`);
266
+ const snapshot = before.snapshot.hash;
267
+ // Packed contracts run in separate processes; one shared packed-tarball
268
+ // cache area per campaign snapshot replaces dozens of repeated packs and
269
+ // installs with a single population. The snapshot hash is the provenance
270
+ // key: different workspace state never sees another campaign's artifacts.
271
+ process.env.KIBI_E2E_PACK_CACHE_KEY ??= snapshot;
272
+ const groups = new Map();
273
+ for (const test of selected) {
274
+ const contract = parseContract(test);
275
+ if (!contract)
276
+ continue;
277
+ const list = groups.get(contract.integration) ?? [];
278
+ list.push(test);
279
+ groups.set(contract.integration, list);
280
+ }
281
+ const runsDir = path.join(context.workspaceRoot, PROOF_RUNS_DIR);
282
+ await mkdir(runsDir, { recursive: true });
283
+ const ingestResults = [];
284
+ const failures = [];
285
+ for (const [integrationId, tests] of groups) {
286
+ const integration = resolveIntegration(integrations.integrations, integrationId);
287
+ if (!integration) {
288
+ failures.push(`integration '${integrationId}' (required by ${tests.map((t) => t.id).join(", ")}) is not configured in .kb/proof/integrations.json`);
289
+ continue;
290
+ }
291
+ const commandArgv = [...integration.command];
292
+ const artifactPath = path.resolve(context.workspaceRoot, integration.artifact ??
293
+ path.join(PROOF_RUNS_DIR, `${integrationId}.json`));
294
+ await mkdir(path.dirname(artifactPath), { recursive: true });
295
+ await rm(artifactPath, { force: true });
296
+ const env = commandEnvironment(integration, commandArgv, snapshot, context.workspaceRoot, tests.map((test) => String(test.id)), artifactPath);
297
+ const startedAt = new Date().toISOString();
298
+ let exitCode;
299
+ try {
300
+ exitCode = await runChild(commandArgv, context.workspaceRoot, env);
301
+ }
302
+ catch (error) {
303
+ failures.push(`integration '${integrationId}' failed to start: ${error instanceof Error ? error.message : String(error)}`);
304
+ continue;
305
+ }
306
+ const finishedAt = new Date().toISOString();
307
+ let artifact;
308
+ try {
309
+ artifact = await buildArtifact({
310
+ integration,
311
+ commandArgv,
312
+ exitCode,
313
+ startedAt,
314
+ finishedAt,
315
+ artifactPath,
316
+ snapshot,
317
+ tests,
318
+ });
319
+ }
320
+ catch (error) {
321
+ failures.push(`integration '${integrationId}': ${error instanceof Error ? error.message : String(error)}`);
322
+ continue;
323
+ }
324
+ const artifactErrors = proofRunArtifactErrors(artifact);
325
+ if (artifactErrors.length > 0) {
326
+ failures.push(`integration '${integrationId}' produced an invalid kibi.proof-run.v1 artifact: ${artifactErrors.join("; ")}`);
327
+ continue;
328
+ }
329
+ await mkdir(path.dirname(artifactPath), { recursive: true });
330
+ await writeFile(artifactPath, `${JSON.stringify(artifact, null, 2)}\n`, "utf8");
331
+ const afterRun = await readWorkspaceSnapshot(context);
332
+ if (!afterRun.available || afterRun.snapshot.hash !== snapshot) {
333
+ failures.push(`integration '${integrationId}' changed the tracked workspace during proof execution; proof is bound to snapshot ${snapshot}${describeWorkspaceDrift(afterRun)}`);
334
+ continue;
335
+ }
336
+ const ingested = await ingestProof({
337
+ snapshot,
338
+ artifact: artifact,
339
+ testIds: tests.map((test) => String(test.id)),
340
+ }, context);
341
+ ingestResults.push(ingested.structuredContent);
342
+ const afterIngest = await readWorkspaceSnapshot(context);
343
+ if (!afterIngest.available || afterIngest.snapshot.hash !== snapshot) {
344
+ failures.push(`the tracked workspace changed while receipts were applied; re-run kibi prove${describeWorkspaceDrift(afterIngest)}`);
345
+ }
346
+ }
347
+ const passed = ingestResults.reduce((sum, result) => sum + result.passed, 0);
348
+ const failed = ingestResults.reduce((sum, result) => sum + result.failed, 0);
349
+ const unchanged = ingestResults.reduce((sum, result) => sum + result.unchanged, 0);
350
+ const summary = {
351
+ proved: passed,
352
+ failed,
353
+ unchanged,
354
+ runs: ingestResults.map((result) => ({
355
+ integration: result.integration,
356
+ summary: summarize(result),
357
+ results: result.results,
358
+ })),
359
+ ...(failures.length > 0 ? { failures } : {}),
360
+ };
361
+ process.stdout.write(`${JSON.stringify(summary)}\n`);
362
+ completed = true;
363
+ await runtime.afterSuccess(ingestProofSpec, context);
364
+ return { exitCode: failures.length > 0 || failed > 0 ? 1 : 0 };
365
+ }
366
+ finally {
367
+ await runtime.close(context, completed
368
+ ? { status: "success", result: 0 }
369
+ : { status: "error", error: 1 });
370
+ }
371
+ }
372
+ async function buildArtifact(input) {
373
+ const { integration, commandArgv, exitCode, startedAt, finishedAt, artifactPath, snapshot, tests, } = input;
374
+ const run = (outcome) => ({
375
+ outcome,
376
+ exit_code: exitCode,
377
+ started_at: startedAt,
378
+ finished_at: finishedAt,
379
+ });
380
+ if (integration.producer === "command") {
381
+ const results = dedupeObligations(tests);
382
+ return {
383
+ version: PROOF_RUN_VERSION,
384
+ producer: {
385
+ name: "kibi-command-producer",
386
+ ...(integration.producer_version !== undefined
387
+ ? { version: integration.producer_version }
388
+ : {}),
389
+ },
390
+ integration: integration.id,
391
+ command_argv: [...commandArgv],
392
+ code_snapshot: snapshot,
393
+ environment: {
394
+ os: process.platform,
395
+ arch: process.arch,
396
+ runtime: { name: "node", version: process.version },
397
+ },
398
+ run: run(exitCode === 0 ? "passed" : "failed"),
399
+ proof_results: exitCode === 0 ? results : markAggregateFailure(results),
400
+ };
401
+ }
402
+ if (integration.producer === "junit" || integration.producer === "tap") {
403
+ const nativePath = integration.artifact;
404
+ if (!nativePath)
405
+ throw new Error(`producer '${integration.producer}' requires an artifact path in .kb/proof/integrations.json`);
406
+ let native;
407
+ try {
408
+ native = await readFile(path.resolve(context_path(nativePath)), "utf8");
409
+ }
410
+ catch {
411
+ throw new Error(`producer '${integration.producer}' did not produce its native report at ${nativePath}`);
412
+ }
413
+ const bindings = collectBindings(tests);
414
+ const conversion = integration.producer === "junit"
415
+ ? convertJUnitXml(native, bindings)
416
+ : convertTap(native, bindings);
417
+ if (conversion.fatal) {
418
+ throw new Error(`producer '${integration.producer}' rejected its native report${conversion.diagnostics.length > 0 ? `: ${conversion.diagnostics.join("; ")}` : ""}`);
419
+ }
420
+ if (conversion.results.length === 0)
421
+ throw new Error(`producer '${integration.producer}' produced no bound proof results${conversion.diagnostics.length > 0 ? `: ${conversion.diagnostics.join("; ")}` : ""}`);
422
+ return {
423
+ version: PROOF_RUN_VERSION,
424
+ producer: {
425
+ name: `kibi-${integration.producer}-adapter`,
426
+ ...(integration.producer_version !== undefined
427
+ ? { version: integration.producer_version }
428
+ : {}),
429
+ },
430
+ integration: integration.id,
431
+ command_argv: [...commandArgv],
432
+ code_snapshot: snapshot,
433
+ environment: {
434
+ os: process.platform,
435
+ arch: process.arch,
436
+ runtime: { name: "node", version: process.version },
437
+ },
438
+ run: run(conversion.results.every((result) => result.outcome === "passed")
439
+ ? "passed"
440
+ : "failed"),
441
+ proof_results: conversion.results,
442
+ ...(conversion.diagnostics.length > 0
443
+ ? { diagnostics: conversion.diagnostics }
444
+ : {}),
445
+ };
446
+ }
447
+ // Self-emitting producers (playwright and custom): read the emitted
448
+ // kibi.proof-run.v1 artifact and enforce the process outcome.
449
+ let parsed;
450
+ try {
451
+ parsed = JSON.parse(await readFile(artifactPath, "utf8"));
452
+ }
453
+ catch {
454
+ throw new Error(`producer '${integration.producer}' did not emit a readable kibi.proof-run.v1 artifact at ${artifactPath}`);
455
+ }
456
+ const artifact = parsed;
457
+ const runRecord = parsed.run;
458
+ const reportedOutcome = runRecord?.outcome;
459
+ if (exitCode !== 0) {
460
+ if (reportedOutcome === "passed") {
461
+ throw new Error(`producer '${integration.producer}' reported run.outcome 'passed' but the process exited with code ${exitCode}`);
462
+ }
463
+ }
464
+ return artifact;
465
+ }
466
+ function context_path(nativePath) {
467
+ return path.isAbsolute(nativePath)
468
+ ? nativePath
469
+ : path.join(process.cwd(), nativePath);
470
+ }
@@ -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?.proofSnapshotDirty === 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
+ }