@jevitate/cli 0.28.0 → 0.29.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/README.md +1 -1
- package/dist/approval-provenance.d.ts +9 -1
- package/dist/approval-provenance.js +12 -4
- package/dist/approval-provenance.js.map +1 -1
- package/dist/author-journey-cli.js +1 -1
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +12663 -8284
- package/dist/bin.js.map +1 -1
- package/dist/build-info.generated.js +3 -3
- package/dist/catalog-analysis.js +3 -2
- package/dist/catalog-analysis.js.map +1 -1
- package/dist/catalog-bundle.js +2 -2
- package/dist/catalog-bundle.js.map +1 -1
- package/dist/check-plan.js +12 -0
- package/dist/check-plan.js.map +1 -1
- package/dist/demo-aspect-cli.d.ts +10 -0
- package/dist/demo-aspect-cli.js +4 -1
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/engine.d.ts +8 -1
- package/dist/engine.js +16 -2
- package/dist/engine.js.map +1 -1
- package/dist/explore-adversarial.js +4 -0
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-cli/feature-strategy.js +1 -0
- package/dist/explore-cli/feature-strategy.js.map +1 -1
- package/dist/explore-cli/run.js +7 -0
- package/dist/explore-cli/run.js.map +1 -1
- package/dist/explore-feature.d.ts +2 -0
- package/dist/explore-feature.js +15 -8
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.js +12 -0
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-specs.js +2 -2
- package/dist/explore-specs.js.map +1 -1
- package/dist/heal-probe-guard.d.ts +7 -3
- package/dist/heal-probe-guard.js +8 -2
- package/dist/heal-probe-guard.js.map +1 -1
- package/dist/http-probe.js +2 -2
- package/dist/http-probe.js.map +1 -1
- package/dist/journey-annotate-api.d.ts +5 -0
- package/dist/journey-annotate-api.js +49 -24
- package/dist/journey-annotate-api.js.map +1 -1
- package/dist/journey-annotate-cli.js +4 -1
- package/dist/journey-annotate-cli.js.map +1 -1
- package/dist/journey-api.d.ts +46 -7
- package/dist/journey-api.js +111 -43
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-chain.d.ts +0 -6
- package/dist/journey-chain.js +36 -5
- package/dist/journey-chain.js.map +1 -1
- package/dist/journey-cli/chain.js +6 -0
- package/dist/journey-cli/chain.js.map +1 -1
- package/dist/journey-cli/lint.js +10 -3
- package/dist/journey-cli/lint.js.map +1 -1
- package/dist/journey-cli/run.js +39 -4
- package/dist/journey-cli/run.js.map +1 -1
- package/dist/journey-cli/verify.d.ts +8 -1
- package/dist/journey-cli/verify.js +111 -14
- package/dist/journey-cli/verify.js.map +1 -1
- package/dist/journey-cli-readiness.js +2 -0
- package/dist/journey-cli-readiness.js.map +1 -1
- package/dist/journey-demo-cli.js +2 -0
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-network-checks.d.ts +4 -0
- package/dist/journey-network-checks.js +6 -2
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +2 -0
- package/dist/journey-prefix.js +20 -1
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-proof-context.d.ts +7 -1
- package/dist/journey-proof-context.js +19 -1
- package/dist/journey-proof-context.js.map +1 -1
- package/dist/journey-proof-waiver-cli.js +6 -3
- package/dist/journey-proof-waiver-cli.js.map +1 -1
- package/dist/journey-readiness.js +4 -0
- package/dist/journey-readiness.js.map +1 -1
- package/dist/journey-review-api.js +23 -0
- package/dist/journey-review-api.js.map +1 -1
- package/dist/journey-review.d.ts +30 -10
- package/dist/journey-review.js +33 -39
- package/dist/journey-review.js.map +1 -1
- package/dist/journey-run-record.d.ts +91 -0
- package/dist/journey-run-record.js +239 -0
- package/dist/journey-run-record.js.map +1 -0
- package/dist/journey-stale-api.d.ts +7 -0
- package/dist/journey-stale-api.js +50 -6
- package/dist/journey-stale-api.js.map +1 -1
- package/dist/journey-verify-checkpoint.d.ts +656 -0
- package/dist/journey-verify-checkpoint.js +923 -0
- package/dist/journey-verify-checkpoint.js.map +1 -0
- package/dist/journey-verify.d.ts +84 -3
- package/dist/journey-verify.js +1387 -110
- package/dist/journey-verify.js.map +1 -1
- package/dist/kill-signal.d.ts +24 -2
- package/dist/kill-signal.js +39 -11
- package/dist/kill-signal.js.map +1 -1
- package/dist/load-api.js +31 -2
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.js +6 -0
- package/dist/load-cli.js.map +1 -1
- package/dist/logs-retention.js +28 -3
- package/dist/logs-retention.js.map +1 -1
- package/dist/mask-values.d.ts +5 -0
- package/dist/mask-values.js +12 -0
- package/dist/mask-values.js.map +1 -0
- package/dist/mcp-api.d.ts +2 -0
- package/dist/mcp-api.js +19 -3
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +7 -1
- package/dist/mcp-cli-runner.js +30 -3
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +9 -1
- package/dist/mcp-cli-tools.js +29 -4
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mcp-paths.js +11 -0
- package/dist/mcp-paths.js.map +1 -1
- package/dist/mcp-run-guard.d.ts +79 -0
- package/dist/mcp-run-guard.js +371 -0
- package/dist/mcp-run-guard.js.map +1 -0
- package/dist/mcp-tools/cli.js +1 -1
- package/dist/mcp-tools/cli.js.map +1 -1
- package/dist/mcp-tools/findings.js +12 -1
- package/dist/mcp-tools/findings.js.map +1 -1
- package/dist/mcp-tools/journey.js +25 -8
- package/dist/mcp-tools/journey.js.map +1 -1
- package/dist/mission-fixtures.d.ts +3 -1
- package/dist/mission-fixtures.js +23 -6
- package/dist/mission-fixtures.js.map +1 -1
- package/dist/mutation-proof-policy.d.ts +2 -0
- package/dist/mutation-proof-policy.js +2 -2
- package/dist/mutation-proof-policy.js.map +1 -1
- package/dist/program.d.ts +6 -0
- package/dist/program.js +6 -9
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +5 -1
- package/dist/project-dir.js +54 -5
- package/dist/project-dir.js.map +1 -1
- package/dist/readiness.js +3 -1
- package/dist/readiness.js.map +1 -1
- package/dist/regression-api.d.ts +5 -0
- package/dist/regression-api.js +17 -10
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.js +14 -1
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.js +6 -0
- package/dist/report-api.js.map +1 -1
- package/dist/resource-preflight.d.ts +2 -1
- package/dist/resource-preflight.js +2 -1
- package/dist/resource-preflight.js.map +1 -1
- package/dist/secret-params.d.ts +82 -0
- package/dist/secret-params.js +234 -0
- package/dist/secret-params.js.map +1 -0
- package/dist/self-heal-adapter.d.ts +2 -2
- package/dist/self-heal-adapter.js +7 -9
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/source-cli.js +3 -1
- package/dist/source-cli.js.map +1 -1
- package/dist/source-run-api.d.ts +2 -0
- package/dist/source-run-api.js +21 -2
- package/dist/source-run-api.js.map +1 -1
- package/dist/target-config.d.ts +39 -0
- package/dist/target-config.js +76 -1
- package/dist/target-config.js.map +1 -1
- package/dist/terminal-result.d.ts +181 -0
- package/dist/terminal-result.js +609 -0
- package/dist/terminal-result.js.map +1 -0
- package/dist/usability-capture.js +2 -2
- package/dist/usability-capture.js.map +1 -1
- package/dist/ux-usability/hang.js +2 -0
- package/dist/ux-usability/hang.js.map +1 -1
- package/dist/ux-usability.js +6 -0
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-api.d.ts +43 -0
- package/dist/verify-fix-api.js +138 -10
- package/dist/verify-fix-api.js.map +1 -1
- package/dist/verify-fix-cli.d.ts +6 -1
- package/dist/verify-fix-cli.js +65 -11
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +9 -9
- package/skills/jevitate-run-journey/SKILL.md +23 -3
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { clock } from "@jevitate/domain";
|
|
5
|
+
import { flatJourneySteps } from "@jevitate/journey";
|
|
6
|
+
import { journeyReviewHash } from "./journey-review.js";
|
|
7
|
+
import { loadLogsRetention, pruneLogs } from "./logs-retention.js";
|
|
8
|
+
import { artifactStamp } from "./mission-journal.js";
|
|
9
|
+
import { maskValues } from "./mask-values.js";
|
|
10
|
+
import { logDateOf, logsRoot } from "./project-dir.js";
|
|
11
|
+
const READS = new Set(["GET", "HEAD", "OPTIONS"]);
|
|
12
|
+
/** What a record names a method by. A method is the page's own text, so anything else is `OTHER`, never stored. */
|
|
13
|
+
const STANDARD_METHODS = new Set(["GET", "HEAD", "OPTIONS", "POST", "PUT", "PATCH", "DELETE", "CONNECT", "TRACE"]);
|
|
14
|
+
const methodShape = (method) => (STANDARD_METHODS.has(method) ? method : "OTHER");
|
|
15
|
+
/** An API version: the one segment kept with no Journey to vouch for it. */
|
|
16
|
+
const API_VERSION = /^v\d{1,2}$/;
|
|
17
|
+
/** A template's or a glob's segment, which is no literal text. */
|
|
18
|
+
const NOT_LITERAL = /[*?{}$:]/;
|
|
19
|
+
/** The most distinct write shapes one record lists (the count stays exact). */
|
|
20
|
+
const MAX_SHAPES = 50;
|
|
21
|
+
/** The path of a recorded URL or request line, whichever it is. */
|
|
22
|
+
function pathOfRecorded(recorded) {
|
|
23
|
+
const line = /^[A-Z]+\s+(\S+)/.exec(recorded.trim())?.[1] ?? recorded.trim();
|
|
24
|
+
try {
|
|
25
|
+
return /^https?:\/\//i.test(line) ? new URL(line).pathname : (line.split(/[?#]/)[0] ?? "");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The path segments a Journey recorded as literal text: its pages' and navigations' URLs, and the requests its steps recorded or check. */
|
|
32
|
+
export function journeyRouteLiterals(journey) {
|
|
33
|
+
const paths = journey.recording.pages.map((page) => page.url);
|
|
34
|
+
for (const { recorded } of flatJourneySteps(journey)) {
|
|
35
|
+
if (recorded.step.kind === "navigate")
|
|
36
|
+
paths.push(recorded.step.url);
|
|
37
|
+
paths.push(...(recorded.delta?.requests ?? []));
|
|
38
|
+
for (const check of recorded.expectRequests ?? [])
|
|
39
|
+
if ("pathGlob" in check)
|
|
40
|
+
paths.push(check.pathGlob);
|
|
41
|
+
}
|
|
42
|
+
return new Set(paths.flatMap((p) => pathOfRecorded(p).split("/")).filter((segment) => segment !== "" && !NOT_LITERAL.test(segment)));
|
|
43
|
+
}
|
|
44
|
+
/** The shape of a URL path: what the Journey recorded as literal kept, a value's segment `:param`, anything else `:id`. */
|
|
45
|
+
export function writePathShape(pathname, values, literals = new Set()) {
|
|
46
|
+
const lowered = values.filter((v) => v !== "").map((v) => v.toLowerCase());
|
|
47
|
+
return pathname
|
|
48
|
+
.split("/")
|
|
49
|
+
.map((raw) => {
|
|
50
|
+
if (raw === "")
|
|
51
|
+
return raw;
|
|
52
|
+
let segment = raw;
|
|
53
|
+
try {
|
|
54
|
+
segment = decodeURIComponent(raw);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Not decodable: judged as it stands.
|
|
58
|
+
}
|
|
59
|
+
const lower = segment.toLowerCase();
|
|
60
|
+
if (lowered.some((v) => lower.includes(v) || v.includes(lower)))
|
|
61
|
+
return ":param";
|
|
62
|
+
return literals.has(raw) || API_VERSION.test(segment) ? segment : ":id";
|
|
63
|
+
})
|
|
64
|
+
.join("/");
|
|
65
|
+
}
|
|
66
|
+
export class JourneyRunRecorder {
|
|
67
|
+
#channel;
|
|
68
|
+
#id;
|
|
69
|
+
#params;
|
|
70
|
+
#root;
|
|
71
|
+
#startedAt = clock.nowIso();
|
|
72
|
+
#writes = new Map();
|
|
73
|
+
#hash;
|
|
74
|
+
#stepCount;
|
|
75
|
+
#origin;
|
|
76
|
+
#literals = new Set();
|
|
77
|
+
#extracted = new Set();
|
|
78
|
+
#detach;
|
|
79
|
+
constructor(req) {
|
|
80
|
+
this.#channel = req.channel;
|
|
81
|
+
this.#id = req.id;
|
|
82
|
+
this.#params = req.params;
|
|
83
|
+
this.#root = req.logsRoot;
|
|
84
|
+
}
|
|
85
|
+
/** The Journey the run resolved to. Reading it never fails a run. */
|
|
86
|
+
noteJourney(journey) {
|
|
87
|
+
try {
|
|
88
|
+
this.#hash ??= journeyReviewHash(journey);
|
|
89
|
+
this.#stepCount ??= flatJourneySteps(journey).length;
|
|
90
|
+
this.#origin = new URL(journey.recording.site).origin;
|
|
91
|
+
this.#literals = journeyRouteLiterals(journey);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// What could not be read stays absent from the record.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Watches the session's writes. A test double's page, with no context, has none to watch. */
|
|
98
|
+
attach(session) {
|
|
99
|
+
const page = session.page;
|
|
100
|
+
if (typeof page.context !== "function")
|
|
101
|
+
return;
|
|
102
|
+
const context = page.context();
|
|
103
|
+
const onRequest = (request) => {
|
|
104
|
+
const method = request.method().toUpperCase();
|
|
105
|
+
if (!READS.has(method))
|
|
106
|
+
this.#writes.set(request, { method: methodShape(method), url: request.url(), refused: false });
|
|
107
|
+
};
|
|
108
|
+
context.on("request", onRequest);
|
|
109
|
+
this.#detach = () => context.off("request", onRequest);
|
|
110
|
+
}
|
|
111
|
+
/** A value the run extracted, as it was extracted: a run that throws returns no `output` to read it from. Masked from the record, never stored. */
|
|
112
|
+
noteValue = (value) => {
|
|
113
|
+
this.#extracted.add(value);
|
|
114
|
+
};
|
|
115
|
+
/** A write the run guard kept from leaving the browser. */
|
|
116
|
+
noteRefusedWrite = (request) => {
|
|
117
|
+
const seen = this.#writes.get(request);
|
|
118
|
+
if (seen !== undefined)
|
|
119
|
+
seen.refused = true;
|
|
120
|
+
else
|
|
121
|
+
this.#writes.set(request, { method: methodShape(request.method().toUpperCase()), url: request.url(), refused: true });
|
|
122
|
+
};
|
|
123
|
+
#record(end) {
|
|
124
|
+
const output = end.output !== null && typeof end.output === "object" ? Object.values(end.output).filter((v) => typeof v === "string") : [];
|
|
125
|
+
const values = [...Object.values(this.#params), ...this.#extracted, ...output];
|
|
126
|
+
const shapes = new Map();
|
|
127
|
+
let count = 0;
|
|
128
|
+
let refused = 0;
|
|
129
|
+
for (const w of this.#writes.values()) {
|
|
130
|
+
if (w.refused)
|
|
131
|
+
refused += 1;
|
|
132
|
+
else
|
|
133
|
+
count += 1;
|
|
134
|
+
let url;
|
|
135
|
+
try {
|
|
136
|
+
url = new URL(w.url);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
142
|
+
continue;
|
|
143
|
+
const path = writePathShape(url.pathname, values, this.#literals);
|
|
144
|
+
const origin = url.origin === this.#origin ? undefined : maskValues(url.origin, values, "[param]");
|
|
145
|
+
const key = `${w.method} ${origin ?? ""}${path} ${w.refused}`;
|
|
146
|
+
const shape = shapes.get(key);
|
|
147
|
+
if (shape !== undefined)
|
|
148
|
+
shape.count += 1;
|
|
149
|
+
else
|
|
150
|
+
shapes.set(key, { method: w.method, path, count: 1, ...(origin === undefined ? {} : { origin }), ...(w.refused ? { refused: true } : {}) });
|
|
151
|
+
}
|
|
152
|
+
const listed = [...shapes.values()];
|
|
153
|
+
return {
|
|
154
|
+
kind: "journey-run",
|
|
155
|
+
version: 1,
|
|
156
|
+
channel: this.#channel,
|
|
157
|
+
journey: { id: this.#id, ...(this.#hash === undefined ? {} : { hash: this.#hash }) },
|
|
158
|
+
...(this.#origin === undefined ? {} : { origin: this.#origin }),
|
|
159
|
+
outcome: end.outcome,
|
|
160
|
+
...(end.code === undefined ? {} : { code: end.code }),
|
|
161
|
+
...(end.stoppedAtStep === undefined ? {} : { stoppedAtStep: end.stoppedAtStep }),
|
|
162
|
+
...(this.#stepCount === undefined ? {} : { stepCount: this.#stepCount }),
|
|
163
|
+
writes: { count, refused, shapes: listed.slice(0, MAX_SHAPES), ...(listed.length > MAX_SHAPES ? { truncated: true } : {}) },
|
|
164
|
+
startedAt: this.#startedAt,
|
|
165
|
+
endedAt: clock.nowIso(),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/** Writes the record atomically (a temp file renamed into place). Returns why it could not, never throws. */
|
|
169
|
+
finish(end) {
|
|
170
|
+
this.#detach?.();
|
|
171
|
+
this.#detach = undefined;
|
|
172
|
+
if (process.env.JEVITATE_RUN_RECORD === "off")
|
|
173
|
+
return undefined;
|
|
174
|
+
let tmp;
|
|
175
|
+
try {
|
|
176
|
+
const root = this.#root ?? logsRoot();
|
|
177
|
+
const dir = join(root, logDateOf(this.#startedAt) ?? this.#startedAt.slice(0, 10));
|
|
178
|
+
mkdirSync(dir, { recursive: true });
|
|
179
|
+
const name = `journey-run-${artifactStamp(this.#startedAt)}-${randomBytes(4).toString("hex")}.json`;
|
|
180
|
+
tmp = join(dir, `.${name}.tmp`);
|
|
181
|
+
writeFileSync(tmp, `${JSON.stringify(this.#record(end), null, 2)}\n`, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
182
|
+
renameSync(tmp, join(dir, name));
|
|
183
|
+
tmp = undefined;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
if (tmp !== undefined)
|
|
187
|
+
rmSync(tmp, { force: true });
|
|
188
|
+
const code = err !== null && typeof err === "object" && "code" in err ? String(err.code) : "error";
|
|
189
|
+
return `the run record could not be written (${code}); the run's outcome stands`;
|
|
190
|
+
}
|
|
191
|
+
// Over MCP no command's start prunes the logs (the CLI's does): the same retention, best effort.
|
|
192
|
+
if (this.#channel === "mcp") {
|
|
193
|
+
try {
|
|
194
|
+
pruneLogs(this.#root ?? logsRoot(), loadLogsRetention());
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Housekeeping is not the run's business (a bad config is `logs prune`'s to report).
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** The refusal or error code of what ended a run without a result. */
|
|
204
|
+
function endOfError(err) {
|
|
205
|
+
const e = err;
|
|
206
|
+
const code = typeof e?.code === "string" ? e.code : typeof e?.name === "string" ? e.name : undefined;
|
|
207
|
+
const at = e?.extra?.at;
|
|
208
|
+
return { outcome: e?.retryable === false ? "refused" : "error", ...(code === undefined ? {} : { code }), ...(typeof at === "number" ? { stoppedAtStep: at } : {}) };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Runs one Journey with its record: `runRecordError` on the result when the record could not be written,
|
|
212
|
+
* and on the error when the run itself threw (the caller reports it; the run's outcome is not touched).
|
|
213
|
+
*/
|
|
214
|
+
export async function withJourneyRunRecord(req, run) {
|
|
215
|
+
const recorder = new JourneyRunRecorder(req);
|
|
216
|
+
let result;
|
|
217
|
+
try {
|
|
218
|
+
result = await run(recorder);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
const problem = recorder.finish(endOfError(err));
|
|
222
|
+
if (problem !== undefined && err !== null && typeof err === "object")
|
|
223
|
+
err.runRecordError = problem;
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
const r = result;
|
|
227
|
+
const problem = recorder.finish({
|
|
228
|
+
outcome: typeof r?.outcome === "string" ? r.outcome : "unknown",
|
|
229
|
+
...(typeof r?.at === "number" ? { stoppedAtStep: r.at + 1 } : {}),
|
|
230
|
+
output: r?.output,
|
|
231
|
+
});
|
|
232
|
+
return problem === undefined ? result : { ...result, runRecordError: problem };
|
|
233
|
+
}
|
|
234
|
+
/** The `runRecordError` a run's thrown error carries, if any. */
|
|
235
|
+
export function runRecordErrorOf(err) {
|
|
236
|
+
const v = err !== null && typeof err === "object" ? err.runRecordError : undefined;
|
|
237
|
+
return typeof v === "string" ? v : undefined;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=journey-run-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-run-record.js","sourceRoot":"","sources":["../src/journey-run-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Journey } from "@jevitate/journey";
|
|
2
|
+
import { type JourneyApprovalState } from "@jevitate/mcp-facade";
|
|
2
3
|
/**
|
|
3
4
|
* #467 (review sheet) — `jevitate journey review --stale` / MCP `review_journey {stale: true}`:
|
|
4
5
|
* read-only. Every promoted Journey whose approval no longer matches its content hash, each labelled
|
|
@@ -35,6 +36,12 @@ export interface StaleJourneysResult {
|
|
|
35
36
|
}
|
|
36
37
|
/** #467: true when the approval is stale and the only change since is minted step ids (against the snapshot, else the approved hash). */
|
|
37
38
|
export declare function isStepIdOnlyStale(journey: Journey, snapshot: Journey | null): boolean;
|
|
39
|
+
/** #788: where a stored Journey's approval stands. Fails closed: anything that cannot be read is `undetermined`, never `current`. */
|
|
40
|
+
export declare function journeyApprovalState(journey: Journey, req: StaleJourneysRequest): Promise<JourneyApprovalState>;
|
|
41
|
+
/** #788: refuses a Journey an MCP run may not replay (`JourneyRunRefusedError`), before any browser. */
|
|
42
|
+
export declare function assertMcpRunnable(journey: Journey, journeysDir: string, catalogDir?: string | null): Promise<void>;
|
|
43
|
+
/** #788: the one stderr line `journey run` adds for a Journey MCP would refuse (none for an unknown id or a current approval). */
|
|
44
|
+
export declare function journeyDraftWarning(journeysDir: string, id: string, catalogDir: string | null): Promise<string | undefined>;
|
|
38
45
|
export declare function listStaleJourneys(req: StaleJourneysRequest): Promise<StaleJourneysResult>;
|
|
39
46
|
/** The human rendering (no `--json`). */
|
|
40
47
|
export declare function renderStaleJourneys(r: StaleJourneysResult): string;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { FsJourneyStore } from "@jevitate/journey";
|
|
2
|
+
import { assertJourneyRunnable, JourneyRunRefusedError } from "@jevitate/mcp-facade";
|
|
2
3
|
import { isStepIdOnlyChange } from "./journey-anchor-gate.js";
|
|
3
4
|
import { journeyApprovalMatches, journeyLegacyReviewHash, journeyReviewHash } from "./journey-review.js";
|
|
4
5
|
import { readApprovedSnapshot } from "./journey-review-store.js";
|
|
5
|
-
import { loadCatalog } from "./catalog-api.js";
|
|
6
|
+
import { loadCatalog, resolveCatalogDir } from "./catalog-api.js";
|
|
6
7
|
import { catalogJourney, journeyLinks } from "./catalog.js";
|
|
7
8
|
/** #467: true when the approval is stale and the only change since is minted step ids (against the snapshot, else the approved hash). */
|
|
8
9
|
export function isStepIdOnlyStale(journey, snapshot) {
|
|
@@ -13,6 +14,50 @@ export function isStepIdOnlyStale(journey, snapshot) {
|
|
|
13
14
|
return isStepIdOnlyChange(snapshot, journey);
|
|
14
15
|
return isStepIdOnlyChange(approval.contentHash, journey);
|
|
15
16
|
}
|
|
17
|
+
/** #467/#788: why this promoted Journey's approval is stale, or null when it is not: the one definition, for the list and for the run gate. */
|
|
18
|
+
function staleness(journey, catalog) {
|
|
19
|
+
if (!journeyApprovalMatches(journey))
|
|
20
|
+
return { hashStale: true, reason: "content changed since approval (steps, assertions or side effects)" };
|
|
21
|
+
const links = journeyLinks(catalog, catalogJourney(journey));
|
|
22
|
+
if (links.linked && [links.job?.status, links.persona?.status].includes("stale"))
|
|
23
|
+
return { hashStale: false, reason: "a linked catalog job/persona changed since its approval" };
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/** #788: where a stored Journey's approval stands. Fails closed: anything that cannot be read is `undetermined`, never `current`. */
|
|
27
|
+
export async function journeyApprovalState(journey, req) {
|
|
28
|
+
try {
|
|
29
|
+
if (journey.metadata.promoted !== true)
|
|
30
|
+
return { promoted: false, approval: "unrecorded" };
|
|
31
|
+
if (journey.metadata.approval === undefined)
|
|
32
|
+
return { promoted: true, approval: "unrecorded" };
|
|
33
|
+
const stale = staleness(journey, await loadCatalog(req.catalogDir, req.journeysDir));
|
|
34
|
+
return stale === null ? { promoted: true, approval: "current" } : { promoted: true, approval: "stale", reason: stale.reason, contentHash: journeyReviewHash(journey) };
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { promoted: journey.metadata.promoted === true, approval: "undetermined" };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** #788: refuses a Journey an MCP run may not replay (`JourneyRunRefusedError`), before any browser. */
|
|
41
|
+
export async function assertMcpRunnable(journey, journeysDir, catalogDir = resolveCatalogDir(undefined)) {
|
|
42
|
+
assertJourneyRunnable(journey.metadata.id, await journeyApprovalState(journey, { journeysDir, catalogDir }));
|
|
43
|
+
}
|
|
44
|
+
/** #788: the one stderr line `journey run` adds for a Journey MCP would refuse (none for an unknown id or a current approval). */
|
|
45
|
+
export async function journeyDraftWarning(journeysDir, id, catalogDir) {
|
|
46
|
+
let state;
|
|
47
|
+
try {
|
|
48
|
+
const journey = await new FsJourneyStore(journeysDir).get(id);
|
|
49
|
+
if (journey === null)
|
|
50
|
+
return undefined;
|
|
51
|
+
state = await journeyApprovalState(journey, { journeysDir, catalogDir });
|
|
52
|
+
assertJourneyRunnable(id, state);
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err instanceof JourneyRunRefusedError)
|
|
57
|
+
return `warning: ${err.code}: running anyway; MCP run_journey refuses this. Fix: ${err.fix}\n`;
|
|
58
|
+
return `warning: journey '${id}': could not read its approval; running anyway; MCP run_journey would refuse it\n`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
16
61
|
export async function listStaleJourneys(req) {
|
|
17
62
|
const store = new FsJourneyStore(req.journeysDir);
|
|
18
63
|
const catalog = await loadCatalog(req.catalogDir, req.journeysDir);
|
|
@@ -27,11 +72,10 @@ export async function listStaleJourneys(req) {
|
|
|
27
72
|
if (approval === undefined)
|
|
28
73
|
continue;
|
|
29
74
|
const contentHash = journeyReviewHash(journey);
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const catalogStale = !hashStale && links.linked && [links.job?.status, links.persona?.status].includes("stale");
|
|
33
|
-
if (!hashStale && !catalogStale)
|
|
75
|
+
const stale = staleness(journey, catalog);
|
|
76
|
+
if (stale === null)
|
|
34
77
|
continue;
|
|
78
|
+
const { hashStale, reason } = stale;
|
|
35
79
|
const snapshot = await readApprovedSnapshot(req.journeysDir, meta.id);
|
|
36
80
|
const stepIdOnly = hashStale && isStepIdOnlyStale(journey, snapshot);
|
|
37
81
|
journeys.push({
|
|
@@ -40,7 +84,7 @@ export async function listStaleJourneys(req) {
|
|
|
40
84
|
approvedHash: approval.contentHash,
|
|
41
85
|
contentHash,
|
|
42
86
|
stepIdOnly,
|
|
43
|
-
reason: stepIdOnly ? "ids added only (warn path)" :
|
|
87
|
+
reason: stepIdOnly ? "ids added only (warn path)" : reason,
|
|
44
88
|
reviewCommand: `jevitate journey review ${meta.id}`,
|
|
45
89
|
approveCommand: `jevitate journey promote ${meta.id} --reviewed-hash ${contentHash}`,
|
|
46
90
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-stale-api.js","sourceRoot":"","sources":["../src/journey-stale-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"journey-stale-api.js","sourceRoot":"","sources":["../src/journey-stale-api.ts"],"names":[],"mappings":"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"}
|