@jevitate/cli 0.6.0 → 0.8.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 (250) hide show
  1. package/dist/ai-cli.d.ts +3 -1
  2. package/dist/ai-cli.js +60 -16
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/approval-provenance.d.ts +120 -0
  5. package/dist/approval-provenance.js +300 -0
  6. package/dist/approval-provenance.js.map +1 -0
  7. package/dist/author-journey-cli.js +11 -18
  8. package/dist/author-journey-cli.js.map +1 -1
  9. package/dist/bin.js +29012 -20685
  10. package/dist/build-info.generated.js +2 -2
  11. package/dist/builtin-analyzers.d.ts +7 -0
  12. package/dist/builtin-analyzers.js +19 -0
  13. package/dist/builtin-analyzers.js.map +1 -0
  14. package/dist/campaign-cli.d.ts +6 -0
  15. package/dist/campaign-cli.js +9 -4
  16. package/dist/campaign-cli.js.map +1 -1
  17. package/dist/catalog-analysis.d.ts +70 -0
  18. package/dist/catalog-analysis.js +507 -0
  19. package/dist/catalog-analysis.js.map +1 -0
  20. package/dist/catalog-api.d.ts +73 -0
  21. package/dist/catalog-api.js +97 -0
  22. package/dist/catalog-api.js.map +1 -0
  23. package/dist/catalog-cli.d.ts +12 -0
  24. package/dist/catalog-cli.js +224 -0
  25. package/dist/catalog-cli.js.map +1 -0
  26. package/dist/catalog-review.d.ts +29 -0
  27. package/dist/catalog-review.js +290 -0
  28. package/dist/catalog-review.js.map +1 -0
  29. package/dist/catalog.d.ts +133 -0
  30. package/dist/catalog.js +352 -0
  31. package/dist/catalog.js.map +1 -0
  32. package/dist/check-api.js +24 -2
  33. package/dist/check-api.js.map +1 -1
  34. package/dist/check-cli.d.ts +3 -0
  35. package/dist/check-cli.js +18 -4
  36. package/dist/check-cli.js.map +1 -1
  37. package/dist/check-execute.js +25 -9
  38. package/dist/check-execute.js.map +1 -1
  39. package/dist/check-plan.js +4 -1
  40. package/dist/check-plan.js.map +1 -1
  41. package/dist/check-suite.js +6 -3
  42. package/dist/check-suite.js.map +1 -1
  43. package/dist/check-types.d.ts +12 -1
  44. package/dist/check-types.js.map +1 -1
  45. package/dist/cli-output.js +86 -4
  46. package/dist/cli-output.js.map +1 -1
  47. package/dist/cli-shared.d.ts +22 -2
  48. package/dist/cli-shared.js +34 -5
  49. package/dist/cli-shared.js.map +1 -1
  50. package/dist/demo-aspect-api.d.ts +21 -5
  51. package/dist/demo-aspect-api.js +30 -1
  52. package/dist/demo-aspect-api.js.map +1 -1
  53. package/dist/demo-aspect-cli.js +64 -5
  54. package/dist/demo-aspect-cli.js.map +1 -1
  55. package/dist/environments.js +6 -1
  56. package/dist/environments.js.map +1 -1
  57. package/dist/exit-codes.js +4 -0
  58. package/dist/exit-codes.js.map +1 -1
  59. package/dist/explore-adversarial.d.ts +3 -1
  60. package/dist/explore-adversarial.js +3 -3
  61. package/dist/explore-adversarial.js.map +1 -1
  62. package/dist/explore-author.js +5 -2
  63. package/dist/explore-author.js.map +1 -1
  64. package/dist/explore-cli.js +162 -13
  65. package/dist/explore-cli.js.map +1 -1
  66. package/dist/explore-coverage.d.ts +6 -2
  67. package/dist/explore-coverage.js +5 -4
  68. package/dist/explore-coverage.js.map +1 -1
  69. package/dist/explore-feature.d.ts +3 -1
  70. package/dist/explore-feature.js +2 -2
  71. package/dist/explore-feature.js.map +1 -1
  72. package/dist/explore-goal.d.ts +37 -6
  73. package/dist/explore-goal.js +70 -52
  74. package/dist/explore-goal.js.map +1 -1
  75. package/dist/explore-shared.d.ts +12 -7
  76. package/dist/explore-shared.js +9 -1
  77. package/dist/explore-shared.js.map +1 -1
  78. package/dist/goal-run-flags.d.ts +2 -0
  79. package/dist/goal-run-flags.js +8 -1
  80. package/dist/goal-run-flags.js.map +1 -1
  81. package/dist/http-5xx-outcome.d.ts +8 -3
  82. package/dist/http-5xx-outcome.js +5 -15
  83. package/dist/http-5xx-outcome.js.map +1 -1
  84. package/dist/init-cli.d.ts +7 -0
  85. package/dist/init-cli.js +79 -9
  86. package/dist/init-cli.js.map +1 -1
  87. package/dist/init-codeowners.d.ts +39 -0
  88. package/dist/init-codeowners.js +91 -0
  89. package/dist/init-codeowners.js.map +1 -0
  90. package/dist/init-keys.d.ts +3 -1
  91. package/dist/init-keys.js +20 -8
  92. package/dist/init-keys.js.map +1 -1
  93. package/dist/init-skills.d.ts +85 -7
  94. package/dist/init-skills.js +303 -36
  95. package/dist/init-skills.js.map +1 -1
  96. package/dist/jev-advisor.d.ts +72 -0
  97. package/dist/jev-advisor.js +172 -0
  98. package/dist/jev-advisor.js.map +1 -0
  99. package/dist/journey-api.d.ts +104 -5
  100. package/dist/journey-api.js +165 -23
  101. package/dist/journey-api.js.map +1 -1
  102. package/dist/journey-cli.d.ts +1 -1
  103. package/dist/journey-cli.js +320 -13
  104. package/dist/journey-cli.js.map +1 -1
  105. package/dist/journey-demo-api.d.ts +7 -1
  106. package/dist/journey-demo-api.js +8 -3
  107. package/dist/journey-demo-api.js.map +1 -1
  108. package/dist/journey-demo-cli.js +3 -0
  109. package/dist/journey-demo-cli.js.map +1 -1
  110. package/dist/journey-lint-sarif.d.ts +19 -0
  111. package/dist/journey-lint-sarif.js +48 -0
  112. package/dist/journey-lint-sarif.js.map +1 -0
  113. package/dist/journey-network-checks.d.ts +45 -9
  114. package/dist/journey-network-checks.js +117 -30
  115. package/dist/journey-network-checks.js.map +1 -1
  116. package/dist/journey-prefix.d.ts +24 -15
  117. package/dist/journey-prefix.js +53 -7
  118. package/dist/journey-prefix.js.map +1 -1
  119. package/dist/journey-review-api.d.ts +19 -0
  120. package/dist/journey-review-api.js +46 -0
  121. package/dist/journey-review-api.js.map +1 -0
  122. package/dist/journey-review-store.d.ts +16 -0
  123. package/dist/journey-review-store.js +95 -0
  124. package/dist/journey-review-store.js.map +1 -0
  125. package/dist/journey-review.d.ts +47 -0
  126. package/dist/journey-review.js +499 -0
  127. package/dist/journey-review.js.map +1 -0
  128. package/dist/journey-verify.d.ts +61 -0
  129. package/dist/journey-verify.js +144 -0
  130. package/dist/journey-verify.js.map +1 -0
  131. package/dist/key-report.d.ts +20 -5
  132. package/dist/key-report.js +32 -9
  133. package/dist/key-report.js.map +1 -1
  134. package/dist/kill-signal.js +10 -2
  135. package/dist/kill-signal.js.map +1 -1
  136. package/dist/load-api.js +9 -3
  137. package/dist/load-api.js.map +1 -1
  138. package/dist/load-cli.js +4 -2
  139. package/dist/load-cli.js.map +1 -1
  140. package/dist/log-classes.d.ts +73 -0
  141. package/dist/log-classes.js +167 -0
  142. package/dist/log-classes.js.map +1 -0
  143. package/dist/log-correlation.d.ts +29 -10
  144. package/dist/log-correlation.js +44 -21
  145. package/dist/log-correlation.js.map +1 -1
  146. package/dist/login-cli.d.ts +15 -0
  147. package/dist/login-cli.js +116 -0
  148. package/dist/login-cli.js.map +1 -0
  149. package/dist/logs-cli.js +3 -1
  150. package/dist/logs-cli.js.map +1 -1
  151. package/dist/mcp-api.d.ts +1 -0
  152. package/dist/mcp-api.js +61 -12
  153. package/dist/mcp-api.js.map +1 -1
  154. package/dist/mcp-cli-runner.d.ts +2 -0
  155. package/dist/mcp-cli-runner.js +3 -1
  156. package/dist/mcp-cli-runner.js.map +1 -1
  157. package/dist/mcp-cli-tools.d.ts +6 -0
  158. package/dist/mcp-cli-tools.js +182 -23
  159. package/dist/mcp-cli-tools.js.map +1 -1
  160. package/dist/mission-cli.js +8 -4
  161. package/dist/mission-cli.js.map +1 -1
  162. package/dist/mission-journal.d.ts +4 -1
  163. package/dist/mission-journal.js +9 -3
  164. package/dist/mission-journal.js.map +1 -1
  165. package/dist/mission-queue-cli.js +21 -2
  166. package/dist/mission-queue-cli.js.map +1 -1
  167. package/dist/mission-queue-runner.d.ts +6 -0
  168. package/dist/mission-queue-runner.js +33 -3
  169. package/dist/mission-queue-runner.js.map +1 -1
  170. package/dist/multi-run-cli.d.ts +7 -1
  171. package/dist/multi-run-cli.js +10 -3
  172. package/dist/multi-run-cli.js.map +1 -1
  173. package/dist/multi-run.d.ts +38 -3
  174. package/dist/multi-run.js +115 -23
  175. package/dist/multi-run.js.map +1 -1
  176. package/dist/persona-login.d.ts +199 -0
  177. package/dist/persona-login.js +574 -0
  178. package/dist/persona-login.js.map +1 -0
  179. package/dist/pre-approval.d.ts +98 -0
  180. package/dist/pre-approval.js +175 -0
  181. package/dist/pre-approval.js.map +1 -0
  182. package/dist/program.js +10 -0
  183. package/dist/program.js.map +1 -1
  184. package/dist/project-dir.d.ts +2 -1
  185. package/dist/project-dir.js +3 -1
  186. package/dist/project-dir.js.map +1 -1
  187. package/dist/promotions.d.ts +15 -0
  188. package/dist/promotions.js +52 -0
  189. package/dist/promotions.js.map +1 -0
  190. package/dist/readiness.d.ts +29 -0
  191. package/dist/readiness.js +291 -0
  192. package/dist/readiness.js.map +1 -0
  193. package/dist/regression-cli.js +4 -2
  194. package/dist/regression-cli.js.map +1 -1
  195. package/dist/report-api.d.ts +24 -2
  196. package/dist/report-api.js +33 -5
  197. package/dist/report-api.js.map +1 -1
  198. package/dist/report-cli.js +8 -1
  199. package/dist/report-cli.js.map +1 -1
  200. package/dist/result-schema.d.ts +12 -0
  201. package/dist/result-schema.js +8 -0
  202. package/dist/result-schema.js.map +1 -1
  203. package/dist/run-index.d.ts +4 -2
  204. package/dist/run-index.js +3 -1
  205. package/dist/run-index.js.map +1 -1
  206. package/dist/run-key-preflight.d.ts +2 -1
  207. package/dist/run-key-preflight.js +3 -2
  208. package/dist/run-key-preflight.js.map +1 -1
  209. package/dist/run-metadata.d.ts +26 -0
  210. package/dist/run-metadata.js +41 -0
  211. package/dist/run-metadata.js.map +1 -0
  212. package/dist/run-tags-cli.d.ts +12 -0
  213. package/dist/run-tags-cli.js +35 -0
  214. package/dist/run-tags-cli.js.map +1 -0
  215. package/dist/self-heal-adapter.js +3 -1
  216. package/dist/self-heal-adapter.js.map +1 -1
  217. package/dist/site-cli.d.ts +1 -1
  218. package/dist/site-cli.js +24 -1
  219. package/dist/site-cli.js.map +1 -1
  220. package/dist/source-cli.js +4 -2
  221. package/dist/source-cli.js.map +1 -1
  222. package/dist/source-run-api.js +17 -7
  223. package/dist/source-run-api.js.map +1 -1
  224. package/dist/suite-explore-options.d.ts +14 -0
  225. package/dist/suite-explore-options.js +7 -0
  226. package/dist/suite-explore-options.js.map +1 -1
  227. package/dist/sweep-api.d.ts +266 -0
  228. package/dist/sweep-api.js +828 -0
  229. package/dist/sweep-api.js.map +1 -0
  230. package/dist/sweep-cli.d.ts +9 -0
  231. package/dist/sweep-cli.js +115 -0
  232. package/dist/sweep-cli.js.map +1 -0
  233. package/dist/target-config.d.ts +5 -2
  234. package/dist/target-config.js +15 -0
  235. package/dist/target-config.js.map +1 -1
  236. package/dist/usability-capture.js +6 -0
  237. package/dist/usability-capture.js.map +1 -1
  238. package/dist/ux-cli.js +3 -1
  239. package/dist/ux-cli.js.map +1 -1
  240. package/dist/ux-usability.d.ts +9 -3
  241. package/dist/ux-usability.js +6 -4
  242. package/dist/ux-usability.js.map +1 -1
  243. package/dist/verify-fix-cli.js +4 -2
  244. package/dist/verify-fix-cli.js.map +1 -1
  245. package/package.json +13 -13
  246. package/skills/jevitate-demo/SKILL.md +5 -2
  247. package/skills/jevitate-explore/SKILL.md +6 -2
  248. package/skills/jevitate-getting-started/SKILL.md +12 -0
  249. package/skills/jevitate-run-journey/SKILL.md +17 -4
  250. package/skills/jevitate-test-campaign/SKILL.md +26 -5
