PR Babysitter
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
Iteratively improves a PR until all review bots (Greptile, Devin, and others) are satisfied with zero unresolved comments, then fixes any CI failures.
$ npx skills add ankitvgupta/exo --skill reviewloop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ankitvgupta/exo reviewloop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/reviewloop .claude/skills/reviewloop && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .claude/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ankitvgupta/exo --skill reviewloop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ankitvgupta/exo reviewloop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/reviewloop .agents/skills/reviewloop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .agents/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ankitvgupta/exo --skill reviewloop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ankitvgupta/exo reviewloop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/reviewloop .cursor/skills/reviewloop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .cursor/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ankitvgupta/exo.git --path .claude/skills/reviewloop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ankitvgupta/exo --skill reviewloop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ankitvgupta/exo reviewloop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/reviewloop .gemini/skills/reviewloop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .gemini/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ankitvgupta/exo reviewloopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ankitvgupta/exo --skill reviewloop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/reviewloop .github/skills/reviewloop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .github/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ankitvgupta/exo --skill reviewloop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ankitvgupta/exo reviewloop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ankitvgupta/exo.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/reviewloop .opencode/skills/reviewloop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "reviewloop" agent skill from https://github.com/ankitvgupta/exo/tree/main/.claude/skills/reviewloop into .opencode/skills/reviewloop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reviewloop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
reviewloopIteratively improves a PR until all review bots (Greptile, Devin, and others) are satisfied with zero unresolved comments, then fixes any CI failures.
Reviewloop is an agent skill from ankitvgupta/exo. Iteratively improves a PR until all review bots (Greptile, Devin, and others) are satisfied with zero unresolved comments, then fixes any CI failures. Triggers reviews, fixes all actionable comments, pushes, re-triggers, and repeats. Use when the user wants to fully optimize a PR against all automated code review feedback.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/graphql-queries.md`). Compatibility notes: Requires git, gh (GitHub CLI) authenticated, and at least one review bot installed on the repo.
It sits in Development, covering Failing and flaky tests. The repository describes itself as: Claude Code for your Inbox. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 04da760. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
Bash(gh:*)Bash(git:*)Bash(sleep:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires git, gh (GitHub CLI) authenticated, and at least one review bot installed on the repo.
From compatibility in the SKILL.md frontmatter.
Reviewloop loads about 2.3k tokens when it runs, and up to ~2.6k if it reads all its reference files. Until then it costs about 84 tokens; SKILL.md has 907 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ankitvgupta/exo at commit 04da760, republished under its MIT licence (© ankitvgupta). 907 words, ~2,295 tokens.
.claude/skills/reviewloop/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Iteratively fix a PR until all review bots give clean feedback and CI passes.
CI strategy: On the first iteration, wait for both CI and review bots together, fixing any CI issues alongside bot feedback. On subsequent iterations, only wait for review bots (skipping CI) to keep the loop fast. After all review bots are satisfied, do one final CI check.
Detect and handle reviews from any of these (and any others that appear):
| Bot login pattern | Name | Notes |
|---|---|---|
greptile-apps[bot], greptile-apps-staging[bot] | Greptile | |
devin-ai-integration[bot], devin-ai[bot] | Devin | |
coderabbitai[bot] | CodeRabbit | |
sourcery-ai[bot] | Sourcery | |
ellipsis-dev[bot] | Ellipsis | |
github-actions[bot] | Excluded | Powers too many non-review workflows (labeling, stale issues, deployments) — creates false positives |
Any other login ending in [bot] with diff-attached review comments | Other bots |
The loop should handle all bots it discovers, not just the ones listed above. A [bot] author counts as a review bot only if it has left diff-attached inline comments (comments with a path and line). General PR-level comments without a diff position are not treated as review feedback.
gh pr view --json number,headRefName -q '{number: .number, branch: .headRefName}'Switch to the PR branch if not already on it.
Fetch all reviews and review comments to identify which bots are active on this PR:
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/reviews
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/commentsBuild a set of active bot logins (any author whose login ends in [bot]). These are the bots whose feedback we need to satisfy.
Repeat the following cycle. Max 5 iterations to avoid runaway loops.
Push the latest changes (if any):
git pushFirst iteration only: Wait for both review bots AND CI checks to complete — poll them concurrently. Poll CI every 30 seconds for up to 15 minutes:
gh pr checks <PR_NUMBER>If CI failures are found on this first iteration, fix them alongside the review bot feedback in step D (treat them like any other actionable issue). This avoids a separate CI fix cycle later for issues caught early.
Subsequent iterations: Only wait for review bot responses — do NOT wait for CI checks. This keeps the loop fast since CI runs are slow relative to review bots.
For review bot polling (all iterations): use exponential backoff — check at 15s, 30s, 60s, 90s, then 120s. On each poll, count the total bot reviews on the PR — if the count increased since the push, bots have responded and you can proceed to step B. If no new reviews appear after 120s, proceed anyway (some bots may not re-review small changes).
Get all reviews:
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/reviews --paginateFor each active bot, find its most recent review. Parse for:
3/5 or 5/5) in the review body, plus inline commentsAPPROVED, CHANGES_REQUESTED, COMMENTED), plus inline commentsFetch all unresolved inline comments:
gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/comments --paginateFilter to comments from bot authors that are on the latest commit or still unresolved.
Also fetch unresolved review threads via GraphQL (see GraphQL reference):
Loop with cursor-based pagination to fetch all review threads:
# First page (no cursor)
gh api graphql -f query='
{
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 100) {
pageInfo { hasNextPage endCursor }
nodes {
id
isResolved
comments(first: 5) {
nodes { body path line author { login } createdAt }
}
}
}
}
}
}'
# If pageInfo.hasNextPage is true, fetch next page:
gh api graphql -f query='
query($cursor: String!) {
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 100, after: $cursor) {
pageInfo { hasNextPage endCursor }
nodes {
id
isResolved
comments(first: 5) {
nodes { body path line author { login } createdAt }
}
}
}
}
}
}' -F cursor="<endCursor from previous page>"Continue until hasNextPage is false. Collect all nodes across pages before processing.
Stop the review bot loop if all of these are true:
Do not use GitHub review state (APPROVED, CHANGES_REQUESTED, COMMENTED) as a satisfaction signal for any bot. Bots like Devin use COMMENTED even when leaving substantive feedback, and CHANGES_REQUESTED may persist after all inline comments are resolved. The only reliable signal is: zero unresolved inline comments from that bot.
Also stop if max iterations reached (report current state).
For each unresolved bot comment (process by bot, prioritizing bots with the most comments first):
When multiple bots flag the same file/region, address all comments together to avoid redundant changes.
Fetch unresolved review threads and resolve all that have been addressed (see GraphQL reference):
gh api graphql -f query='
mutation {
t1: resolveReviewThread(input: {threadId: "ID1"}) { thread { isResolved } }
t2: resolveReviewThread(input: {threadId: "ID2"}) { thread { isResolved } }
}'git add -A
git commit -m "address review bot feedback (reviewloop iteration N)"
git pushThen go back to step A.
After review bots are satisfied (or max iterations reached), do a final CI check. Since CI was only waited on during the first iteration, subsequent review-only iterations may have introduced new CI failures.
Wait for CI checks to complete:
gh pr checks <PR_NUMBER>Poll every 30 seconds for up to 15 minutes until all CI checks have finished.
If CI is passing, proceed to step 5.
If there are CI failures:
gh run view <RUN_ID> --log-failedgit add -A
git commit -m "fix CI failures (reviewloop)"
git pushMax 3 top-level CI-fix cycles to avoid infinite loops. If CI is still failing after 3 cycles, stop and report.
After exiting all loops, summarize:
| Field | Value |
|---|---|
| Review iterations | N |
| CI fix attempts | N |
| Bots satisfied | list of bot names |
| Bots with remaining issues | list (if any) |
| CI status | passing / failing |
| Total comments resolved | N |
| Remaining comments | N (if any) |
Reviewloop complete.
Review iterations: 2
CI fix attempts: 1
Bots satisfied: Greptile (5/5), Devin (0 unresolved)
CI status: passing
Resolved: 12 comments
Remaining: 0If not fully resolved:
Reviewloop stopped after 5 review iterations + 3 CI attempts.
Bots satisfied: Greptile (5/5)
Bots unsatisfied: Devin (2 unresolved comments)
CI status: failing (lint)
Resolved: 10 comments
Remaining: 2
Remaining issues:
- [Devin] src/auth.ts:45 — "Consider rate limiting this endpoint"
- [Devin] src/db.ts:112 — "Missing index on user_id column"
- [CI] lint: unused import in src/utils.ts:3© ankitvgupta, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .claude/skills/reviewloop of ankitvgupta/exo.
Open the folder on GitHubat commit 04da760
Reviewloop next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Reviewloop this skillankitvgupta/exo | 496 | — | ~2.3k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Iterate PRmeshery/meshery-operator | 151 | 7 repos | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| React Router Bug Fix Workflowremix-run/react-router | 57k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Bug InvestigatorMageByte-Zero/spec-superflow | 839 | 1 repos | ~1.6k | Automated safety check: Pass | MIT | |
| PlotJuggler Ship CheckPlotJuggler/PlotJuggler | 6.2k | — | ~1.3k | Automated safety check: Pass | MPL-2.0 |
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
meshery/meshery-operator
Iterate on a PR until CI passes. An agent skill from meshery/meshery-operator.
remix-run/react-router
Fixes a React Router bug reported in a GitHub issue end to end: fetching the issue, validating the reproduction, writing a failing test and implementing the fix on a new branch.
MageByte-Zero/spec-superflow
A skill your agent uses when encountering any bug, test failure, or unexpected behavior during spec-superflow execution, before proposing fixes.
PlotJuggler/PlotJuggler
Runs a gated finish-line checklist before committing a PlotJuggler PJ4 change: build proof, red-test triage, hooks, docs freshness and a diff self-review.
wysaid/android-gpuimage-plus
Address review comments and CI failures for the current branch's PR
ankitvgupta/exo
Clear extension caches, analysis data, and drafts from the database.
ankitvgupta/exo
Test the Electron app interactively using Chrome DevTools Protocol.
ankitvgupta/exo
Capture screenshots of the Exo Electron app workflows using Playwright in demo mode.
ankitvgupta/exo
Pre-commit code review for production-critical issues. An agent skill from ankitvgupta/exo.
ankitvgupta/exo
Run GitHub Actions CI workflows locally using nektos/act in Docker.
Categories
Iteratively improves a PR until all review bots (Greptile, Devin, and others) are satisfied with zero unresolved comments, then fixes any CI failures. Reviewloop is an agent skill from ankitvgupta/exo. Iteratively improves a PR until all review bots (Greptile, Devin, and others) are satisfied with zero unresolved comments, then fixes any CI failures.
Reviewloop fits situations like: fixes all actionable comments; the user wants to fully optimize a PR against all automated code review feedback.
Run `npx skills add ankitvgupta/exo --skill reviewloop -a claude-code`. Or copy the skill folder (.claude/skills/reviewloop in ankitvgupta/exo) into .claude/skills/reviewloop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ankitvgupta/exo --skill reviewloop -a codex`. Or copy the skill folder (.claude/skills/reviewloop in ankitvgupta/exo) into .agents/skills/reviewloop in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ankitvgupta/exo --skill reviewloop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/reviewloop, .gemini/skills/reviewloop, .github/skills/reviewloop and .opencode/skills/reviewloop in your project.
Going by SKILL.md and its folder, Reviewloop needs the command-line tools its instructions call (gh and git). Its frontmatter pre-approves these tools: Bash(gh:*), Bash(git:*), Bash(sleep:*). Compatibility (from SKILL.md): Requires git, gh (GitHub CLI) authenticated, and at least one review bot installed on the repo..
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Reviewloop is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 333 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Reviewloop: PR Babysitter (openinterpreter/openinterpreter, 69k stars), Iterate PR (meshery/meshery-operator, 151 stars), React Router Bug Fix Workflow (remix-run/react-router, 57k stars) and Bug Investigator (MageByte-Zero/spec-superflow, 839 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ankitvgupta (a GitHub user) maintains it in ankitvgupta/exo, which has 496 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on September 5, 2026.
Source: ankitvgupta/exo on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.