@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.
Files changed (125) hide show
  1. package/README.md +110 -13
  2. package/README.zh-CN.md +64 -3
  3. package/dist/args.d.ts +8 -0
  4. package/dist/args.d.ts.map +1 -1
  5. package/dist/args.js +147 -28
  6. package/dist/args.js.map +1 -1
  7. package/dist/args.test.d.ts +2 -0
  8. package/dist/args.test.d.ts.map +1 -0
  9. package/dist/args.test.js +115 -0
  10. package/dist/args.test.js.map +1 -0
  11. package/dist/cli-exit.test.d.ts +2 -0
  12. package/dist/cli-exit.test.d.ts.map +1 -0
  13. package/dist/cli-exit.test.js +84 -0
  14. package/dist/cli-exit.test.js.map +1 -0
  15. package/dist/cli.js +16 -2
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config.d.ts +1 -0
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +1 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/extensions/review.d.ts +2 -0
  22. package/dist/extensions/review.js +22 -0
  23. package/dist/extensions/rv-prompts.d.ts +19 -0
  24. package/dist/extensions/rv-prompts.js +132 -0
  25. package/dist/index.d.ts +17 -7
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +12 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/json-events.d.ts +45 -0
  30. package/dist/json-events.d.ts.map +1 -1
  31. package/dist/json-events.js +185 -0
  32. package/dist/json-events.js.map +1 -1
  33. package/dist/json-events.test.js +64 -1
  34. package/dist/json-events.test.js.map +1 -1
  35. package/dist/loop.d.ts +36 -0
  36. package/dist/loop.d.ts.map +1 -0
  37. package/dist/loop.js +73 -0
  38. package/dist/loop.js.map +1 -0
  39. package/dist/loop.test.d.ts +2 -0
  40. package/dist/loop.test.d.ts.map +1 -0
  41. package/dist/loop.test.js +83 -0
  42. package/dist/loop.test.js.map +1 -0
  43. package/dist/matcher.d.ts +74 -0
  44. package/dist/matcher.d.ts.map +1 -0
  45. package/dist/matcher.js +202 -0
  46. package/dist/matcher.js.map +1 -0
  47. package/dist/matcher.test.d.ts +2 -0
  48. package/dist/matcher.test.d.ts.map +1 -0
  49. package/dist/matcher.test.js +161 -0
  50. package/dist/matcher.test.js.map +1 -0
  51. package/dist/meta-footer.d.ts +15 -1
  52. package/dist/meta-footer.d.ts.map +1 -1
  53. package/dist/meta-footer.js +108 -0
  54. package/dist/meta-footer.js.map +1 -1
  55. package/dist/meta-footer.test.js +43 -1
  56. package/dist/meta-footer.test.js.map +1 -1
  57. package/dist/panel-aggregate.d.ts +18 -0
  58. package/dist/panel-aggregate.d.ts.map +1 -0
  59. package/dist/panel-aggregate.js +247 -0
  60. package/dist/panel-aggregate.js.map +1 -0
  61. package/dist/panel-aggregate.test.d.ts +2 -0
  62. package/dist/panel-aggregate.test.d.ts.map +1 -0
  63. package/dist/panel-aggregate.test.js +461 -0
  64. package/dist/panel-aggregate.test.js.map +1 -0
  65. package/dist/panel-cli.test.d.ts +2 -0
  66. package/dist/panel-cli.test.d.ts.map +1 -0
  67. package/dist/panel-cli.test.js +188 -0
  68. package/dist/panel-cli.test.js.map +1 -0
  69. package/dist/panel-config.d.ts +19 -0
  70. package/dist/panel-config.d.ts.map +1 -0
  71. package/dist/panel-config.js +115 -0
  72. package/dist/panel-config.js.map +1 -0
  73. package/dist/panel-config.test.d.ts +2 -0
  74. package/dist/panel-config.test.d.ts.map +1 -0
  75. package/dist/panel-config.test.js +91 -0
  76. package/dist/panel-config.test.js.map +1 -0
  77. package/dist/panel-loop.test.d.ts +2 -0
  78. package/dist/panel-loop.test.d.ts.map +1 -0
  79. package/dist/panel-loop.test.js +118 -0
  80. package/dist/panel-loop.test.js.map +1 -0
  81. package/dist/panel.d.ts +10 -0
  82. package/dist/panel.d.ts.map +1 -0
  83. package/dist/panel.js +315 -0
  84. package/dist/panel.js.map +1 -0
  85. package/dist/presets.d.ts +2 -1
  86. package/dist/presets.d.ts.map +1 -1
  87. package/dist/presets.js +10 -0
  88. package/dist/presets.js.map +1 -1
  89. package/dist/prompt.d.ts +14 -1
  90. package/dist/prompt.d.ts.map +1 -1
  91. package/dist/prompt.js +61 -15
  92. package/dist/prompt.js.map +1 -1
  93. package/dist/prompt.test.d.ts +2 -0
  94. package/dist/prompt.test.d.ts.map +1 -0
  95. package/dist/prompt.test.js +37 -0
  96. package/dist/prompt.test.js.map +1 -0
  97. package/dist/review-result.d.ts +5 -0
  98. package/dist/review-result.d.ts.map +1 -0
  99. package/dist/review-result.js +98 -0
  100. package/dist/review-result.js.map +1 -0
  101. package/dist/review-result.test.d.ts +2 -0
  102. package/dist/review-result.test.d.ts.map +1 -0
  103. package/dist/review-result.test.js +196 -0
  104. package/dist/review-result.test.js.map +1 -0
  105. package/dist/review.d.ts +10 -4
  106. package/dist/review.d.ts.map +1 -1
  107. package/dist/review.js +82 -20
  108. package/dist/review.js.map +1 -1
  109. package/dist/review.meta.test.js +2 -2
  110. package/dist/review.meta.test.js.map +1 -1
  111. package/dist/skill-protocol.test.d.ts +2 -0
  112. package/dist/skill-protocol.test.d.ts.map +1 -0
  113. package/dist/skill-protocol.test.js +35 -0
  114. package/dist/skill-protocol.test.js.map +1 -0
  115. package/dist/types.d.ts +147 -5
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +11 -0
  118. package/dist/types.js.map +1 -1
  119. package/extensions/rv-completions.test.ts +15 -0
  120. package/extensions/rv-completions.ts +7 -1
  121. package/package.json +3 -3
  122. package/resources/panel-presets.json +21 -0
  123. package/resources/system-prompt.md +11 -1
  124. package/skills/pi-review/SKILL.md +90 -12
  125. package/skills/pi-review/references/codex-tools.md +19 -6
