council-review 0.1.0 → 0.1.1
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 +37 -346
- package/dist/bin.js +0 -0
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/node-guard.d.ts +2 -1
- package/dist/node-guard.d.ts.map +1 -1
- package/dist/node-guard.js +27 -5
- package/dist/node-guard.js.map +1 -1
- package/dist/picker.d.ts +45 -1
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +127 -12
- package/dist/picker.js.map +1 -1
- package/dist/reviewer-tools.d.ts.map +1 -1
- package/dist/reviewer-tools.js +4 -4
- package/dist/reviewer-tools.js.map +1 -1
- package/dist/status.js +1 -1
- package/dist/status.js.map +1 -1
- package/package.json +9 -9
- package/src/config.ts +1 -1
- package/src/node-guard.ts +33 -5
- package/src/picker.ts +156 -15
- package/src/reviewer-tools.ts +4 -2
- package/src/status.ts +1 -1
package/README.md
CHANGED
|
@@ -2,372 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
A read-only, multi-vendor code review panel over local git state.
|
|
4
4
|
|
|
5
|
-
`council-review` sends the work in your git worktree to several
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
`council-review` sends the work in your git worktree to several models from **different vendors**
|
|
6
|
+
and merges their findings in deterministic code, never through another model. Reviewers cannot
|
|
7
|
+
write anything: every host built-in is removed, the repository under review cannot load its own
|
|
8
|
+
extensions, skills or context files into the process reviewing it, and a reviewer's whole tool
|
|
9
|
+
surface is four read-only tools scoped to a frozen, non-writable copy of your tree. That is not
|
|
10
|
+
container or VM isolation, and third-party models do read your source — see
|
|
11
|
+
[`HOST-VERSION.md`](./HOST-VERSION.md) and the
|
|
12
|
+
[design doc](./docs/design/council-review-design.md) for what was actually verified, and re-verify
|
|
13
|
+
after a host upgrade. Every run writes a timestamped directory under `.council/reviews/` holding a
|
|
14
|
+
manifest, each reviewer's raw output, the merged findings, a human report (`REPORT.md`) and a
|
|
15
|
+
handoff prompt addressed to a coding agent (`HANDOFF.md`).
|
|
14
16
|
|
|
15
17
|
## Install
|
|
16
18
|
|
|
17
|
-
This package is not yet published to npm, so the recommended install is directly from GitHub.
|
|
18
|
-
|
|
19
|
-
### From GitHub (recommended)
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
npm install -g github:ad-005/council-review
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
This installs and builds straight from the repository and works today.
|
|
26
|
-
|
|
27
|
-
### From npm
|
|
28
|
-
|
|
29
19
|
```
|
|
30
20
|
npm install -g council-review
|
|
31
21
|
```
|
|
32
22
|
|
|
33
|
-
|
|
34
|
-
command currently fails — the GitHub install above is the one that works.
|
|
35
|
-
|
|
36
|
-
### From source (development)
|
|
23
|
+
For unreleased changes from `main`, install straight from GitHub instead:
|
|
37
24
|
|
|
38
25
|
```
|
|
39
|
-
|
|
40
|
-
cd council-review
|
|
41
|
-
npm install
|
|
42
|
-
npm run build
|
|
43
|
-
npm link
|
|
26
|
+
npm install -g github:ad-005/council-review
|
|
44
27
|
```
|
|
45
28
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
Requires Node.js 20 or later to install and run `council-review` itself, plus the
|
|
51
|
-
[`pi`](#the-pi-host-dependency) coding-agent CLI on `PATH`, authenticated for at least one
|
|
52
|
-
provider. `pi` itself requires Node.js **>= 22.19.0**, which is the effective floor for actually
|
|
53
|
-
running a review — a Node 20 or 21 install satisfies `council-review`'s own guard but leaves every
|
|
54
|
-
reviewer failing to spawn.
|
|
29
|
+
Requires the `pi` coding-agent CLI (`@earendil-works/pi-coding-agent`) on `PATH`, authenticated
|
|
30
|
+
for at least one provider through `pi`'s own credential store — a key that exists only as a shell
|
|
31
|
+
variable never reaches a reviewer, because reviewer processes get a tight environment allowlist.
|
|
32
|
+
Both `council-review` and `pi` need Node **>= 22.19.0**.
|
|
55
33
|
|
|
56
|
-
##
|
|
34
|
+
## Use
|
|
57
35
|
|
|
58
36
|
```
|
|
59
37
|
cd your-project
|
|
60
|
-
council-review init # pick a panel
|
|
61
|
-
council-review # review
|
|
38
|
+
council-review init # pick a panel; writes .council/config.json (commit it)
|
|
39
|
+
council-review # review this worktree against its base branch
|
|
62
40
|
```
|
|
63
41
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
## Scope flags
|
|
75
|
-
|
|
76
|
-
| Flag | Meaning |
|
|
77
|
-
| ---------------------------- | ------------------------------------------------ |
|
|
78
|
-
| `--staged` | Review the staged index only |
|
|
79
|
-
| `--range <A..B>` | Review a commit range |
|
|
80
|
-
| `--revision <rev>` | Review a single revision's own change |
|
|
81
|
-
| `--paths <glob>[,<glob>...]` | Narrow to matching paths (repeatable) |
|
|
82
|
-
| `--base <branch>` | Override the configured base branch for this run |
|
|
83
|
-
|
|
84
|
-
`--staged`, `--range` and `--revision` are mutually exclusive. An empty resolved scope (nothing to
|
|
85
|
-
review) is not an error: the tool reports that and exits `0` without spawning a reviewer.
|
|
86
|
-
|
|
87
|
-
## Panel flags
|
|
88
|
-
|
|
89
|
-
| Flag | Meaning |
|
|
90
|
-
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
91
|
-
| `--models <spec>` | One-off panel for this run only: comma-separated `provider/modelId[:level]` entries or globs. Does not touch the saved panel. |
|
|
92
|
-
| `--pick` | Re-open interactive selection; the result **replaces** the saved panel |
|
|
93
|
-
| `--thinking <level>` | Panel-wide thinking level (one of `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`) |
|
|
94
|
-
| `--allow-correlated` | Waive the vendor-independence guard for this run (recorded in the manifest even when it wasn't needed) |
|
|
95
|
-
|
|
96
|
-
`council-review models` lists every discovered, ready model with its provider, derived vendor,
|
|
97
|
-
context window, cost rates and supported thinking levels — no prompt, no model call, works without
|
|
98
|
-
a terminal.
|
|
99
|
-
|
|
100
|
-
### The vendor-independence guard
|
|
101
|
-
|
|
102
|
-
A panel is admitted only with **at least three models resolving to at least three distinct
|
|
103
|
-
vendors** (`unknown` counts as its own distinct vendor, so three unrecognised models still pass).
|
|
104
|
-
This is checked at the end of selection and again immediately before every launch, so a
|
|
105
|
-
hand-edited config is checked too. On refusal, nothing is spawned and the tool exits `4`. Pass
|
|
106
|
-
`--allow-correlated` to waive both the vendor-count and the three-model minimum deliberately.
|
|
107
|
-
|
|
108
|
-
## Run flags
|
|
109
|
-
|
|
110
|
-
| Flag | Meaning |
|
|
111
|
-
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
112
|
-
| `--timeout <seconds>` | Per-reviewer wall-clock timeout (overrides configured `timeoutSeconds`) |
|
|
113
|
-
| `--max-tokens <n>` | Per-reviewer output-token ceiling (overrides configured `maxOutputTokens`); with neither the flag nor the config key set, there is no ceiling |
|
|
114
|
-
| `--since <last\|run-id>` | Diff this run's findings against a previous one: `resolved` / `still-present` / `new` |
|
|
115
|
-
| `--fail-on <level\|none>` | Severity threshold for exit code `1` (`critical`, `high`, `medium`, `low`, or `none` to disable) |
|
|
116
|
-
| `--no-suppress` | Ignore `.council/ignore.json` for this run only; the file itself is untouched |
|
|
117
|
-
| `--json` | Emit only the merged findings document on stdout; everything else (progress, diagnostics) goes to stderr |
|
|
118
|
-
|
|
119
|
-
## Environment (herdr) flags
|
|
120
|
-
|
|
121
|
-
Only meaningful inside a [herdr](https://herdr.dev) pane (an agent multiplexer some users run
|
|
122
|
-
coding agents under, detected via an environment marker). herdr is an optional integration —
|
|
123
|
-
install it with `brew install herdr` if you want it — and every one of these flags is gated on
|
|
124
|
-
that marker: outside that environment each degrades to exactly one printed notice, and the review
|
|
125
|
-
itself proceeds and completes identically to how it would with none of these flags supplied — same
|
|
126
|
-
artifacts, same exit code. A failing or unavailable herdr command is likewise reported as a warning
|
|
127
|
-
only; it never changes the review's own outcome.
|
|
128
|
-
|
|
129
|
-
| Flag | Meaning |
|
|
130
|
-
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
131
|
-
| `--pane` | Run the review in a new herdr pane (default direction: horizontal), current working directory carried over, focus left where it was |
|
|
132
|
-
| `--direction <horizontal\|vertical>` | Direction for `--pane` |
|
|
133
|
-
| `--no-pane` | Do not delegate to a new pane even if `--pane` is set |
|
|
134
|
-
| `--handoff <agent>` | Deliver the written handoff prompt to a herdr-managed agent by name; delivery is not awaited, so the review command's own exit code reflects the review only |
|
|
135
|
-
| `--no-notify` | Suppress the herdr completion notification (still raised, conveying completion, after a degraded run) |
|
|
136
|
-
|
|
137
|
-
## Subcommands
|
|
138
|
-
|
|
139
|
-
- **`init [--pick]`** — bootstrap the current repository: run panel selection, write
|
|
140
|
-
`.council/config.json` and `.council/ignore.json`, and ensure `.gitignore` excludes
|
|
141
|
-
`.council/reviews/`. Safe to re-run: existing suppressions are preserved. Must be run inside a
|
|
142
|
-
git repository.
|
|
143
|
-
- **`models`** — list discovered, ready models. No prompt, no model call.
|
|
144
|
-
- **`show [run-id]`** — render a stored run's `REPORT.md`. Defaults to the most recent run. No
|
|
145
|
-
model call.
|
|
146
|
-
- **`ignore <finding-id> [--reason <text>] [--run <run-id>]`** — resolve a finding id from a run's
|
|
147
|
-
merged findings to its fingerprint and append it to `.council/ignore.json`. Idempotent.
|
|
148
|
-
- **`gc [--keep <n>]`** — prune stored runs under `.council/reviews/`, keeping the `<n>` most
|
|
149
|
-
recent (default: the configured `retain`, or 20). Never removes the run the `last` pointer
|
|
150
|
-
resolves to. Also sweeps snapshot directories orphaned by a run that couldn't clean up after
|
|
151
|
-
itself.
|
|
152
|
-
- **`status [--json] [--verify]`** — report whether this project is configured, plus the resolved
|
|
153
|
-
panel, independence-guard verdict, settings, suppression count, stored runs and
|
|
154
|
-
gitignore/herdr state. This is the intended entry point for a coding agent to check in
|
|
155
|
-
milliseconds whether it can run a review here at all, before doing anything else. Exits `0`
|
|
156
|
-
when configured, `2` when not — including outside a git repository, or with an invalid
|
|
157
|
-
`.council/config.json` (the offending key is named in the report) — and never anything else.
|
|
158
|
-
The default form makes no host call and no model call: it reads only files already on disk
|
|
159
|
-
(plus the single `git rev-parse` used to find the repository root). `--verify` additionally
|
|
160
|
-
discovers the model catalog and reports each panel entry's real readiness and effective
|
|
161
|
-
thinking level — a stale panel entry (a model no longer in the catalog) is reported as not
|
|
162
|
-
ready rather than causing the command to fail. `--json` emits the full report as JSON on
|
|
163
|
-
stdout instead of the human-readable form, e.g.:
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"version": "0.1.0",
|
|
167
|
-
"configured": true,
|
|
168
|
-
"repoRoot": "/path/to/project",
|
|
169
|
-
"config": {
|
|
170
|
-
"path": "/path/to/project/.council/config.json",
|
|
171
|
-
"present": true,
|
|
172
|
-
"valid": true,
|
|
173
|
-
"version": 1,
|
|
174
|
-
"error": null,
|
|
175
|
-
"errorKeyPath": null
|
|
176
|
-
},
|
|
177
|
-
"panel": [
|
|
178
|
-
{
|
|
179
|
-
"provider": "anthropic",
|
|
180
|
-
"model": "claude-opus-4",
|
|
181
|
-
"vendor": "anthropic",
|
|
182
|
-
"thinking": "high",
|
|
183
|
-
"effectiveThinking": null,
|
|
184
|
-
"clamped": null,
|
|
185
|
-
"ready": null,
|
|
186
|
-
"readyReason": null
|
|
187
|
-
}
|
|
188
|
-
],
|
|
189
|
-
"independence": {
|
|
190
|
-
"ok": true,
|
|
191
|
-
"modelCount": 3,
|
|
192
|
-
"vendorCount": 3,
|
|
193
|
-
"vendors": { "anthropic": ["anthropic/claude-opus-4"] },
|
|
194
|
-
"reason": null
|
|
195
|
-
},
|
|
196
|
-
"settings": {
|
|
197
|
-
"baseBranch": "main",
|
|
198
|
-
"failOn": "high",
|
|
199
|
-
"timeoutSeconds": 600,
|
|
200
|
-
"maxOutputTokens": null,
|
|
201
|
-
"mergeWindow": 10,
|
|
202
|
-
"claimSimilarity": 0.6,
|
|
203
|
-
"includeContextFiles": false,
|
|
204
|
-
"retain": 20
|
|
205
|
-
},
|
|
206
|
-
"suppressions": {
|
|
207
|
-
"path": "/path/to/project/.council/ignore.json",
|
|
208
|
-
"present": true,
|
|
209
|
-
"count": 4
|
|
210
|
-
},
|
|
211
|
-
"runs": {
|
|
212
|
-
"count": 12,
|
|
213
|
-
"last": {
|
|
214
|
-
"id": "20260904T153012123Z",
|
|
215
|
-
"path": "...",
|
|
216
|
-
"reportPath": "...",
|
|
217
|
-
"findingsPath": "..."
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
"gitignore": { "excludesReviews": true },
|
|
221
|
-
"herdr": { "detected": false },
|
|
222
|
-
"verified": false
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
Run `council-review <subcommand> --help` for a subcommand's own usage, or `council-review --help`
|
|
227
|
-
for the full flag surface.
|
|
42
|
+
A bare `council-review` reviews the whole divergence from the base branch — committed, staged,
|
|
43
|
+
unstaged and untracked changes folded into one patch — not just the index; narrow it with
|
|
44
|
+
`--staged`, `--range`, `--revision`, `--paths` or `--base`. A panel is admitted only with at least
|
|
45
|
+
three models resolving to at least three distinct vendors, checked when it is saved and again
|
|
46
|
+
before every launch, so a hand-edited config is checked too (`--allow-correlated` waives it). The
|
|
47
|
+
other subcommands are `models`, `status` (a millisecond, no-model check of whether a review can run
|
|
48
|
+
here at all — the intended entry point for a coding agent), `show`, `ignore` and `gc`; run
|
|
49
|
+
`council-review --help` for the full flag surface, and see the design doc for every
|
|
50
|
+
`.council/config.json` key.
|
|
228
51
|
|
|
229
52
|
## Exit codes
|
|
230
53
|
|
|
231
|
-
| Code | Meaning
|
|
232
|
-
| ----- |
|
|
233
|
-
| `0` | Clean: nothing at or above the `failOn` threshold
|
|
234
|
-
| `1` | Findings at or above the
|
|
235
|
-
| `2` | Configuration or usage error
|
|
236
|
-
| `3` | Degraded:
|
|
237
|
-
| `4` | The vendor-independence guard refused the panel;
|
|
238
|
-
| `130` | Interrupted (SIGINT/SIGTERM)
|
|
239
|
-
|
|
240
|
-
## What a run leaves behind
|
|
241
|
-
|
|
242
|
-
Every run writes a timestamped directory under `.council/reviews/` (excluded from version control
|
|
243
|
-
by an entry `init` adds to `.gitignore` — only the configuration in `.council/config.json` and
|
|
244
|
-
`.council/ignore.json` is meant to be committed):
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
.council/reviews/<run-id>/
|
|
248
|
-
manifest.json reviewed state, resolved scope, panel + vendors + thinking levels,
|
|
249
|
-
per-reviewer state/timings/usage/cost/depth, overrides in effect
|
|
250
|
-
patch.diff the diff patch — never inside the snapshot
|
|
251
|
-
findings.json the merged findings, as a JSON array
|
|
252
|
-
REPORT.md human-readable report
|
|
253
|
-
HANDOFF.md a prompt addressed to a coding agent, not a person
|
|
254
|
-
reviewers/<slug>.findings.json | .text.md | .trace.jsonl
|
|
255
|
-
.council/reviews/last -> <run-id> symlink to the most recent run
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
`HANDOFF.md` instructs the consuming agent to reproduce each finding before fixing it, to check a
|
|
259
|
-
merged finding against the reviewers' verbatim raw output when its claim is ambiguous, and frames
|
|
260
|
-
a low-agreement finding as a hypothesis to test, not an established defect.
|
|
261
|
-
|
|
262
|
-
## The isolation model and its limits
|
|
263
|
-
|
|
264
|
-
Three third-party models read your repository's source under this tool. That is a real trust
|
|
265
|
-
boundary, and this section describes it plainly rather than reassuringly. See
|
|
266
|
-
[`docs/design/council-review-design.md`](./docs/design/council-review-design.md)'s
|
|
267
|
-
"Decisions" and "Risks / Trade-offs" sections for the full reasoning; this is the summary a user
|
|
268
|
-
needs before relying on it.
|
|
269
|
-
|
|
270
|
-
**What the isolation actually is**, layered so that no single mistake removes it:
|
|
271
|
-
|
|
272
|
-
- Every host built-in tool is removed (`-nbt`) — specifically no shell, no file-write, no
|
|
273
|
-
file-edit capability exists for a reviewer to call.
|
|
274
|
-
- Resource discovery from the reviewed repository is disabled wholesale: no repo-supplied
|
|
275
|
-
extensions, no skills, no prompt templates, and project trust state grants no extra capability
|
|
276
|
-
— so a repository under review cannot get its own code or instructions loaded into the process
|
|
277
|
-
reviewing it.
|
|
278
|
-
- Agent context files (e.g. project-level agent instructions) are **excluded by default**, because
|
|
279
|
-
the host loads them regardless of trust and they are therefore an instruction-injection surface.
|
|
280
|
-
Opt in only via `includeContextFiles` in `.council/config.json`; the choice is recorded in every
|
|
281
|
-
run's manifest.
|
|
282
|
-
- A reviewer's entire tool surface is exactly four read-only tools — `council_read`,
|
|
283
|
-
`council_grep`, `council_list`, `council_git` — loaded from one file this package ships, never
|
|
284
|
-
installed into the host. Every path any of them is given is realpath-resolved and rejected if it
|
|
285
|
-
escapes the snapshot root, including via a symlink or an intermediate symlinked directory.
|
|
286
|
-
`council_git` reaches the _real_ repository, but only through a fixed allowlist of read-only
|
|
287
|
-
subcommands (log, show, blame, diff) with structured arguments — never a composed command line.
|
|
288
|
-
- Reviewers run against a **frozen snapshot**, not your live worktree: a plain copy into scratch,
|
|
289
|
-
made non-writable (`chmod -R a-w`) before any reviewer launches, so every reviewer reads the same
|
|
290
|
-
photograph and your ongoing edits in the meantime have no effect on the run.
|
|
291
|
-
- Removing the shell removes a reviewer's only path to arbitrary network egress. Its only outbound
|
|
292
|
-
traffic is the host's own model API call.
|
|
293
|
-
- Host session persistence is disabled (`--no-session`), so a reviewer's transcript — which
|
|
294
|
-
contains your repository's source — is never written into the host's own session store.
|
|
295
|
-
- Each reviewer process gets an **allowlisted** environment, not a denylisted one: the executable
|
|
296
|
-
search path, the home directory (so the host can find its own config/credentials), the two roots
|
|
297
|
-
the reviewer tools need, and the host's own `PI_*` variables. Every other variable from the
|
|
298
|
-
invoking environment is dropped, so no unrelated secret — including credentials for other
|
|
299
|
-
services — ever reaches a reviewer process.
|
|
300
|
-
- No code path in this package ever opens the host's credential store
|
|
301
|
-
(`~/.pi/agent/auth.json`). No artifact this tool writes can contain a token, key or secret.
|
|
302
|
-
|
|
303
|
-
**What it is not:**
|
|
304
|
-
|
|
305
|
-
- **Not container or VM isolation.** There is no sandbox boundary beyond what's described above.
|
|
306
|
-
This is a deliberate v1 choice (see the design doc's "Decisions"), not an oversight, and a stronger
|
|
307
|
-
implementation can be added later without changing what this tool guarantees observably.
|
|
308
|
-
- **`chmod -R a-w` on the snapshot is not a security boundary against a process running as the
|
|
309
|
-
same user.** A same-user process can `chmod` its way back to writable. Freezing the tree exists
|
|
310
|
-
for _consistency_ — so line numbers mean the same thing to every reviewer and to the merge step
|
|
311
|
-
— not as the source of the read-only guarantee. That guarantee comes entirely from the absence
|
|
312
|
-
of a write tool in the reviewer's callable surface.
|
|
313
|
-
- **POSIX-only.** The freeze step and the path-containment logic assume POSIX permission and
|
|
314
|
-
symlink semantics. This has not been tested, and is not expected to work, on a non-POSIX
|
|
315
|
-
filesystem.
|
|
316
|
-
- **Verified empirically against one pinned host version.** The whole guarantee rests on flags and
|
|
317
|
-
an event-stream shape belonging to the `pi` binary, which this package does not control. See
|
|
318
|
-
[`HOST-VERSION.md`](./HOST-VERSION.md) for exactly what was verified and how, and re-verify
|
|
319
|
-
after any host upgrade before trusting the isolation guarantee against the new version.
|
|
320
|
-
- **A provider whose API key exists only as a shell environment variable will not authenticate
|
|
321
|
-
inside a reviewer.** The environment allowlist above is intentionally tight and does not pass
|
|
322
|
-
through any `*_API_KEY`-shaped variable — this was a deliberate, verified decision (a scrubbed
|
|
323
|
-
environment containing only `PATH`/`HOME` was confirmed to authenticate correctly for providers
|
|
324
|
-
whose credentials live in the host's own store), not an oversight. A provider only ever
|
|
325
|
-
authenticates inside a reviewer through the host's own credential store under `HOME`. **Remedy:**
|
|
326
|
-
authenticate that provider through the host itself (e.g. `pi auth login`) so its credential is
|
|
327
|
-
saved into the host's store, rather than relying on an environment variable your shell happens
|
|
328
|
-
to export. If a provider's credential exists only as a shell variable and was never run through
|
|
329
|
-
the host's own auth flow, reviewers using that provider will fail to authenticate — this is the
|
|
330
|
-
environment allowlist working as designed, not a bug to route around by widening it.
|
|
331
|
-
- **Third-party models read your repository's source.** That is the whole premise of this tool.
|
|
332
|
-
Nothing above prevents a model provider from seeing your code as part of serving the review
|
|
333
|
-
request; it only prevents that model, or the repository it's reviewing, from writing anything,
|
|
334
|
-
executing anything, or reaching the network on its own.
|
|
335
|
-
|
|
336
|
-
### The `pi` host dependency
|
|
337
|
-
|
|
338
|
-
`council-review` spawns the `pi` coding-agent CLI (npm package `@earendil-works/pi-coding-agent`)
|
|
339
|
-
headlessly per reviewer rather than calling each vendor's API directly, so it can reuse the
|
|
340
|
-
authentication, model catalog and agentic tool loop you already have configured for it. `pi`
|
|
341
|
-
declares `engines: { node: ">=22.19.0" }`, so that version — not `council-review`'s own `>=20`
|
|
342
|
-
floor — is what actually determines whether a review can run. See
|
|
343
|
-
[`HOST-VERSION.md`](./HOST-VERSION.md) for the exact verified version and the re-verification
|
|
344
|
-
procedure after a host upgrade.
|
|
345
|
-
|
|
346
|
-
## Configuration reference (`.council/config.json`)
|
|
347
|
-
|
|
348
|
-
Written by `init`, hand-editable afterward. An unrecognised `version` is a hard error, so a future
|
|
349
|
-
schema change has a defined migration point.
|
|
350
|
-
|
|
351
|
-
| Key | Meaning |
|
|
352
|
-
| ---------------------- | -------------------------------------------------------------------------------------------------- |
|
|
353
|
-
| `version` | Config schema version |
|
|
354
|
-
| `baseBranch` | Default base branch for scope resolution |
|
|
355
|
-
| `panel` | Ordered list of `{ provider, model, thinking? }` |
|
|
356
|
-
| `defaultThinkingLevel` | Fallback thinking level when nothing more specific applies |
|
|
357
|
-
| `modelThinkingLevels` | Per-model thinking level, keyed `"provider/modelId"` — what the picker actually writes |
|
|
358
|
-
| `includeContextFiles` | Opt into loading agent context files into reviewers (default: excluded) |
|
|
359
|
-
| `timeoutSeconds` | Per-reviewer wall-clock timeout |
|
|
360
|
-
| `maxOutputTokens` | Per-reviewer output-token ceiling (default: none — reviewers are bounded by `timeoutSeconds` only) |
|
|
361
|
-
| `mergeWindow` | Line-proximity window for clustering findings |
|
|
362
|
-
| `claimSimilarity` | Claim-token-similarity threshold for clustering |
|
|
363
|
-
| `failOn` | Default severity threshold for exit code `1` (`critical`\|`high`\|`medium`\|`low`\|`none`) |
|
|
364
|
-
| `snapshot.include` | Path globs narrowing what's copied into the snapshot (large repos) |
|
|
365
|
-
| `vendorOverrides` | Exact `"provider/modelId"` → vendor overrides for vendor derivation |
|
|
366
|
-
| `retain` | Default number of runs `gc` keeps |
|
|
367
|
-
|
|
368
|
-
`.council/ignore.json` holds suppressed findings by fingerprint (stable across line movement —
|
|
369
|
-
see the design doc's fingerprinting rationale), each optionally carrying a human-supplied `reason`.
|
|
370
|
-
Managed through `council-review ignore`, not normally hand-edited.
|
|
54
|
+
| Code | Meaning |
|
|
55
|
+
| ----- | --------------------------------------------------------------------------- |
|
|
56
|
+
| `0` | Clean: nothing at or above the `failOn` threshold |
|
|
57
|
+
| `1` | Findings at or above the threshold |
|
|
58
|
+
| `2` | Configuration or usage error |
|
|
59
|
+
| `3` | Degraded: a reviewer failed and a partial report was written. Outranks `1`. |
|
|
60
|
+
| `4` | The vendor-independence guard refused the panel; nothing was spawned |
|
|
61
|
+
| `130` | Interrupted (SIGINT/SIGTERM) |
|
|
371
62
|
|
|
372
63
|
## License
|
|
373
64
|
|
package/dist/bin.js
CHANGED
|
File without changes
|
package/dist/config.js
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAsB,MAAM,aAAa,CAAC;AAsClE,iGAAiG;AACjG,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,QAAQ,GAAG,CAAU,CAAC;IACtB,OAAO,CAAU;IAE1B,YAAY,OAAe,EAAE,OAAgB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAsB,CAAC,CAAC,CAAC,CAAC;AAEhE;;;6BAG6B;AAC7B,MAAM,CAAC,MAAM,eAAe,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC7E,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,MAAM;IAClB,mBAAmB,EAAE,KAAK;IAC1B,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/node-guard.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Exits the process with code 2 if the running Node version is older than the minimum
|
|
3
|
-
* supported version,
|
|
3
|
+
* supported version (compared component by component — major, then minor, then patch — not
|
|
4
|
+
* major-only), printing both the detected and minimum versions.
|
|
4
5
|
*
|
|
5
6
|
* @param version - The version string to check, defaulting to `process.version`. Exposed as a
|
|
6
7
|
* parameter purely as a test seam.
|
package/dist/node-guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-guard.d.ts","sourceRoot":"","sources":["../src/node-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node-guard.d.ts","sourceRoot":"","sources":["../src/node-guard.ts"],"names":[],"mappings":"AA0BA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAAwB,GAAG,IAAI,CAkBzE"}
|
package/dist/node-guard.js
CHANGED
|
@@ -1,20 +1,42 @@
|
|
|
1
1
|
// Zero imports beyond node:process, so this can run before any other import work at binary
|
|
2
2
|
// startup — a broken or ancient runtime must never fail inside a dependency instead of here.
|
|
3
3
|
import process from 'node:process';
|
|
4
|
-
const
|
|
4
|
+
const MINIMUM_VERSION = '22.19.0';
|
|
5
|
+
const MINIMUM_VERSION_PARTS = MINIMUM_VERSION.split('.').map((part) => Number.parseInt(part, 10));
|
|
6
|
+
/**
|
|
7
|
+
* Parses a dotted version string into its numeric [major, minor, patch] components, treating any
|
|
8
|
+
* missing or non-numeric component as 0. Returns `null` if the major component itself can't be
|
|
9
|
+
* parsed as a finite number, since that makes the whole version unusable for comparison.
|
|
10
|
+
*/
|
|
11
|
+
function parseVersionParts(version) {
|
|
12
|
+
const segments = version.split('.');
|
|
13
|
+
const major = Number.parseInt(segments[0] ?? '', 10);
|
|
14
|
+
if (!Number.isFinite(major)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const minor = Number.parseInt(segments[1] ?? '', 10);
|
|
18
|
+
const patch = Number.parseInt(segments[2] ?? '', 10);
|
|
19
|
+
return [major, Number.isFinite(minor) ? minor : 0, Number.isFinite(patch) ? patch : 0];
|
|
20
|
+
}
|
|
5
21
|
/**
|
|
6
22
|
* Exits the process with code 2 if the running Node version is older than the minimum
|
|
7
|
-
* supported version,
|
|
23
|
+
* supported version (compared component by component — major, then minor, then patch — not
|
|
24
|
+
* major-only), printing both the detected and minimum versions.
|
|
8
25
|
*
|
|
9
26
|
* @param version - The version string to check, defaulting to `process.version`. Exposed as a
|
|
10
27
|
* parameter purely as a test seam.
|
|
11
28
|
*/
|
|
12
29
|
export function assertNodeVersion(version = process.version) {
|
|
13
30
|
const detected = version.startsWith('v') ? version.slice(1) : version;
|
|
14
|
-
const
|
|
15
|
-
|
|
31
|
+
const parts = parseVersionParts(detected);
|
|
32
|
+
const isSupported = parts !== null &&
|
|
33
|
+
(parts[0] > MINIMUM_VERSION_PARTS[0] ||
|
|
34
|
+
(parts[0] === MINIMUM_VERSION_PARTS[0] &&
|
|
35
|
+
(parts[1] > MINIMUM_VERSION_PARTS[1] ||
|
|
36
|
+
(parts[1] === MINIMUM_VERSION_PARTS[1] && parts[2] >= MINIMUM_VERSION_PARTS[2]))));
|
|
37
|
+
if (!isSupported) {
|
|
16
38
|
process.stderr.write(`council-review: unsupported Node.js version "${detected}" detected; ` +
|
|
17
|
-
`Node.js >= ${
|
|
39
|
+
`Node.js >= ${MINIMUM_VERSION} is required.\n`);
|
|
18
40
|
process.exit(2);
|
|
19
41
|
}
|
|
20
42
|
}
|
package/dist/node-guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-guard.js","sourceRoot":"","sources":["../src/node-guard.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,6FAA6F;AAC7F,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,qBAAqB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"node-guard.js","sourceRoot":"","sources":["../src/node-guard.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,6FAA6F;AAC7F,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,qBAAqB,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAElG;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB,OAAO,CAAC,OAAO;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,WAAW,GACf,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;YAClC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBACpC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;oBAClC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gDAAgD,QAAQ,cAAc;YACpE,cAAc,eAAe,iBAAiB,CACjD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/picker.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { Separator } from '@inquirer/prompts';
|
|
1
2
|
import type { Reviewer } from './panel.js';
|
|
2
|
-
import type { Catalog } from './providers.js';
|
|
3
|
+
import type { Catalog, CatalogModel } from './providers.js';
|
|
3
4
|
export interface PickerIO {
|
|
4
5
|
input: NodeJS.ReadableStream;
|
|
5
6
|
output: NodeJS.WritableStream & Partial<Pick<NodeJS.WriteStream, 'columns' | 'rows' | 'isTTY'>>;
|
|
@@ -13,6 +14,49 @@ export declare class PickerNonInteractive extends Error {
|
|
|
13
14
|
readonly exitCode: 2;
|
|
14
15
|
constructor(message: string);
|
|
15
16
|
}
|
|
17
|
+
export interface ModelChoice {
|
|
18
|
+
value: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
short: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Larger square checkbox glyphs (`☐`/`☑`) replacing the default small circles (`○`/`◉`) for
|
|
25
|
+
* the picker's checkbox stages. The checked glyph keeps the default green via `node:util`'s
|
|
26
|
+
* `styleText` — which, like the default theme, emits plain text when output is piped and color
|
|
27
|
+
* only on a real terminal. Only `checked`/`unchecked` are overridden, so the cursor (`❯`) and
|
|
28
|
+
* everything else stay on the inquirer defaults.
|
|
29
|
+
*/
|
|
30
|
+
export declare const pickerCheckboxTheme: {
|
|
31
|
+
icon: {
|
|
32
|
+
checked: string;
|
|
33
|
+
unchecked: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export interface ModelGroup {
|
|
37
|
+
provider: string;
|
|
38
|
+
models: CatalogModel[];
|
|
39
|
+
}
|
|
40
|
+
/** Groups models by provider in first-appearance (catalog) order. */
|
|
41
|
+
export declare function groupModelsByProvider(models: readonly CatalogModel[]): ModelGroup[];
|
|
42
|
+
/**
|
|
43
|
+
* The model-stage prompt message doubles as the provider group header: inquirer renders the
|
|
44
|
+
* message above the paginated list and never scrolls it, so the header stays pinned at the top
|
|
45
|
+
* — visually distinct (prompt-message styling) and distanced (a blank spacer row follows it)
|
|
46
|
+
* — no matter how far the rows scroll underneath.
|
|
47
|
+
*/
|
|
48
|
+
export declare function modelGroupMessage(provider: string, modelCount: number): string;
|
|
49
|
+
/**
|
|
50
|
+
* Builds one provider group's checkbox rows: one padded, single-line row per model, each
|
|
51
|
+
* preceded by a blank `Separator` spacer (including the first, which distances the rows from
|
|
52
|
+
* the header message). Padding lines up the identity and vendor columns so the rows stop
|
|
53
|
+
* blurring into a wall of text. `short` stays the bare `provider/id` so the submitted answer
|
|
54
|
+
* line reads cleanly. Widths are measured within the group since each group is its own prompt.
|
|
55
|
+
*
|
|
56
|
+
* Blank separators are skipped by checkbox navigation (up/down/space/number keys all ignore
|
|
57
|
+
* them), so they are pure vertical air with no effect on selection.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildModelRows(models: readonly CatalogModel[]): Array<ModelChoice | Separator>;
|
|
16
60
|
/**
|
|
17
61
|
* Runs the three-stage picker: providers, then models scoped to those providers, then a
|
|
18
62
|
* thinking level per selected reasoning model (non-reasoning selections are shown as "no
|
package/dist/picker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AAGhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAgB,MAAM,gBAAgB,CAAC;AAG1E,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAChG,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,QAAQ,EAAG,CAAC,CAAU;gBAEnB,OAAO,SAAsD;CAK1E;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,QAAQ,EAAG,CAAC,CAAU;gBAEnB,OAAO,EAAE,MAAM;CAK5B;AAoED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;;;CAK/B,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,EAAE,CAcnF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,CA2B9F;AA8CD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,QAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAiHjG"}
|