@jevitate/cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.js +40 -30
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.d.ts +4 -0
  5. package/dist/author-journey-cli.js +109 -0
  6. package/dist/author-journey-cli.js.map +1 -0
  7. package/dist/bin.js +58077 -22454
  8. package/dist/bin.js.map +1 -1
  9. package/dist/browser-run-options.d.ts +58 -0
  10. package/dist/browser-run-options.js +106 -0
  11. package/dist/browser-run-options.js.map +1 -0
  12. package/dist/build-info.generated.d.ts +2 -0
  13. package/dist/build-info.generated.js +10 -0
  14. package/dist/build-info.generated.js.map +1 -0
  15. package/dist/check-api.d.ts +5 -0
  16. package/dist/check-api.js +233 -0
  17. package/dist/check-api.js.map +1 -0
  18. package/dist/check-budget.d.ts +26 -0
  19. package/dist/check-budget.js +89 -0
  20. package/dist/check-budget.js.map +1 -0
  21. package/dist/check-cli.d.ts +31 -0
  22. package/dist/check-cli.js +109 -0
  23. package/dist/check-cli.js.map +1 -0
  24. package/dist/check-execute.d.ts +25 -0
  25. package/dist/check-execute.js +385 -0
  26. package/dist/check-execute.js.map +1 -0
  27. package/dist/check-plan.d.ts +113 -0
  28. package/dist/check-plan.js +448 -0
  29. package/dist/check-plan.js.map +1 -0
  30. package/dist/check-suite.d.ts +171 -0
  31. package/dist/check-suite.js +515 -0
  32. package/dist/check-suite.js.map +1 -0
  33. package/dist/check-types.d.ts +181 -0
  34. package/dist/check-types.js +35 -0
  35. package/dist/check-types.js.map +1 -0
  36. package/dist/cli-args.d.ts +26 -0
  37. package/dist/cli-args.js +50 -0
  38. package/dist/cli-args.js.map +1 -0
  39. package/dist/cli-output.d.ts +102 -0
  40. package/dist/cli-output.js +516 -0
  41. package/dist/cli-output.js.map +1 -0
  42. package/dist/cli-reference.d.ts +3 -0
  43. package/dist/cli-reference.js +81 -0
  44. package/dist/cli-reference.js.map +1 -0
  45. package/dist/cli-refusal.d.ts +12 -0
  46. package/dist/cli-refusal.js +52 -0
  47. package/dist/cli-refusal.js.map +1 -0
  48. package/dist/cli-shared.d.ts +330 -0
  49. package/dist/cli-shared.js +492 -0
  50. package/dist/cli-shared.js.map +1 -0
  51. package/dist/cli-surface.d.ts +33 -0
  52. package/dist/cli-surface.js +48 -0
  53. package/dist/cli-surface.js.map +1 -0
  54. package/dist/conversation-options.d.ts +15 -0
  55. package/dist/conversation-options.js +10 -0
  56. package/dist/conversation-options.js.map +1 -0
  57. package/dist/credentials-file.d.ts +15 -0
  58. package/dist/credentials-file.js +56 -0
  59. package/dist/credentials-file.js.map +1 -0
  60. package/dist/data-dir.d.ts +1 -1
  61. package/dist/data-dir.js +1 -1
  62. package/dist/defect-evidence.d.ts +141 -0
  63. package/dist/defect-evidence.js +502 -0
  64. package/dist/defect-evidence.js.map +1 -0
  65. package/dist/demo-aspect-api.d.ts +209 -0
  66. package/dist/demo-aspect-api.js +397 -0
  67. package/dist/demo-aspect-api.js.map +1 -0
  68. package/dist/demo-aspect-cli.d.ts +3 -0
  69. package/dist/demo-aspect-cli.js +241 -0
  70. package/dist/demo-aspect-cli.js.map +1 -0
  71. package/dist/demo-capture.d.ts +108 -0
  72. package/dist/demo-capture.js +438 -0
  73. package/dist/demo-capture.js.map +1 -0
  74. package/dist/engine.d.ts +35 -0
  75. package/dist/engine.js +25 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/environments.d.ts +155 -0
  78. package/dist/environments.js +364 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/exit-codes.d.ts +46 -0
  81. package/dist/exit-codes.js +91 -0
  82. package/dist/exit-codes.js.map +1 -0
  83. package/dist/explore-adversarial.d.ts +137 -0
  84. package/dist/explore-adversarial.js +218 -0
  85. package/dist/explore-adversarial.js.map +1 -0
  86. package/dist/explore-api.d.ts +7 -187
  87. package/dist/explore-api.js +7 -301
  88. package/dist/explore-api.js.map +1 -1
  89. package/dist/explore-author.d.ts +79 -0
  90. package/dist/explore-author.js +86 -0
  91. package/dist/explore-author.js.map +1 -0
  92. package/dist/explore-cli.d.ts +7 -0
  93. package/dist/explore-cli.js +963 -0
  94. package/dist/explore-cli.js.map +1 -0
  95. package/dist/explore-coverage.d.ts +158 -0
  96. package/dist/explore-coverage.js +240 -0
  97. package/dist/explore-coverage.js.map +1 -0
  98. package/dist/explore-feature.d.ts +127 -0
  99. package/dist/explore-feature.js +220 -0
  100. package/dist/explore-feature.js.map +1 -0
  101. package/dist/explore-goal.d.ts +253 -0
  102. package/dist/explore-goal.js +374 -0
  103. package/dist/explore-goal.js.map +1 -0
  104. package/dist/explore-shared.d.ts +152 -0
  105. package/dist/explore-shared.js +129 -0
  106. package/dist/explore-shared.js.map +1 -0
  107. package/dist/explore-specs.d.ts +53 -0
  108. package/dist/explore-specs.js +333 -0
  109. package/dist/explore-specs.js.map +1 -0
  110. package/dist/findings-filing.d.ts +64 -0
  111. package/dist/findings-filing.js +108 -0
  112. package/dist/findings-filing.js.map +1 -0
  113. package/dist/fixture-auth.d.ts +52 -0
  114. package/dist/fixture-auth.js +82 -0
  115. package/dist/fixture-auth.js.map +1 -0
  116. package/dist/fixture-cli.d.ts +70 -0
  117. package/dist/fixture-cli.js +178 -0
  118. package/dist/fixture-cli.js.map +1 -0
  119. package/dist/github-issue-filer.d.ts +62 -0
  120. package/dist/github-issue-filer.js +188 -0
  121. package/dist/github-issue-filer.js.map +1 -0
  122. package/dist/host-health-run.d.ts +24 -0
  123. package/dist/host-health-run.js +27 -0
  124. package/dist/host-health-run.js.map +1 -0
  125. package/dist/http-5xx-outcome.d.ts +6 -0
  126. package/dist/http-5xx-outcome.js +39 -0
  127. package/dist/http-5xx-outcome.js.map +1 -0
  128. package/dist/inbox-cli.d.ts +7 -0
  129. package/dist/inbox-cli.js +197 -0
  130. package/dist/inbox-cli.js.map +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/init-cli.d.ts +4 -0
  135. package/dist/init-cli.js +127 -0
  136. package/dist/init-cli.js.map +1 -0
  137. package/dist/init-keys.d.ts +19 -2
  138. package/dist/init-keys.js +15 -4
  139. package/dist/init-keys.js.map +1 -1
  140. package/dist/init-next-steps.d.ts +35 -0
  141. package/dist/init-next-steps.js +79 -0
  142. package/dist/init-next-steps.js.map +1 -0
  143. package/dist/invariants-file.d.ts +34 -0
  144. package/dist/invariants-file.js +68 -0
  145. package/dist/invariants-file.js.map +1 -0
  146. package/dist/invariants-validate.d.ts +30 -0
  147. package/dist/invariants-validate.js +105 -0
  148. package/dist/invariants-validate.js.map +1 -0
  149. package/dist/journey-annotate-api.d.ts +76 -0
  150. package/dist/journey-annotate-api.js +256 -0
  151. package/dist/journey-annotate-api.js.map +1 -0
  152. package/dist/journey-annotate-cli.d.ts +9 -0
  153. package/dist/journey-annotate-cli.js +179 -0
  154. package/dist/journey-annotate-cli.js.map +1 -0
  155. package/dist/journey-api.d.ts +79 -2
  156. package/dist/journey-api.js +136 -19
  157. package/dist/journey-api.js.map +1 -1
  158. package/dist/journey-cli.d.ts +4 -0
  159. package/dist/journey-cli.js +370 -0
  160. package/dist/journey-cli.js.map +1 -0
  161. package/dist/journey-demo-api.d.ts +112 -0
  162. package/dist/journey-demo-api.js +392 -0
  163. package/dist/journey-demo-api.js.map +1 -0
  164. package/dist/journey-demo-cli.d.ts +10 -0
  165. package/dist/journey-demo-cli.js +155 -0
  166. package/dist/journey-demo-cli.js.map +1 -0
  167. package/dist/kill-signal.d.ts +193 -0
  168. package/dist/kill-signal.js +284 -0
  169. package/dist/kill-signal.js.map +1 -0
  170. package/dist/launch-armed.d.ts +37 -0
  171. package/dist/launch-armed.js +31 -0
  172. package/dist/launch-armed.js.map +1 -0
  173. package/dist/ledger-api.d.ts +106 -0
  174. package/dist/ledger-api.js +237 -0
  175. package/dist/ledger-api.js.map +1 -0
  176. package/dist/ledger-cli.d.ts +18 -0
  177. package/dist/ledger-cli.js +107 -0
  178. package/dist/ledger-cli.js.map +1 -0
  179. package/dist/load-api.d.ts +29 -11
  180. package/dist/load-api.js +23 -15
  181. package/dist/load-api.js.map +1 -1
  182. package/dist/load-cli.d.ts +4 -0
  183. package/dist/load-cli.js +97 -0
  184. package/dist/load-cli.js.map +1 -0
  185. package/dist/log-correlation.d.ts +147 -0
  186. package/dist/log-correlation.js +325 -0
  187. package/dist/log-correlation.js.map +1 -0
  188. package/dist/log-lines.d.ts +131 -0
  189. package/dist/log-lines.js +389 -0
  190. package/dist/log-lines.js.map +1 -0
  191. package/dist/log-sources.d.ts +71 -0
  192. package/dist/log-sources.js +235 -0
  193. package/dist/log-sources.js.map +1 -0
  194. package/dist/logs-cli.d.ts +3 -0
  195. package/dist/logs-cli.js +51 -0
  196. package/dist/logs-cli.js.map +1 -0
  197. package/dist/logs-retention.d.ts +28 -0
  198. package/dist/logs-retention.js +84 -0
  199. package/dist/logs-retention.js.map +1 -0
  200. package/dist/mcp-api.d.ts +89 -1
  201. package/dist/mcp-api.js +472 -18
  202. package/dist/mcp-api.js.map +1 -1
  203. package/dist/mcp-args.d.ts +38 -0
  204. package/dist/mcp-args.js +131 -0
  205. package/dist/mcp-args.js.map +1 -0
  206. package/dist/mcp-cli-bridge.d.ts +34 -0
  207. package/dist/mcp-cli-bridge.js +62 -0
  208. package/dist/mcp-cli-bridge.js.map +1 -0
  209. package/dist/mcp-cli-runner.d.ts +29 -0
  210. package/dist/mcp-cli-runner.js +44 -0
  211. package/dist/mcp-cli-runner.js.map +1 -0
  212. package/dist/mcp-cli-tools.d.ts +125 -0
  213. package/dist/mcp-cli-tools.js +680 -0
  214. package/dist/mcp-cli-tools.js.map +1 -0
  215. package/dist/mcp-paths.d.ts +28 -0
  216. package/dist/mcp-paths.js +76 -0
  217. package/dist/mcp-paths.js.map +1 -0
  218. package/dist/mission-actors.d.ts +40 -0
  219. package/dist/mission-actors.js +72 -0
  220. package/dist/mission-actors.js.map +1 -0
  221. package/dist/mission-api.d.ts +35 -0
  222. package/dist/mission-api.js +58 -2
  223. package/dist/mission-api.js.map +1 -1
  224. package/dist/mission-cli.d.ts +4 -0
  225. package/dist/mission-cli.js +247 -0
  226. package/dist/mission-cli.js.map +1 -0
  227. package/dist/mission-exit.d.ts +22 -0
  228. package/dist/mission-exit.js +26 -0
  229. package/dist/mission-exit.js.map +1 -0
  230. package/dist/mission-fixtures.d.ts +225 -0
  231. package/dist/mission-fixtures.js +828 -0
  232. package/dist/mission-fixtures.js.map +1 -0
  233. package/dist/mission-journal.d.ts +60 -0
  234. package/dist/mission-journal.js +115 -0
  235. package/dist/mission-journal.js.map +1 -0
  236. package/dist/mission-queue-cli.d.ts +10 -0
  237. package/dist/mission-queue-cli.js +198 -0
  238. package/dist/mission-queue-cli.js.map +1 -0
  239. package/dist/mission-queue-runner.d.ts +126 -0
  240. package/dist/mission-queue-runner.js +397 -0
  241. package/dist/mission-queue-runner.js.map +1 -0
  242. package/dist/multi-run-cli.d.ts +37 -0
  243. package/dist/multi-run-cli.js +110 -0
  244. package/dist/multi-run-cli.js.map +1 -0
  245. package/dist/multi-run.d.ts +339 -0
  246. package/dist/multi-run.js +619 -0
  247. package/dist/multi-run.js.map +1 -0
  248. package/dist/openrouter-call.d.ts +22 -0
  249. package/dist/openrouter-call.js +63 -0
  250. package/dist/openrouter-call.js.map +1 -0
  251. package/dist/profile-cli.d.ts +4 -0
  252. package/dist/profile-cli.js +57 -0
  253. package/dist/profile-cli.js.map +1 -0
  254. package/dist/program.d.ts +3 -75
  255. package/dist/program.js +119 -1921
  256. package/dist/program.js.map +1 -1
  257. package/dist/project-dir.d.ts +96 -0
  258. package/dist/project-dir.js +220 -0
  259. package/dist/project-dir.js.map +1 -0
  260. package/dist/record-api.d.ts +10 -6
  261. package/dist/record-api.js +39 -28
  262. package/dist/record-api.js.map +1 -1
  263. package/dist/record-cli.d.ts +4 -0
  264. package/dist/record-cli.js +64 -0
  265. package/dist/record-cli.js.map +1 -0
  266. package/dist/recording-cli.d.ts +4 -0
  267. package/dist/recording-cli.js +248 -0
  268. package/dist/recording-cli.js.map +1 -0
  269. package/dist/regression-api.d.ts +101 -0
  270. package/dist/regression-api.js +384 -5
  271. package/dist/regression-api.js.map +1 -1
  272. package/dist/regression-cli.d.ts +4 -0
  273. package/dist/regression-cli.js +232 -0
  274. package/dist/regression-cli.js.map +1 -0
  275. package/dist/report-api.d.ts +146 -0
  276. package/dist/report-api.js +430 -0
  277. package/dist/report-api.js.map +1 -0
  278. package/dist/report-cli.d.ts +12 -0
  279. package/dist/report-cli.js +147 -0
  280. package/dist/report-cli.js.map +1 -0
  281. package/dist/result-schema.d.ts +22 -0
  282. package/dist/result-schema.js +28 -0
  283. package/dist/result-schema.js.map +1 -0
  284. package/dist/run-index.d.ts +29 -0
  285. package/dist/run-index.js +70 -0
  286. package/dist/run-index.js.map +1 -0
  287. package/dist/run-screenshots.d.ts +123 -0
  288. package/dist/run-screenshots.js +229 -0
  289. package/dist/run-screenshots.js.map +1 -0
  290. package/dist/runtime-env.d.ts +8 -0
  291. package/dist/runtime-env.js +22 -0
  292. package/dist/runtime-env.js.map +1 -0
  293. package/dist/secret-args.d.ts +23 -0
  294. package/dist/secret-args.js +45 -0
  295. package/dist/secret-args.js.map +1 -0
  296. package/dist/serve-cli.d.ts +4 -0
  297. package/dist/serve-cli.js +95 -0
  298. package/dist/serve-cli.js.map +1 -0
  299. package/dist/server-log-verify.d.ts +34 -0
  300. package/dist/server-log-verify.js +115 -0
  301. package/dist/server-log-verify.js.map +1 -0
  302. package/dist/session-check.d.ts +14 -0
  303. package/dist/session-check.js +44 -0
  304. package/dist/session-check.js.map +1 -0
  305. package/dist/site-cli.d.ts +4 -0
  306. package/dist/site-cli.js +127 -0
  307. package/dist/site-cli.js.map +1 -0
  308. package/dist/site-gate-cli.d.ts +28 -0
  309. package/dist/site-gate-cli.js +58 -0
  310. package/dist/site-gate-cli.js.map +1 -0
  311. package/dist/source-api.js +18 -3
  312. package/dist/source-api.js.map +1 -1
  313. package/dist/source-cli.d.ts +4 -0
  314. package/dist/source-cli.js +284 -0
  315. package/dist/source-cli.js.map +1 -0
  316. package/dist/source-run-api.d.ts +27 -1
  317. package/dist/source-run-api.js +22 -11
  318. package/dist/source-run-api.js.map +1 -1
  319. package/dist/storage-state-snapshot.d.ts +50 -0
  320. package/dist/storage-state-snapshot.js +87 -0
  321. package/dist/storage-state-snapshot.js.map +1 -0
  322. package/dist/suite-explore-options.d.ts +289 -0
  323. package/dist/suite-explore-options.js +140 -0
  324. package/dist/suite-explore-options.js.map +1 -0
  325. package/dist/target-config.d.ts +109 -0
  326. package/dist/target-config.js +216 -0
  327. package/dist/target-config.js.map +1 -0
  328. package/dist/transcript-file.d.ts +12 -0
  329. package/dist/transcript-file.js +23 -0
  330. package/dist/transcript-file.js.map +1 -0
  331. package/dist/ui-api.d.ts +3 -0
  332. package/dist/ui-api.js +7 -1
  333. package/dist/ui-api.js.map +1 -1
  334. package/dist/usability-capture.d.ts +43 -0
  335. package/dist/usability-capture.js +326 -0
  336. package/dist/usability-capture.js.map +1 -0
  337. package/dist/usage-config.d.ts +36 -0
  338. package/dist/usage-config.js +114 -0
  339. package/dist/usage-config.js.map +1 -0
  340. package/dist/ux-api.d.ts +3 -75
  341. package/dist/ux-api.js +3 -220
  342. package/dist/ux-api.js.map +1 -1
  343. package/dist/ux-cli.d.ts +4 -0
  344. package/dist/ux-cli.js +102 -0
  345. package/dist/ux-cli.js.map +1 -0
  346. package/dist/ux-config.d.ts +29 -0
  347. package/dist/ux-config.js +103 -0
  348. package/dist/ux-config.js.map +1 -0
  349. package/dist/ux-evidence.d.ts +54 -0
  350. package/dist/ux-evidence.js +197 -0
  351. package/dist/ux-evidence.js.map +1 -0
  352. package/dist/ux-review.d.ts +112 -0
  353. package/dist/ux-review.js +151 -0
  354. package/dist/ux-review.js.map +1 -0
  355. package/dist/ux-usability.d.ts +238 -0
  356. package/dist/ux-usability.js +494 -0
  357. package/dist/ux-usability.js.map +1 -0
  358. package/dist/verify-fix-api.d.ts +173 -0
  359. package/dist/verify-fix-api.js +454 -0
  360. package/dist/verify-fix-api.js.map +1 -0
  361. package/dist/verify-fix-cli.d.ts +4 -0
  362. package/dist/verify-fix-cli.js +110 -0
  363. package/dist/verify-fix-cli.js.map +1 -0
  364. package/package.json +19 -14
  365. package/skills/jevitate-ci-check/SKILL.md +77 -0
  366. package/skills/jevitate-demo/SKILL.md +61 -0
  367. package/skills/jevitate-explore/SKILL.md +88 -87
  368. package/skills/jevitate-getting-started/SKILL.md +88 -0
  369. package/skills/jevitate-load-test/SKILL.md +11 -2
  370. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  371. package/skills/jevitate-record/SKILL.md +23 -5
  372. package/skills/jevitate-run-journey/SKILL.md +61 -17
  373. package/skills/jevitate-sources/SKILL.md +57 -14
  374. package/skills/jevitate-ux-review/SKILL.md +106 -16
  375. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,370 @@