package/README.md CHANGED
@@ -18,7 +18,8 @@ Works as a standalone CLI, a Pi package (extension + skill), or integrated into
18
18
 
19
19
  - **Isolated review sessions** — each review runs in a clean child process with no shared state
20
20
  - **Multiple review modes** — code review, multi-lens plan review, adversarial challenge review
21
- - **Structured output** — human-readable ASCII footer on stdout; `PI_REVIEW_META_JSON` on stderr for automation
21
+ - **Structured output** — explicit `status`, structured findings, and a human-readable ASCII footer; one-line `PI_REVIEW_META_JSON` on stderr for automation
22
+ - **Loop review gate** — bounded, isolated review rounds with `pi-review loop --max-rounds <n>`; the host remains the only editor
22
23
  - **Model-agnostic** — use any model available in your Pi installation
23
24
  - **Live streaming** — child review output is forwarded as it arrives (use `--no-stream` to buffer)
24
25
  - **Progress logging for AI hosts** — `--progress-log <path>` writes a live JSON event log so agent hosts that buffer tool stdout (Claude Code, Codex, ...) can still show real-time progress
@@ -102,6 +103,9 @@ pi-review --mode plan -- @docs/architecture.md
102
103
  # Adversarial challenge review
103
104
  pi-review --mode challenge -- @docs/design.md
104
105
 
106
+ # Bounded review-only gate (default: 3 rounds)
107
+ pi-review loop --max-rounds 3 -- @src
108
+
105
109
  # List available models
106
110
  pi-review models
107
111
  ```
@@ -114,6 +118,57 @@ pi-review models
114
118
  | `plan` | Broad plan/architecture review through multiple expert lenses: engineering, product, security, QA, operations, and DX. |
115
119
  | `challenge` | Adversarial review that pressure-tests assumptions, dependencies, reversibility, failure modes, and migration paths. |
116
120
 
121
+ ## Loop Review
122
+
123
+ `pi-review loop` runs a bounded sequence of full, isolated review runs against the current working tree:
124
+
125
+ ```bash
126
+ pi-review loop --max-rounds 3 -- @src
127
+ pi-review loop --mode challenge --max-rounds 2 -- @docs/design.md
128
+ ```
129
+
130
+ Each round is review-only. The process never edits, patches, waits for filesystem changes, or asks the child session to fix findings. It stops immediately on `clean`, `needs_human`, or `blocked`; otherwise it stops when the round budget is exhausted. Every round emits one `PI_REVIEW_META_JSON` line in order, and the final human summary lists each round's status, verdict, duration, and finding counts.
131
+
132
+ This is a **host-driven gate**: if findings remain, the host or human fixes only accepted in-scope findings and invokes `loop` again. For patch-by-patch agent closeout, `--max-rounds 1` gives the host a fix point after each review; use a larger budget only when repeated review of the unchanged tree is intentional. `loop` accepts normal review target/model/progress options but rejects `--keep-session`, `--continue`, and `--name` in v1.
133
+
134
+ ## Panel Review
135
+
136
+ Panel review runs multiple **independent** reviewers in isolated child sessions and aggregates their findings into one gate result. Reviewers cannot see one another's findings, so agreement represents independent discovery.
137
+
138
+ ```bash
139
+ # Single panel review
140
+ pi-review --reviewers 3 --consensus quorum --min-agree 2 -- @src
141
+ # Expert preset (correctness, security, testing lenses)
142
+ pi-review --panel code-experts --consensus majority -- @src
143
+ # Panel loop review (up to reviewer_count × max-rounds reviewer runs + adjudication)
144
+ pi-review loop --reviewers 3 --consensus quorum --max-rounds 2 -- @src
145
+ ```
146
+
147
+ ### Consensus
148
+
149
+ A finding becomes a **confirmed finding** (gate-relevant) only when enough independent reviewers mark the issue **actionable**. Otherwise it stays a non-blocking **advisory**. Multi-reviewer panels default to **quorum** with minimum agreement **2** so panel mode never silently becomes any-finding fail-closed; single-review stays threshold one.
150
+
151
+ | Policy | Threshold |
152
+ |--------|----------|
153
+ | `any` | one actionable reviewer confirms |
154
+ | `quorum` (default) | configured minimum agreement (default 2; `--min-agree`) |
155
+ | `majority` | `floor(reviewers / 2) + 1` |
156
+ | `unanimous` | every reviewer |
157
+
158
+ Singleton (uncorroborated) findings remain visible as **advisories** but do not change clean status or fail the gate. Confirmed actionable clusters produce `has_findings`; no confirmed clusters produce `clean`.
159
+
160
+ ### Aggregation
161
+
162
+ Two-phase matching: deterministic matching on stable anchors (path + normalized summary) first; only ambiguous same-path candidates go to a constrained **semantic adjudicator** (enabled with `--consensus-model`). The adjudicator clusters findings and may not invent findings, drop findings, add evidence, or act as another reviewer — it has no write tools. Low-confidence matches stay separate advisories so uncertain similarity cannot manufacture quorum.
163
+
164
+ ### Cost and failure
165
+
166
+ Reviewer runs = `--reviewers <n>` × `--max-rounds` (loop); one adjudication call may run per round when `--consensus-model` is set. Use `--concurrency <n>` to bound provider/machine pressure (default: reviewer count, never exceeds it). Reviewer runtime failure → `blocked`; unstructured dirty output or unresolved clarification → `needs_human`; never silently clean. Panel review rejects `--keep-session`, `--continue`, and `--name` (reviewers run `--no-session`); the host agent remains the only editor.
167
+
168
+ ### Machine output
169
+
170
+ A panel evaluation emits **one** aggregate `PI_REVIEW_META_JSON` record with additive fields: `strategy: "panel"`, `configuredReviewers`, `successfulReviewers`, `consensusPolicy`, `consensusThreshold`, `panelHealth`, `confirmedClusters`, `advisories`, and per-`reviewers` outcomes. Top-level `findings` contain confirmed clusters only; advisories remain separate. Existing single-review keys remain unchanged, so older consumers can ignore the new fields.
171
+
117
172
  ## Output Format
118
173
 
119
174
  Every review produces Markdown with these sections:
@@ -124,6 +179,14 @@ approve | request_changes | needs_clarification | blocked
124
179
 
125
180
  ## Summary
126
181
  ## Findings
182
+ ### F1: <summary>
183
+ - Severity: critical | high | medium | low
184
+ - Path: <path or none>
185
+ - Actionable: yes | no
186
+ - Evidence: <concrete evidence>
187
+ - Impact: <why it matters>
188
+ - Recommendation: <specific next step>
189
+
127
190
  ## Risks and Blind Spots
128
191
  ## Open Questions
129
192
  ```
