@fullstackhouse/cerber 0.18.0 → 0.18.2
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
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# cerber 🐕
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@fullstackhouse/cerber)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
3
6
|
**AI code-review cockpit.** Claude reviews your pull requests into local artifacts —
|
|
4
7
|
a summary, a chaptered walkthrough of the changes, draft inline comments, and a
|
|
5
8
|
verdict with a confidence score. You go through it in a local web cockpit.
|
|
@@ -10,6 +13,11 @@ reviewing is 100% local and read-only.
|
|
|
10
13
|
|
|
11
14
|
Named after Cerberus, the gatekeeper: cerber guards what gets merged.
|
|
12
15
|
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
*Every screenshot in this README is cerber reviewing cerber's own pull
|
|
19
|
+
requests.*
|
|
20
|
+
|
|
13
21
|
## Quick start
|
|
14
22
|
|
|
15
23
|
Requires Node 20+, an authenticated [`gh`](https://cli.github.com/) and a
|
|
@@ -36,19 +44,24 @@ Sending stays a human click. Tame it with `--no-auto-review` (list awaiting
|
|
|
36
44
|
PRs, review on click) or `--no-poll` (no GitHub polling at all) — or flip the
|
|
37
45
|
same two switches in the cockpit's Settings, which persist in
|
|
38
46
|
`~/.cerber/config.json` and apply on the next poll. The queue only lists what
|
|
39
|
-
still wants you: anything you have settled
|
|
40
|
-
|
|
41
|
-
merged and closed PRs —
|
|
42
|
-
|
|
47
|
+
still wants you: anything you have settled moves to the filed tabs right of
|
|
48
|
+
the thin rule in the filter row — reviews you sent, ones you marked reviewed
|
|
49
|
+
or skipped, merged and closed PRs — each tab appearing only while it holds
|
|
50
|
+
something. PRs in archived repos are never picked up at all, since the repo
|
|
51
|
+
is read-only and a review could never be sent.
|
|
52
|
+
|
|
53
|
+
### Settled means you settled it
|
|
43
54
|
|
|
44
55
|
Settling a review is your decision, not GitHub's: skip a PR, or mark one
|
|
45
56
|
reviewed without sending, and GitHub still holds its review request open,
|
|
46
57
|
because nothing cerber does here reaches it. Those rows stay marked where they
|
|
47
|
-
sit, counted on the
|
|
58
|
+
sit, counted on the tab they went into, and named in place of the empty
|
|
48
59
|
inbox — cerber never tells you nothing awaits you while its own poll says
|
|
49
60
|
otherwise. It is a report, not a nag: what you decided here stands, and the
|
|
50
61
|
mark clears itself the moment GitHub hears from you.
|
|
51
62
|
|
|
63
|
+
### Whose move is it
|
|
64
|
+
|
|
52
65
|
An open request doesn't mean the ball is yours, though. You may have argued the
|
|
53
66
|
whole thing out in the PR conversation and never pressed GitHub's review
|
|
54
67
|
button, which leaves the request open with nothing blocked on you. So cerber
|
|
@@ -59,6 +72,8 @@ every PR back on you. If the conversation can't be read it says `unanswered on
|
|
|
59
72
|
GitHub` and claims nothing further — guessing "you never replied" at someone
|
|
60
73
|
who did is the one mistake worth designing against.
|
|
61
74
|
|
|
75
|
+
### It taps you on the shoulder
|
|
76
|
+
|
|
62
77
|
The cockpit is a background tab most of the day, so it tells you when the queue
|
|
63
78
|
grows: a desktop notification naming the PR that arrived — click it to open the
|
|
64
79
|
review — folded into one popup when several land at once. It stays quiet while
|
|
@@ -86,8 +101,15 @@ Each review is a plain JSON artifact in `~/.cerber/reviews/` (override with
|
|
|
86
101
|
- **Run metadata** — model, whether it read the source or only the diff, and
|
|
87
102
|
the token spend as an API-rate equivalent
|
|
88
103
|
|
|
104
|
+

|
|
105
|
+
|
|
89
106
|
The cockpit (`cerber serve`) renders the queue and the per-PR walkthrough with
|
|
90
|
-
diffs.
|
|
107
|
+
diffs. Draft comments sit inline in the diff, anchored to the line they're
|
|
108
|
+
about, each waiting for you to keep, rewrite, or drop it:
|
|
109
|
+
|
|
110
|
+

|
|
111
|
+
|
|
112
|
+
Artifacts are plain JSON you can `cat`, edit, or pipe into anything.
|
|
91
113
|
|
|
92
114
|
The queue is meant to be walked, not clicked through: `j`/`k` move the cursor
|
|
93
115
|
and the strip under the table explains whatever it lands on — the verdict's own
|
|
@@ -249,6 +271,14 @@ The reviewer revises the draft as it answers: there is no accept step, because
|
|
|
249
271
|
you already asked for the change. What it changed shows up in the transcript
|
|
250
272
|
(*"✎ rewrote the summary"*, *"✎ dropped the comment on line 250"*).
|
|
251
273
|
|
|
274
|
+

|
|
275
|
+
|
|
276
|
+
That conversation is real: pushed back on a nit, the reviewer re-checked the
|
|
277
|
+
code, corrected the push-back's own claim about the rename's size — and still
|
|
278
|
+
dropped the comment, because a nit hanging off a PR with two real findings
|
|
279
|
+
just dilutes them. The rail counts *2 keeping · 1 dropped*, and nothing about
|
|
280
|
+
the exchange went anywhere near GitHub.
|
|
281
|
+
|
|
252
282
|
- **It is the same reviewer.** A turn resumes the Claude session the review ran
|
|
253
283
|
in, so it still holds everything it read. Asking "did you actually check
|
|
254
284
|
that?" gets an answer from the run that did or didn't — not from a fresh
|
|
@@ -283,24 +313,13 @@ the summary, comments and verdict alone, and is still one deliberate click. A
|
|
|
283
313
|
review that has already been sent can't be argued with: that artifact is the
|
|
284
314
|
record of what GitHub has.
|
|
285
315
|
|
|
286
|
-
## Status
|
|
287
|
-
|
|
288
|
-
Early, but
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
only GitHub write in the codebase) + `cerber export` to markdown
|
|
294
|
-
3. ✅ `--awaiting-me` discovery, parallel runs (`--parallel`, default 3),
|
|
295
|
-
freshness skip (same head SHA → no re-run; `--force` overrides), queue stats
|
|
296
|
-
4. ✅ Inbox mode (now the default): `cerber serve` polls for PRs awaiting your
|
|
297
|
-
review and reviews them automatically; token auth for non-localhost binds
|
|
298
|
-
5. ✅ Confidence calibration (`cerber stats`), shadow-mode auto-send (default
|
|
299
|
-
in daemon: logs what would be sent), opt-in `--auto-send` (approve-only,
|
|
300
|
-
`--auto-send-threshold`, default 90%)
|
|
301
|
-
6. ✅ Reviews keep up with the PR: opening one re-anchors its comments onto new
|
|
302
|
-
commits, flags the ones whose code is gone, and offers a re-review that
|
|
303
|
-
keeps everything you wrote
|
|
316
|
+
## Status
|
|
317
|
+
|
|
318
|
+
Early, but whole: everything described above has shipped — reviewing,
|
|
319
|
+
editing and the gated Send, inbox discovery with parallel runs, confidence
|
|
320
|
+
calibration (`cerber stats`), shadow-mode and opt-in auto-send, re-anchoring
|
|
321
|
+
onto new commits, source-backed and trusted runs, and the reviewer chat.
|
|
322
|
+
`cerber export` writes a review out as markdown if you want it elsewhere.
|
|
304
323
|
|
|
305
324
|
## Running on a VPS
|
|
306
325
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fullstackhouse/cerber",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.2",
|
|
4
4
|
"description": "AI code-review cockpit: Claude reviews your PRs into local artifacts; nothing reaches GitHub until you say so.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Full Stack House (https://fullstack.house)",
|