@jevitate/cli 0.1.0 → 0.3.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 (410) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.d.ts +31 -11
  3. package/dist/ai-cli.js +131 -88
  4. package/dist/ai-cli.js.map +1 -1
  5. package/dist/author-journey-cli.d.ts +4 -0
  6. package/dist/author-journey-cli.js +111 -0
  7. package/dist/author-journey-cli.js.map +1 -0
  8. package/dist/bin.js +60349 -16477
  9. package/dist/bin.js.map +1 -1
  10. package/dist/browser-run-options.d.ts +89 -0
  11. package/dist/browser-run-options.js +175 -0
  12. package/dist/browser-run-options.js.map +1 -0
  13. package/dist/build-info.generated.d.ts +2 -0
  14. package/dist/build-info.generated.js +10 -0
  15. package/dist/build-info.generated.js.map +1 -0
  16. package/dist/campaign-api.d.ts +151 -0
  17. package/dist/campaign-api.js +446 -0
  18. package/dist/campaign-api.js.map +1 -0
  19. package/dist/campaign-cli.d.ts +6 -0
  20. package/dist/campaign-cli.js +66 -0
  21. package/dist/campaign-cli.js.map +1 -0
  22. package/dist/check-api.d.ts +5 -0
  23. package/dist/check-api.js +234 -0
  24. package/dist/check-api.js.map +1 -0
  25. package/dist/check-budget.d.ts +26 -0
  26. package/dist/check-budget.js +90 -0
  27. package/dist/check-budget.js.map +1 -0
  28. package/dist/check-cli.d.ts +31 -0
  29. package/dist/check-cli.js +109 -0
  30. package/dist/check-cli.js.map +1 -0
  31. package/dist/check-execute.d.ts +29 -0
  32. package/dist/check-execute.js +420 -0
  33. package/dist/check-execute.js.map +1 -0
  34. package/dist/check-plan.d.ts +118 -0
  35. package/dist/check-plan.js +516 -0
  36. package/dist/check-plan.js.map +1 -0
  37. package/dist/check-suite.d.ts +184 -0
  38. package/dist/check-suite.js +540 -0
  39. package/dist/check-suite.js.map +1 -0
  40. package/dist/check-types.d.ts +181 -0
  41. package/dist/check-types.js +35 -0
  42. package/dist/check-types.js.map +1 -0
  43. package/dist/cli-args.d.ts +26 -0
  44. package/dist/cli-args.js +50 -0
  45. package/dist/cli-args.js.map +1 -0
  46. package/dist/cli-output.d.ts +106 -0
  47. package/dist/cli-output.js +563 -0
  48. package/dist/cli-output.js.map +1 -0
  49. package/dist/cli-reference.d.ts +3 -0
  50. package/dist/cli-reference.js +81 -0
  51. package/dist/cli-reference.js.map +1 -0
  52. package/dist/cli-refusal.d.ts +12 -0
  53. package/dist/cli-refusal.js +52 -0
  54. package/dist/cli-refusal.js.map +1 -0
  55. package/dist/cli-shared.d.ts +340 -0
  56. package/dist/cli-shared.js +537 -0
  57. package/dist/cli-shared.js.map +1 -0
  58. package/dist/cli-surface.d.ts +33 -0
  59. package/dist/cli-surface.js +48 -0
  60. package/dist/cli-surface.js.map +1 -0
  61. package/dist/conversation-options.d.ts +15 -0
  62. package/dist/conversation-options.js +10 -0
  63. package/dist/conversation-options.js.map +1 -0
  64. package/dist/credentials-file.d.ts +15 -0
  65. package/dist/credentials-file.js +56 -0
  66. package/dist/credentials-file.js.map +1 -0
  67. package/dist/data-dir.d.ts +1 -1
  68. package/dist/data-dir.js +1 -1
  69. package/dist/defect-evidence.d.ts +141 -0
  70. package/dist/defect-evidence.js +505 -0
  71. package/dist/defect-evidence.js.map +1 -0
  72. package/dist/demo-aspect-api.d.ts +209 -0
  73. package/dist/demo-aspect-api.js +398 -0
  74. package/dist/demo-aspect-api.js.map +1 -0
  75. package/dist/demo-aspect-cli.d.ts +3 -0
  76. package/dist/demo-aspect-cli.js +243 -0
  77. package/dist/demo-aspect-cli.js.map +1 -0
  78. package/dist/demo-capture.d.ts +142 -0
  79. package/dist/demo-capture.js +537 -0
  80. package/dist/demo-capture.js.map +1 -0
  81. package/dist/engine.d.ts +35 -0
  82. package/dist/engine.js +25 -0
  83. package/dist/engine.js.map +1 -0
  84. package/dist/environments.d.ts +155 -0
  85. package/dist/environments.js +364 -0
  86. package/dist/environments.js.map +1 -0
  87. package/dist/exit-codes.d.ts +46 -0
  88. package/dist/exit-codes.js +91 -0
  89. package/dist/exit-codes.js.map +1 -0
  90. package/dist/explore-adversarial.d.ts +144 -0
  91. package/dist/explore-adversarial.js +227 -0
  92. package/dist/explore-adversarial.js.map +1 -0
  93. package/dist/explore-api.d.ts +7 -187
  94. package/dist/explore-api.js +7 -301
  95. package/dist/explore-api.js.map +1 -1
  96. package/dist/explore-author.d.ts +79 -0
  97. package/dist/explore-author.js +86 -0
  98. package/dist/explore-author.js.map +1 -0
  99. package/dist/explore-cli.d.ts +7 -0
  100. package/dist/explore-cli.js +1199 -0
  101. package/dist/explore-cli.js.map +1 -0
  102. package/dist/explore-coverage.d.ts +173 -0
  103. package/dist/explore-coverage.js +246 -0
  104. package/dist/explore-coverage.js.map +1 -0
  105. package/dist/explore-feature.d.ts +125 -0
  106. package/dist/explore-feature.js +218 -0
  107. package/dist/explore-feature.js.map +1 -0
  108. package/dist/explore-goal.d.ts +271 -0
  109. package/dist/explore-goal.js +417 -0
  110. package/dist/explore-goal.js.map +1 -0
  111. package/dist/explore-shared.d.ts +177 -0
  112. package/dist/explore-shared.js +149 -0
  113. package/dist/explore-shared.js.map +1 -0
  114. package/dist/explore-specs.d.ts +53 -0
  115. package/dist/explore-specs.js +333 -0
  116. package/dist/explore-specs.js.map +1 -0
  117. package/dist/findings-filing.d.ts +64 -0
  118. package/dist/findings-filing.js +108 -0
  119. package/dist/findings-filing.js.map +1 -0
  120. package/dist/fixture-auth.d.ts +63 -0
  121. package/dist/fixture-auth.js +95 -0
  122. package/dist/fixture-auth.js.map +1 -0
  123. package/dist/fixture-cli.d.ts +99 -0
  124. package/dist/fixture-cli.js +292 -0
  125. package/dist/fixture-cli.js.map +1 -0
  126. package/dist/github-issue-filer.d.ts +62 -0
  127. package/dist/github-issue-filer.js +189 -0
  128. package/dist/github-issue-filer.js.map +1 -0
  129. package/dist/host-health-run.d.ts +25 -0
  130. package/dist/host-health-run.js +33 -0
  131. package/dist/host-health-run.js.map +1 -0
  132. package/dist/http-5xx-outcome.d.ts +6 -0
  133. package/dist/http-5xx-outcome.js +39 -0
  134. package/dist/http-5xx-outcome.js.map +1 -0
  135. package/dist/inbox-cli.d.ts +7 -0
  136. package/dist/inbox-cli.js +197 -0
  137. package/dist/inbox-cli.js.map +1 -0
  138. package/dist/index.d.ts +1 -0
  139. package/dist/index.js +1 -0
  140. package/dist/index.js.map +1 -1
  141. package/dist/init-cli.d.ts +4 -0
  142. package/dist/init-cli.js +156 -0
  143. package/dist/init-cli.js.map +1 -0
  144. package/dist/init-keys.d.ts +30 -2
  145. package/dist/init-keys.js +19 -5
  146. package/dist/init-keys.js.map +1 -1
  147. package/dist/init-next-steps.d.ts +35 -0
  148. package/dist/init-next-steps.js +79 -0
  149. package/dist/init-next-steps.js.map +1 -0
  150. package/dist/invariants-file.d.ts +34 -0
  151. package/dist/invariants-file.js +68 -0
  152. package/dist/invariants-file.js.map +1 -0
  153. package/dist/invariants-validate.d.ts +30 -0
  154. package/dist/invariants-validate.js +105 -0
  155. package/dist/invariants-validate.js.map +1 -0
  156. package/dist/journey-annotate-api.d.ts +76 -0
  157. package/dist/journey-annotate-api.js +269 -0
  158. package/dist/journey-annotate-api.js.map +1 -0
  159. package/dist/journey-annotate-cli.d.ts +9 -0
  160. package/dist/journey-annotate-cli.js +181 -0
  161. package/dist/journey-annotate-cli.js.map +1 -0
  162. package/dist/journey-api.d.ts +104 -2
  163. package/dist/journey-api.js +163 -20
  164. package/dist/journey-api.js.map +1 -1
  165. package/dist/journey-cli.d.ts +4 -0
  166. package/dist/journey-cli.js +411 -0
  167. package/dist/journey-cli.js.map +1 -0
  168. package/dist/journey-demo-api.d.ts +114 -0
  169. package/dist/journey-demo-api.js +405 -0
  170. package/dist/journey-demo-api.js.map +1 -0
  171. package/dist/journey-demo-cli.d.ts +10 -0
  172. package/dist/journey-demo-cli.js +158 -0
  173. package/dist/journey-demo-cli.js.map +1 -0
  174. package/dist/journey-prefix.d.ts +194 -0
  175. package/dist/journey-prefix.js +279 -0
  176. package/dist/journey-prefix.js.map +1 -0
  177. package/dist/key-report.d.ts +49 -0
  178. package/dist/key-report.js +101 -0
  179. package/dist/key-report.js.map +1 -0
  180. package/dist/kill-signal.d.ts +193 -0
  181. package/dist/kill-signal.js +283 -0
  182. package/dist/kill-signal.js.map +1 -0
  183. package/dist/launch-armed.d.ts +37 -0
  184. package/dist/launch-armed.js +31 -0
  185. package/dist/launch-armed.js.map +1 -0
  186. package/dist/ledger-api.d.ts +106 -0
  187. package/dist/ledger-api.js +239 -0
  188. package/dist/ledger-api.js.map +1 -0
  189. package/dist/ledger-cli.d.ts +18 -0
  190. package/dist/ledger-cli.js +107 -0
  191. package/dist/ledger-cli.js.map +1 -0
  192. package/dist/load-api.d.ts +29 -11
  193. package/dist/load-api.js +23 -15
  194. package/dist/load-api.js.map +1 -1
  195. package/dist/load-cli.d.ts +4 -0
  196. package/dist/load-cli.js +97 -0
  197. package/dist/load-cli.js.map +1 -0
  198. package/dist/log-correlation.d.ts +200 -0
  199. package/dist/log-correlation.js +394 -0
  200. package/dist/log-correlation.js.map +1 -0
  201. package/dist/log-lines.d.ts +131 -0
  202. package/dist/log-lines.js +389 -0
  203. package/dist/log-lines.js.map +1 -0
  204. package/dist/log-sources.d.ts +71 -0
  205. package/dist/log-sources.js +236 -0
  206. package/dist/log-sources.js.map +1 -0
  207. package/dist/log-trace.d.ts +80 -0
  208. package/dist/log-trace.js +210 -0
  209. package/dist/log-trace.js.map +1 -0
  210. package/dist/logs-cli.d.ts +3 -0
  211. package/dist/logs-cli.js +51 -0
  212. package/dist/logs-cli.js.map +1 -0
  213. package/dist/logs-retention.d.ts +28 -0
  214. package/dist/logs-retention.js +85 -0
  215. package/dist/logs-retention.js.map +1 -0
  216. package/dist/masked-input.d.ts +22 -0
  217. package/dist/masked-input.js +99 -0
  218. package/dist/masked-input.js.map +1 -0
  219. package/dist/mcp-api.d.ts +91 -1
  220. package/dist/mcp-api.js +514 -18
  221. package/dist/mcp-api.js.map +1 -1
  222. package/dist/mcp-args.d.ts +50 -0
  223. package/dist/mcp-args.js +164 -0
  224. package/dist/mcp-args.js.map +1 -0
  225. package/dist/mcp-cli-bridge.d.ts +34 -0
  226. package/dist/mcp-cli-bridge.js +62 -0
  227. package/dist/mcp-cli-bridge.js.map +1 -0
  228. package/dist/mcp-cli-runner.d.ts +29 -0
  229. package/dist/mcp-cli-runner.js +44 -0
  230. package/dist/mcp-cli-runner.js.map +1 -0
  231. package/dist/mcp-cli-tools.d.ts +129 -0
  232. package/dist/mcp-cli-tools.js +737 -0
  233. package/dist/mcp-cli-tools.js.map +1 -0
  234. package/dist/mcp-paths.d.ts +28 -0
  235. package/dist/mcp-paths.js +76 -0
  236. package/dist/mcp-paths.js.map +1 -0
  237. package/dist/mission-actors.d.ts +40 -0
  238. package/dist/mission-actors.js +72 -0
  239. package/dist/mission-actors.js.map +1 -0
  240. package/dist/mission-api.d.ts +35 -0
  241. package/dist/mission-api.js +60 -3
  242. package/dist/mission-api.js.map +1 -1
  243. package/dist/mission-cli.d.ts +4 -0
  244. package/dist/mission-cli.js +248 -0
  245. package/dist/mission-cli.js.map +1 -0
  246. package/dist/mission-exit.d.ts +22 -0
  247. package/dist/mission-exit.js +26 -0
  248. package/dist/mission-exit.js.map +1 -0
  249. package/dist/mission-fixtures.d.ts +234 -0
  250. package/dist/mission-fixtures.js +862 -0
  251. package/dist/mission-fixtures.js.map +1 -0
  252. package/dist/mission-journal.d.ts +60 -0
  253. package/dist/mission-journal.js +115 -0
  254. package/dist/mission-journal.js.map +1 -0
  255. package/dist/mission-queue-cli.d.ts +10 -0
  256. package/dist/mission-queue-cli.js +198 -0
  257. package/dist/mission-queue-cli.js.map +1 -0
  258. package/dist/mission-queue-runner.d.ts +126 -0
  259. package/dist/mission-queue-runner.js +406 -0
  260. package/dist/mission-queue-runner.js.map +1 -0
  261. package/dist/multi-run-cli.d.ts +37 -0
  262. package/dist/multi-run-cli.js +116 -0
  263. package/dist/multi-run-cli.js.map +1 -0
  264. package/dist/multi-run.d.ts +339 -0
  265. package/dist/multi-run.js +619 -0
  266. package/dist/multi-run.js.map +1 -0
  267. package/dist/openrouter-call.d.ts +22 -0
  268. package/dist/openrouter-call.js +64 -0
  269. package/dist/openrouter-call.js.map +1 -0
  270. package/dist/profile-cli.d.ts +4 -0
  271. package/dist/profile-cli.js +57 -0
  272. package/dist/profile-cli.js.map +1 -0
  273. package/dist/program.d.ts +3 -75
  274. package/dist/program.js +123 -1921
  275. package/dist/program.js.map +1 -1
  276. package/dist/project-dir.d.ts +96 -0
  277. package/dist/project-dir.js +221 -0
  278. package/dist/project-dir.js.map +1 -0
  279. package/dist/record-api.d.ts +13 -7
  280. package/dist/record-api.js +44 -30
  281. package/dist/record-api.js.map +1 -1
  282. package/dist/record-cli.d.ts +4 -0
  283. package/dist/record-cli.js +76 -0
  284. package/dist/record-cli.js.map +1 -0
  285. package/dist/recording-cli.d.ts +4 -0
  286. package/dist/recording-cli.js +248 -0
  287. package/dist/recording-cli.js.map +1 -0
  288. package/dist/regression-api.d.ts +107 -0
  289. package/dist/regression-api.js +387 -6
  290. package/dist/regression-api.js.map +1 -1
  291. package/dist/regression-cli.d.ts +4 -0
  292. package/dist/regression-cli.js +284 -0
  293. package/dist/regression-cli.js.map +1 -0
  294. package/dist/report-api.d.ts +146 -0
  295. package/dist/report-api.js +431 -0
  296. package/dist/report-api.js.map +1 -0
  297. package/dist/report-cli.d.ts +12 -0
  298. package/dist/report-cli.js +147 -0
  299. package/dist/report-cli.js.map +1 -0
  300. package/dist/resource-preflight.d.ts +87 -0
  301. package/dist/resource-preflight.js +160 -0
  302. package/dist/resource-preflight.js.map +1 -0
  303. package/dist/result-schema.d.ts +22 -0
  304. package/dist/result-schema.js +28 -0
  305. package/dist/result-schema.js.map +1 -0
  306. package/dist/run-index.d.ts +29 -0
  307. package/dist/run-index.js +70 -0
  308. package/dist/run-index.js.map +1 -0
  309. package/dist/run-key-preflight.d.ts +42 -0
  310. package/dist/run-key-preflight.js +82 -0
  311. package/dist/run-key-preflight.js.map +1 -0
  312. package/dist/run-screenshots.d.ts +123 -0
  313. package/dist/run-screenshots.js +235 -0
  314. package/dist/run-screenshots.js.map +1 -0
  315. package/dist/runtime-env.d.ts +8 -0
  316. package/dist/runtime-env.js +23 -0
  317. package/dist/runtime-env.js.map +1 -0
  318. package/dist/secret-args.d.ts +23 -0
  319. package/dist/secret-args.js +45 -0
  320. package/dist/secret-args.js.map +1 -0
  321. package/dist/serve-cli.d.ts +4 -0
  322. package/dist/serve-cli.js +95 -0
  323. package/dist/serve-cli.js.map +1 -0
  324. package/dist/server-log-verify.d.ts +36 -0
  325. package/dist/server-log-verify.js +120 -0
  326. package/dist/server-log-verify.js.map +1 -0
  327. package/dist/session-check.d.ts +14 -0
  328. package/dist/session-check.js +44 -0
  329. package/dist/session-check.js.map +1 -0
  330. package/dist/site-cli.d.ts +4 -0
  331. package/dist/site-cli.js +127 -0
  332. package/dist/site-cli.js.map +1 -0
  333. package/dist/site-gate-cli.d.ts +28 -0
  334. package/dist/site-gate-cli.js +59 -0
  335. package/dist/site-gate-cli.js.map +1 -0
  336. package/dist/source-api.js +20 -4
  337. package/dist/source-api.js.map +1 -1
  338. package/dist/source-cli.d.ts +4 -0
  339. package/dist/source-cli.js +284 -0
  340. package/dist/source-cli.js.map +1 -0
  341. package/dist/source-run-api.d.ts +27 -1
  342. package/dist/source-run-api.js +22 -11
  343. package/dist/source-run-api.js.map +1 -1
  344. package/dist/storage-state-snapshot.d.ts +50 -0
  345. package/dist/storage-state-snapshot.js +87 -0
  346. package/dist/storage-state-snapshot.js.map +1 -0
  347. package/dist/suite-explore-options.d.ts +321 -0
  348. package/dist/suite-explore-options.js +162 -0
  349. package/dist/suite-explore-options.js.map +1 -0
  350. package/dist/target-config.d.ts +115 -0
  351. package/dist/target-config.js +225 -0
  352. package/dist/target-config.js.map +1 -0
  353. package/dist/transcript-file.d.ts +12 -0
  354. package/dist/transcript-file.js +23 -0
  355. package/dist/transcript-file.js.map +1 -0
  356. package/dist/type-fixture-file.d.ts +9 -0
  357. package/dist/type-fixture-file.js +48 -0
  358. package/dist/type-fixture-file.js.map +1 -0
  359. package/dist/ui-api.d.ts +3 -0
  360. package/dist/ui-api.js +11 -4
  361. package/dist/ui-api.js.map +1 -1
  362. package/dist/usability-capture.d.ts +43 -0
  363. package/dist/usability-capture.js +327 -0
  364. package/dist/usability-capture.js.map +1 -0
  365. package/dist/usage-config.d.ts +36 -0
  366. package/dist/usage-config.js +114 -0
  367. package/dist/usage-config.js.map +1 -0
  368. package/dist/ux-api.d.ts +3 -75
  369. package/dist/ux-api.js +3 -220
  370. package/dist/ux-api.js.map +1 -1
  371. package/dist/ux-claim-probe.d.ts +45 -0
  372. package/dist/ux-claim-probe.js +386 -0
  373. package/dist/ux-claim-probe.js.map +1 -0
  374. package/dist/ux-cli.d.ts +4 -0
  375. package/dist/ux-cli.js +109 -0
  376. package/dist/ux-cli.js.map +1 -0
  377. package/dist/ux-config.d.ts +29 -0
  378. package/dist/ux-config.js +103 -0
  379. package/dist/ux-config.js.map +1 -0
  380. package/dist/ux-evidence.d.ts +54 -0
  381. package/dist/ux-evidence.js +197 -0
  382. package/dist/ux-evidence.js.map +1 -0
  383. package/dist/ux-product.d.ts +14 -0
  384. package/dist/ux-product.js +39 -0
  385. package/dist/ux-product.js.map +1 -0
  386. package/dist/ux-review.d.ts +116 -0
  387. package/dist/ux-review.js +171 -0
  388. package/dist/ux-review.js.map +1 -0
  389. package/dist/ux-usability.d.ts +263 -0
  390. package/dist/ux-usability.js +580 -0
  391. package/dist/ux-usability.js.map +1 -0
  392. package/dist/verify-fix-api.d.ts +194 -0
  393. package/dist/verify-fix-api.js +506 -0
  394. package/dist/verify-fix-api.js.map +1 -0
  395. package/dist/verify-fix-cli.d.ts +4 -0
  396. package/dist/verify-fix-cli.js +115 -0
  397. package/dist/verify-fix-cli.js.map +1 -0
  398. package/package.json +23 -18
  399. package/skills/jevitate-ci-check/SKILL.md +77 -0
  400. package/skills/jevitate-demo/SKILL.md +61 -0
  401. package/skills/jevitate-explore/SKILL.md +96 -87
  402. package/skills/jevitate-getting-started/SKILL.md +89 -0
  403. package/skills/jevitate-load-test/SKILL.md +11 -2
  404. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  405. package/skills/jevitate-record/SKILL.md +23 -5
  406. package/skills/jevitate-run-journey/SKILL.md +61 -17
  407. package/skills/jevitate-sources/SKILL.md +57 -14
  408. package/skills/jevitate-test-campaign/SKILL.md +203 -0
  409. package/skills/jevitate-ux-review/SKILL.md +106 -16
  410. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,405 @@