@@ -133,12 +196,37 @@ The CLI appends a readable ASCII footer on **stdout**:
133
196
  ```
134
197
  ── pi-review ────────────────────────────
135
198
  Verdict ! REQUEST CHANGES
199
+ Status HAS FINDINGS
136
200
  Mode code
201
+ Findings 1 actionable / 1 total
202
+ Model provider/model
203
+ Thinking xhigh
204
+ Tokens in 17.6K · out 512 · cache 2.0K · reason 0
137
205
  Duration 42.3s
138
206
  ──────────────────────────────────────────
139
207
  ```
140
208
 
141
- For scripts, parse **`PI_REVIEW_META_JSON:`** from **stderr** (same fields as before). Set `PI_REVIEW_META_STDOUT=1` to also emit that JSON line on stdout.
209
+ `Thinking` shows the requested thinking level when set; `Tokens` shows the child session's token usage (`in`/`out`/`cache`/`reason`) parsed from the `--mode json` event stream — available only when `--progress-log` is used (otherwise both lines are omitted).
210
+
211
+ For scripts, parse **`PI_REVIEW_META_JSON:`** from **stderr**. Existing keys remain, with additive fields:
212
+
213
+ ```json
214
+ {"reviewMode":"code","verdict":"request_changes","verdictSource":"parsed","status":"has_findings","findings":[{"id":"F1","severity":"high","path":"src/cli.ts","summary":"Dirty reviews exit zero","actionable":true}],"actionableCount":1,"durationMs":42300,"model":"provider/model","thinking":"xhigh","usage":{"input":18031,"output":512,"cacheRead":2048,"cacheWrite":0,"reasoning":0,"totalTokens":18591,"costTotal":0.05}}
215
+ ```
216
+
217
+ `status` is one of `clean`, `has_findings`, `needs_human`, or `blocked`: `approve` with no actionable findings is `clean`; `request_changes` or actionable findings are `has_findings`; `needs_clarification` is `needs_human`; runtime/fatal failures are `blocked`. Each finding always has `summary` and `actionable`; `id`, `severity`, and `path` are present when parsed. `thinking` and `usage` are additive and present only when available (token usage requires `--progress-log`). The line remains a single additive JSON record, so older consumers can ignore unknown keys. Set `PI_REVIEW_META_STDOUT=1` to emit it on stdout instead.
218
+
219
+ The parser prefers the exact `### F1` shape above but also accepts legacy `###` headings and top-level finding lists. When `Actionable` is missing, findings under `request_changes` default to actionable and other verdicts default to non-actionable. A missing/unrecognized verdict falls back to `needs_clarification` / `needs_human` and includes `parseError`; runtime failures always remain `blocked`.
220
+
221
+ ### Exit codes
222
+
223
+ | Code | Meaning |
224
+ |------|---------|
225
+ | `0` | Final status is `clean` |
226
+ | `1` | Final status is `has_findings` / loop budget exhausted |
227
+ | `2` | CLI usage or argument error |
228
+ | `3` | `needs_human` — clarification or a decision is required |
229
+ | `4` | `blocked` — child/runtime failure or review cannot proceed |
142
230
 
143
231
  ## Session Management
144
232
 
@@ -150,19 +238,17 @@ pi-review --mode challenge --keep-session -- @docs/design.md
150
238
  pi-review --continue <sessionHandle> --mode challenge --model provider/model -- "expand finding 2"
