@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,89 @@
1
+ ---
2
+ name: jevitate-getting-started
3
+ description: Start here for any jevitate task, or when unsure which jevitate skill applies — checks setup (keys, .jevitate/, MCP), gets a first useful result against the user's app URL, routes to the right skill (explore, run-journey, record, demo, verify-fix, ci-check, ux-review, load-test, sources, mission-scope, test-campaign), and says when to use the jevitate MCP tools vs the CLI, what the exit codes mean, and which approvals only a human may give.
4
+ ---
5
+
6
+ Jevitate tests a web app in a real browser and returns evidence: typed outcomes, exit codes,
7
+ Recordings, replayable Journeys, videos and screenshots. You never drive the browser yourself.
8
+ You pick the command, pass it the user's intent, and report what came back honestly.
9
+
10
+ ## 1. Check the setup (once per session)
11
+
12
+ - `jevitate ai status --json` shows which AI features have their keys, by name only, never a value.
13
+ Goal runs, authoring, demos and UX reviews need `generation` and `judgment` (`--real`). Without
14
+ them, use a key-free command (see step 2), or ask the human to run `jevitate ai setup generation`
15
+ and `jevitate ai setup judgment` themselves. Setup is interactive. Never ask for a key in chat.
16
+ - The repo has a `.jevitate/` directory (Journeys, regressions, baselines, logs and
17
+ `environments.json`). If it's missing, the human runs `jevitate init` (it also installs these
18
+ skills and registers the MCP server). `jevitate init --dry-run` changes nothing.
19
+ - The app must be running and the human must have authorized its URL. Jevitate only acts on an
20
+ authorized origin (`--url`'s own origin, or an explicit `--allow` list). It refuses a production
21
+ target for authoring runs and demos. Never widen the allowlist on your own.
22
+
23
+ ## 2. A first useful result
24
+
25
+ | The user has | Run |
26
+ | --- | --- |
27
+ | keys, and a task a user does | `jevitate explore --url <app-url> --goal "<task>" --success "urlIncludes:/<done-path>" --real --json` |
28
+ | keys, and a question about the app | `jevitate explore --url <app-url> --goal "find out <question>; report the answer" --real --json` (read-only by default) |
29
+ | no keys | `jevitate explore --strategy adversarial --url <app-url> --fake-ai --json`: misuse is planned in code, and the findings (HTTP 5xx, uncaught errors, hangs, invariant violations) come from hard signals, not a model |
30
+ | no keys, one feature | `jevitate explore --feature <name> --route "/<area>/**" --url <app-url> --json` (model-free) |
31
+
32
+ Then pick the matching skill:
33
+
34
+ | The user wants to | Skill |
35
+ | --- | --- |
36
+ | explore, find bugs, or check that a goal is reachable | `jevitate-explore` |
37
+ | know what to test after a diff or PR | `jevitate-mission-scope` |
38
+ | replay a known flow (a saved Journey) | `jevitate-run-journey` |
39
+ | record a flow they click through | `jevitate-record` |
40
+ | get a narrated demo video or a step-by-step guide | `jevitate-demo` |
41
+ | reproduce a finding, prove a fix, attach evidence to a PR, or lock a bug in as a regression | `jevitate-verify-fix` |
42
+ | gate CI (JUnit, SARIF, baselines, a defect report) | `jevitate-ci-check` |
43
+ | get a usability critique | `jevitate-ux-review` |
44
+ | run a load test | `jevitate-load-test` |
45
+ | share or run third-party Journeys | `jevitate-sources` |
46
+ | test a whole release end to end (many user jobs, a QA sweep) | `jevitate-test-campaign` |
47
+
48
+ ## 3. MCP tools or the CLI
49
+
50
+ - If the jevitate MCP tools are in your tool list (`init` registers `jevitate mcp` for Claude
51
+ Code, Cursor and Codex), use them. They take typed arguments named after the CLI flags
52
+ (`--storage-state` becomes `storageState`), run the same command in process, and return
53
+ `{exitCode, data}`. Exit 2 (proved nothing) and every refusal come back as MCP errors
54
+ (`invalid_args` or `refused`, with the `E_…` code), never as a pass.
55
+ - Otherwise use the CLI with `--json`: one line on stdout, `{v, ok, data}` or
56
+ `{v, ok: false, error: {code, message}}`. Read the exit code as well.
57
+ - Common pairs: `run_exploration` = `explore`, `queue_exploration` + `run_queued_missions` +
58
+ `get_mission_result` = `mission queue` + `mission run` + `mission result`,
59
+ `find_capabilities`/`run_journey` = `journey find`/`journey run`, `author_journey` =
60
+ `explore-author-journey`, `create_demo`/`demo_journey` = `demo`/`journey demo`, `verify_fix` =
61
+ `verify-fix`, `regressions` = `regression capture|run`, `ledger` = `ledger …`, `run_check` =
62
+ `check`, `get_report` = `report`, `ux_review` = `ux`. The full table is in the jevitate repo's
63
+ `docs/agents.md`.
64
+ - These are never available over MCP: `record` (a person clicks), `init`, `ai setup` (secret entry),
65
+ `ui`, `source trust` and `source add --accept-tou`. Operator settings are never tool arguments
66
+ either: shell hooks, browser binaries, which environment variable a secret comes from, and
67
+ log-command sources. Tell the human the CLI command instead.
68
+ - Raw browser tools (click, fill, evaluate, get DOM or cookies) don't exist on purpose. Never
69
+ swap in another browser-automation tool to get around a refusal.
70
+
71
+ ## 4. Decisions that belong to the human
72
+
73
+ Only do these when the human has asked for that specific action in this conversation. Before
74
+ you do, show them what they are approving:
75
+
76
+ - promoting a Journey: `jevitate journey promote <id>` / `promote_journey`
77
+ - applying drafted annotations: `jevitate journey annotate <id> --approve` / `annotate_journey` with `approve: true`
78
+ - approving a demo, which promotes its Journey: `jevitate demo approve <id>` / `approve_demo`
79
+ - promoting a mission target: `jevitate mission target promote <id>`
80
+ - trusting a third-party Journey or accepting a source's Terms of Use (CLI only)
81
+ - approving or cancelling an inbox item: only in `jevitate ui`. The MCP tools `approve_action` and `cancel_command` always refuse.
82
+
83
+ ## 5. Exit codes (every command)
84
+
85
+ `0` clean / passed / fixed · `1` defects found, a gating finding, or still reproduces · `2`
86
+ inconclusive: the run proved nothing, so never report it as a pass · `3` the app hung (reproduced) ·
87
+ `4` intermittent · `64` usage error, nothing ran (bad flag, unknown id, missing keys
88
+ `E_AI_SETUP_REQUIRED`, target not allowed) · `130`/`143` interrupted, but the partial result was
89
+ written. Report the outcome the tool gave you. Never round it up.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-load-test
3
- description: Runs a seeded, human-paced concurrent load test of a promoted Journey via `jevitate load run`, against an explicitly authorized target only. Use when a user wants a capacity/throughput measurement, not a single functional run.
3
+ description: Run a seeded, human-paced concurrent load test of a promoted jevitate Journey (`jevitate load run`, MCP `run_load_test`) against an origin the human explicitly authorized, optionally on a named environment (`--env`). Use when the user wants capacity, throughput or latency numbers. For a single functional run, use jevitate-run-journey.
4
4
  ---
5
5
 
6
6
  You scope and run a throughput/capacity measurement, never a single functional
@@ -19,12 +19,21 @@ check (use `jevitate-run-journey` for that instead).
19
19
 
20
20
  - `jevitate load run <journeyId> --authorized-origin <origin> [--authorized-origin
21
21
  <origin2> ...] --param k=v --concurrency <n> --iterations <n> --seed <n>
22
- --json`.
22
+ [--storage-state <file>] --json`.
23
23
  - `<journeyId>` must be a promoted Journey id (same discovery flow as
24
24
  `jevitate-run-journey`: `jevitate journey find`/`find_capabilities` first).
25
+ - `--env <name>` / `--base-url <origin>` runs it against a named environment
26
+ (`.jevitate/environments.json`) instead of the recorded site; the
27
+ `--authorized-origin` must still name that origin explicitly.
28
+ - MCP: `run_load_test` takes the same arguments (`authorizedOrigin`,
29
+ `concurrency`, `iterations`, `seed`, …).
25
30
  - `--seed` makes the run reproducible — if the human wants to compare two
26
31
  configurations, keep the seed fixed and vary only `--concurrency`/
27
32
  `--iterations`.
33
+ - `--storage-state <file>` seeds EVERY pool member's session from the same
34
+ Playwright storageState file (the same authenticated pre-step as `jevitate
35
+ journey run` — see `jevitate-run-journey`), for load-testing a Journey that
36
+ needs an authenticated session.
28
37
 
29
38
  ## Reading the result
30
39
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-mission-scope
3
- description: Reads a diff, pull request, changelog, or user story and scopes change-driven testing — identifies at-risk routes/features, maps them to existing promoted Journeys, runs the most relevant ones, and recommends which newly-discovered repros to promote. Use when a user wants to know "what should I test" after a code change, rather than testing everything or picking targets blindly.
3
+ description: Turn a diff, pull request, changelog or user story into targeted jevitate testing. Finds at-risk routes and features, maps them to promoted Journeys (`journey find` / `find_capabilities`) and runs those, scopes bounded missions where nothing covers a gap (including queued missions on promoted targets), and recommends which new repros to promote or capture as regressions. Use when the user asks "what should I test?" after a code change, or wants a change-scoped check.
4
4
  ---
5
5
 
6
6
  You scope testing to what actually changed. You never drive a browser yourself —
@@ -54,6 +54,8 @@ tool to scope a **bounded** mission at the specific at-risk area:
54
54
  --url <authorized-url>` (bounded misuse + a trusted hard-signal defect oracle).
55
55
  - For state coverage of the changed area: `jevitate explore --strategy coverage
56
56
  --url <authorized-url>`.
57
+ - In CI, the same scoping is `jevitate check --suite <file> --changed-routes '<glob>'`: only the
58
+ Journeys and goals touching those routes run (see `jevitate-ci-check`).
57
59
  - Only if you cannot reach an authorized target at all (or `jevitate explore`
58
60
  is genuinely absent from your environment) do you stop and report the gap —
59
61
  never fall back to a generic browser-automation tool; that would bypass every
@@ -86,22 +88,28 @@ quantity.
86
88
 
87
89
  `queue_exploration` runs against a PROMOTED mission target, never a raw URL.
88
90
  When you want to queue a scoped mission at an at-risk area via MCP:
89
- - `jevitate mission target add <id> --url <authorized-url> [--goal ...] [--route
90
- <glob> ...] --json` registers the target (unpromoted).
91
+ - `jevitate mission target add <id> --name <name> --authorized-origin
92
+ <authorized-origin> --base-url <url> [--description <text>] --json`
93
+ registers the target (unpromoted). Note the target's own registration takes
94
+ NO `--goal`/`--route` — those are `queue_exploration` call arguments
95
+ (`target`, `goal`, `feature`, `route`, ...), supplied per-enqueue, not baked
96
+ into the target itself.
91
97
  - `jevitate mission target list --json` shows registered targets and their
92
98
  promoted/unpromoted state.
93
99
  - `jevitate mission target promote <id> --json` promotes it — a human-gated act,
94
- same as Journey promotion. Only a promoted target is enqueueable.
100
+ same as Journey promotion (`jevitate journey promote <id>`). Only a promoted
101
+ target is enqueueable.
95
102
 
96
103
  Then `queue_exploration({ target: "<id>", ... })` (via the `jevitate mcp`
97
104
  server, registered with `jevitate mcp --print-config ...` or `jevitate init`)
98
105
  enqueues a bounded mission and returns a `missionId`.
99
106
 
100
- ## Known gaps
107
+ An app whose API lives on another origin declares it on the target:
108
+ `--authorized-origin <app-origin> --api-origin <api-origin>` (repeatable; each a
109
+ bare http(s) origin). A queued mission can reach only those origins.
101
110
 
102
- - The MCP inbox/command-queue tools (`queue_retrieval`, `queue_action`,
103
- `get_command`, `list_incoming`, `get_thread`, `approve_action`,
104
- `cancel_command`, `get_site_health`) are registered on the `jevitate mcp`
105
- server but return a typed `not_implemented` error today — the wired tools are
106
- `find_capabilities`, `run_journey`, `queue_exploration`, and
107
- `ai_generate_text`. Scoping and running work fully through those four.
111
+ Queued missions run when the queue is drained: `run_queued_missions` over MCP (it drains once),
112
+ or `jevitate mission run --once --real --json` (`--watch` keeps draining).
113
+ `get_mission_result({ id: missionId })` reports `queued`/`running` (`pending: true`), the typed
114
+ result once done, or `failed`. `queue_exploration` only enqueues — treat the returned `missionId`
115
+ as "accepted," not "finished," until the result says otherwise.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-record
3
- description: Capture a demonstrated browser flow into a Recording (`jevitate record --url`) and post-process it — diff multiple takes, review/classify fill steps (postdoc), fit a timing policy, promote a value to a variable — via the jevitate CLI. Use to record human-demonstrated takes and turn them into a parameterized, replayable artifact.
3
+ description: Record a flow the human clicks through (`jevitate record --url`, CLI only, headed), then post-process the takes: diff them, classify values as constants, variables or hand-backs (postdoc), fit a timing policy, and promote a value to a variable (`jevitate recording ...`, MCP `recordings`). Use when the user wants to demonstrate a flow themselves. If they want jevitate to find and save the flow for them, use `explore-author-journey` (jevitate-explore).
4
4
  ---
5
5
 
6
6
  You drive Jevitate's human-driven authoring mode (RxD): capturing a take from a
@@ -13,16 +13,27 @@ headed browser demonstration a human performs — you launch it and they drive.
13
13
  - `jevitate record --url <authorized-url> [--intent "<framing>"] [--retro
14
14
  "<note>"] [--allow <origin>] [--out <dir>] --json` opens a headed browser at
15
15
  an authorized origin and records the human's demonstrated flow into a
16
- `Recording` JSON file (default `~/.jevitate/recordings`). The session is
16
+ `Recording` JSON file (default `.jevitate/logs/<date>/` in the repo, else
17
+ `~/.jevitate/logs/<date>/`). The session is
17
18
  headed by design — a record session IS a live human demonstration; add
18
19
  `--headless` only when a caller explicitly asks. The target must be
19
- authorized (defaults to `--url`'s own origin; widen only with explicit
20
- `--allow`), and an unauthorized target is refused
21
- (`E_UNAUTHORIZED_EXPLORE_TARGET`).
20
+ authorized (`--allow` REPLACES the default allowlist when given at all —
21
+ it defaults to `--url`'s own origin only when `--allow` is omitted
22
+ entirely; include that origin explicitly in `--allow` if you still need
23
+ it), and an unauthorized target is refused (`E_UNAUTHORIZED_EXPLORE_TARGET`).
24
+ - **Ending a take**: press Enter on stdin, or send SIGINT (Ctrl-C) — both end
25
+ the take the SAME way (the demonstrated steps are stopped and written to
26
+ disk). This matters most for `--headless`, where there is no visible
27
+ window to interact with: Ctrl-C is the way to end a headless take, and it
28
+ saves the take rather than killing the process and losing it.
22
29
  - The emitted `recordingPath` is the take you then feed into the diff/postdoc
23
30
  flow below. Capture two or more takes of the same flow (varying the data each
24
31
  time) when you want `diff` to classify which values are variables.
25
32
 
33
+ - `record` is never an MCP tool (a person does the clicking). As an agent, give the human the
34
+ command to run, and wait for the `recordingPath` it prints. `diff`/`fit`/`postdoc`/`promote`
35
+ are available over MCP as the `recordings` tool (`action`).
36
+
26
37
  ## Diff multiple takes
27
38
 
28
39
  - `jevitate recording diff <takeA.json> <takeB.json> [more.json...] --json` —
@@ -30,6 +41,13 @@ headed browser demonstration a human performs — you launch it and they drive.
30
41
  (constant vs. likely-variable) with a confidence score. Read the confidences;
31
42
  do not treat a low-confidence classification as settled — surface it to the
32
43
  human via `postdoc` instead of deciding for them.
44
+ - **Input shape**: `diff`/`postdoc` accept ONLY a `jevitate record`-produced
45
+ take file — `{ "recording": <Recording>, "values": {...} }`. A raw
46
+ `Recording` (what `explore`, `explore-author-journey`, or a usability run
47
+ write directly — `{version, site, pages, ...}` with no `recording`/`values`
48
+ wrapper) is refused with a clear `E_INVALID_TAKE` message naming the
49
+ mismatch, not a zod dump. Wrap a raw Recording as `{ "recording": <it>,
50
+ "values": {} }` first if you need to diff/postdoc one.
33
51
 
34
52
  ## Review and classify (postdoc)
35
53
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-run-journey
3
- description: Find and run a promoted Jevitate Journey by id, with typed params, via the jevitate CLI or the find_capabilities/run_journey MCP tools. Use when a user wants to execute a known, already-recorded browser automation (a login, a checkout, a form submission) rather than explore or record a new one.
3
+ description: Find and replay a promoted jevitate Journey (a saved, deterministic browser flow such as a login, checkout or form submission) by id with typed params, on any named environment (`--env`/`--base-url`), optionally with video and screenshots and self-heal. Runs via `jevitate journey find|run` or MCP `find_capabilities`/`run_journey`. Also covers promoting (human-only). Use when a known flow should be re-run or regression-checked, not explored or recorded fresh.
4
4
  ---
5
5
 
6
6
  You drive already-published, promoted Jevitate Journeys. You never write or invent
@@ -25,13 +25,43 @@ artifact; your job is to find the right one and run it with the right params.
25
25
  Every param the `find`/`find_capabilities` result listed under `params` is
26
26
  required; passing an unknown param key is a refusal (`E_INVALID_PARAMS`), not
27
27
  a silent ignore. An unknown id is `E_UNKNOWN_JOURNEY`.
28
- - MCP: `run_journey(id, params)` — same param-schema validation, same refusal on
29
- an unknown id or params. It NEVER accepts inline steps or a raw recording —
30
- a published id only.
28
+ - MCP: `run_journey({ id, params, storageState? })` — same param-schema
29
+ validation, same refusal on an unknown id or params. It NEVER accepts inline
30
+ steps or a raw recording — a published id only.
31
31
  - Read the JSON envelope's `outcome` field. `"ok"` and `"healed"` (a run that
32
- recovered via self-heal) are both successes; `"quarantined"` (and any other
33
- value, including a secret-handback pause) means it did not complete — report
34
- that honestly, do not summarize a non-success outcome as success.
32
+ recovered via self-heal) are both successes (exit 0); `"quarantined"` (exit 1)
33
+ and any other value, including a secret-handback pause, mean it did not
34
+ complete — report that honestly, with the step it stopped at. Exit 64 is a
35
+ refusal before anything ran (unknown id, bad params, a step off the allowlist).
36
+
37
+ ## Where it runs (`--env`) and what it records
38
+
39
+ - `--env <name>` replays on a named environment from the repo's
40
+ `.jevitate/environments.json` (its `baseUrl` plus `allow`); `--base-url <origin>`
41
+ is an ad-hoc one (e.g. a preview deploy). Without either, the Journey runs on
42
+ the site it was recorded on. A step on an origin the environment doesn't allow
43
+ is refused (64) before any browser opens. MCP: `run_journey`'s `env`/`baseUrl`.
44
+ - Evidence: `--record-video` (listed as `videoPaths`), `--screenshots
45
+ [screens|steps]` (`screenshotPaths` + an `index.md`), `--headed`/`--slow-mo <ms>`
46
+ to watch it. `--viewport 375x812` / `--device "iPhone 13"` for mobile.
47
+ - For a narrated demo video or a step-by-step guide of a Journey, use
48
+ `jevitate-demo` (`journey demo`, `journey annotate`).
49
+
50
+ ## Authenticated Journeys (#118)
51
+
52
+ - A Journey authored behind a login needs a deterministic authenticated
53
+ pre-step to replay: `--storage-state <file>` (a Playwright storageState JSON
54
+ path — cookies + origin storage) on `jevitate journey run`, `jevitate load
55
+ run`, and `jevitate source run`; over MCP, `run_journey`'s optional
56
+ `storageState` argument is the SAME thing — a file PATH on the machine
57
+ running the MCP server, never raw cookie/session content in the call itself.
58
+ The file's contents are read only by the browser session; never logged,
59
+ never echoed back.
60
+ - A Journey CAN declare `metadata.requiresAuth: true` if it only reaches its
61
+ steps from an authenticated session. A run given no `storageState` then
62
+ fails fast — before any browser opens — with `E_JOURNEY_REQUIRES_AUTH`
63
+ naming the actual problem, instead of a confusing deep
64
+ `replay-target-not-found` partway through the steps.
35
65
 
