@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,232 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { RecordingSchema } from "@jevitate/recording";
5
+ import { BrowseTheWebToken } from "@jevitate/screenplay";
6
+ import { ok, fail } from "./envelope.js";
7
+ import { runRegressionCapture, runRegressionRun, RegressionNotFoundError, RegressionHardSignalOracleError, RegressionExistsError } from "./regression-api.js";
8
+ import { regressionFixtures, withFixtureFlags } from "./fixture-cli.js";
9
+ import { rebindReplayNavigation } from "./mission-fixtures.js";
10
+ import { withEngine } from "./engine.js";
11
+ import { positiveIntArg } from "./cli-args.js";
12
+ import { formatRegressionCaptureHuman, formatRegressionRunHuman } from "./cli-output.js";
13
+ import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
14
+ import { resolveRegressionsDir, makeRealBrowserActor, withBrowserLaunchFlags, browserRunFromFlags, withDemoFlags, withEmulationFlags, emulationFromFlags, emitJson, environmentSeams, refuseUnsafeName, writeHumanResult, } from "./cli-shared.js";
15
+ /** Registers `jevitate regression`: `capture` and `run`. */
16
+ export function registerRegressionCommands(program, deps) {
17
+ // Additive: `@jevitate/regression` — reproduce -> minimize -> commit a
18
+ // failing Recording into a committed regression artifact (Ticket #5).
19
+ // Independent of the `journey`/`load` commands above; wires a real
20
+ // Playwright-backed `makeActor` (one fresh browser session per
21
+ // reproduce/minimize attempt, closed after each use) into
22
+ // `runRegressionCapture`.
23
+ const regression = program.command("regression").description("capture, run and manage regression tests from discovered failures");
24
+ withDemoFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(regression.command("capture")))))
25
+ .requiredOption("--from <file>", "path to the schema-valid failing Recording JSON to capture")
26
+ .requiredOption("--id <id>", "regression id (used for the committed <id>.recording.json/<id>.meta.json filenames)")
27
+ .option("--dir <path>", "regressions directory (default: the repo's .jevitate/regressions; outside a repo ~/.jevitate/regressions)")
28
+ .option("--attempts <n>", "reproduction attempts before labeling flaky", positiveIntArg, 3)
29
+ .option("--summary <text>", "optional human-readable bug summary recorded in the meta sidecar")
30
+ .option("--result <file>", "mission result JSON (as written alongside --from by `jevitate explore`) — supplies a failure oracle when the Recording alone never fails on replay")
31
+ .option("--fingerprint <fp>", "pin the required failure — a structural step signature (alone, restricts --from to failing at exactly that step), or (with --result, #119/#129) a defect/invariant fingerprint from the mission's own findings; with --result alone, cross-checks the derived oracle")
32
+ .option("--storage-state <file>", "Playwright storageState JSON to open the reproduce/minimize browser sessions authenticated (#129); must exist")
33
+ .option("--force", "overwrite an existing regression id's committed files (default: refused, #213)", false)
34
+ .option("--json", "emit a JSON envelope")
35
+ .action(async function () {
36
+ // #245: demo mode (--headed/--slow-mo), resolved before any browser opens.
37
+ let browser;
38
+ try {
39
+ browser = browserRunFromFlags(this.opts(), deps.explore?.env ?? process.env);
40
+ }
41
+ catch (err) {
42
+ emitJson(program, fail("E_REGRESSION_ARGS", err instanceof Error ? err.message : String(err)));
43
+ return;
44
+ }
45
+ const flags = this.opts();
46
+ const { from, id, dir, attempts, summary, result: resultPath, fingerprint, storageState, force, json } = flags;
47
+ if (refuseUnsafeName(program, id, "regression id"))
48
+ return;
49
+ // #218: unusable input is refused up front (64), never a capture that broke at runtime (2).
50
+ for (const [flag, path] of [["--from", from], ["--result", resultPath]]) {
51
+ if (path !== undefined && !existsSync(path)) {
52
+ emitJson(program, fail("E_REGRESSION_ARGS", `${flag} file not found: ${path}`));
53
+ return;
54
+ }
55
+ }
56
+ if (storageState !== undefined && !existsSync(storageState)) {
57
+ emitJson(program, fail("E_REGRESSION_ARGS", `storage state not found: ${storageState}`));
58
+ return;
59
+ }
60
+ let captureEmulationFlag;
61
+ try {
62
+ captureEmulationFlag = emulationFromFlags(flags);
63
+ }
64
+ catch (err) {
65
+ emitJson(program, fail("E_REGRESSION_ARGS", err instanceof Error ? err.message : String(err)));
66
+ return;
67
+ }
68
+ const opened = [];
69
+ let fx;
70
+ try {
71
+ const raw = JSON.parse(await readFile(from, "utf8"));
72
+ const recording = RecordingSchema.parse(raw);
73
+ // #149: --viewport/--device, else the Recording's OWN emulation (reproduces under the same device).
74
+ const captureEmulation = captureEmulationFlag ??
75
+ (recording.emulation === undefined
76
+ ? undefined
77
+ : recording.emulation.device !== undefined
78
+ ? { device: recording.emulation.device }
79
+ : { viewport: recording.emulation.viewport });
80
+ // #144: every reproduce/minimize replay restores the fixture state the Recording started from.
81
+ fx = regressionFixtures(flags, recording, resultPath === undefined ? undefined : JSON.parse(await readFile(resultPath, "utf8")), storageState);
82
+ const replayFixture = fx;
83
+ const result = await runRegressionCapture({
84
+ failingRecordingPath: from,
85
+ id,
86
+ regressionsDir: resolveRegressionsDir(dir),
87
+ attempts: Number(attempts),
88
+ bugSummary: summary,
89
+ resultPath,
90
+ fingerprint,
91
+ force,
92
+ makeActor: async () => {
93
+ await replayFixture?.reset();
94
+ const { actor, close } = await makeRealBrowserActor(recording.site, storageState, captureEmulation, browser, deps.explore?.browserPortFactory);
95
+ opened.push(close);
96
+ if (replayFixture !== undefined) {
97
+ rebindReplayNavigation(actor.ability(BrowseTheWebToken).session.page, recording.fixture?.outputs ?? {}, replayFixture.publicOutputs());
98
+ }
99
+ return actor;
100
+ },
101
+ }).then((r) => withEngine(r));
102
+ await fx?.restore();
103
+ const envelope = ok(fx === undefined ? result : { ...result, fixtures: fx.record() });
104
+ if (json) {
105
+ emitJson(program, envelope);
106
+ }
107
+ else {
108
+ // #227/#230: a human summary (captured/flaky, where the files went, what to run next,
109
+ // carrying the same --dir the user passed) — never the raw result JSON, which used to
110
+ // print unconditionally without --json.
111
+ writeHumanResult(program, result, (r) => formatRegressionCaptureHuman(r, { dir }));
112
+ process.exitCode = 0;
113
+ }
114
+ }
115
+ catch (err) {
116
+ // #213: these two are usage refusals (64) — an existing id needing --force, or a
117
+ // hard-signal defect that needs `ledger add` instead — never a generic capture failure (2).
118
+ if (err instanceof RegressionExistsError || err instanceof RegressionHardSignalOracleError) {
119
+ emitJson(program, fail(err.code, err.message));
120
+ }
121
+ else {
122
+ emitJson(program, fail("E_REGRESSION_CAPTURE", String(err instanceof Error ? err.message : err)));
123
+ }
124
+ }
125
+ finally {
126
+ for (const close of opened)
127
+ await close();
128
+ await fx?.restore();
129
+ }
130
+ });
131
+ // Additive: `regression run <id>` (#129 item 4) — replays a committed regression (whatever
132
+ // `regression capture` wrote — a step-oracle, network-check, or declared-invariant one) and
133
+ // reports "reproduces" or "fixed". The one CLI/MCP surface `loadRegressions`/`replayRegression`
134
+ // (`@jevitate/regression`) previously had none of.
135
+ withEnvironmentFlags(withDemoFlags(withBrowserLaunchFlags(withEmulationFlags(regression.command("run")))))
136
+ .argument("<id>", "the committed regression id (its <id>.recording.json/<id>.meta.json)")
137
+ .option("--dir <path>", "regressions directory (default: the repo's .jevitate/regressions; outside a repo ~/.jevitate/regressions)")
138
+ .option("--attempts <n>", "fresh-context replays for a declared-invariant oracle (default 3)", positiveIntArg)
139
+ .option("--storage-state <file>", "Playwright storageState JSON to open the replay session authenticated (#129); must exist")
140
+ .option("--json", "emit a JSON envelope")
141
+ .action(async function (id) {
142
+ // #245: demo mode (--headed/--slow-mo), resolved before any browser opens.
143
+ let browser;
144
+ try {
145
+ browser = browserRunFromFlags(this.opts(), deps.explore?.env ?? process.env);
146
+ }
147
+ catch (err) {
148
+ emitJson(program, fail("E_REGRESSION_ARGS", err instanceof Error ? err.message : String(err)));
149
+ return;
150
+ }
151
+ const { dir, attempts, storageState: storageStateFlag, json, env: envName, baseUrl, ...emulationFlags } = this.opts();
152
+ // #247: --env/--base-url choose where the regression replays (unknown env / bad file → 64).
153
+ let environment;
154
+ try {
155
+ environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
156
+ }
157
+ catch (err) {
158
+ if (!isEnvironmentError(err))
159
+ throw err;
160
+ emitJson(program, fail(err.code, err.message));
161
+ return;
162
+ }
163
+ // --storage-state wins; else the environment's own session (~/.jevitate/targets.json[<origin>]).
164
+ const storageState = storageStateFlag ?? environment?.storageState;
165
+ if (storageState !== undefined && !existsSync(storageState)) {
166
+ emitJson(program, fail("E_REGRESSION_ARGS", `storage state not found: ${storageState}`));
167
+ return;
168
+ }
169
+ let runEmulationFlag;
170
+ try {
171
+ runEmulationFlag = emulationFromFlags(emulationFlags);
172
+ }
173
+ catch (err) {
174
+ emitJson(program, fail("E_REGRESSION_ARGS", err instanceof Error ? err.message : String(err)));
175
+ return;
176
+ }
177
+ if (refuseUnsafeName(program, id, "regression id"))
178
+ return;
179
+ const regressionsDir = resolveRegressionsDir(dir);
180
+ // #218: an unknown id is a usage error (64), refused before anything opens.
181
+ if (!existsSync(join(regressionsDir, `${id}.recording.json`))) {
182
+ const notFound = new RegressionNotFoundError(id, regressionsDir);
183
+ emitJson(program, fail(notFound.code, notFound.message));
184
+ return;
185
+ }
186
+ const opened = [];
187
+ try {
188
+ const recording = RecordingSchema.parse(JSON.parse(await readFile(join(regressionsDir, `${id}.recording.json`), "utf8")));
189
+ // #149: --viewport/--device, else the committed Recording's OWN emulation.
190
+ const runEmulation = runEmulationFlag ??
191
+ (recording.emulation === undefined
192
+ ? undefined
193
+ : recording.emulation.device !== undefined
194
+ ? { device: recording.emulation.device }
195
+ : { viewport: recording.emulation.viewport });
196
+ const report = await runRegressionRun({
197
+ id,
198
+ regressionsDir,
199
+ ...(attempts !== undefined ? { attempts: Number(attempts) } : {}),
200
+ ...(environment === undefined ? {} : { environment }),
201
+ makeActor: async () => {
202
+ const { actor, close } = await makeRealBrowserActor(environment?.baseUrl ?? recording.site, storageState, runEmulation, browser, deps.explore?.browserPortFactory, environment?.allowedOrigins);
203
+ opened.push(close);
204
+ return actor;
205
+ },
206
+ });
207
+ const envelope = ok(withEngine(report));
208
+ if (json) {
209
+ emitJson(program, envelope);
210
+ }
211
+ else {
212
+ // #227/#230: the verdict/reason/next-step summary (carrying the same --dir the user
213
+ // passed) — never the raw report JSON.
214
+ program.configureOutput().writeOut?.(formatRegressionRunHuman(report, { dir }));
215
+ }
216
+ process.exitCode = report.verdict === "reproduces" ? 1 : report.verdict === "fixed" ? 0 : 2;
217
+ }
218
+ catch (err) {
219
+ if (err instanceof RegressionNotFoundError || isEnvironmentError(err)) {
220
+ emitJson(program, fail(err.code, err.message));
221
+ }
222
+ else {
223
+ emitJson(program, fail("E_REGRESSION_RUN", String(err instanceof Error ? err.message : err)));
224
+ }
225
+ }
226
+ finally {
227
+ for (const close of opened)
228
+ await close();
229
+ }
230
+ });
231
+ }
232
+ //# sourceMappingURL=regression-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression-cli.js","sourceRoot":"","sources":["../src/regression-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { type RunIndexDeps } from "./run-index.js";
2
+ import { type ConsolidatedDefect, type FindingsDiff, type RunRecord } from "@jevitate/findings";
3
+ import { type UsageAggregate } from "@jevitate/ai-core";
4
+ /**
5
+ * The programmatic surface behind `jevitate report` (#139), `jevitate diff` / `--baseline` (#138)
6
+ * and `jevitate baseline tag`. It only READS what the runners already persisted — every result was
7
+ * redacted before it was written, so nothing here can surface a secret the result did not already
8
+ * hold; a report adds no page data and makes no model call.
9
+ *
10
+ * A "run reference" (a `<run>` argument) is, in order: a file path (a `<stem>.result.json`, a
11
+ * usability report, or a `jevitate check` record naming its results), a baseline tag name, or a
12
+ * run id (a result file's stem, looked up in the result dirs).
13
+ */
14
+ export declare class ReportInputError extends Error {
15
+ readonly code: "E_REPORT_INPUT";
16
+ constructor(message: string);
17
+ }
18
+ /** Where results live by default: mission results next to their Recordings, and UX reports. */
19
+ export declare function defaultResultDirs(): string[];
20
+ /**
21
+ * #213: where a report reads by default. A bare `report` reads the CURRENT project only: its own
22
+ * `.jevitate/logs` (none outside a project) plus every run the run index recorded for this project —
23
+ * including runs written to an `--out` dir. With `--target`, every results dir is read too (the
24
+ * target filter keeps it to that app), plus the indexed runs.
25
+ */
26
+ export declare function defaultReportSources(withTarget: boolean, deps?: RunIndexDeps): {
27
+ dirs: string[];
28
+ files: string[];
29
+ };
30
+ /** #213: where `diff`/`baseline tag` look a run id up: this project's sources first, then every results dir. */
31
+ export declare function defaultLookupDirs(deps?: RunIndexDeps): string[];
32
+ export declare function defaultBaselinesDir(): string;
33
+ /** Reads one persisted result file into a run. Null for a file that is not a result. */
34
+ export declare function loadRunFile(path: string): RunRecord | null;
35
+ /**
36
+ * Every result in `dirs` and their subdirectories (#171: a `runs/<id>/…result.json` layout), oldest
37
+ * first. Missing dirs are skipped; dot-dirs, `node_modules` and symlinked dirs are not walked.
38
+ */
39
+ export declare function scanRuns(dirs: readonly string[]): RunRecord[];
40
+ export interface BaselineTag {
41
+ readonly version: 1;
42
+ readonly name: string;
43
+ readonly createdAt: string;
44
+ /** The result files it was tagged from (evidence; the runs below are a snapshot of them). */
45
+ readonly sources: readonly string[];
46
+ /** Snapshot of the tagged runs' findings, so a baseline survives its result files being pruned. */
47
+ readonly runs: readonly RunRecord[];
48
+ }
49
+ export declare function tagBaseline(opts: {
50
+ name: string;
51
+ runs: readonly RunRecord[];
52
+ dir?: string;
53
+ nowIso?: () => string;
54
+ }): Promise<{
55
+ tag: BaselineTag;
56
+ path: string;
57
+ }>;
58
+ export declare function readBaseline(name: string, dir?: string): BaselineTag | null;
59
+ export declare function listBaselines(dir?: string): Promise<Array<{
60
+ name: string;
61
+ createdAt: string;
62
+ runs: number;
63
+ }>>;
64
+ export interface RunRefContext {
65
+ readonly dirs: readonly string[];
66
+ readonly baselinesDir?: string;
67
+ }
68
+ /** Resolves one `<run>` reference to its runs (a check record or a baseline tag names several). */
69
+ export declare function resolveRunRef(ref: string, ctx: RunRefContext): RunRecord[];
70
+ export declare function resolveRunRefs(refs: readonly string[], ctx: RunRefContext): RunRecord[];
71
+ /**
72
+ * `last`: for every (target, mode) the current runs cover, the most recent EARLIER run of that
73
+ * target and mode in `pool` — "the last run on this target", per mode.
74
+ */
75
+ export declare function lastRunsBefore(current: readonly RunRecord[], pool: readonly RunRecord[]): RunRecord[];
76
+ /** Resolves `--baseline <run|tag|last>` against the current runs. */
77
+ export declare function resolveBaseline(ref: string, current: readonly RunRecord[], ctx: RunRefContext & {
78
+ pool?: readonly RunRecord[];
79
+ }): RunRecord[];
80
+ /**
81
+ * `--target <origin|name>`: an origin (or any URL on it), or a name — a suite target name stamped
82
+ * on results by `jevitate check`, or a registered mission target (`~/.jevitate/missions/targets`).
83
+ */
84
+ export declare function resolveTargetFilter(target: string, missionTargetsDir: string): Promise<{
85
+ origins: string[];
86
+ name: string;
87
+ }>;
88
+ /** `--since <run|date>`: an ISO date/time, or a run reference whose start time is the cut-off. */
89
+ export declare function resolveSince(since: string, ctx: RunRefContext): string;
90
+ export interface BuildReportOptions {
91
+ readonly target?: string;
92
+ readonly since?: string;
93
+ readonly dirs?: readonly string[];
94
+ readonly baseline?: string;
95
+ readonly baselinesDir?: string;
96
+ readonly missionTargetsDir: string;
97
+ /** Explicit runs (e.g. `jevitate check`'s own results) instead of scanning `dirs`. */
98
+ readonly runs?: readonly RunRecord[];
99
+ /** #213: the project/run-index seam (cwd, home, index file) for the default sources. */
100
+ readonly index?: RunIndexDeps;
101
+ }
102
+ export interface RunSummary {
103
+ readonly runId: string;
104
+ readonly mode: string;
105
+ readonly path: string;
106
+ readonly target?: string;
107
+ readonly startedAt?: string;
108
+ readonly missionOutcome?: string;
109
+ /** #217: a goal run's own ending, beside the canonical `missionOutcome`. */
110
+ readonly goalOutcome?: string;
111
+ readonly targetBuild?: string;
112
+ readonly engineCommit?: string;
113
+ readonly findings: number;
114
+ }
115
+ export interface ReportResult {
116
+ readonly target?: string;
117
+ readonly since?: string;
118
+ readonly runs: readonly RunSummary[];
119
+ readonly defects: readonly ConsolidatedDefect[];
120
+ readonly summary: {
121
+ readonly defects: number;
122
+ readonly advisory: number;
123
+ readonly runs: number;
124
+ };
125
+ /**
126
+ * Model usage summed over the reported runs (#163). Runs whose result carries no `usage` (they made
127
+ * no model call, or predate usage accounting) are counted in `unreportedRuns`, not priced.
128
+ */
129
+ readonly usage: UsageAggregate;
130
+ readonly diff?: FindingsDiff;
131
+ readonly baselineRuns?: readonly RunSummary[];
132
+ readonly markdown: string;
133
+ }
134
+ export declare function summarizeRun(r: RunRecord): RunSummary;
135
+ export declare function buildReport(opts: BuildReportOptions): Promise<ReportResult>;
136
+ /** Sums the runs' persisted usage (#163). */
137
+ export declare function usageOfRuns(runs: readonly RunRecord[]): UsageAggregate;
138
+ /** The report's cost section: the full total, flagged when partial. */
139
+ export declare function usageMarkdown(u: UsageAggregate): string;
140
+ /** `jevitate diff <runA> <runB>`: A is the baseline side, B the current side. */
141
+ export declare function diffRunRefs(a: string, b: string, ctx: RunRefContext): {
142
+ diff: FindingsDiff;
143
+ markdown: string;
144
+ baseline: RunSummary[];
145
+ current: RunSummary[];
146
+ };