@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,243 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, resolve as resolvePath } from "node:path";
3
+ import { MissingCredentialError, SecretLeakError } from "@jevitate/ai-core";
4
+ import { UnauthorizedExploreTargetError } from "@jevitate/explore";
5
+ import { formatAnnotationChanges } from "@jevitate/journey";
6
+ import { SiteGateRefusedError } from "@jevitate/runtime";
7
+ import { ok, fail } from "./envelope.js";
8
+ import { intArg, positiveIntArg } from "./cli-args.js";
9
+ import { artifactStamp } from "./mission-journal.js";
10
+ import { logsDirFor } from "./project-dir.js";
11
+ import { withSiteGate } from "./site-gate-cli.js";
12
+ import { buildMissionFixtures, withFixtureFlags } from "./fixture-cli.js";
13
+ import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError } from "./mission-fixtures.js";
14
+ import { withEngine } from "./engine.js";
15
+ import { EXIT_CODES } from "./exit-codes.js";
16
+ import { parseAssertionSpec } from "./explore-api.js";
17
+ import { isEnvironmentError, resolveJourneyEnvironment } from "./environments.js";
18
+ import { loadTargetsFile, TargetConfigError } from "./target-config.js";
19
+ import { UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
20
+ import { AnnotationDraftNotFoundError, InvalidAnnotationDraftError, StaleAnnotationDraftError } from "./journey-annotate-api.js";
21
+ import { DEMO_DEFAULT_PACE_MS, DEMO_MAX_PACE_MS, DemoArgsError, DemoOutputError } from "./journey-demo-api.js";
22
+ import { DemoAspectArgsError, DemoDraftNotFoundError, DemoExistsError, DemoProductionEnvironmentError, InvalidDemoDraftError, approveDemo, assertDemoEnvironment, demoAspect, demoJourneyId, loadDemoForApproval, } from "./demo-aspect-api.js";
23
+ import { resolveDbPath, resolveJourneysDir, withBrowserLaunchFlags, browserRunFromFlags, withDemoFlags, withEmulationFlags, emulationFromFlags, emitJson, emitUsageLine, environmentSeams, GatewaySelectionError, buildExploreGateways, } from "./cli-shared.js";
24
+ import { clock } from "@jevitate/domain";
25
+ /**
26
+ * #249 — `jevitate demo "<aspect>" --env <name> --success <spec>`: explore → clean path → Journey →
27
+ * annotate → a DRAFT narrated demo; `jevitate demo approve <id>`: the one human approval (promotes the
28
+ * Journey, applies the annotations, renders the final demo). See `demo-aspect-api.ts`.
29
+ */
30
+ /** A thrown refusal → its envelope (exit 64 for usage/input codes, else 2), or rethrow-worthy null. */
31
+ function refusalOf(err) {
32
+ if (err instanceof DemoAspectArgsError ||
33
+ err instanceof DemoProductionEnvironmentError ||
34
+ err instanceof DemoExistsError ||
35
+ err instanceof DemoDraftNotFoundError ||
36
+ err instanceof InvalidDemoDraftError ||
37
+ err instanceof DemoArgsError ||
38
+ err instanceof DemoOutputError ||
39
+ err instanceof SiteGateRefusedError ||
40
+ err instanceof AnnotationDraftNotFoundError ||
41
+ err instanceof InvalidAnnotationDraftError ||
42
+ err instanceof StaleAnnotationDraftError ||
43
+ err instanceof FixtureSpecError ||
44
+ err instanceof UnboundSetupRefError ||
45
+ isEnvironmentError(err)) {
46
+ return { code: err.code, message: err.message };
47
+ }
48
+ if (err instanceof UnknownJourneyError)
49
+ return { code: "E_UNKNOWN_JOURNEY", message: err.message };
50
+ if (err instanceof JourneyRequiresAuthError)
51
+ return { code: "E_JOURNEY_REQUIRES_AUTH", message: err.message };
52
+ if (err instanceof UnauthorizedExploreTargetError)
53
+ return { code: "E_UNAUTHORIZED_EXPLORE_TARGET", message: err.message };
54
+ if (err instanceof TargetConfigError)
55
+ return { code: "E_TARGET_CONFIG", message: err.message };
56
+ if (err instanceof SecretLeakError)
57
+ return { code: "E_DEMO_SECRET", message: err.message };
58
+ if (err instanceof FixtureSetupError)
59
+ return { code: "E_DEMO", message: err.message };
60
+ return null;
61
+ }
62
+ /** The shared replay options from a command's flags (throws a typed refusal on unusable input). */
63
+ function replayOptionsFrom(cmd, deps, o, environment) {
64
+ const fixtureFlags = {
65
+ fixtures: o.fixtures,
66
+ before: o.before ?? environment.hooks?.before,
67
+ after: o.after ?? environment.hooks?.after,
68
+ allowShellHooks: o.allowShellHooks,
69
+ hookTimeoutMs: o.hookTimeoutMs,
70
+ fixtureIdentity: o.fixtureIdentity,
71
+ };
72
+ const storageState = o.storageState ?? environment.storageState;
73
+ if (storageState !== undefined && !existsSync(storageState))
74
+ throw new DemoAspectArgsError(`storage state not found: ${storageState}`);
75
+ let browser;
76
+ let emulation;
77
+ try {
78
+ browser = browserRunFromFlags(cmd.opts(), deps.explore?.env ?? process.env);
79
+ emulation = emulationFromFlags({ viewport: o.viewport, device: o.device });
80
+ }
81
+ catch (err) {
82
+ throw new DemoAspectArgsError(err instanceof Error ? err.message : String(err));
83
+ }
84
+ return {
85
+ environment,
86
+ ...(storageState === undefined ? {} : { storageState }),
87
+ ...(deps.explore?.browserPortFactory === undefined ? {} : { browserPortFactory: deps.explore.browserPortFactory }),
88
+ ...(browser === undefined ? {} : { browser }),
89
+ ...(emulation === undefined ? {} : { emulation }),
90
+ ...(o.pace === undefined ? {} : { paceMs: o.pace }),
91
+ fixtures: (site) => buildMissionFixtures(fixtureFlags, {
92
+ allowlist: environment.allowedOrigins,
93
+ baseUrl: site,
94
+ ...(storageState === undefined ? {} : { storageState }),
95
+ ...(environment.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
96
+ }),
97
+ };
98
+ }
99
+ function withReplayFlags(cmd) {
100
+ return withDemoFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(cmd))))
101
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
102
+ .option("--storage-state <file>", "Playwright storageState JSON to start authenticated (default: the environment's session in ~/.jevitate/targets.json); must exist")
103
+ .option("--out <dir>", "write the demo (demo.webm + demo.vtt + guide.md with guide.assets/) into this folder (default: a fresh folder in the logs dir)")
104
+ .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 }))
105
+ .option("--json", "emit a JSON envelope");
106
+ }
107
+ function outDirFor(flag, id, kind) {
108
+ if (flag !== undefined)
109
+ return resolvePath(flag);
110
+ return join(logsDirFor(), `demo-${id}-${kind}-${artifactStamp(clock.nowIso())}`);
111
+ }
112
+ function stepLines(steps) {
113
+ return steps
114
+ .map((s) => ` ${s.number}. ${s.objective ?? s.step}${s.expectedResult === undefined ? "" : `\n expected: ${s.expectedResult}`}\n`)
115
+ .join("");
116
+ }
117
+ export function registerDemoCommands(program, deps) {
118
+ const demo = program
119
+ .command("demo")
120
+ .description('demo one aspect of an app from a one-line request: explore → clean path → Journey → annotate → a DRAFT narrated demo; `demo approve <id>` promotes and renders the final one');
121
+ withReplayFlags(demo.command("create <aspect>", { isDefault: true }))
122
+ .description('explore a named non-production environment toward <aspect> (checked by --success), minimize the path to its essential steps (verified by replay), ' +
123
+ "annotate it and render a DRAFT demo (video, .vtt, guide); nothing is promoted until `demo approve <id>` (also: jevitate demo \"<aspect>\")")
124
+ .option("--env <name>", "the named environment to demo on (.jevitate/environments.json); required, and never one flagged production: true")
125
+ .option("--success <spec>", "independent success check that proves the aspect was shown, e.g. textIncludes:testId=status|Saved (required)")
126
+ .option("--persona <name>", "the persona whose session (~/.jevitate/targets.json personas) the demo runs as")
127
+ .option("--id <id>", "the Journey id (default: demo-<aspect slug>)")
128
+ .option("--start <path>", "the app path exploration starts from (default /)")
129
+ .option("--max-actions <n>", "hard cap on explored actions", positiveIntArg)
130
+ .option("--max-decisions <n>", "hard cap on model decisions", positiveIntArg)
131
+ .option("--real", "use live Jev + OpenRouter gateways (requires keys)", false)
132
+ .option("--fake-ai", "use deterministic fake gateways (pipeline smoke only)", false)
133
+ .action(async function (aspect) {
134
+ const o = this.opts();
135
+ const out = program.configureOutput().writeOut;
136
+ try {
137
+ if (o.success === undefined)
138
+ throw new DemoAspectArgsError("--success <spec> is required: the independent check that proves the aspect was shown");
139
+ let successAssertion;
140
+ try {
141
+ successAssertion = parseAssertionSpec(o.success);
142
+ }
143
+ catch (err) {
144
+ throw new DemoAspectArgsError(`--success: ${err instanceof Error ? err.message : String(err)}`);
145
+ }
146
+ const seams = environmentSeams(deps);
147
+ const environment = o.env === undefined ? undefined : resolveJourneyEnvironment({ env: o.env, ...(o.persona === undefined ? {} : { persona: o.persona }), ...seams });
148
+ assertDemoEnvironment(environment); // #249: a named, non-production environment — before anything runs
149
+ const replay = replayOptionsFrom(this, deps, o, environment);
150
+ const safety = (seams.targetsFile === undefined ? loadTargetsFile() : loadTargetsFile(seams.targetsFile))[environment.baseUrl]?.safety;
151
+ const id = o.id ?? demoJourneyId(aspect);
152
+ const { judge, gen, usage } = await buildExploreGateways(deps, { real: o.real ?? false, fakeAi: o.fakeAi ?? false });
153
+ const bounds = { ...(o.maxActions === undefined ? {} : { maxActions: o.maxActions }), ...(o.maxDecisions === undefined ? {} : { maxDecisions: o.maxDecisions }) };
154
+ const result = await withSiteGate(resolveDbPath(deps), (siteGate) => demoAspect({
155
+ ...replay,
156
+ ...(siteGate === undefined ? {} : { siteGate }),
157
+ aspect,
158
+ successAssertion,
159
+ successSpec: o.success ?? "",
160
+ journeysDir: resolveJourneysDir(deps, o.dir),
161
+ id,
162
+ ...(o.start === undefined ? {} : { start: o.start }),
163
+ ...(o.persona === undefined ? {} : { persona: o.persona }),
164
+ judge,
165
+ gen,
166
+ ...(Object.keys(bounds).length === 0 ? {} : { bounds }),
167
+ ...(safety === undefined ? {} : { safety }),
168
+ outDir: outDirFor(o.out, id, "draft"),
169
+ }));
170
+ const data = withEngine({ ...result, usage: usage.snapshot() });
171
+ // Only a drafted demo did the job; a goal not reached / a path that does not replay is a failed check.
172
+ process.exitCode = result.outcome === "drafted" ? EXIT_CODES.ok : EXIT_CODES.defects;
173
+ if (o.json) {
174
+ emitJson(program, ok(data));
175
+ return;
176
+ }
177
+ if (result.outcome !== "drafted") {
178
+ program.configureOutput().writeErr?.(`error: demo of "${result.aspect}" on ${result.environment}: ${result.outcome}: ${result.reason ?? "unknown"}\n`);
179
+ emitUsageLine(program, data);
180
+ return;
181
+ }
182
+ const m = result.minimize;
183
+ out?.(`DRAFT demo of "${result.aspect}" on ${result.environment} — journey '${result.id}' (not promoted)\n`);
184
+ if (m !== undefined) {
185
+ out?.(`clean path: explored ${m.exploredSteps} step(s), kept ${m.keptSteps}${m.dropped.length === 0 ? "" : `; dropped: ${m.dropped.join("; ")}`}` +
186
+ `${m.budgetExhausted ? " (replay budget reached: verified, maybe not minimal)" : ""}\n`);
187
+ }
188
+ out?.(`steps (with the drafted annotations):\n${stepLines(result.steps ?? [])}`);
189
+ if (result.annotations !== undefined)
190
+ out?.(formatAnnotationChanges(result.annotations.proposed));
191
+ if (result.draft?.video !== undefined)
192
+ out?.(`DRAFT video: ${result.draft.video}\nDRAFT subtitles: ${result.draft.subtitles ?? ""}\n`);
193
+ if (result.draft?.guide !== undefined)
194
+ out?.(`DRAFT guide: ${result.draft.guide}\n`);
195
+ out?.(`annotations: ${result.annotations?.draftPath ?? ""}\nreview it, then approve (promotes the Journey, renders the final demo): ${result.next ?? ""}\n`);
196
+ emitUsageLine(program, data);
197
+ }
198
+ catch (err) {
199
+ if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError) {
200
+ emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
201
+ return;
202
+ }
203
+ const r = refusalOf(err);
204
+ emitJson(program, r === null ? fail("E_DEMO", String(err instanceof Error ? err.message : err)) : fail(r.code, r.message));
205
+ }
206
+ });
207
+ withReplayFlags(demo.command("approve <id>"))
208
+ .description("the one human approval of a DRAFT demo: shows the Journey and its annotations, renders the final demo (no DRAFT marks) on the environment it was made on, " +
209
+ "then applies the annotations and promotes the Journey; a replay that no longer works promotes nothing (exit 1)")
210
+ .action(async function (id) {
211
+ const o = this.opts();
212
+ const out = program.configureOutput().writeOut;
213
+ try {
214
+ const journeysDir = resolveJourneysDir(deps, o.dir);
215
+ const { record } = await loadDemoForApproval(journeysDir, id);
216
+ const environment = resolveJourneyEnvironment({ env: record.env, ...(record.persona === undefined ? {} : { persona: record.persona }), ...environmentSeams(deps) });
217
+ assertDemoEnvironment(environment); // re-checked: the environment may have been flagged production since
218
+ const replay = replayOptionsFrom(this, deps, o, environment);
219
+ const result = await withSiteGate(resolveDbPath(deps), (siteGate) => approveDemo({ ...replay, ...(siteGate === undefined ? {} : { siteGate }), journeysDir, id, outDir: outDirFor(o.out, id, "final") }));
220
+ process.exitCode = result.outcome === "approved" ? EXIT_CODES.ok : EXIT_CODES.defects;
221
+ if (o.json) {
222
+ emitJson(program, ok(withEngine(result)));
223
+ return;
224
+ }
225
+ out?.(`journey '${id}' — "${record.aspect}" on ${result.environment}:\n${stepLines(result.steps)}`);
226
+ if (result.outcome !== "approved") {
227
+ program.configureOutput().writeErr?.(`error: demo '${id}' is stale: ${result.reason ?? "unknown"}\n`);
228
+ return;
229
+ }
230
+ out?.(formatAnnotationChanges(result.changes));
231
+ out?.(`approved: journey '${id}' promoted\n`);
232
+ if (result.final?.video !== undefined)
233
+ out?.(`video: ${result.final.video}\nsubtitles: ${result.final.subtitles ?? ""}\n`);
234
+ if (result.final?.guide !== undefined)
235
+ out?.(`guide: ${result.final.guide}\n`);
236
+ }
237
+ catch (err) {
238
+ const r = refusalOf(err);
239
+ emitJson(program, r === null ? fail("E_DEMO", String(err instanceof Error ? err.message : err)) : fail(r.code, r.message));
240
+ }
241
+ });
242
+ }
243
+ //# sourceMappingURL=demo-aspect-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-aspect-cli.js","sourceRoot":"","sources":["../src/demo-aspect-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import type { Locator, Page } from "playwright";
2
+ import { REVEALED_SECRET_SELECTORS, REVEALED_SECRET_SHAPES, revealedSecretsIn } from "@jevitate/ai-core";
3
+ import type { TargetDescriptor } from "@jevitate/recording";
4
+ import type { BrowserPort } from "@jevitate/playwright";
5
+ /**
6
+ * #248 — the ONE place a demo screenshot is taken. The overlay is always hidden (Playwright's
7
+ * `screenshot({ style })`, applied only for the capture: the page's DOM is never touched), and the
8
+ * capture is built from LAYERS so later safety passes plug in without touching the callers: pixel
9
+ * masking of secret fields (#250/#251) is a layer contributing `mask` locators and/or extra `style`.
10
+ * A layer cannot drop the overlay-hiding style: styles are concatenated, never replaced.
11
+ *
12
+ * #250/#251 — the pixel mask ({@link SecretPixelMask}): every registered secret value the page
13
+ * shows (text nodes, non-password input/textarea/select values, attribute-rendered text such as a
14
+ * `title`) is painted over by a DISPLAY-ONLY layer — the #245 overlay's technique: a CLOSED shadow
15
+ * root on a `<jevitate-mask>` host appended to `<html>`, pointer-events none, inert, aria-hidden;
16
+ * the page's own nodes are never changed. The layer re-measures on every animation frame (before
17
+ * each paint) and re-scans on every DOM mutation / input, so a video frame never shows a secret the
18
+ * mask has not caught. Screenshots and videos FAIL CLOSED: a capture whose mask cannot be proven
19
+ * (every occurrence covered by a painted box, the layer attached, visible and on top) is not written.
20
+ */
21
+ /** What a layer adds to one capture. */
22
+ export interface CaptureContribution {
23
+ /** Extra CSS applied only while capturing (appended after the overlay-hiding style). */
24
+ readonly style?: string;
25
+ /** Elements painted over in the image (Playwright `mask`). */
26
+ readonly mask?: readonly Locator[];
27
+ /** The mask colour (Playwright `maskColor`); the last layer that sets one wins. */
28
+ readonly maskColor?: string;
29
+ }
30
+ /** Where in the demo a capture is taken. */
31
+ export interface CaptureContext {
32
+ /** 1-based step number. */
33
+ readonly step: number;
34
+ }
35
+ /** A capture layer: consulted just before each screenshot. It must not change the page. */
36
+ export interface CaptureLayer {
37
+ readonly name: string;
38
+ prepare(page: Page, ctx: CaptureContext): Promise<CaptureContribution | void>;
39
+ /**
40
+ * #250: re-checked right AFTER the screenshot; a throw deletes the file just written (fail
41
+ * closed: the page may have changed between `prepare` and the capture).
42
+ */
43
+ confirm?(page: Page, ctx: CaptureContext): Promise<void>;
44
+ }
45
+ /** The screenshot options a set of layers produces (the overlay-hiding style always first). */
46
+ export declare function captureOptions(page: Page, ctx: CaptureContext, layers: readonly CaptureLayer[]): Promise<{
47
+ style: string;
48
+ mask: Locator[];
49
+ maskColor?: string;
50
+ }>;
51
+ /**
52
+ * Writes one step's PNG at `path`: the viewport (or `clip`, a page-coordinate region — #198's cropped
53
+ * finding shots), overlay hidden, every layer applied. Throws on failure.
54
+ */
55
+ export declare function captureStepScreenshot(page: Page, path: string, ctx: CaptureContext, layers?: readonly CaptureLayer[], clip?: {
56
+ readonly x: number;
57
+ readonly y: number;
58
+ readonly width: number;
59
+ readonly height: number;
60
+ }): Promise<void>;
61
+ /** The solid colour a secret is painted over with (the usability capture's mask colour, pinned). */
62
+ export declare const PIXEL_MASK_COLOR = "#FF00FF";
63
+ /** The attribute marking the mask layer's host element (never hidden by the capture style). */
64
+ export declare const PIXEL_MASK_ATTR = "data-jevitate-mask-layer";
65
+ /**
66
+ * #298 — a secret the app REVEALS mid-run (a freshly minted API key, a one-time reveal panel, an
67
+ * invite or reset link) is not known in advance, so it cannot be registered with `--secret`. The
68
+ * pixel mask also covers, with no registration:
69
+ *
70
+ * - elements the target marks as secret: these selectors (a target opts in with the
71
+ * `data-jevitate-mask` attribute; the rest are common one-time-secret markers);
72
+ * - text and field values shaped like a credential ({@link REVEALED_SECRET_SHAPES}).
73
+ *
74
+ * A value found either way is LEARNED for the rest of the run: masked wherever it appears later
75
+ * (another screen, a frame) and redacted from the screenshot index. Learned values live only in
76
+ * memory (the run's mask), never on disk. Limits (docs/safety.md): a secret with no marker and
77
+ * no credential shape (a short code, a plain word) is not masked; a password field shows dots.
78
+ */
79
+ export { REVEALED_SECRET_SELECTORS, REVEALED_SECRET_SHAPES, revealedSecretsIn };
80
+ /** The mask could not be applied or proven: the capture is skipped (fail closed), never written. */
81
+ export declare class MaskUnavailableError extends Error {
82
+ readonly code: "E_PIXEL_MASK";
83
+ constructor(message: string);
84
+ }
85
+ /** One proof of the mask at capture time, across every frame of the page. */
86
+ export interface MaskCheck {
87
+ readonly ok: boolean;
88
+ /** Visible occurrences of a registered secret (text ranges, fields, attribute-bearing elements). */
89
+ readonly occurrences: number;
90
+ /** Of those, how many a painted mask box fully covers. */
91
+ readonly masked: number;
92
+ /** Why the proof failed (never contains a secret). */
93
+ readonly reason?: string;
94
+ /** The covered occurrences' viewport rects (top frame only) — what a pixel check can sample. */
95
+ readonly rects: ReadonlyArray<{
96
+ readonly x: number;
97
+ readonly y: number;
98
+ readonly width: number;
99
+ readonly height: number;
100
+ }>;
101
+ }
102
+ /**
103
+ * One run's pixel mask over its registered secrets (raw and URL-encoded forms, as `redactText`).
104
+ * `install` (per browser context, before its first navigation — every later document and frame gets
105
+ * it from an init script) keeps a VIDEO masked; `verify`/`layer()` prove it at each capture and
106
+ * `assertMasked` throws {@link MaskUnavailableError} when it cannot be proven. With no secrets there
107
+ * is nothing to mask: `verify` is trivially ok and nothing is injected for it.
108
+ */
109
+ export declare class SecretPixelMask {
110
+ #private;
111
+ /**
112
+ * Always true (#298): even with no registered secret, a secret the app reveals mid-run (a marked
113
+ * element, a credential-shaped value) is masked, so every capture installs and proves the mask.
114
+ */
115
+ readonly active: boolean;
116
+ constructor(secrets: readonly string[]);
117
+ /** Installs the live mask in `page`'s context (every future document/frame) and every current frame. Throws when it cannot. */
118
+ install(page: Page): Promise<void>;
119
+ /**
120
+ * The secrets the app revealed during the run (#298), as learned so far — for redacting what the
121
+ * run writes about its captures (the screenshot index). Never persisted.
122
+ */
123
+ revealed(): readonly string[];
124
+ /** Proves the mask covers every visible secret occurrence in every frame of `page`, now. */
125
+ verify(page: Page): Promise<MaskCheck>;
126
+ /** Throws {@link MaskUnavailableError} unless {@link verify} proves the mask. */
127
+ assertMasked(page: Page): Promise<MaskCheck>;
128
+ /** The capture layer: proven before the screenshot and again after it (a failure deletes the file). */
129
+ layer(): CaptureLayer;
130
+ /** Draws a capture highlight box around `target`'s first match (display-only). True when shown. */
131
+ highlight(page: Page, target: TargetDescriptor): Promise<boolean>;
132
+ /** #198: the same display-only highlight box around `locator`'s first match (a control or a quoted text). */
133
+ highlightLocator(page: Page, locator: Locator): Promise<boolean>;
134
+ /** Removes the capture highlight (best-effort). */
135
+ clearHighlight(page: Page): Promise<void>;
136
+ }
137
+ /**
138
+ * A port whose every session carries the live pixel mask from before its first navigation — so a
139
+ * `recordVideo` session's every frame is masked. A session whose mask cannot be installed is closed
140
+ * and the open throws {@link MaskUnavailableError}: nothing is recorded unmasked.
141
+ */
142
+ export declare function maskingPort(port: BrowserPort, mask: SecretPixelMask): BrowserPort;