151
239
  ```
152
240
 
153
- ## Live Progress in AI Hosts
241
+ ## Live Progress and Token Usage
242
+
243
+ `pi-review` always runs the child in `--mode json` internally. In streaming mode it forwards **readable text deltas** to stdout live and writes **semantic milestone notices** to stderr — `pi-review: review started`, `pi-review: tool <name> started/finished`, `pi-review: review finished`. Token usage (`input`/`output`/`cache`/`reasoning`) is accumulated by default and shown in the ASCII footer and `PI_REVIEW_META_JSON` — **no `--progress-log` required**.
154
244
 
155
- Agent hosts like Claude Code, Cursor, and Codex typically buffer a Bash tool's stdout until the command exits, so a multi-minute review can look like a silent wait followed by one large dump — even though `pi-review` streams by default. `--progress-log <path>` sidesteps this: it runs the child in `--mode json` and writes its event log to a file in real time, independent of what the calling tool does with stdout.
245
+ Agent hosts like Claude Code, Cursor, and Codex typically buffer a Bash tool's stdout until the command exits. The stderr milestone notices give you progress signals without tailing a file. The final Markdown review + ASCII footer arrive on stdout when the process exits.
156
246
 
157
- The bundled **pi-review** agent skill tells parent agents to use `--progress-log` by default on those hosts (Pi `/rv` stays on default streaming). Details: [`skills/pi-review/SKILL.md`](skills/pi-review/SKILL.md) and [`skills/pi-review/references/codex-tools.md`](skills/pi-review/references/codex-tools.md).
247
+ `--progress-log <path>` is now an **optional** convenience for fine-grained debugging: it tees the raw `--mode json` event stream to a file. It no longer gates token visibility. Details: [`skills/pi-review/SKILL.md`](skills/pi-review/SKILL.md) and [`skills/pi-review/references/codex-tools.md`](skills/pi-review/references/codex-tools.md).
158
248
 
159
249
  ```bash
160
- # Start the review in the background, writing structured progress events to a file
250
+ # Optional: capture the full event log for debugging
161
251
  pi-review --progress-log /tmp/pi-review.jsonl -- @src/foo.ts &
162
-
163
- # Tail it from another process/tool (e.g. Claude Code's Monitor tool) for live updates.
164
- # `message_update` and `tool_execution_update` carry high-frequency token-level deltas —
165
- # excluding them keeps the feed to milestone events (tool start/end, turn end, agent end).
166
252
  tail -f -n +1 /tmp/pi-review.jsonl | jq -c --unbuffered '
167
253
  select(.type != "message_update" and .type != "tool_execution_update")
168
254
  '
@@ -173,7 +259,8 @@ The JSON event schema is pi CLI's own internal format, not a contract `pi-review
173
259
  ## CLI Reference
174
260
 
175
261
  ```
176
- pi-review [options] -- <@files|text...>
262
+ pi-review [review] [options] -- <@files|text...>
263
+ pi-review loop [options] -- <@files|text...>
177
264
  pi-review models [search]
178
265
  ```
179
266
 
@@ -190,6 +277,15 @@ pi-review models [search]
190
277
  | `--name <name>` | Session name (with `--keep-session`) |
191
278
  | `--no-stream` | Buffer child output until exit (default: stream live) |
192
279
  | `--progress-log <path>` | Stream child `--mode json` events to this file (cannot combine with `--no-stream`) |
280
+ | `--max-rounds <n>` | Positive loop review budget (default: `3`; `loop` only) |
281
+ | `--reviewers <n>` | Panel: number of independent reviewers (2-8; activates panel mode) |
282
+ | `--panel <name>` | Panel: named expert-panel preset (cannot combine with `--reviewers`) |
283
+ | `--consensus <policy>` | Panel: `any \| quorum \| majority \| unanimous` (default: `quorum`) |
284
+ | `--min-agree <n>` | Panel: minimum reviewers for quorum (default: `2`; quorum only) |
285
+ | `--consensus-model <model>` | Panel: model for semantic consensus adjudication |
286
+ | `--concurrency <n>` | Panel: bounded reviewer concurrency (default: reviewer count) |
287
+
288
+ Session flags (`--keep-session`, `--continue`, `--name`) are unsupported by `loop` and panel in v1; invalid combinations print usage and exit `2`.
193
289
 
194
290
  ## Configuration
195
291
 
@@ -200,9 +296,10 @@ Override defaults via environment variables:
200
296
  | `PI_BIN` | Pi executable path (default: `pi`) |
201
297
  | `PI_REVIEW_HOME` | Directory containing `review-presets.json` and `system-prompt.md` |
202
298
  | `PI_REVIEW_PRESETS` | Path to presets JSON file |
299
+ | `PI_REVIEW_PANEL_PRESETS` | Path to panel presets JSON file |
203
300
  | `PI_REVIEW_SYSTEM_PROMPT` | Path to system prompt file |
204
301
  | `PI_REVIEW_SESSION_DIR` | Directory for persisted review sessions |
205
- | `PI_REVIEW_META_STDOUT` | Set to `1`/`true` to also print `PI_REVIEW_META_JSON` on stdout (default: stderr only) |
302
+ | `PI_REVIEW_META_STDOUT` | Set to `1`/`true` to print `PI_REVIEW_META_JSON` on stdout instead of stderr |
206
303
 
207
304
  ## Pi Package Usage
208
305
 
@@ -235,7 +332,7 @@ Completions are a hint layer only; execution remains skill-driven. When the mode
235
332
 
236
333
  ## Security
237
334
 
238
- - Each review runs in an isolated child Pi session
335
+ - Each review and every loop round runs in an isolated child Pi session
239
336
  - Default runs use `--no-session` — no child context is stored
240
337
  - `--keep-session` stores only the child review session for explicit follow-up
