@jevitate/cli 0.17.0 → 0.18.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 (83) hide show
  1. package/dist/author-journey-cli.js +11 -8
  2. package/dist/author-journey-cli.js.map +1 -1
  3. package/dist/bin.js +2754 -1096
  4. package/dist/build-info.generated.js +3 -3
  5. package/dist/catalog-api.d.ts +22 -0
  6. package/dist/catalog-api.js +49 -0
  7. package/dist/catalog-api.js.map +1 -1
  8. package/dist/catalog-cli.js +59 -37
  9. package/dist/catalog-cli.js.map +1 -1
  10. package/dist/cli-shared.d.ts +6 -1
  11. package/dist/cli-shared.js +11 -2
  12. package/dist/cli-shared.js.map +1 -1
  13. package/dist/exit-codes.js +8 -0
  14. package/dist/exit-codes.js.map +1 -1
  15. package/dist/journey-anchor-cli.js +16 -8
  16. package/dist/journey-anchor-cli.js.map +1 -1
  17. package/dist/journey-annotate-cli.js +10 -5
  18. package/dist/journey-annotate-cli.js.map +1 -1
  19. package/dist/journey-api.d.ts +2 -0
  20. package/dist/journey-api.js +14 -0
  21. package/dist/journey-api.js.map +1 -1
  22. package/dist/journey-bundle.d.ts +83 -0
  23. package/dist/journey-bundle.js +252 -0
  24. package/dist/journey-bundle.js.map +1 -0
  25. package/dist/journey-chain.d.ts +14 -1
  26. package/dist/journey-chain.js +139 -8
  27. package/dist/journey-chain.js.map +1 -1
  28. package/dist/journey-cli/anchors.js +11 -6
  29. package/dist/journey-cli/anchors.js.map +1 -1
  30. package/dist/journey-cli/chain.js +12 -5
  31. package/dist/journey-cli/chain.js.map +1 -1
  32. package/dist/journey-cli/find.js +10 -5
  33. package/dist/journey-cli/find.js.map +1 -1
  34. package/dist/journey-cli/lint.js +13 -9
  35. package/dist/journey-cli/lint.js.map +1 -1
  36. package/dist/journey-cli/list.js +10 -5
  37. package/dist/journey-cli/list.js.map +1 -1
  38. package/dist/journey-cli/migrate.js +13 -6
  39. package/dist/journey-cli/migrate.js.map +1 -1
  40. package/dist/journey-cli/promote.js +11 -6
  41. package/dist/journey-cli/promote.js.map +1 -1
  42. package/dist/journey-cli/publish.js +12 -6
  43. package/dist/journey-cli/publish.js.map +1 -1
  44. package/dist/journey-cli/review.js +14 -8
  45. package/dist/journey-cli/review.js.map +1 -1
  46. package/dist/journey-cli/run.js +25 -10
  47. package/dist/journey-cli/run.js.map +1 -1
  48. package/dist/journey-cli/shared.d.ts +19 -1
  49. package/dist/journey-cli/shared.js +28 -0
  50. package/dist/journey-cli/shared.js.map +1 -1
  51. package/dist/journey-cli/verify.js +13 -6
  52. package/dist/journey-cli/verify.js.map +1 -1
  53. package/dist/journey-cli-bundle.d.ts +4 -0
  54. package/dist/journey-cli-bundle.js +70 -0
  55. package/dist/journey-cli-bundle.js.map +1 -0
  56. package/dist/journey-cli-readiness.d.ts +4 -0
  57. package/dist/journey-cli-readiness.js +163 -0
  58. package/dist/journey-cli-readiness.js.map +1 -0
  59. package/dist/journey-cli.js +5 -0
  60. package/dist/journey-cli.js.map +1 -1
  61. package/dist/journey-demo-cli.js +10 -5
  62. package/dist/journey-demo-cli.js.map +1 -1
  63. package/dist/journey-handback.d.ts +62 -0
  64. package/dist/journey-handback.js +150 -0
  65. package/dist/journey-handback.js.map +1 -0
  66. package/dist/journey-link-api.js +1 -1
  67. package/dist/journey-link-api.js.map +1 -1
  68. package/dist/journey-link-cli.js +13 -8
  69. package/dist/journey-link-cli.js.map +1 -1
  70. package/dist/journey-readiness.d.ts +104 -0
  71. package/dist/journey-readiness.js +369 -0
  72. package/dist/journey-readiness.js.map +1 -0
  73. package/dist/mcp-cli-tools.js +57 -21
  74. package/dist/mcp-cli-tools.js.map +1 -1
  75. package/dist/program.js +3 -0
  76. package/dist/program.js.map +1 -1
  77. package/dist/project-layout.d.ts +57 -0
  78. package/dist/project-layout.js +144 -0
  79. package/dist/project-layout.js.map +1 -0
  80. package/dist/project-where.d.ts +4 -0
  81. package/dist/project-where.js +48 -0
  82. package/dist/project-where.js.map +1 -0
  83. package/package.json +7 -7