1
+ import { existsSync } from "node:fs";
2
+ import { FsJourneyStore, JourneyRegistry, ParamValidationError } from "@jevitate/journey";
3
+ import { MissingCredentialError } from "@jevitate/ai-core";
4
+ import { safeRunPolicy } from "@jevitate/domain";
5
+ import { makeExploreSelfHealer } from "./self-heal-adapter.js";
6
+ import { ok, fail } from "./envelope.js";
7
+ import { SiteGateRefusedError } from "@jevitate/runtime";
8
+ import { runJourneyProgrammatically, promoteJourney, UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
9
+ import { parseScreenshotsArg } from "./run-screenshots.js";
10
+ import { withSiteGate } from "./site-gate-cli.js";
11
+ import { registerJourneyAnnotateCommand } from "./journey-annotate-cli.js";
12
+ import { registerJourneyDemoCommand } from "./journey-demo-cli.js";
13
+ import { journeyIntentCoverage } from "./journey-annotate-api.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 { publishJourneyToSource, realGhPort, NotPromotedError, NoDeclaredOriginsError } from "./source-api.js";
18
+ import { UnknownSourceError, EmbeddedSecretError, UndeclaredOriginError } from "@jevitate/sources";
19
+ import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
20
+ import { resolveDbPath, resolveJourneysDir, resolveSourceApiDeps, withBrowserLaunchFlags, browserRunFromFlags, withDemoFlags, withScreenshotsFlag, withEmulationFlags, emulationFromFlags, collectParam, emitJson, environmentSeams, writeRawResult, GatewaySelectionError, buildExploreGateways, } from "./cli-shared.js";
21
+ /** Registers `jevitate journey`: `list|find|run|promote|annotate|demo|publish`. */
22
+ export function registerJourneyCommands(program, deps) {
23
+ const journey = program.command("journey").description("manage and run promoted Journeys (regression-test replays)");
24
+ /**
25
+ * `journey list` = ALL journeys' metadata via the store directly
26
+ * (promoted AND unpromoted) — a local/dev-facing listing of everything on
27
+ * disk. `journey find` (below) = promoted-only, via `JourneyRegistry.find`
28
+ * — the same promoted-only projection external callers (e.g. the
29
+ * mcp-facade) see. Keeping these distinct means `list` is useful for
30
+ * authoring/debugging while `find` genuinely reflects what's discoverable.
31
+ */
32
+ journey
33
+ .command("list")
34
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
35
+ .option("--json", "emit a JSON envelope")
36
+ .action(async function () {
37
+ const { dir, json } = this.opts();
38
+ try {
39
+ const store = new FsJourneyStore(resolveJourneysDir(deps, dir));
40
+ const metas = await store.list();
41
+ const envelope = ok(metas);
42
+ if (json) {
43
+ emitJson(program, envelope);
44
+ }
45
+ else {
46
+ const out = program.configureOutput().writeOut;
47
+ if (metas.length === 0) {
48
+ out?.("no journeys yet — record one with `jevitate record` (see jevitate record --help)\n");
49
+ }
50
+ else {
51
+ for (const m of metas) {
52
+ out?.(`${m.id}\t${m.name}${m.promoted ? "" : " (unpromoted)"}\n`);
53
+ }
54
+ }
55
+ process.exitCode = 0;
56
+ }
57
+ }
58
+ catch (err) {
59
+ emitJson(program, fail("E_JOURNEY_LIST", String(err)));
60
+ }
61
+ });
62
+ // RULING 5: uses `JourneyRegistry.find` (from `@jevitate/journey`) directly —
63
+ // NEVER `@jevitate/mcp-facade`'s `findCapabilities` — Slice 1 forbids the CLI
64
+ // depending on `@jevitate/mcp-facade`. `JourneyRegistry.find` is already
65
+ // promoted-only, so this is the same promoted-only view without the
66
+ // forbidden dependency.
67
+ journey
68
+ .command("find <query>")
69
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
70
+ .option("--json", "emit a JSON envelope")
71
+ .action(async function (query) {
72
+ const { dir, json } = this.opts();
73
+ try {
74
+ const store = new FsJourneyStore(resolveJourneysDir(deps, dir));
75
+ const registry = new JourneyRegistry(store);
76
+ const metas = await registry.find(query);
77
+ const capabilities = metas.map((m) => ({
78
+ id: m.id,
79
+ name: m.name,
80
+ description: m.description,
81
+ params: m.params,
82
+ }));
83
+ const envelope = ok(capabilities);
84
+ if (json) {
85
+ emitJson(program, envelope);
86
+ }
87
+ else {
88
+ const out = program.configureOutput().writeOut;
89
+ for (const c of capabilities) {
90
+ out?.(`${c.id}\t${c.name}\tparams=[${c.params.join(", ")}]\n`);
91
+ }
92
+ process.exitCode = 0;
93
+ }
94
+ }
95
+ catch (err) {
96
+ emitJson(program, fail("E_JOURNEY_FIND", String(err)));
97
+ }
98
+ });
99
+ withScreenshotsFlag(withEnvironmentFlags(withDemoFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(journey.command("run <id>")))), { recordVideo: true })))
100
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
101
+ .option("--param <kv>", "param as key=value (repeatable)", collectParam, {})
102
+ .option("--storage-state <file>", "Playwright storageState JSON to start the session authenticated (#118: required when the journey declares metadata.requiresAuth); must exist")
103
+ // Ticket #7 (additive): opt a run into scoped self-healing. Default
104
+ // `fail-closed` preserves Slice 1 behavior exactly (no healer wired). A
105
+ // write/irreversible step NEVER auto-heals in any mode (enforced by the
106
+ // runtime's write floor). `hybrid`/`full` need an AI gateway, selected
107
+ // with --real/--fake-ai (mirrors `explore`); requesting a heal mode
108
+ // without one fails CLOSED, never a silent unhealed run.
109
+ .option("--self-heal <mode>", "self-heal policy mode: fail-closed | hybrid | full", "fail-closed")
110
+ .option("--real", "use live Jev + OpenRouter gateways for self-heal (requires keys)", false)
111
+ .option("--fake-ai", "use deterministic fake gateways for self-heal (pipeline smoke only)", false)
112
+ .option("--json", "emit a JSON envelope")
113
+ .action(async function (id) {
114
+ const { env: envName, baseUrl } = this.opts();
115
+ // #247: --env/--base-url choose where the Journey runs (unknown env / bad file → 64, nothing opened).
116
+ let environment;
117
+ try {
118
+ environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
119
+ }
120
+ catch (err) {
121
+ if (!isEnvironmentError(err))
122
+ throw err;
123
+ emitJson(program, fail(err.code, err.message));
124
+ return;
125
+ }
126
+ const ownFixtureFlags = this.opts();
127
+ // The environment's fixtures/hooks apply when the flags name none (hooks still need --allow-shell-hooks).
128
+ const fixtureFlags = {
129
+ ...ownFixtureFlags,
130
+ ...(ownFixtureFlags.before === undefined && environment?.hooks?.before !== undefined ? { before: environment.hooks.before } : {}),
131
+ ...(ownFixtureFlags.after === undefined && environment?.hooks?.after !== undefined ? { after: environment.hooks.after } : {}),
132
+ };
133
+ const { dir, param, storageState: storageStateFlag, selfHeal, real, fakeAi, json, screenshots: _screenshots, ...emulationFlags } = this.opts();
134
+ // --storage-state wins; else the environment's own session (~/.jevitate/targets.json[<origin>]).
135
+ const storageState = storageStateFlag ?? environment?.storageState;
136
+ if (storageState !== undefined && !existsSync(storageState)) {
137
+ emitJson(program, fail("E_JOURNEY_RUN_ARGS", `storage state not found: ${storageState}`));
138
+ return;
139
+ }
140
+ // #245: demo mode, resolved (a headed run without a display refused) before any browser opens.
141
+ let browser;
142
+ try {
143
+ browser = browserRunFromFlags(this.opts(), deps.explore?.env ?? process.env);
144
+ }
145
+ catch (err) {
146
+ emitJson(program, fail("E_JOURNEY_RUN_ARGS", err instanceof Error ? err.message : String(err)));
147
+ return;
148
+ }
149
+ // #251: an unusable --screenshots value is a usage error (64), before any browser opens.
150
+ let screenshots;
151
+ try {
152
+ screenshots = parseScreenshotsArg(this.opts().screenshots);
153
+ }
154
+ catch (err) {
155
+ emitJson(program, fail("E_JOURNEY_RUN_ARGS", err instanceof Error ? err.message : String(err)));
156
+ return;
157
+ }
158
+ let journeyRunEmulation;
159
+ try {
160
+ journeyRunEmulation = emulationFromFlags(emulationFlags);
161
+ }
162
+ catch (err) {
163
+ emitJson(program, fail("E_JOURNEY_RUN_ARGS", err instanceof Error ? err.message : String(err)));
164
+ return;
165
+ }
166
+ if (selfHeal !== "fail-closed" && selfHeal !== "hybrid" && selfHeal !== "full") {
167
+ emitJson(program, fail("E_SELF_HEAL_MODE", `--self-heal must be one of fail-closed | hybrid | full (got '${selfHeal}')`));
168
+ return;
169
+ }
170
+ const selfHealMode = selfHeal;
171
+ // When a heal mode is requested, build the SelfHealer HERE (this action
172
+ // owns `deps` + the credential preflight); a missing/unselected gateway
173
+ // fails CLOSED before any browser launch, rather than silently running
174
+ // with no healer. fail-closed needs no gateway (identical to today).
175
+ let selfHealer;
176
+ let policy = safeRunPolicy();
177
+ // #163: a self-healing run makes model calls — their usage (and full cost) lands on its result.
178
+ let healUsage;
179
+ if (selfHealMode !== "fail-closed") {
180
+ let judge;
181
+ let gen;
182
+ try {
183
+ ({ judge, gen, usage: healUsage } = await buildExploreGateways(deps, { real: real ?? false, fakeAi: fakeAi ?? false }));
184
+ }
185
+ catch (err) {
186
+ if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError) {
187
+ emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
188
+ }
189
+ else {
190
+ emitJson(program, fail("E_JOURNEY_RUN", String(err instanceof Error ? err.message : err)));
191
+ }
192
+ return;
193
+ }
194
+ selfHealer = makeExploreSelfHealer(judge, gen);
195
+ policy = { ...policy, selfHeal: { mode: selfHealMode } };
196
+ }
197
+ try {
198
+ // `runJourneyProgrammatically` validates params UP FRONT (before any
199
+ // browser launch). The default policy stays `safeRunPolicy()`
200
+ // (fail-closed secret mode) — only `selfHeal.mode` is threaded from
201
+ // the flag; a `--secret-mode` override is a later slice's concern.
202
+ const result = await withSiteGate(resolveDbPath(deps), (siteGate) => runJourneyProgrammatically({
203
+ ...(siteGate === undefined ? {} : { siteGate }),
204
+ dir: resolveJourneysDir(deps, dir),
205
+ id,
206
+ params: param,
207
+ policy,
208
+ selfHealer,
209
+ browserPortFactory: deps.explore?.browserPortFactory,
210
+ ...(browser === undefined ? {} : { browser }),
211
+ ...(journeyRunEmulation === undefined ? {} : { emulation: journeyRunEmulation }),
212
+ ...(screenshots === undefined ? {} : { screenshots }),
213
+ ...(storageState !== undefined ? { storageState } : {}),
214
+ ...(environment === undefined ? {} : { environment }),
215
+ // #140: fixture HTTP steps may only reach the journey's own site (authenticated from --storage-state);
216
+ // #247: under an environment, its allowed origins.
217
+ fixtures: (site) => {
218
+ const fx = buildMissionFixtures(fixtureFlags, {
219
+ allowlist: environment === undefined ? [site] : environment.allowedOrigins,
220
+ baseUrl: site,
221
+ ...(storageState !== undefined ? { storageState } : {}),
222
+ ...(environment?.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
223
+ });
224
+ checkSetupRefs({ "--param": Object.values(param) }, fx);
225
+ return fx;
226
+ },
227
+ })).then((r) => withEngine(healUsage === undefined ? r : { ...r, usage: healUsage.snapshot() }));
228
+ // #246 (informational, never failing): how many steps say why — `journey annotate` drafts the rest.
229
+ const intent = await journeyIntentCoverage(resolveJourneysDir(deps, dir), id);
230
+ if (intent !== undefined && intent.withoutObjective > 0 && !json) {
231
+ program.configureOutput().writeErr?.(`note: ${intent.withoutObjective} of ${intent.steps} step(s) have no objective — draft them with \`jevitate journey annotate ${id}\`\n`);
232
+ }
233
+ const envelope = ok(intent === undefined ? result : { ...result, intent });
234
+ if (json) {
235
+ emitJson(program, envelope);
236
+ // "ok" and "healed" (a recovered run) are both successes; only
237
+ // "quarantined" is a non-zero exit.
238
+ if (result.outcome === "quarantined")
239
+ process.exitCode = 1;
240
+ }
241
+ else {
242
+ writeRawResult(program, envelope.data);
243
+ process.exitCode = result.outcome === "quarantined" ? 1 : 0;
244
+ }
245
+ }
246
+ catch (err) {
247
+ if (err instanceof SiteGateRefusedError || isEnvironmentError(err)) {
248
+ emitJson(program, fail(err.code, err.message));
249
+ }
250
+ else if (err instanceof UnknownJourneyError) {
251
+ emitJson(program, fail("E_UNKNOWN_JOURNEY", String(err.message)));
252
+ }
253
+ else if (err instanceof JourneyRequiresAuthError) {
254
+ emitJson(program, fail("E_JOURNEY_REQUIRES_AUTH", String(err.message)));
255
+ }
256
+ else if (err instanceof FixtureSetupError) {
257
+ // Never run on unknown state: inconclusive, a configuration error (exit 2).
258
+ emitJson(program, ok(withEngine({ outcome: "inconclusive", reason: err.message, failure: { kind: "configuration", message: err.message }, attribution: "configuration" })));
259
+ process.exitCode = 2;
260
+ }
261
+ else if (err instanceof FixtureSpecError || err instanceof UnboundSetupRefError) {
262
+ emitJson(program, fail(err.code, err.message));
263
+ }
264
+ else if (err instanceof ParamValidationError) {
265
+ emitJson(program, fail("E_INVALID_PARAMS", String(err.message)));
266
+ }
267
+ else {
268
+ emitJson(program, fail("E_JOURNEY_RUN", String(err)));
269
+ }
270
+ }
271
+ });
272
+ // #124 — promote a local Journey so it becomes discoverable/runnable (journey
273
+ // find / MCP find_capabilities / run_journey), mirroring `mission target
274
+ // promote`'s human-approval-gate semantics: promoting is a deliberate,
275
+ // explicit act, never automatic (an authored Journey's `metadata.promoted`
276
+ // always starts `false` — see `explore-author-journey`/`jevitate record`).
277
+ journey
278
+ .command("promote <id>")
279
+ .description("promote a local Journey (human-approval gate) so it becomes discoverable/runnable")
280
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
281
+ .option("--json", "emit a JSON envelope")
282
+ .action(async function (id) {
283
+ const { dir, json } = this.opts();
284
+ try {
285
+ const journeyResult = await promoteJourney(resolveJourneysDir(deps, dir), id);
286
+ const envelope = ok(journeyResult.metadata);
287
+ if (json) {
288
+ emitJson(program, envelope);
289
+ }
290
+ else {
291
+ program.configureOutput().writeOut?.(`promoted journey '${journeyResult.metadata.id}'\n`);
292
+ process.exitCode = 0;
293
+ }
294
+ }
295
+ catch (err) {
296
+ if (err instanceof UnknownJourneyError) {
297
+ emitJson(program, fail("E_UNKNOWN_JOURNEY", String(err.message)));
298
+ }
299
+ else {
300
+ emitJson(program, fail("E_JOURNEY_PROMOTE", String(err instanceof Error ? err.message : err)));
301
+ }
302
+ }
303
+ });
304
+ // #246 — draft a Journey's intent on playback; `--approve` is the human gate that writes it.
305
+ registerJourneyAnnotateCommand(journey, program, deps);
306
+ // #248 — replay a Journey as a narrated demo: video + subtitles and/or a step-by-step guide.
307
+ registerJourneyDemoCommand(journey, program, deps);
308
+ // #19 — publish a promoted local Journey to a registered distributed source.
309
+ // Preserves every publish-side guard in `@jevitate/sources` (promoted-only,
310
+ // secret-references-only, declared-origin coverage); writes onto a NEW
311
+ // `publish/<id>` branch and degrades gracefully when `gh` is absent.
312
+ journey
313
+ .command("publish <id>")
314
+ .requiredOption("--to <source>", "registered source name to publish into")
315
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
316
+ .option("--declare-origin <origin>", "origin this Journey is authorized for (repeatable; default: derived from navigate steps)", (v, prev) => [...prev, v], [])
317
+ .option("--as <id>", "publish under a different id than the local one")
318
+ .option("--json", "emit a JSON envelope")
319
+ .action(async function (id) {
320
+ const { to, dir, declareOrigin, as: asId, json } = this.opts();
321
+ try {
322
+ const apiDeps = resolveSourceApiDeps(deps);
323
+ const gh = deps.sources?.gh ?? realGhPort;
324
+ const result = await publishJourneyToSource({ ...apiDeps, gh }, {
325
+ journeysDir: resolveJourneysDir(deps, dir),
326
+ id,
327
+ toSource: to,
328
+ declareOrigins: declareOrigin,
329
+ asId,
330
+ });
331
+ const envelope = ok(result);
332
+ if (json) {
333
+ emitJson(program, envelope);
334
+ }
335
+ else {
336
+ const out = program.configureOutput().writeOut;
337
+ out?.(`published '${id}' to '${to}' on branch ${result.branch}\n`);
338
+ if (result.prUrl)
339
+ out?.(`PR: ${result.prUrl}\n`);
340
+ else if (result.instructions)
341
+ out?.(`${result.instructions}\n`);
342
+ process.exitCode = 0;
343
+ }
344
+ }
345
+ catch (err) {
346
+ if (err instanceof UnknownSourceError) {
347
+ emitJson(program, fail("E_JOURNEY_PUBLISH_UNKNOWN_SOURCE", err.message));
348
+ }
349
+ else if (err instanceof UnknownJourneyError) {
350
+ emitJson(program, fail("E_JOURNEY_PUBLISH_UNKNOWN_JOURNEY", err.message));
351
+ }
352
+ else if (err instanceof NotPromotedError) {
353
+ emitJson(program, fail("E_JOURNEY_PUBLISH_NOT_PROMOTED", err.message));
354
+ }
355
+ else if (err instanceof NoDeclaredOriginsError) {
356
+ emitJson(program, fail("E_JOURNEY_PUBLISH_NO_ORIGINS", err.message));
357
+ }
358
+ else if (err instanceof EmbeddedSecretError) {
359
+ emitJson(program, fail("E_JOURNEY_PUBLISH_SECRET", err.message));
360
+ }
361
+ else if (err instanceof UndeclaredOriginError) {
362
+ emitJson(program, fail("E_JOURNEY_PUBLISH_ORIGIN", err.message));
363
+ }
364
+ else {
365
+ emitJson(program, fail("E_JOURNEY_PUBLISH", String(err instanceof Error ? err.message : err)));
366
+ }
367
+ }
368
+ });
369
+ }
370
+ //# sourceMappingURL=journey-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-cli.js","sourceRoot":"","sources":["../src/journey-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { type AnnotationDraft, type Journey } from "@jevitate/journey";
2
+ import { type CaptureLayer } from "./demo-capture.js";
3
+ import { type RunJourneyProgrammaticallyOptions } from "./journey-api.js";
4
+ /**
5
+ * #248 — `jevitate journey demo <id>`: replay a Journey as a narrated demo. The overlay (#245) shows
6
+ * the Journey's goal as a title card, each step's objective as the caption (else its label, else a
7
+ * value-free description) with its target highlighted and a `pace` pause, then an outcome card. The
8
+ * outputs are made from the SAME replay: a video (Playwright recordVideo, WebM) with WebVTT subtitles
9
+ * timed to the captions, and a Markdown guide (goal, preconditions, per step its objective, expected
10
+ * result and a screenshot with the overlay hidden).
11
+ *
12
+ * The replay is `runJourneyProgrammatically` — the same fail-closed policy (paid/destructive steps
13
+ * refused), site policy, fixtures and environment (#247) as `journey run`; a demo never heals. A
14
+ * Journey that no longer replays is STALE: nothing is written and the command exits non-zero, so a
15
+ * CI job regenerating demos catches it. Every caption, cue and guide line is redacted with the run's
16
+ * secret parameters, and the written text is proven secret-free before it lands; the secret
17
+ * parameters are also masked in PIXELS — video and screenshots — by the display-only mask layer
18
+ * (#250/#251, `demo-capture.ts`), proven at every screenshot.
19
+ */
20
+ /** How long each caption is shown before its step acts (`--pace`, ms). */
21
+ export declare const DEMO_DEFAULT_PACE_MS = 1500;
22
+ /** `--pace` bounds (ms). */
23
+ export declare const DEMO_MAX_PACE_MS = 60000;
24
+ /** A demo's inputs were unusable (an output path of the wrong kind): nothing ran. */
25
+ export declare class DemoArgsError extends Error {
26
+ readonly code = "E_JOURNEY_DEMO_ARGS";
27
+ }
28
+ /** The replay completed but a promised output could not be produced (no video file, a missing screenshot). */
29
+ export declare class DemoOutputError extends Error {
30
+ readonly code = "E_JOURNEY_DEMO_OUTPUT";
31
+ }
32
+ export interface DemoJourneyOptions extends Omit<RunJourneyProgrammaticallyOptions, "interpreter" | "policy" | "selfHealer"> {
33
+ /** The video to write (`.webm`); its subtitles go beside it as `.vtt`. Absent: no video. */
34
+ video?: string;
35
+ /** The Markdown guide to write (`.md`); screenshots go in `<name>.assets/` beside it. Absent: no guide. */
36
+ guide?: string;
37
+ /** Caption time per step before it acts (ms). Default {@link DEMO_DEFAULT_PACE_MS}. */
38
+ paceMs?: number;
39
+ /** Extra screenshot layers (e.g. pixel masking, #250/#251); the overlay is always hidden. */
40
+ captureLayers?: readonly CaptureLayer[];
41
+ /**
42
+ * #249: a reviewed-but-unapproved annotation draft (#246) whose goal / criteria / objectives /
43
+ * expected results narrate this demo. Applied in memory only — the stored Journey is untouched.
44
+ */
45
+ annotations?: AnnotationDraft;
46
+ /** #249: an unapproved demo — a `DRAFT` watermark on the overlay, and every output marked DRAFT. */
47
+ draft?: boolean;
48
+ }
49
+ /** #249: the mark every output of an unapproved demo carries. */
50
+ export declare const DEMO_DRAFT_MARK = "DRAFT";
51
+ export interface DemoStep {
52
+ /** 1-based. */
53
+ readonly number: number;
54
+ /** What the overlay and the subtitle said (redacted). */
55
+ readonly caption: string;
56
+ readonly expectedResult?: string;
57
+ /** The subtitle cue, ms from the start of the video. */
58
+ readonly cue: {
59
+ readonly startMs: number;
60
+ readonly endMs: number;
61
+ };
62
+ /** The step's screenshot in the guide's assets folder (a guide was asked for). */
63
+ readonly screenshot?: string;
64
+ }
65
+ export interface DemoJourneyResult {
66
+ readonly id: string;
67
+ /** `stale`: the Journey no longer replays — nothing was written. */
68
+ readonly outcome: "ok" | "stale";
69
+ /** Why a stale demo stopped (redacted). */
70
+ readonly reason?: string;
71
+ /** The 1-based step a stale demo stopped at, when known. */
72
+ readonly stoppedAtStep?: number;
73
+ readonly totalSteps: number;
74
+ /** The steps the replay reached, in order. */
75
+ readonly steps: DemoStep[];
76
+ readonly video?: string;
77
+ readonly subtitles?: string;
78
+ readonly guide?: string;
79
+ /** #251 `--screenshots`: the replay's masked screenshots and their `index.md`. */
80
+ readonly screenshotPaths?: string[];
81
+ readonly screenshotIndex?: string;
82
+ readonly screenshotsSkipped?: Array<{
83
+ readonly step: number;
84
+ readonly reason: string;
85
+ }>;
86
+ }
87
+ /** A WebVTT timestamp: `HH:MM:SS.mmm`. */
88
+ export declare function vttTime(ms: number): string;
89
+ /**
90
+ * The WebVTT subtitles: one cue per step (`step-N`), in order; the goal as a leading NOTE. A draft
91
+ * (#249) says so in a NOTE and at the start of every cue.
92
+ */
93
+ export declare function demoSubtitles(title: string, steps: readonly DemoStep[], draft?: boolean): string;
94
+ /**
95
+ * The Markdown guide (all text already redacted); `assets` is the screenshots folder's name. A draft
96
+ * (#249) carries `DRAFT` in its title and a watermark line under it.
97
+ */
98
+ export declare function demoGuide(journey: Journey, title: string, steps: readonly DemoStep[], assets: string, redact: (s: string) => string, draft?: boolean): string;
99
+ /** The title card is on screen at least this long (ms), whatever `--pace` is. */
100
+ export declare const TITLE_CARD_MIN_MS = 1200;
101
+ /** How long the title card waits for the recorder's first frame (ms) before going on regardless. */
102
+ export declare const FIRST_FRAME_WAIT_MS = 5000;
103
+ /** `<dir>/<name>.assets` for `<dir>/<name>.md`. */
104
+ export declare function guideAssetsDir(guide: string): string;
105
+ /** `<video without .webm>.vtt`. */
106
+ export declare function subtitlesPathFor(video: string): string;
107
+ /**
108
+ * Replays the Journey as a narrated demo and writes the asked-for outputs (see the module comment).
109
+ * Throws `UnknownJourneyError` / `DemoArgsError` before any browser opens, and every refusal
110
+ * `runJourneyProgrammatically` has; returns `outcome: "stale"` (writing nothing) when the replay stops.
111
+ */
112
+ export declare function demoJourney(opts: DemoJourneyOptions): Promise<DemoJourneyResult>;