36
66
  ## Self-heal (optional, additive)
37
67
 
@@ -54,19 +84,33 @@ artifact; your job is to find the right one and run it with the right params.
54
84
  result in this same session — a promoted id can be revoked; don't rely on a
55
85
  memorized id from an earlier conversation.
56
86
 
87
+ ## Promoting a Journey
88
+
89
+ - `jevitate journey promote <id> --json` promotes a local Journey — a
90
+ deliberate human-approval gate (mirrors `mission target promote`'s
91
+ semantics), never automatic — run it (or MCP `promote_journey`) only when
92
+ the human tells you to. Every authored/recorded Journey starts
93
+ `metadata.promoted: false` (`explore-author-journey`, `jevitate record` +
94
+ `recording postdoc`); only a promoted Journey is discoverable via `journey
95
+ find`/`find_capabilities` and runnable via `journey run`/`run_journey`.
96
+ There is still no "raw Recording -> promoted Journey in one step" command —
97
+ a Recording becomes a Journey first (through an authoring path, or the
98
+ `JourneyRegistry` API), then `journey promote <id>` promotes it.
99
+
100
+ ## Step intent (annotations)
101
+
102
+ - `journey run` reports `intent.withoutObjective` (steps with no stated objective). It is
103
+ informational and never a failure. Drafting and approving objectives is `journey annotate`
104
+ (see `jevitate-demo`); `--approve` is the human's call, like promote.
105
+
57
106
  ## Publishing to a distributed source
