@jevitate/cli 0.1.0 → 0.2.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 (375) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.js +40 -30
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.d.ts +4 -0
  5. package/dist/author-journey-cli.js +109 -0
  6. package/dist/author-journey-cli.js.map +1 -0
  7. package/dist/bin.js +58077 -22454
  8. package/dist/bin.js.map +1 -1
  9. package/dist/browser-run-options.d.ts +58 -0
  10. package/dist/browser-run-options.js +106 -0
  11. package/dist/browser-run-options.js.map +1 -0
  12. package/dist/build-info.generated.d.ts +2 -0
  13. package/dist/build-info.generated.js +10 -0
  14. package/dist/build-info.generated.js.map +1 -0
  15. package/dist/check-api.d.ts +5 -0
  16. package/dist/check-api.js +233 -0
  17. package/dist/check-api.js.map +1 -0
  18. package/dist/check-budget.d.ts +26 -0
  19. package/dist/check-budget.js +89 -0
  20. package/dist/check-budget.js.map +1 -0
  21. package/dist/check-cli.d.ts +31 -0
  22. package/dist/check-cli.js +109 -0
  23. package/dist/check-cli.js.map +1 -0
  24. package/dist/check-execute.d.ts +25 -0
  25. package/dist/check-execute.js +385 -0
  26. package/dist/check-execute.js.map +1 -0
  27. package/dist/check-plan.d.ts +113 -0
  28. package/dist/check-plan.js +448 -0
  29. package/dist/check-plan.js.map +1 -0
  30. package/dist/check-suite.d.ts +171 -0
  31. package/dist/check-suite.js +515 -0
  32. package/dist/check-suite.js.map +1 -0
  33. package/dist/check-types.d.ts +181 -0
  34. package/dist/check-types.js +35 -0
  35. package/dist/check-types.js.map +1 -0
  36. package/dist/cli-args.d.ts +26 -0
  37. package/dist/cli-args.js +50 -0
  38. package/dist/cli-args.js.map +1 -0
  39. package/dist/cli-output.d.ts +102 -0
  40. package/dist/cli-output.js +516 -0
  41. package/dist/cli-output.js.map +1 -0
  42. package/dist/cli-reference.d.ts +3 -0
  43. package/dist/cli-reference.js +81 -0
  44. package/dist/cli-reference.js.map +1 -0
  45. package/dist/cli-refusal.d.ts +12 -0
  46. package/dist/cli-refusal.js +52 -0
  47. package/dist/cli-refusal.js.map +1 -0
  48. package/dist/cli-shared.d.ts +330 -0
  49. package/dist/cli-shared.js +492 -0
  50. package/dist/cli-shared.js.map +1 -0
  51. package/dist/cli-surface.d.ts +33 -0
  52. package/dist/cli-surface.js +48 -0
  53. package/dist/cli-surface.js.map +1 -0
  54. package/dist/conversation-options.d.ts +15 -0
  55. package/dist/conversation-options.js +10 -0
  56. package/dist/conversation-options.js.map +1 -0
  57. package/dist/credentials-file.d.ts +15 -0
  58. package/dist/credentials-file.js +56 -0
  59. package/dist/credentials-file.js.map +1 -0
  60. package/dist/data-dir.d.ts +1 -1
  61. package/dist/data-dir.js +1 -1
  62. package/dist/defect-evidence.d.ts +141 -0
  63. package/dist/defect-evidence.js +502 -0
  64. package/dist/defect-evidence.js.map +1 -0
  65. package/dist/demo-aspect-api.d.ts +209 -0
  66. package/dist/demo-aspect-api.js +397 -0
  67. package/dist/demo-aspect-api.js.map +1 -0
  68. package/dist/demo-aspect-cli.d.ts +3 -0
  69. package/dist/demo-aspect-cli.js +241 -0
  70. package/dist/demo-aspect-cli.js.map +1 -0
  71. package/dist/demo-capture.d.ts +108 -0
  72. package/dist/demo-capture.js +438 -0
  73. package/dist/demo-capture.js.map +1 -0
  74. package/dist/engine.d.ts +35 -0
  75. package/dist/engine.js +25 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/environments.d.ts +155 -0
  78. package/dist/environments.js +364 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/exit-codes.d.ts +46 -0
  81. package/dist/exit-codes.js +91 -0
  82. package/dist/exit-codes.js.map +1 -0
  83. package/dist/explore-adversarial.d.ts +137 -0
  84. package/dist/explore-adversarial.js +218 -0
  85. package/dist/explore-adversarial.js.map +1 -0
  86. package/dist/explore-api.d.ts +7 -187
  87. package/dist/explore-api.js +7 -301
  88. package/dist/explore-api.js.map +1 -1
  89. package/dist/explore-author.d.ts +79 -0
  90. package/dist/explore-author.js +86 -0
  91. package/dist/explore-author.js.map +1 -0
  92. package/dist/explore-cli.d.ts +7 -0
  93. package/dist/explore-cli.js +963 -0
  94. package/dist/explore-cli.js.map +1 -0
  95. package/dist/explore-coverage.d.ts +158 -0
  96. package/dist/explore-coverage.js +240 -0
  97. package/dist/explore-coverage.js.map +1 -0
  98. package/dist/explore-feature.d.ts +127 -0
  99. package/dist/explore-feature.js +220 -0
  100. package/dist/explore-feature.js.map +1 -0
  101. package/dist/explore-goal.d.ts +253 -0
  102. package/dist/explore-goal.js +374 -0
  103. package/dist/explore-goal.js.map +1 -0
  104. package/dist/explore-shared.d.ts +152 -0
  105. package/dist/explore-shared.js +129 -0
  106. package/dist/explore-shared.js.map +1 -0
  107. package/dist/explore-specs.d.ts +53 -0
  108. package/dist/explore-specs.js +333 -0
  109. package/dist/explore-specs.js.map +1 -0
  110. package/dist/findings-filing.d.ts +64 -0
  111. package/dist/findings-filing.js +108 -0
  112. package/dist/findings-filing.js.map +1 -0
  113. package/dist/fixture-auth.d.ts +52 -0
  114. package/dist/fixture-auth.js +82 -0
  115. package/dist/fixture-auth.js.map +1 -0
  116. package/dist/fixture-cli.d.ts +70 -0
  117. package/dist/fixture-cli.js +178 -0
  118. package/dist/fixture-cli.js.map +1 -0
  119. package/dist/github-issue-filer.d.ts +62 -0
  120. package/dist/github-issue-filer.js +188 -0
  121. package/dist/github-issue-filer.js.map +1 -0
  122. package/dist/host-health-run.d.ts +24 -0
  123. package/dist/host-health-run.js +27 -0
  124. package/dist/host-health-run.js.map +1 -0
  125. package/dist/http-5xx-outcome.d.ts +6 -0
  126. package/dist/http-5xx-outcome.js +39 -0
  127. package/dist/http-5xx-outcome.js.map +1 -0
  128. package/dist/inbox-cli.d.ts +7 -0
  129. package/dist/inbox-cli.js +197 -0
  130. package/dist/inbox-cli.js.map +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/init-cli.d.ts +4 -0
  135. package/dist/init-cli.js +127 -0
  136. package/dist/init-cli.js.map +1 -0
  137. package/dist/init-keys.d.ts +19 -2
  138. package/dist/init-keys.js +15 -4
  139. package/dist/init-keys.js.map +1 -1
  140. package/dist/init-next-steps.d.ts +35 -0
  141. package/dist/init-next-steps.js +79 -0
  142. package/dist/init-next-steps.js.map +1 -0
  143. package/dist/invariants-file.d.ts +34 -0
  144. package/dist/invariants-file.js +68 -0
  145. package/dist/invariants-file.js.map +1 -0
  146. package/dist/invariants-validate.d.ts +30 -0
  147. package/dist/invariants-validate.js +105 -0
  148. package/dist/invariants-validate.js.map +1 -0
  149. package/dist/journey-annotate-api.d.ts +76 -0
  150. package/dist/journey-annotate-api.js +256 -0
  151. package/dist/journey-annotate-api.js.map +1 -0
  152. package/dist/journey-annotate-cli.d.ts +9 -0
  153. package/dist/journey-annotate-cli.js +179 -0
  154. package/dist/journey-annotate-cli.js.map +1 -0
  155. package/dist/journey-api.d.ts +79 -2
  156. package/dist/journey-api.js +136 -19
  157. package/dist/journey-api.js.map +1 -1
  158. package/dist/journey-cli.d.ts +4 -0
  159. package/dist/journey-cli.js +370 -0
  160. package/dist/journey-cli.js.map +1 -0
  161. package/dist/journey-demo-api.d.ts +112 -0
  162. package/dist/journey-demo-api.js +392 -0
  163. package/dist/journey-demo-api.js.map +1 -0
  164. package/dist/journey-demo-cli.d.ts +10 -0
  165. package/dist/journey-demo-cli.js +155 -0
  166. package/dist/journey-demo-cli.js.map +1 -0
  167. package/dist/kill-signal.d.ts +193 -0
  168. package/dist/kill-signal.js +284 -0
  169. package/dist/kill-signal.js.map +1 -0
  170. package/dist/launch-armed.d.ts +37 -0
  171. package/dist/launch-armed.js +31 -0
  172. package/dist/launch-armed.js.map +1 -0
  173. package/dist/ledger-api.d.ts +106 -0
  174. package/dist/ledger-api.js +237 -0
  175. package/dist/ledger-api.js.map +1 -0
  176. package/dist/ledger-cli.d.ts +18 -0
  177. package/dist/ledger-cli.js +107 -0
  178. package/dist/ledger-cli.js.map +1 -0
  179. package/dist/load-api.d.ts +29 -11
  180. package/dist/load-api.js +23 -15
  181. package/dist/load-api.js.map +1 -1
  182. package/dist/load-cli.d.ts +4 -0
  183. package/dist/load-cli.js +97 -0
  184. package/dist/load-cli.js.map +1 -0
  185. package/dist/log-correlation.d.ts +147 -0
  186. package/dist/log-correlation.js +325 -0
  187. package/dist/log-correlation.js.map +1 -0
  188. package/dist/log-lines.d.ts +131 -0
  189. package/dist/log-lines.js +389 -0
  190. package/dist/log-lines.js.map +1 -0
  191. package/dist/log-sources.d.ts +71 -0
  192. package/dist/log-sources.js +235 -0
  193. package/dist/log-sources.js.map +1 -0
  194. package/dist/logs-cli.d.ts +3 -0
  195. package/dist/logs-cli.js +51 -0
  196. package/dist/logs-cli.js.map +1 -0
  197. package/dist/logs-retention.d.ts +28 -0
  198. package/dist/logs-retention.js +84 -0
  199. package/dist/logs-retention.js.map +1 -0
  200. package/dist/mcp-api.d.ts +89 -1
  201. package/dist/mcp-api.js +472 -18
  202. package/dist/mcp-api.js.map +1 -1
  203. package/dist/mcp-args.d.ts +38 -0
  204. package/dist/mcp-args.js +131 -0
  205. package/dist/mcp-args.js.map +1 -0
  206. package/dist/mcp-cli-bridge.d.ts +34 -0
  207. package/dist/mcp-cli-bridge.js +62 -0
  208. package/dist/mcp-cli-bridge.js.map +1 -0
  209. package/dist/mcp-cli-runner.d.ts +29 -0
  210. package/dist/mcp-cli-runner.js +44 -0
  211. package/dist/mcp-cli-runner.js.map +1 -0
  212. package/dist/mcp-cli-tools.d.ts +125 -0
  213. package/dist/mcp-cli-tools.js +680 -0
  214. package/dist/mcp-cli-tools.js.map +1 -0
  215. package/dist/mcp-paths.d.ts +28 -0
  216. package/dist/mcp-paths.js +76 -0
  217. package/dist/mcp-paths.js.map +1 -0
  218. package/dist/mission-actors.d.ts +40 -0
  219. package/dist/mission-actors.js +72 -0
  220. package/dist/mission-actors.js.map +1 -0
  221. package/dist/mission-api.d.ts +35 -0
  222. package/dist/mission-api.js +58 -2
  223. package/dist/mission-api.js.map +1 -1
  224. package/dist/mission-cli.d.ts +4 -0
  225. package/dist/mission-cli.js +247 -0
  226. package/dist/mission-cli.js.map +1 -0
  227. package/dist/mission-exit.d.ts +22 -0
  228. package/dist/mission-exit.js +26 -0
  229. package/dist/mission-exit.js.map +1 -0
  230. package/dist/mission-fixtures.d.ts +225 -0
  231. package/dist/mission-fixtures.js +828 -0
  232. package/dist/mission-fixtures.js.map +1 -0
  233. package/dist/mission-journal.d.ts +60 -0
  234. package/dist/mission-journal.js +115 -0
  235. package/dist/mission-journal.js.map +1 -0
  236. package/dist/mission-queue-cli.d.ts +10 -0
  237. package/dist/mission-queue-cli.js +198 -0
  238. package/dist/mission-queue-cli.js.map +1 -0
  239. package/dist/mission-queue-runner.d.ts +126 -0
  240. package/dist/mission-queue-runner.js +397 -0
  241. package/dist/mission-queue-runner.js.map +1 -0
  242. package/dist/multi-run-cli.d.ts +37 -0
  243. package/dist/multi-run-cli.js +110 -0
  244. package/dist/multi-run-cli.js.map +1 -0
  245. package/dist/multi-run.d.ts +339 -0
  246. package/dist/multi-run.js +619 -0
  247. package/dist/multi-run.js.map +1 -0
  248. package/dist/openrouter-call.d.ts +22 -0
  249. package/dist/openrouter-call.js +63 -0
  250. package/dist/openrouter-call.js.map +1 -0
  251. package/dist/profile-cli.d.ts +4 -0
  252. package/dist/profile-cli.js +57 -0
  253. package/dist/profile-cli.js.map +1 -0
  254. package/dist/program.d.ts +3 -75
  255. package/dist/program.js +119 -1921
  256. package/dist/program.js.map +1 -1
  257. package/dist/project-dir.d.ts +96 -0
  258. package/dist/project-dir.js +220 -0
  259. package/dist/project-dir.js.map +1 -0
  260. package/dist/record-api.d.ts +10 -6
  261. package/dist/record-api.js +39 -28
  262. package/dist/record-api.js.map +1 -1
  263. package/dist/record-cli.d.ts +4 -0
  264. package/dist/record-cli.js +64 -0
  265. package/dist/record-cli.js.map +1 -0
  266. package/dist/recording-cli.d.ts +4 -0
  267. package/dist/recording-cli.js +248 -0
  268. package/dist/recording-cli.js.map +1 -0
  269. package/dist/regression-api.d.ts +101 -0
  270. package/dist/regression-api.js +384 -5
  271. package/dist/regression-api.js.map +1 -1
  272. package/dist/regression-cli.d.ts +4 -0
  273. package/dist/regression-cli.js +232 -0
  274. package/dist/regression-cli.js.map +1 -0
  275. package/dist/report-api.d.ts +146 -0
  276. package/dist/report-api.js +430 -0
  277. package/dist/report-api.js.map +1 -0
  278. package/dist/report-cli.d.ts +12 -0
  279. package/dist/report-cli.js +147 -0
  280. package/dist/report-cli.js.map +1 -0
  281. package/dist/result-schema.d.ts +22 -0
  282. package/dist/result-schema.js +28 -0
  283. package/dist/result-schema.js.map +1 -0
  284. package/dist/run-index.d.ts +29 -0
  285. package/dist/run-index.js +70 -0
  286. package/dist/run-index.js.map +1 -0
  287. package/dist/run-screenshots.d.ts +123 -0
  288. package/dist/run-screenshots.js +229 -0
  289. package/dist/run-screenshots.js.map +1 -0
  290. package/dist/runtime-env.d.ts +8 -0
  291. package/dist/runtime-env.js +22 -0
  292. package/dist/runtime-env.js.map +1 -0
  293. package/dist/secret-args.d.ts +23 -0
  294. package/dist/secret-args.js +45 -0
  295. package/dist/secret-args.js.map +1 -0
  296. package/dist/serve-cli.d.ts +4 -0
  297. package/dist/serve-cli.js +95 -0
  298. package/dist/serve-cli.js.map +1 -0
  299. package/dist/server-log-verify.d.ts +34 -0
  300. package/dist/server-log-verify.js +115 -0
  301. package/dist/server-log-verify.js.map +1 -0
  302. package/dist/session-check.d.ts +14 -0
  303. package/dist/session-check.js +44 -0
  304. package/dist/session-check.js.map +1 -0
  305. package/dist/site-cli.d.ts +4 -0
  306. package/dist/site-cli.js +127 -0
  307. package/dist/site-cli.js.map +1 -0
  308. package/dist/site-gate-cli.d.ts +28 -0
  309. package/dist/site-gate-cli.js +58 -0
  310. package/dist/site-gate-cli.js.map +1 -0
  311. package/dist/source-api.js +18 -3
  312. package/dist/source-api.js.map +1 -1
  313. package/dist/source-cli.d.ts +4 -0
  314. package/dist/source-cli.js +284 -0
  315. package/dist/source-cli.js.map +1 -0
  316. package/dist/source-run-api.d.ts +27 -1
  317. package/dist/source-run-api.js +22 -11
  318. package/dist/source-run-api.js.map +1 -1
  319. package/dist/storage-state-snapshot.d.ts +50 -0
  320. package/dist/storage-state-snapshot.js +87 -0
  321. package/dist/storage-state-snapshot.js.map +1 -0
  322. package/dist/suite-explore-options.d.ts +289 -0
  323. package/dist/suite-explore-options.js +140 -0
  324. package/dist/suite-explore-options.js.map +1 -0
  325. package/dist/target-config.d.ts +109 -0
  326. package/dist/target-config.js +216 -0
  327. package/dist/target-config.js.map +1 -0
  328. package/dist/transcript-file.d.ts +12 -0
  329. package/dist/transcript-file.js +23 -0
  330. package/dist/transcript-file.js.map +1 -0
  331. package/dist/ui-api.d.ts +3 -0
  332. package/dist/ui-api.js +7 -1
  333. package/dist/ui-api.js.map +1 -1
  334. package/dist/usability-capture.d.ts +43 -0
  335. package/dist/usability-capture.js +326 -0
  336. package/dist/usability-capture.js.map +1 -0
  337. package/dist/usage-config.d.ts +36 -0
  338. package/dist/usage-config.js +114 -0
  339. package/dist/usage-config.js.map +1 -0
  340. package/dist/ux-api.d.ts +3 -75
  341. package/dist/ux-api.js +3 -220
  342. package/dist/ux-api.js.map +1 -1
  343. package/dist/ux-cli.d.ts +4 -0
  344. package/dist/ux-cli.js +102 -0
  345. package/dist/ux-cli.js.map +1 -0
  346. package/dist/ux-config.d.ts +29 -0
  347. package/dist/ux-config.js +103 -0
  348. package/dist/ux-config.js.map +1 -0
  349. package/dist/ux-evidence.d.ts +54 -0
  350. package/dist/ux-evidence.js +197 -0
  351. package/dist/ux-evidence.js.map +1 -0
  352. package/dist/ux-review.d.ts +112 -0
  353. package/dist/ux-review.js +151 -0
  354. package/dist/ux-review.js.map +1 -0
  355. package/dist/ux-usability.d.ts +238 -0
  356. package/dist/ux-usability.js +494 -0
  357. package/dist/ux-usability.js.map +1 -0
  358. package/dist/verify-fix-api.d.ts +173 -0
  359. package/dist/verify-fix-api.js +454 -0
  360. package/dist/verify-fix-api.js.map +1 -0
  361. package/dist/verify-fix-cli.d.ts +4 -0
  362. package/dist/verify-fix-cli.js +110 -0
  363. package/dist/verify-fix-cli.js.map +1 -0
  364. package/package.json +19 -14
  365. package/skills/jevitate-ci-check/SKILL.md +77 -0
  366. package/skills/jevitate-demo/SKILL.md +61 -0
  367. package/skills/jevitate-explore/SKILL.md +88 -87
  368. package/skills/jevitate-getting-started/SKILL.md +88 -0
  369. package/skills/jevitate-load-test/SKILL.md +11 -2
  370. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  371. package/skills/jevitate-record/SKILL.md +23 -5
  372. package/skills/jevitate-run-journey/SKILL.md +61 -17
  373. package/skills/jevitate-sources/SKILL.md +57 -14
  374. package/skills/jevitate-ux-review/SKILL.md +106 -16
  375. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,430 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { allResultDirs, projectDataDir } from "./project-dir.js";
