@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,26 @@
|
|
|
1
|
+
import { type Journey } from "@jevitate/journey";
|
|
2
|
+
import type { CheckBaseline } from "./check-types.js";
|
|
3
|
+
/**
|
|
4
|
+
* #469 (contract §4.3): the machine baseline of ONE clean Journey run. Pure — no I/O, no clock.
|
|
5
|
+
* `atMs` of an anchor = milliseconds from the first executed step's start to the anchor step's
|
|
6
|
+
* COMPLETION (its start + duration). Never produced from a run that did not complete.
|
|
7
|
+
*
|
|
8
|
+
* Check integration: after replaying a Journey item, pass the interpreter's outcome plus the per-step
|
|
9
|
+
* `StepTiming`s the run sank (`RecordedStep.timing` + `stepId`, with the flat step `index`) —
|
|
10
|
+
* `baseline: anchorBaseline(journey, { outcome: result.outcome, steps })`.
|
|
11
|
+
*/
|
|
12
|
+
export interface BaselineRunStep {
|
|
13
|
+
/** The step's 0-based flat position in the Journey (the interpreter's numbering). */
|
|
14
|
+
readonly index: number;
|
|
15
|
+
readonly stepId?: string;
|
|
16
|
+
/** Milliseconds from the run's start to this step's start (`StepTiming.atMs`). */
|
|
17
|
+
readonly atMs: number;
|
|
18
|
+
readonly durationMs: number;
|
|
19
|
+
}
|
|
20
|
+
export interface BaselineRun {
|
|
21
|
+
/** The interpreter's run outcome; only `completed` yields a baseline. */
|
|
22
|
+
readonly outcome: string;
|
|
23
|
+
/** One entry per step actually executed (skipped steps record none). */
|
|
24
|
+
readonly steps: readonly BaselineRunStep[];
|
|
25
|
+
}
|
|
26
|
+
export declare function anchorBaseline(journey: Journey, run: BaselineRun): CheckBaseline | undefined;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { flatJourneySteps } from "@jevitate/journey";
|
|
2
|
+
export function anchorBaseline(journey, run) {
|
|
3
|
+
if (run.outcome !== "completed" || run.steps.length === 0)
|
|
4
|
+
return undefined;
|
|
5
|
+
const firstStart = Math.min(...run.steps.map((s) => s.atMs));
|
|
6
|
+
const end = (s) => s.atMs - firstStart + s.durationMs;
|
|
7
|
+
const byIndex = new Map(run.steps.map((s) => [s.index, s]));
|
|
8
|
+
const flat = flatJourneySteps(journey);
|
|
9
|
+
const totalMs = Math.round(Math.max(...run.steps.map(end)));
|
|
10
|
+
const lastStep = Math.max(...run.steps.map((s) => s.index)) + 1;
|
|
11
|
+
const firstStepNo = Math.min(...run.steps.map((s) => s.index)) + 1;
|
|
12
|
+
const anchors = [{ name: "job_start", step: firstStepNo, atMs: 0 }];
|
|
13
|
+
for (const a of journey.metadata.anchors ?? []) {
|
|
14
|
+
const byId = a.stepId === undefined ? -1 : flat.findIndex((f) => f.recorded.stepId === a.stepId);
|
|
15
|
+
const index = byId >= 0 ? byId : a.step - 1;
|
|
16
|
+
const ran = byIndex.get(index);
|
|
17
|
+
if (ran === undefined)
|
|
18
|
+
continue;
|
|
19
|
+
const stepId = flat[index]?.recorded.stepId;
|
|
20
|
+
anchors.push({ name: a.name, step: index + 1, ...(stepId === undefined ? {} : { stepId }), atMs: Math.round(end(ran)) });
|
|
21
|
+
}
|
|
22
|
+
anchors.push({ name: "job_end", step: lastStep, atMs: totalMs });
|
|
23
|
+
return { steps: run.steps.length, totalMs, anchors };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=anchor-baselines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-baselines.js","sourceRoot":"","sources":["../src/anchor-baselines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ApprovalChannel, type ApprovalProvenance, type ApprovalsReport } from "@jevitate/journey";
|
|
2
2
|
import type { Catalog } from "./catalog.js";
|
|
3
|
+
import { type ForgeFactory, type GitTracked, type PrReviewEntry, type PrReviewVerdict } from "./forge-verify.js";
|
|
3
4
|
/**
|
|
4
5
|
* #437 — approval provenance and the human confirmation on every approval path (`journey promote`,
|
|
5
6
|
* `demo approve`, `persona approve`, `job approve`, and the `--accept-*` waivers given with them).
|
|
@@ -51,6 +52,12 @@ export interface ApprovalDeps {
|
|
|
51
52
|
/** Asks one question on the terminal and returns the typed line. */
|
|
52
53
|
readonly prompt?: (question: string) => Promise<string>;
|
|
53
54
|
readonly user?: () => string | undefined;
|
|
55
|
+
/** #469: the forge `pr-review` is verified through (default: GitHub over HTTPS). Tests inject a fake. */
|
|
56
|
+
readonly forge?: ForgeFactory;
|
|
57
|
+
/** #469: where a CI approval says why `pr-review` was not granted (default: stderr). */
|
|
58
|
+
readonly notice?: (line: string) => void;
|
|
59
|
+
/** #469: whether the re-verification cache dir holds git-tracked files (then it is not trusted). */
|
|
60
|
+
readonly gitTracked?: GitTracked;
|
|
54
61
|
}
|
|
55
62
|
/** What a person confirms: the item, the content hash its sheet shows, and the waivers given with it. */
|
|
56
63
|
export interface ApprovalRequest {
|
|
@@ -72,6 +79,11 @@ export interface ApprovalRequest {
|
|
|
72
79
|
readonly after: string;
|
|
73
80
|
}[];
|
|
74
81
|
};
|
|
82
|
+
/**
|
|
83
|
+
* #469: where the entry lives (its file and how to find it in any version of that file). With it,
|
|
84
|
+
* an approval in CI is checked for a verified pull-request review (`pr-review`) first.
|
|
85
|
+
*/
|
|
86
|
+
readonly entry?: PrReviewEntry;
|
|
75
87
|
}
|
|
76
88
|
/** Confirms an approval (or refuses it) and returns how it was made. */
|
|
77
89
|
export type ApprovalConfirm = (request: ApprovalRequest) => Promise<ApprovalProvenance>;
|
|
@@ -102,7 +114,11 @@ export interface ApprovalConfirmOptions {
|
|
|
102
114
|
export declare function checkNonInteractiveReason(reason: string | undefined): void;
|
|
103
115
|
/**
|
|
104
116
|
* The confirmation every CLI approval path runs just before it writes:
|
|
105
|
-
* - inside an MCP tool call: no prompt, recorded as `mcp` (an agent's approval)
|
|
117
|
+
* - inside an MCP tool call: no prompt, recorded as `mcp` (an agent's approval) — never `pr-review`;
|
|
118
|
+
* - #469: in CI with no terminal, for an entry the forge verifies (a merged, approved pull request
|
|
119
|
+
* changed it last): recorded as `pr-review` with the pull request and its reviewer. When the
|
|
120
|
+
* verification fails, why is printed and the paths below apply unchanged (`ci` with the escape
|
|
121
|
+
* hatch, else `E_APPROVAL_NEEDS_HUMAN`);
|
|
106
122
|
* - `--non-interactive-approval "<reason>"`: no prompt, recorded as `non-interactive` (or `ci` under a CI marker) with the reason;
|
|
107
123
|
* - otherwise a real TTY is required (else `E_APPROVAL_NEEDS_HUMAN`), and the person types the id or
|
|
108
124
|
* the first 8 characters of the content hash — once for the approval, once per waiver
|
|
@@ -131,6 +147,20 @@ export declare function parseAllowedChannels(list: string | undefined): Approval
|
|
|
131
147
|
* that is stale (the item changed since), one recorded before provenance existed, or one made over
|
|
132
148
|
* a channel not allowed.
|
|
133
149
|
*/
|
|
134
|
-
export declare function approvalsReport(catalogs: readonly Catalog[], allowed?: readonly ApprovalChannel[]): ApprovalsReport;
|
|
150
|
+
export declare function approvalsReport(catalogs: readonly Catalog[], allowed?: readonly ApprovalChannel[], prVerdicts?: ReadonlyMap<string, PrReviewVerdict>): ApprovalsReport;
|
|
151
|
+
export interface PrReviewCheckDeps {
|
|
152
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
153
|
+
readonly forge?: ForgeFactory;
|
|
154
|
+
readonly gitTracked?: GitTracked;
|
|
155
|
+
/** The project data dir whose `cache/pr-review/` caches positive re-verifications (null: no cache). */
|
|
156
|
+
readonly catalogDir?: string | null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* #469: `approvalsReport` with every recorded `pr-review` approval RE-VERIFIED through the forge
|
|
160
|
+
* (when `pr-review` is among `allowed`; otherwise it is a channel violation anyway and the forge is
|
|
161
|
+
* not asked). A record the forge does not confirm — a hand-written one, or one that cannot be
|
|
162
|
+
* re-verified (no token, offline) — is an `unverified` violation, never a pass.
|
|
163
|
+
*/
|
|
164
|
+
export declare function approvalsReportVerified(catalogs: readonly Catalog[], allowed: readonly ApprovalChannel[] | undefined, deps?: PrReviewCheckDeps): Promise<ApprovalsReport>;
|
|
135
165
|
/** The approvals section of `catalog status` (text). */
|
|
136
166
|
export declare function renderApprovals(report: ApprovalsReport): string;
|
|
@@ -2,6 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
|
|
|
2
2
|
import { userInfo } from "node:os";
|
|
3
3
|
import { createInterface } from "node:readline/promises";
|
|
4
4
|
import { APPROVAL_CHANNELS, } from "@jevitate/journey";
|
|
5
|
+
import { catalogItemEntry, githubForgeFactory, journeyEntry, PrReviewCache, prReviewCacheDir, reverifyPrReviewCached, verifyPrReviewForApproval, } from "./forge-verify.js";
|
|
5
6
|
/**
|
|
6
7
|
* #437 — approval provenance and the human confirmation on every approval path (`journey promote`,
|
|
7
8
|
* `demo approve`, `persona approve`, `job approve`, and the `--accept-*` waivers given with them).
|
|
@@ -143,9 +144,30 @@ export function checkNonInteractiveReason(reason) {
|
|
|
143
144
|
if (reason !== undefined && reason.trim() === "")
|
|
144
145
|
throw new ApprovalArgsError('--non-interactive-approval needs a reason (it is recorded with the approval): --non-interactive-approval "<why no person confirms this>"');
|
|
145
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* #469: in CI with no terminal, the `pr-review` channel — granted ONLY when the forge verifies the
|
|
149
|
+
* entry's last change came from a merged pull request approved by someone other than its author
|
|
150
|
+
* (forge-verify.ts). Never with waivers or a self-heal proposal: those are this run's own choices,
|
|
151
|
+
* which no reviewer saw. Returns the verdict, or null when not attempted (no entry, not in CI).
|
|
152
|
+
*/
|
|
153
|
+
async function prReviewAttempt(r, deps) {
|
|
154
|
+
if (r.entry === undefined)
|
|
155
|
+
return null;
|
|
156
|
+
const env = deps?.env ?? process.env;
|
|
157
|
+
if (!underCi(detectAgentSignals(env, { stdin: true, stdout: true })))
|
|
158
|
+
return null;
|
|
159
|
+
if (r.waivers.length > 0 || r.proposal !== undefined) {
|
|
160
|
+
return { ok: false, code: "has-waivers", reason: "an approval with waivers or a self-heal proposal needs a person: no pull-request reviewer saw them" };
|
|
161
|
+
}
|
|
162
|
+
return verifyPrReviewForApproval(r.entry, env, deps?.forge ?? githubForgeFactory);
|
|
163
|
+
}
|
|
146
164
|
/**
|
|
147
165
|
* The confirmation every CLI approval path runs just before it writes:
|
|
148
|
-
* - inside an MCP tool call: no prompt, recorded as `mcp` (an agent's approval)
|
|
166
|
+
* - inside an MCP tool call: no prompt, recorded as `mcp` (an agent's approval) — never `pr-review`;
|
|
167
|
+
* - #469: in CI with no terminal, for an entry the forge verifies (a merged, approved pull request
|
|
168
|
+
* changed it last): recorded as `pr-review` with the pull request and its reviewer. When the
|
|
169
|
+
* verification fails, why is printed and the paths below apply unchanged (`ci` with the escape
|
|
170
|
+
* hatch, else `E_APPROVAL_NEEDS_HUMAN`);
|
|
149
171
|
* - `--non-interactive-approval "<reason>"`: no prompt, recorded as `non-interactive` (or `ci` under a CI marker) with the reason;
|
|
150
172
|
* - otherwise a real TTY is required (else `E_APPROVAL_NEEDS_HUMAN`), and the person types the id or
|
|
151
173
|
* the first 8 characters of the content hash — once for the approval, once per waiver
|
|
@@ -156,14 +178,25 @@ export function makeApprovalConfirm(deps, opts = {}) {
|
|
|
156
178
|
if (inMcpInvocation())
|
|
157
179
|
return provenanceOf("mcp", deps);
|
|
158
180
|
const reason = opts.nonInteractiveReason?.trim();
|
|
159
|
-
if (reason !== undefined)
|
|
181
|
+
if (reason !== undefined)
|
|
160
182
|
checkNonInteractiveReason(reason);
|
|
183
|
+
const interactive = (deps?.stdinIsTTY?.() ?? process.stdin.isTTY === true) && (deps?.stdoutIsTTY?.() ?? process.stdout.isTTY === true);
|
|
184
|
+
let notGranted = "";
|
|
185
|
+
if (!interactive) {
|
|
186
|
+
const verdict = await prReviewAttempt(r, deps);
|
|
187
|
+
if (verdict?.ok === true)
|
|
188
|
+
return { ...provenanceOf("pr-review", deps), pr: verdict.pr };
|
|
189
|
+
if (verdict !== null && !verdict.ok) {
|
|
190
|
+
notGranted = `pr-review not granted for ${r.kind} '${r.id}': ${verdict.reason}`;
|
|
191
|
+
(deps?.notice ?? ((line) => process.stderr.write(`${line}\n`)))(notGranted);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (reason !== undefined) {
|
|
161
195
|
const p = provenanceOf("non-interactive", deps, reason);
|
|
162
196
|
return underCi(p.agentSignals) ? { ...p, channel: "ci" } : p;
|
|
163
197
|
}
|
|
164
|
-
const interactive = (deps?.stdinIsTTY?.() ?? process.stdin.isTTY === true) && (deps?.stdoutIsTTY?.() ?? process.stdout.isTTY === true);
|
|
165
198
|
if (!interactive)
|
|
166
|
-
throw new ApprovalNeedsHumanError(needsHumanMessage(r));
|
|
199
|
+
throw new ApprovalNeedsHumanError(`${needsHumanMessage(r)}${notGranted === "" ? "" : ` (${notGranted})`}`);
|
|
167
200
|
const ask = deps?.prompt ?? terminalPrompt;
|
|
168
201
|
const what = r.kind === "demo" ? `demo '${r.id}' (promotes Journey '${r.id}')` : `${r.kind} '${r.id}'`;
|
|
169
202
|
const proposalText = r.proposal === undefined
|
|
@@ -219,6 +252,8 @@ export function describeProvenance(p) {
|
|
|
219
252
|
return `approved non-interactively in CI${markers.length === 0 ? "" : ` (${markers.join(", ")})`}${reason}`;
|
|
220
253
|
case "non-interactive":
|
|
221
254
|
return `approved non-interactively${markers.length === 0 ? "" : ` (likely an agent: ${markers.join(", ")})`}${by}${reason}`;
|
|
255
|
+
case "pr-review":
|
|
256
|
+
return p.pr === undefined ? "approved by a pull-request review (unverified: no PR recorded)" : `approved by ${p.pr.reviewer}'s review of merged PR #${p.pr.number}`;
|
|
222
257
|
}
|
|
223
258
|
}
|
|
224
259
|
// ── Enforcement: --require-approvals ─────────────────────────────────────────────────────────
|
|
@@ -244,7 +279,7 @@ export function parseAllowedChannels(list) {
|
|
|
244
279
|
* that is stale (the item changed since), one recorded before provenance existed, or one made over
|
|
245
280
|
* a channel not allowed.
|
|
246
281
|
*/
|
|
247
|
-
export function approvalsReport(catalogs, allowed) {
|
|
282
|
+
export function approvalsReport(catalogs, allowed, prVerdicts) {
|
|
248
283
|
const records = [];
|
|
249
284
|
const violations = [];
|
|
250
285
|
const seen = new Set();
|
|
@@ -280,6 +315,18 @@ export function approvalsReport(catalogs, allowed) {
|
|
|
280
315
|
message: `${kind} '${id}': ${describeProvenance(provenance)} — channel '${provenance.channel}' is not allowed (allowed: ${allowed.join(", ")}); a person re-approves it at a terminal`,
|
|
281
316
|
});
|
|
282
317
|
}
|
|
318
|
+
else if (provenance.channel === "pr-review" && !stale) {
|
|
319
|
+
// #469: a recorded pr-review is honoured only when the forge re-confirms it — never on the record's word.
|
|
320
|
+
const v = prVerdicts?.get(key);
|
|
321
|
+
if (v?.ok !== true) {
|
|
322
|
+
violations.push({
|
|
323
|
+
kind,
|
|
324
|
+
id,
|
|
325
|
+
problem: "unverified",
|
|
326
|
+
message: `${kind} '${id}': ${describeProvenance(provenance)} — not confirmed by the forge (${v === undefined ? "it was not re-verified" : v.reason}); a pr-review approval counts only when GitHub confirms it`,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
283
330
|
};
|
|
284
331
|
for (const c of catalogs) {
|
|
285
332
|
for (const p of c.personas)
|
|
@@ -299,6 +346,46 @@ export function approvalsReport(catalogs, allowed) {
|
|
|
299
346
|
}
|
|
300
347
|
return { records, ...(allowed === undefined ? {} : { requirement: { allowedChannels: [...allowed], violations } }) };
|
|
301
348
|
}
|
|
349
|
+
/** The entry a recorded approval binds to (its file and hash), or null when it has no verifiable file. */
|
|
350
|
+
function recordedEntry(c, kind, id, contentHash) {
|
|
351
|
+
if (kind === "journey")
|
|
352
|
+
return c.journeysDir === undefined ? null : journeyEntry(c.journeysDir, id, contentHash);
|
|
353
|
+
const file = kind === "persona" ? c.personasFile : c.jobsFile;
|
|
354
|
+
return file === null ? null : catalogItemEntry(kind, file, id, contentHash);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* #469: `approvalsReport` with every recorded `pr-review` approval RE-VERIFIED through the forge
|
|
358
|
+
* (when `pr-review` is among `allowed`; otherwise it is a channel violation anyway and the forge is
|
|
359
|
+
* not asked). A record the forge does not confirm — a hand-written one, or one that cannot be
|
|
360
|
+
* re-verified (no token, offline) — is an `unverified` violation, never a pass.
|
|
361
|
+
*/
|
|
362
|
+
export async function approvalsReportVerified(catalogs, allowed, deps = {}) {
|
|
363
|
+
if (allowed === undefined || !allowed.includes("pr-review"))
|
|
364
|
+
return approvalsReport(catalogs, allowed);
|
|
365
|
+
const env = deps.env ?? process.env;
|
|
366
|
+
const cache = new PrReviewCache(prReviewCacheDir(deps.catalogDir ?? catalogs.find((c) => c.dir !== null)?.dir ?? null), deps.gitTracked);
|
|
367
|
+
const verdicts = new Map();
|
|
368
|
+
const verify = async (c, kind, id, approval, stale) => {
|
|
369
|
+
const key = `${kind}:${id}`;
|
|
370
|
+
const pr = approval?.provenance?.pr;
|
|
371
|
+
if (approval?.provenance?.channel !== "pr-review" || pr === undefined || stale || verdicts.has(key))
|
|
372
|
+
return;
|
|
373
|
+
const entry = recordedEntry(c, kind, id, approval.contentHash);
|
|
374
|
+
verdicts.set(key, entry === null
|
|
375
|
+
? { ok: false, code: "not-repo-file", reason: `${kind} '${id}' has no file of its own in this repository to verify` }
|
|
376
|
+
: await reverifyPrReviewCached(entry, pr, env, cache, deps.forge ?? githubForgeFactory));
|
|
377
|
+
};
|
|
378
|
+
for (const c of catalogs) {
|
|
379
|
+
for (const p of c.personas)
|
|
380
|
+
await verify(c, "persona", p.id, p.approval, p.status === "stale");
|
|
381
|
+
for (const j of c.jobs)
|
|
382
|
+
await verify(c, "job", j.id, j.approval, j.status === "stale");
|
|
383
|
+
for (const j of c.journeys)
|
|
384
|
+
if (j.promoted)
|
|
385
|
+
await verify(c, "journey", j.id, j.approval, j.approval !== undefined && j.approval.contentHash !== j.contentHash);
|
|
386
|
+
}
|
|
387
|
+
return approvalsReport(catalogs, allowed, verdicts);
|
|
388
|
+
}
|
|
302
389
|
/** The approvals section of `catalog status` (text). */
|
|
303
390
|
export function renderApprovals(report) {
|
|
304
391
|
const lines = ["", "APPROVALS"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-provenance.js","sourceRoot":"","sources":["../src/approval-provenance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"approval-provenance.js","sourceRoot":"","sources":["../src/approval-provenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type DemoJourneyResult } from "./journey-demo-api.js";
|
|
2
|
+
/**
|
|
3
|
+
* #471 — the approved demo's media record: what `catalog export --format journeeze-bundle` ships for a
|
|
4
|
+
* Journey with an approved demo (journeeze-saas `docs/contract/catalog-bundle-v1.md` §4.2, §7).
|
|
5
|
+
*
|
|
6
|
+
* `demo approve` writes it after the Journey is promoted, ONLY when the final render ran on an
|
|
7
|
+
* environment that declares `synthetic: true` (the data half of the attestation) and under
|
|
8
|
+
* jz-mask-v1 (the mask half). It lives beside the Journeys at `<journeys>/.demos/<id>/`:
|
|
9
|
+
* `demo.json` plus copies of the media that were PROVEN masked — each step screenshot whose capture
|
|
10
|
+
* was proven, and the video (with captions-only subtitles) only when every frame and every screenshot
|
|
11
|
+
* was. Anything unproven is never copied: it is listed in `leftOut` with why. A draft demo never gets
|
|
12
|
+
* a record; re-approving replaces it; a demo approved elsewhere (non-synthetic) removes it.
|
|
13
|
+
*
|
|
14
|
+
* Every file's sha256 is recorded at render time: the export re-hashes and leaves out a file that
|
|
15
|
+
* changed since (it could have been replaced by an unmasked one).
|
|
16
|
+
*/
|
|
17
|
+
export declare const APPROVED_DEMOS_DIR = ".demos";
|
|
18
|
+
export declare const APPROVED_DEMO_FILE = "demo.json";
|
|
19
|
+
export interface ApprovedDemoStep {
|
|
20
|
+
/** 1-based. */
|
|
21
|
+
readonly number: number;
|
|
22
|
+
readonly caption: string;
|
|
23
|
+
readonly expected?: string;
|
|
24
|
+
/** A file name in the record's folder (`step-NN.png`), present only when that capture was proven. */
|
|
25
|
+
readonly screenshot?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ApprovedDemoRecord {
|
|
28
|
+
readonly kind: "jevitate.demo.approved";
|
|
29
|
+
readonly version: 1;
|
|
30
|
+
readonly journey: string;
|
|
31
|
+
/** `journeyReviewHash` of the Journey as promoted (the approval's contentHash). */
|
|
32
|
+
readonly renderedFrom: string;
|
|
33
|
+
readonly approvedAtIso: string;
|
|
34
|
+
/** The environment's name (declared `synthetic: true`). */
|
|
35
|
+
readonly environment: string;
|
|
36
|
+
readonly title?: string;
|
|
37
|
+
readonly privacy: {
|
|
38
|
+
readonly mask: "jz-mask-v1";
|
|
39
|
+
readonly data: "synthetic";
|
|
40
|
+
readonly method: "dom-before-capture";
|
|
41
|
+
readonly regions: number;
|
|
42
|
+
};
|
|
43
|
+
readonly steps: readonly ApprovedDemoStep[];
|
|
44
|
+
readonly video?: "demo.webm";
|
|
45
|
+
readonly subtitles?: "demo.vtt";
|
|
46
|
+
/** sha256 and size of every media file in the folder, by name. */
|
|
47
|
+
readonly files: Readonly<Record<string, {
|
|
48
|
+
readonly sha256: string;
|
|
49
|
+
readonly bytes: number;
|
|
50
|
+
}>>;
|
|
51
|
+
/** Media left out at render time, each with why (never sent anywhere). */
|
|
52
|
+
readonly leftOut: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
export declare function approvedDemoDir(journeysDir: string, id: string): string;
|
|
55
|
+
/** Removes `id`'s approved-demo record and media (no-op when absent). */
|
|
56
|
+
export declare function clearApprovedDemo(journeysDir: string, id: string): Promise<void>;
|
|
57
|
+
export interface RecordApprovedDemoInput {
|
|
58
|
+
readonly journeysDir: string;
|
|
59
|
+
readonly id: string;
|
|
60
|
+
readonly renderedFrom: string;
|
|
61
|
+
readonly approvedAtIso: string;
|
|
62
|
+
readonly environment: string;
|
|
63
|
+
readonly title?: string;
|
|
64
|
+
/** The final render (`demoJourney` with `jzMask`). */
|
|
65
|
+
readonly demo: DemoJourneyResult;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Writes `id`'s record from a jz-mask-v1 final render (replacing any older one). Throws when the
|
|
69
|
+
* render carries no jz-mask-v1 proof — the caller never records an unmasked render.
|
|
70
|
+
*/
|
|
71
|
+
export declare function recordApprovedDemo(input: RecordApprovedDemoInput): Promise<ApprovedDemoRecord>;
|
|
72
|
+
/** Why `v` is not an {@link ApprovedDemoRecord} for `id`, or null. */
|
|
73
|
+
export declare function approvedDemoProblem(v: unknown, id: string): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* Reads `id`'s record: null when there is none (no approved demo on a synthetic environment).
|
|
76
|
+
* Throws on an unreadable or invalid record (the export leaves the demo out with that reason).
|
|
77
|
+
*/
|
|
78
|
+
export declare function readApprovedDemo(journeysDir: string, id: string): Promise<{
|
|
79
|
+
record: ApprovedDemoRecord;
|
|
80
|
+
dir: string;
|
|
81
|
+
} | null>;
|
|
82
|
+
/** The file's current sha256 and size, or null when it is missing or not a plain file (a symlink is not). */
|
|
83
|
+
export declare function currentDigest(path: string): Promise<{
|
|
84
|
+
sha256: string;
|
|
85
|
+
bytes: number;
|
|
86
|
+
} | null>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { copyFile, lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { demoSubtitles } from "./journey-demo-api.js";
|
|
5
|
+
/**
|
|
6
|
+
* #471 — the approved demo's media record: what `catalog export --format journeeze-bundle` ships for a
|
|
7
|
+
* Journey with an approved demo (journeeze-saas `docs/contract/catalog-bundle-v1.md` §4.2, §7).
|
|
8
|
+
*
|
|
9
|
+
* `demo approve` writes it after the Journey is promoted, ONLY when the final render ran on an
|
|
10
|
+
* environment that declares `synthetic: true` (the data half of the attestation) and under
|
|
11
|
+
* jz-mask-v1 (the mask half). It lives beside the Journeys at `<journeys>/.demos/<id>/`:
|
|
12
|
+
* `demo.json` plus copies of the media that were PROVEN masked — each step screenshot whose capture
|
|
13
|
+
* was proven, and the video (with captions-only subtitles) only when every frame and every screenshot
|
|
14
|
+
* was. Anything unproven is never copied: it is listed in `leftOut` with why. A draft demo never gets
|
|
15
|
+
* a record; re-approving replaces it; a demo approved elsewhere (non-synthetic) removes it.
|
|
16
|
+
*
|
|
17
|
+
* Every file's sha256 is recorded at render time: the export re-hashes and leaves out a file that
|
|
18
|
+
* changed since (it could have been replaced by an unmasked one).
|
|
19
|
+
*/
|
|
20
|
+
export const APPROVED_DEMOS_DIR = ".demos";
|
|
21
|
+
export const APPROVED_DEMO_FILE = "demo.json";
|
|
22
|
+
const ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
|
|
23
|
+
const SHA256_RE = /^[0-9a-f]{64}$/;
|
|
24
|
+
const SHOT_RE = /^step-[0-9]{2,3}\.png$/;
|
|
25
|
+
export function approvedDemoDir(journeysDir, id) {
|
|
26
|
+
if (!ID_RE.test(id))
|
|
27
|
+
throw new Error(`not a Journey id: ${JSON.stringify(id)}`);
|
|
28
|
+
return join(journeysDir, APPROVED_DEMOS_DIR, id);
|
|
29
|
+
}
|
|
30
|
+
/** Removes `id`'s approved-demo record and media (no-op when absent). */
|
|
31
|
+
export async function clearApprovedDemo(journeysDir, id) {
|
|
32
|
+
await rm(approvedDemoDir(journeysDir, id), { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
async function fileDigest(path) {
|
|
35
|
+
const buf = await readFile(path);
|
|
36
|
+
return { sha256: createHash("sha256").update(buf).digest("hex"), bytes: buf.byteLength };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Writes `id`'s record from a jz-mask-v1 final render (replacing any older one). Throws when the
|
|
40
|
+
* render carries no jz-mask-v1 proof — the caller never records an unmasked render.
|
|
41
|
+
*/
|
|
42
|
+
export async function recordApprovedDemo(input) {
|
|
43
|
+
const { demo } = input;
|
|
44
|
+
if (demo.jz === undefined)
|
|
45
|
+
throw new Error("the final demo was not rendered under jz-mask-v1 — nothing is recorded for export");
|
|
46
|
+
const dir = approvedDemoDir(input.journeysDir, input.id);
|
|
47
|
+
const stage = `${dir}.${randomBytes(6).toString("hex")}.tmp`;
|
|
48
|
+
await mkdir(stage, { recursive: true });
|
|
49
|
+
try {
|
|
50
|
+
const files = {};
|
|
51
|
+
const leftOut = [];
|
|
52
|
+
let regions = 0;
|
|
53
|
+
const proof = new Map(demo.jz.steps.map((s) => [s.step, s]));
|
|
54
|
+
const steps = [];
|
|
55
|
+
for (const s of demo.steps) {
|
|
56
|
+
const name = `step-${String(s.number).padStart(2, "0")}.png`;
|
|
57
|
+
const p = proof.get(s.number);
|
|
58
|
+
let screenshot;
|
|
59
|
+
if (p !== undefined && "leftOut" in p)
|
|
60
|
+
leftOut.push(`step ${s.number} screenshot: ${p.leftOut}`);
|
|
61
|
+
else if (p !== undefined && s.screenshot !== undefined) {
|
|
62
|
+
await copyFile(s.screenshot, join(stage, name));
|
|
63
|
+
files[name] = await fileDigest(join(stage, name));
|
|
64
|
+
regions += p.regions;
|
|
65
|
+
screenshot = name;
|
|
66
|
+
}
|
|
67
|
+
steps.push({ number: s.number, caption: s.caption, ...(s.expectedResult === undefined ? {} : { expected: s.expectedResult }), ...(screenshot === undefined ? {} : { screenshot }) });
|
|
68
|
+
}
|
|
69
|
+
let video;
|
|
70
|
+
let subtitles;
|
|
71
|
+
if (!demo.jz.video.proven)
|
|
72
|
+
leftOut.push(`video: ${demo.jz.video.reason ?? "not proven"}`);
|
|
73
|
+
else if (demo.video !== undefined) {
|
|
74
|
+
await copyFile(demo.video, join(stage, "demo.webm"));
|
|
75
|
+
files["demo.webm"] = await fileDigest(join(stage, "demo.webm"));
|
|
76
|
+
// Captions only: no goal NOTE and no observed lines — exactly the steps' captions, one cue each.
|
|
77
|
+
const vtt = demoSubtitles("", demo.steps.map(({ observed: _o, ...s }) => s), false);
|
|
78
|
+
await writeFile(join(stage, "demo.vtt"), vtt);
|
|
79
|
+
files["demo.vtt"] = await fileDigest(join(stage, "demo.vtt"));
|
|
80
|
+
video = "demo.webm";
|
|
81
|
+
subtitles = "demo.vtt";
|
|
82
|
+
}
|
|
83
|
+
const record = {
|
|
84
|
+
kind: "jevitate.demo.approved",
|
|
85
|
+
version: 1,
|
|
86
|
+
journey: input.id,
|
|
87
|
+
renderedFrom: input.renderedFrom,
|
|
88
|
+
approvedAtIso: input.approvedAtIso,
|
|
89
|
+
environment: input.environment,
|
|
90
|
+
...(input.title === undefined ? {} : { title: input.title }),
|
|
91
|
+
privacy: { mask: "jz-mask-v1", data: "synthetic", method: demo.jz.method, regions },
|
|
92
|
+
steps,
|
|
93
|
+
...(video === undefined ? {} : { video }),
|
|
94
|
+
...(subtitles === undefined ? {} : { subtitles }),
|
|
95
|
+
files,
|
|
96
|
+
leftOut,
|
|
97
|
+
};
|
|
98
|
+
await writeFile(join(stage, APPROVED_DEMO_FILE), `${JSON.stringify(record, null, 2)}\n`);
|
|
99
|
+
await rm(dir, { recursive: true, force: true });
|
|
100
|
+
await rename(stage, dir);
|
|
101
|
+
return record;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
await rm(stage, { recursive: true, force: true });
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Why `v` is not an {@link ApprovedDemoRecord} for `id`, or null. */
|
|
109
|
+
export function approvedDemoProblem(v, id) {
|
|
110
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
111
|
+
return "not an object";
|
|
112
|
+
const o = v;
|
|
113
|
+
if (o.kind !== "jevitate.demo.approved" || o.version !== 1)
|
|
114
|
+
return "not an approved-demo record (kind jevitate.demo.approved, version 1)";
|
|
115
|
+
if (o.journey !== id)
|
|
116
|
+
return `it is the record of ${JSON.stringify(o.journey)}`;
|
|
117
|
+
if (typeof o.renderedFrom !== "string" || !SHA256_RE.test(o.renderedFrom))
|
|
118
|
+
return "renderedFrom is not a sha256";
|
|
119
|
+
const p = o.privacy;
|
|
120
|
+
if (p === undefined || p.mask !== "jz-mask-v1" || p.data !== "synthetic" || p.method !== "dom-before-capture" || !Number.isSafeInteger(p.regions) || p.regions < 0) {
|
|
121
|
+
return "privacy is not a jz-mask-v1 / synthetic attestation";
|
|
122
|
+
}
|
|
123
|
+
if (!Array.isArray(o.steps) || o.steps.length === 0)
|
|
124
|
+
return "steps: expected a non-empty list";
|
|
125
|
+
const files = o.files;
|
|
126
|
+
if (files === null || typeof files !== "object" || Array.isArray(files))
|
|
127
|
+
return "files: expected an object";
|
|
128
|
+
for (const [name, f] of Object.entries(files)) {
|
|
129
|
+
if (!SHOT_RE.test(name) && name !== "demo.webm" && name !== "demo.vtt")
|
|
130
|
+
return `files: unexpected file ${JSON.stringify(name)}`;
|
|
131
|
+
const d = f;
|
|
132
|
+
if (d === null || typeof d !== "object" || typeof d.sha256 !== "string" || !SHA256_RE.test(d.sha256) || !Number.isSafeInteger(d.bytes))
|
|
133
|
+
return `files.${name}: expected { sha256, bytes }`;
|
|
134
|
+
}
|
|
135
|
+
for (const [i, s] of o.steps.entries()) {
|
|
136
|
+
const st = s;
|
|
137
|
+
if (st === null || typeof st !== "object" || st.number !== i + 1 || typeof st.caption !== "string")
|
|
138
|
+
return `steps[${i}]: expected { number: ${i + 1}, caption }`;
|
|
139
|
+
if (st.expected !== undefined && typeof st.expected !== "string")
|
|
140
|
+
return `steps[${i}].expected: expected text`;
|
|
141
|
+
if (st.screenshot !== undefined && (typeof st.screenshot !== "string" || !SHOT_RE.test(st.screenshot) || !(st.screenshot in files)))
|
|
142
|
+
return `steps[${i}].screenshot: not a listed step-NN.png`;
|
|
143
|
+
}
|
|
144
|
+
if (o.video !== undefined && (o.video !== "demo.webm" || !("demo.webm" in files)))
|
|
145
|
+
return "video: not a listed demo.webm";
|
|
146
|
+
if (o.subtitles !== undefined && (o.subtitles !== "demo.vtt" || !("demo.vtt" in files)))
|
|
147
|
+
return "subtitles: not a listed demo.vtt";
|
|
148
|
+
if (o.title !== undefined && typeof o.title !== "string")
|
|
149
|
+
return "title: expected text";
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Reads `id`'s record: null when there is none (no approved demo on a synthetic environment).
|
|
154
|
+
* Throws on an unreadable or invalid record (the export leaves the demo out with that reason).
|
|
155
|
+
*/
|
|
156
|
+
export async function readApprovedDemo(journeysDir, id) {
|
|
157
|
+
const dir = approvedDemoDir(journeysDir, id);
|
|
158
|
+
let raw;
|
|
159
|
+
try {
|
|
160
|
+
raw = await readFile(join(dir, APPROVED_DEMO_FILE), "utf8");
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (err.code === "ENOENT")
|
|
164
|
+
return null;
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
const parsed = JSON.parse(raw);
|
|
168
|
+
const problem = approvedDemoProblem(parsed, id);
|
|
169
|
+
if (problem !== null)
|
|
170
|
+
throw new Error(`${join(dir, APPROVED_DEMO_FILE)}: ${problem}`);
|
|
171
|
+
return { record: parsed, dir };
|
|
172
|
+
}
|
|
173
|
+
/** The file's current sha256 and size, or null when it is missing or not a plain file (a symlink is not). */
|
|
174
|
+
export async function currentDigest(path) {
|
|
175
|
+
try {
|
|
176
|
+
if (!(await lstat(path)).isFile())
|
|
177
|
+
return null;
|
|
178
|
+
return await fileDigest(path);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=approved-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approved-demo.js","sourceRoot":"","sources":["../src/approved-demo.ts"],"names":[],"mappings":"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"}
|