@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.
Files changed (190) hide show
  1. package/dist/anchor-baselines.d.ts +26 -0
  2. package/dist/anchor-baselines.js +25 -0
  3. package/dist/anchor-baselines.js.map +1 -0
  4. package/dist/approval-provenance.d.ts +32 -2
  5. package/dist/approval-provenance.js +92 -5
  6. package/dist/approval-provenance.js.map +1 -1
  7. package/dist/approved-demo.d.ts +86 -0
  8. package/dist/approved-demo.js +184 -0
  9. package/dist/approved-demo.js.map +1 -0
  10. package/dist/bin.js +13352 -7050
  11. package/dist/build-info.generated.js +2 -2
  12. package/dist/campaign-api.d.ts +15 -0
  13. package/dist/campaign-api.js +67 -6
  14. package/dist/campaign-api.js.map +1 -1
  15. package/dist/campaign-cli.js +7 -2
  16. package/dist/campaign-cli.js.map +1 -1
  17. package/dist/campaign-preflight.d.ts +76 -0
  18. package/dist/campaign-preflight.js +117 -0
  19. package/dist/campaign-preflight.js.map +1 -0
  20. package/dist/catalog-analysis.js +14 -0
  21. package/dist/catalog-analysis.js.map +1 -1
  22. package/dist/catalog-api.js +12 -4
  23. package/dist/catalog-api.js.map +1 -1
  24. package/dist/catalog-bundle-api.d.ts +83 -0
  25. package/dist/catalog-bundle-api.js +309 -0
  26. package/dist/catalog-bundle-api.js.map +1 -0
  27. package/dist/catalog-bundle-findings.d.ts +64 -0
  28. package/dist/catalog-bundle-findings.js +326 -0
  29. package/dist/catalog-bundle-findings.js.map +1 -0
  30. package/dist/catalog-bundle.d.ts +296 -0
  31. package/dist/catalog-bundle.js +777 -0
  32. package/dist/catalog-bundle.js.map +1 -0
  33. package/dist/catalog-cli.d.ts +6 -0
  34. package/dist/catalog-cli.js +181 -5
  35. package/dist/catalog-cli.js.map +1 -1
  36. package/dist/catalog-refs.d.ts +42 -0
  37. package/dist/catalog-refs.js +188 -0
  38. package/dist/catalog-refs.js.map +1 -0
  39. package/dist/catalog-review.d.ts +3 -1
  40. package/dist/catalog-review.js +61 -0
  41. package/dist/catalog-review.js.map +1 -1
  42. package/dist/catalog.d.ts +27 -3
  43. package/dist/catalog.js +46 -2
  44. package/dist/catalog.js.map +1 -1
  45. package/dist/check-api.js +180 -9
  46. package/dist/check-api.js.map +1 -1
  47. package/dist/check-cli.d.ts +2 -0
  48. package/dist/check-cli.js +96 -2
  49. package/dist/check-cli.js.map +1 -1
  50. package/dist/check-execute.d.ts +18 -0
  51. package/dist/check-execute.js +56 -3
  52. package/dist/check-execute.js.map +1 -1
  53. package/dist/check-types.d.ts +105 -0
  54. package/dist/check-types.js.map +1 -1
  55. package/dist/cli-output.d.ts +6 -0
  56. package/dist/cli-output.js +38 -1
  57. package/dist/cli-output.js.map +1 -1
  58. package/dist/cli-shared.d.ts +10 -0
  59. package/dist/cli-shared.js +0 -4
  60. package/dist/cli-shared.js.map +1 -1
  61. package/dist/cold-start-report.d.ts +32 -0
  62. package/dist/cold-start-report.js +31 -0
  63. package/dist/cold-start-report.js.map +1 -0
  64. package/dist/defect-evidence.js +10 -5
  65. package/dist/defect-evidence.js.map +1 -1
  66. package/dist/demo-aspect-api.d.ts +11 -0
  67. package/dist/demo-aspect-api.js +27 -2
  68. package/dist/demo-aspect-api.js.map +1 -1
  69. package/dist/demo-aspect-cli.js +5 -0
  70. package/dist/demo-aspect-cli.js.map +1 -1
  71. package/dist/demo-capture.d.ts +79 -2
  72. package/dist/demo-capture.js +504 -12
  73. package/dist/demo-capture.js.map +1 -1
  74. package/dist/environments.d.ts +8 -1
  75. package/dist/environments.js +14 -3
  76. package/dist/environments.js.map +1 -1
  77. package/dist/exit-codes.js +16 -0
  78. package/dist/exit-codes.js.map +1 -1
  79. package/dist/explore-adversarial.js +2 -2
  80. package/dist/explore-adversarial.js.map +1 -1
  81. package/dist/explore-shared.d.ts +11 -0
  82. package/dist/explore-shared.js +9 -0
  83. package/dist/explore-shared.js.map +1 -1
  84. package/dist/findings-filing.js +7 -3
  85. package/dist/findings-filing.js.map +1 -1
  86. package/dist/forge-verify.d.ts +224 -0
  87. package/dist/forge-verify.js +649 -0
  88. package/dist/forge-verify.js.map +1 -0
  89. package/dist/github-issue-filer.js +15 -9
  90. package/dist/github-issue-filer.js.map +1 -1
  91. package/dist/init-codeowners.d.ts +19 -0
  92. package/dist/init-codeowners.js +66 -0
  93. package/dist/init-codeowners.js.map +1 -1
  94. package/dist/job-draft-api.d.ts +52 -0
  95. package/dist/job-draft-api.js +110 -0
  96. package/dist/job-draft-api.js.map +1 -0
  97. package/dist/journeeze-api.d.ts +77 -0
  98. package/dist/journeeze-api.js +371 -0
  99. package/dist/journeeze-api.js.map +1 -0
  100. package/dist/journeeze-connect.d.ts +156 -0
  101. package/dist/journeeze-connect.js +357 -0
  102. package/dist/journeeze-connect.js.map +1 -0
  103. package/dist/journey-anchor-api.d.ts +37 -0
  104. package/dist/journey-anchor-api.js +58 -0
  105. package/dist/journey-anchor-api.js.map +1 -0
  106. package/dist/journey-anchor-cli.d.ts +17 -0
  107. package/dist/journey-anchor-cli.js +104 -0
  108. package/dist/journey-anchor-cli.js.map +1 -0
  109. package/dist/journey-anchor-gate.d.ts +52 -0
  110. package/dist/journey-anchor-gate.js +101 -0
  111. package/dist/journey-anchor-gate.js.map +1 -0
  112. package/dist/journey-api.d.ts +30 -1
  113. package/dist/journey-api.js +118 -16
  114. package/dist/journey-api.js.map +1 -1
  115. package/dist/journey-cli.js +93 -10
  116. package/dist/journey-cli.js.map +1 -1
  117. package/dist/journey-demo-api.d.ts +29 -0
  118. package/dist/journey-demo-api.js +29 -7
  119. package/dist/journey-demo-api.js.map +1 -1
  120. package/dist/journey-heal.js +1 -1
  121. package/dist/journey-heal.js.map +1 -1
  122. package/dist/journey-lint-sarif.d.ts +3 -2
  123. package/dist/journey-lint-sarif.js +11 -2
  124. package/dist/journey-lint-sarif.js.map +1 -1
  125. package/dist/journey-migrate-api.d.ts +54 -0
  126. package/dist/journey-migrate-api.js +64 -0
  127. package/dist/journey-migrate-api.js.map +1 -0
  128. package/dist/journey-network-checks.d.ts +11 -0
  129. package/dist/journey-network-checks.js +36 -13
  130. package/dist/journey-network-checks.js.map +1 -1
  131. package/dist/journey-proposal-store.d.ts +9 -0
  132. package/dist/journey-proposal-store.js +23 -0
  133. package/dist/journey-proposal-store.js.map +1 -1
  134. package/dist/journey-result-record.d.ts +2 -0
  135. package/dist/journey-result-record.js +5 -0
  136. package/dist/journey-result-record.js.map +1 -1
  137. package/dist/journey-review-api.js +9 -1
  138. package/dist/journey-review-api.js.map +1 -1
  139. package/dist/journey-review.d.ts +11 -1
  140. package/dist/journey-review.js +77 -5
  141. package/dist/journey-review.js.map +1 -1
  142. package/dist/journey-stale-api.d.ts +40 -0
  143. package/dist/journey-stale-api.js +57 -0
  144. package/dist/journey-stale-api.js.map +1 -0
  145. package/dist/load-api.js +4 -2
  146. package/dist/load-api.js.map +1 -1
  147. package/dist/locator-health-api.d.ts +101 -0
  148. package/dist/locator-health-api.js +203 -0
  149. package/dist/locator-health-api.js.map +1 -0
  150. package/dist/locator-health.d.ts +195 -0
  151. package/dist/locator-health.js +419 -0
  152. package/dist/locator-health.js.map +1 -0
  153. package/dist/mcp-api.d.ts +3 -1
  154. package/dist/mcp-api.js +21 -2
  155. package/dist/mcp-api.js.map +1 -1
  156. package/dist/mcp-cli-tools.d.ts +4 -1
  157. package/dist/mcp-cli-tools.js +82 -10
  158. package/dist/mcp-cli-tools.js.map +1 -1
  159. package/dist/openrouter-call.d.ts +23 -10
  160. package/dist/openrouter-call.js +14 -11
  161. package/dist/openrouter-call.js.map +1 -1
  162. package/dist/png-pixels.d.ts +12 -0
  163. package/dist/png-pixels.js +96 -0
  164. package/dist/png-pixels.js.map +1 -0
  165. package/dist/project-config.d.ts +29 -0
  166. package/dist/project-config.js +76 -0
  167. package/dist/project-config.js.map +1 -0
  168. package/dist/regression-api.js +2 -1
  169. package/dist/regression-api.js.map +1 -1
  170. package/dist/server-log-verify.js +2 -1
  171. package/dist/server-log-verify.js.map +1 -1
  172. package/dist/signal-triage.js +7 -3
  173. package/dist/signal-triage.js.map +1 -1
  174. package/dist/source-run-api.js +2 -2
  175. package/dist/source-run-api.js.map +1 -1
  176. package/dist/verify-fix-api.d.ts +29 -0
  177. package/dist/verify-fix-api.js +43 -2
  178. package/dist/verify-fix-api.js.map +1 -1
  179. package/dist/verify-fix-cli.js +4 -0
  180. package/dist/verify-fix-cli.js.map +1 -1
  181. package/dist/zip-store.d.ts +15 -0
  182. package/dist/zip-store.js +93 -0
  183. package/dist/zip-store.js.map +1 -0
  184. package/package.json +12 -10
  185. package/skills/jevitate-ci-check/SKILL.md +16 -0
  186. package/skills/jevitate-demo/SKILL.md +4 -1
  187. package/skills/jevitate-getting-started/SKILL.md +7 -2
  188. package/skills/jevitate-run-journey/SKILL.md +15 -0
  189. package/skills/jevitate-test-campaign/SKILL.md +26 -0
  190. 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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"}