3
+ import { indexedRunsFor, projectLogDirs } from "./run-index.js";
4
+ import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
5
+ import { basename, dirname, join, resolve } from "node:path";
6
+ import { consolidate, diffRuns, renderReportMarkdown, runFromMissionResult, runFromUxReport, runIdOf, } from "@jevitate/findings";
7
+ import { formatUsageLine, sumUsage, usageCountsFrom } from "@jevitate/ai-core";
8
+ /**
9
+ * The programmatic surface behind `jevitate report` (#139), `jevitate diff` / `--baseline` (#138)
10
+ * and `jevitate baseline tag`. It only READS what the runners already persisted — every result was
11
+ * redacted before it was written, so nothing here can surface a secret the result did not already
12
+ * hold; a report adds no page data and makes no model call.
13
+ *
14
+ * A "run reference" (a `<run>` argument) is, in order: a file path (a `<stem>.result.json`, a
15
+ * usability report, or a `jevitate check` record naming its results), a baseline tag name, or a
16
+ * run id (a result file's stem, looked up in the result dirs).
17
+ */
18
+ export class ReportInputError extends Error {
19
+ code = "E_REPORT_INPUT";
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = "ReportInputError";
23
+ }
24
+ }
25
+ /** Where results live by default: mission results next to their Recordings, and UX reports. */
26
+ export function defaultResultDirs() {
27
+ return allResultDirs();
28
+ }
29
+ /**
30
+ * #213: where a report reads by default. A bare `report` reads the CURRENT project only: its own
31
+ * `.jevitate/logs` (none outside a project) plus every run the run index recorded for this project —
32
+ * including runs written to an `--out` dir. With `--target`, every results dir is read too (the
33
+ * target filter keeps it to that app), plus the indexed runs.
34
+ */
35
+ export function defaultReportSources(withTarget, deps = {}) {
36
+ return { dirs: withTarget ? allResultDirs(deps) : projectLogDirs(deps), files: indexedRunsFor(deps) };
37
+ }
38
+ /** #213: where `diff`/`baseline tag` look a run id up: this project's sources first, then every results dir. */
39
+ export function defaultLookupDirs(deps = {}) {
40
+ return [...new Set([...projectLogDirs(deps), ...parentDirs(indexedRunsFor(deps)), ...allResultDirs(deps)])];
41
+ }
42
+ function parentDirs(files) {
43
+ return [...new Set(files.map((f) => dirname(f)))];
44
+ }
45
+ /** A scan plus the indexed result files it did not already read (each path once), oldest first. */
46
+ function withFiles(scanned, files) {
47
+ const seen = new Set(scanned.map((r) => resolve(r.path)));
48
+ const out = [...scanned];
49
+ for (const f of files) {
50
+ const path = resolve(f);
51
+ if (seen.has(path))
52
+ continue;
53
+ // A usability report whose persisted result is indexed too is the same run (read from the result).
54
+ if (UX_REPORT.test(basename(path)) && existsSync(`${path.slice(0, -".json".length)}.recording.result.json`))
55
+ continue;
56
+ seen.add(path);
57
+ const run = loadRunFile(path);
58
+ if (run !== null)
59
+ out.push(run);
60
+ }
61
+ return out.sort((a, b) => (a.startedAt ?? "").localeCompare(b.startedAt ?? "") || a.runId.localeCompare(b.runId));
62
+ }
63
+ /** The targets a report could be asked for: the runs' origins and suite target names, and registered mission targets. */
64
+ async function knownTargets(pool, missionTargetsDir) {
65
+ const known = new Set();
66
+ for (const r of pool) {
67
+ if (r.target !== undefined)
68
+ known.add(r.target);
69
+ if (r.targetName !== undefined)
70
+ known.add(r.targetName);
71
+ }
72
+ if (existsSync(missionTargetsDir)) {
73
+ for (const f of await readdir(missionTargetsDir)) {
74
+ if (!f.endsWith(".json"))
75
+ continue;
76
+ try {
77
+ const t = JSON.parse(await readFile(join(missionTargetsDir, f), "utf8"));
78
+ if (isRecord(t) && typeof t.name === "string")
79
+ known.add(t.name);
80
+ }
81
+ catch {
82
+ continue;
83
+ }
84
+ }
85
+ }
86
+ return [...known].sort();
87
+ }
88
+ export function defaultBaselinesDir() {
89
+ return projectDataDir(["baselines"]);
90
+ }
91
+ function readJson(path) {
92
+ return JSON.parse(readFileSync(path, "utf8"));
93
+ }
94
+ function isRecord(v) {
95
+ return v !== null && typeof v === "object" && !Array.isArray(v);
96
+ }
97
+ const UX_REPORT = /^usability-.*\d{3}Z\.json$/;
98
+ /** Is this file name one a result scan reads? (Recordings, transcripts and drafts are not.) */
99
+ function isResultName(name) {
100
+ return name.endsWith(".result.json") || UX_REPORT.test(name);
101
+ }
102
+ /** Reads one persisted result file into a run. Null for a file that is not a result. */
103
+ export function loadRunFile(path) {
104
+ let raw;
105
+ try {
106
+ raw = readJson(path);
107
+ }
108
+ catch {
109
+ return null; // an unreadable/partial file is not a run (never a fabricated empty one)
110
+ }
111
+ if (UX_REPORT.test(basename(path))) {
112
+ const stem = path.slice(0, -".json".length);
113
+ let site;
114
+ try {
115
+ const rec = readJson(`${stem}.recording.json`);
116
+ if (isRecord(rec) && typeof rec.site === "string")
117
+ site = rec.site;
118
+ }
119
+ catch {
120
+ site = undefined; // no sibling Recording: the report's origin is unknown
121
+ }
122
+ return runFromUxReport(path, raw, { ...(site === undefined ? {} : { site }), screenshotDir: `${stem}.screens` });
123
+ }
124
+ return runFromMissionResult(path, raw);
125
+ }
126
+ const MAX_SCAN_DEPTH = 8;
127
+ /**
128
+ * Every result in `dirs` and their subdirectories (#171: a `runs/<id>/…result.json` layout), oldest
129
+ * first. Missing dirs are skipped; dot-dirs, `node_modules` and symlinked dirs are not walked.
130
+ */
131
+ export function scanRuns(dirs) {
132
+ const seen = new Set();
133
+ const runs = [];
134
+ const walk = (dir, depth) => {
135
+ for (const entry of readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
136
+ const path = resolve(dir, entry.name);
137
+ if (entry.isDirectory()) {
138
+ if (depth < MAX_SCAN_DEPTH && !entry.name.startsWith(".") && entry.name !== "node_modules")
139
+ walk(path, depth + 1);
140
+ continue;
141
+ }
142
+ if (!entry.isFile() || !isResultName(entry.name) || seen.has(path))
143
+ continue;
144
+ // #213: a usability report next to its persisted result (`<stem>.recording.result.json`, which
145
+ // carries the same report) is the same run — read once, from the result.
146
+ if (UX_REPORT.test(entry.name) && existsSync(`${path.slice(0, -".json".length)}.recording.result.json`))
147
+ continue;
148
+ seen.add(path);
149
+ const run = loadRunFile(path);
150
+ if (run !== null)
151
+ runs.push(run);
152
+ }
153
+ };
154
+ for (const dir of dirs) {
155
+ if (!existsSync(dir) || !statSync(dir).isDirectory())
156
+ continue;
157
+ walk(dir, 0);
158
+ }
159
+ return runs.sort((a, b) => (a.startedAt ?? "").localeCompare(b.startedAt ?? "") || a.runId.localeCompare(b.runId));
160
+ }
161
+ // ── baselines ────────────────────────────────────────────────────────────────
162
+ const TAG = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
163
+ function tagPath(dir, name) {
164
+ if (!TAG.test(name))
165
+ throw new ReportInputError(`invalid baseline tag ${JSON.stringify(name)}: must match [A-Za-z0-9][A-Za-z0-9._-]*`);
166
+ return join(dir, `${name}.json`);
167
+ }
168
+ export async function tagBaseline(opts) {
169
+ const dir = opts.dir ?? defaultBaselinesDir();
170
+ const path = tagPath(dir, opts.name);
171
+ if (opts.runs.length === 0)
172
+ throw new ReportInputError("a baseline needs at least one run");
173
+ const tag = {
174
+ version: 1,
175
+ name: opts.name,
176
+ createdAt: (opts.nowIso ?? (() => new Date().toISOString()))(),
177
+ sources: opts.runs.map((r) => r.path),
178
+ runs: opts.runs,
179
+ };
180
+ await mkdir(dir, { recursive: true });
181
+ await writeFile(path, `${JSON.stringify(tag, null, 2)}\n`, "utf8");
182
+ return { tag, path };
183
+ }
184
+ export function readBaseline(name, dir = defaultBaselinesDir()) {
185
+ if (!TAG.test(name))
186
+ return null;
187
+ const path = join(dir, `${name}.json`);
188
+ if (!existsSync(path))
189
+ return null;
190
+ let raw;
191
+ try {
192
+ raw = readJson(path);
193
+ }
194
+ catch (e) {
195
+ throw new ReportInputError(`cannot read baseline ${path}: ${e instanceof Error ? e.message : String(e)}`);
196
+ }
197
+ if (!isRecord(raw) || raw.version !== 1 || !Array.isArray(raw.runs))
198
+ throw new ReportInputError(`not a baseline tag: ${path}`);
199
+ return raw;
200
+ }
201
+ export async function listBaselines(dir = defaultBaselinesDir()) {
202
+ if (!existsSync(dir))
203
+ return [];
204
+ const out = [];
205
+ for (const f of (await readdir(dir)).sort()) {
206
+ if (!f.endsWith(".json"))
207
+ continue;
208
+ const tag = readBaseline(f.slice(0, -".json".length), dir);
209
+ if (tag !== null)
210
+ out.push({ name: tag.name, createdAt: tag.createdAt, runs: tag.runs.length });
211
+ }
212
+ return out;
213
+ }
214
+ /** A `jevitate check` record: `{ kind: "jevitate-check", results: [paths] }` (or its envelope). */
215
+ function checkRecordResults(raw) {
216
+ const data = isRecord(raw) && isRecord(raw.data) ? raw.data : raw;
217
+ if (!isRecord(data) || data.kind !== "jevitate-check" || !Array.isArray(data.results))
218
+ return null;
219
+ return data.results.filter((p) => typeof p === "string");
220
+ }
221
+ /** Resolves one `<run>` reference to its runs (a check record or a baseline tag names several). */
222
+ export function resolveRunRef(ref, ctx) {
223
+ if (existsSync(ref) && statSync(ref).isFile()) {
224
+ const path = resolve(ref);
225
+ let raw;
226
+ try {
227
+ raw = readJson(path);
228
+ }
229
+ catch (e) {
230
+ throw new ReportInputError(`cannot read ${ref}: ${e instanceof Error ? e.message : String(e)}`);
231
+ }
232
+ const listed = checkRecordResults(raw);
233
+ if (listed !== null) {
234
+ return listed.map((p) => resolve(dirname(path), p)).flatMap((p) => {
235
+ const run = loadRunFile(p);
236
+ if (run === null)
237
+ throw new ReportInputError(`${ref} lists ${p}, which is not a readable result`);
238
+ return [run];
239
+ });
240
+ }
241
+ const run = loadRunFile(path);
242
+ if (run === null)
243
+ throw new ReportInputError(`${ref} is not a mission result, usability report or check record`);
244
+ return [run];
245
+ }
246
+ const tag = readBaseline(ref, ctx.baselinesDir);
247
+ // #171: a tag snapshotted before runs carried their scope re-reads it from the result file, when
248
+ // that still exists (otherwise the run compares by mode and target only).
249
+ if (tag !== null)
250
+ return tag.runs.map((r) => (r.scope === undefined && existsSync(r.path) ? (loadRunFile(r.path) ?? r) : r));
251
+ const id = runIdOf(ref);
252
+ for (const dir of ctx.dirs) {
253
+ for (const candidate of [join(dir, `${id}.result.json`), join(dir, `${id}.json`)]) {
254
+ if (!existsSync(candidate))
255
+ continue;
256
+ const run = loadRunFile(candidate);
257
+ if (run !== null)
258
+ return [run];
259
+ }
260
+ }
261
+ throw new ReportInputError(`no run, baseline tag or result file named ${JSON.stringify(ref)} (searched ${ctx.dirs.join(", ")})`);
262
+ }
263
+ export function resolveRunRefs(refs, ctx) {
264
+ const byPath = new Map();
265
+ for (const ref of refs)
266
+ for (const r of resolveRunRef(ref, ctx))
267
+ byPath.set(`${r.path}#${r.runId}`, r);
268
+ return [...byPath.values()];
269
+ }
270
+ /**
271
+ * `last`: for every (target, mode) the current runs cover, the most recent EARLIER run of that
272
+ * target and mode in `pool` — "the last run on this target", per mode.
273
+ */
274
+ export function lastRunsBefore(current, pool) {
275
+ const currentIds = new Set(current.map((r) => r.path));
276
+ const out = new Map();
277
+ const pairs = new Map();
278
+ for (const r of current) {
279
+ const k = `${r.target ?? ""}|${r.mode}`;
280
+ const t = r.startedAt ?? "";
281
+ const prev = pairs.get(k);
282
+ if (prev === undefined || t < prev)
283
+ pairs.set(k, t);
284
+ }
285
+ for (const r of pool) {
286
+ if (currentIds.has(r.path))
287
+ continue;
288
+ const k = `${r.target ?? ""}|${r.mode}`;
289
+ const before = pairs.get(k);
290
+ if (before === undefined || (r.startedAt ?? "") >= before)
291
+ continue;
292
+ const prev = out.get(k);
293
+ if (prev === undefined || (prev.startedAt ?? "") < (r.startedAt ?? ""))
294
+ out.set(k, r);
295
+ }
296
+ return [...out.values()];
297
+ }
298
+ /** Resolves `--baseline <run|tag|last>` against the current runs. */
299
+ export function resolveBaseline(ref, current, ctx) {
300
+ if (ref === "last")
301
+ return lastRunsBefore(current, ctx.pool ?? scanRuns(ctx.dirs));
302
+ return resolveRunRef(ref, ctx);
303
+ }
304
+ // ── targets ──────────────────────────────────────────────────────────────────
305
+ /**
306
+ * `--target <origin|name>`: an origin (or any URL on it), or a name — a suite target name stamped
307
+ * on results by `jevitate check`, or a registered mission target (`~/.jevitate/missions/targets`).
308
+ */
309
+ export async function resolveTargetFilter(target, missionTargetsDir) {
310
+ try {
311
+ return { origins: [new URL(target).origin], name: target };
312
+ }
313
+ catch {
314
+ // not a URL: a name
315
+ }
316
+ const origins = [];
317
+ if (existsSync(missionTargetsDir)) {
318
+ for (const f of await readdir(missionTargetsDir)) {
319
+ if (!f.endsWith(".json"))
320
+ continue;
321
+ try {
322
+ const t = JSON.parse(await readFile(join(missionTargetsDir, f), "utf8"));
323
+ if (isRecord(t) && (t.id === target || t.name === target) && typeof t.authorizedOrigin === "string") {
324
+ origins.push(new URL(t.authorizedOrigin).origin);
325
+ }
326
+ }
327
+ catch {
328
+ continue; // a corrupt target file names nothing
329
+ }
330
+ }
331
+ }
332
+ return { origins, name: target };
333
+ }
334
+ /** `--since <run|date>`: an ISO date/time, or a run reference whose start time is the cut-off. */
335
+ export function resolveSince(since, ctx) {
336
+ if (/^\d{4}-\d{2}-\d{2}/.test(since) && !Number.isNaN(Date.parse(since)))
337
+ return new Date(Date.parse(since)).toISOString();
338
+ const runs = resolveRunRef(since, ctx);
339
+ const times = runs.map((r) => r.startedAt).filter((t) => t !== undefined).sort();
340
+ if (times[0] === undefined)
341
+ throw new ReportInputError(`--since ${since}: that run has no start time`);
342
+ return times[0];
343
+ }
344
+ export function summarizeRun(r) {
345
+ return {
346
+ runId: r.runId,
347
+ mode: r.mode,
348
+ path: r.path,
349
+ findings: r.observations.length,
350
+ ...(r.target === undefined ? {} : { target: r.target }),
351
+ ...(r.startedAt === undefined ? {} : { startedAt: r.startedAt }),
352
+ ...(r.missionOutcome === undefined ? {} : { missionOutcome: r.missionOutcome }),
353
+ ...(r.goalOutcome === undefined ? {} : { goalOutcome: r.goalOutcome }),
354
+ ...(r.targetBuild === undefined ? {} : { targetBuild: r.targetBuild }),
355
+ ...(r.engine?.commit === undefined ? {} : { engineCommit: r.engine.commit }),
356
+ };
357
+ }
358
+ export async function buildReport(opts) {
359
+ const explicitDirs = opts.dirs !== undefined && opts.dirs.length > 0;
360
+ const sources = explicitDirs ? { dirs: [...opts.dirs], files: [] } : defaultReportSources(opts.target !== undefined, opts.index);
361
+ const dirs = sources.dirs;
362
+ const ctx = { dirs: [...dirs, ...parentDirs(sources.files)], ...(opts.baselinesDir === undefined ? {} : { baselinesDir: opts.baselinesDir }) };
363
+ const scanPool = () => withFiles(scanRuns(dirs), sources.files);
364
+ const pool = opts.runs ?? scanPool();
365
+ let runs = [...pool];
366
+ let targetLabel;
367
+ if (opts.target !== undefined) {
368
+ const t = await resolveTargetFilter(opts.target, opts.missionTargetsDir);
369
+ targetLabel = t.origins.length > 0 ? t.origins.join(", ") : t.name;
370
+ runs = runs.filter((r) => (r.target !== undefined && t.origins.includes(r.target)) || r.targetName === t.name);
371
+ // #213: a target no run was ever recorded for is refused (exit 64), naming the known ones — never
372
+ // an empty report that reads like "nothing wrong".
373
+ if (runs.length === 0 && opts.runs === undefined) {
374
+ const known = await knownTargets(pool, opts.missionTargetsDir);
375
+ throw new ReportInputError(`--target ${JSON.stringify(opts.target)} matches no recorded run${known.length === 0 ? " (no runs found at all)" : `; known targets: ${known.join(", ")}`}`);
376
+ }
377
+ }
378
+ const since = opts.since === undefined ? undefined : resolveSince(opts.since, ctx);
379
+ if (since !== undefined)
380
+ runs = runs.filter((r) => r.startedAt !== undefined && r.startedAt >= since);
381
+ const defects = consolidate(runs);
382
+ let diff;
383
+ let baselineRuns;
384
+ if (opts.baseline !== undefined) {
385
+ baselineRuns = resolveBaseline(opts.baseline, runs, { ...ctx, pool: opts.runs === undefined ? pool : scanPool() });
386
+ diff = diffRuns(baselineRuns, runs);
387
+ }
388
+ const usage = usageOfRuns(runs);
389
+ const markdown = renderReportMarkdown({
390
+ title: `Defect report${targetLabel === undefined ? "" : ` — ${targetLabel}`}${since === undefined ? "" : ` since ${since}`}`,
391
+ runs,
392
+ defects,
393
+ ...(diff === undefined ? {} : { diff }),
394
+ }) + usageMarkdown(usage);
395
+ return {
396
+ ...(targetLabel === undefined ? {} : { target: targetLabel }),
397
+ ...(since === undefined ? {} : { since }),
398
+ runs: runs.map(summarizeRun),
399
+ defects,
400
+ summary: {
401
+ defects: defects.filter((d) => d.severity === "hard").length,
402
+ advisory: defects.filter((d) => d.severity === "advisory").length,
403
+ runs: runs.length,
404
+ },
405
+ usage,
406
+ ...(diff === undefined ? {} : { diff }),
407
+ ...(baselineRuns === undefined ? {} : { baselineRuns: baselineRuns.map(summarizeRun) }),
408
+ markdown,
409
+ };
410
+ }
411
+ /** Sums the runs' persisted usage (#163). */
412
+ export function usageOfRuns(runs) {
413
+ return sumUsage(runs.map((r) => usageCountsFrom(r.usage)), { unreported: "ignore" });
414
+ }
415
+ /** The report's cost section: the full total, flagged when partial. */
416
+ export function usageMarkdown(u) {
417
+ if (u.judgments + u.generations === 0)
418
+ return "";
419
+ const unreported = u.unreportedRuns === undefined ? "" : ` (${u.unreportedRuns} run(s) carried no usage)`;
420
+ return `\n## Model cost\n\n${formatUsageLine(u)} over ${u.runs} run(s)${unreported}\n`;
421
+ }
422
+ /** `jevitate diff <runA> <runB>`: A is the baseline side, B the current side. */
423
+ export function diffRunRefs(a, b, ctx) {
424
+ const base = resolveRunRef(a, ctx);
425
+ const cur = resolveRunRef(b, ctx);
426
+ const diff = diffRuns(base, cur);
427
+ const markdown = renderReportMarkdown({ title: `Diff ${a} → ${b}`, runs: cur, defects: consolidate(cur), diff });
428
+ return { diff, markdown, baseline: base.map(summarizeRun), current: cur.map(summarizeRun) };
429
+ }
430
+ //# sourceMappingURL=report-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-api.js","sourceRoot":"","sources":["../src/report-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * `jevitate report` (#139), `jevitate diff` and `jevitate baseline` (#138). Read-only over persisted
4
+ * results (already redacted); `baseline tag` writes a findings snapshot under `~/.jevitate/baselines`.
5
+ */
6
+ export interface ReportCliDeps {
7
+ /** Mission targets dir used to resolve `--target <name>` (default `~/.jevitate/missions/targets`). */
8
+ readonly missionTargetsDir: string;
9
+ /** Baselines dir (default `~/.jevitate/baselines`). */
10
+ readonly baselinesDir?: string;
11
+ }
12
+ export declare function registerReportCommands(program: Command, deps: ReportCliDeps): void;
@@ -0,0 +1,147 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { ok, fail } from "./envelope.js";
4
+ import { emitJsonOrRefusal } from "./cli-refusal.js";
5
+ import { formatBaselineListHuman, formatBaselineShowHuman, formatBaselineTagHuman } from "./cli-output.js";
6
+ import { ReportInputError, buildReport, defaultLookupDirs, diffRunRefs, listBaselines, readBaseline, resolveRunRefs, summarizeRun, tagBaseline, } from "./report-api.js";
7
+ /** The envelope (success, or a refusal with --json); a refusal without --json is a human stderr line (#218). */
8
+ function emit(program, envelope, exitCode) {
9
+ emitJsonOrRefusal(program, envelope, exitCode);
10
+ }
11
+ function failure(program, err, code) {
12
+ if (err instanceof ReportInputError)
13
+ emit(program, fail(err.code, err.message));
14
+ else
15
+ emit(program, fail(code, err instanceof Error ? err.message : String(err)));
16
+ }
17
+ const collect = (v, prev) => [...prev, v];
18
+ export function registerReportCommands(program, deps) {
19
+ program
20
+ .command("report")
21
+ .description("one deduped defect list for a target across every mode and run (markdown + JSON envelope)")
22
+ .option("--target <origin|name>", "the target: an origin (or URL on it), a suite target name, or a registered mission target")
23
+ .option("--since <run|date>", "only runs that started at/after this ISO date or this run")
24
+ .option("--dir <dir>", "results dir to read (repeatable). Default: this project's runs — its .jevitate/logs plus every run recorded for it in ~/.jevitate/run-index.jsonl (including --out dirs); with --target, every .jevitate/logs dir (project and ~/.jevitate) and the 0.1.0 recordings/ux-reports dirs too", collect, [])
25
+ .option("--baseline <run|tag|last>", "add a diff section against a baseline: a run, a `baseline tag`, or `last` (the previous run per target+mode)")
26
+ .option("--out <dir>", "also write report.md and report.json here")
27
+ .option("--json", "emit the JSON envelope instead of markdown")
28
+ .action(async function () {
29
+ const o = this.opts();
30
+ try {
31
+ const report = await buildReport({
32
+ missionTargetsDir: deps.missionTargetsDir,
33
+ dirs: o.dir,
34
+ ...(o.target === undefined ? {} : { target: o.target }),
35
+ ...(o.since === undefined ? {} : { since: o.since }),
36
+ ...(o.baseline === undefined ? {} : { baseline: o.baseline }),
37
+ ...(deps.baselinesDir === undefined ? {} : { baselinesDir: deps.baselinesDir }),
38
+ });
39
+ if (o.out !== undefined) {
40
+ await mkdir(o.out, { recursive: true });
41
+ await writeFile(join(o.out, "report.md"), report.markdown, "utf8");
42
+ await writeFile(join(o.out, "report.json"), `${JSON.stringify(ok(report), null, 2)}\n`, "utf8");
43
+ }
44
+ if (o.json)
45
+ emit(program, ok(report), 0);
46
+ else {
47
+ program.configureOutput().writeOut?.(report.markdown);
48
+ process.exitCode = 0;
49
+ }
50
+ }
51
+ catch (err) {
52
+ failure(program, err, "E_REPORT");
53
+ }
54
+ });
55
+ program
56
+ .command("diff <runA> <runB>")
57
+ .description("classify findings new / resolved / still-present / flaky / not-rerun between two runs (runA = baseline)")
58
+ .option("--dir <dir>", "results dir to look run ids up in (repeatable)", collect, [])
59
+ .option("--json", "emit the JSON envelope instead of markdown")
60
+ .action(async function (runA, runB) {
61
+ const o = this.opts();
62
+ try {
63
+ const r = diffRunRefs(runA, runB, {
64
+ dirs: o.dir.length > 0 ? o.dir : defaultLookupDirs(),
65
+ ...(deps.baselinesDir === undefined ? {} : { baselinesDir: deps.baselinesDir }),
66
+ });
67
+ if (o.json)
68
+ emit(program, ok({ baseline: r.baseline, current: r.current, summary: r.diff.summary, entries: r.diff.entries }), 0);
69
+ else {
70
+ program.configureOutput().writeOut?.(r.markdown);
71
+ process.exitCode = 0;
72
+ }
73
+ }
74
+ catch (err) {
75
+ failure(program, err, "E_DIFF");
76
+ }
77
+ });
78
+ const baseline = program.command("baseline").description("named baselines for `diff`, `report --baseline` and `check --baseline`");
79
+ baseline
80
+ .command("tag <name> <runs...>")
81
+ .description("snapshot runs (result files, run ids, check records or other tags) as a named baseline")
82
+ .option("--dir <dir>", "results dir to look run ids up in (repeatable)", collect, [])
83
+ .option("--json", "emit a JSON envelope")
84
+ .action(async function (name, runs) {
85
+ const o = this.opts();
86
+ try {
87
+ const dirs = o.dir.length > 0 ? o.dir : defaultLookupDirs();
88
+ const resolved = resolveRunRefs(runs, { dirs, ...(deps.baselinesDir === undefined ? {} : { baselinesDir: deps.baselinesDir }) });
89
+ const { tag, path } = await tagBaseline({ name, runs: resolved, ...(deps.baselinesDir === undefined ? {} : { dir: deps.baselinesDir }) });
90
+ const data = { name: tag.name, path, createdAt: tag.createdAt, runs: tag.runs.map(summarizeRun) };
91
+ // #227: a human summary without --json — this used to print the raw envelope unconditionally.
92
+ if (o.json)
93
+ emit(program, ok(data), 0);
94
+ else {
95
+ program.configureOutput().writeOut?.(formatBaselineTagHuman(data));
96
+ process.exitCode = 0;
97
+ }
98
+ }
99
+ catch (err) {
100
+ failure(program, err, "E_BASELINE");
101
+ }
102
+ });
103
+ baseline
104
+ .command("list")
105
+ .option("--json", "emit a JSON envelope")
106
+ .action(async function () {
107
+ const o = this.opts();
108
+ try {
109
+ const listing = await listBaselines(deps.baselinesDir);
110
+ // #227: `--json` was never read here before — success always printed the raw envelope.
111
+ if (o.json)
112
+ emit(program, ok(listing), 0);
113
+ else {
114
+ program.configureOutput().writeOut?.(formatBaselineListHuman(listing));
115
+ process.exitCode = 0;
116
+ }
117
+ }
118
+ catch (err) {
119
+ failure(program, err, "E_BASELINE");
120
+ }
121
+ });
122
+ baseline
123
+ .command("show <name>")
124
+ .option("--json", "emit a JSON envelope")
125
+ .action(async function (name) {
126
+ const o = this.opts();
127
+ try {
128
+ const tag = readBaseline(name, deps.baselinesDir);
129
+ if (tag === null) {
130
+ emit(program, fail("E_BASELINE_NOT_FOUND", `no baseline tag named ${JSON.stringify(name)}`));
131
+ }
132
+ else {
133
+ const data = { name: tag.name, createdAt: tag.createdAt, sources: tag.sources, runs: tag.runs.map(summarizeRun) };
134
+ if (o.json)
135
+ emit(program, ok(data), 0);
136
+ else {
137
+ program.configureOutput().writeOut?.(formatBaselineShowHuman(data));
138
+ process.exitCode = 0;
139
+ }
140
+ }
141
+ }
142
+ catch (err) {
143
+ failure(program, err, "E_BASELINE");
144
+ }
145
+ });
146
+ }
147
+ //# sourceMappingURL=report-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-cli.js","sourceRoot":"","sources":["../src/report-cli.ts"],"names":[],"mappings":"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"}