58
107
 
59
108
  - `jevitate journey publish <id> --to <source>` pushes a PROMOTED local Journey
60
109
  up to a registered distributed source (see `jevitate-sources`). It preserves
61
110
  every publish-side guard: promoted-only, secret-references-only, and
62
111
  declared-origin coverage; it writes onto a new `publish/<id>` branch and,
63
- when `gh` is present, opens a PR. It never publishes an unpromoted Journey.
64
-
65
- ## Known gaps
66
-
67
- - There is no single "raw Recording -> promoted Journey" command: a Recording
68
- becomes a Journey through the authoring paths (`jevitate
69
- explore-author-journey`, which writes an UNPROMOTED Journey a human still
70
- promotes) or the `JourneyRegistry` API, and promotion stays a deliberate
71
- human gate. If a user asks you to "promote this recording," recommend those
72
- paths rather than guessing at a promote command — do not invent one.
112
+ when `gh` is present, opens a PR. When `gh` is absent, or a PR can't be
113
+ opened (e.g. the remote isn't GitHub), the branch is still pushed and the
114
+ command still reports success (`pushed: true`, no PR) with instructions to
115
+ open one manually — pushing the branch is never reported as a failure. It
116
+ never publishes an unpromoted Journey.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jevitate-sources
3
- description: Manage Jevitate's distributed Journey sources — add/list/pull/update/remove git-backed sources, trust individual Journeys (content-hash-bound), run a trusted remote Journey through the run-gate, and publish a local promoted Journey up to a source — via `jevitate source ...` and `jevitate journey publish`. Use when sharing Journeys across repos or trusting/running a third-party Journey; use jevitate-run-journey for an already-local Journey.
3
+ description: Share Journeys across repos and teams with jevitate's git-backed sources. Covers add/list/pull/update/remove (`jevitate source ...`, MCP `sources`), human-only trust of a single Journey (content-hash-bound), running a trusted remote Journey through the run-gate (`source run`), and publishing a promoted local Journey (`journey publish`, MCP `publish_journey`). Use for third-party or shared Journeys. For a Journey already in this repo, use jevitate-run-journey.
4
4
  ---
5
5
 
6
6
  You add, trust, run, and publish federated Journeys across git-backed sources.
@@ -18,6 +18,41 @@ invokable surface, not a programmatic-only capability.
18
18
  "risky"`), and `trusted` (whether this project has acknowledged that exact
19
19
  content). Trust is LOCAL and per-user; it is bound to a content hash, so any
20
20
  change to a Journey's content invalidates its trust until re-approved.
21
+ - `riskClass` is engine-derived, not author-declared: a Journey is
22
+ `"read-only"` iff every step is a `navigate`/`waitFor`/`extract`/`assert`, or
23
+ a `click` whose target has ARIA role `link` (following a link reads a page,
24
+ it does not mutate anything), AND every absolute `navigate` stays within
25
+ `declaredOrigins`. Anything else — a non-link `click` (e.g. a button),
26
+ `fill`/`select`/`press`/`handback`, or a navigate that could leave
27
+ `declaredOrigins` — is conservatively `"risky"` and needs `source trust`
28
+ before it can run.
29
+
30
+ - Simpler, for Journeys your own team shares: mount a Journeys repo as a git submodule under
31
+ `.jevitate/journeys/<name>/`. Its Journeys appear as `<name>/<id>` in `journey list`/`find`/`run`,
32
+ `check` and the MCP tools, and the submodule pin is reviewed like code. Use sources (below) for
33
+ third-party Journeys that need Terms of Use and per-Journey trust.
34
+
35
+ ## The source manifest shape
36
+
37
+ A source repo (what `source add <name> <gitUrl>` clones) needs exactly this at
38
+ its root, or `source add`/`source update` refuse with `E_SOURCE_INVALID_MANIFEST`:
39
+
40
+ - `jevitate.json` — `{ "version": 1, "source": "<name>", "sites": [{ "origin":
41
+ "<https://...>", "automationPolicy": "allowed", "touBasis": "<free text>" }, ...] }`.
42
+ `sites` declares every origin this source's Journeys are authorized to touch
43
+ and the Terms-of-Use basis for each; `source add --accept-tou` acknowledges
44
+ ALL of them together.
45
+ - `journeys/*.journey.json` — one file per shared Journey: an ordinary
46
+ `Journey` (`{ metadata, recording }`, same shape `jevitate journey list`
47
+ reads) PLUS a top-level `declaredOrigins: string[]` (at least one absolute
48
+ URL) — the origins THIS Journey is authorized to touch, which must all
49
+ appear in the manifest's `sites`. `jevitate journey publish` writes this
50
+ file for you (deriving `declaredOrigins` from the Journey's absolute
51
+ `navigate` steps, or from `recording.site` when its navigates are relative —
52
+ e.g. an `explore-author-journey`-authored Journey — or from an explicit
53
+ `--declare-origin`); a hand-authored source repo must match this shape
54
+ exactly, `.strict()` — unknown/missing keys fail the whole load, one bad
55
+ file at a time (never a silent partial list).
21
56
 
22
57
  ## Add and manage sources
23
58
 
@@ -42,10 +77,12 @@ invokable surface, not a programmatic-only capability.
42
77
 
43
78
  ## Run a trusted remote Journey (through the run-gate)
44
79
 
45
- - `jevitate source run <name> <journeyId> --param k=v ... --json` runs a
46
- remote-source Journey THROUGH `@jevitate/sources`' `resolveForRun` gate. Every
47
- refusal is a typed error thrown BEFORE any browser launches, each with its own
48
- code so a caller knows WHY:
80
+ - `jevitate source run <name> <journeyId> --param k=v ... [--storage-state
81
+ <file>] --json` runs a remote-source Journey THROUGH `@jevitate/sources`'
82
+ `resolveForRun` gate. `--storage-state` is the same authenticated pre-step
83
+ as `jevitate journey run` (see `jevitate-run-journey`), for a source Journey
84
+ that needs one. Every refusal is a typed error thrown BEFORE any browser
85
+ launches, each with its own code so a caller knows WHY:
49
86
  - `E_SOURCE_RUN_HASH_MISMATCH` — the pinned content no longer matches what was
50
87
  trusted.
51
88
  - `E_SOURCE_RUN_UNTRUSTED` — a `risky` Journey that was never trusted.
@@ -63,10 +100,16 @@ invokable surface, not a programmatic-only capability.
63
100
  - `jevitate journey publish <id> --to <source> [--declare-origin <origin> ...]
64
101
  [--as <newId>] --json` pushes a PROMOTED local Journey up to a registered
65
102
  source. It preserves every publish-side guard (promoted-only,
66
- secret-references-only, declared-origin coverage), writes onto a new
67
- `publish/<id>` branch, and opens a PR when `gh` is present (degrading to
68
- printed instructions when it is not). It refuses an unpromoted Journey
69
- (`E_JOURNEY_PUBLISH_NOT_PROMOTED`) and an embedded secret
103
+ secret-references-only, declared-origin coverage — derived from the
104
+ Journey's absolute `navigate` steps, or from `recording.site` when they are
105
+ relative), writes onto a new `publish/<id>` branch, and opens a PR when `gh`
106
+ is present. The branch push is reported as `pushed: true` regardless of
107
+ whether a PR could be opened: when `gh` is absent, OR `gh` is present but
108
+ `gh pr create` fails (e.g. the remote isn't GitHub), the result still comes
109
+ back `ok: true` with `pushed: true` and no `prUrl`, plus printed
110
+ instructions to open the PR manually — the push already happened by that
111
+ point, so a PR failure is never reported as a publish failure. It refuses an
112
+ unpromoted Journey (`E_JOURNEY_PUBLISH_NOT_PROMOTED`) and an embedded secret
70
113
  (`E_JOURNEY_PUBLISH_SECRET`).
71
114
 
72
115
  ## What you must never do
@@ -80,9 +123,9 @@ invokable surface, not a programmatic-only capability.
80
123
  - Never widen a Journey's declared origins on publish beyond what the human
81
124
  authorized just to make coverage pass.
82
125
 
83
- ## Known gaps
126
+ ## MCP
84
127
 
85
- - There is no MCP-tool surface over federated sources yet — the
86
- `find_capabilities`/`run_journey` MCP tools operate over the LOCAL promoted
87
- store, not remote sources. Federated add/trust/run/publish are CLI-only today;
88
- drive the `jevitate source ...` commands directly.
128
+ - The `sources` tool takes `add`/`list`/`pull`/`update`/`remove`/`run` as its `action` (the same
129
+ gate and refusals as the CLI), and `publish_journey` mirrors `journey publish`. Accepting a
130
+ source's Terms of Use (`source add --accept-tou`) and `source trust` are CLI-only on purpose:
131
+ they are the human's consent, so tell the human the command instead of looking for a tool.