241
338
  - The review session is read-only: no file edits, patches, commits, or deployments
package/README.zh-CN.md CHANGED
@@ -42,6 +42,7 @@ pi-review -- @src/foo.ts
42
42
  pi-review --model openai/gpt-5.5 -- @src/foo.ts
43
43
  pi-review --mode plan -- @docs/architecture.md
44
44
  pi-review --mode challenge -- @docs/design.md
45
+ pi-review loop --max-rounds 3 -- @src
45
46
  pi-review models
46
47
  ```
47
48
 
@@ -53,6 +54,56 @@ pi-review models
53
54
  | `plan` | 多视角方案 / 架构审查 |
54
55
  | `challenge` | 对抗式审查,压测假设与证据缺口 |
55
56
 
57
+ ## Loop Review
58
+
59
+ `pi-review loop` 会对当前工作树执行有上限的、彼此隔离的只读审查轮次:
60
+
61
+ ```bash
62
+ pi-review loop --max-rounds 3 -- @src
63
+ ```
64
+
65
+ 每轮都是完整 review run;命令不会编辑、打补丁、等待文件变化,也不会让子会话修复问题。遇到 `clean`、`needs_human`、`blocked` 会提前停止;仍有 actionable finding 时,在预算耗尽后以非零状态退出并输出逐轮摘要。宿主 Agent 或人工负责筛选并修复任务范围内的问题,再重新调用命令。需要在每次修复之间留出宿主处理点时,使用 `--max-rounds 1`。
66
+
67
+ `loop` 复用普通审查的 mode/model/progress/target 参数;v1 明确不支持 `--keep-session`、`--continue`、`--name`。
68
+
69
+ ## Panel Review(面板审查)
70
+
71
+ 面板审查让多个**独立**审查者在隔离子会话中并行评审,再聚合为同一个门禁结论。审查者看不到彼此的发现,因此一致代表独立发现。
72
+
73
+ ```bash
74
+ # 单次面板审查
75
+ pi-review --reviewers 3 --consensus quorum --min-agree 2 -- @src
76
+ # 专家预设(正确性 / 安全 / 测试三视角)
77
+ pi-review --panel code-experts --consensus majority -- @src
78
+ # 面板 loop(最多 reviewer 数 × max-rounds 次审查 + 仲裁)
79
+ pi-review loop --reviewers 3 --consensus quorum --max-rounds 2 -- @src
80
+ ```
81
+
82
+ ### 共识(Consensus)
83
+
84
+ 只有当足够多的独立审查者把同一问题标为 **actionable** 时,该 finding 才成为 **confirmed finding**(参与门禁);否则保留为非阻塞的 **advisory**(建议)。多审查者面板默认 **quorum**,最低同意数 **2**,避免面板模式悄悄退化为"任一发现即 fail-closed";单审查仍为阈值 1。
85
+
86
+ | 策略 | 阈值 |
87
+ |------|------|
88
+ | `any` | 1 个 actionable 审查者即确认 |
89
+ | `quorum`(默认) | 配置的最低同意数(默认 2,用 `--min-agree`) |
90
+ | `majority` | `floor(审查者数 / 2) + 1` |
91
+ | `unanimous` | 全体审查者 |
92
+
93
+ 单条(未被交叉印证的)发现作为 **advisory** 可见,但不改变 clean 状态、不会让门禁失败。确认的可操作簇产生 `has_findings`;无确认簇则产生 `clean`。
94
+
95
+ ### 聚合
96
+
97
+ 两阶段匹配:先用稳定锚点(路径 + 归一化摘要)做确定性匹配;只有路径相同、措辞不同的模糊候选才交给受限的**语义仲裁器**(用 `--consensus-model` 启用)。仲裁器只能聚类,不得发明 finding、丢弃 finding、补充证据或充当额外审查者,且没有写工具。低置信匹配保持为独立 advisory,避免靠"相似"制造虚假共识。
98
+
99
+ ### 成本与失败
100
+
101
+ 审查者运行数 = `--reviewers <n>` × `--max-rounds`(loop);启用 `--consensus-model` 时每轮最多再跑一次仲裁。用 `--concurrency <n>` 限制并发(默认等于审查者数,不超过)。审查者运行时失败 → `blocked`;无法解析的脏输出或未决澄清 → `needs_human`;绝不悄悄 clean。面板审查 v1 不支持 `--keep-session`、`--continue`、`--name`(审查者用 `--no-session`);宿主 Agent 仍是唯一可编辑者。
102
+
103
+ ### 机器输出
104
+
105
+ 一次面板评估只输出**一条**聚合 `PI_REVIEW_META_JSON`,新增字段:`strategy: "panel"`、`configuredReviewers`、`successfulReviewers`、`consensusPolicy`、`consensusThreshold`、`panelHealth`、`confirmedClusters`、`advisories` 以及每个 `reviewers` 的结果。顶层 `findings` 只含确认簇;advisory 单独存放。旧字段保留,老消费者可安全忽略新字段。
106
+
56
107
  ## Pi 包:`/rv` 命令
57
108
 
58
109
  安装 Pi 包后可在 Pi 里使用 `/rv`:
@@ -66,13 +117,23 @@ pi-review models
66
117
 
67
118
  跟进审查时,`--continue` 与首次 `/rv` 一样可**选填** `--mode`、`--model`(以及后续 CLI 支持的其它选项由 skill 直接调用 CLI 时传入)。
68
119
 
69
- `/rv` 会向主会话注入**英文任务说明**(**仅 Pi 宿主**:默认流式、**不要**自动加 `--no-stream` / `--progress-log`),由主 Agent 调用 `pi-review` CLI。普通 `/rv @path` 无需额外参数。需要整段缓冲时显式 `/rv --no-stream`。
120
+ `/rv` 会向主会话注入**英文任务说明**(**仅 Pi 宿主**:默认流式,无需 `--no-stream` / `--progress-log`),由主 Agent 调用 `pi-review` CLI。普通 `/rv @path` 无需额外参数。需要整段缓冲时显式 `/rv --no-stream`。
70
121
 
71
- **Claude Code / Codex 等 Agent 宿主**:Bash 工具会缓冲 stdout,不能指望“默认流式”在对话里逐字出现;**pi-review skill 默认建议** `--progress-log <path>` + 后台运行 + tail 日志。详见 `skills/pi-review/SKILL.md`、`skills/pi-review/references/codex-tools.md` 与英文 README。
122
+ **Claude Code / Codex 等 Agent 宿主**:`pi-review` 默认把可读文本增量流到 stdout,把**语义化里程碑**写到 stderr(`pi-review: review started` / `pi-review: tool <name> started/finished` / `pi-review: review finished`);token 用量默认就能拿到,无需 `--progress-log`。`--progress-log` 退化为可选的调试用全量事件日志。详见 `skills/pi-review/SKILL.md`、`skills/pi-review/references/codex-tools.md` 与英文 README。
72
123
 
73
124
  ## 输出格式
74
125
 
75
- 审查结果包含 `## Verdict`、`## Summary`、`## Findings` 等章节,并以 **ASCII 页脚**(`── pi-review` 框线 + Verdict/Mode/Duration/Session)结尾;机器可读 JSON 在 **stderr** 一行 `PI_REVIEW_META_JSON:`(需写 stdout 时设 `PI_REVIEW_META_STDOUT=1`)。
126
+ 审查结果包含 `## Verdict`、`## Summary`、`## Findings` 等章节。每条 finding 使用 `F1 + Severity + Path + Actionable + Evidence + Impact + Recommendation` 结构。ASCII 页脚会显示 Verdict、`Status`、finding 数量、Mode、Duration/Session。
127
+
128
+ 机器可读 JSON 仍在 **stderr** 的单行 `PI_REVIEW_META_JSON:` 中,并以新增字段提供:
129
+
130
+ - `status`: `clean | has_findings | needs_human | blocked`
131
+ - `findings`: `{ id?, severity?, path?, summary, actionable }[]`
132
+ - `actionableCount`: 可操作问题数量
133
+
134
+ 旧字段不删除;需改为写入 stdout 时设 `PI_REVIEW_META_STDOUT=1`。解析器优先识别上述 `### F1` 格式,也兼容旧的三级标题和顶层列表;缺少 `Actionable` 时,`request_changes` 下默认可操作,其它 verdict 默认不可操作。无法识别 verdict 时会回退到 `needs_human` 并附带 `parseError`,运行时失败始终保持 `blocked`。
135
+
136
+ 退出码:`0` clean、`1` 最终状态为 `has_findings` / loop 预算耗尽、`2` 参数错误、`3` needs human、`4` blocked / 运行时失败。
76
137
 