@@ -0,0 +1,369 @@
1
+ import { relative, sep } from "node:path";
2
+ import { checkCompatibility, journeyParamSchema, lintJourney, } from "@jevitate/journey";
3
+ import { currentBuildTree, currentEngineInfo } from "./engine.js";
4
+ import { environmentFromFlags } from "./environments.js";
5
+ import { runJourneyChain, chainSucceeded } from "./journey-chain.js";
6
+ import { journeyContentHash } from "./journey-annotate-api.js";
7
+ import { reviewJourneyById } from "./journey-review-api.js";
8
+ import { verifyRecordPath } from "./journey-review-store.js";
9
+ import { verifyJourneyMutations } from "./journey-verify.js";
10
+ import { runJourneyProgrammatically } from "./journey-api.js";
11
+ export class ReadinessError extends Error {
12
+ code;
13
+ constructor(code, message) {
14
+ super(message);
15
+ this.name = "ReadinessError";
16
+ this.code = code;
17
+ }
18
+ }
19
+ const REQUIRED_PROOF_CHECK = "proof";
20
+ /** #581 §1: the target shared by `replay` and `prove`, refused in this order before any runner call. */
21
+ function resolveTarget(opts, deps, required) {
22
+ let environment;
23
+ if (opts.env !== undefined || opts.baseUrl !== undefined) {
24
+ environment = environmentFromFlags({ ...(opts.env === undefined ? {} : { env: opts.env }), ...(opts.baseUrl === undefined ? {} : { baseUrl: opts.baseUrl }) }, { ...(deps.environmentsFile === undefined ? {} : { environmentsFile: deps.environmentsFile }), ...(opts.targetsFile === undefined ? {} : { targetsFile: opts.targetsFile }) });
25
+ }
26
+ if (environment === undefined) {
27
+ throw new ReadinessError("E_READINESS_TARGET", "replay and prove need a target: pass --env <name> or --base-url <origin>");
28
+ }
29
+ if (environment.production === true) {
30
+ throw new ReadinessError("E_READINESS_PRODUCTION", `environment '${environment.name ?? environment.baseUrl}' is flagged production: readiness never replays or proves against it`);
31
+ }
32
+ const missing = required.filter((name) => !(name in (opts.params ?? {})));
33
+ if (missing.length > 0) {
34
+ throw new ReadinessError("E_READINESS_PARAMS", `missing required param(s): ${missing.join(", ")}`);
35
+ }
36
+ return environment;
37
+ }
38
+ /** The required params of the Journey the run/`--param` flags drive (a pair's consumer is bound by the chain). */
39
+ function requiredParams(journey, pair, hasRequests) {
40
+ const names = journeyParamSchema(journey).required;
41
+ return pair && !hasRequests ? [...names, "requests"] : names;
42
+ }
43
+ function lintFindings(journey, projectDir) {
44
+ // `lintJourney` runs the upload-fixture rules itself when it is given a project root (#488).
45
+ return lintJourney(journey, projectDir === undefined ? {} : { baseDir: projectDir });
46
+ }
47
+ function lintCheck(ctx, projectDir) {
48
+ const findings = lintFindings(ctx.journey, projectDir);
49
+ const errors = findings.filter((f) => f.level === "error").length;
50
+ const warnings = findings.filter((f) => f.level === "warning").length;
51
+ if (errors > 0) {
52
+ return {
53
+ check: { check: "lint", journey: ctx.id, state: "fail", detail: `${errors} error(s)${warnings === 0 ? "" : `, ${warnings} warning(s)`}` },
54
+ blocker: { check: "lint", journey: ctx.id, why: `${errors} lint error(s)`, next: `jevitate journey lint ${ctx.id}` },
55
+ };
56
+ }
57
+ return { check: { check: "lint", journey: ctx.id, state: "pass", detail: warnings === 0 ? "no findings" : `${warnings} warning(s)` } };
58
+ }
59
+ function schemaCheck(ctx) {
60
+ return { check: "schema", journey: ctx.id, state: "pass", detail: "the Journey loads" };
61
+ }
62
+ /** #582: the producing/consuming contract of a pair; absent contracts are nothing to check. */
63
+ function handoffCheck(producer, consumer) {
64
+ const declared = producer.journey.metadata.outputs !== undefined || consumer.journey.metadata.inputs !== undefined;
65
+ if (!declared) {
66
+ return { check: { check: "handoff", journey: producer.id, state: "not-run", detail: "neither Journey declares a handoff contract" } };
67
+ }
68
+ const issues = checkCompatibility(producer.journey, consumer.journey);
69
+ if (issues.length > 0) {
70
+ return {
71
+ check: { check: "handoff", journey: producer.id, state: "fail", detail: issues.map((i) => i.message).join("; ") },
72
+ blocker: { check: "handoff", journey: producer.id, why: issues.map((i) => i.message).join("; "), next: `jevitate journey chain --from ${producer.id} --to ${consumer.id} --requests <file>` },
73
+ };
74
+ }
75
+ return { check: { check: "handoff", journey: producer.id, state: "pass", detail: "contracts are compatible" } };
76
+ }
77
+ /** #583: a declared prepare-only boundary is what stops a Journey before the irreversible action. */
78
+ function boundaryCheck(ctx) {
79
+ return ctx.journey.metadata.boundary === undefined
80
+ ? { check: "boundary", journey: ctx.id, state: "not-run", detail: "no prepare-only boundary declared" }
81
+ : { check: "boundary", journey: ctx.id, state: "pass", detail: "a prepare-only boundary is declared" };
82
+ }
83
+ /** `journey review --strict`: every `warn` attention item is a blocker (an `info` item is advice, not a gate). */
84
+ function reviewStrictCheck(ctx) {
85
+ const warns = (ctx.review.attention ?? []).filter((a) => a.severity === "warn");
86
+ if (warns.length > 0) {
87
+ return {
88
+ check: { check: "review-strict", journey: ctx.id, state: "fail", detail: warns.map((a) => a.text).join("; ") },
89
+ blocker: { check: "review-strict", journey: ctx.id, why: warns.map((a) => a.text).join("; "), next: `jevitate journey review ${ctx.id} --strict` },
90
+ };
91
+ }
92
+ return { check: { check: "review-strict", journey: ctx.id, state: "pass", detail: "no strict attention items" } };
93
+ }
94
+ /** Every step objective written; a missing one is a person's annotation to draft. */
95
+ function annotationsCheck(ctx) {
96
+ const missing = ctx.review.summary.missingIntent;
97
+ if (missing.length === 0)
98
+ return { check: { check: "annotations", journey: ctx.id, state: "pass", detail: "every step has an objective" }, awaiting: [] };
99
+ return {
100
+ check: { check: "annotations", journey: ctx.id, state: "awaiting-human", detail: `${missing.length} intent gap(s)` },
101
+ awaiting: missing.map((item) => ({ check: "annotations", journey: ctx.id, item, next: `jevitate journey annotate ${ctx.id}` })),
102
+ };
103
+ }
104
+ /** #433: the job/persona links resolve; a draft/stale approval is a person's call. */
105
+ function catalogCheck(ctx) {
106
+ const links = ctx.review.catalog;
107
+ if (links === undefined)
108
+ return { check: { check: "catalog", journey: ctx.id, state: "not-run", detail: "the catalog was not loaded" }, awaiting: [] };
109
+ const dangling = [];
110
+ for (const [kind, link] of [["job", links.job], ["persona", links.persona]]) {
111
+ if (link !== undefined && link.status === "unknown")
112
+ dangling.push(`${kind}:${link.id}`);
113
+ }
114
+ if (dangling.length > 0) {
115
+ return {
116
+ check: { check: "catalog", journey: ctx.id, state: "fail", detail: `dangling link(s): ${dangling.join(", ")}` },
117
+ blocker: { check: "catalog", journey: ctx.id, why: `dangling link(s): ${dangling.join(", ")}`, next: `jevitate journey link ${ctx.id} --job <job-id> --persona <persona-id>` },
118
+ awaiting: [],
119
+ };
120
+ }
121
+ if (!links.linked) {
122
+ return {
123
+ check: { check: "catalog", journey: ctx.id, state: "fail", detail: "no job/persona link declared" },
124
+ blocker: { check: "catalog", journey: ctx.id, why: "no job/persona link declared", next: `jevitate journey link ${ctx.id} --job <job-id> --persona <persona-id>` },
125
+ awaiting: [],
126
+ };
127
+ }
128
+ if (links.unvetted.length > 0) {
129
+ return {
130
+ check: { check: "catalog", journey: ctx.id, state: "awaiting-human", detail: links.unvetted.join(", ") },
131
+ awaiting: links.unvetted.map((item) => ({
132
+ check: "catalog",
133
+ journey: ctx.id,
134
+ item,
135
+ next: item.startsWith("job:") ? `jevitate job review ${item.slice("job:".length)}` : `jevitate persona review ${item.slice("persona:".length)}`,
136
+ })),
137
+ };
138
+ }
139
+ return { check: { check: "catalog", journey: ctx.id, state: "pass", detail: "links resolve and are approved" }, awaiting: [] };
140
+ }
141
+ /** The `.verify/<id>.json` proof record, and the freshness rule shared with the review sheet. */
142
+ function proofCheck(ctx, journeysDir, cwd) {
143
+ const verify = ctx.review.proof.verify;
144
+ const evidence = relativeEvidence(cwd, verifyRecordPath(journeysDir, ctx.id));
145
+ if (verify.status === "not-verified") {
146
+ return {
147
+ check: { check: "proof", journey: ctx.id, state: "not-run", detail: verify.hint },
148
+ blocker: { check: "proof", journey: ctx.id, why: "no mutation proof recorded", next: `jevitate journey verify ${ctx.id} --mutate` },
149
+ };
150
+ }
151
+ if (verify.stale) {
152
+ return {
153
+ check: { check: "proof", journey: ctx.id, state: "stale", detail: `the ${verify.verdict} proof at ${verify.at} is bound to older content`, evidence },
154
+ blocker: { check: "proof", journey: ctx.id, why: "the recorded proof is stale", next: `jevitate journey verify ${ctx.id} --mutate` },
155
+ };
156
+ }
157
+ if (verify.verdict === "proven") {
158
+ const passed = Object.values(verify.summary).reduce((a, b) => a + b, 0);
159
+ return { check: { check: "proof", journey: ctx.id, state: "pass", detail: `proven ${passed}/${passed}`, evidence } };
160
+ }
161
+ if (verify.verdict === "insensitive") {
162
+ return {
163
+ check: { check: "proof", journey: ctx.id, state: "fail", detail: verify.reason ?? "some checks cannot fail", evidence },
164
+ blocker: { check: "proof", journey: ctx.id, why: verify.reason ?? "some checks cannot fail", next: `jevitate journey verify ${ctx.id} --mutate` },
165
+ };
166
+ }
167
+ return { check: { check: "proof", journey: ctx.id, state: "inconclusive", detail: verify.reason ?? `proof verdict ${verify.verdict}`, evidence } };
168
+ }
169
+ function relativeEvidence(cwd, path) {
170
+ const r = relative(cwd, path);
171
+ return r === "" || r.startsWith("..") ? path : r.split(sep).join("/");
172
+ }
173
+ /** `review` promoted with an approval that still binds the current review hash. */
174
+ function promotionCheck(ctx) {
175
+ const change = ctx.review.changeSinceApproval;
176
+ const stale = (change.kind === "diff" || change.kind === "snapshot-missing") && change.changed;
177
+ const current = ctx.journey.metadata.promoted && ctx.journey.metadata.approval !== undefined && !stale;
178
+ if (current)
179
+ return { check: { check: "promotion", journey: ctx.id, state: "pass", detail: "promoted with a current approval" }, awaiting: [] };
180
+ const why = !ctx.journey.metadata.promoted ? "not promoted" : stale ? "approval is stale (the Journey changed since it was approved)" : "no recorded approval";
181
+ return {
182
+ check: { check: "promotion", journey: ctx.id, state: "awaiting-human", detail: why },
183
+ awaiting: [{ check: "promotion", journey: ctx.id, item: why, next: `jevitate journey promote ${ctx.id}` }],
184
+ };
185
+ }
186
+ function replayCheck(ctx, outcome) {
187
+ const next = `jevitate journey run ${ctx.id}`;
188
+ const check = { check: "replay", journey: ctx.id, state: outcome.state, detail: outcome.detail };
189
+ return outcome.state === "pass" ? { check } : { check, blocker: { check: "replay", journey: ctx.id, why: outcome.detail, next } };
190
+ }
191
+ /** The #583 handback state, as `journey run` reports it. */
192
+ function handbackOutcome(state) {
193
+ switch (state) {
194
+ case "prepared":
195
+ return { state: "pass", detail: "the run stopped at its prepare-only boundary" };
196
+ case "submitted":
197
+ return { state: "fail", detail: "the run submitted the irreversible action (a prepare-only boundary must stop before it)" };
198
+ case "inconclusive":
199
+ return { state: "inconclusive", detail: "the handback state is inconclusive" };
200
+ default:
201
+ return { state: "fail", detail: `the handback state is ${state}` };
202
+ }
203
+ }
204
+ function oneJourneyReplay(result) {
205
+ if (result.outcome === "ok") {
206
+ return result.handback === undefined ? { state: "pass", detail: "the recorded replay held" } : handbackOutcome(result.handback.state);
207
+ }
208
+ if (result.outcome === "quarantined")
209
+ return { state: "fail", detail: result.reason ?? "the replay diverged" };
210
+ if (result.outcome === "inconclusive")
211
+ return { state: "inconclusive", detail: result.reason ?? "the replay had no verdict" };
212
+ return { state: "fail", detail: `the replay ended ${result.outcome}` };
213
+ }
214
+ function pairReplay(result) {
215
+ if (chainSucceeded(result))
216
+ return { state: "pass", detail: "the chain held for every request" };
217
+ if (result.runs.some((r) => r.outcome === "inconclusive"))
218
+ return { state: "inconclusive", detail: "a chained run had no verdict" };
219
+ return { state: "fail", detail: `${result.unmatched.length} unmatched request(s), ${result.runs.filter((r) => r.outcome !== "ok").length} failed run(s)` };
220
+ }
221
+ function verdictOf(checks, mode) {
222
+ if (checks.some((c) => c.state === "fail"))
223
+ return "blocked";
224
+ if (checks.some((c) => c.state === "inconclusive"))
225
+ return "inconclusive";
226
+ const requiredReplay = mode !== "report";
227
+ const required = checks.filter((c) => c.check === REQUIRED_PROOF_CHECK || (requiredReplay && c.check === "replay"));
228
+ if (required.some((c) => c.state === "stale" || c.state === "not-run"))
229
+ return "incomplete";
230
+ return "technically-ready";
231
+ }
232
+ function commandsFor(verdict, mode, id, blockers, awaiting) {
233
+ const next = [];
234
+ const add = (command) => void (command !== "" && !next.includes(command) && next.push(command));
235
+ if (verdict === "blocked") {
236
+ for (const b of blockers)
237
+ add(b.next);
238
+ return next;
239
+ }
240
+ if (mode !== "prove")
241
+ add(`jevitate journey readiness ${id} --mode prove`);
242
+ if (verdict === "technically-ready")
243
+ add(`jevitate journey promote ${id}`);
244
+ for (const a of awaiting)
245
+ add(a.next);
246
+ return next;
247
+ }
248
+ /**
249
+ * #581: one Journey's (or a linked pair's) readiness receipt. Static checks only in `report`; the
250
+ * baseline replay in `replay`/`prove`; fresh mutation proofs in `prove`. Experience reuse is the
251
+ * existing rule: a proof is fresh only while it binds the current review hash.
252
+ */
253
+ export async function runJourneyReadiness(opts, deps = {}) {
254
+ const mode = opts.mode ?? "report";
255
+ const cwd = (deps.cwd ?? (() => process.cwd()))();
256
+ const review = deps.review ?? reviewJourneyById;
257
+ const run = deps.run ?? runJourneyProgrammatically;
258
+ const chain = deps.chain ?? runJourneyChain;
259
+ const verify = deps.verify ?? verifyJourneyMutations;
260
+ const reviewOpts = { strict: true, ...(opts.catalogDir === undefined ? {} : { catalogDir: opts.catalogDir }), ...(opts.targetsFile === undefined ? {} : { targetsFile: opts.targetsFile }) };
261
+ const contexts = [];
262
+ const loaded = await review(opts.journeysDir, opts.id, reviewOpts);
263
+ contexts.push({ id: opts.id, journey: loaded.journey, review: loaded.review });
264
+ if (opts.with !== undefined) {
265
+ const consumer = await review(opts.journeysDir, opts.with, reviewOpts);
266
+ contexts.push({ id: opts.with, journey: consumer.journey, review: consumer.review });
267
+ }
268
+ const pair = opts.with !== undefined;
269
+ let environment;
270
+ let replay;
271
+ if (mode !== "report") {
272
+ environment = resolveTarget(opts, deps, requiredParams(contexts[0].journey, pair, opts.requests !== undefined));
273
+ const params = { ...(opts.params ?? {}) };
274
+ try {
275
+ if (pair) {
276
+ const chained = await chain({
277
+ from: opts.id,
278
+ to: opts.with,
279
+ requests: opts.requests ?? "",
280
+ dir: opts.journeysDir,
281
+ environment,
282
+ ...(opts.storageState === undefined ? {} : { storageState: opts.storageState }),
283
+ ...(opts.browser === undefined ? {} : { browser: opts.browser }),
284
+ ...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
285
+ });
286
+ replay = pairReplay(chained);
287
+ }
288
+ else {
289
+ const result = await run({
290
+ dir: opts.journeysDir,
291
+ id: opts.id,
292
+ params,
293
+ environment,
294
+ ...(opts.storageState === undefined ? {} : { storageState: opts.storageState }),
295
+ ...(opts.browser === undefined ? {} : { browser: opts.browser }),
296
+ ...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
297
+ ...(opts.fixtures === undefined ? {} : { fixtures: opts.fixtures(opts.id, environment) }),
298
+ });
299
+ replay = oneJourneyReplay(result);
300
+ }
301
+ }
302
+ catch (err) {
303
+ replay = { state: "inconclusive", detail: err instanceof Error ? err.message : String(err) };
304
+ }
305
+ if (mode === "prove") {
306
+ for (const ctx of contexts) {
307
+ try {
308
+ await verify({
309
+ dir: opts.journeysDir,
310
+ id: ctx.id,
311
+ params,
312
+ environment,
313
+ ...(opts.storageState === undefined ? {} : { storageState: opts.storageState }),
314
+ ...(opts.browser === undefined ? {} : { browser: opts.browser }),
315
+ ...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
316
+ ...(opts.fixtures === undefined ? {} : { fixtures: opts.fixtures(ctx.id, environment) }),
317
+ });
318
+ }
319
+ catch (err) {
320
+ // A proof the host could not run leaves the existing evidence in place (never a crash).
321
+ ctx.review = { ...ctx.review, proof: { ...ctx.review.proof, verify: { status: "not-verified", hint: err instanceof Error ? err.message : String(err) } } };
322
+ continue;
323
+ }
324
+ // Re-read the freshly recorded proof through the same sheet the verdict is computed from.
325
+ const refreshed = await review(opts.journeysDir, ctx.id, reviewOpts);
326
+ ctx.review = refreshed.review;
327
+ }
328
+ }
329
+ }
330
+ const checks = [];
331
+ const blockers = [];
332
+ const awaiting = [];
333
+ const push = (r) => {
334
+ checks.push(r.check);
335
+ if (r.blocker !== undefined)
336
+ blockers.push(r.blocker);
337
+ if (r.awaiting !== undefined)
338
+ awaiting.push(...r.awaiting);
339
+ };
340
+ for (const ctx of contexts) {
341
+ push({ check: schemaCheck(ctx) });
342
+ push(lintCheck(ctx, opts.projectDir));
343
+ if (pair && ctx.id === opts.id)
344
+ push(handoffCheck(contexts[0], contexts[1]));
345
+ push({ check: boundaryCheck(ctx) });
346
+ push(reviewStrictCheck(ctx));
347
+ push(annotationsCheck(ctx));
348
+ push(catalogCheck(ctx));
349
+ push(proofCheck(ctx, opts.journeysDir, cwd));
350
+ if (mode !== "report")
351
+ push(replayCheck(ctx, replay ?? { state: "not-run", detail: "the replay did not run" }));
352
+ push(promotionCheck(ctx));
353
+ }
354
+ const verdict = verdictOf(checks, mode);
355
+ const engineInfo = currentEngineInfo();
356
+ const target = environment === undefined ? null : { origin: environment.baseUrl, ...(environment.name === undefined ? {} : { env: environment.name }) };
357
+ return {
358
+ engine: { version: engineInfo.version, commit: engineInfo.commit, tree: currentBuildTree() },
359
+ mode,
360
+ target,
361
+ journeys: contexts.map((ctx) => ({ id: ctx.id, contentHash: journeyContentHash(ctx.journey), reviewHash: ctx.review.contentHash, promoted: ctx.journey.metadata.promoted })),
362
+ checks,
363
+ verdict,
364
+ blockers,
365
+ awaitingHuman: awaiting,
366
+ next: commandsFor(verdict, mode, opts.id, blockers, awaiting),
367
+ };
368
+ }
369
+ //# sourceMappingURL=journey-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-readiness.js","sourceRoot":"","sources":["../src/journey-readiness.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,8 @@ export const OMIT = {
29
29
  const HOOK_FLAGS = { "--before": OMIT.hooks, "--after": OMIT.hooks, "--allow-shell-hooks": OMIT.hooks, "--hook-timeout-ms": OMIT.hooks };
