@zephyrdeng/pi-review 0.18.3 → 0.20.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 (71) hide show
  1. package/README.md +7 -0
  2. package/README.zh-CN.md +7 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +20 -2
  5. package/dist/args.js.map +1 -1
  6. package/dist/claude-plugin-sync.test.d.ts +2 -0
  7. package/dist/claude-plugin-sync.test.d.ts.map +1 -0
  8. package/dist/claude-plugin-sync.test.js +33 -0
  9. package/dist/claude-plugin-sync.test.js.map +1 -0
  10. package/dist/claude-plugin.d.ts +16 -0
  11. package/dist/claude-plugin.d.ts.map +1 -0
  12. package/dist/claude-plugin.js +58 -0
  13. package/dist/claude-plugin.js.map +1 -0
  14. package/dist/claude-plugin.test.d.ts +2 -0
  15. package/dist/claude-plugin.test.d.ts.map +1 -0
  16. package/dist/claude-plugin.test.js +21 -0
  17. package/dist/claude-plugin.test.js.map +1 -0
  18. package/dist/cli.js +12 -3
  19. package/dist/cli.js.map +1 -1
  20. package/dist/install.d.ts.map +1 -1
  21. package/dist/install.js +13 -4
  22. package/dist/install.js.map +1 -1
  23. package/dist/meta-footer.d.ts +3 -1
  24. package/dist/meta-footer.d.ts.map +1 -1
  25. package/dist/meta-footer.js +10 -0
  26. package/dist/meta-footer.js.map +1 -1
  27. package/dist/panel-ui.d.ts +8 -0
  28. package/dist/panel-ui.d.ts.map +1 -1
  29. package/dist/panel-ui.js +23 -0
  30. package/dist/panel-ui.js.map +1 -1
  31. package/dist/panel-ui.test.js +23 -1
  32. package/dist/panel-ui.test.js.map +1 -1
  33. package/dist/panel.d.ts +6 -0
  34. package/dist/panel.d.ts.map +1 -1
  35. package/dist/panel.js +17 -2
  36. package/dist/panel.js.map +1 -1
  37. package/dist/review.d.ts.map +1 -1
  38. package/dist/review.js +5 -1
  39. package/dist/review.js.map +1 -1
  40. package/dist/skill-update.test.js +2 -2
  41. package/dist/skill-update.test.js.map +1 -1
  42. package/dist/types.d.ts +60 -1
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/dist/update.d.ts.map +1 -1
  46. package/dist/update.js +9 -3
  47. package/dist/update.js.map +1 -1
  48. package/dist/verify-cli.d.ts +14 -0
  49. package/dist/verify-cli.d.ts.map +1 -0
  50. package/dist/verify-cli.js +223 -0
  51. package/dist/verify-cli.js.map +1 -0
  52. package/dist/verify-cli.test.d.ts +2 -0
  53. package/dist/verify-cli.test.d.ts.map +1 -0
  54. package/dist/verify-cli.test.js +208 -0
  55. package/dist/verify-cli.test.js.map +1 -0
  56. package/dist/verify-regression.test.d.ts +2 -0
  57. package/dist/verify-regression.test.d.ts.map +1 -0
  58. package/dist/verify-regression.test.js +307 -0
  59. package/dist/verify-regression.test.js.map +1 -0
  60. package/dist/verify.d.ts +151 -0
  61. package/dist/verify.d.ts.map +1 -0
  62. package/dist/verify.js +737 -0
  63. package/dist/verify.js.map +1 -0
  64. package/dist/verify.test.d.ts +2 -0
  65. package/dist/verify.test.d.ts.map +1 -0
  66. package/dist/verify.test.js +442 -0
  67. package/dist/verify.test.js.map +1 -0
  68. package/package.json +3 -2
  69. package/resources/review-presets.json +3 -3
  70. package/skills/pi-review/SKILL.md +26 -0
  71. package/skills/pi-review/references/codex-tools.md +1 -1
package/dist/update.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { createRequire } from "node:module";
3
+ import { removeStandaloneClaudeSkill, SKILL_ARGS_WITHOUT_CLAUDE, syncClaudePlugin } from "./claude-plugin.js";
3
4
  import { runUpdateSkill } from "./skill.js";
4
5
  const PKG_NAME = "@zephyrdeng/pi-review";