@@ -1,5 +1,6 @@
1
1
  import { CommanderError } from "commander";
2
2
  import { EXIT_CODES } from "./exit-codes.js";
3
+ import { runAsMcpInvocation } from "./approval-provenance.js";
3
4
  function configureTree(cmd, write, discard) {
4
5
  cmd.exitOverride();
5
6
  cmd.configureOutput({ writeOut: write, writeErr: discard, outputError: discard });
@@ -18,7 +19,8 @@ export function makeInProcessCliRunner(build) {
18
19
  const saved = process.exitCode;
19
20
  process.exitCode = undefined;
20
21
  try {
21
- await program.parseAsync([...argv], { from: "user" });
22
+ // #437: an approval made inside an MCP tool call is recorded as channel `mcp` (an agent's).
23
+ await runAsMcpInvocation(() => program.parseAsync([...argv], { from: "user" }));
22
24
  const code = process.exitCode;
23
25
  return { stdout, exitCode: code === undefined ? 0 : Number(code) };
24
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-cli-runner.js","sourceRoot":"","sources":["../src/mcp-cli-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-cli-runner.js","sourceRoot":"","sources":["../src/mcp-cli-runner.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,12 @@ export declare const OMIT: {
98
98
  readonly watch: "a watch loop never returns: MCP drains once (call again to drain more)";
99
99
  readonly branchParams: "#293: a branch-point finding replays through its Journey prefix with the params its result recorded (non-secret ones); a secret param is re-supplied by the operator on the CLI, never sent as an MCP argument";
100
100
  readonly tou: "accepting a third-party source's Terms of Use is a person's decision (like approve_action): MCP can add, pull and run a source, never accept for them";
101
+ readonly acceptWeak: "#401: promoting a Journey whose assertions cannot prove its outcome is a reviewer's waiver (recorded on the Journey): a person's decision on the CLI, never a request's";
102
+ readonly reviewSheet: "#432: a review sheet FILE is what a person read on their screen; over MCP the same binding is the reviewedHash argument (the sheet's content hash from review_journey)";
103
+ readonly acceptFindings: "#433: approving despite pre-approval findings that need an acknowledgment (conflicts, broken links, …) is the approver's own judgment, recorded with the approval: a person's decision on the CLI (like --accept-weak), never a request's";
104
+ readonly catalogRendering: "#433/#435: review_persona / review_job / catalog_status / analyze_catalog return the schema-checked JSON; the Markdown/text renderings and writing them to a file are for people at the CLI";
105
+ readonly reviewRendering: "#432: review_journey returns the schema-checked JSON sheet; the Markdown/text renderings and writing them to a file are for people at the CLI";
106
+ readonly nonInteractiveApproval: "#437: the scripted-setup escape hatch for a CLI approval is the operator's choice, never a request's: an MCP approval needs no hatch — it is always recorded with provenance channel `mcp` (an agent's approval), which `check --require-approvals` fails unless the operator allows `mcp`";
101
107
  readonly hostLoad: "#205: starting a browser run on a STARVED host (overriding E_HOST_STARVED) can take the machine other people's work runs on down with it: the operator's call, never a request's";
102
108
  };
103
109
  export declare const CLI_TOOL_SPECS: readonly CliToolSpec[];
@@ -14,11 +14,19 @@ export const OMIT = {
14
14
  watch: "a watch loop never returns: MCP drains once (call again to drain more)",
15
15
  branchParams: "#293: a branch-point finding replays through its Journey prefix with the params its result recorded (non-secret ones); a secret param is re-supplied by the operator on the CLI, never sent as an MCP argument",
16
16
  tou: "accepting a third-party source's Terms of Use is a person's decision (like approve_action): MCP can add, pull and run a source, never accept for them",
17
+ acceptWeak: "#401: promoting a Journey whose assertions cannot prove its outcome is a reviewer's waiver (recorded on the Journey): a person's decision on the CLI, never a request's",
18
+ reviewSheet: "#432: a review sheet FILE is what a person read on their screen; over MCP the same binding is the reviewedHash argument (the sheet's content hash from review_journey)",
19
+ acceptFindings: "#433: approving despite pre-approval findings that need an acknowledgment (conflicts, broken links, …) is the approver's own judgment, recorded with the approval: a person's decision on the CLI (like --accept-weak), never a request's",
20
+ catalogRendering: "#433/#435: review_persona / review_job / catalog_status / analyze_catalog return the schema-checked JSON; the Markdown/text renderings and writing them to a file are for people at the CLI",
21
+ reviewRendering: "#432: review_journey returns the schema-checked JSON sheet; the Markdown/text renderings and writing them to a file are for people at the CLI",
22
+ nonInteractiveApproval: "#437: the scripted-setup escape hatch for a CLI approval is the operator's choice, never a request's: an MCP approval needs no hatch — it is always recorded with provenance channel `mcp` (an agent's approval), which `check --require-approvals` fails unless the operator allows `mcp`",
17
23
  hostLoad: "#205: starting a browser run on a STARVED host (overriding E_HOST_STARVED) can take the machine other people's work runs on down with it: the operator's call, never a request's",
18
24
  };
19
25
  const HOOK_FLAGS = { "--before": OMIT.hooks, "--after": OMIT.hooks, "--allow-shell-hooks": OMIT.hooks, "--hook-timeout-ms": OMIT.hooks };
20
26
  const BROWSER_FLAGS = { "--browser-executable": OMIT.browserBin, "--browser-channel": OMIT.browserBin, "--browser-arg": OMIT.browserBin, "--ignore-host-load": OMIT.hostLoad };
21
27
  const JSON_FLAG = { "--json": OMIT.json };
28
+ /** #426: `--tag key=value` → a `tags` object (`{"feature": "checkout"}`); keys/values validated by the command. */
29
+ const TAGS = { kind: "params", flag: "--tag" };
22
30
  // ── Param helpers ─────────────────────────────────────────────────────────────────────────────
23
31
  const s = (flag, extra = {}) => ({ kind: "string", flag, ...extra });
24
32
  const n = (flag, extra = {}) => ({ kind: "integer", flag, ...extra });
@@ -40,6 +48,10 @@ const EXTENSION = {
40
48
  const DEMO_SHOW = { headed: b("--headed"), slowMo: n("--slow-mo") };
41
49
  const ENVIRONMENT = { env: s("--env"), baseUrl: s("--base-url") };
42
50
  const AI = { real: b("--real"), fakeAi: b("--fake-ai") };
51
+ /** #429: commands that build the live Jev gateway also take the Jev provider (typesafe | openrouter). */
52
+ const JEV_AI = { ...AI, jevProvider: s("--jev-provider", { enum: ["typesafe", "openrouter"] }) };
53
+ /** #434/#435: the advisory Jev layer of a review sheet / approval / catalog analysis (judgment only, cached by content hash). */
54
+ const JEV_ADVICE = { real: b("--real"), jevProvider: s("--jev-provider", { enum: ["typesafe", "openrouter"] }) };
43
55
  /** #243: `name=<storageState>` identities a fixture step authenticates as — each path confined as a session. */
44
56
  const FIXTURE_IDENTITY = { kind: "named-sessions", flag: "--fixture-identity" };
45
57
  // ── The tools ─────────────────────────────────────────────────────────────────────────────────
@@ -51,8 +63,67 @@ export const CLI_TOOL_SPECS = [
51
63
  },
52
64
  {
53
65
  name: "promote_journey",
54
- description: "`jevitate journey promote <id>`: promote a local Journey so it becomes discoverable (find_capabilities) and runnable (run_journey).",
55
- command: { path: "journey promote", params: { id: pos() }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
66
+ description: "`jevitate journey promote <id>`: promote a local Journey so it becomes discoverable (find_capabilities) and runnable (run_journey). " +
67
+ "#437: an approval made here is recorded as an AGENT's approval (approval.provenance.channel `mcp`, with the agent markers detected) — never as a person's — and `jevitate check --require-approvals` fails it unless `mcp` is an allowed channel. " +
68
+ "A promotion that must count as human sign-off is a person's act at their own terminal: hand it to them (`jevitate journey promote <id>`, typed confirmation).",
69
+ command: {
70
+ path: "journey promote",
71
+ params: { id: pos(), reviewedHash: s("--reviewed-hash"), acceptUnvetted: s("--accept-unvetted"), ...JEV_ADVICE },
72
+ omitted: {
73
+ "--dir": OMIT.storeDir,
74
+ "--accept-weak": OMIT.acceptWeak,
75
+ "--review-sheet": OMIT.reviewSheet,
76
+ "--accept-findings": OMIT.acceptFindings,
77
+ "--non-interactive-approval": OMIT.nonInteractiveApproval,
78
+ ...JSON_FLAG,
79
+ },
80
+ },
81
+ },
82
+ {
83
+ name: "review_persona",
84
+ 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. " +
85
+ "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). " +
86
+ "Approving a persona is a person's act on the CLI (`jevitate persona approve`): there is no MCP tool for it.",
87
+ command: { path: "persona review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
88
+ },
89
+ {
90
+ name: "review_job",
91
+ 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. " +
92
+ "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). " +
93
+ "Approving a job is a person's act on the CLI (`jevitate job approve`): there is no MCP tool for it.",
94
+ command: { path: "job review", params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, "--out": OMIT.catalogRendering, ...JSON_FLAG } },
95
+ },
96
+ {
97
+ name: "catalog_status",
98
+ description: "`jevitate catalog status --json` (#433): read-only. The catalog's coverage — the jobs × personas matrix (which pairs have a promoted Journey), approved jobs with no promoted Journey, Journeys linked to nothing, dangling links, and stale approvals (edited personas/jobs and the Journeys linked to them: needs re-review). " +
99
+ "#437: `approvals` lists every recorded approval and how it was made (provenance channel tty / non-interactive / mcp / ci). requireApprovals (+ allowChannels, default tty): exit 1 when an approval is missing, stale or made over a channel not allowed.",
100
+ command: {
101
+ path: "catalog status",
102
+ params: { requireApprovals: b("--require-approvals"), allowChannels: s("--allow-channels") },
103
+ omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
104
+ },
105
+ },
106
+ {
107
+ name: "analyze_catalog",
108
+ 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), " +
109
+ "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.",
110
+ command: { path: "catalog analyze", params: { ...JEV_ADVICE, maxPairs: n("--max-pairs") }, omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.catalogRendering, ...JSON_FLAG } },
111
+ },
112
+ {
113
+ name: "review_journey",
114
+ description: "`jevitate journey review <id> --json` (#432): read-only. The Journey's review sheet for promotion sign-off — summary (goal, success criteria, missing intent), steps (action, target control, objective, expected result, params), side effects (expected write requests, controls matching safety rules with their rule ids, origins), inputs (parameter and secret names only — never values), proof (end-state checks, per-step assertions, lint, last mutation-proof verdict), the change since its last approval, and its content hash. " +
115
+ "readiness: true adds the #434 Readiness section (links, intent, lint, mutation proof; with real: true and a judgment key, advisory Jev questions with probabilities); the #435 catalog analysis of its pairs is always included. " +
116
+ "Pass that hash as promote_journey reviewedHash to bind an approval to exactly what was reviewed.",
117
+ command: {
118
+ path: "journey review",
119
+ params: { id: pos(), readiness: b("--readiness"), ...JEV_ADVICE },
120
+ omitted: { "--dir": OMIT.storeDir, "--markdown": OMIT.reviewRendering, "--out": OMIT.reviewRendering, ...JSON_FLAG },
121
+ },
122
+ },
123
+ {
124
+ name: "lint_journey",
125
+ 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.",
126
+ command: { path: "journey lint", params: { id: pos() }, omitted: { "--dir": OMIT.storeDir, "--sarif": OMIT.storeDir, ...JSON_FLAG } },
56
127
  },
57
128
  {
58
129
  name: "journey_anchors",
@@ -93,6 +164,24 @@ export const CLI_TOOL_SPECS = [
93
164
  omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
94
165
  },
95
166
  },
167
+ {
168
+ name: "verify_journey",
169
+ description: "`jevitate journey verify <id> --mutate` (#402): prove each assertion can fail. Replays the Journey once (it must pass), then once per mutation — a write step skipped, its write request aborted, a typed value left empty — and reports each assertion as sensitive (failed for the right reason), insensitive (still passed: vacuous), cascade, not-applied or unpaired. Mutations only skip steps or abort the app's own writes; nothing is fabricated. Exit 1 when any paired assertion is insensitive, 2 when nothing could be proven. Set mutate: true.",
170
+ command: {
171
+ path: "journey verify",
172
+ params: {
173
+ id: pos(),
174
+ ...EXTENSION,
175
+ mutate: b("--mutate"),
176
+ params: { kind: "params", flag: "--param" },
177
+ storageState: session("--storage-state"),
178
+ fixtures: path("--fixtures"),
179
+ fixtureIdentity: FIXTURE_IDENTITY,
180
+ ...ENVIRONMENT,
181
+ },
182
+ omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
183
+ },
184
+ },
96
185
  {
97
186
  name: "publish_journey",
98
187
  description: "`jevitate journey publish <id> --to <source>`: publish a promoted Journey into a registered source on a new publish/<id> branch (a PR when gh is available). Secret references only; declared origins must cover its steps.",
@@ -107,7 +196,7 @@ export const CLI_TOOL_SPECS = [
107
196
  description: "`jevitate demo \"<aspect>\"` / `demo create` (#249): explore a NAMED, non-production environment (env, required) toward the aspect, checked by success (required), minimize the path (verified by replay), annotate it and render a DRAFT demo (video, .vtt, guide). Nothing is promoted until approve_demo. Needs real or fakeAi.",
108
197
  command: {
109
198
  path: "demo create",
110
- params: { ...EXTENSION,
199
+ params: { tags: TAGS, ...EXTENSION,
111
200
  aspect: pos(),
112
201
  env: s("--env"),
113
202
  success: s("--success"),
@@ -123,27 +212,40 @@ export const CLI_TOOL_SPECS = [
123
212
  fixtureIdentity: FIXTURE_IDENTITY,
124
213
  ...EMULATION,
125
214
  ...DEMO_SHOW,
126
- ...AI,
215
+ ...JEV_AI,
127
216
  },
128
217
  omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
129
218
  },
130
219
  },
131
220
  {
132
221
  name: "approve_demo",
133
- description: "`jevitate demo approve <id>` (#249): approve a DRAFT demo — renders the final demo (no DRAFT marks) on the environment it was made on, then applies its annotations and promotes the Journey. A replay that no longer works promotes nothing (exit 1).",
222
+ description: "`jevitate demo approve <id>` (#249): approve a DRAFT demo — renders the final demo (no DRAFT marks) on the environment it was made on, then applies its annotations and promotes the Journey. A replay that no longer works promotes nothing (exit 1). " +
223
+ "#437: an approval made here is recorded as an AGENT's approval (approval.provenance.channel `mcp`) — never as a person's — and `jevitate check --require-approvals` fails it unless `mcp` is allowed; human sign-off is the person's `jevitate demo approve <id>` at their own terminal.",
134
224
  command: {
135
225
  path: "demo approve",
136
- params: { ...EXTENSION, id: pos(), out: path("--out"), pace: n("--pace"), storageState: session("--storage-state"), fixtures: path("--fixtures"), fixtureIdentity: FIXTURE_IDENTITY, ...EMULATION, ...DEMO_SHOW },
137
- omitted: { "--dir": OMIT.storeDir, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
226
+ params: {
227
+ ...EXTENSION,
228
+ id: pos(),
229
+ out: path("--out"),
230
+ pace: n("--pace"),
231
+ storageState: session("--storage-state"),
232
+ fixtures: path("--fixtures"),
233
+ fixtureIdentity: FIXTURE_IDENTITY,
234
+ ...EMULATION,
235
+ ...DEMO_SHOW,
236
+ acceptUnvetted: s("--accept-unvetted"),
237
+ ...JEV_ADVICE,
238
+ },
239
+ omitted: { "--dir": OMIT.storeDir, "--accept-findings": OMIT.acceptFindings, "--non-interactive-approval": OMIT.nonInteractiveApproval, ...HOOK_FLAGS, ...BROWSER_FLAGS, ...JSON_FLAG },
138
240
  },
139
241
  },
140
242
  {
141
243
  name: "run_exploration",
142
244
  description: "`jevitate explore` run DIRECTLY (every strategy: goal (default) | coverage | exploratory | adversarial | usability, or feature): drives a real browser on url (which must be on an allow origin) within its budget, and returns the typed result (read later with get_mission_result by its result id). " +
143
- "For a PROMOTED target prefer queue_exploration (queue + poll). Model-driven strategies need real or fakeAi. Media: recordVideo, screenshots, evidenceVideo. Sessions: storageState, persona/actor entries 'name=<storageState path>'.",
245
+ "For a PROMOTED target prefer queue_exploration (queue + poll). Model-driven strategies need real or fakeAi. Media: recordVideo, screenshots, evidenceVideo. Sessions: storageState, persona/actor entries 'name=<storageState path>'; authCheck (off/auto/urlExcludes:/selector:) ends a run on an expired session as auth-expired (inconclusive), re-signing a persona in once when its personas file declares login parameters.",
144
246
  command: {
145
247
  path: "explore",
146
- params: { ...EXTENSION,
248
+ params: { tags: TAGS, ...EXTENSION,
147
249
  url: s("--url"),
148
250
  // #293 journey-anchored exploration: replay a promoted Journey to a step/anchor, then the mission.
149
251
  fromJourney: s("--from-journey"),
@@ -162,12 +264,18 @@ export const CLI_TOOL_SPECS = [
162
264
  scope: s("--scope", { enum: ["app"] }),
163
265
  maxActions: n("--max-actions"),
164
266
  maxDecisions: n("--max-decisions"),
267
+ // #424: the minimum exploration effort (goal strategy).
268
+ minActions: n("--min-actions"),
269
+ minDistinctStates: n("--min-distinct-states"),
165
270
  stallTimeout: n("--stall-timeout"),
166
271
  invariants: { kind: "path[]", flag: "--invariants" },
167
272
  storageState: session("--storage-state"),
168
273
  saveStorageState: session("--save-storage-state"),
169
274
  persona: { kind: "named-sessions", flag: "--persona" },
170
275
  personas: path("--personas"),
276
+ // #427: the pre-flight auth check (off | auto | urlExcludes:<text> | selector:<css>); a persona's
277
+ // `login` refresh reads only the env variable NAMES the operator's personas file declares.
278
+ authCheck: s("--auth-check"),
171
279
  actor: { kind: "named-sessions", flag: "--actor" },
172
280
  fixtures: path("--fixtures"),
173
281
  fixtureIdentity: FIXTURE_IDENTITY,
@@ -188,6 +296,7 @@ export const CLI_TOOL_SPECS = [
188
296
  allowWrite: many("--allow-write"),
189
297
  deny: many("--deny"),
190
298
  paid: many("--paid"),
299
+ allowControl: many("--allow-control"),
191
300
  readRpc: many("--read-rpc"),
192
301
  settleIgnore: many("--settle-ignore"),
193
302
  ignoreNoProgress: many("--ignore-no-progress"),
@@ -211,7 +320,7 @@ export const CLI_TOOL_SPECS = [
211
320
  overlay: b("--no-overlay"),
212
321
  ...EMULATION,
213
322
  ...DEMO_SHOW,
214
- ...AI,
323
+ ...JEV_AI,
215
324
  },
216
325
  omitted: {
217
326
  ...HOOK_FLAGS,
@@ -245,6 +354,7 @@ export const CLI_TOOL_SPECS = [
245
354
  command: {
246
355
  path: "campaign run",
247
356
  params: {
357
+ tags: TAGS,
248
358
  spec: pos("path"),
249
359
  out: path("--out"),
250
360
  // #311: forwarded to every mission, exactly as run_exploration takes them.
@@ -252,11 +362,12 @@ export const CLI_TOOL_SPECS = [
252
362
  allowWrites: b("--allow-writes"),
253
363
  deny: many("--deny"),
254
364
  paid: many("--paid"),
365
+ allowControl: many("--allow-control"),
255
366
  invariants: { kind: "path[]", flag: "--invariants" },
256
367
  recordVideo: { kind: "optional-path", flag: "--record-video" },
257
368
  screenshots: { kind: "screenshots", flag: "--screenshots" },
258
369
  evidenceVideo: b("--evidence-video"),
259
- ...AI,
370
+ ...JEV_AI,
260
371
  },
261
372
  omitted: {
262
373
  "--journeys-dir": OMIT.storeDir,
@@ -276,6 +387,48 @@ export const CLI_TOOL_SPECS = [
276
387
  },
277
388
  },
278
389
  },
390
+ {
391
+ name: "run_sweep",
392
+ description: "`jevitate sweep --targets <file>` (#425): many explore missions — one per target in a .tsv/.json targets file (id, url|route, persona storage state, strategy, goal, tags, and the value-typed explore options run_exploration takes) — " +
393
+ "with bounded concurrency, resumable (resume + out), and ONE sweep.result.json: per-target outcome and depth, defects deduped by fingerprint across targets (one finding, N sightings), environment causes grouped. " +
394
+ "stopOnEnvFailure K stops starting runs when the first K all failed for environment/setup reasons. Every run is tagged target=<id> plus tags. A persona path in the file is confined like a storageState argument. Long-running: bound it with the file and concurrency.",
395
+ command: {
396
+ path: "sweep",
397
+ params: {
398
+ tags: TAGS,
399
+ targets: path("--targets", { required: true }),
400
+ concurrency: n("--concurrency"),
401
+ resume: b("--resume"),
402
+ out: path("--out"),
403
+ stopOnEnvFailure: n("--stop-on-env-failure"),
404
+ ...ENVIRONMENT,
405
+ // Forwarded to every run, exactly as run_exploration / run_campaign take them.
406
+ allowDestructive: b("--allow-destructive"),
407
+ allowWrites: b("--allow-writes"),
408
+ deny: many("--deny"),
409
+ paid: many("--paid"),
410
+ allowControl: many("--allow-control"),
411
+ invariants: { kind: "path[]", flag: "--invariants" },
412
+ recordVideo: { kind: "optional-path", flag: "--record-video" },
413
+ screenshots: { kind: "screenshots", flag: "--screenshots" },
414
+ evidenceVideo: b("--evidence-video"),
415
+ ...JEV_AI,
416
+ },
417
+ omitted: {
418
+ "--allow-log-cmd": OMIT.logCmd,
419
+ "--log-source": OMIT.logCmd,
420
+ "--log-defect": OMIT.logCmd,
421
+ "--log-ignore": OMIT.logCmd,
422
+ "--log-scope": OMIT.logCmd,
423
+ "--log-correlation-header": OMIT.logCmd,
424
+ "--log-id-pattern": OMIT.logCmd,
425
+ "--log-quiet-ok": OMIT.logCmd,
426
+ "--server-log-drain-ms": OMIT.logCmd,
427
+ "--log-triage": OMIT.logTriage,
428
+ ...JSON_FLAG,
429
+ },
430
+ },
431
+ },
279
432
  {
280
433
  name: "author_journey",
281
434
  description: "`jevitate explore-author-journey`: explore url toward goal (checked by success) several takes, and author an UNPROMOTED Journey from the verified path (promote_journey makes it runnable). Each take is run_exploration's goal run (same run-shaping arguments); a not-reached result carries the discovery take's stop reason, checks and result/transcript/Recording paths. Needs real or fakeAi.",
@@ -307,6 +460,7 @@ export const CLI_TOOL_SPECS = [
307
460
  jobWaitMs: n("--job-wait-ms"),
308
461
  deny: many("--deny"),
309
462
  paid: many("--paid"),
463
+ allowControl: many("--allow-control"),
310
464
  allowDestructive: b("--allow-destructive"),
311
465
  dialogs: s("--dialogs", { enum: ["dismiss", "accept"] }),
312
466
  readRpc: many("--read-rpc"),
@@ -317,7 +471,7 @@ export const CLI_TOOL_SPECS = [
317
471
  ignoreNoProgress: many("--ignore-no-progress"),
318
472
  screenshots: { kind: "screenshots", flag: "--screenshots" },
319
473
  ...EMULATION,
320
- ...AI,
474
+ ...JEV_AI,
321
475
  },
322
476
  omitted: {
323
477
  "--journeys-dir": OMIT.storeDir,
@@ -333,10 +487,11 @@ export const CLI_TOOL_SPECS = [
333
487
  },
334
488
  {
335
489
  name: "run_check",
336
- description: "`jevitate check --suite <file>`: the CI regression gate — a suite of Journeys, invariants, goals and missions within a budget; writes JUnit + SARIF + JSON under out. Exit 1 = a gating finding.",
490
+ description: "`jevitate check --suite <file>`: the CI regression gate — a suite of Journeys, invariants, goals and missions within a budget; writes JUnit + SARIF + JSON under out. Exit 1 = a gating finding. " +
491
+ "#437 requireApprovals (+ allowChannels, default tty): also an `approval` finding for each promoted Journey or approved persona/job whose approval is missing, stale or made over a channel not allowed.",
337
492
  command: {
338
493
  path: "check",
339
- params: { ...EXTENSION,
494
+ params: { tags: TAGS, ...EXTENSION,
340
495
  suite: path("--suite", { required: true }),
341
496
  out: path("--out"),
342
497
  jsonOut: path("--json-out"),
@@ -345,7 +500,9 @@ export const CLI_TOOL_SPECS = [
345
500
  baseline: s("--baseline"),
346
501
  changedRoutes: many("--changed-routes"),
347
502
  targetBuild: s("--target-build"),
348
- ...AI,
503
+ requireApprovals: b("--require-approvals"),
504
+ allowChannels: s("--allow-channels"),
505
+ ...JEV_AI,
349
506
  },
350
507
  omitted: { "--baseline-dir": OMIT.storeDir, ...BROWSER_FLAGS, ...JSON_FLAG },
351
508
  },
@@ -355,14 +512,14 @@ export const CLI_TOOL_SPECS = [
355
512
  description: "`jevitate report`: one deduped defect list for a target across every mode and run (+ an optional diff section against a baseline run, tag or `last`).",
356
513
  command: {
357
514
  path: "report",
358
- params: { target: s("--target"), since: s("--since"), baseline: s("--baseline"), out: path("--out") },
515
+ params: { tags: TAGS, target: s("--target"), since: s("--since"), baseline: s("--baseline"), out: path("--out") },
359
516
  omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG },
360
517
  },
361
518
  },
362
519
  {
363
520
  name: "diff_runs",
364
521
  description: "`jevitate diff <runA> <runB>`: classify findings new / resolved / still-present / flaky / not-rerun between two runs (runA = baseline).",
365
- command: { path: "diff", params: { runA: pos(), runB: pos() }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
522
+ command: { path: "diff", params: { tags: TAGS, runA: pos(), runB: pos() }, omitted: { "--dir": OMIT.storeDir, ...JSON_FLAG } },
366
523
  },
367
524
  {
368
525
  name: "baselines",
@@ -392,6 +549,7 @@ export const CLI_TOOL_SPECS = [
392
549
  command: {
393
550
  path: "load run",
394
551
  params: {
552
+ tags: TAGS,
395
553
  journeyId: pos(),
396
554
  ...EXTENSION,
397
555
  authorizedOrigin: many("--authorized-origin"),
@@ -416,7 +574,7 @@ export const CLI_TOOL_SPECS = [
416
574
  description: "`jevitate mission run --once`: drain the missions queue_exploration queued (each through its strategy's runner; results where get_mission_result reads them), then return the drain report. Model-driven missions need real or fakeAi (others stay queued, reported as skipped).",
417
575
  command: {
418
576
  path: "mission run",
419
- params: { ...EXTENSION, ...AI },
577
+ params: { tags: TAGS, ...EXTENSION, ...JEV_AI },
420
578
  omitted: {
421
579
  "--once": "the default: MCP drains what is queued once and returns",
422
580
  "--watch": OMIT.watch,
@@ -503,16 +661,17 @@ export const CLI_TOOL_SPECS = [
503
661
  },
504
662
  run: {
505
663
  path: "regression run",
506
- params: { ...EXTENSION, id: pos(), attempts: n("--attempts"), storageState: session("--storage-state"), ...ENVIRONMENT, ...EMULATION, ...DEMO_SHOW },
664
+ params: { tags: TAGS, ...EXTENSION, id: pos(), attempts: n("--attempts"), storageState: session("--storage-state"), ...ENVIRONMENT, ...EMULATION, ...DEMO_SHOW },
507
665
  omitted: { "--dir": OMIT.storeDir, "--param": OMIT.branchParams, ...BROWSER_FLAGS, ...JSON_FLAG },
508
666
  },
509
667
  },
510
668
  },
511
669
  {
512
670
  name: "site_policy",
513
- description: "`jevitate site policy get | set` and `site simulate`: per-origin pacing, throttles, budgets and quiet hours (run_journey honours them).",
671
+ description: "`jevitate site policy get | set | rules` and `site simulate`: per-origin pacing, throttles, budgets and quiet hours (run_journey honours them); `rules` lists the control safety rules (ids, what they match, whether --allow-control can waive them).",
514
672
  actions: {
515
673
  get: { path: "site policy get", params: { site: pos(), account: s("--account") }, omitted: { "--db": OMIT.storeDir, ...JSON_FLAG } },
674
+ rules: { path: "site policy rules", params: {}, omitted: JSON_FLAG },
516
675
  set: { path: "site policy set", params: { site: pos(), file: path("--file", { required: true }), account: s("--account") }, omitted: { "--db": OMIT.storeDir, ...JSON_FLAG } },
517
676
  simulate: { path: "site simulate", params: { site: pos(), script: path("--script", { required: true }), seed: n("--seed"), account: s("--account") }, omitted: { "--db": OMIT.storeDir, ...JSON_FLAG } },
518
677
  },
@@ -528,7 +687,7 @@ export const CLI_TOOL_SPECS = [
528
687
  remove: { path: "source remove", params: { name: pos() }, omitted: JSON_FLAG },
529
688
  run: {
530
689
  path: "source run",
531
- params: { ...EXTENSION, name: pos(), journeyId: pos(), params: { kind: "params", flag: "--param" }, storageState: session("--storage-state"), ...EMULATION },
690
+ params: { tags: TAGS, ...EXTENSION, name: pos(), journeyId: pos(), params: { kind: "params", flag: "--param" }, storageState: session("--storage-state"), ...EMULATION },
532
691
  omitted: { ...BROWSER_FLAGS, ...JSON_FLAG },
533
692
  },
534
693
  },
@@ -551,7 +710,7 @@ export const CLI_TOOL_SPECS = [
551
710
  maxFindingsPerPage: n("--max-findings-per-page"),
552
711
  product: path("--product"),
553
712
  polish: b("--polish"),
554
- ...AI,
713
+ ...JEV_AI,
555
714
  },
556
715
  omitted: JSON_FLAG,
557
716
  },
@@ -568,7 +727,7 @@ export const CLI_TOOL_SPECS = [
568
727
  {
569
728
  name: "get_ai_status",
570
729
  description: "`jevitate ai status`: which model-gateway credentials each AI feature uses, where each comes from (env or the stored file) and whether its provider accepts it (a live auth check; `verify: false` skips it) — names, sources and verdicts only, never a key value.",
571
- command: { path: "ai status", params: { verify: b("--no-verify") }, omitted: JSON_FLAG },
730
+ command: { path: "ai status", params: { verify: b("--no-verify"), jevProvider: s("--jev-provider", { enum: ["typesafe", "openrouter"] }) }, omitted: JSON_FLAG },
572
731
  },
573
732
  ];
574
733
  // ── Schema + argv ─────────────────────────────────────────────────────────────────────────────