@jevitate/cli 0.9.0 → 0.11.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/anchor-baselines.d.ts +26 -0
- package/dist/anchor-baselines.js +25 -0
- package/dist/anchor-baselines.js.map +1 -0
- package/dist/approval-provenance.d.ts +32 -2
- package/dist/approval-provenance.js +92 -5
- package/dist/approval-provenance.js.map +1 -1
- package/dist/approved-demo.d.ts +86 -0
- package/dist/approved-demo.js +184 -0
- package/dist/approved-demo.js.map +1 -0
- package/dist/bin.js +13352 -7050
- package/dist/build-info.generated.js +2 -2
- package/dist/campaign-api.d.ts +15 -0
- package/dist/campaign-api.js +67 -6
- package/dist/campaign-api.js.map +1 -1
- package/dist/campaign-cli.js +7 -2
- package/dist/campaign-cli.js.map +1 -1
- package/dist/campaign-preflight.d.ts +76 -0
- package/dist/campaign-preflight.js +117 -0
- package/dist/campaign-preflight.js.map +1 -0
- package/dist/catalog-analysis.js +14 -0
- package/dist/catalog-analysis.js.map +1 -1
- package/dist/catalog-api.js +12 -4
- package/dist/catalog-api.js.map +1 -1
- package/dist/catalog-bundle-api.d.ts +83 -0
- package/dist/catalog-bundle-api.js +309 -0
- package/dist/catalog-bundle-api.js.map +1 -0
- package/dist/catalog-bundle-findings.d.ts +64 -0
- package/dist/catalog-bundle-findings.js +326 -0
- package/dist/catalog-bundle-findings.js.map +1 -0
- package/dist/catalog-bundle.d.ts +296 -0
- package/dist/catalog-bundle.js +777 -0
- package/dist/catalog-bundle.js.map +1 -0
- package/dist/catalog-cli.d.ts +6 -0
- package/dist/catalog-cli.js +181 -5
- package/dist/catalog-cli.js.map +1 -1
- package/dist/catalog-refs.d.ts +42 -0
- package/dist/catalog-refs.js +188 -0
- package/dist/catalog-refs.js.map +1 -0
- package/dist/catalog-review.d.ts +3 -1
- package/dist/catalog-review.js +61 -0
- package/dist/catalog-review.js.map +1 -1
- package/dist/catalog.d.ts +27 -3
- package/dist/catalog.js +46 -2
- package/dist/catalog.js.map +1 -1
- package/dist/check-api.js +180 -9
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +2 -0
- package/dist/check-cli.js +96 -2
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.d.ts +18 -0
- package/dist/check-execute.js +56 -3
- package/dist/check-execute.js.map +1 -1
- package/dist/check-types.d.ts +105 -0
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.d.ts +6 -0
- package/dist/cli-output.js +38 -1
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +10 -0
- package/dist/cli-shared.js +0 -4
- package/dist/cli-shared.js.map +1 -1
- package/dist/cold-start-report.d.ts +32 -0
- package/dist/cold-start-report.js +31 -0
- package/dist/cold-start-report.js.map +1 -0
- package/dist/defect-evidence.js +10 -5
- package/dist/defect-evidence.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +11 -0
- package/dist/demo-aspect-api.js +27 -2
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +5 -0
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/demo-capture.d.ts +79 -2
- package/dist/demo-capture.js +504 -12
- package/dist/demo-capture.js.map +1 -1
- package/dist/environments.d.ts +8 -1
- package/dist/environments.js +14 -3
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +16 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.js +2 -2
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-shared.d.ts +11 -0
- package/dist/explore-shared.js +9 -0
- package/dist/explore-shared.js.map +1 -1
- package/dist/findings-filing.js +7 -3
- package/dist/findings-filing.js.map +1 -1
- package/dist/forge-verify.d.ts +224 -0
- package/dist/forge-verify.js +649 -0
- package/dist/forge-verify.js.map +1 -0
- package/dist/github-issue-filer.js +15 -9
- package/dist/github-issue-filer.js.map +1 -1
- package/dist/init-codeowners.d.ts +19 -0
- package/dist/init-codeowners.js +66 -0
- package/dist/init-codeowners.js.map +1 -1
- package/dist/job-draft-api.d.ts +52 -0
- package/dist/job-draft-api.js +110 -0
- package/dist/job-draft-api.js.map +1 -0
- package/dist/journeeze-api.d.ts +77 -0
- package/dist/journeeze-api.js +371 -0
- package/dist/journeeze-api.js.map +1 -0
- package/dist/journeeze-connect.d.ts +156 -0
- package/dist/journeeze-connect.js +357 -0
- package/dist/journeeze-connect.js.map +1 -0
- package/dist/journey-anchor-api.d.ts +37 -0
- package/dist/journey-anchor-api.js +58 -0
- package/dist/journey-anchor-api.js.map +1 -0
- package/dist/journey-anchor-cli.d.ts +17 -0
- package/dist/journey-anchor-cli.js +104 -0
- package/dist/journey-anchor-cli.js.map +1 -0
- package/dist/journey-anchor-gate.d.ts +52 -0
- package/dist/journey-anchor-gate.js +101 -0
- package/dist/journey-anchor-gate.js.map +1 -0
- package/dist/journey-api.d.ts +30 -1
- package/dist/journey-api.js +118 -16
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.js +93 -10
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +29 -0
- package/dist/journey-demo-api.js +29 -7
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-heal.js +1 -1
- package/dist/journey-heal.js.map +1 -1
- package/dist/journey-lint-sarif.d.ts +3 -2
- package/dist/journey-lint-sarif.js +11 -2
- package/dist/journey-lint-sarif.js.map +1 -1
- package/dist/journey-migrate-api.d.ts +54 -0
- package/dist/journey-migrate-api.js +64 -0
- package/dist/journey-migrate-api.js.map +1 -0
- package/dist/journey-network-checks.d.ts +11 -0
- package/dist/journey-network-checks.js +36 -13
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-proposal-store.d.ts +9 -0
- package/dist/journey-proposal-store.js +23 -0
- package/dist/journey-proposal-store.js.map +1 -1
- package/dist/journey-result-record.d.ts +2 -0
- package/dist/journey-result-record.js +5 -0
- package/dist/journey-result-record.js.map +1 -1
- package/dist/journey-review-api.js +9 -1
- package/dist/journey-review-api.js.map +1 -1
- package/dist/journey-review.d.ts +11 -1
- package/dist/journey-review.js +77 -5
- package/dist/journey-review.js.map +1 -1
- package/dist/journey-stale-api.d.ts +40 -0
- package/dist/journey-stale-api.js +57 -0
- package/dist/journey-stale-api.js.map +1 -0
- package/dist/load-api.js +4 -2
- package/dist/load-api.js.map +1 -1
- package/dist/locator-health-api.d.ts +101 -0
- package/dist/locator-health-api.js +203 -0
- package/dist/locator-health-api.js.map +1 -0
- package/dist/locator-health.d.ts +195 -0
- package/dist/locator-health.js +419 -0
- package/dist/locator-health.js.map +1 -0
- package/dist/mcp-api.d.ts +3 -1
- package/dist/mcp-api.js +21 -2
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +4 -1
- package/dist/mcp-cli-tools.js +82 -10
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/openrouter-call.d.ts +23 -10
- package/dist/openrouter-call.js +14 -11
- package/dist/openrouter-call.js.map +1 -1
- package/dist/png-pixels.d.ts +12 -0
- package/dist/png-pixels.js +96 -0
- package/dist/png-pixels.js.map +1 -0
- package/dist/project-config.d.ts +29 -0
- package/dist/project-config.js +76 -0
- package/dist/project-config.js.map +1 -0
- package/dist/regression-api.js +2 -1
- package/dist/regression-api.js.map +1 -1
- package/dist/server-log-verify.js +2 -1
- package/dist/server-log-verify.js.map +1 -1
- package/dist/signal-triage.js +7 -3
- package/dist/signal-triage.js.map +1 -1
- package/dist/source-run-api.js +2 -2
- package/dist/source-run-api.js.map +1 -1
- package/dist/verify-fix-api.d.ts +29 -0
- package/dist/verify-fix-api.js +43 -2
- package/dist/verify-fix-api.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -0
- package/dist/verify-fix-cli.js.map +1 -1
- package/dist/zip-store.d.ts +15 -0
- package/dist/zip-store.js +93 -0
- package/dist/zip-store.js.map +1 -0
- package/package.json +12 -10
- package/skills/jevitate-ci-check/SKILL.md +16 -0
- package/skills/jevitate-demo/SKILL.md +4 -1
- package/skills/jevitate-getting-started/SKILL.md +7 -2
- package/skills/jevitate-run-journey/SKILL.md +15 -0
- package/skills/jevitate-test-campaign/SKILL.md +26 -0
- package/skills/jevitate-verify-fix/SKILL.md +5 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #471 — a minimal, deterministic ZIP writer for the Journeeze catalog bundle upload (journeeze-saas
|
|
3
|
+
* `docs/contract/catalog-bundle-upload-v1.md` §4.2: `application/zip`, `bundle.json` at the root
|
|
4
|
+
* and the media under `media/`). Entries are STORED (media is already compressed), in the given
|
|
5
|
+
* order, with a fixed timestamp (1980-01-01 00:00) and no extra fields, so the same bundle always
|
|
6
|
+
* gives the same bytes — a re-publish reuses its Idempotency-Key with the same body digest. No
|
|
7
|
+
* ZIP64: refused past 4 GiB or 65,535 entries (far above the contract's 256 MiB upload).
|
|
8
|
+
*/
|
|
9
|
+
const CRC_TABLE = (() => {
|
|
10
|
+
const t = new Uint32Array(256);
|
|
11
|
+
for (let n = 0; n < 256; n++) {
|
|
12
|
+
let c = n;
|
|
13
|
+
for (let k = 0; k < 8; k++)
|
|
14
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
15
|
+
t[n] = c >>> 0;
|
|
16
|
+
}
|
|
17
|
+
return t;
|
|
18
|
+
})();
|
|
19
|
+
export function crc32(data) {
|
|
20
|
+
let c = 0xffffffff;
|
|
21
|
+
for (let i = 0; i < data.length; i++)
|
|
22
|
+
c = CRC_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8);
|
|
23
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
24
|
+
}
|
|
25
|
+
const SAFE_NAME = /^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/-]{1,512}$/u;
|
|
26
|
+
/** 1980-01-01 00:00:00 in MS-DOS date/time. */
|
|
27
|
+
const DOS_TIME = 0;
|
|
28
|
+
const DOS_DATE = (0 << 9) | (1 << 5) | 1;
|
|
29
|
+
export function zipStore(entries) {
|
|
30
|
+
if (entries.length > 0xffff)
|
|
31
|
+
throw new Error("too many ZIP entries");
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const locals = [];
|
|
34
|
+
const centrals = [];
|
|
35
|
+
let offset = 0;
|
|
36
|
+
for (const e of entries) {
|
|
37
|
+
if (!SAFE_NAME.test(e.name))
|
|
38
|
+
throw new Error(`unsafe ZIP entry name ${JSON.stringify(e.name)}`);
|
|
39
|
+
if (seen.has(e.name))
|
|
40
|
+
throw new Error(`duplicate ZIP entry ${e.name}`);
|
|
41
|
+
seen.add(e.name);
|
|
42
|
+
const name = Buffer.from(e.name, "utf8");
|
|
43
|
+
const crc = crc32(e.data);
|
|
44
|
+
const size = e.data.byteLength;
|
|
45
|
+
if (offset + 30 + name.length + size > 0xffffffff)
|
|
46
|
+
throw new Error("ZIP too large");
|
|
47
|
+
const local = Buffer.alloc(30);
|
|
48
|
+
local.writeUInt32LE(0x04034b50, 0);
|
|
49
|
+
local.writeUInt16LE(20, 4); // version needed
|
|
50
|
+
local.writeUInt16LE(0x0800, 6); // flags: UTF-8 names
|
|
51
|
+
local.writeUInt16LE(0, 8); // stored
|
|
52
|
+
local.writeUInt16LE(DOS_TIME, 10);
|
|
53
|
+
local.writeUInt16LE(DOS_DATE, 12);
|
|
54
|
+
local.writeUInt32LE(crc, 14);
|
|
55
|
+
local.writeUInt32LE(size, 18);
|
|
56
|
+
local.writeUInt32LE(size, 22);
|
|
57
|
+
local.writeUInt16LE(name.length, 26);
|
|
58
|
+
local.writeUInt16LE(0, 28);
|
|
59
|
+
const central = Buffer.alloc(46);
|
|
60
|
+
central.writeUInt32LE(0x02014b50, 0);
|
|
61
|
+
central.writeUInt16LE(20, 4); // version made by
|
|
62
|
+
central.writeUInt16LE(20, 6);
|
|
63
|
+
central.writeUInt16LE(0x0800, 8);
|
|
64
|
+
central.writeUInt16LE(0, 10);
|
|
65
|
+
central.writeUInt16LE(DOS_TIME, 12);
|
|
66
|
+
central.writeUInt16LE(DOS_DATE, 14);
|
|
67
|
+
central.writeUInt32LE(crc, 16);
|
|
68
|
+
central.writeUInt32LE(size, 20);
|
|
69
|
+
central.writeUInt32LE(size, 24);
|
|
70
|
+
central.writeUInt16LE(name.length, 28);
|
|
71
|
+
central.writeUInt16LE(0, 30); // extra
|
|
72
|
+
central.writeUInt16LE(0, 32); // comment
|
|
73
|
+
central.writeUInt16LE(0, 34); // disk
|
|
74
|
+
central.writeUInt16LE(0, 36); // internal attrs
|
|
75
|
+
central.writeUInt32LE(0, 38); // external attrs
|
|
76
|
+
central.writeUInt32LE(offset, 42);
|
|
77
|
+
locals.push(local, name, Buffer.from(e.data.buffer, e.data.byteOffset, e.data.byteLength));
|
|
78
|
+
centrals.push(central, name);
|
|
79
|
+
offset += 30 + name.length + size;
|
|
80
|
+
}
|
|
81
|
+
const cd = Buffer.concat(centrals);
|
|
82
|
+
const end = Buffer.alloc(22);
|
|
83
|
+
end.writeUInt32LE(0x06054b50, 0);
|
|
84
|
+
end.writeUInt16LE(0, 4);
|
|
85
|
+
end.writeUInt16LE(0, 6);
|
|
86
|
+
end.writeUInt16LE(entries.length, 8);
|
|
87
|
+
end.writeUInt16LE(entries.length, 10);
|
|
88
|
+
end.writeUInt32LE(cd.length, 12);
|
|
89
|
+
end.writeUInt32LE(offset, 16);
|
|
90
|
+
end.writeUInt16LE(0, 20);
|
|
91
|
+
return Buffer.concat([...locals, cd, end]);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=zip-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-store.js","sourceRoot":"","sources":["../src/zip-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jevitate/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Autonomous browser testing that turns discovered bugs into deterministic regression tests: explore a web app in a real browser, confirm findings with evidence, and replay them as regressions in CI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"jevitate"
|
|
31
31
|
],
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=22"
|
|
34
34
|
},
|
|
35
35
|
"bin": {
|
|
36
36
|
"jevitate": "dist/bin.js"
|
|
@@ -54,31 +54,33 @@
|
|
|
54
54
|
"@openrouter/ai-sdk-provider": "^3.1.0",
|
|
55
55
|
"@typesafe-ai/sdk": "^0.6.0",
|
|
56
56
|
"ai": "^7.0.107",
|
|
57
|
-
"better-sqlite3": "^
|
|
57
|
+
"better-sqlite3": "^13.0.3",
|
|
58
58
|
"commander": "^12.0.0",
|
|
59
59
|
"playwright": "^1.49.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
+
"ajv": "^8.20.0",
|
|
63
|
+
"ajv-formats": "^3.0.1",
|
|
62
64
|
"esbuild": "^0.28.2",
|
|
63
65
|
"@jevitate/ai-core": "0.1.0",
|
|
64
|
-
"@jevitate/daemon": "0.1.0",
|
|
65
|
-
"@jevitate/domain": "0.1.0",
|
|
66
66
|
"@jevitate/example-site": "0.1.0",
|
|
67
|
-
"@jevitate/explore": "0.1.0",
|
|
68
|
-
"@jevitate/inbox": "0.1.0",
|
|
69
67
|
"@jevitate/findings": "0.1.0",
|
|
70
|
-
"@jevitate/
|
|
68
|
+
"@jevitate/domain": "0.1.0",
|
|
69
|
+
"@jevitate/inbox": "0.1.0",
|
|
70
|
+
"@jevitate/explore": "0.1.0",
|
|
71
71
|
"@jevitate/journey": "0.1.0",
|
|
72
|
+
"@jevitate/interpreter": "0.1.0",
|
|
72
73
|
"@jevitate/mcp-facade": "0.1.0",
|
|
73
|
-
"@jevitate/
|
|
74
|
+
"@jevitate/daemon": "0.1.0",
|
|
74
75
|
"@jevitate/playwright": "0.1.0",
|
|
76
|
+
"@jevitate/missions": "0.1.0",
|
|
75
77
|
"@jevitate/recorder": "0.1.0",
|
|
76
78
|
"@jevitate/recording": "0.1.0",
|
|
77
79
|
"@jevitate/regression": "0.1.0",
|
|
78
80
|
"@jevitate/runtime": "0.1.0",
|
|
79
81
|
"@jevitate/screenplay": "0.1.0",
|
|
80
|
-
"@jevitate/skills": "0.1.0",
|
|
81
82
|
"@jevitate/sources": "0.1.0",
|
|
83
|
+
"@jevitate/skills": "0.1.0",
|
|
82
84
|
"@jevitate/ux": "0.1.0",
|
|
83
85
|
"@jevitate/storage-sqlite": "0.1.0",
|
|
84
86
|
"@jevitate/load": "0.1.0"
|
|
@@ -59,6 +59,22 @@ Relative paths resolve against the suite file.
|
|
|
59
59
|
with a proposal in `.proposals/` for a person to `journey review` / `journey promote --proposal`;
|
|
60
60
|
commit `.proposals/` with the PR. Without a change context the flag is refused (64).
|
|
61
61
|
|
|
62
|
+
- Locator health (which selector rung each recorded step resolves by, and whether it meets the
|
|
63
|
+
project's `testIdAttributes` convention in `.jevitate/project.json`) is advisory: fixes appear as
|
|
64
|
+
SARIF warnings and in `check.json`. `--max-brittle-steps <n>` (MCP `run_check` `maxBrittleSteps`)
|
|
65
|
+
opts into a gate: a Journey item with more than n brittle steps is a gating finding (exit 1).
|
|
66
|
+
`jevitate locator-health [--journey <id>] [--baseline <file>] --json` (MCP `locator_health`)
|
|
67
|
+
reports it on its own and never gates.
|
|
68
|
+
- `--require-approvals [--allow-channels tty,pr-review]` fails a missing or stale approval, or one
|
|
69
|
+
made over a channel not allowed. `pr-review` (an approval jevitate verified through a merged,
|
|
70
|
+
approved GitHub pull request) is re-verified through the GitHub API on every check (it needs
|
|
71
|
+
`GITHUB_TOKEN` and `pull-requests: read`); one that cannot be re-verified is an `unverified`
|
|
72
|
+
violation. No flag or tool argument sets `pr-review`. See the jevitate repo's `docs/ci.md`.
|
|
73
|
+
- Publishing the catalog to Journeeze from CI: set the `JOURNEEZE_UPLOAD_KEY` secret and run
|
|
74
|
+
`jevitate publish journeeze --json` (MCP `publish_to_journeeze`; `--dry-run` sends nothing).
|
|
75
|
+
Refusals carry an `E_JOURNEEZE_*` code (64 when the key or connection is the problem, 2 when
|
|
76
|
+
Journeeze could not take it).
|
|
77
|
+
|
|
62
78
|
## Exit codes: gate on 1, and treat 2 and 64 as broken
|
|
63
79
|
|
|
64
80
|
`0` pass · `1` at least one gating finding (a Journey assertion, an invariant, a goal check, a
|
|
@@ -13,7 +13,10 @@ something the app didn't do.
|
|
|
13
13
|
- Demos and Journey replays run against a named environment from the committed
|
|
14
14
|
`.jevitate/environments.json` (`jevitate init` writes an example with a `local` entry). Each
|
|
15
15
|
entry has `baseUrl` (an origin), an optional `allow` list, `fixtures` and `hooks`. Mark a live
|
|
16
|
-
site with `"production": true`. `demo` refuses one (`E_DEMO_PRODUCTION_ENV`, exit 64).
|
|
16
|
+
site with `"production": true`. `demo` refuses one (`E_DEMO_PRODUCTION_ENV`, exit 64). Mark a
|
|
17
|
+
seeded, synthetic tenant with `"synthetic": true`: only a demo approved there ships masked media
|
|
18
|
+
(jz-mask-v1) to Journeeze with `catalog export` / `publish journeeze`. Set it only when the human
|
|
19
|
+
says the environment holds no real customer data.
|
|
17
20
|
- The file never holds a secret or a session. Sessions and secret fields live in
|
|
18
21
|
`~/.jevitate/targets.json`, keyed by the environment's origin, with `personas` for named
|
|
19
22
|
sessions. Never write a session or password into the repo.
|
|
@@ -59,10 +59,14 @@ Then pick the matching skill:
|
|
|
59
59
|
`find_capabilities`/`run_journey` = `journey find`/`journey run`, `author_journey` =
|
|
60
60
|
`explore-author-journey`, `create_demo`/`demo_journey` = `demo`/`journey demo`, `verify_fix` =
|
|
61
61
|
`verify-fix`, `regressions` = `regression capture|run`, `ledger` = `ledger …`, `run_check` =
|
|
62
|
-
`check`, `get_report` = `report`, `ux_review` = `ux
|
|
62
|
+
`check`, `get_report` = `report`, `ux_review` = `ux`, `locator_health` = `locator-health`,
|
|
63
|
+
`draft_job_outcomes` = `job draft-outcomes`, `export_catalog_bundle` = `catalog export`,
|
|
64
|
+
`publish_to_journeeze` = `publish journeeze`. The full table is in the jevitate repo's
|
|
63
65
|
`docs/agents.md`.
|
|
64
66
|
- These are never available over MCP: `record` (a person clicks), `init`, `ai setup` (secret entry),
|
|
65
|
-
`ui`, `source trust
|
|
67
|
+
`ui`, `source trust`, `source add --accept-tou`, `connect journeeze` (a person enters where the
|
|
68
|
+
Journeeze upload key is kept; `publish_to_journeeze` never sees the key) and `journey migrate`
|
|
69
|
+
(a one-time rewrite the operator commits). Operator settings are never tool arguments
|
|
66
70
|
either: shell hooks, browser binaries, which environment variable a secret comes from, and
|
|
67
71
|
log-command sources. Tell the human the CLI command instead.
|
|
68
72
|
- Raw browser tools (click, fill, evaluate, get DOM or cookies) don't exist on purpose. Never
|
|
@@ -79,6 +83,7 @@ you do, show them what they are approving:
|
|
|
79
83
|
- promoting a mission target: `jevitate mission target promote <id>`
|
|
80
84
|
- trusting a third-party Journey or accepting a source's Terms of Use (CLI only)
|
|
81
85
|
- approving a catalog persona or job, waiving an unvetted link, acknowledging findings: `jevitate persona approve <id>`, `jevitate job approve <id>`, `journey promote --accept-unvetted`, `--accept-findings` (approve and acknowledge are CLI only; MCP reads `review_persona` / `review_job` / `catalog_status` / `analyze_catalog`)
|
|
86
|
+
- connecting the project to Journeeze: `jevitate connect journeeze` (CLI only, a person at a terminal). Drafting a job's desired outcomes (`job draft-outcomes` / `draft_job_outcomes`) is not an approval: it marks them `provenance: ai_draft`, and a person still reviews and runs `job approve`
|
|
82
87
|
- approving or cancelling an inbox item: only in `jevitate ui`. The MCP tools `approve_action` and `cancel_command` always refuse.
|
|
83
88
|
|
|
84
89
|
Every CLI approval (`journey promote`, `demo approve`, `persona approve`, `job approve`, and the
|
|
@@ -46,6 +46,10 @@ artifact; your job is to find the right one and run it with the right params.
|
|
|
46
46
|
- Evidence: `--record-video` (listed as `videoPaths`), `--screenshots
|
|
47
47
|
[screens|steps]` (`screenshotPaths` + an `index.md`), `--headed`/`--slow-mo <ms>`
|
|
48
48
|
to watch it. `--viewport 375x812` / `--device "iPhone 13"` for mobile.
|
|
49
|
+
- A step's `responseStatus` check waits up to 15 s for a request that was sent
|
|
50
|
+
but not yet answered (a cold start after a deploy); `--step-response-timeout
|
|
51
|
+
<ms>` (MCP `run_journey`'s `stepResponseTimeoutMs`) raises it for one run. A
|
|
52
|
+
late 2xx is an advisory `slowSteps` finding, not a failure.
|
|
49
53
|
- For a narrated demo video or a step-by-step guide of a Journey, use
|
|
50
54
|
`jevitate-demo` (`journey demo`, `journey annotate`).
|
|
51
55
|
|
|
@@ -112,6 +116,17 @@ artifact; your job is to find the right one and run it with the right params.
|
|
|
112
116
|
proof, change since the last approval, and the content hash. Pass that hash
|
|
113
117
|
as `--reviewed-hash` (MCP `reviewedHash`) so the approval is refused
|
|
114
118
|
(`E_JOURNEY_REVIEW_STALE`) if the Journey changed after they read it.
|
|
119
|
+
- A new Journey, or one whose content changed beyond step ids, must follow the
|
|
120
|
+
anchor rules to promote (lowercase anchor names, anchors carrying their
|
|
121
|
+
step's `stepId`, a job-linked Journey naming at least one anchor, valid
|
|
122
|
+
`serves`/`jobStep` references); otherwise promote is refused with
|
|
123
|
+
`E_JOURNEY_ANCHOR_RULES` and the fix for each problem. The sheet and
|
|
124
|
+
`journey lint` show the same problems as warnings first.
|
|
125
|
+
- `jevitate journey review --stale --json` (MCP `review_journey` with
|
|
126
|
+
`stale: true`) lists every promoted Journey whose approval is stale;
|
|
127
|
+
`stepIdOnly: true` marks one whose only change is minted step ids (after
|
|
128
|
+
`jevitate journey migrate --step-ids`, which the operator runs and
|
|
129
|
+
commits). Re-approving those is still the person's act.
|
|
115
130
|
- `jevitate journey promote <id>` promotes a local Journey — a person's
|
|
116
131
|
approval, never automatic. It needs an interactive terminal: after the
|
|
117
132
|
sheet, the person types the Journey id (or the first 8 characters of its
|
|
@@ -44,6 +44,14 @@ never the click path; independent `--success` checks (page or network state); pr
|
|
|
44
44
|
whether it mutates state; and a run order (jobs that create data run before jobs that use it).
|
|
45
45
|
A job you can't write a checkable `--success` for is too vague. Split it or narrow it.
|
|
46
46
|
|
|
47
|
+
Optionally give a job its steps and desired outcomes (`steps`, `desiredOutcomes` with a `metric`
|
|
48
|
+
measured between anchors or the reserved `"job_start"` / `"job_end"`, a `target`, `guardrail: true`
|
|
49
|
+
for what must never get worse; docs/catalog.md). `jevitate job draft-outcomes <id> --real --json`
|
|
50
|
+
(MCP `draft_job_outcomes`) drafts 1-3 outcomes marked `provenance: ai_draft` for the human to
|
|
51
|
+
review; it never approves, and an approved job becomes stale. On each job-linked Journey, mark
|
|
52
|
+
where the job's steps start and end with anchors (`jobStep`, `boundary`), so its metrics are
|
|
53
|
+
measurable; `catalog status` lists the reference problems (`refIssues`).
|
|
54
|
+
|
|
47
55
|
## 3. Discovery: one goal run per job
|
|
48
56
|
|
|
49
57
|
For each job, as the right persona, with no scripted path:
|
|
@@ -70,6 +78,15 @@ mission takes over on the live page:
|
|
|
70
78
|
|
|
71
79
|
```bash
|
|
72
80
|
jevitate journey anchors <journey-id> --json # the named states worth exploring from, with suggested probes
|
|
81
|
+
jevitate journey anchors <journey-id> --suggest --json # advisory: where the flow changes state (writes nothing)
|
|
82
|
+
jevitate journey anchor add <journey-id> --name <name> --step <n|stepId> --json # a DRAFT Journey only
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Over MCP: `journey_anchors` (`suggest: true`), `journey_anchor_add`, `journey_anchor_remove`, and
|
|
86
|
+
`lint_journey` with `fix: true` (stamps number-only anchors with their step id). Anchor edits refuse a
|
|
87
|
+
promoted Journey: its approval binds to the content hash, so edit a draft and a person re-promotes it.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
73
90
|
jevitate explore --from-journey <journey-id> --at-step <anchor|n> --param <k=v> --env <env> --strategy adversarial --storage-state <persona-file> --max-actions 60 --evidence-video --real --json
|
|
74
91
|
```
|
|
75
92
|
|
|
@@ -105,6 +122,10 @@ Flags such as `--allow-destructive`, `--paid`, `--invariants`, `--log-source`/`-
|
|
|
105
122
|
`--evidence-video` on `campaign run` are forwarded to every mission; `--hook-timeout-ms` bounds the
|
|
106
123
|
spec's hooks. An invalid spec is refused with every problem listed (exit 64). Shell `before`/`after` restore
|
|
107
124
|
hooks in the spec run only with `--allow-shell-hooks`, and only when the human asked for them.
|
|
125
|
+
Before any mission, a preflight checks every start URL is reachable, every session is signed in and
|
|
126
|
+
no app call slips outside the allow list, and refuses with the problems listed. Fix them;
|
|
127
|
+
`--skip-preflight` (MCP `run_campaign` `skipPreflight`) only when the human asks, and it is recorded
|
|
128
|
+
on the report.
|
|
108
129
|
|
|
109
130
|
## 5. A small untargeted pass, plus non-journey attacks
|
|
110
131
|
|
|
@@ -167,6 +188,11 @@ probability ≥ its `threshold` (Jev only advises). Then `jevitate catalog statu
|
|
|
167
188
|
`fixed` by verify-fix (with a ledger entry or regression); the final round ran on the release
|
|
168
189
|
build; and no `inconclusive` run was counted as a pass. Anything short of that, report it as open.
|
|
169
190
|
|
|
191
|
+
To share the vetted catalog, `jevitate catalog export --format journeeze-bundle --out <dir>
|
|
192
|
+
[--check <check.json>] --json` (MCP `export_catalog_bundle`) writes a Journeeze catalog bundle, and
|
|
193
|
+
`jevitate publish journeeze --json` (MCP `publish_to_journeeze`) uploads it once a person has run
|
|
194
|
+
`jevitate connect journeeze` (or CI sets `JOURNEEZE_UPLOAD_KEY`). Neither approves anything.
|
|
195
|
+
|
|
170
196
|
## Templates
|
|
171
197
|
|
|
172
198
|
Job spec (one per job, `.jevitate/jobs.json`; the old `.jevitate/campaign/jobs.json` is still
|
|
@@ -24,6 +24,11 @@ the evidence. No model decides any of these verdicts.
|
|
|
24
24
|
target's session in `~/.jevitate/targets.json`. A finding recorded at a viewport or device
|
|
25
25
|
replays at that emulation. `--viewport`/`--device` that differ are refused unless
|
|
26
26
|
`--allow-emulation-override` is passed.
|
|
27
|
+
- A finding replays under the allow list stored with its result. To prove an allow-list
|
|
28
|
+
config fix (e.g. `localhost` → `127.0.0.1`), pass `--allow <origin...>` or `--env <name>`
|
|
29
|
+
(that environment's CURRENT allow list), never both; MCP: `verify_fix`'s `env` only (an MCP caller never names origins).
|
|
30
|
+
The report then carries `allowlistOverride` (origins used, what was added and removed): say so
|
|
31
|
+
when you report the verdict.
|
|
27
32
|
|
|
28
33
|
## Evidence for a PR or an issue
|
|
29
34
|
|