5
6
  function getCurrentVersion() {
@@ -43,8 +44,8 @@ function box(lines) {
43
44
  const body = lines.map((l) => `│ ${pad(l)} │`).join("\n");
44
45
  return `${top}\n${empty}\n${body}\n${empty}\n${bot}\n`;
45
46
  }
46
- function refreshSkill() {
47
- const skill = runUpdateSkill();
47
+ function refreshSkill(args = []) {
48
+ const skill = runUpdateSkill(args);
48
49
  if (!skill.ok) {
49
50
  process.stderr.write(box([
50
51
  "Skill refresh failed.",
@@ -112,10 +113,15 @@ export function runUpdate() {
112
113
  }
113
114
  // skills CLI pulls latest skill content from the source repo; the direct
114
115
  // fallback copies from this package tree (refreshed on disk after npm -g).
115
- const skillOk = refreshSkill();
116
+ const plugin = syncClaudePlugin();
117
+ const hasPlugin = plugin.status === "installed" || plugin.status === "updated";
118
+ const skillOk = refreshSkill(hasPlugin ? SKILL_ARGS_WITHOUT_CLAUDE : []);
119
+ if (hasPlugin)
120
+ removeStandaloneClaudeSkill();
116
121
  process.stdout.write(box([
117
122
  packageLine,
118
123
  skillOk ? "Skill refreshed ✓" : "Skill refresh failed",
124
+ plugin.message,
119
125
  "",
120
126
  skillOk ? "Done ✓" : "Package ok; skill needs manual install-skill",
121
127
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type VerificationPlan, type VerifyRepoConfig } from "./verify.js";
2
+ /** `verify show` exit code: at least one step needs a human decision before it can run. */
3
+ export declare const APPROVAL_REQUIRED_EXIT = 5;
4
+ /** Human-readable plan listing; returns whether any step still needs approval. */
5
+ export declare function formatPlanListing(plan: VerificationPlan, config: VerifyRepoConfig): {
6
+ text: string;
7
+ needsApproval: boolean;
8
+ };
9
+ /** Prompt for the read-only Pi proposer; it returns the same plan format a host would write. */
10
+ export declare function buildProposerPrompt(target: string, config: VerifyRepoConfig): string;
11
+ /** Pull the first JSON object out of model text (tolerates a ```json fence). */
12
+ export declare function extractJsonObject(text: string): unknown;
13
+ export declare function runVerifyCommand(input: string[]): Promise<never>;
14
+ //# sourceMappingURL=verify-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-cli.d.ts","sourceRoot":"","sources":["../src/verify-cli.ts"],"names":[],"mappings":"AAcA,OAAO,EAWL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAqCxC,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAuB5H;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAYpF;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASvD;AAgGD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAWtE"}
@@ -0,0 +1,223 @@
1
+ // `pi-review verify <propose|show|approve|run>`: the host-side handshake for
2
+ // agent-proposed, human-approved verification (docs/design/verify-mode.md).
3
+ // Nothing here executes a plan step except `run`, which goes through the same
4
+ // approval gate as `--verify-plan`.
5
+ import fs from "node:fs";
6
+ import { spawnSync } from "node:child_process";
7
+ import { resolveConfig } from "./config.js";
8
+ import { spawnBufferedChild } from "./child-process.js";
9
+ import { buildReviewerArgs } from "./panel.js";
10
+ import { normalizePayloadRefs, splitPayload } from "./prompt.js";
11
+ import { childEnv } from "./review.js";
12
+ import { extractFinalText } from "./json-events.js";
13
+ import { DEFAULT_MAX_FOLLOW_UP_ROUNDS, VERIFY_CONFIG_FILE, VerifyInputError, createApproval, isRunnable, loadRepoConfig, parsePlan, planSha256, resolveSteps, runVerification, } from "./verify.js";
14
+ /** `verify show` exit code: at least one step needs a human decision before it can run. */
15
+ export const APPROVAL_REQUIRED_EXIT = 5;
16
+ const VERIFY_USAGE = `Usage:
17
+ pi-review verify propose [--model m] [--provider p] [--thinking t] -- <@files|text...>
18
+ Read-only Pi child drafts a verification plan (JSON on stdout). Runs nothing.
19
+ pi-review verify show <plan.json>
20
+ Validate and list steps. Exit 0 = all pre-approved, 5 = human approval required, 2 = invalid.
21
+ pi-review verify approve <plan.json> (--all | --steps a,b) [--reject c,d] [--by <who/how>]
22
+ Print an approval record (JSON) bound to each step's content hash. Run only after the user decided.
23
+ pi-review verify run [--plan <plan.json>] [--approval <file>]...
24
+ Run approved steps in an isolated copy and print the verification summary JSON (no review).
25
+ `;
26
+ class VerifyUsageError extends Error {
27
+ }
28
+ function repoConfig(cwd) {
29
+ const top = spawnSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf8" });
30
+ if (top.status !== 0)
31
+ return { commands: [], link: [], maxFollowUpRounds: DEFAULT_MAX_FOLLOW_UP_ROUNDS };
32
+ return loadRepoConfig(top.stdout.trim());
33
+ }
34
+ function readPlan(file, config) {
35
+ if (!file)
36
+ throw new VerifyUsageError("a plan file is required");
37
+ let raw;
38
+ try {
39
+ raw = JSON.parse(fs.readFileSync(file, "utf8"));
40
+ }
41
+ catch (error) {
42
+ throw new VerifyInputError(`cannot read ${file}: ${error.message}`);
43
+ }
44
+ return parsePlan(raw, config.maxFollowUpRounds);
45
+ }
46
+ function csv(value, flag) {
47
+ if (!value || value.startsWith("--"))
48
+ throw new VerifyUsageError(`${flag} requires a value`);
49
+ return value.split(",").map((item) => item.trim()).filter(Boolean);
50
+ }
51
+ /** Human-readable plan listing; returns whether any step still needs approval. */
52
+ export function formatPlanListing(plan, config) {
53
+ const resolved = resolveSteps(plan, config, []);
54
+ const lines = [`Verification plan (proposer: ${plan.proposer ?? "host"}, sha256 ${planSha256(plan)})`];
55
+ if (plan.summary)
56
+ lines.push(plan.summary);
57
+ for (const { step, approval, sha } of resolved) {
58
+ lines.push("", `[${step.id}] round ${step.round ?? 1} · ${approval === "preapproved" ? `pre-approved (${VERIFY_CONFIG_FILE} at HEAD)` : "NEEDS APPROVAL"}`);
59
+ lines.push(` command: ${step.argv.map((a) => (/[\s"'$`\\]/.test(a) ? JSON.stringify(a) : a)).join(" ")}${step.cwd ? ` (cwd ${step.cwd})` : ""}`);
60
+ lines.push(` purpose: ${step.purpose}`);
61
+ if (step.expectedDurationSec !== undefined)
62
+ lines.push(` expected: ~${step.expectedDurationSec}s (timeout ${step.timeoutSec ?? 300}s)`);
63
+ if (step.sideEffects !== undefined || step.idempotent !== undefined) {
64
+ lines.push(` self-assessed (not a gate): side effects: ${step.sideEffects ?? "unstated"}; idempotent: ${step.idempotent ?? "unstated"}`);
65
+ }
66
+ for (const file of step.files ?? [])
67
+ lines.push(` new file (isolated copy only): ${file.path} (${file.content.length} chars)`);
68
+ lines.push(` step sha256: ${sha}`);
69
+ }
70
+ const needsApproval = resolved.some((r) => !isRunnable(r.approval));
71
+ lines.push("", needsApproval
72
+ ? "Approval required: show these steps to the user, then record the decision with `pi-review verify approve`."
73
+ : "All steps are pre-approved by the committed whitelist.");
74
+ return { text: lines.join("\n"), needsApproval };
75
+ }
76
+ /** Prompt for the read-only Pi proposer; it returns the same plan format a host would write. */
77
+ export function buildProposerPrompt(target, config) {
78
+ return [
79
+ "You are drafting a verification plan for pi-review. You can only read the repository (read, grep, find, ls). Do not run, edit, or write anything.",
80
+ "Inspect the target below, the repository's test setup, and any design docs. Propose the smallest set of commands that would confirm or refute the change's claims: targeted unit tests, type checks, lint, e2e/automation tests. If a key claim has no test, you may add one minimal repro test file via `files` (it is written only into a disposable copy).",
81
+ "Commands run without a shell from the repository root (or `cwd`), with a minimal environment and no secrets. A human approves every step before it runs.",
82
+ config.commands.length > 0
83
+ ? `Standing pre-approved commands (reuse the exact argv when relevant): ${config.commands.map((c) => JSON.stringify(c.argv)).join(", ")}`
84
+ : "There are no standing pre-approved commands.",
85
+ 'Respond with one JSON object only, no prose, in this shape:\n{"version":1,"proposer":"pi","summary":"...","steps":[{"id":"unit-x","argv":["npx","vitest","run","src/x.test.ts"],"purpose":"Claim or change this verifies","expectedDurationSec":30,"sideEffects":"...","idempotent":true,"isolated":true,"timeoutSec":120,"files":[{"path":"src/__verify__/repro.test.ts","content":"..."}]}]}',
86
+ "`id` matches [A-Za-z0-9_.-]{1,64}; `purpose` is required; omit `files` unless you add a repro.",
87
+ `<target>\n${target}\n</target>`,
88
+ ].join("\n\n");
89
+ }
90
+ /** Pull the first JSON object out of model text (tolerates a ```json fence). */
91
+ export function extractJsonObject(text) {
92
+ const start = text.indexOf("{");
93
+ const end = text.lastIndexOf("}");
94
+ if (start === -1 || end < start)
95
+ throw new VerifyInputError("proposer returned no JSON object");
96
+ try {
97
+ return JSON.parse(text.slice(start, end + 1));
98
+ }
99
+ catch (error) {
100
+ throw new VerifyInputError(`proposer JSON did not parse: ${error.message}`);
101
+ }
102
+ }
103
+ function runPropose(argv) {
104
+ const parsed = { command: "review", mode: "code", skills: [], payload: [], keepSession: false, stream: false };
105
+ while (argv.length > 0) {
106
+ const arg = argv.shift();
107
+ if (arg === "--") {
108
+ parsed.payload = argv.splice(0);
109
+ break;
110
+ }
111
+ if (arg === "--model")
112
+ parsed.model = argv.shift();
113
+ else if (arg === "--provider")
114
+ parsed.provider = argv.shift();
115
+ else if (arg === "--thinking")
116
+ parsed.thinking = argv.shift();
117
+ else
118
+ throw new VerifyUsageError(`verify propose: unknown option ${arg}`);
119
+ }
120
+ if (parsed.payload.length === 0)
121
+ throw new VerifyUsageError("verify propose needs a target after --");
122
+ const config = resolveConfig();
123
+ const repo = repoConfig(process.cwd());
124
+ const payload = normalizePayloadRefs(splitPayload(parsed.payload));
125
+ const target = [payload.userText, ...(payload.pathTargets ?? []).map((p) => `path: ${p}`), ...(payload.attachableFileRefs ?? []).map((f) => `file: ${f}`)]
126
+ .filter(Boolean)
127
+ .join("\n");
128
+ // Same hard read-only tool boundary and --no-session as panel reviewers.
129
+ const args = buildReviewerArgs(config, parsed, {}, buildProposerPrompt(target, repo), payload.attachableFileRefs ?? [], {}, undefined, "");
130
+ const child = spawnBufferedChild(config.piBin, args, { cwd: process.cwd(), env: childEnv(config.piBin) });
131
+ if (child.error || (child.status ?? 0) !== 0) {
132
+ process.stderr.write(`pi-review: verify propose: proposer child failed: ${child.error?.message ?? `exit ${child.status}`}\n${child.stderr ?? ""}`);
133
+ return 4;
134
+ }
135
+ const text = extractFinalText(child.stdout || "").text;
136
+ let plan;
137
+ try {
138
+ const raw = extractJsonObject(text);
139
+ plan = parsePlan({ ...raw, proposer: "pi" }, repo.maxFollowUpRounds);
140
+ }
141
+ catch (error) {
142
+ process.stderr.write(`pi-review: verify propose: ${error.message}\n--- proposer output ---\n${text}\n`);
143
+ return 4;
144
+ }
145
+ process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`);
146
+ return 0;
147
+ }
148
+ async function dispatch(input) {
149
+ const argv = [...input];
150
+ const sub = argv.shift();
151
+ if (!sub || sub === "-h" || sub === "--help") {
152
+ process.stdout.write(VERIFY_USAGE);
153
+ return sub ? 0 : 2;
154
+ }
155
+ switch (sub) {
156
+ case "propose":
157
+ return runPropose(argv);
158
+ case "show": {
159
+ const config = repoConfig(process.cwd());
160
+ const listing = formatPlanListing(readPlan(argv[0], config), config);
161
+ process.stdout.write(`${listing.text}\n`);
162
+ return listing.needsApproval ? APPROVAL_REQUIRED_EXIT : 0;
163
+ }
164
+ case "approve": {
165
+ const file = argv.shift();
166
+ const options = {};
167
+ while (argv.length > 0) {
168
+ const arg = argv.shift();
169
+ if (arg === "--all")
170
+ options.all = true;
171
+ else if (arg === "--steps")
172
+ options.approve = csv(argv.shift(), arg);
173
+ else if (arg === "--reject")
174
+ options.reject = csv(argv.shift(), arg);
175
+ else if (arg === "--by")
176
+ options.by = argv.shift();
177
+ else
178
+ throw new VerifyUsageError(`verify approve: unknown option ${arg}`);
179
+ }
180
+ const plan = readPlan(file, repoConfig(process.cwd()));
181
+ process.stdout.write(`${JSON.stringify(createApproval(plan, options), null, 2)}\n`);
182
+ return 0;
183
+ }
184
+ case "run": {
185
+ let planFile;
186
+ const approvalFiles = [];
187
+ while (argv.length > 0) {
188
+ const arg = argv.shift();
189
+ if (arg === "--plan")
190
+ planFile = argv.shift();
191
+ else if (arg === "--approval")
192
+ approvalFiles.push(...csv(argv.shift(), arg));
193
+ else
194
+ throw new VerifyUsageError(`verify run: unknown option ${arg}`);
195
+ }
196
+ const summary = await runVerification({
197
+ cwd: process.cwd(),
198
+ ...(planFile ? { planFile } : {}),
199
+ approvalFiles,
200
+ onLog: (line) => process.stderr.write(`${line}\n`),
201
+ });
202
+ process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
203
+ return 0;
204
+ }
205
+ default:
206
+ throw new VerifyUsageError(`unknown verify command: ${sub}`);
207
+ }
208
+ }
209
+ export async function runVerifyCommand(input) {
210
+ try {
211
+ process.exit(await dispatch(input));
212
+ }
213
+ catch (error) {
214
+ if (error instanceof VerifyUsageError || error instanceof VerifyInputError) {
215
+ process.stderr.write(`pi-review: ${error.message}\n`);
216
+ if (error instanceof VerifyUsageError)
217
+ process.stderr.write(VERIFY_USAGE);
218
+ process.exit(2);
219
+ }
220
+ throw error;
221
+ }
222
+ }
223
+ //# sourceMappingURL=verify-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-cli.js","sourceRoot":"","sources":["../src/verify-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verify-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-cli.test.d.ts","sourceRoot":"","sources":["../src/verify-cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ // CLI-level verify tests: the show/approve/run handshake and end-to-end
2
+ // injection into single, panel, and loop reviews. Pi is a fake script; no
3
+ // network, no real model.
4
+ import assert from "node:assert/strict";
5
+ import fs from "node:fs";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { spawnSync } from "node:child_process";
9
+ import { fileURLToPath, pathToFileURL } from "node:url";
10
+ import { afterEach, test } from "vitest";
11
+ import { buildProposerPrompt, extractJsonObject } from "./verify-cli.js";
12
+ const NODE = process.execPath;
13
+ const repoRoot = path.dirname(fileURLToPath(new URL("../package.json", import.meta.url)));
14
+ const tsxLoader = pathToFileURL(path.join(repoRoot, "node_modules/tsx/dist/loader.mjs")).href;
15
+ const temps = [];
16
+ afterEach(() => {
17
+ for (const dir of temps.splice(0))
18
+ fs.rmSync(dir, { recursive: true, force: true });
19
+ });
20
+ function tmp(prefix) {
21
+ const dir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), prefix)));
22
+ temps.push(dir);
23
+ return dir;
24
+ }
25
+ function git(cwd, ...args) {
26
+ const result = spawnSync("git", args, { cwd, encoding: "utf8" });
27
+ if (result.status !== 0)
28
+ throw new Error(result.stderr);
29
+ return result.stdout;
30
+ }
31
+ function makeRepo(whitelist) {
32
+ const dir = tmp("pi-review-verify-cli-repo-");
33
+ git(dir, "init", "-q");
34
+ git(dir, "config", "user.email", "t@example.com");
35
+ git(dir, "config", "user.name", "t");
36
+ git(dir, "config", "commit.gpgsign", "false");
37
+ fs.writeFileSync(path.join(dir, "a.txt"), "hello\n");
38
+ if (whitelist)
39
+ fs.writeFileSync(path.join(dir, ".pi-review.json"), JSON.stringify(whitelist));
40
+ git(dir, "add", "-A");
41
+ git(dir, "commit", "-qm", "init");
42
+ fs.writeFileSync(path.join(dir, "a.txt"), "hello, uncommitted\n");
43
+ return dir;
44
+ }
45
+ function writeFakePi(dir, reply) {
46
+ const argvDir = path.join(dir, "argv");
47
+ fs.mkdirSync(argvDir);
48
+ const bin = path.join(dir, "fake-pi");
49
+ fs.writeFileSync(bin, `#!/usr/bin/env node
50
+ const fs = require("node:fs");
51
+ const path = require("node:path");
52
+ fs.writeFileSync(path.join(${JSON.stringify(argvDir)}, process.pid + "-" + Date.now() + ".json"), JSON.stringify(process.argv.slice(2)));
53
+ const text = ${JSON.stringify(reply)};
54
+ const line = (o) => process.stdout.write(JSON.stringify(o) + "\\n");
55
+ line({ type: "message_end", message: { role: "assistant", content: [{ type: "text", text }], stopReason: "stop" } });
56
+ line({ type: "agent_end", messages: [{ role: "assistant", content: [{ type: "text", text }] }] });
57
+ `);
58
+ fs.chmodSync(bin, 0o755);
59
+ return { bin, argvDir };
60
+ }
61
+ const APPROVE = "## Verdict\napprove\n\n## Summary\n- ok\n\n## Findings\nNo material findings.\n";
62
+ const FINDINGS = "## Verdict\nrequest_changes\n\n## Summary\n- x\n\n## Findings\n### F1: Gate\n- Severity: high\n- Path: a.txt\n- Actionable: yes\n- Evidence: test-output count\n- Impact: x\n- Recommendation: y\n";
63
+ function cli(cwd, args, env = {}) {
64
+ const fullEnv = { ...process.env, ...env };
65
+ delete fullEnv.TYPESAFE_API_KEY;
66
+ delete fullEnv.PI_REVIEW_META_STDOUT;
67
+ return spawnSync(NODE, ["--import", tsxLoader, path.join(repoRoot, "src/cli.ts"), ...args], { cwd, env: fullEnv, encoding: "utf8", timeout: 60_000, input: "" });
68
+ }
69
+ function meta(stderr) {
70
+ const line = stderr.split("\n").find((l) => l.startsWith("PI_REVIEW_META_JSON: "));
71
+ assert.ok(line, stderr);
72
+ return JSON.parse(line.slice("PI_REVIEW_META_JSON: ".length));
73
+ }
74
+ function prompts(argvDir) {
75
+ return fs.readdirSync(argvDir).map((name) => JSON.parse(fs.readFileSync(path.join(argvDir, name), "utf8")).at(-1));
76
+ }
77
+ /** A step that appends one line per execution to a counter file outside the repo. */
78
+ function counterStep(counter) {
79
+ return { id: "count", argv: [NODE, "-e", `const fs=require('fs');fs.appendFileSync(${JSON.stringify(counter)},'x');console.log('VERIFY_OK '+fs.readFileSync('a.txt','utf8').trim())`], purpose: "Claim: a.txt carries the uncommitted edit" };
80
+ }
81
+ test("verify show exits 5 when approval is needed and 0 when everything is pre-approved", () => {
82
+ const repo = makeRepo({ verify: { commands: [{ id: "check", argv: ["npm", "run", "check"] }] } });
83
+ const io = tmp("pi-review-verify-cli-io-");
84
+ const plan = path.join(io, "plan.json");
85
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [{ id: "check", argv: ["npm", "run", "check"], purpose: "types" }, { id: "unit", argv: ["npm", "test"], purpose: "tests", sideEffects: "none", idempotent: true }] }));
86
+ const needs = cli(repo, ["verify", "show", plan]);
87
+ assert.equal(needs.status, 5, needs.stderr);
88
+ assert.match(needs.stdout, /\[check\] round 1 · pre-approved/);
89
+ assert.match(needs.stdout, /\[unit\] round 1 · NEEDS APPROVAL/);
90
+ assert.match(needs.stdout, /self-assessed \(not a gate\)/);
91
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [{ id: "check", argv: ["npm", "run", "check"], purpose: "types" }] }));
92
+ assert.equal(cli(repo, ["verify", "show", plan]).status, 0);
93
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [{ id: "x", argv: ["a"], purpose: "p", isolated: false }] }));
94
+ const invalid = cli(repo, ["verify", "show", plan]);
95
+ assert.equal(invalid.status, 2);
96
+ assert.match(invalid.stderr, /isolated=false/);
97
+ });
98
+ test("plan -> approve -> single review: reviewer prompt carries approved results, meta records approval hashes", () => {
99
+ const repo = makeRepo();
100
+ const io = tmp("pi-review-verify-cli-io-");
101
+ const counter = path.join(io, "count");
102
+ const plan = path.join(io, "plan.json");
103
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [counterStep(counter)] }));
104
+ const approve = cli(repo, ["verify", "approve", plan, "--all", "--by", "user via test"]);
105
+ assert.equal(approve.status, 0, approve.stderr);
106
+ const approval = path.join(io, "approval.json");
107
+ fs.writeFileSync(approval, approve.stdout);
108
+ const fake = writeFakePi(io, APPROVE);
109
+ const status = git(repo, "status", "--porcelain");
110
+ const run = cli(repo, ["--no-stream", "--verify-plan", plan, "--verify-approval", approval, "--", "@a.txt"], { PI_BIN: fake.bin });
111
+ assert.equal(run.status, 0, run.stderr);
112
+ const [prompt] = prompts(fake.argvDir);
113
+ assert.match(prompt, /## Verification evidence \(source type: test-output\)/);
114
+ assert.match(prompt, /approved by a human before it ran/);
115
+ assert.match(prompt, /VERIFY_OK hello, uncommitted/);
116
+ const m = meta(run.stderr);
117
+ assert.equal(m.verification.status, "passed");
118
+ assert.equal(m.verification.source, "test-output");
119
+ assert.equal(m.verification.approvals[0].approvedBy, "user via test");
120
+ assert.equal(m.verification.steps[0].approval, "approved");
121
+ assert.equal(m.verification.steps[0].stepSha256, JSON.parse(approve.stdout).decisions[0].stepSha256);
122
+ assert.match(run.stdout, /Verify\s+passed · 1 run \/ 0 not run/);
123
+ assert.equal(git(repo, "status", "--porcelain"), status);
124
+ });
125
+ test("--verify-plan without approval runs nothing and says so in prompt and meta", () => {
126
+ const repo = makeRepo();
127
+ const io = tmp("pi-review-verify-cli-io-");
128
+ const counter = path.join(io, "count");
129
+ const plan = path.join(io, "plan.json");
130
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [counterStep(counter)] }));
131
+ const fake = writeFakePi(io, APPROVE);
132
+ const run = cli(repo, ["--no-stream", "--verify-plan", plan, "--", "@a.txt"], { PI_BIN: fake.bin });
133
+ assert.equal(run.status, 0, run.stderr);
134
+ assert.equal(fs.existsSync(counter), false);
135
+ assert.match(prompts(fake.argvDir)[0], /Treat build, type-check, lint, and test status as UNVERIFIED/);
136
+ const m = meta(run.stderr);
137
+ assert.equal(m.verification.status, "unverified");
138
+ assert.equal(m.verification.steps[0].status, "skipped_unapproved");
139
+ });
140
+ test("panel: verification runs once and every reviewer receives the identical section", () => {
141
+ const repo = makeRepo();
142
+ const io = tmp("pi-review-verify-cli-io-");
143
+ const counter = path.join(io, "count");
144
+ const plan = path.join(io, "plan.json");
145
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [counterStep(counter)] }));
146
+ const approval = path.join(io, "approval.json");
147
+ fs.writeFileSync(approval, cli(repo, ["verify", "approve", plan, "--all"]).stdout);
148
+ const fake = writeFakePi(io, APPROVE);
149
+ const run = cli(repo, ["--reviewers", "3", "--verify-plan", plan, "--verify-approval", approval, "--", "@a.txt"], { PI_BIN: fake.bin });
150
+ assert.equal(run.status, 0, run.stderr);
151
+ assert.equal(fs.readFileSync(counter, "utf8"), "x", "verification must run exactly once per panel");
152
+ const sections = prompts(fake.argvDir).map((p) => p.slice(p.indexOf("## Verification evidence")));
153
+ assert.equal(sections.length, 3);
154
+ assert.equal(new Set(sections).size, 1);
155
+ assert.match(sections[0], /VERIFY_OK/);
156
+ const m = meta(run.stderr);
157
+ assert.equal(m.strategy, "panel");
158
+ assert.equal(m.verification.status, "passed");
159
+ for (const argv of fs.readdirSync(fake.argvDir).map((n) => JSON.parse(fs.readFileSync(path.join(fake.argvDir, n), "utf8")))) {
160
+ assert.equal(argv[argv.indexOf("--tools") + 1], "read,grep,find,ls", "reviewer tools must stay read-only");
161
+ }
162
+ });
163
+ test("loop re-verifies every round (no cached results)", () => {
164
+ const repo = makeRepo();
165
+ const io = tmp("pi-review-verify-cli-io-");
166
+ const counter = path.join(io, "count");
167
+ const plan = path.join(io, "plan.json");
168
+ fs.writeFileSync(plan, JSON.stringify({ version: 1, steps: [counterStep(counter)] }));
169
+ const approval = path.join(io, "approval.json");
170
+ fs.writeFileSync(approval, cli(repo, ["verify", "approve", plan, "--all"]).stdout);
171
+ const fake = writeFakePi(io, FINDINGS);
172
+ const run = cli(repo, ["loop", "--no-stream", "--max-rounds", "2", "--verify-plan", plan, "--verify-approval", approval, "--", "@a.txt"], { PI_BIN: fake.bin });
173
+ assert.equal(run.status, 1, run.stderr);
174
+ assert.equal(fs.readFileSync(counter, "utf8"), "xx", "one verification per loop round");
175
+ });
176
+ test("verify run prints a summary without starting any reviewer", () => {
177
+ const repo = makeRepo({ verify: { commands: [{ id: "ok", argv: [NODE, "-e", "console.log('fine')"] }] } });
178
+ const run = cli(repo, ["verify", "run"], { PI_BIN: "/nonexistent/pi" });
179
+ assert.equal(run.status, 0, run.stderr);
180
+ const summary = JSON.parse(run.stdout);
181
+ assert.equal(summary.status, "passed");
182
+ assert.equal(summary.proposer, "whitelist");
183
+ });
184
+ test("verify propose: read-only Pi child drafts a plan in the shared format", () => {
185
+ const repo = makeRepo();
186
+ const io = tmp("pi-review-verify-cli-io-");
187
+ const proposed = { version: 1, steps: [{ id: "unit", argv: ["npm", "test"], purpose: "claim" }] };
188
+ const fake = writeFakePi(io, "```json\n" + JSON.stringify(proposed) + "\n```");
189
+ const run = cli(repo, ["verify", "propose", "--", "@a.txt", "check the edit"], { PI_BIN: fake.bin });
190
+ assert.equal(run.status, 0, run.stderr);
191
+ const plan = JSON.parse(run.stdout);
192
+ assert.equal(plan.proposer, "pi");
193
+ assert.equal(plan.steps[0].id, "unit");
194
+ const argv = JSON.parse(fs.readFileSync(path.join(fake.argvDir, fs.readdirSync(fake.argvDir)[0]), "utf8"));
195
+ assert.equal(argv[argv.indexOf("--tools") + 1], "read,grep,find,ls");
196
+ assert.ok(argv.includes("--no-session"));
197
+ const garbage = writeFakePi(tmp("pi-review-verify-cli-io-"), "I think you should run the tests.");
198
+ const bad = cli(repo, ["verify", "propose", "--", "@a.txt"], { PI_BIN: garbage.bin });
199
+ assert.equal(bad.status, 4);
200
+ assert.match(bad.stderr, /no JSON object/);
201
+ });
202
+ test("proposer prompt lists the standing whitelist; JSON extraction tolerates fences", () => {
203
+ const prompt = buildProposerPrompt("file: @a.ts", { commands: [{ id: "c", argv: ["npm", "run", "check"] }], link: [], maxFollowUpRounds: 1 });
204
+ assert.match(prompt, /\["npm","run","check"\]/);
205
+ assert.match(prompt, /Do not run, edit, or write anything/);
206
+ assert.deepEqual(extractJsonObject("```json\n{\"a\":1}\n```"), { a: 1 });
207
+ });
208
+ //# sourceMappingURL=verify-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-cli.test.js","sourceRoot":"","sources":["../src/verify-cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verify-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-regression.test.d.ts","sourceRoot":"","sources":["../src/verify-regression.test.ts"],"names":[],"mappings":""}