77
138
  ## 配置
78
139
 
package/dist/args.d.ts CHANGED
@@ -1,4 +1,12 @@
1
1
  import type { ParsedArgs } from "./types.js";
2
2
  export declare function usage(exitCode?: number): never;
3
+ export declare const DEFAULT_MAX_ROUNDS = 3;
4
+ export declare class ArgsParseError extends Error {
5
+ readonly exitCode: number;
6
+ constructor(message: string, exitCode?: number);
7
+ }
8
+ /** Pure parser for the review and loop command seam. */
9
+ export declare function parseReviewCommand(input: string[]): ParsedArgs;
10
+ export declare function isPanelActive(options: Pick<ParsedArgs, "reviewers" | "panel">): boolean;
3
11
  export declare function parseArgs(argv: string[]): ParsedArgs;
4
12
  //# sourceMappingURL=args.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAgB,KAAK,CAAC,QAAQ,SAAI,GAAG,KAAK,CAsCzC;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAkGpD"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wBAAgB,KAAK,CAAC,QAAQ,SAAI,GAAG,KAAK,CAyDzC;AAED,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,qBAAa,cAAe,SAAQ,KAAK;IACV,QAAQ,CAAC,QAAQ;gBAAlC,OAAO,EAAE,MAAM,EAAW,QAAQ,SAAI;CAInD;AAoBD,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAgH9D;AA0CD,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,OAAO,CAEvF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyBpD"}
package/dist/args.js CHANGED
@@ -1,8 +1,10 @@
1
+ import { CONSENSUS_POLICIES, MAX_REVIEWERS } from "./types.js";
1
2
  import { parseInstallCommand } from "./install-args.js";
