@zephyrdeng/pi-review 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -13
- package/README.zh-CN.md +64 -3
- package/dist/args.d.ts +8 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +147 -28
- package/dist/args.js.map +1 -1
- package/dist/args.test.d.ts +2 -0
- package/dist/args.test.d.ts.map +1 -0
- package/dist/args.test.js +115 -0
- package/dist/args.test.js.map +1 -0
- package/dist/cli-exit.test.d.ts +2 -0
- package/dist/cli-exit.test.d.ts.map +1 -0
- package/dist/cli-exit.test.js +84 -0
- package/dist/cli-exit.test.js.map +1 -0
- package/dist/cli.js +16 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/extensions/review.d.ts +2 -0
- package/dist/extensions/review.js +22 -0
- package/dist/extensions/rv-prompts.d.ts +19 -0
- package/dist/extensions/rv-prompts.js +132 -0
- package/dist/index.d.ts +17 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/json-events.d.ts +45 -0
- package/dist/json-events.d.ts.map +1 -1
- package/dist/json-events.js +185 -0
- package/dist/json-events.js.map +1 -1
- package/dist/json-events.test.js +64 -1
- package/dist/json-events.test.js.map +1 -1
- package/dist/loop.d.ts +36 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +73 -0
- package/dist/loop.js.map +1 -0
- package/dist/loop.test.d.ts +2 -0
- package/dist/loop.test.d.ts.map +1 -0
- package/dist/loop.test.js +83 -0
- package/dist/loop.test.js.map +1 -0
- package/dist/matcher.d.ts +74 -0
- package/dist/matcher.d.ts.map +1 -0
- package/dist/matcher.js +202 -0
- package/dist/matcher.js.map +1 -0
- package/dist/matcher.test.d.ts +2 -0
- package/dist/matcher.test.d.ts.map +1 -0
- package/dist/matcher.test.js +161 -0
- package/dist/matcher.test.js.map +1 -0
- package/dist/meta-footer.d.ts +15 -1
- package/dist/meta-footer.d.ts.map +1 -1
- package/dist/meta-footer.js +108 -0
- package/dist/meta-footer.js.map +1 -1
- package/dist/meta-footer.test.js +43 -1
- package/dist/meta-footer.test.js.map +1 -1
- package/dist/panel-aggregate.d.ts +18 -0
- package/dist/panel-aggregate.d.ts.map +1 -0
- package/dist/panel-aggregate.js +247 -0
- package/dist/panel-aggregate.js.map +1 -0
- package/dist/panel-aggregate.test.d.ts +2 -0
- package/dist/panel-aggregate.test.d.ts.map +1 -0
- package/dist/panel-aggregate.test.js +461 -0
- package/dist/panel-aggregate.test.js.map +1 -0
- package/dist/panel-cli.test.d.ts +2 -0
- package/dist/panel-cli.test.d.ts.map +1 -0
- package/dist/panel-cli.test.js +188 -0
- package/dist/panel-cli.test.js.map +1 -0
- package/dist/panel-config.d.ts +19 -0
- package/dist/panel-config.d.ts.map +1 -0
- package/dist/panel-config.js +115 -0
- package/dist/panel-config.js.map +1 -0
- package/dist/panel-config.test.d.ts +2 -0
- package/dist/panel-config.test.d.ts.map +1 -0
- package/dist/panel-config.test.js +91 -0
- package/dist/panel-config.test.js.map +1 -0
- package/dist/panel-loop.test.d.ts +2 -0
- package/dist/panel-loop.test.d.ts.map +1 -0
- package/dist/panel-loop.test.js +118 -0
- package/dist/panel-loop.test.js.map +1 -0
- package/dist/panel.d.ts +10 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +315 -0
- package/dist/panel.js.map +1 -0
- package/dist/presets.d.ts +2 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +10 -0
- package/dist/presets.js.map +1 -1
- package/dist/prompt.d.ts +14 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +61 -15
- package/dist/prompt.js.map +1 -1
- package/dist/prompt.test.d.ts +2 -0
- package/dist/prompt.test.d.ts.map +1 -0
- package/dist/prompt.test.js +37 -0
- package/dist/prompt.test.js.map +1 -0
- package/dist/review-result.d.ts +5 -0
- package/dist/review-result.d.ts.map +1 -0
- package/dist/review-result.js +98 -0
- package/dist/review-result.js.map +1 -0
- package/dist/review-result.test.d.ts +2 -0
- package/dist/review-result.test.d.ts.map +1 -0
- package/dist/review-result.test.js +196 -0
- package/dist/review-result.test.js.map +1 -0
- package/dist/review.d.ts +10 -4
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +82 -20
- package/dist/review.js.map +1 -1
- package/dist/review.meta.test.js +2 -2
- package/dist/review.meta.test.js.map +1 -1
- package/dist/skill-protocol.test.d.ts +2 -0
- package/dist/skill-protocol.test.d.ts.map +1 -0
- package/dist/skill-protocol.test.js +35 -0
- package/dist/skill-protocol.test.js.map +1 -0
- package/dist/types.d.ts +147 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/extensions/rv-completions.test.ts +15 -0
- package/extensions/rv-completions.ts +7 -1
- package/package.json +3 -3
- package/resources/panel-presets.json +21 -0
- package/resources/system-prompt.md +11 -1
- package/skills/pi-review/SKILL.md +90 -12
- package/skills/pi-review/references/codex-tools.md +19 -6
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { ArgsParseError, parseReviewCommand } from "./args.js";
|
|
4
|
+
test("review remains the default and explicit command", () => {
|
|
5
|
+
assert.equal(parseReviewCommand(["--", "@src"]).command, "review");
|
|
6
|
+
assert.equal(parseReviewCommand(["review", "--", "@src"]).command, "review");
|
|
7
|
+
});
|
|
8
|
+
test("loop parses max rounds and shared review options", () => {
|
|
9
|
+
const parsed = parseReviewCommand([
|
|
10
|
+
"loop",
|
|
11
|
+
"--max-rounds",
|
|
12
|
+
"5",
|
|
13
|
+
"--mode",
|
|
14
|
+
"challenge",
|
|
15
|
+
"--model",
|
|
16
|
+
"provider/model",
|
|
17
|
+
"--",
|
|
18
|
+
"@docs/design.md",
|
|
19
|
+
"focus on rollback",
|
|
20
|
+
]);
|
|
21
|
+
assert.equal(parsed.command, "loop");
|
|
22
|
+
assert.equal(parsed.maxRounds, 5);
|
|
23
|
+
assert.equal(parsed.mode, "challenge");
|
|
24
|
+
assert.equal(parsed.model, "provider/model");
|
|
25
|
+
assert.deepEqual(parsed.payload, ["@docs/design.md", "focus on rollback"]);
|
|
26
|
+
});
|
|
27
|
+
test("loop uses a small default review budget", () => {
|
|
28
|
+
const parsed = parseReviewCommand(["loop", "--", "@src"]);
|
|
29
|
+
assert.equal(parsed.command, "loop");
|
|
30
|
+
assert.equal(parsed.maxRounds, 3);
|
|
31
|
+
});
|
|
32
|
+
test("loop rejects invalid max-rounds values as usage errors", () => {
|
|
33
|
+
for (const value of ["0", "-1", "1.5", "many", "9007199254740992"]) {
|
|
34
|
+
assert.throws(() => parseReviewCommand(["loop", "--max-rounds", value, "--", "@src"]), (error) => error instanceof ArgsParseError
|
|
35
|
+
&& error.exitCode === 2
|
|
36
|
+
&& /positive integer/.test(error.message));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
test("loop rejects session reuse and review rejects loop-only flags", () => {
|
|
40
|
+
for (const sessionArgs of [
|
|
41
|
+
["--keep-session"],
|
|
42
|
+
["--continue", "/tmp/session.jsonl"],
|
|
43
|
+
["--name", "gate"],
|
|
44
|
+
]) {
|
|
45
|
+
assert.throws(() => parseReviewCommand(["loop", ...sessionArgs, "--", "@src"]), /loop cannot be used/);
|
|
46
|
+
}
|
|
47
|
+
assert.throws(() => parseReviewCommand(["review", "--max-rounds", "2", "--", "@src"]), /only be used with loop/);
|
|
48
|
+
});
|
|
49
|
+
test("panel options parse for review and loop", () => {
|
|
50
|
+
const parsed = parseReviewCommand([
|
|
51
|
+
"--reviewers", "3", "--consensus", "quorum", "--min-agree", "2", "--concurrency", "2", "--", "@src",
|
|
52
|
+
]);
|
|
53
|
+
assert.equal(parsed.reviewers, 3);
|
|
54
|
+
assert.equal(parsed.consensus, "quorum");
|
|
55
|
+
assert.equal(parsed.minAgree, 2);
|
|
56
|
+
assert.equal(parsed.concurrency, 2);
|
|
57
|
+
const loopParsed = parseReviewCommand([
|
|
58
|
+
"loop", "--reviewers", "3", "--consensus", "quorum", "--min-agree", "2", "--max-rounds", "2", "--", "@src",
|
|
59
|
+
]);
|
|
60
|
+
assert.equal(loopParsed.command, "loop");
|
|
61
|
+
assert.equal(loopParsed.reviewers, 3);
|
|
62
|
+
assert.equal(loopParsed.maxRounds, 2);
|
|
63
|
+
const panelParsed = parseReviewCommand(["--panel", "code-experts", "--consensus", "majority", "--", "@src"]);
|
|
64
|
+
assert.equal(panelParsed.panel, "code-experts");
|
|
65
|
+
assert.equal(panelParsed.consensus, "majority");
|
|
66
|
+
});
|
|
67
|
+
test("reviewer count must be a positive integer within the limit", () => {
|
|
68
|
+
for (const value of ["0", "-1", "1.5", "many"]) {
|
|
69
|
+
assert.throws(() => parseReviewCommand(["--reviewers", value, "--", "@src"]), (error) => error instanceof ArgsParseError && /positive integer/.test(error.message));
|
|
70
|
+
}
|
|
71
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "9", "--", "@src"]), (error) => error instanceof ArgsParseError && /between 1 and 8/.test(error.message));
|
|
72
|
+
});
|
|
73
|
+
test("minimum agreement must be a positive integer and cannot exceed reviewers", () => {
|
|
74
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "3", "--min-agree", "0", "--", "@src"]), (error) => error instanceof ArgsParseError && /positive integer/.test(error.message));
|
|
75
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "2", "--consensus", "quorum", "--min-agree", "3", "--", "@src"]), (error) => error instanceof ArgsParseError && /cannot exceed reviewer count 2/.test(error.message));
|
|
76
|
+
});
|
|
77
|
+
test("unsupported consensus policy is a usage error", () => {
|
|
78
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "3", "--consensus", "supermajority", "--", "@src"]), (error) => error instanceof ArgsParseError && /unknown consensus policy/.test(error.message));
|
|
79
|
+
});
|
|
80
|
+
test("min-agree is only meaningful with quorum consensus", () => {
|
|
81
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "3", "--consensus", "majority", "--min-agree", "2", "--", "@src"]), (error) => error instanceof ArgsParseError && /only meaningful with --consensus quorum/.test(error.message));
|
|
82
|
+
});
|
|
83
|
+
test("reviewers and panel cannot be combined (any reviewer count)", () => {
|
|
84
|
+
for (const count of ["3", "1"]) {
|
|
85
|
+
assert.throws(() => parseReviewCommand(["--reviewers", count, "--panel", "code-experts", "--", "@src"]), (error) => error instanceof ArgsParseError && /cannot be used with --panel/.test(error.message));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
test("panel options require an active panel (reviewers > 1 or panel)", () => {
|
|
89
|
+
for (const args of [
|
|
90
|
+
["--consensus", "any"],
|
|
91
|
+
["--min-agree", "2"],
|
|
92
|
+
["--concurrency", "2"],
|
|
93
|
+
["--consensus-model", "openai/gpt-5.5"],
|
|
94
|
+
]) {
|
|
95
|
+
assert.throws(() => parseReviewCommand([...args, "--", "@src"]), (error) => error instanceof ArgsParseError && /panel options require/.test(error.message));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
test("panel cannot be used with session reuse flags", () => {
|
|
99
|
+
for (const sessionArgs of [
|
|
100
|
+
["--keep-session"],
|
|
101
|
+
["--continue", "/tmp/session.jsonl"],
|
|
102
|
+
["--name", "gate"],
|
|
103
|
+
]) {
|
|
104
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "3", ...sessionArgs, "--", "@src"]), (error) => error instanceof ArgsParseError && /panel cannot be used with/.test(error.message));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
test("concurrency cannot exceed reviewer count", () => {
|
|
108
|
+
assert.throws(() => parseReviewCommand(["--reviewers", "2", "--concurrency", "5", "--", "@src"]), (error) => error instanceof ArgsParseError && /--concurrency 5 cannot exceed reviewer count 2/.test(error.message));
|
|
109
|
+
});
|
|
110
|
+
test("single reviewer with no panel flags keeps existing single-review parsing", () => {
|
|
111
|
+
const parsed = parseReviewCommand(["--reviewers", "1", "--", "@src"]);
|
|
112
|
+
assert.equal(parsed.reviewers, 1);
|
|
113
|
+
assert.equal(parsed.panel, undefined);
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=args.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.test.js","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/D,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAChC,MAAM;QACN,cAAc;QACd,GAAG;QACH,QAAQ;QACR,WAAW;QACX,SAAS;QACT,gBAAgB;QAChB,IAAI;QACJ,iBAAiB;QACjB,mBAAmB;KACpB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EACvE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc;eAC9C,KAAK,CAAC,QAAQ,KAAK,CAAC;eACpB,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5C,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,KAAK,MAAM,WAAW,IAAI;QACxB,CAAC,gBAAgB,CAAC;QAClB,CAAC,YAAY,EAAE,oBAAoB,CAAC;QACpC,CAAC,QAAQ,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;QACF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAChE,qBAAqB,CACtB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EACvE,wBAAwB,CACzB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAChC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;KACpG,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACpC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;KAC3G,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7G,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;IACtE,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAC9D,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAC5D,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC7F,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAChF,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC9F,CAAC;IACF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EACzG,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5G,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAC5F,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACtG,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAC3G,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,yCAAyC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACrH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EACzF,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACzG,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,KAAK,MAAM,IAAI,IAAI;QACjB,CAAC,aAAa,EAAE,KAAK,CAAC;QACtB,CAAC,aAAa,EAAE,GAAG,CAAC;QACpB,CAAC,eAAe,EAAE,GAAG,CAAC;QACtB,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;KACxC,EAAE,CAAC;QACF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACnG,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,KAAK,MAAM,WAAW,IAAI;QACxB,CAAC,gBAAgB,CAAC;QAClB,CAAC,YAAY,EAAE,oBAAoB,CAAC;QACpC,CAAC,QAAQ,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;QACF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAC5E,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACvG,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClF,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,cAAc,IAAI,gDAAgD,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5H,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-exit.test.d.ts","sourceRoot":"","sources":["../src/cli-exit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { test } from "node:test";
|
|
8
|
+
function tsxLoaderArgs() {
|
|
9
|
+
const args = [];
|
|
10
|
+
for (let index = 0; index < process.execArgv.length - 1; index += 1) {
|
|
11
|
+
const flag = process.execArgv[index];
|
|
12
|
+
const value = process.execArgv[index + 1];
|
|
13
|
+
if ((flag === "--require" || flag === "--import") && value?.includes("tsx")) {
|
|
14
|
+
args.push(flag, value);
|
|
15
|
+
index += 1;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return args;
|
|
19
|
+
}
|
|
20
|
+
function runCli(fakePi, verdict, childExit = "0") {
|
|
21
|
+
const cliPath = fileURLToPath(new URL("./cli.ts", import.meta.url));
|
|
22
|
+
return spawnSync(process.execPath, [...tsxLoaderArgs(), cliPath, "--no-stream", "--", "@src"], {
|
|
23
|
+
cwd: path.dirname(fileURLToPath(new URL("../package.json", import.meta.url))),
|
|
24
|
+
env: {
|
|
25
|
+
...process.env,
|
|
26
|
+
PI_BIN: fakePi,
|
|
27
|
+
FAKE_REVIEW_VERDICT: verdict,
|
|
28
|
+
FAKE_REVIEW_EXIT: childExit,
|
|
29
|
+
},
|
|
30
|
+
encoding: "utf8",
|
|
31
|
+
timeout: 30_000,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
test("invalid loop arguments print usage and exit 2", () => {
|
|
35
|
+
const cliPath = fileURLToPath(new URL("./cli.ts", import.meta.url));
|
|
36
|
+
const result = spawnSync(process.execPath, [...tsxLoaderArgs(), cliPath, "loop", "--max-rounds", "0", "--", "@src"], { encoding: "utf8", timeout: 30_000 });
|
|
37
|
+
assert.equal(result.error, undefined);
|
|
38
|
+
assert.equal(result.status, 2);
|
|
39
|
+
assert.match(result.stderr, /--max-rounds must be a positive integer/);
|
|
40
|
+
assert.match(result.stderr, /Usage:/);
|
|
41
|
+
assert.match(result.stderr, /pi-review loop/);
|
|
42
|
+
});
|
|
43
|
+
test("single-review CLI maps structured status to gate exit codes", (t) => {
|
|
44
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-review-cli-exit-"));
|
|
45
|
+
t.after(() => fs.rmSync(tempDir, { recursive: true, force: true }));
|
|
46
|
+
const fakePi = path.join(tempDir, "fake-pi");
|
|
47
|
+
fs.writeFileSync(fakePi, `#!/usr/bin/env node
|
|
48
|
+
const verdict = process.env.FAKE_REVIEW_VERDICT;
|
|
49
|
+
const findings = verdict === "request_changes"
|
|
50
|
+
? "### F1: Fix the gate\\n- Severity: high\\n- Path: src/cli.ts\\n- Actionable: yes"
|
|
51
|
+
: "No material findings.";
|
|
52
|
+
const text = "## Verdict\\n" + verdict + "\\n\\n## Summary\\n- Fixture.\\n\\n## Findings\\n" + findings + "\\n\\n## Risks and Blind Spots\\nNone.\\n\\n## Open Questions\\nNone.\\n";
|
|
53
|
+
function line(obj) { process.stdout.write(JSON.stringify(obj) + "\\n"); }
|
|
54
|
+
line({ type: "session", version: 3, id: "s1" });
|
|
55
|
+
line({ type: "agent_start" });
|
|
56
|
+
line({ type: "turn_start" });
|
|
57
|
+
line({ type: "message_start", message: { role: "user", content: [{ type: "text", text: "review" }] } });
|
|
58
|
+
line({ type: "message_end", message: { role: "user", content: [{ type: "text", text: "review" }] } });
|
|
59
|
+
line({ type: "message_start", message: { role: "assistant", content: [], model: "fake/model", usage: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0, reasoning: 0, totalTokens: 150 } } });
|
|
60
|
+
line({ type: "message_update", assistantMessageEvent: { type: "text_delta", delta: text, partial: { role: "assistant" } } });
|
|
61
|
+
line({ type: "message_update", assistantMessageEvent: { type: "text_end", content: text, partial: { role: "assistant" } } });
|
|
62
|
+
line({ type: "message_end", message: { role: "assistant", content: [{ type: "text", text }], model: "fake/model", usage: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0, reasoning: 0, totalTokens: 150 }, stopReason: "stop" } });
|
|
63
|
+
line({ type: "turn_end", message: { role: "assistant", content: [{ type: "text", text }], usage: { input: 100, output: 50, totalTokens: 150 } } });
|
|
64
|
+
line({ type: "agent_end", messages: [{ role: "user", content: [{ type: "text", text: "review" }] }, { role: "assistant", content: [{ type: "text", text }], responseModel: "fake/model" }] });
|
|
65
|
+
process.exit(Number(process.env.FAKE_REVIEW_EXIT ?? "0"));
|
|
66
|
+
`);
|
|
67
|
+
fs.chmodSync(fakePi, 0o755);
|
|
68
|
+
const scenarios = [
|
|
69
|
+
{ verdict: "approve", childExit: "0", expectedStatus: "clean", expectedExit: 0 },
|
|
70
|
+
{ verdict: "request_changes", childExit: "0", expectedStatus: "has_findings", expectedExit: 1 },
|
|
71
|
+
{ verdict: "needs_clarification", childExit: "0", expectedStatus: "needs_human", expectedExit: 3 },
|
|
72
|
+
{ verdict: "approve", childExit: "9", expectedStatus: "blocked", expectedExit: 4 },
|
|
73
|
+
];
|
|
74
|
+
for (const scenario of scenarios) {
|
|
75
|
+
const result = runCli(fakePi, scenario.verdict, scenario.childExit);
|
|
76
|
+
assert.equal(result.error, undefined);
|
|
77
|
+
assert.equal(result.status, scenario.expectedExit, result.stderr);
|
|
78
|
+
const metaLine = result.stderr.split("\n").find((line) => line.startsWith("PI_REVIEW_META_JSON: "));
|
|
79
|
+
assert.ok(metaLine, result.stderr);
|
|
80
|
+
const meta = JSON.parse(metaLine.slice("PI_REVIEW_META_JSON: ".length));
|
|
81
|
+
assert.equal(meta.status, scenario.expectedStatus);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=cli-exit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-exit.test.js","sourceRoot":"","sources":["../src/cli-exit.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { parseArgs, usage } from "./args.js";
|
|
3
2
|
import { isInstallHelp } from "./install-args.js";
|
|
4
|
-
import {
|
|
3
|
+
import { isPanelActive, parseArgs, usage } from "./args.js";
|
|
4
|
+
import { readReviewStdin, runModels, runReview, runReviewOnce } from "./review.js";
|
|
5
|
+
import { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
6
|
+
import { runPanelReview, runPanelReviewOnce } from "./panel.js";
|
|
5
7
|
import { resolveConfig } from "./config.js";
|
|
6
8
|
import { installSkill, uninstallSkill } from "./skill.js";
|
|
7
9
|
import { runUpdate } from "./update.js";
|
|
@@ -29,6 +31,18 @@ else if (parsed.command === "install-skill") {
|
|
|
29
31
|
else if (parsed.command === "uninstall-skill") {
|
|
30
32
|
uninstallSkill(parsed.extraArgs);
|
|
31
33
|
}
|
|
34
|
+
else if (parsed.command === "loop") {
|
|
35
|
+
const stdinText = readReviewStdin();
|
|
36
|
+
const runOne = isPanelActive(parsed)
|
|
37
|
+
? () => runPanelReviewOnce(parsed, stdinText)
|
|
38
|
+
: () => runReviewOnce(parsed, stdinText);
|
|
39
|
+
const result = await runReviewLoop(parsed.maxRounds, runOne);
|
|
40
|
+
process.stdout.write(`${formatLoopSummary(result)}\n`);
|
|
41
|
+
process.exit(result.exitCode);
|
|
42
|
+
}
|
|
43
|
+
else if (isPanelActive(parsed)) {
|
|
44
|
+
await runPanelReview(parsed);
|
|
45
|
+
}
|
|
32
46
|
else {
|
|
33
47
|
await runReview(parsed);
|
|
34
48
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,IAAI,aAAa,CAAC,MAAM,CAAC;IAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAEpC,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;IACvC,SAAS,EAAE,CAAC;AACd,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;IACxC,UAAU,CAAC;QACT,EAAE,EAAE,MAAM,CAAC,SAAS,KAAK,KAAK;QAC9B,MAAM,EAAE,MAAM,CAAC,aAAa,KAAK,KAAK;QACtC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;KAClC,CAAC,CAAC;AACL,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;IAC9C,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;IAChD,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QAClC,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7C,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAU,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;KAAM,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;IACjC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;KAAM,CAAC;IACN,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAUtC"}
|
package/dist/config.js
CHANGED
|
@@ -11,6 +11,7 @@ export function resolveConfig() {
|
|
|
11
11
|
piBin: process.env.PI_BIN || "pi",
|
|
12
12
|
reviewHome,
|
|
13
13
|
presetsFile: process.env.PI_REVIEW_PRESETS || path.join(reviewHome, "review-presets.json"),
|
|
14
|
+
panelPresetsFile: process.env.PI_REVIEW_PANEL_PRESETS || path.join(reviewHome, "panel-presets.json"),
|
|
14
15
|
systemPromptFile: process.env.PI_REVIEW_SYSTEM_PROMPT || path.join(reviewHome, "system-prompt.md"),
|
|
15
16
|
sessionsRoot: process.env.PI_REVIEW_SESSION_DIR || path.join(DEFAULT_DATA_DIR, "sessions"),
|
|
16
17
|
};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACnD,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACnD,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AAWrE,MAAM,UAAU,aAAa;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,oBAAoB,CAAC;IACtE,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI;QACjC,UAAU;QACV,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC;QAC1F,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC;QACpG,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC;QAClG,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC;KAC3F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { buildRvOrchestrationPrompt, parseRvArgs, RV_COMPLETIONS } from "./rv-prompts.js";
|
|
2
|
+
export default function piReviewExtension(pi) {
|
|
3
|
+
pi.registerCommand("rv", {
|
|
4
|
+
description: "Delegate pi-review to the agent (English prompts). Usage: /rv [--mode plan|challenge] [--model id] [--keep-session] @file-or-text | models",
|
|
5
|
+
getArgumentCompletions: (prefix) => {
|
|
6
|
+
const filtered = RV_COMPLETIONS.filter((item) => item.value.startsWith(prefix));
|
|
7
|
+
return filtered.length
|
|
8
|
+
? filtered.map(({ value, hint }) => ({ value, label: value, description: hint }))
|
|
9
|
+
: null;
|
|
10
|
+
},
|
|
11
|
+
handler: async (rawArgs, ctx) => {
|
|
12
|
+
const trimmed = rawArgs.trim();
|
|
13
|
+
const parsed = parseRvArgs(trimmed);
|
|
14
|
+
const prompt = buildRvOrchestrationPrompt(parsed);
|
|
15
|
+
if (!trimmed && !parsed.modelsOnly) {
|
|
16
|
+
ctx.ui.notify("/rv needs a target or `models`. Try: /rv @path or /rv models", "warning");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
pi.sendUserMessage(prompt);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* English orchestration prompts for /rv — parent Pi agent runs pi-review per skill.
|
|
3
|
+
* Child review sessions use presets in resources/review-presets.json (also English).
|
|
4
|
+
*/
|
|
5
|
+
export type RvParsed = {
|
|
6
|
+
mode: "code" | "plan" | "challenge";
|
|
7
|
+
model?: string;
|
|
8
|
+
keepSession: boolean;
|
|
9
|
+
continueHandle?: string;
|
|
10
|
+
modelsOnly: boolean;
|
|
11
|
+
target: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function parseRvArgs(raw: string): RvParsed;
|
|
14
|
+
export declare function buildRvOrchestrationPrompt(parsed: RvParsed): string;
|
|
15
|
+
/** Short labels for TUI completions (English). */
|
|
16
|
+
export declare const RV_COMPLETIONS: {
|
|
17
|
+
value: string;
|
|
18
|
+
hint: string;
|
|
19
|
+
}[];
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* English orchestration prompts for /rv — parent Pi agent runs pi-review per skill.
|
|
3
|
+
* Child review sessions use presets in resources/review-presets.json (also English).
|
|
4
|
+
*/
|
|
5
|
+
export function parseRvArgs(raw) {
|
|
6
|
+
const tokens = raw.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) ?? [];
|
|
7
|
+
const cleaned = tokens.map((t) => t.replace(/^['"]|['"]$/g, ""));
|
|
8
|
+
let mode = "code";
|
|
9
|
+
let model;
|
|
10
|
+
let keepSession = false;
|
|
11
|
+
let continueHandle;
|
|
12
|
+
let modelsOnly = false;
|
|
13
|
+
const rest = [];
|
|
14
|
+
for (let i = 0; i < cleaned.length; i++) {
|
|
15
|
+
const t = cleaned[i];
|
|
16
|
+
if (t === "models" && rest.length === 0 && i === cleaned.length - 1) {
|
|
17
|
+
modelsOnly = true;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (t === "--keep-session") {
|
|
21
|
+
keepSession = true;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (t === "--mode" && cleaned[i + 1]) {
|
|
25
|
+
const m = cleaned[++i];
|
|
26
|
+
if (m === "plan" || m === "challenge" || m === "code")
|
|
27
|
+
mode = m;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (t === "--model" && cleaned[i + 1]) {
|
|
31
|
+
model = cleaned[++i];
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (t === "--continue" && cleaned[i + 1]) {
|
|
35
|
+
continueHandle = cleaned[++i];
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
rest.push(t);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
mode,
|
|
42
|
+
model,
|
|
43
|
+
keepSession,
|
|
44
|
+
continueHandle,
|
|
45
|
+
modelsOnly,
|
|
46
|
+
target: rest.join(" ").trim(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function baseRules() {
|
|
50
|
+
return [
|
|
51
|
+
"Follow the pi-review skill.",
|
|
52
|
+
"Run pi-review in an isolated child session; return only the review conclusion.",
|
|
53
|
+
"Do not edit, patch, commit, or implement findings unless the user asks separately.",
|
|
54
|
+
"Preserve the final PI_REVIEW_META line from pi-review output.",
|
|
55
|
+
].join(" ");
|
|
56
|
+
}
|
|
57
|
+
export function buildRvOrchestrationPrompt(parsed) {
|
|
58
|
+
if (parsed.modelsOnly) {
|
|
59
|
+
return [
|
|
60
|
+
"Run the pi-review model catalog step.",
|
|
61
|
+
baseRules(),
|
|
62
|
+
"Execute: pi-review models",
|
|
63
|
+
"Present a short English summary: how many providers, suggest 2–3 IDs suited for code review vs plan/challenge.",
|
|
64
|
+
"Do not start a review until the user supplies a target (@path or text).",
|
|
65
|
+
].join("\n\n");
|
|
66
|
+
}
|
|
67
|
+
if (parsed.continueHandle) {
|
|
68
|
+
return [
|
|
69
|
+
"Continue a prior pi-review session.",
|
|
70
|
+
baseRules(),
|
|
71
|
+
`Execute: pi-review --continue ${parsed.continueHandle} -- ${parsed.target || "follow up on the previous review"}`,
|
|
72
|
+
"Answer the follow-up in English; keep the same review-only scope.",
|
|
73
|
+
].join("\n\n");
|
|
74
|
+
}
|
|
75
|
+
if (!parsed.target) {
|
|
76
|
+
return [
|
|
77
|
+
"The /rv command needs a review target.",
|
|
78
|
+
"Tell the user (in English): usage is /rv [--mode code|plan|challenge] [--model provider/model] [--keep-session] -- @files-or-brief",
|
|
79
|
+
"Examples: /rv @src/foo.ts | /rv --mode challenge @docs/design.md | /rv models",
|
|
80
|
+
].join("\n\n");
|
|
81
|
+
}
|
|
82
|
+
const modeBlock = {
|
|
83
|
+
code: [
|
|
84
|
+
"Mode: code (default).",
|
|
85
|
+
"Focus: correctness, regressions, security, concurrency, API contracts, edge cases, tests.",
|
|
86
|
+
"Use read-only inspection via pi-review; no file mutations.",
|
|
87
|
+
].join(" "),
|
|
88
|
+
plan: [
|
|
89
|
+
"Mode: plan.",
|
|
90
|
+
"Review architecture, design, or strategy through engineering, product, security, QA, ops, and DX lenses.",
|
|
91
|
+
"Identify fatal flaws, trade-offs, sequencing risks, and minimal changes to de-risk the plan.",
|
|
92
|
+
].join(" "),
|
|
93
|
+
challenge: [
|
|
94
|
+
"Mode: challenge (adversarial).",
|
|
95
|
+
"Pressure-test assumptions, boundaries, dependencies, failure modes, migration, and missing evidence.",
|
|
96
|
+
"One-shot conclusion; do not run a live Q&A interview.",
|
|
97
|
+
].join(" "),
|
|
98
|
+
};
|
|
99
|
+
const cliParts = ["pi-review"];
|
|
100
|
+
if (parsed.mode !== "code")
|
|
101
|
+
cliParts.push(`--mode ${parsed.mode}`);
|
|
102
|
+
if (parsed.model)
|
|
103
|
+
cliParts.push(`--model ${parsed.model}`);
|
|
104
|
+
if (parsed.keepSession)
|
|
105
|
+
cliParts.push("--keep-session");
|
|
106
|
+
cliParts.push("--", parsed.target);
|
|
107
|
+
const modelStep = parsed.model
|
|
108
|
+
? `Use model exactly as given: ${parsed.model} (must appear in pi-review models output).`
|
|
109
|
+
: "Run pi-review models first if needed; pick a suitable listed ID or omit --model for Pi default.";
|
|
110
|
+
return [
|
|
111
|
+
"Run pi-review for the target below.",
|
|
112
|
+
baseRules(),
|
|
113
|
+
modeBlock[parsed.mode],
|
|
114
|
+
modelStep,
|
|
115
|
+
parsed.keepSession
|
|
116
|
+
? "Use --keep-session so the user can follow up with /rv --continue <handle>."
|
|
117
|
+
: "",
|
|
118
|
+
`Execute:\n${cliParts.join(" ")}`,
|
|
119
|
+
]
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.join("\n\n");
|
|
122
|
+
}
|
|
123
|
+
/** Short labels for TUI completions (English). */
|
|
124
|
+
export const RV_COMPLETIONS = [
|
|
125
|
+
{ value: "@", hint: "file path after @ (e.g. @src/foo.ts)" },
|
|
126
|
+
{ value: "models", hint: "list pi-review models only" },
|
|
127
|
+
{ value: "--mode code", hint: "code / diff / MR review" },
|
|
128
|
+
{ value: "--mode plan", hint: "architecture or plan review" },
|
|
129
|
+
{ value: "--mode challenge", hint: "adversarial plan review" },
|
|
130
|
+
{ value: "--model ", hint: "provider/model from pi-review models" },
|
|
131
|
+
{ value: "--keep-session", hint: "persist session for follow-up" },
|
|
132
|
+
];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
|
-
export { parseArgs } from "./args.js";
|
|
1
|
+
export { ArgsParseError, DEFAULT_MAX_ROUNDS, isPanelActive, parseArgs, parseReviewCommand } from "./args.js";
|
|
2
2
|
export { resolveConfig } from "./config.js";
|
|
3
3
|
export type { Config } from "./config.js";
|
|
4
|
-
export { loadPresets, loadSystemPrompt } from "./presets.js";
|
|
5
|
-
export { splitPayload, buildPrompt } from "./prompt.js";
|
|
6
|
-
export { runModels, runReview } from "./review.js";
|
|
4
|
+
export { loadPresets, loadPanelPresets, loadSystemPrompt } from "./presets.js";
|
|
5
|
+
export { splitPayload, buildPrompt, buildReviewerPrompt, buildAdjudicatorPrompt } from "./prompt.js";
|
|
6
|
+
export { readReviewStdin, runModels, runReview, runReviewOnce } from "./review.js";
|
|
7
|
+
export { runPanelReview, runPanelReviewOnce, emitPanelFooter } from "./panel.js";
|
|
8
|
+
export { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
9
|
+
export type { LoopReviewResult, LoopRoundSummary, LoopRoundPanelSummary, LoopStopReason, RunOneReview } from "./loop.js";
|
|
10
|
+
export { aggregatePanel, effectiveThreshold } from "./panel-aggregate.js";
|
|
11
|
+
export type { PanelAggregationInput } from "./panel-aggregate.js";
|
|
12
|
+
export { DeterministicMatcher, SemanticMatcher } from "./matcher.js";
|
|
13
|
+
export type { FindingMatcher, MatchResult, SemanticAdjudicator, AdjudicationRequest, AdjudicationResponse, AdjudicationMerge, AdjudicationCandidate } from "./matcher.js";
|
|
14
|
+
export { resolvePanelConfig } from "./panel-config.js";
|
|
15
|
+
export type { ResolvedPanelConfig } from "./panel-config.js";
|
|
7
16
|
export { makeRunSessionDir, newestJsonl } from "./session.js";
|
|
8
|
-
export type { Verdict, ParsedArgs, ReviewPreset, VerdictInfo, ReviewMeta, SplitPayload, } from "./types.js";
|
|
9
|
-
export { VERDICTS } from "./types.js";
|
|
17
|
+
export type { Verdict, ReviewStatus, ReviewFinding, ParsedArgs, ReviewPreset, VerdictInfo, StructuredReviewResult, ReviewMeta, ReviewRunResult, SplitPayload, ConsensusPolicy, SourceFinding, FindingCluster, PanelHealth, ReviewerOutcome, PanelFields, PanelAggregationResult, PanelReviewMeta, ReviewerSubmission, PanelReviewerSpec, PanelPreset, TokenUsage, } from "./types.js";
|
|
18
|
+
export { REVIEW_STATUSES, VERDICTS, CONSENSUS_POLICIES, MAX_REVIEWERS, DEFAULT_PANEL_MIN_AGREE, } from "./types.js";
|
|
10
19
|
export { fail, hasPathSeparator, expandMaybeHome, normalizeTools } from "./utils.js";
|
|
11
20
|
export { parseVerdict } from "./verdict.js";
|
|
12
|
-
export {
|
|
21
|
+
export { parseReviewResult, reviewExitCode } from "./review-result.js";
|
|
22
|
+
export { formatDurationMs, formatTokens, formatUsage, formatReviewMetaAscii, formatReviewMetaJsonLine, formatPanelMetaAscii, formatPanelFindingsMarkdown } from "./meta-footer.js";
|
|
13
23
|
export { installSkill, uninstallSkill } from "./skill.js";
|
|
14
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1K,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EACV,OAAO,EACP,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACnL,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
export { parseArgs } from "./args.js";
|
|
1
|
+
export { ArgsParseError, DEFAULT_MAX_ROUNDS, isPanelActive, parseArgs, parseReviewCommand } from "./args.js";
|
|
2
2
|
export { resolveConfig } from "./config.js";
|
|
3
|
-
export { loadPresets, loadSystemPrompt } from "./presets.js";
|
|
4
|
-
export { splitPayload, buildPrompt } from "./prompt.js";
|
|
5
|
-
export { runModels, runReview } from "./review.js";
|
|
3
|
+
export { loadPresets, loadPanelPresets, loadSystemPrompt } from "./presets.js";
|
|
4
|
+
export { splitPayload, buildPrompt, buildReviewerPrompt, buildAdjudicatorPrompt } from "./prompt.js";
|
|
5
|
+
export { readReviewStdin, runModels, runReview, runReviewOnce } from "./review.js";
|
|
6
|
+
export { runPanelReview, runPanelReviewOnce, emitPanelFooter } from "./panel.js";
|
|
7
|
+
export { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
8
|
+
export { aggregatePanel, effectiveThreshold } from "./panel-aggregate.js";
|
|
9
|
+
export { DeterministicMatcher, SemanticMatcher } from "./matcher.js";
|
|
10
|
+
export { resolvePanelConfig } from "./panel-config.js";
|
|
6
11
|
export { makeRunSessionDir, newestJsonl } from "./session.js";
|
|
7
|
-
export { VERDICTS } from "./types.js";
|
|
12
|
+
export { REVIEW_STATUSES, VERDICTS, CONSENSUS_POLICIES, MAX_REVIEWERS, DEFAULT_PANEL_MIN_AGREE, } from "./types.js";
|
|
8
13
|
export { fail, hasPathSeparator, expandMaybeHome, normalizeTools } from "./utils.js";
|
|
9
14
|
export { parseVerdict } from "./verdict.js";
|
|
10
|
-
export {
|
|
15
|
+
export { parseReviewResult, reviewExitCode } from "./review-result.js";
|
|
16
|
+
export { formatDurationMs, formatTokens, formatUsage, formatReviewMetaAscii, formatReviewMetaJsonLine, formatPanelMetaAscii, formatPanelFindingsMarkdown } from "./meta-footer.js";
|
|
11
17
|
export { installSkill, uninstallSkill } from "./skill.js";
|
|
12
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAyB9D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACnL,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/json-events.d.ts
CHANGED
|
@@ -1,7 +1,52 @@
|
|
|
1
|
+
import type { TokenUsage } from "./types.js";
|
|
1
2
|
export interface ExtractedFinalText {
|
|
2
3
|
text: string;
|
|
3
4
|
error?: string;
|
|
4
5
|
fatal?: boolean;
|
|
5
6
|
}
|
|
7
|
+
export interface ExtractedUsage {
|
|
8
|
+
usage?: TokenUsage;
|
|
9
|
+
/** The model id pi reported for the final assistant message, if any. */
|
|
10
|
+
responseModel?: string;
|
|
11
|
+
}
|
|
6
12
|
export declare function extractFinalText(jsonLinesText: string): ExtractedFinalText;
|
|
13
|
+
/**
|
|
14
|
+
* Extract token usage and the response model from a pi `--mode json` event
|
|
15
|
+
* stream. Usage is accumulated from assistant message/turn/agent_end events.
|
|
16
|
+
* Degrades gracefully (returns undefined) when usage fields are absent.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractUsage(jsonLinesText: string): ExtractedUsage;
|
|
19
|
+
export interface StreamEventEmitter {
|
|
20
|
+
/** Called for every text chunk that should be shown to the human. */
|
|
21
|
+
onText(chunk: string): void;
|
|
22
|
+
/** Called for every semantic milestone (already formatted, ends with \n). */
|
|
23
|
+
onMilestone(line: string): void;
|
|
24
|
+
}
|
|
25
|
+
export interface StreamedUsage {
|
|
26
|
+
usage?: TokenUsage;
|
|
27
|
+
responseModel?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Feed one chunk of stdout from pi --mode json. Splits on newlines, buffers
|
|
31
|
+
* partial lines, and emits text deltas + milestone notices + usage updates.
|
|
32
|
+
* Returns nothing; the caller reads final usage via `streamedUsage()`.
|
|
33
|
+
*/
|
|
34
|
+
export declare class JsonEventStream {
|
|
35
|
+
private buffer;
|
|
36
|
+
private readonly emit;
|
|
37
|
+
private readonly accumulate;
|
|
38
|
+
private sawAnyUsage;
|
|
39
|
+
private responseModel;
|
|
40
|
+
private turn;
|
|
41
|
+
private inAssistantTurn;
|
|
42
|
+
constructor(emit: StreamEventEmitter);
|
|
43
|
+
/** Feed a raw stdout chunk (may contain partial JSON lines). */
|
|
44
|
+
feed(chunk: string): void;
|
|
45
|
+
/** Flush any trailing partial line (call at end of stream). */
|
|
46
|
+
flush(): void;
|
|
47
|
+
/** Final accumulated token usage (undefined if no usage seen). */
|
|
48
|
+
usage(): StreamedUsage;
|
|
49
|
+
private processLine;
|
|
50
|
+
private handle;
|
|
51
|
+
}
|
|
7
52
|
//# sourceMappingURL=json-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-events.d.ts","sourceRoot":"","sources":["../src/json-events.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"json-events.d.ts","sourceRoot":"","sources":["../src/json-events.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA4CD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAsD1E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,CA4ClE;AAQD,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6EAA6E;IAC7E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,eAAe,CAAS;gBAEpB,IAAI,EAAE,kBAAkB;IAKpC,gEAAgE;IAChE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUzB,+DAA+D;IAC/D,KAAK,IAAI,IAAI;IAKb,kEAAkE;IAClE,KAAK,IAAI,aAAa;IAOtB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,MAAM;CAkDf"}
|