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.
Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready.
$ npx skills add OpenHands/extensions --skill iterate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenHands/extensions iterate --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/OpenHands/extensions.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/iterate .claude/skills/iterate && 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 "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .claude/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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/OpenHands/extensions/tree/main/skills/iterateType 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 OpenHands/extensions --skill iterate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenHands/extensions iterate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/iterate .agents/skills/iterate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .agents/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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 OpenHands/extensions --skill iterate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenHands/extensions iterate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/iterate .cursor/skills/iterate && 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 "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .cursor/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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/OpenHands/extensions.git --path skills/iterate--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 OpenHands/extensions --skill iterate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenHands/extensions iterate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/iterate .gemini/skills/iterate && 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 "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .gemini/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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 OpenHands/extensions iterateInstalls 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 OpenHands/extensions --skill iterate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/iterate .github/skills/iterate && 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 "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .github/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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 OpenHands/extensions --skill iterate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install OpenHands/extensions iterate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/OpenHands/extensions.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/iterate .opencode/skills/iterate && 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 "iterate" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/iterate into .opencode/skills/iterate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "iterate", 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.
iterateIterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready.
Iterate is an agent skill from OpenHands/extensions. Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready. Poll verification layers with gh CLI, diagnose and fix CI failures, address review feedback, retry flaky checks, push fixes, and repeat. The agent is the orchestration loop.
Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including reference files (for example `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json` and `.plugin/plugin.json`).
It sits in Development, covering Failing and flaky tests and Pull requests. It works with GitHub. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d008b81. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
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.
Iterate loads about 3.8k tokens when it runs, and up to ~5.5k if it reads all its reference files. Until then it costs about 71 tokens; SKILL.md has 1,759 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 OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 1,759 words, ~3,763 tokens.
.claude/skills/iterate/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.Iterate on a pull request until it passes all verification layers. You push, poll, fix, and push again — the loop only ends when the PR is green or a blocker requires human help.
No scripts — you are the orchestration loop. Uses only standard gh CLI
commands that work on any GitHub repo.
Requires: gh CLI authenticated with repo access, a PR branch.
Windows PowerShell equivalents for Bash-only assignment, redirection, and quoting patterns in this skill are in references/windows.md.
Not every repo has all three verification layers. Before entering the loop, check which ones exist. Only poll layers that are actually set up.
gh workflow list --json name --jq '.[].name'gh pr checks returns results, CI is present..github/workflows/pr-review*.yml in the repo. If it's not there, the repo doesn't have automated PR review. Skip step 3 entirely.A repo might have only CI. Or CI + review. Or all three. Your "all passed" condition is: every present layer is green. Don't block waiting for layers that don't exist.
.pr/ artifacts affected (see below),
commit, push, re-request review from bots, go to 2.IMPORTANT: pushing a fix is NOT the end. After every fix+push you MUST re-request review from the review bot (if present) and go back to step 2. The loop only ends when the verifiers pass on your latest SHA. Addressing feedback and pushing a commit is just one iteration — the bot needs to review the new code too.
Do not stop to ask the user whether to continue polling; continue autonomously until a strict stop condition is met or the user interrupts.
Create the PR as a draft. This prevents repo automations (merge workflows, artifact cleanup, auto-merge) from triggering while you're still iterating. You mark it ready only after all verification layers pass.
git push origin HEAD
gh pr create --fill --draft 2>/dev/null || true
gh pr view --json number,url,headRefOid,isDraft --jq '"\(.number) \(.url) \(.headRefOid) draft=\(.isDraft)"'If the PR already exists and is not a draft, convert it:
gh pr ready --undogh pr checks --json name,state,bucket --jq '
{ passed: [.[] | select(.bucket=="pass")] | length,
failed: [.[] | select(.bucket=="fail")] | length,
pending: [.[] | select(.bucket=="pending")] | length }'To inspect a failure:
SHA=$(gh pr view --json headRefOid --jq .headRefOid)
gh run list --commit "$SHA" --status failure --json databaseId,name,conclusion \
--jq '.[] | "\(.databaseId)\t\(.name)\t\(.conclusion)"'
gh run view <run-id> --log-failedSkip this step if the repo has no review bot.
gh pr view --json reviews --jq '
[.reviews[] | select(
.authorAssociation == "OWNER" or
.authorAssociation == "MEMBER" or
.authorAssociation == "COLLABORATOR" or
(.author.login | test("openhands|all-hands-bot"; "i"))
)] | last | { state: .state, reviewer: .author.login, body: .body[0:300] }'APPROVED → review passed.CHANGES_REQUESTED → read the body and inline comments, fix code.COMMENTED → may have actionable suggestions; read and decide.Inline review comments (when changes requested):
gh api "repos/{owner}/{repo}/pulls/{number}/comments" \
--jq '.[] | select(.user.login | test("openhands|all-hands-bot"; "i"))
| { path: .path, line: .line, body: .body[0:200] }'On a fresh iteration, existing pending review feedback should be checked immediately — not only comments that arrive after monitoring starts. Already-open review comments must not be missed.
Skip this step if the repo has no QA bot.
QA reports are PR issue comments with a status line like Status: PASS.
gh api "repos/{owner}/{repo}/issues/{number}/comments" --paginate \
--jq '[.[] | select(
(.user.login | test("openhands|all-hands-bot"; "i")) and
(.body | test("Status:\\s*(PASS|FAIL|PARTIAL)"; "i"))
)] | last | { author: .user.login, body: .body[0:500], url: .html_url }'PASS → QA passed.FAIL → read details, fix code.PARTIAL → some passed, some failed; read details.For each present layer, check its status. If a layer is not present in the repo, treat it as passing.
Priority rule: when both review feedback and flaky CI failures are present, prioritize review feedback first. A new commit will retrigger CI, so avoid rerunning flaky checks on the old SHA when you're about to push a review fix.
After fixing, commit, push, AND re-request review:
git add -A
git commit -m "fix: address <CI failure | review feedback | QA failure>"
git push origin HEAD
# Re-request review from the bot so it reviews the new SHA:
gh pr comment --body "Addressed feedback in $(git rev-parse --short HEAD). Ready for another look."
gh api -X POST "repos/{owner}/{repo}/pulls/{number}/requested_reviewers" \
-f 'reviewers[]=all-hands-bot'Then go back to step 2. You are not done until the bot reviews the new SHA and all present layers pass.
Use gh commands to inspect failed runs before deciding to rerun:
gh run view <run-id> --json jobs,name,workflowName,conclusion,status,url,headSha
gh run view <run-id> --log-failedBranch-related (fix the code):
Flaky / unrelated (rerun the jobs):
If classification is ambiguous, perform one manual diagnosis attempt (inspect logs) before choosing rerun.
Rerun: gh run rerun <run-id> --failed
Retry budget: at most 3 reruns per SHA. After that, treat as real.
Read references/heuristics.md for a concise decision tree.
The review polling in Step 3 surfaces feedback from trusted sources: human reviewers (OWNER/MEMBER/COLLABORATOR) and approved review bots (openhands, all-hands-bot, etc.). Ignore unrelated bot noise.
Review items come from:
When a comment is actionable and correct:
chore: address PR review feedback (#<n>).When a comment is non-actionable, already addressed, or you disagree: reply briefly explaining why, then resolve the thread. Do not leave threads dangling without a response.
If a review thread is already resolved in GitHub, ignore it unless new unresolved follow-up appears.
Every inline review comment creates a thread. After addressing a comment (or deciding it's non-actionable), you must:
Reply to the thread so the reviewer can see how you addressed it:
gh api "repos/{owner}/{repo}/pulls/{number}/comments" \
-F "body=Fixed — <describe what you changed>" \
-F "in_reply_to=<comment_database_id>"Use -F (not -f) for in_reply_to so it is sent as a number.
Resolve the thread via GraphQL:
gh api graphql \
-f query='mutation($id: ID!) {
resolveReviewThread(input: { threadId: $id }) {
thread { isResolved }
}
}' \
-f id="<thread_node_id>"To discover unresolved threads and their IDs:
gh api graphql -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(last: 100) {
nodes {
id
isResolved
path
line
comments(first: 1) {
nodes { databaseId author { login } body }
}
}
}
}
}
}' -f owner="{owner}" -f repo="{repo}" -F pr="{number}" \
--jq '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved == false)'Rules:
If the PR is green but blocked on review approval and you've addressed all feedback, you can request another look — but only when the user explicitly asks, or after confirming with them (avoid spamming humans):
Leave a brief PR comment summarizing what changed:
gh pr comment <pr> --body "Addressed the requested changes in <sha>. Could you take another look?"Do NOT tag humans.
Re-request reviewers via the GitHub API:
gh api -X POST repos/{owner}/{repo}/pulls/{number}/requested_reviewers \
-f reviewers[]=<reviewer>Prefer requesting review only once per new head SHA. If the API returns an error indicating reviewers are already requested, treat it as non-fatal.
Stop only when:
Not a stop condition:
REVIEW_REQUIRED); continue
polling and surface new review comments without asking for confirmation..pr/ artifacts freshBy convention, a PR may carry generated artifacts (diagrams, reports, generated
docs, fixtures) in a .pr/ folder. These are derived from the code, so they go
stale when you push fixes.
After each fix — and before marking the PR ready — check .pr/:
.pr/ folder or it's empty, skip this entirely.The rule is simple: if you know how an artifact was made and the code moved on, keep it up to date; otherwise don't touch it.
Once all present verification layers pass on the current SHA:
.pr/ artifacts are up to date with the latest code (see above).gh pr readyOnly do this at the very end, after the loop exits successfully.
Commit message defaults:
fix: CI failure on PR #<n>chore: address PR review feedback (#<n>)Provide concise progress updates during monitoring:
🚀 CI is all green! 33/33 passed. Still watching for review.Final summary should include:
references/verification.mdreferences/heuristics.md© OpenHands, 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 10 other files (references) in skills/iterate of OpenHands/extensions.
Open the folder on GitHubat commit d008b81
Iterate 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 |
|---|---|---|---|---|---|---|
| Iterate this skillOpenHands/extensions | 157 | — | ~3.8k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| GitHub PR Imagesbikeindex/bike_index | 308 | — | ~1.6k | Automated safety check: Pass | AGPL-3.0 | |
| Exposed Bug Fix WorkflowJetBrains/Exposed | 9.3k | — | ~3.8k | Automated safety check: Pass | Apache-2.0 | |
| Has Review Workopenshift-eng/ai-helpers | 120 | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Gh Address Commentstech-leads-club/agent-skills | 7k | — | ~353 | Automated safety check: Pass | Apache-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.
bikeindex/bike_index
Embed a local image file into an existing GitHub PR — either in the PR body or as a comment.
JetBrains/Exposed
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
openshift-eng/ai-helpers
Decide whether a GitHub PR has unanswered authorized review comments or new required CI failures worth a follow-up agent.
tech-leads-club/agent-skills
Address review and issue comments on the open GitHub PR for the current branch using gh CLI.
huangruiteng/CS-Notes
Inspect GitHub pull requests, issues, workflow runs, and API data with the gh CLI.
OpenHands/extensions
Evaluate how well a codebase supports autonomous AI-assisted development.
OpenHands/extensions
Build and automate Discord integrations (bots, webhooks, slash commands, and REST API workflows).
OpenHands/extensions
Interact with GitHub repositories, pull requests, issues, and workflows using the GITHUBTOKEN environment variable and GitHub CLI.
OpenHands/extensions
Create an automation that implements GitHub issues when a configurable trigger label is applied.
OpenHands/extensions
This skill should be used when the user asks to "monitor a GitHub repository", "watch GitHub for issues or PRs", "respond to @OpenHands mentions on GitHub", "set up an OpenHands GitHub integration"…
OpenHands/extensions
Create an automation that implements GitLab issues when a configurable trigger label is applied.
Works with
Categories
Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready. Iterate is an agent skill from OpenHands/extensions. Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready.
Iterate fits situations like: tasks that involve Failing and flaky tests; tasks that involve Pull requests.
Run `npx skills add OpenHands/extensions --skill iterate -a claude-code`. Or copy the skill folder (skills/iterate in OpenHands/extensions) into .claude/skills/iterate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenHands/extensions --skill iterate -a codex`. Or copy the skill folder (skills/iterate in OpenHands/extensions) into .agents/skills/iterate 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 OpenHands/extensions --skill iterate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/iterate, .gemini/skills/iterate, .github/skills/iterate and .opencode/skills/iterate in your project.
Going by SKILL.md and its folder, Iterate needs the command-line tools its instructions call (gh and git).
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.
Iterate is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.8k tokens (SKILL.md is roughly 15k 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 1.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Iterate: PR Babysitter (openinterpreter/openinterpreter, 69k stars), GitHub PR Images (bikeindex/bike_index, 308 stars), Exposed Bug Fix Workflow (JetBrains/Exposed, 9.3k stars) and Has Review Work (openshift-eng/ai-helpers, 120 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
OpenHands (a GitHub organization) maintains it in OpenHands/extensions, which has 157 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on October 6, 2026.
Source: OpenHands/extensions on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.