2
3
  export function usage(exitCode = 0) {
3
4
  const out = `Usage:
4
5
  pi-review models [search]
5
- pi-review [options] -- <@files|text...>
6
+ pi-review [review] [options] -- <@files|text...>
7
+ pi-review loop [options] -- <@files|text...>
6
8
  pi-review update Update to the latest version
7
9
  pi-review install [options] Pi package + agent skills (one-shot)
8
10
  pi-review install-skill [options] Install skill to AI agents only
@@ -19,18 +21,36 @@ Options:
19
21
  --tools <csv> Override allowed tools
20
22
  --no-stream Buffer child output until exit (default: stream live)
21
23
  --progress-log <path> Stream child --mode json events to this file (cannot combine with --no-stream)
24
+ --max-rounds <n> Loop review budget (default: 3; loop only)
25
+ --reviewers <n> Panel: number of independent reviewers (2-8; activates panel mode)
26
+ --panel <name> Panel: named expert-panel preset (cannot combine with --reviewers)
27
+ --consensus <policy> Panel: any | quorum | majority | unanimous (default: quorum)
28
+ --min-agree <n> Panel: minimum reviewers for quorum (default: 2; quorum only)
29
+ --consensus-model <model> Panel: model for semantic consensus adjudication
30
+ --concurrency <n> Panel: bounded reviewer concurrency (default: reviewer count)
22
31
  -h, --help Show help
23
32
 
24
- Session (requires Pi session support):
33
+ Session (single review only; rejected by loop and panel):
25
34
  --keep-session Persist the review session for follow-up
26
35
  --continue <sessionHandle> Continue an existing review session
27
36
  --name <name> Session name (with --keep-session)
28
37
 
38
+ Exit codes:
39
+ 0 clean | 1 findings remain | 2 usage | 3 needs human | 4 blocked/runtime failure
40
+
41
+ Panel cost: reviewer runs = --reviewers <n> times --max-rounds (loop), plus one
42
+ consensus-adjudication call per round when --consensus-model is set. Single-review
43
+ commands (default, no --reviewers/--panel) keep the existing low-cost workflow.
44
+
29
45
  Examples:
30
46
  pi-review models
31
47
  pi-review -- @src/foo.ts
32
48
  pi-review --model openai/gpt-5.5 -- @src/foo.ts
33
49
  pi-review --mode challenge --keep-session -- @design.md
50
+ pi-review --reviewers 3 --consensus quorum --min-agree 2 -- @src
51
+ pi-review --panel code-experts --consensus majority -- @src
52
+ pi-review loop --reviewers 3 --consensus quorum --max-rounds 3 -- @src
53
+ pi-review loop --max-rounds 3 -- @src
34
54
  pi-review install
35
55
  pi-review install --agent claude-code codex -y
36
56
  pi-review install-skill
@@ -38,42 +58,50 @@ Examples:
38
58
  (exitCode === 0 ? process.stdout : process.stderr).write(out);
39
59
  process.exit(exitCode);
40
60
  }
61
+ export const DEFAULT_MAX_ROUNDS = 3;
62
+ export class ArgsParseError extends Error {
63
+ exitCode;
64
+ constructor(message, exitCode = 2) {
65
+ super(message);
66
+ this.exitCode = exitCode;
67
+ this.name = "ArgsParseError";
68
+ }
69
+ }
41
70
  function requireValue(flag, argv) {
42
71
  if (argv.length === 0 || argv[0] === "--") {
43
- process.stderr.write(`pi-review: ${flag} requires a value\n`);
44
- process.exit(2);
72
+ throw new ArgsParseError(`${flag} requires a value`);
45
73
  }
46
74
  return argv.shift();
47
75
  }
48
- export function parseArgs(argv) {
49
- if (argv.length === 0 || argv[0] === "-h" || argv[0] === "--help")
50
- usage(0);
51
- if (argv[0] === "models") {
52
- return { command: "models", search: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
53
- }
54
- if (argv[0] === "install") {
55
- return parseInstallCommand(argv.slice(1));
76
+ function parsePositiveInteger(flag, value) {
77
+ if (!/^[1-9]\d*$/.test(value)) {
78
+ throw new ArgsParseError(`${flag} must be a positive integer`);
56
79
  }
57
- if (argv[0] === "install-skill") {
58
- return { command: "install-skill", extraArgs: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
80
+ const parsed = Number(value);
81
+ if (!Number.isSafeInteger(parsed)) {
82
+ throw new ArgsParseError(`${flag} must be a safe positive integer`);
59
83
  }
60
- if (argv[0] === "uninstall-skill") {
61
- return { command: "uninstall-skill", extraArgs: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
62
- }
63
- if (argv[0] === "update") {
64
- return { command: "update", mode: "code", skills: [], payload: [], keepSession: false, stream: true };
84
+ return parsed;
85
+ }
86
+ /** Pure parser for the review and loop command seam. */
87
+ export function parseReviewCommand(input) {
88
+ const argv = [...input];
89
+ let command = "review";
90
+ if (argv[0] === "review" || argv[0] === "loop") {
91
+ command = argv.shift();
65
92
  }
66
93
  let mode = "code";
67
94
  if (argv[0] && !argv[0].startsWith("-")) {
68
95
  mode = argv.shift();
69
96
  }
70
97
  const options = {
71
- command: "review",
98
+ command,
72
99
  mode,
73
100
  skills: [],
74
101
  payload: [],
75
102
  keepSession: false,
76
103
  stream: true,
104
+ ...(command === "loop" ? { maxRounds: DEFAULT_MAX_ROUNDS } : {}),
77
105
  };
78
106
  while (argv.length > 0) {
79
107
  const arg = argv.shift();
@@ -84,8 +112,7 @@ export function parseArgs(argv) {
84
112
  switch (arg) {
85
113
  case "-h":
86
114
  case "--help":
87
- usage(0);
88
- break;
115
+ throw new ArgsParseError("", 0);
89
116
  case "--mode":
90
117
  options.mode = requireValue(arg, argv);
91
118
  break;
@@ -119,10 +146,30 @@ export function parseArgs(argv) {
119
146
  case "--progress-log":
120
147
  options.progressLog = requireValue(arg, argv);
121
148
  break;
149
+ case "--max-rounds":
150
+ options.maxRounds = parsePositiveInteger(arg, requireValue(arg, argv));
151
+ break;
152
+ case "--reviewers":
153
+ options.reviewers = parsePositiveInteger(arg, requireValue(arg, argv));
154
+ break;
155
+ case "--panel":
156
+ options.panel = requireValue(arg, argv);
157
+ break;
158
+ case "--consensus":
159
+ options.consensus = requireValue(arg, argv);
160
+ break;
161
+ case "--min-agree":
162
+ options.minAgree = parsePositiveInteger(arg, requireValue(arg, argv));
163
+ break;
164
+ case "--consensus-model":
165
+ options.consensusModel = requireValue(arg, argv);
166
+ break;
167
+ case "--concurrency":
168
+ options.concurrency = parsePositiveInteger(arg, requireValue(arg, argv));
169
+ break;
122
170
  default:
123
171
  if (arg.startsWith("--")) {
124
- process.stderr.write(`pi-review: unknown option: ${arg}\n`);
125
- process.exit(2);
172
+ throw new ArgsParseError(`unknown option: ${arg}`);
126
173
  }
127
174
  options.payload.push(arg, ...argv);
128
175
  argv.length = 0;
@@ -130,13 +177,85 @@ export function parseArgs(argv) {
130
177
  }
131
178
  }
132
179
  if (options.keepSession && options.continueHandle) {
133
- process.stderr.write("pi-review: --keep-session and --continue cannot be used together\n");
134
- process.exit(2);
180
+ throw new ArgsParseError("--keep-session and --continue cannot be used together");
135
181
  }
136
182
  if (options.progressLog && !options.stream) {
137
- process.stderr.write("pi-review: --progress-log cannot be used with --no-stream\n");
138
- process.exit(2);
183
+ throw new ArgsParseError("--progress-log cannot be used with --no-stream");
139
184
  }
185
+ if (command !== "loop" && options.maxRounds !== undefined) {
186
+ throw new ArgsParseError("--max-rounds can only be used with loop");
187
+ }
188
+ if (command === "loop" && (options.keepSession || options.continueHandle || options.name)) {
189
+ throw new ArgsParseError("loop cannot be used with --keep-session, --continue, or --name");
190
+ }
191
+ validatePanelOptions(options);
140
192
  return options;
141
193
  }
194
+ function validatePanelOptions(options) {
195
+ const hasReviewers = options.reviewers !== undefined;
196
+ const reviewerCount = options.reviewers ?? 1;
197
+ const panelActive = reviewerCount > 1 || options.panel !== undefined;
198
+ const anyPanelOption = options.consensus !== undefined ||
199
+ options.minAgree !== undefined ||
200
+ options.consensusModel !== undefined ||
201
+ options.concurrency !== undefined;
202
+ if (hasReviewers && options.reviewers > MAX_REVIEWERS) {
203
+ throw new ArgsParseError(`--reviewers must be between 1 and ${MAX_REVIEWERS}`);
204
+ }
205
+ if (hasReviewers && options.panel) {
206
+ throw new ArgsParseError("--reviewers cannot be used with --panel");
207
+ }
208
+ if (!panelActive && anyPanelOption) {
209
+ throw new ArgsParseError("panel options require --reviewers > 1 or --panel");
210
+ }
211
+ if (panelActive && (options.keepSession || options.continueHandle || options.name)) {
212
+ throw new ArgsParseError("panel cannot be used with --keep-session, --continue, or --name");
213
+ }
214
+ if (options.consensus !== undefined && !CONSENSUS_POLICIES.includes(options.consensus)) {
215
+ throw new ArgsParseError(`unknown consensus policy: ${options.consensus}. Available: ${CONSENSUS_POLICIES.join(", ")}`);
216
+ }
217
+ if (options.minAgree !== undefined) {
218
+ if (options.consensus !== undefined && options.consensus !== "quorum") {
219
+ throw new ArgsParseError("--min-agree is only meaningful with --consensus quorum");
220
+ }
221
+ if (hasReviewers && !options.panel && options.minAgree > options.reviewers) {
222
+ throw new ArgsParseError(`--min-agree ${options.minAgree} cannot exceed reviewer count ${options.reviewers}`);
223
+ }
224
+ }
225
+ if (options.concurrency !== undefined && hasReviewers && !options.panel && options.concurrency > options.reviewers) {
226
+ throw new ArgsParseError(`--concurrency ${options.concurrency} cannot exceed reviewer count ${options.reviewers}`);
227
+ }
228
+ }
229
+ export function isPanelActive(options) {
230
+ return (options.reviewers !== undefined && options.reviewers > 1) || options.panel !== undefined;
231
+ }
232
+ export function parseArgs(argv) {
233
+ if (argv.length === 0 || argv[0] === "-h" || argv[0] === "--help")
234
+ usage(0);
235
+ if (argv[0] === "models") {
236
+ return { command: "models", search: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
237
+ }
238
+ if (argv[0] === "install") {
239
+ return parseInstallCommand(argv.slice(1));
240
+ }
241
+ if (argv[0] === "install-skill") {
242
+ return { command: "install-skill", extraArgs: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
243
+ }
244
+ if (argv[0] === "uninstall-skill") {
245
+ return { command: "uninstall-skill", extraArgs: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false, stream: true };
246
+ }
247
+ if (argv[0] === "update") {
248
+ return { command: "update", mode: "code", skills: [], payload: [], keepSession: false, stream: true };
249
+ }
250
+ try {
251
+ return parseReviewCommand(argv);
252
+ }
253
+ catch (error) {
254
+ if (!(error instanceof ArgsParseError))
255
+ throw error;
256
+ if (error.message)
257
+ process.stderr.write(`pi-review: ${error.message}\n`);
258
+ usage(error.exitCode);
259
+ }
260
+ }
142
261
  //# sourceMappingURL=args.js.map
package/dist/args.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.d.ts","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":""}