1
+ import { expectedResultFromDelta } from "@jevitate/explore";
2
+ import { copyFile, mkdir, mkdtemp, readdir, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { basename, dirname, join } from "node:path";
5
+ import { FsJourneyStore, applyAnnotationDraft, describeStep, flatJourneySteps, secretParamValues, } from "@jevitate/journey";
6
+ import { assertNoSecretInPayload, redactText } from "@jevitate/ai-core";
7
+ import { DemoOverlay } from "@jevitate/explore";
8
+ import { PlaywrightBrowserPort } from "@jevitate/playwright";
9
+ import { BrowseTheWebToken } from "@jevitate/screenplay";
10
+ import { captureStepScreenshot, SecretPixelMask } from "./demo-capture.js";
11
+ import { runJourneyProgrammatically, UnknownJourneyError } from "./journey-api.js";
12
+ import { clock as sysClock } from "@jevitate/domain";
13
+ /**
14
+ * #248 — `jevitate journey demo <id>`: replay a Journey as a narrated demo. The overlay (#245) shows
15
+ * the Journey's goal as a title card, each step's objective as the caption (else its label, else a
16
+ * value-free description) with its target highlighted and a `pace` pause, then an outcome card. The
17
+ * outputs are made from the SAME replay: a video (Playwright recordVideo, WebM) with WebVTT subtitles
18
+ * timed to the captions, and a Markdown guide (goal, preconditions, per step its objective, expected
19
+ * result and a screenshot with the overlay hidden).
20
+ *
21
+ * The replay is `runJourneyProgrammatically` — the same fail-closed policy (paid/destructive steps
22
+ * refused), site policy, fixtures and environment (#247) as `journey run`; a demo never heals. A
23
+ * Journey that no longer replays is STALE: nothing is written and the command exits non-zero, so a
24
+ * CI job regenerating demos catches it. Every caption, cue and guide line is redacted with the run's
25
+ * secret parameters, and the written text is proven secret-free before it lands; the secret
26
+ * parameters are also masked in PIXELS — video and screenshots — by the display-only mask layer
27
+ * (#250/#251, `demo-capture.ts`), proven at every screenshot.
28
+ */
29
+ /** How long each caption is shown before its step acts (`--pace`, ms). */
30
+ export const DEMO_DEFAULT_PACE_MS = 1500;
31
+ /** `--pace` bounds (ms). */
32
+ export const DEMO_MAX_PACE_MS = 60_000;
33
+ /** A demo's inputs were unusable (an output path of the wrong kind): nothing ran. */
34
+ export class DemoArgsError extends Error {
35
+ code = "E_JOURNEY_DEMO_ARGS";
36
+ }
37
+ /** The replay completed but a promised output could not be produced (no video file, a missing screenshot). */
38
+ export class DemoOutputError extends Error {
39
+ code = "E_JOURNEY_DEMO_OUTPUT";
40
+ }
41
+ /** #249: the mark every output of an unapproved demo carries. */
42
+ export const DEMO_DRAFT_MARK = "DRAFT";
43
+ /** A WebVTT timestamp: `HH:MM:SS.mmm`. */
44
+ export function vttTime(ms) {
45
+ const t = Math.max(0, Math.round(ms));
46
+ const pad = (n, w = 2) => String(n).padStart(w, "0");
47
+ return `${pad(Math.floor(t / 3_600_000))}:${pad(Math.floor(t / 60_000) % 60)}:${pad(Math.floor(t / 1000) % 60)}.${pad(t % 1000, 3)}`;
48
+ }
49
+ /** Cue text on one line with WebVTT's markup characters escaped (and never a `-->`). */
50
+ function vttText(s) {
51
+ return s.replace(/\s+/g, " ").trim().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
52
+ }
53
+ /**
54
+ * The WebVTT subtitles: one cue per step (`step-N`), in order; the goal as a leading NOTE. A draft
55
+ * (#249) says so in a NOTE and at the start of every cue.
56
+ */
57
+ export function demoSubtitles(title, steps, draft = false) {
58
+ const note = title.replace(/\s+/g, " ").replace(/-->/g, "->").trim();
59
+ const mark = draft ? `[${DEMO_DRAFT_MARK}] ` : "";
60
+ const cues = steps.map((s) => `step-${s.number}\n${vttTime(s.cue.startMs)} --> ${vttTime(s.cue.endMs)}\n${vttText(`${mark}${s.caption}${s.observed === undefined ? "" : `\n${s.observed}`}`)}\n`);
61
+ const draftNote = draft ? [`NOTE ${DEMO_DRAFT_MARK}: not yet approved (jevitate demo approve)\n`] : [];
62
+ return ["WEBVTT\n", ...draftNote, ...(note === "" ? [] : [`NOTE ${note}\n`]), ...cues].join("\n");
63
+ }
64
+ /** #303: a recorded delta as one caption line — what changed, or that nothing did. */
65
+ function deltaCaption(d) {
66
+ const what = expectedResultFromDelta(d) ?? (d.verdict === "no-change" ? "nothing visible changes" : d.why);
67
+ return `observed: ${what}`.slice(0, 200);
68
+ }
69
+ function oneLine(s) {
70
+ return s.replace(/\s+/g, " ").trim();
71
+ }
72
+ /**
73
+ * The Markdown guide (all text already redacted); `assets` is the screenshots folder's name. A draft
74
+ * (#249) carries `DRAFT` in its title and a watermark line under it.
75
+ */
76
+ export function demoGuide(journey, title, steps, assets, redact, draft = false) {
77
+ const m = journey.metadata;
78
+ const lines = [`# ${draft ? `${DEMO_DRAFT_MARK}: ` : ""}${oneLine(redact(m.name))}`, ""];
79
+ if (draft)
80
+ lines.push(`> **${DEMO_DRAFT_MARK}** — not yet approved. Review it, then run \`jevitate demo approve ${m.id}\` to promote the Journey and render the final demo.`, "");
81
+ lines.push(`**Goal:** ${oneLine(title)}`, "");
82
+ if (m.persona !== undefined || m.role !== undefined) {
83
+ const who = [m.persona, m.role === undefined ? undefined : `role: ${m.role}`].filter((x) => x !== undefined);
84
+ lines.push(`**Who:** ${oneLine(redact(who.join(" · ")))}`, "");
85
+ }
86
+ lines.push("## Before you start", "");
87
+ const pre = (m.preconditions ?? []).map((p) => `- ${oneLine(redact(p.description))}${p.login === true ? " (signed in)" : ""}`);
88
+ if (m.requiresAuth === true && !(m.preconditions ?? []).some((p) => p.login === true))
89
+ pre.push("- You are signed in.");
90
+ lines.push(...(pre.length === 0 ? ["Nothing to set up."] : pre), "", "## Steps", "");
91
+ for (const s of steps) {
92
+ lines.push(`### ${s.number}. ${oneLine(s.caption)}`, "");
93
+ if (s.expectedResult !== undefined)
94
+ lines.push(`**Expected result:** ${oneLine(s.expectedResult)}`, "");
95
+ if (s.observed !== undefined)
96
+ lines.push(`**Observed:** ${oneLine(s.observed)}`, "");
97
+ if (s.screenshot !== undefined) {
98
+ const alt = `Step ${s.number}: ${oneLine(s.caption)}`.replace(/[[\]]/g, "");
99
+ lines.push(`![${alt}](${encodeURI(`${assets}/${basename(s.screenshot)}`)})`, "");
100
+ }
101
+ }
102
+ const criteria = (m.successCriteria ?? []).map((c) => `- ${oneLine(redact(c.description))}`);
103
+ if (criteria.length > 0)
104
+ lines.push("## When it worked", "", ...criteria, "");
105
+ return `${lines.join("\n").trimEnd()}\n`;
106
+ }
107
+ /** The step's caption: its objective, else its label, else a value-free description (redacted). */
108
+ function captionOf(s, redact) {
109
+ const pick = [s.recorded.objective, s.recorded.step.label].map((t) => (t ?? "").trim()).find((t) => t !== "");
110
+ return oneLine(redact(pick ?? describeStep(s.recorded.step)));
111
+ }
112
+ function targetOf(s) {
113
+ const step = s.recorded.step;
114
+ return step.target ?? null;
115
+ }
116
+ const sleep = (ms) => sysClock.sleep(ms);
117
+ /** The title card is on screen at least this long (ms), whatever `--pace` is. */
118
+ export const TITLE_CARD_MIN_MS = 1200;
119
+ /** How long the title card waits for the recorder's first frame (ms) before going on regardless. */
120
+ export const FIRST_FRAME_WAIT_MS = 5_000;
121
+ /**
122
+ * Holds a card on screen for `ms`, re-applying it as it goes: the page is still on its initial
123
+ * about:blank, whose document the browser may replace right after it opens (wiping the card).
124
+ */
125
+ async function holdCard(overlay, page, ms) {
126
+ const until = sysClock.now() + ms;
127
+ for (;;) {
128
+ const left = until - sysClock.now();
129
+ if (left <= 0)
130
+ return;
131
+ await sleep(Math.min(250, left));
132
+ await overlay.refresh(page);
133
+ }
134
+ }
135
+ /**
136
+ * The demo video's clock (#248). Playwright's recorder stamps frames with the compositor's wall time
137
+ * and the WebM starts at the FIRST frame — which, on a loaded host, lands 1–3 s after the page
138
+ * opened. A frame probe (`page.screencast`, a second client of the same screencast: it is handed the
139
+ * latest frame at once, then every new one) reads that first frame's wall time; the probe stops after
140
+ * one frame. Without a probe (no video, or a page without `screencast`) the clock starts at `open`.
141
+ */
142
+ class VideoClock {
143
+ #openedAt;
144
+ #firstFrameAt;
145
+ #first = Promise.resolve();
146
+ opened(page, video) {
147
+ this.#openedAt = sysClock.now();
148
+ const screencast = page.screencast;
149
+ if (!video || screencast === undefined)
150
+ return;
151
+ let seen = () => undefined;
152
+ const got = new Promise((r) => {
153
+ seen = r;
154
+ });
155
+ this.#first = got;
156
+ let stopped = false;
157
+ const stop = () => {
158
+ if (stopped)
159
+ return;
160
+ stopped = true;
161
+ void screencast.stop().catch(() => undefined);
162
+ };
163
+ screencast
164
+ .start({
165
+ onFrame: ({ timestamp }) => {
166
+ if (this.#firstFrameAt === undefined) {
167
+ this.#firstFrameAt = Number.isFinite(timestamp) && timestamp > 0 ? timestamp : sysClock.now();
168
+ seen();
169
+ // Off the frame callback: stopping from inside it would wait on this very frame's ack.
170
+ sysClock.setTimeout(stop, 0);
171
+ }
172
+ },
173
+ })
174
+ .catch(() => seen());
175
+ sysClock.setTimeout(() => {
176
+ seen();
177
+ stop();
178
+ }, FIRST_FRAME_WAIT_MS).unref();
179
+ }
180
+ /**
181
+ * Resolves once the recorder has its first frame (bounded by {@link FIRST_FRAME_WAIT_MS}),
182
+ * calling `repaint` every 250 ms meanwhile (a page that paints nothing yields no frame).
183
+ */
184
+ async recording(repaint) {
185
+ let waiting = true;
186
+ const done = this.#first.then(() => {
187
+ waiting = false;
188
+ });
189
+ while (waiting) {
190
+ await Promise.race([done, sleep(250)]);
191
+ if (waiting)
192
+ await repaint();
193
+ }
194
+ }
195
+ /** ms on the video's timeline: from its first frame, else from when the page opened. */
196
+ since() {
197
+ const start = this.#firstFrameAt ?? this.#openedAt;
198
+ return start === undefined ? 0 : Math.max(0, sysClock.now() - start);
199
+ }
200
+ }
201
+ /** `<dir>/<name>.assets` for `<dir>/<name>.md`. */
202
+ export function guideAssetsDir(guide) {
203
+ return join(dirname(guide), `${basename(guide).replace(/\.md$/i, "")}.assets`);
204
+ }
205
+ /** `<video without .webm>.vtt`. */
206
+ export function subtitlesPathFor(video) {
207
+ return video.replace(/\.webm$/i, ".vtt");
208
+ }
209
+ /**
210
+ * Replays the Journey as a narrated demo and writes the asked-for outputs (see the module comment).
211
+ * Throws `UnknownJourneyError` / `DemoArgsError` before any browser opens, and every refusal
212
+ * `runJourneyProgrammatically` has; returns `outcome: "stale"` (writing nothing) when the replay stops.
213
+ */
214
+ export async function demoJourney(opts) {
215
+ if (opts.video !== undefined && !/\.webm$/i.test(opts.video)) {
216
+ throw new DemoArgsError(`--video must be a .webm file (Playwright records WebM; convert it afterwards, e.g. with ffmpeg): ${opts.video}`);
217
+ }
218
+ if (opts.guide !== undefined && !/\.md$/i.test(opts.guide))
219
+ throw new DemoArgsError(`--guide must be a Markdown (.md) file: ${opts.guide}`);
220
+ const pace = opts.paceMs ?? DEMO_DEFAULT_PACE_MS;
221
+ if (!Number.isSafeInteger(pace) || pace < 0 || pace > DEMO_MAX_PACE_MS)
222
+ throw new DemoArgsError(`--pace must be an integer from 0 to ${DEMO_MAX_PACE_MS} (got ${pace})`);
223
+ const stored = await new FsJourneyStore(opts.dir).get(opts.id);
224
+ if (stored === null)
225
+ throw new UnknownJourneyError(`unknown journey '${opts.id}'`);
226
+ // #249: a draft's annotations narrate the demo without being written into the Journey.
227
+ const journey = opts.annotations === undefined ? stored : applyAnnotationDraft(stored, opts.annotations).journey;
228
+ const draft = opts.draft === true;
229
+ const secrets = secretParamValues(journey, opts.params);
230
+ const redact = (s) => redactText(s, secrets);
231
+ const flat = flatJourneySteps(journey);
232
+ const title = oneLine(redact((journey.metadata.goal ?? "").trim() || journey.metadata.name));
233
+ const work = await mkdtemp(join(tmpdir(), "jevitate-demo-"));
234
+ // #250/#251: the demo's secret parameters are masked in pixels — in the video from its first
235
+ // paint, and proven at every guide screenshot (a capture whose mask cannot be proven fails).
236
+ const mask = new SecretPixelMask(secrets);
237
+ const layers = [mask.layer(), ...(opts.captureLayers ?? [])];
238
+ try {
239
+ const overlay = new DemoOverlay(secrets);
240
+ // The video's timeline starts at its FIRST FRAME, which under load arrives seconds after the page
241
+ // opens (on about:blank): cues count from that frame, not from `open`, and the title card waits for
242
+ // it — else the card is shown before anything is recorded and every cue runs late.
243
+ const clock = new VideoClock();
244
+ const basePort = opts.browserPortFactory ?? (() => new PlaywrightBrowserPort());
245
+ const timedPort = () => {
246
+ const port = basePort();
247
+ return {
248
+ open: async (o) => {
249
+ const session = await port.open(o);
250
+ clock.opened(session.page, opts.video !== undefined);
251
+ return session;
252
+ },
253
+ };
254
+ };
255
+ const since = () => clock.since();
256
+ const steps = [];
257
+ const captureErrors = [];
258
+ const shots = join(work, "shots");
259
+ await mkdir(shots, { recursive: true });
260
+ const closeLast = () => {
261
+ const last = steps[steps.length - 1];
262
+ if (last !== undefined && last.endMs === undefined)
263
+ last.endMs = Math.max(since(), last.startMs + 1);
264
+ };
265
+ const observer = {
266
+ beforeStep: async ({ actor, index }) => {
267
+ const page = actor.ability(BrowseTheWebToken).session.page;
268
+ const s = flat[index];
269
+ if (s === undefined)
270
+ return;
271
+ if (index === 0) {
272
+ if (draft)
273
+ await overlay.watermark(page, DEMO_DRAFT_MARK);
274
+ await overlay.card(page, title, "title");
275
+ // An idle about:blank paints nothing new: the card's own paint is what the recorder (and
276
+ // the clock's probe) may be waiting for. Its hold starts once the video has frames.
277
+ await clock.recording(() => overlay.refresh(page));
278
+ await holdCard(overlay, page, Math.max(pace, TITLE_CARD_MIN_MS));
279
+ }
280
+ closeLast();
281
+ const caption = captionOf(s, redact);
282
+ const expected = oneLine(redact(s.recorded.expectedResult ?? ""));
283
+ // #303 (opt-in): the step's recorded delta as a short caption line ("what this step does").
284
+ const delta = opts.actionDeltas === true ? s.recorded.delta : undefined;
285
+ const observed = delta === undefined ? "" : oneLine(redact(deltaCaption(delta)));
286
+ steps.push({ number: index + 1, caption, ...(expected === "" ? {} : { expectedResult: expected }), ...(observed === "" ? {} : { observed }), startMs: since() });
287
+ await overlay.caption(page, { head: `step ${index + 1} of ${flat.length}`, text: caption }, targetOf(s));
288
+ await sleep(pace);
289
+ },
290
+ afterStep: async ({ actor, index, outcome }) => {
291
+ const page = actor.ability(BrowseTheWebToken).session.page;
292
+ if (outcome === "done") {
293
+ // A navigation re-renders the overlay asynchronously: re-apply it so the video shows it now.
294
+ await overlay.refresh(page);
295
+ if (opts.guide !== undefined) {
296
+ const file = join(shots, `step-${String(index + 1).padStart(2, "0")}.png`);
297
+ try {
298
+ await captureStepScreenshot(page, file, { step: index + 1 }, layers);
299
+ const entry = steps.find((x) => x.number === index + 1);
300
+ if (entry !== undefined)
301
+ entry.screenshot = file;
302
+ }
303
+ catch (err) {
304
+ captureErrors.push(`step ${index + 1}: ${redact(err instanceof Error ? err.message : String(err))}`);
305
+ }
306
+ }
307
+ if (index === flat.length - 1) {
308
+ closeLast();
309
+ await overlay.card(page, `Done: ${title}`, "ok");
310
+ await sleep(pace);
311
+ }
312
+ }
313
+ else {
314
+ closeLast();
315
+ await overlay.card(page, `Stopped at step ${index + 1}: this demo no longer replays`, "bad");
316
+ await sleep(pace);
317
+ }
318
+ },
319
+ };
320
+ const { video, guide, paceMs: _pace, captureLayers: _layers, annotations: _annotations, draft: _draft, ...runOpts } = opts;
321
+ const browser = video === undefined ? opts.browser : { ...opts.browser, recordVideo: { dir: work } };
322
+ const run = await runJourneyProgrammatically({
323
+ ...runOpts,
324
+ ...(browser === undefined ? {} : { browser }),
325
+ browserPortFactory: timedPort,
326
+ observer,
327
+ mask,
328
+ });
329
+ closeLast();
330
+ const done = steps.map((s) => ({
331
+ number: s.number,
332
+ caption: s.caption,
333
+ ...(s.expectedResult === undefined ? {} : { expectedResult: s.expectedResult }),
334
+ ...(s.observed === undefined ? {} : { observed: s.observed }),
335
+ cue: { startMs: Math.round(s.startMs), endMs: Math.round(s.endMs ?? s.startMs + 1) },
336
+ ...(s.screenshot === undefined ? {} : { screenshot: s.screenshot }),
337
+ }));
338
+ if (run.outcome === "quarantined") {
339
+ // A stale demo writes nothing: not even the screenshots its replay took.
340
+ for (const f of [...(run.screenshotPaths ?? []), ...(run.screenshotIndex === undefined ? [] : [run.screenshotIndex])])
341
+ await rm(f, { force: true });
342
+ const at = run.at === undefined ? undefined : run.at + 1;
343
+ return {
344
+ id: opts.id,
345
+ outcome: "stale",
346
+ reason: redact(run.reason).slice(0, 2000),
347
+ ...(at === undefined ? {} : { stoppedAtStep: at }),
348
+ totalSteps: flat.length,
349
+ steps: done.map(({ screenshot: _s, ...s }) => s),
350
+ };
351
+ }
352
+ // The replay completed: every promised output must exist — never a silently partial demo.
353
+ if (guide !== undefined) {
354
+ const missing = done.filter((s) => s.screenshot === undefined).map((s) => s.number);
355
+ if (captureErrors.length > 0 || missing.length > 0) {
356
+ throw new DemoOutputError(`could not capture a screenshot for step(s) ${missing.join(", ")}${captureErrors.length > 0 ? `: ${captureErrors.join("; ")}` : ""}`);
357
+ }
358
+ }
359
+ let videoFile;
360
+ if (video !== undefined) {
361
+ videoFile = run.videoPaths?.[0];
362
+ if (videoFile === undefined)
363
+ throw new DemoOutputError("the replay recorded no video");
364
+ }
365
+ const result = { steps: done };
366
+ if (video !== undefined && videoFile !== undefined) {
367
+ const vtt = demoSubtitles(title, done, draft);
368
+ assertNoSecretInPayload(vtt, secrets, "demo subtitles"); // the last line: never at rest
369
+ await mkdir(dirname(video), { recursive: true });
370
+ await copyFile(videoFile, video);
371
+ const subtitles = subtitlesPathFor(video);
372
+ await writeFile(subtitles, vtt);
373
+ Object.assign(result, { video, subtitles });
374
+ }
375
+ if (guide !== undefined) {
376
+ const assets = guideAssetsDir(guide);
377
+ await mkdir(assets, { recursive: true });
378
+ // A regenerated guide never keeps an older, longer run's screenshots.
379
+ for (const f of await readdir(assets))
380
+ if (/^step-\d+\.png$/.test(f))
381
+ await rm(join(assets, f), { force: true });
382
+ const placed = await Promise.all(done.map(async (s) => {
383
+ if (s.screenshot === undefined)
384
+ return s;
385
+ const to = join(assets, basename(s.screenshot));
386
+ await copyFile(s.screenshot, to);
387
+ return { ...s, screenshot: to };
388
+ }));
389
+ const md = demoGuide(journey, title, placed, basename(assets), redact, draft);
390
+ assertNoSecretInPayload(md, secrets, "demo guide");
391
+ await writeFile(guide, md);
392
+ Object.assign(result, { guide, steps: placed });
393
+ }
394
+ const shotFields = {
395
+ ...(run.screenshotPaths === undefined ? {} : { screenshotPaths: run.screenshotPaths }),
396
+ ...(run.screenshotIndex === undefined ? {} : { screenshotIndex: run.screenshotIndex }),
397
+ ...(run.screenshotsSkipped === undefined ? {} : { screenshotsSkipped: run.screenshotsSkipped }),
398
+ };
399
+ return { id: opts.id, outcome: "ok", totalSteps: flat.length, ...result, ...shotFields };
400
+ }
401
+ finally {
402
+ await rm(work, { recursive: true, force: true });
403
+ }
404
+ }
405
+ //# sourceMappingURL=journey-demo-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-demo-api.js","sourceRoot":"","sources":["../src/journey-demo-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ import { type CliDeps } from "./cli-shared.js";
3
+ /**
4
+ * #248 — `jevitate journey demo <id>`: replay a Journey as a narrated demo (goal title card, each
5
+ * step's objective as the caption with its target highlighted, an outcome card) and write a video
6
+ * with WebVTT subtitles and/or a Markdown guide with a screenshot per step. Headless by default;
7
+ * `--headed` presents it live. With neither `--video` nor `--guide`, both go to a fresh folder in
8
+ * the logs dir. A Journey that no longer replays writes nothing and exits 1 (a stale demo).
9
+ */
10
+ export declare function registerJourneyDemoCommand(journey: Command, program: Command, deps: CliDeps): void;
@@ -0,0 +1,158 @@
1
+ import { formatScreenshotsLine, parseScreenshotsArg } from "./run-screenshots.js";
2
+ import { existsSync } from "node:fs";
3
+ import { join, resolve as resolvePath } from "node:path";
4
+ import { ParamValidationError } from "@jevitate/journey";
5
+ import { SecretLeakError } from "@jevitate/ai-core";
6
+ import { SiteGateRefusedError } from "@jevitate/runtime";
7
+ import { ok, fail } from "./envelope.js";
8
+ import { UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
9
+ import { DEMO_DEFAULT_PACE_MS, DEMO_MAX_PACE_MS, DemoArgsError, DemoOutputError, demoJourney } from "./journey-demo-api.js";
10
+ import { intArg } from "./cli-args.js";
11
+ import { artifactStamp } from "./mission-journal.js";
12
+ import { logsDirFor } from "./project-dir.js";
13
+ import { withSiteGate } from "./site-gate-cli.js";
14
+ import { buildMissionFixtures, checkSetupRefs, withFixtureFlags } from "./fixture-cli.js";
15
+ import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError } from "./mission-fixtures.js";
16
+ import { withEngine } from "./engine.js";
17
+ import { EXIT_CODES } from "./exit-codes.js";
18
+ import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
19
+ import { resolveDbPath, resolveJourneysDir, withBrowserLaunchFlags, browserRunFromFlags, withDemoFlags, withScreenshotsFlag, withEmulationFlags, emulationFromFlags, collectParam, emitJson, environmentSeams, } from "./cli-shared.js";
20
+ import { clock } from "@jevitate/domain";
21
+ /**
22
+ * #248 — `jevitate journey demo <id>`: replay a Journey as a narrated demo (goal title card, each
23
+ * step's objective as the caption with its target highlighted, an outcome card) and write a video
24
+ * with WebVTT subtitles and/or a Markdown guide with a screenshot per step. Headless by default;
25
+ * `--headed` presents it live. With neither `--video` nor `--guide`, both go to a fresh folder in
26
+ * the logs dir. A Journey that no longer replays writes nothing and exits 1 (a stale demo).
27
+ */
28
+ export function registerJourneyDemoCommand(journey, program, deps) {
29
+ withScreenshotsFlag(withEnvironmentFlags(withDemoFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(journey.command("demo <id>")))))))
30
+ .description("replay a Journey as a narrated demo (goal, step objectives as captions, target highlights) → a WebM video with .vtt subtitles " +
31
+ "and/or a Markdown step-by-step guide with screenshots; a Journey that no longer replays fails (exit 1)")
32
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
33
+ .option("--param <kv>", "param as key=value (repeatable)", collectParam, {})
34
+ .option("--storage-state <file>", "Playwright storageState JSON to start the replay authenticated; must exist")
35
+ .option("--video <file>", "write the demo video here (.webm) and its subtitles beside it (.vtt)")
36
+ .option("--guide <file>", "write a Markdown guide here (.md), screenshots in <name>.assets/ beside it")
37
+ .option("--pace <ms>", `how long each step's caption shows before it acts (default ${DEMO_DEFAULT_PACE_MS})`, intArg({ min: 0, max: DEMO_MAX_PACE_MS }))
38
+ .option("--action-deltas", "opt-in (#303): record each replayed step's delta, and caption each step with what it changed when its Recording was made (an \"observed:\" line in the subtitles and the guide)")
39
+ .option("--json", "emit a JSON envelope")
40
+ .action(async function (id) {
41
+ const ownFixtureFlags = this.opts();
42
+ const { dir, param, storageState: storageStateFlag, video: videoFlag, guide: guideFlag, pace, json, env: envName, baseUrl, screenshots: screenshotsFlag, actionDeltas, ...rest } = this.opts();
43
+ const out = program.configureOutput().writeOut;
44
+ const journeysDir = resolveJourneysDir(deps, dir);
45
+ // #247: --env/--base-url choose where the demo runs — the same resolver as `journey run`.
46
+ let environment;
47
+ try {
48
+ environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
49
+ }
50
+ catch (err) {
51
+ if (!isEnvironmentError(err))
52
+ throw err;
53
+ emitJson(program, fail(err.code, err.message));
54
+ return;
55
+ }
56
+ const fixtureFlags = {
57
+ ...ownFixtureFlags,
58
+ ...(ownFixtureFlags.before === undefined && environment?.hooks?.before !== undefined ? { before: environment.hooks.before } : {}),
59
+ ...(ownFixtureFlags.after === undefined && environment?.hooks?.after !== undefined ? { after: environment.hooks.after } : {}),
60
+ };
61
+ const storageState = storageStateFlag ?? environment?.storageState;
62
+ if (storageState !== undefined && !existsSync(storageState)) {
63
+ emitJson(program, fail("E_JOURNEY_DEMO_ARGS", `storage state not found: ${storageState}`));
64
+ return;
65
+ }
66
+ // #245: --headed (a display is required) and --slow-mo, resolved before any browser opens.
67
+ let browser;
68
+ let emulation;
69
+ let screenshots;
70
+ try {
71
+ browser = browserRunFromFlags(this.opts(), deps.explore?.env ?? process.env);
72
+ emulation = emulationFromFlags({ viewport: rest.viewport, device: rest.device });
73
+ screenshots = parseScreenshotsArg(screenshotsFlag);
74
+ }
75
+ catch (err) {
76
+ emitJson(program, fail("E_JOURNEY_DEMO_ARGS", err instanceof Error ? err.message : String(err)));
77
+ return;
78
+ }
79
+ // Neither output named: both, in a fresh folder in the logs dir (git-ignored, pruned like any run log).
80
+ let video = videoFlag === undefined ? undefined : resolvePath(videoFlag);
81
+ let guide = guideFlag === undefined ? undefined : resolvePath(guideFlag);
82
+ if (video === undefined && guide === undefined) {
83
+ const folder = join(logsDirFor(), `journey-demo-${id.replace(/[^A-Za-z0-9._-]/g, "_")}-${artifactStamp(clock.nowIso())}`);
84
+ video = join(folder, "demo.webm");
85
+ guide = join(folder, "guide.md");
86
+ }
87
+ try {
88
+ const result = await withSiteGate(resolveDbPath(deps), (siteGate) => demoJourney({
89
+ ...(siteGate === undefined ? {} : { siteGate }),
90
+ dir: journeysDir,
91
+ id,
92
+ params: param,
93
+ browserPortFactory: deps.explore?.browserPortFactory,
94
+ ...(browser === undefined ? {} : { browser }),
95
+ ...(emulation === undefined ? {} : { emulation }),
96
+ ...(screenshots === undefined ? {} : { screenshots }),
97
+ ...(actionDeltas === true ? { actionDeltas: true } : {}),
98
+ ...(storageState !== undefined ? { storageState } : {}),
99
+ ...(environment === undefined ? {} : { environment }),
100
+ ...(video === undefined ? {} : { video }),
101
+ ...(guide === undefined ? {} : { guide }),
102
+ ...(pace === undefined ? {} : { paceMs: pace }),
103
+ fixtures: (site) => {
104
+ const fx = buildMissionFixtures(fixtureFlags, {
105
+ allowlist: environment === undefined ? [site] : environment.allowedOrigins,
106
+ baseUrl: site,
107
+ ...(storageState !== undefined ? { storageState } : {}),
108
+ ...(environment?.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
109
+ });
110
+ checkSetupRefs({ "--param": Object.values(param) }, fx);
111
+ return fx;
112
+ },
113
+ }));
114
+ const data = withEngine(result);
115
+ // A stale demo (the Journey no longer replays) is a failed check: exit 1, and nothing written.
116
+ const exit = result.outcome === "ok" ? EXIT_CODES.ok : EXIT_CODES.defects;
117
+ if (json) {
118
+ emitJson(program, ok(data));
119
+ }
120
+ else if (result.outcome === "stale") {
121
+ program.configureOutput().writeErr?.(`error: demo of journey '${id}' is stale: it no longer replays` +
122
+ `${result.stoppedAtStep === undefined ? "" : ` (stopped at step ${result.stoppedAtStep} of ${result.totalSteps})`}: ${result.reason ?? "unknown"}\n` +
123
+ `nothing was written — fix or re-record the Journey, then regenerate the demo\n`);
124
+ }
125
+ else {
126
+ out?.(`demo of journey '${id}': ${result.steps.length} step(s) replayed\n`);
127
+ if (result.video !== undefined)
128
+ out?.(`video: ${result.video}\nsubtitles: ${result.subtitles ?? ""}\n`);
129
+ if (result.guide !== undefined)
130
+ out?.(`guide: ${result.guide}\n`);
131
+ if (result.screenshotIndex !== undefined)
132
+ out?.(formatScreenshotsLine(result));
133
+ }
134
+ process.exitCode = exit;
135
+ }
136
+ catch (err) {
137
+ if (err instanceof SiteGateRefusedError || isEnvironmentError(err))
138
+ emitJson(program, fail(err.code, err.message));
139
+ else if (err instanceof DemoArgsError || err instanceof DemoOutputError)
140
+ emitJson(program, fail(err.code, err.message));
141
+ else if (err instanceof UnknownJourneyError)
142
+ emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
143
+ else if (err instanceof JourneyRequiresAuthError)
144
+ emitJson(program, fail("E_JOURNEY_REQUIRES_AUTH", err.message));
145
+ else if (err instanceof ParamValidationError)
146
+ emitJson(program, fail("E_INVALID_PARAMS", err.message));
147
+ else if (err instanceof FixtureSpecError || err instanceof UnboundSetupRefError)
148
+ emitJson(program, fail(err.code, err.message));
149
+ else if (err instanceof FixtureSetupError)
150
+ emitJson(program, fail("E_JOURNEY_DEMO", err.message));
151
+ else if (err instanceof SecretLeakError)
152
+ emitJson(program, fail("E_JOURNEY_DEMO_SECRET", err.message));
153
+ else
154
+ emitJson(program, fail("E_JOURNEY_DEMO", String(err instanceof Error ? err.message : err)));
155
+ }
156
+ });
157
+ }
158
+ //# sourceMappingURL=journey-demo-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-demo-cli.js","sourceRoot":"","sources":["../src/journey-demo-cli.ts"],"names":[],"mappings":"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"}