@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.
- package/dist/ai-cli.d.ts +3 -1
- package/dist/ai-cli.js +60 -16
- package/dist/ai-cli.js.map +1 -1
- package/dist/approval-provenance.d.ts +120 -0
- package/dist/approval-provenance.js +300 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +11 -18
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +29012 -20685
- package/dist/build-info.generated.js +2 -2
- package/dist/builtin-analyzers.d.ts +7 -0
- package/dist/builtin-analyzers.js +19 -0
- package/dist/builtin-analyzers.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +9 -4
- package/dist/campaign-cli.js.map +1 -1
- package/dist/catalog-analysis.d.ts +70 -0
- package/dist/catalog-analysis.js +507 -0
- package/dist/catalog-analysis.js.map +1 -0
- package/dist/catalog-api.d.ts +73 -0
- package/dist/catalog-api.js +97 -0
- package/dist/catalog-api.js.map +1 -0
- package/dist/catalog-cli.d.ts +12 -0
- package/dist/catalog-cli.js +224 -0
- package/dist/catalog-cli.js.map +1 -0
- package/dist/catalog-review.d.ts +29 -0
- package/dist/catalog-review.js +290 -0
- package/dist/catalog-review.js.map +1 -0
- package/dist/catalog.d.ts +133 -0
- package/dist/catalog.js +352 -0
- package/dist/catalog.js.map +1 -0
- package/dist/check-api.js +24 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +3 -0
- package/dist/check-cli.js +18 -4
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.js +25 -9
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.js +4 -1
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +6 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/check-types.d.ts +12 -1
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +86 -4
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +22 -2
- package/dist/cli-shared.js +34 -5
- package/dist/cli-shared.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +21 -5
- package/dist/demo-aspect-api.js +30 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +64 -5
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/environments.js +6 -1
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +4 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +3 -3
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.js +5 -2
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +162 -13
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +5 -4
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +2 -2
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +70 -52
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +12 -7
- package/dist/explore-shared.js +9 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/goal-run-flags.d.ts +2 -0
- package/dist/goal-run-flags.js +8 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/http-5xx-outcome.d.ts +8 -3
- package/dist/http-5xx-outcome.js +5 -15
- package/dist/http-5xx-outcome.js.map +1 -1
- package/dist/init-cli.d.ts +7 -0
- package/dist/init-cli.js +79 -9
- package/dist/init-cli.js.map +1 -1
- package/dist/init-codeowners.d.ts +39 -0
- package/dist/init-codeowners.js +91 -0
- package/dist/init-codeowners.js.map +1 -0
- package/dist/init-keys.d.ts +3 -1
- package/dist/init-keys.js +20 -8
- package/dist/init-keys.js.map +1 -1
- package/dist/init-skills.d.ts +85 -7
- package/dist/init-skills.js +303 -36
- package/dist/init-skills.js.map +1 -1
- package/dist/jev-advisor.d.ts +72 -0
- package/dist/jev-advisor.js +172 -0
- package/dist/jev-advisor.js.map +1 -0
- package/dist/journey-api.d.ts +104 -5
- package/dist/journey-api.js +165 -23
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +320 -13
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +7 -1
- package/dist/journey-demo-api.js +8 -3
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +3 -0
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-lint-sarif.d.ts +19 -0
- package/dist/journey-lint-sarif.js +48 -0
- package/dist/journey-lint-sarif.js.map +1 -0
- package/dist/journey-network-checks.d.ts +45 -9
- package/dist/journey-network-checks.js +117 -30
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +24 -15
- package/dist/journey-prefix.js +53 -7
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +46 -0
- package/dist/journey-review-api.js.map +1 -0
- package/dist/journey-review-store.d.ts +16 -0
- package/dist/journey-review-store.js +95 -0
- package/dist/journey-review-store.js.map +1 -0
- package/dist/journey-review.d.ts +47 -0
- package/dist/journey-review.js +499 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.d.ts +61 -0
- package/dist/journey-verify.js +144 -0
- package/dist/journey-verify.js.map +1 -0
- package/dist/key-report.d.ts +20 -5
- package/dist/key-report.js +32 -9
- package/dist/key-report.js.map +1 -1
- package/dist/kill-signal.js +10 -2
- package/dist/kill-signal.js.map +1 -1
- package/dist/load-api.js +9 -3
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.js +4 -2
- package/dist/load-cli.js.map +1 -1
- package/dist/log-classes.d.ts +73 -0
- package/dist/log-classes.js +167 -0
- package/dist/log-classes.js.map +1 -0
- package/dist/log-correlation.d.ts +29 -10
- package/dist/log-correlation.js +44 -21
- package/dist/log-correlation.js.map +1 -1
- package/dist/login-cli.d.ts +15 -0
- package/dist/login-cli.js +116 -0
- package/dist/login-cli.js.map +1 -0
- package/dist/logs-cli.js +3 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +1 -0
- package/dist/mcp-api.js +61 -12
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +2 -0
- package/dist/mcp-cli-runner.js +3 -1
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +6 -0
- package/dist/mcp-cli-tools.js +182 -23
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-cli.js +8 -4
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-journal.d.ts +4 -1
- package/dist/mission-journal.js +9 -3
- package/dist/mission-journal.js.map +1 -1
- package/dist/mission-queue-cli.js +21 -2
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +6 -0
- package/dist/mission-queue-runner.js +33 -3
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.d.ts +7 -1
- package/dist/multi-run-cli.js +10 -3
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/multi-run.d.ts +38 -3
- package/dist/multi-run.js +115 -23
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +199 -0
- package/dist/persona-login.js +574 -0
- package/dist/persona-login.js.map +1 -0
- package/dist/pre-approval.d.ts +98 -0
- package/dist/pre-approval.js +175 -0
- package/dist/pre-approval.js.map +1 -0
- package/dist/program.js +10 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +2 -1
- package/dist/project-dir.js +3 -1
- package/dist/project-dir.js.map +1 -1
- package/dist/promotions.d.ts +15 -0
- package/dist/promotions.js +52 -0
- package/dist/promotions.js.map +1 -0
- package/dist/readiness.d.ts +29 -0
- package/dist/readiness.js +291 -0
- package/dist/readiness.js.map +1 -0
- package/dist/regression-cli.js +4 -2
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.d.ts +24 -2
- package/dist/report-api.js +33 -5
- package/dist/report-api.js.map +1 -1
- package/dist/report-cli.js +8 -1
- package/dist/report-cli.js.map +1 -1
- package/dist/result-schema.d.ts +12 -0
- package/dist/result-schema.js +8 -0
- package/dist/result-schema.js.map +1 -1
- package/dist/run-index.d.ts +4 -2
- package/dist/run-index.js +3 -1
- package/dist/run-index.js.map +1 -1
- package/dist/run-key-preflight.d.ts +2 -1
- package/dist/run-key-preflight.js +3 -2
- package/dist/run-key-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +26 -0
- package/dist/run-metadata.js +41 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +12 -0
- package/dist/run-tags-cli.js +35 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.js +3 -1
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/site-cli.d.ts +1 -1
- package/dist/site-cli.js +24 -1
- package/dist/site-cli.js.map +1 -1
- package/dist/source-cli.js +4 -2
- package/dist/source-cli.js.map +1 -1
- package/dist/source-run-api.js +17 -7
- package/dist/source-run-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +7 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +266 -0
- package/dist/sweep-api.js +828 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +115 -0
- package/dist/sweep-cli.js.map +1 -0
- package/dist/target-config.d.ts +5 -2
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/usability-capture.js +6 -0
- package/dist/usability-capture.js.map +1 -1
- package/dist/ux-cli.js +3 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-usability.d.ts +9 -3
- package/dist/ux-usability.js +6 -4
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +13 -13
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-explore/SKILL.md +6 -2
- package/skills/jevitate-getting-started/SKILL.md +12 -0
- package/skills/jevitate-run-journey/SKILL.md +17 -4
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
package/dist/mcp-cli-runner.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-cli-runner.js","sourceRoot":"","sources":["../src/mcp-cli-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-cli-tools.d.ts
CHANGED
|
@@ -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[];
|
package/dist/mcp-cli-tools.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
...
|
|
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: {
|
|
137
|
-
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
-
|
|
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, ...
|
|
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
|
-
...
|
|
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 ─────────────────────────────────────────────────────────────────────────────
|