@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,76 @@
1
+ import { type AnnotationChange, type AnnotationDraft, type IntentCoverage, type Journey } from "@jevitate/journey";
2
+ import { type GenerationPort } from "@jevitate/ai-core";
3
+ import { type RunJourneyProgrammaticallyOptions } from "./journey-api.js";
4
+ export declare class AnnotationDraftNotFoundError extends Error {
5
+ readonly code = "E_JOURNEY_ANNOTATIONS_NOT_FOUND";
6
+ }
7
+ export declare class InvalidAnnotationDraftError extends Error {
8
+ readonly code = "E_INVALID_ANNOTATIONS_DRAFT";
9
+ }
10
+ /** The Journey changed after the draft was made — approving would annotate steps it never saw. */
11
+ export declare class StaleAnnotationDraftError extends Error {
12
+ readonly code = "E_JOURNEY_ANNOTATIONS_STALE";
13
+ }
14
+ /**
15
+ * Where a Journey's draft lives: `<journeys>/.drafts/<id>.annotations.json` (`<ns>/<id>` for a shared
16
+ * Journey). A dot-folder, so `journey list` and namespace discovery never read it as a Journey.
17
+ */
18
+ export declare function annotationDraftPath(journeysDir: string, id: string): string;
19
+ /** The Journey's content hash — what a draft is bound to. */
20
+ export declare function journeyContentHash(journey: Journey): string;
21
+ export interface AnnotateJourneyOptions extends Omit<RunJourneyProgrammaticallyOptions, "interpreter" | "policy" | "selfHealer"> {
22
+ /** The generation gateway that drafts the text (`--real` / `--fake-ai`). */
23
+ gen: GenerationPort;
24
+ /** Testing seam for the draft's timestamp. */
25
+ now?: () => string;
26
+ }
27
+ export interface AnnotateJourneyResult {
28
+ readonly id: string;
29
+ readonly draftPath: string;
30
+ readonly replay: AnnotationDraft["replay"];
31
+ readonly drafted: {
32
+ readonly objectives: number;
33
+ readonly expectedResults: number;
34
+ readonly goal: boolean;
35
+ readonly successCriteria: number;
36
+ };
37
+ /** What approving the draft would change (the same diff `--approve` shows). */
38
+ readonly proposed: AnnotationChange[];
39
+ readonly coverage: IntentCoverage;
40
+ /** #251 `--screenshots`: the replay's masked screenshots and their `index.md`. */
41
+ readonly screenshotPaths?: string[];
42
+ readonly screenshotIndex?: string;
43
+ readonly screenshotsSkipped?: Array<{
44
+ readonly step: number;
45
+ readonly reason: string;
46
+ }>;
47
+ }
48
+ /**
49
+ * Replays the Journey through `runJourneyProgrammatically` (the same session, site policy, fixtures
50
+ * and fail-closed policy as `journey run`) with an observing interpreter, then drafts. A replay that
51
+ * stops early still drafts the steps it reached (`replay.outcome: "stopped"`).
52
+ *
53
+ * Environments (#247): every browser/session option `journey run` takes rides in `opts` and is
54
+ * handed to `runJourneyProgrammatically` unchanged — including `environment` (`--env`/`--base-url`,
55
+ * resolved by `resolveJourneyEnvironment`), so the replay is rebased and allowlisted exactly as a run.
56
+ */
57
+ export declare function annotateJourney(opts: AnnotateJourneyOptions): Promise<AnnotateJourneyResult>;
58
+ export interface ApproveAnnotationsResult {
59
+ readonly id: string;
60
+ readonly draftPath: string;
61
+ readonly changes: AnnotationChange[];
62
+ readonly coverage: IntentCoverage;
63
+ }
64
+ /** Reads and validates a Journey's draft (not found / invalid are typed refusals). */
65
+ export declare function readAnnotationDraft(dir: string, id: string): Promise<{
66
+ draft: AnnotationDraft;
67
+ draftPath: string;
68
+ }>;
69
+ /**
70
+ * The human approval gate (like `journey promote`): applies the reviewed draft to the Journey and
71
+ * removes the draft. Refuses — writing nothing — when the Journey changed since the draft was made
72
+ * (its content hash differs) or the draft names steps the Journey does not have.
73
+ */
74
+ export declare function approveJourneyAnnotations(dir: string, id: string): Promise<ApproveAnnotationsResult>;
75
+ /** `journey run`'s informational intent line (#246): how many steps say why. Never fails a run. */
76
+ export declare function journeyIntentCoverage(dir: string, id: string): Promise<IntentCoverage | undefined>;
@@ -0,0 +1,256 @@
1
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { AnnotationDraftMismatchError, AnnotationDraftSchema, FsJourneyStore, applyAnnotationDraft, describeStep, flatJourneySteps, intentCoverage, secretParamValues, } from "@jevitate/journey";
4
+ import { assertNoSecretInPayload, redactText, redactUrl } from "@jevitate/ai-core";
5
+ import { contentHash } from "@jevitate/domain";
6
+ import { BrowseTheWebToken } from "@jevitate/screenplay";
7
+ import { runJourneyProgrammatically, UnknownJourneyError } from "./journey-api.js";
8
+ /**
9
+ * #246 — `jevitate journey annotate`: replay a Journey, capture redacted before/after page evidence
10
+ * per step, and ask the generation gateway to DRAFT each step's objective / expected result (and the
11
+ * Journey's goal / success criteria when missing). The draft goes to a sidecar file and NEVER into
12
+ * the Journey: `approveJourneyAnnotations` writes it only on an explicit human approval, and only
13
+ * while the Journey is unchanged since the draft (content hash).
14
+ */
15
+ /** Visible text kept per page for the model (redacted first, then bounded). */
16
+ const EVIDENCE_TEXT_CHARS = 1500;
17
+ export class AnnotationDraftNotFoundError extends Error {
18
+ code = "E_JOURNEY_ANNOTATIONS_NOT_FOUND";
19
+ }
20
+ export class InvalidAnnotationDraftError extends Error {
21
+ code = "E_INVALID_ANNOTATIONS_DRAFT";
22
+ }
23
+ /** The Journey changed after the draft was made — approving would annotate steps it never saw. */
24
+ export class StaleAnnotationDraftError extends Error {
25
+ code = "E_JOURNEY_ANNOTATIONS_STALE";
26
+ }
27
+ /**
28
+ * Where a Journey's draft lives: `<journeys>/.drafts/<id>.annotations.json` (`<ns>/<id>` for a shared
29
+ * Journey). A dot-folder, so `journey list` and namespace discovery never read it as a Journey.
30
+ */
31
+ export function annotationDraftPath(journeysDir, id) {
32
+ const parts = id.split("/");
33
+ return join(journeysDir, ".drafts", ...parts.slice(0, -1), `${parts[parts.length - 1] ?? id}.annotations.json`);
34
+ }
35
+ /** The Journey's content hash — what a draft is bound to. */
36
+ export function journeyContentHash(journey) {
37
+ return contentHash(journey);
38
+ }
39
+ async function loadJourney(dir, id) {
40
+ const journey = await new FsJourneyStore(dir).get(id);
41
+ if (journey === null)
42
+ throw new UnknownJourneyError(`unknown journey '${id}'`);
43
+ return journey;
44
+ }
45
+ /** BROWSER CODE — the page's main heading (else its title) and visible text. */
46
+ function readPage() {
47
+ const h1 = document.querySelector("h1");
48
+ const heading = (h1?.innerText ?? h1?.textContent ?? "").trim() || (document.title ?? "");
49
+ return { heading, text: document.body?.innerText ?? "" };
50
+ }
51
+ /** Redacted page evidence (never throws: an unreadable page is empty evidence). */
52
+ async function capture(actor, secrets) {
53
+ const page = actor.ability(BrowseTheWebToken).session.page;
54
+ const raw = await page.evaluate(readPage).catch(() => ({ heading: "", text: "" }));
55
+ const scrub = (s) => redactText(s, secrets);
56
+ return {
57
+ url: scrub(redactUrl(page.url())),
58
+ heading: scrub(raw.heading.replace(/\s+/g, " ").trim()).slice(0, 300),
59
+ // Redact the WHOLE text before bounding it, so a cut never splits a secret past the redactor.
60
+ text: scrub(raw.text.replace(/[ \t]+/g, " ").replace(/\n{3,}/g, "\n\n").trim()).slice(0, EVIDENCE_TEXT_CHARS),
61
+ };
62
+ }
63
+ /**
64
+ * Replays the Journey through `runJourneyProgrammatically` (the same session, site policy, fixtures
65
+ * and fail-closed policy as `journey run`) with an observing interpreter, then drafts. A replay that
66
+ * stops early still drafts the steps it reached (`replay.outcome: "stopped"`).
67
+ *
68
+ * Environments (#247): every browser/session option `journey run` takes rides in `opts` and is
69
+ * handed to `runJourneyProgrammatically` unchanged — including `environment` (`--env`/`--base-url`,
70
+ * resolved by `resolveJourneyEnvironment`), so the replay is rebased and allowlisted exactly as a run.
71
+ */
72
+ export async function annotateJourney(opts) {
73
+ const journey = await loadJourney(opts.dir, opts.id);
74
+ const journeyHash = journeyContentHash(journey);
75
+ const secrets = secretParamValues(journey, opts.params);
76
+ const flat = flatJourneySteps(journey);
77
+ const before = new Map();
78
+ const after = new Map();
79
+ const observer = {
80
+ beforeStep: async ({ actor, index }) => {
81
+ before.set(index, await capture(actor, secrets));
82
+ },
83
+ afterStep: async ({ actor, index, outcome }) => {
84
+ after.set(index, outcome === "done" ? await capture(actor, secrets) : null);
85
+ },
86
+ };
87
+ const { gen, now, ...runOpts } = opts;
88
+ const run = await runJourneyProgrammatically({ ...runOpts, observer });
89
+ const reachedSteps = before.size;
90
+ const replay = run.outcome === "quarantined"
91
+ ? { outcome: "stopped", reachedSteps, totalSteps: flat.length, reason: redactText(run.reason, secrets).slice(0, 2000) }
92
+ : { outcome: "completed", reachedSteps, totalSteps: flat.length };
93
+ const m = journey.metadata;
94
+ const context = redactText(m.goal ?? [m.name, m.description, journey.recording.intent].filter((s) => s !== undefined && s !== "").join(" — "), secrets);
95
+ const clean = (s) => {
96
+ const t = s === null || s === undefined ? "" : redactText(s, secrets).trim();
97
+ return t === "" ? undefined : t;
98
+ };
99
+ let provenance;
100
+ const steps = [];
101
+ const stepLines = [];
102
+ for (const s of flat) {
103
+ const described = redactText(describeStep(s.recorded.step), secrets);
104
+ const b = before.get(s.index);
105
+ const needObjective = (s.recorded.objective ?? "").trim() === "";
106
+ const needExpected = (s.recorded.expectedResult ?? "").trim() === "";
107
+ let objective = s.recorded.objective;
108
+ if (b !== undefined && (needObjective || needExpected)) {
109
+ const a = after.get(s.index) ?? null;
110
+ const input = { journey: context, stepNumber: s.index + 1, totalSteps: flat.length, step: described, before: b, after: a };
111
+ assertNoSecretInPayload(input, secrets); // fail closed: nothing secret reaches a model
112
+ const { output, provenance: p } = await gen.generate("journey.step", input);
113
+ provenance = p;
114
+ const draftObjective = needObjective ? clean(output.objective) : undefined;
115
+ const draftExpected = needExpected ? clean(output.expectedResult) : undefined;
116
+ objective = draftObjective ?? objective;
117
+ if (draftObjective !== undefined || draftExpected !== undefined) {
118
+ steps.push({
119
+ index: s.index,
120
+ step: described.slice(0, 1000),
121
+ ...(draftObjective === undefined ? {} : { objective: draftObjective }),
122
+ ...(draftExpected === undefined ? {} : { expectedResult: draftExpected }),
123
+ evidence: {
124
+ before: { url: b.url, heading: b.heading },
125
+ after: a === null ? null : { url: a.url, heading: a.heading },
126
+ },
127
+ });
128
+ }
129
+ }
130
+ stepLines.push(`${s.index + 1}. ${described}${objective === undefined ? "" : ` — ${redactText(objective, secrets)}`}`.slice(0, 1200));
131
+ }
132
+ let goal;
133
+ let successCriteria;
134
+ const needGoal = (m.goal ?? "").trim() === "";
135
+ const needCriteria = (m.successCriteria ?? []).length === 0;
136
+ if (needGoal || needCriteria) {
137
+ const lastReached = [...before.keys()].sort((x, y) => y - x)[0];
138
+ const finalPage = lastReached === undefined ? null : (after.get(lastReached) ?? before.get(lastReached) ?? null);
139
+ const input = {
140
+ name: redactText(m.name, secrets).slice(0, 500),
141
+ ...(m.description === undefined ? {} : { description: redactText(m.description, secrets).slice(0, 2000) }),
142
+ ...(journey.recording.intent === undefined ? {} : { intent: redactText(journey.recording.intent, secrets).slice(0, 2000) }),
143
+ steps: stepLines.slice(0, 200),
144
+ finalPage,
145
+ };
146
+ assertNoSecretInPayload(input, secrets);
147
+ const { output, provenance: p } = await gen.generate("journey.goal", input);
148
+ provenance = p;
149
+ if (needGoal)
150
+ goal = clean(output.goal);
151
+ if (needCriteria) {
152
+ const criteria = output.successCriteria.map((c) => clean(c)).filter((c) => c !== undefined);
153
+ if (criteria.length > 0)
154
+ successCriteria = criteria;
155
+ }
156
+ }
157
+ const draft = AnnotationDraftSchema.parse({
158
+ kind: "jevitate.journey-annotations.draft",
159
+ version: 1,
160
+ journeyId: opts.id,
161
+ journeyHash,
162
+ createdAtIso: (now ?? (() => new Date().toISOString()))(),
163
+ provenance: provenance === undefined
164
+ ? { adapter: "none", model: "none", promptVersion: "none" }
165
+ : { adapter: provenance.adapter, model: provenance.model, promptVersion: provenance.promptVersion },
166
+ replay,
167
+ ...(goal === undefined ? {} : { goal }),
168
+ ...(successCriteria === undefined ? {} : { successCriteria }),
169
+ steps,
170
+ });
171
+ assertNoSecretInPayload(draft, secrets, "journey annotation draft"); // the last line: never at rest
172
+ const draftPath = annotationDraftPath(opts.dir, opts.id);
173
+ await mkdir(dirname(draftPath), { recursive: true, mode: 0o700 });
174
+ await writeFile(draftPath, `${JSON.stringify(draft, null, 2)}\n`, { mode: 0o600 });
175
+ return {
176
+ id: opts.id,
177
+ draftPath,
178
+ replay,
179
+ drafted: {
180
+ objectives: steps.filter((s) => s.objective !== undefined).length,
181
+ expectedResults: steps.filter((s) => s.expectedResult !== undefined).length,
182
+ goal: goal !== undefined,
183
+ successCriteria: successCriteria?.length ?? 0,
184
+ },
185
+ proposed: applyAnnotationDraft(journey, draft).changes,
186
+ coverage: intentCoverage(journey),
187
+ ...(run.screenshotPaths === undefined ? {} : { screenshotPaths: run.screenshotPaths }),
188
+ ...(run.screenshotIndex === undefined ? {} : { screenshotIndex: run.screenshotIndex }),
189
+ ...(run.screenshotsSkipped === undefined ? {} : { screenshotsSkipped: run.screenshotsSkipped }),
190
+ };
191
+ }
192
+ /** Reads and validates a Journey's draft (not found / invalid are typed refusals). */
193
+ export async function readAnnotationDraft(dir, id) {
194
+ const draftPath = annotationDraftPath(dir, id);
195
+ let raw;
196
+ try {
197
+ raw = await readFile(draftPath, "utf8");
198
+ }
199
+ catch (err) {
200
+ if (err.code === "ENOENT") {
201
+ throw new AnnotationDraftNotFoundError(`no annotation draft for journey '${id}' (${draftPath}) — run \`jevitate journey annotate ${id}\` first`);
202
+ }
203
+ throw err;
204
+ }
205
+ let parsed;
206
+ try {
207
+ parsed = JSON.parse(raw);
208
+ }
209
+ catch (err) {
210
+ throw new InvalidAnnotationDraftError(`${draftPath} is not JSON: ${err instanceof Error ? err.message : String(err)}`);
211
+ }
212
+ const result = AnnotationDraftSchema.safeParse(parsed);
213
+ if (!result.success) {
214
+ throw new InvalidAnnotationDraftError(`${draftPath} is not a valid annotation draft: ${result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);
215
+ }
216
+ if (result.data.journeyId !== id) {
217
+ throw new InvalidAnnotationDraftError(`${draftPath} is a draft for journey '${result.data.journeyId}', not '${id}'`);
218
+ }
219
+ return { draft: result.data, draftPath };
220
+ }
221
+ /**
222
+ * The human approval gate (like `journey promote`): applies the reviewed draft to the Journey and
223
+ * removes the draft. Refuses — writing nothing — when the Journey changed since the draft was made
224
+ * (its content hash differs) or the draft names steps the Journey does not have.
225
+ */
226
+ export async function approveJourneyAnnotations(dir, id) {
227
+ const journey = await loadJourney(dir, id);
228
+ const { draft, draftPath } = await readAnnotationDraft(dir, id);
229
+ if (journeyContentHash(journey) !== draft.journeyHash) {
230
+ throw new StaleAnnotationDraftError(`journey '${id}' changed after this draft was made (${draftPath}) — re-run \`jevitate journey annotate ${id}\` to draft against the current Journey`);
231
+ }
232
+ let applied;
233
+ try {
234
+ applied = applyAnnotationDraft(journey, draft);
235
+ }
236
+ catch (err) {
237
+ if (err instanceof AnnotationDraftMismatchError)
238
+ throw new InvalidAnnotationDraftError(err.message);
239
+ throw err;
240
+ }
241
+ if (applied.changes.length > 0)
242
+ await new FsJourneyStore(dir).put(applied.journey);
243
+ await rm(draftPath, { force: true });
244
+ return { id, draftPath, changes: applied.changes, coverage: intentCoverage(applied.journey) };
245
+ }
246
+ /** `journey run`'s informational intent line (#246): how many steps say why. Never fails a run. */
247
+ export async function journeyIntentCoverage(dir, id) {
248
+ try {
249
+ const journey = await new FsJourneyStore(dir).get(id);
250
+ return journey === null ? undefined : intentCoverage(journey);
251
+ }
252
+ catch {
253
+ return undefined;
254
+ }
255
+ }
256
+ //# sourceMappingURL=journey-annotate-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-annotate-api.js","sourceRoot":"","sources":["../src/journey-annotate-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from "commander";
2
+ import { type CliDeps } from "./cli-shared.js";
3
+ /**
4
+ * #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
5
+ * objective / expected result, the goal and success criteria when missing) into a sidecar file;
6
+ * `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
7
+ * Journey changed since the draft). The model never edits a Journey on its own.
8
+ */
9
+ export declare function registerJourneyAnnotateCommand(journey: Command, program: Command, deps: CliDeps): void;
@@ -0,0 +1,179 @@
1
+ import { existsSync } from "node:fs";
2
+ import { ParamValidationError, formatAnnotationChanges } from "@jevitate/journey";
3
+ import { MissingCredentialError, SecretLeakError } from "@jevitate/ai-core";
4
+ import { SiteGateRefusedError } from "@jevitate/runtime";
5
+ import { ok, fail } from "./envelope.js";
6
+ import { UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
7
+ import { formatScreenshotsLine, parseScreenshotsArg } from "./run-screenshots.js";
8
+ import { annotateJourney, approveJourneyAnnotations, AnnotationDraftNotFoundError, InvalidAnnotationDraftError, StaleAnnotationDraftError, } from "./journey-annotate-api.js";
9
+ import { withSiteGate } from "./site-gate-cli.js";
10
+ import { buildMissionFixtures, checkSetupRefs, withFixtureFlags } from "./fixture-cli.js";
11
+ import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError } from "./mission-fixtures.js";
12
+ import { withEngine } from "./engine.js";
13
+ import { EXIT_CODES } from "./exit-codes.js";
14
+ import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
15
+ import { resolveDbPath, resolveJourneysDir, withBrowserLaunchFlags, withScreenshotsFlag, browserOption, withEmulationFlags, emulationFromFlags, collectParam, emitJson, emitUsageLine, environmentSeams, GatewaySelectionError, buildGenerationGateway, } from "./cli-shared.js";
16
+ /**
17
+ * #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
18
+ * objective / expected result, the goal and success criteria when missing) into a sidecar file;
19
+ * `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
20
+ * Journey changed since the draft). The model never edits a Journey on its own.
21
+ */
22
+ export function registerJourneyAnnotateCommand(journey, program, deps) {
23
+ withScreenshotsFlag(withEnvironmentFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(journey.command("annotate <id>"))))))
24
+ .description("draft each step's objective/expected result (and the goal/success criteria when missing) by replaying the Journey; " +
25
+ "writes a reviewable draft, never the Journey — `--approve` applies a reviewed draft (human gate)")
26
+ .option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
27
+ .option("--param <kv>", "param as key=value (repeatable)", collectParam, {})
28
+ .option("--storage-state <file>", "Playwright storageState JSON to start the replay authenticated; must exist")
29
+ .option("--real", "draft with the live OpenRouter generation gateway (requires keys)", false)
30
+ .option("--fake-ai", "draft with the deterministic fake generator (pipeline smoke only)", false)
31
+ .option("--approve", "apply the reviewed draft to the Journey (shows the diff; refused if the Journey changed since the draft)", false)
32
+ .option("--json", "emit a JSON envelope")
33
+ .action(async function (id) {
34
+ const ownFixtureFlags = this.opts();
35
+ const { dir, param, storageState: storageStateFlag, real, fakeAi, approve, json, env: envName, baseUrl, screenshots: screenshotsFlag, ...emulationFlags } = this.opts();
36
+ const out = program.configureOutput().writeOut;
37
+ const journeysDir = resolveJourneysDir(deps, dir);
38
+ if (approve === true) {
39
+ if (real === true ||
40
+ fakeAi === true ||
41
+ Object.keys(param).length > 0 ||
42
+ storageStateFlag !== undefined ||
43
+ envName !== undefined ||
44
+ baseUrl !== undefined ||
45
+ screenshotsFlag !== undefined) {
46
+ emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", "--approve applies an existing draft: it replays nothing, so it takes no --real/--fake-ai/--param/--storage-state/--env/--base-url/--screenshots"));
47
+ return;
48
+ }
49
+ try {
50
+ const result = await approveJourneyAnnotations(journeysDir, id);
51
+ if (json) {
52
+ emitJson(program, ok(result));
53
+ }
54
+ else {
55
+ out?.(formatAnnotationChanges(result.changes));
56
+ out?.(`applied ${result.changes.length} change(s) to journey '${id}' (${result.coverage.withObjective}/${result.coverage.steps} steps now have an objective)\n`);
57
+ process.exitCode = EXIT_CODES.ok;
58
+ }
59
+ }
60
+ catch (err) {
61
+ if (err instanceof UnknownJourneyError)
62
+ emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
63
+ else if (err instanceof AnnotationDraftNotFoundError || err instanceof InvalidAnnotationDraftError || err instanceof StaleAnnotationDraftError) {
64
+ emitJson(program, fail(err.code, err.message));
65
+ }
66
+ else
67
+ emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
68
+ }
69
+ return;
70
+ }
71
+ // #247: --env/--base-url choose where the replay runs — the same resolver as `journey run`
72
+ // (unknown env / bad file / secret in environments.json → 64, nothing opened).
73
+ let environment;
74
+ try {
75
+ environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
76
+ }
77
+ catch (err) {
78
+ if (!isEnvironmentError(err))
79
+ throw err;
80
+ emitJson(program, fail(err.code, err.message));
81
+ return;
82
+ }
83
+ // The environment's fixtures/hooks apply when the flags name none (hooks still need --allow-shell-hooks).
84
+ const fixtureFlags = {
85
+ ...ownFixtureFlags,
86
+ ...(ownFixtureFlags.before === undefined && environment?.hooks?.before !== undefined ? { before: environment.hooks.before } : {}),
87
+ ...(ownFixtureFlags.after === undefined && environment?.hooks?.after !== undefined ? { after: environment.hooks.after } : {}),
88
+ };
89
+ // --storage-state wins; else the environment's own session (~/.jevitate/targets.json[<origin>]).
90
+ const storageState = storageStateFlag ?? environment?.storageState;
91
+ if (storageState !== undefined && !existsSync(storageState)) {
92
+ emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", `storage state not found: ${storageState}`));
93
+ return;
94
+ }
95
+ let emulation;
96
+ let screenshots;
97
+ try {
98
+ emulation = emulationFromFlags(emulationFlags);
99
+ screenshots = parseScreenshotsArg(screenshotsFlag);
100
+ }
101
+ catch (err) {
102
+ emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", err instanceof Error ? err.message : String(err)));
103
+ return;
104
+ }
105
+ let gateway;
106
+ try {
107
+ gateway = await buildGenerationGateway(deps, { real: real ?? false, fakeAi: fakeAi ?? false });
108
+ }
109
+ catch (err) {
110
+ if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError)
111
+ emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
112
+ else
113
+ emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
114
+ return;
115
+ }
116
+ try {
117
+ const result = await withSiteGate(resolveDbPath(deps), (siteGate) => annotateJourney({
118
+ ...(siteGate === undefined ? {} : { siteGate }),
119
+ dir: journeysDir,
120
+ id,
121
+ params: param,
122
+ gen: gateway.gen,
123
+ browserPortFactory: deps.explore?.browserPortFactory,
124
+ ...browserOption(this.opts()),
125
+ ...(emulation === undefined ? {} : { emulation }),
126
+ ...(screenshots === undefined ? {} : { screenshots }),
127
+ ...(storageState !== undefined ? { storageState } : {}),
128
+ ...(environment === undefined ? {} : { environment }),
129
+ fixtures: (site) => {
130
+ const fx = buildMissionFixtures(fixtureFlags, {
131
+ allowlist: environment === undefined ? [site] : environment.allowedOrigins,
132
+ baseUrl: site,
133
+ ...(storageState !== undefined ? { storageState } : {}),
134
+ ...(environment?.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
135
+ });
136
+ checkSetupRefs({ "--param": Object.values(param) }, fx);
137
+ return fx;
138
+ },
139
+ }));
140
+ const data = withEngine({ ...result, usage: gateway.usage.snapshot() });
141
+ // A replay that stopped early drafted only the steps it reached: the command did not finish its work.
142
+ const exit = result.replay.outcome === "completed" ? EXIT_CODES.ok : EXIT_CODES.inconclusive;
143
+ if (json) {
144
+ emitJson(program, ok(data));
145
+ }
146
+ else {
147
+ const r = result.replay;
148
+ out?.(`drafted annotations for journey '${id}' (${r.reachedSteps}/${r.totalSteps} steps replayed${r.outcome === "stopped" ? `; stopped: ${r.reason ?? "unknown"}` : ""}): ` +
149
+ `${result.drafted.objectives} objective(s), ${result.drafted.expectedResults} expected result(s)` +
150
+ `${result.drafted.goal ? ", a goal" : ""}${result.drafted.successCriteria > 0 ? `, ${result.drafted.successCriteria} success criterion(s)` : ""}\n`);
151
+ out?.(formatAnnotationChanges(result.proposed));
152
+ out?.(`draft: ${result.draftPath}\nreview or edit it, then apply it: jevitate journey annotate ${id} --approve\n`);
153
+ if (result.screenshotIndex !== undefined)
154
+ out?.(formatScreenshotsLine(result));
155
+ emitUsageLine(program, data);
156
+ }
157
+ process.exitCode = exit;
158
+ }
159
+ catch (err) {
160
+ if (err instanceof SiteGateRefusedError || isEnvironmentError(err))
161
+ emitJson(program, fail(err.code, err.message));
162
+ else if (err instanceof UnknownJourneyError)
163
+ emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
164
+ else if (err instanceof JourneyRequiresAuthError)
165
+ emitJson(program, fail("E_JOURNEY_REQUIRES_AUTH", err.message));
166
+ else if (err instanceof ParamValidationError)
167
+ emitJson(program, fail("E_INVALID_PARAMS", err.message));
168
+ else if (err instanceof FixtureSpecError || err instanceof UnboundSetupRefError)
169
+ emitJson(program, fail(err.code, err.message));
170
+ else if (err instanceof FixtureSetupError)
171
+ emitJson(program, fail("E_JOURNEY_ANNOTATE", err.message));
172
+ else if (err instanceof SecretLeakError)
173
+ emitJson(program, fail("E_JOURNEY_ANNOTATE_SECRET", err.message));
174
+ else
175
+ emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
176
+ }
177
+ });
178
+ }
179
+ //# sourceMappingURL=journey-annotate-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-annotate-cli.js","sourceRoot":"","sources":["../src/journey-annotate-cli.ts"],"names":[],"mappings":"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"}