30
30
  const BROWSER_FLAGS = { "--browser-executable": OMIT.browserBin, "--browser-channel": OMIT.browserBin, "--browser-arg": OMIT.browserBin, "--ignore-host-load": OMIT.hostLoad };
31
31
  const JSON_FLAG = { "--json": OMIT.json };
32
+ /** #585: --project / --journeys-dir pick a store, which over MCP is always the server's (as --dir). */
33
+ const LOCATION_FLAGS = { "--project": OMIT.storeDir, "--journeys-dir": OMIT.storeDir };
32
34
  /** #426: `--tag key=value` → a `tags` object (`{"feature": "checkout"}`); keys/values validated by the command. */
33
35
  const TAGS = { kind: "params", flag: "--tag" };
34
36
  // ── Param helpers ─────────────────────────────────────────────────────────────────────────────
@@ -63,7 +65,7 @@ export const CLI_TOOL_SPECS = [
63
65
  {
64
66
  name: "list_journeys",
65
67
  description: "`jevitate journey list`: every Journey in the store (promoted and not) — id, name, promoted, params. find_capabilities is the promoted-only search.",
66
- command: { path: "journey list", params: {}, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
68
+ command: { path: "journey list", params: {}, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG } },
67
69
  },
68
70
  {
69
71
  name: "promote_journey",
@@ -82,7 +84,7 @@ export const CLI_TOOL_SPECS = [
82
84
  reason: s("--reason"),
83
85
  ...JEV_ADVICE,
84
86
  },
85
- omitted: {
87
+ omitted: { ...LOCATION_FLAGS,
86
88
  "--dir": OMIT.storeDir,
87
89
  "--accept-weak": OMIT.acceptWeak,
88
90
  "--full": OMIT.reviewRendering,
@@ -98,20 +100,20 @@ export const CLI_TOOL_SPECS = [
98
100
  description: "`jevitate persona review <id> --json` (#433): read-only. A catalog persona's review sheet — description, account role, session presence (never a credential), the jobs it serves, the Journeys linked to it, its approval state (draft / approved / stale = needs re-review), the pre-approval findings, and its content hash. " +
99
101
  "readiness: true adds the #434 Readiness section (deterministic checks + INCOSE GtWR rule findings; with real: true and a judgment key, advisory Jev questions with probabilities). The #435 catalog analysis of its pairs is always included (classified by Jev with real: true). " +
100
102
  "Approving a persona is a person's act on the CLI (`jevitate persona approve`): there is no MCP tool for it.",
101
- command: { path: "persona review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
103
+ command: { path: "persona review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
102
104
  },
103
105
  {
104
106
  name: "review_job",
105
107
  description: "`jevitate job review <id> --json` (#433): read-only. A catalog job's review sheet — its job story (\"When …, I want to …, so I can ….\"), its personas and which of them have a promoted Journey for it, the gaps, its Journeys, its approval state (draft / approved / stale = needs re-review), the pre-approval findings, and its content hash. " +
106
108
  "readiness: true adds the #434 Readiness section (deterministic checks + INCOSE GtWR rule findings; with real: true and a judgment key, advisory Jev questions with probabilities). The #435 catalog analysis of its pairs is always included (classified by Jev with real: true). " +
107
109
  "Approving a job is a person's act on the CLI (`jevitate job approve`): there is no MCP tool for it.",
108
- command: { path: "job review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
110
+ command: { path: "job review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
109
111
  },
110
112
  {
111
113
  name: "draft_job_outcomes",
112
114
  description: "`jevitate job draft-outcomes <jobId> --json` (#465): draft 1–3 desired outcomes (count, default 3) for a catalog job with the generation model (real: true live, or fakeAi: true deterministic — exactly one) and write them into its jobs file marked provenance ai_draft for the team to review. " +
113
115
  "It NEVER approves: an approved job becomes stale (needs re-review), and approving stays a person's act on the CLI (`jevitate job approve`) — there is no MCP tool for it.",
114
- command: { path: "job draft-outcomes", params: { jobId: pos(), count: n("--count"), ...AI }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
116
+ command: { path: "job draft-outcomes", params: { jobId: pos(), count: n("--count"), ...AI }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG } },
115
117
  },
116
118
  {
117
119
  name: "catalog_status",
@@ -122,7 +124,7 @@ export const CLI_TOOL_SPECS = [
122
124
  command: {
123
125
  path: "catalog status",
124
126
  params: { requireApprovals: b("--require-approvals"), allowChannels: s("--allow-channels"), strict: b("--strict") },
125
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
127
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
126
128
  },
127
129
  },
128
130
  {
@@ -140,14 +142,14 @@ export const CLI_TOOL_SPECS = [
140
142
  trigger: s("--trigger"),
141
143
  outcome: s("--outcome"),
142
144
  },
143
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
145
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
144
146
  },
145
147
  },
146
148
  {
147
149
  name: "analyze_catalog",
148
150
  description: "`jevitate catalog analyze --json` (#435): read-only and advisory. Problems BETWEEN catalog items, grouped by INCOSE GtWR set characteristic (complete, consistent, feasible, comprehensible, able to be validated, correct): candidate pairs chosen by code (shared persona or trigger/outcome terms, opposing writes on one resource, same role), each with why it was paired and — with real: true — Jev's typed classification (compatible | duplicate | overlapping | conflicting | dependent, with a probability), " +
149
151
  "completeness gaps, and update advice (stale approvals, Journeys whose last mutation proof fails). Pairs over maxPairs are listed as overflow, never dropped. It never changes the catalog and never gates.",
150
- command: { path: "catalog analyze", params: { ...JEV_ADVICE, maxPairs: n("--max-pairs") }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, ...JSON_FLAG } },
152
+ command: { path: "catalog analyze", params: { ...JEV_ADVICE, maxPairs: n("--max-pairs") }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, ...JSON_FLAG } },
151
153
  },
152
154
  {
153
155
  name: "export_catalog_bundle",
@@ -162,7 +164,7 @@ export const CLI_TOOL_SPECS = [
162
164
  check: { kind: "path[]", flag: "--check" },
163
165
  productName: s("--product-name"),
164
166
  },
165
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
167
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
166
168
  },
167
169
  },
168
170
  {
@@ -182,20 +184,20 @@ export const CLI_TOOL_SPECS = [
182
184
  command: {
183
185
  path: "journey review",
184
186
  params: { id: { kind: "string", positional: true }, stale: b("--stale"), readiness: b("--readiness"), strict: b("--strict"), ...JEV_ADVICE },
185
- omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.reviewRendering, "--full": OMIT.reviewRendering, "--out": OMIT.reviewRendering, ...JSON_FLAG },
187
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--markdown": OMIT.reviewRendering, "--full": OMIT.reviewRendering, "--out": OMIT.reviewRendering, ...JSON_FLAG },
186
188
  },
187
189
  },
188
190
  {
189
191
  name: "lint_journey",
190
192
  description: "`jevitate journey lint <id>`: the assertion-strength lint — the assertions that cannot prove the Journey's outcome (a write with no asserted effect, visibility-only claims, nothing after the last write, …). promote_journey refuses a Journey with any error finding. " +
191
193
  "#487: fix: true stamps the step id of each anchor that references a step by number only and writes the Journey (#507: on a promoted Journey its approval goes stale; the result carries needsReapproval and reapproveCommand), reporting what was stamped.",
192
- command: { path: "journey lint", params: { id: pos(), fix: b("--fix") }, omitted: { "--dir": OMIT.storeDir, "--sarif": OMIT.storeDir, ...JSON_FLAG } },
194
+ command: { path: "journey lint", params: { id: pos(), fix: b("--fix") }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--sarif": OMIT.storeDir, ...JSON_FLAG } },
193
195
  },
194
196
  {
195
197
  name: "journey_anchors",
196
198
  description: "`jevitate journey anchors <id>` (#293): a Journey's named anchors — states worth exploring from, each with the step it follows and its suggested adversarial probes. Branch a mission off one with run_exploration fromJourney + atStep. " +
197
199
  "#487: suggest: true instead proposes anchors where the recorded flow changes state (a new page, a form that became valid, a completed write) — advisory, writes nothing; accept one with journey_anchor_add.",
198
- command: { path: "journey anchors", params: { id: pos(), suggest: b("--suggest") }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
200
+ command: { path: "journey anchors", params: { id: pos(), suggest: b("--suggest") }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG } },
199
201
  },
200
202
  {
201
203
  name: "journey_anchor_add",
@@ -204,13 +206,13 @@ export const CLI_TOOL_SPECS = [
204
206
  command: {
205
207
  path: "journey anchor add",
206
208
  params: { journeyId: pos(), name: s("--name", { required: true }), step: s("--step", { required: true }), description: s("--description"), probe: many("--probe"), region: s("--region") },
207
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
209
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
208
210
  },
209
211
  },
210
212
  {
211
213
  name: "journey_anchor_remove",
212
214
  description: "`jevitate journey anchor remove <journeyId>` (#487): remove the named anchor from a Journey; returns the anchor lint issues that remain. On a promoted Journey (#507) the approval goes stale: it stays promoted, the old approval is kept for the review diff, and the result carries needsReapproval: true and reapproveCommand (jevitate journey promote <id> --reviewed-hash <new review hash>), which only a person runs.",
213
- command: { path: "journey anchor remove", params: { journeyId: pos(), name: s("--name", { required: true }) }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
215
+ command: { path: "journey anchor remove", params: { journeyId: pos(), name: s("--name", { required: true }) }, omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG } },
214
216
  },
215
217
  {
216
218
  name: "journey_link",
@@ -220,7 +222,7 @@ export const CLI_TOOL_SPECS = [
220
222
  command: {
221
223
  path: "journey link",
222
224
  params: { id: pos(), job: s("--job"), persona: s("--persona"), unlinkJob: b("--unlink-job"), unlinkPersona: b("--unlink-persona") },
223
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
225
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
224
226
  },
225
227
  },
226
228
  {
@@ -230,7 +232,7 @@ export const CLI_TOOL_SPECS = [
230
232
  command: {
231
233
  path: "journey annotate",
232
234
  params: { ...EXTENSION, id: pos(), approve: b("--approve"), params: { kind: "params", flag: "--param" }, storageState: session("--storage-state"), fixtures: path("--fixtures"), fixtureIdentity: FIXTURE_IDENTITY, screenshots: { kind: "screenshots", flag: "--screenshots" }, actionDeltas: b("--action-deltas"), ...ENVIRONMENT, ...EMULATION, ...AI },
233
- omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
235
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
234
236
  },
235
237
  },
236
238
  {
@@ -254,7 +256,7 @@ export const CLI_TOOL_SPECS = [
254
256
  ...EMULATION,
255
257
  ...DEMO_SHOW,
256
258
  },
257
- omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
259
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
258
260
  },
259
261
  },
260
262
  {
@@ -272,7 +274,41 @@ export const CLI_TOOL_SPECS = [
272
274
  fixtureIdentity: FIXTURE_IDENTITY,
273
275
  ...ENVIRONMENT,
274
276
  },
275
- omitted: { "--dir": OMIT.storeDir, "--allow": OMIT.mcpOrigins, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
277
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, "--allow": OMIT.mcpOrigins, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
278
+ },
279
+ },
280
+ {
281
+ name: "journey_readiness",
282
+ description: "`jevitate journey readiness <id> [--with <toId>] --json` (#581): one readiness receipt for a Journey or a linked pair — lint, schema, the #582 handoff, the #583 boundary, strict review, annotations, catalog links/approvals, the recorded mutation proof (fresh only while bound to the current review hash) and promotion, each pass / fail / inconclusive / stale / not-run / awaiting-human. mode: report (default; no browser, sends nothing) | replay (baseline run, or the chain for a pair with requests) | prove (replay plus verify --mutate). replay/prove need env or baseUrl, refuse an environment flagged production and refuse missing params by name, all before any browser. verdict: technically-ready (exit 0) | blocked (1) | inconclusive / incomplete (2); a passing replay never hides an inconclusive proof. Approvals are listed under awaitingHuman and never acted on; the receipt carries no param value, page text or secret.",
283
+ command: {
284
+ path: "journey readiness",
285
+ params: {
286
+ id: pos(),
287
+ with: s("--with"),
288
+ mode: s("--mode", { enum: ["report", "replay", "prove"] }),
289
+ params: { kind: "params", flag: "--param" },
290
+ requests: path("--requests"),
291
+ storageState: session("--storage-state"),
292
+ fixtures: path("--fixtures"),
293
+ fixtureIdentity: FIXTURE_IDENTITY,
294
+ ...EXTENSION,
295
+ ...ENVIRONMENT,
296
+ },
297
+ omitted: { ...LOCATION_FLAGS, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
298
+ },
299
+ },
300
+ {
301
+ name: "journey_bundle",
302
+ description: "`jevitate journey bundle <id> [--with <toId>] --out <dir> --json` (#584): write a local human review bundle (bundle.md + manifest.json) for a Journey or a linked pair from a report-mode readiness — verdict and blockers first, contracts, boundary, side effects, hashes, distinct approval states and the ordered human-only commands (promote carries the review hash only when technically ready). check: re-derive an existing bundle's hashes; a changed Journey or catalog entry fails closed with E_BUNDLE_STALE. out is a directory inside the project. It never uploads, approves or promotes.",
303
+ command: {
304
+ path: "journey bundle",
305
+ params: {
306
+ id: { kind: "string", positional: true },
307
+ with: s("--with"),
308
+ out: { kind: "project-path", flag: "--out" },
309
+ check: path("--check"),
310
+ },
311
+ omitted: { ...LOCATION_FLAGS, ...JSON_FLAG },
276
312
  },
277
313
  },
278
314
  {
@@ -289,7 +325,7 @@ export const CLI_TOOL_SPECS = [
289
325
  ...EMULATION,
290
326
  ...ENVIRONMENT,
291
327
  },
292
- omitted: {
328
+ omitted: { ...LOCATION_FLAGS,
293
329
  "--allow-draft": "#580: over MCP a chain runs promoted Journeys only, as run_journey does; running drafts is the operator's CLI call",
294
330
  "--dir": OMIT.storeDir,
295
331
  "--allow": OMIT.mcpOrigins,
@@ -304,7 +340,7 @@ export const CLI_TOOL_SPECS = [
304
340
  command: {
305
341
  path: "journey publish",
306
342
  params: { id: pos(), to: s("--to", { required: true }), declareOrigin: many("--declare-origin"), as: s("--as") },
307
- omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
343
+ omitted: { ...LOCATION_FLAGS, "--dir": OMIT.storeDir, ...JSON_FLAG },
308
344
  },
309
345
  },
310
346
  {
@@ -607,7 +643,7 @@ export const CLI_TOOL_SPECS = [
607
643
  ...EMULATION,
608
644
  ...JEV_AI,
609
645
  },
610
- omitted: {
646
+ omitted: { ...LOCATION_FLAGS,
611
647
  "--journeys-dir": OMIT.storeDir,
612
648
  ...HOOK_FLAGS,
613
649
  ...BROWSER_FLAGS,