by amElnagdy
Two-model debate review of PRs and MRs, plus a babysitter that works the review rounds. Skills for any coding agent.
# Add to your Claude Code skills
git clone https://github.com/amElnagdy/review-skillsGuides for using ai agents skills like review-skills.
review-skills is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by amElnagdy. Two-model debate review of PRs and MRs, plus a babysitter that works the review rounds. Skills for any coding agent. It has 52 GitHub stars.
review-skills's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/amElnagdy/review-skills" and add it to your Claude Code skills directory (see the Installation section above).
review-skills is primarily written in JavaScript. It is open-source under amElnagdy on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh review-skills against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Two models argue over a pull request before anything is posted. You keep the merge.
debate-review has a main reviewer read the PR, a second reviewer try to knock its findings down,
and the main reviewer make the final call. One review with inline comments lands on the PR, posted
from your own gh, glab, or az account. babysit-pr then works the rounds: verifies each finding, fixes
the blockers, replies in-thread, resolves, and re-triggers the next review. Both skills run through
whatever coding agent you already drive (Claude Code, Codex, Cursor, OpenCode, Grok, and others) and
the model subscriptions you already pay for.
npx skills add amElnagdy/review-skills
Then ask your agent:
Use $debate-review on https://github.com/owner/repo/pull/123
Use $debate-review --local on this repo before I open a PR.
Use $babysit-pr on PR 123 until it is ready to merge.
flowchart LR
P["PR or MR"] --> M["Main reviewer<br/>lane review-main"]
M -->|"findings"| D["Debate reviewer<br/>lane review-debate"]
D -->|"confirm / refute / downgrade / add"| F["Main reviewer<br/>final call"]
F --> R["One review<br/>inline P0 / P1 / P2"]
R --> B["$babysit-pr<br/>verify, fix, reply, resolve"]
B -->|"push, re-run"| M
| Skill | Job | Never does |
|---|---|---|
debate-review |
Reviews a GitHub PR, GitLab MR or Azure DevOps PR with two models in sequence and posts non-approval inline comments plus a summary. Findings that survive the debate are posted as agreed; findings the second model refuted but the main reviewer kept are posted as contested, with both sides' reasoning. | Edit code, approve, request changes, post twice for the same head sha. |
babysit-pr |
Harvests every reviewer thread on the PR (debate-review, Codex, Greptile, any bot), checks each finding against the code, fixes what is real, replies in-thread with evidence and attribution, resolves, and re-runs the review for the next round. Reports when the PR meets the merge gate. | Merge, resolve a thread it did not answer, reply as anyone other than "model on behalf of user". |
Node 18 or newer.
Git 2.31 or newer for Azure DevOps (--config-env keeps the access token out of command arguments).
gh (GitHub), glab (GitLab, including self-hosted) or az (Azure DevOps) logged in to an account
that can comment on the PR. Reviews and replies post as that account. Azure DevOps needs no az
extension: the script uses az rest against the REST API.
delegate-skills, which dispatches the reviewer
models through the *-delegate relays, read-only.
Two delegate lanes named review-main and review-debate. Create them once with $delegate-setup:
Use $delegate-setup to add two lanes: review-main on claude at high effort and review-debate on codex at high effort.
Pick two different implementers. The debate is only worth something when the second model does not
share the first one's blind spots. Keep these lanes for the reviewer; if you already use a debate
lane for plan debates, leave it alone. Only implementers whose relay supports --read-only are
accepted, so the reviewers cannot touch your tree.
Each finding is one inline comment, anchored to the lines it is about, rendered as a forge alert so the colour reads before the words:
| Level | Meaning | Rendered as |
|---|---|---|
| P0 | blocking, security | [!CAUTION] |
| P1 | blocking, anything else | [!WARNING] |
| P2 | non-blocking | [!NOTE] |
The review body carries a level count table, who reviewed, and a short summary. Each comment and the
body start with an HTML marker (<!-- debate-review ... -->) that babysit-pr uses to recognise the
threads, since they are posted from your account rather than a bot's. One review per head sha: a
re-run on the same push exits with code 3 instead of posting again. Templates and the marker format
are in comment-format.md; the JSON contract
between the three passes is in schema.md.
The reviewers are prompted for precision, not volume: blocking bugs with a concrete trigger and wrong result, spec and standards violations quoted against the rule, and little else. The second reviewer can only refute a finding when it can point at the code that makes it impossible. Findings below the confidence floor are dropped before anything is posted.
| GitHub | GitLab | Azure DevOps | |
|---|---|---|---|
| Review posting | gh api, PR review with inline comments |
glab api, MR discussions with diff positions |
az rest, one comment thread per finding plus a closed summary thread |
| Target URL | /pull/<n> |
/-/merge_requests/<n> |
/_git/<repo>/pullrequest/<n>, on dev.azure.com or *.visualstudio.com |
Spec source (#123) |
issue | issue | work item |
| Alert colours | yes | 17.10+ | no, alerts fall back to plain quotes |
| Thread harvest (babysit-pr) | GraphQL review threads + REST reviews | discussions + notes | not implemented yet |
| Reply and resolve (babysit-pr) | verified live | implemented, not yet verified on a live instance | not implemented yet |
| Bot author detection | reliable (Bot type) |
only when the instance exposes author.bot; debate-review threads are found by marker either way |
n/a |
Azure DevOps has no single review object, so one debate-review is N inline threads plus one closed summary
thread carrying the marker. --force and the "already reviewed" check read the same marker back off
the PR's threads, so a re-run on an unchanged head still exits 3.
--local reviews the files on disk (committed, uncommitted, and untracked, honoring .gitignore)
against a base branch. It never calls a forge CLI. --dry-run still needs a live PR; it only
skips the post. The two flags do not combine. Local snapshots reject non-UTF-8 Git paths instead of
silently changing their bytes.
| Invocation | Source | Forge | Post |
|---|---|---|---|
--local |
Working tree snapshot | No | No |
<pr> --dry-run |
Live PR | Yes | No |
<pr> |
Live PR | Yes | Yes |
Your agent normally runs these for you. They are here for testing, CI, or when there is no agent in
the loop. <skill-dir> is the directory containing the skill's SKILL.md.
node "<skill-dir>/scripts/review-pr.mjs" --local # working tree; print, no forge
node "<skill-dir>/scripts/review-pr.mjs" <pr-url | number> --dry-run # print, do not post
node "<skill-dir>/scripts/review-pr.mjs" <pr-url | number> # post
"<babysit-skill-dir>/scripts/threads.sh" <number> # harvest one round as JSON
review-pr.mjs --help lists the flags: --local to review the working tree with no forge, --main /
--debate to override the lanes for one run, --contested post|drop, --min-confidence, --timeout
(default 30 minutes per reviewer), --force to post again on the same head, --keep to leave the
temporary worktree or snapshot clone. Every run leaves its briefs, raw model output, and the three JSON
documents under ~/.cache/debate-review/<owner>__<repo>/<N>/<head>/ so a surprising review can be
traced back to the pass that produced it.
review-pr.mjs
reads your lanes and calls the matching relay; this repo has no model code of its own.babysit-pr runs the matching guard on a fix before pushing it, when one is
installed.node --test test/*.test.mjs
The babysit tests run threads.sh end to end against fake gh and glab binaries in
test/fixtures/babysit/. The debate-review tests drive the Azure forge functions against a fake
az in test/fixtures/azure/. Both suites run without network.