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.
Create an automation that reviews GitHub pull requests when a configured reviewer is requested or a trigger label is applied.
$ npx skills add OpenHands/extensions --skill github-pr-reviewer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install OpenHands/extensions github-pr-reviewer --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/github-pr-reviewer .claude/skills/github-pr-reviewer && 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 "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .claude/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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/github-pr-reviewerType 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 github-pr-reviewer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install OpenHands/extensions github-pr-reviewer --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/github-pr-reviewer .agents/skills/github-pr-reviewer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .agents/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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 github-pr-reviewer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install OpenHands/extensions github-pr-reviewer --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/github-pr-reviewer .cursor/skills/github-pr-reviewer && 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 "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .cursor/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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/github-pr-reviewer--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 github-pr-reviewer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install OpenHands/extensions github-pr-reviewer --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/github-pr-reviewer .gemini/skills/github-pr-reviewer && 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 "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .gemini/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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 github-pr-reviewerInstalls 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 github-pr-reviewer -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/github-pr-reviewer .github/skills/github-pr-reviewer && 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 "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .github/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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 github-pr-reviewer -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 github-pr-reviewer --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/github-pr-reviewer .opencode/skills/github-pr-reviewer && 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 "github-pr-reviewer" agent skill from https://github.com/OpenHands/extensions/tree/main/skills/github-pr-reviewer into .opencode/skills/github-pr-reviewer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "github-pr-reviewer", 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.
github-pr-reviewerCreate an automation that reviews GitHub pull requests when a configured reviewer is requested or a trigger label is applied.
GitHub PR Reviewer is an agent skill from OpenHands/extensions. Create an automation that reviews GitHub pull requests when a configured reviewer is requested or a trigger label is applied. Starts one OpenHands review conversation per request with the pull request's exact head checked out, and publishes the review to GitHub.
Its SKILL.md is about 6.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 19 other files, including scripts and reference files (for example `.plugin/plugin.json`, `README.md` and `commands/pr-reviewer-setup.md`).
It sits in Development, covering Pull requests. It works with GitHub. The repository describes itself as: Public registry for OpenHands extensions. The licence is MIT.
9 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.
Ships 6 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3curlghpythonFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.github.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_PERSONAL_ACCESS_TOKENOPENHANDS_AUTOMATION_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
GitHub PR Reviewer loads about 6.8k tokens when it runs, and up to ~8.8k if it reads all its reference files. Until then it costs about 70 tokens; SKILL.md has 3,665 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); the scripts in this folder are not scanned.
The full file from OpenHands/extensions at commit d008b81, republished under its MIT licence (© OpenHands). 3,665 words, ~6,807 tokens.
.claude/skills/github-pr-reviewer/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.For new Agent Canvas installations, use the GitHub code review catalog
entry. Its deterministic worker.py delegates each requested exact head to a
stable conversation using the selected agent profile. It supports GitHub
reviewer-request events and scheduled label scans. The manual upload flow below
remains for existing deployments and is deprecated for new installations.
Create a cron automation that watches one or more GitHub repositories for pull
requests with a review trigger label, starts an OpenHands review conversation
once per label event, and publishes the AI review to GitHub.
Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in references/windows.md.
The automation script is deterministic: PR discovery, label-event tracking, head eligibility, state persistence, stale-result suppression, the repository checkout, and its removal are all handled in Python. The LLM is invoked only for the review itself.
Before any review conversation is created, a scheduled scan evaluates the
current head's GitHub-required checks, read through the GraphQL isRequired
signal for the pull request. That signal is the merge policy's own source of
truth and is pull-request-scoped, so it stays correct for a stacked PR whose
symbolic base branch carries no branch rules of its own:
failure,
cancelled, or timed_out blocks the review. Any other unrecognized
conclusion fails closed as a block rather than silently approving.success, neutral, or
skipped does not block. A required commit status context is classified
alongside required check runs.queued or in_progress required run on the exact head, and a required
context that has not reported a current-head check run at all, make the run
exit with a waiting on checks outcome. Unfulfilled is never approval. The
worker does not hold a slot polling; the next scheduled scan or explicit
review request retries.pull_request run whose jobs never start. Such a run leaves a failed check
suite with no check runs under it, so the commit's check-run rollup and
gh pr checks both report success and only the workflow run reveals the red
CI. A workflow run whose check suite already reported check runs is left to
those runs, so a workflow is never counted twice.all-hands-bot review request. That is what
resumes a request made while CI was running: the request is keyed by its own
review_requested event, so repeated scans reuse one conversation and one
review instead of creating duplicates, and a PR whose request was answered or
withdrawn simply drops out of requested_reviewers.scan:{repository}:{number}:{head}, so repeated scans reuse one conversation
and one native review, and a changed head becomes eligible again under its new
SHA.max_new_per_run quota limits only newly created review conversations, not the
number of PRs inspected; explicit requests and trigger labels retain priority
when eligible candidates are drained.pull_request
run whose jobs never start. Such a run leaves a failed check suite with no
check runs under it, so the commit's check-run rollup and gh pr checks both
report success and only the workflow run reveals the red CI. A workflow run
whose check suite already reported check runs is left to those runs, so a
workflow is never counted twice.An explicit all-hands-bot review request is the intake-policy exception: the
caller asked for that head by name, so the request dispatches even when required
CI is red or pending, and the gate leaves no explanatory comment. Draft, scope,
exact-head, and delivery-deduplication safeguards still apply. A blocked or
waiting scheduled stop consumes no trigger: once the head's required checks are
non-blocking, the scheduled scan, or a new all-hands-bot review request,
starts the normal review.
The gate needs no configured list of check names. When it stops a review it
leaves one concise explanation on the PR, identified by a hidden marker carrying
the head SHA and gate category, so a later run for a different head updates that
comment instead of posting another. Only a marker this reviewer account authored
counts as its own comment; every other PR comment is untrusted and can neither
suppress the explanation nor be edited. If the repository's own workflow already
posted a deterministic remediation comment that names the same current-head
checks, the gate adds nothing; a disclosure about some other check does not
suppress it. The gate applies to scheduled label scans; an explicit
all-hands-bot review request bypasses it by design.
Each explicit review request - a re-applied trigger label, or a new reviewer
request in event mode - is a fresh review. The conversation for a PR is reused,
but its earlier turns must not be trusted as current: before deciding a verdict
the reviewer re-fetches the mutable GitHub state (the exact head, the PR body,
review comments and threads, review requests, the linked issues' bodies and
labels, and the current-head Actions results) and ignores any earlier finding,
verdict, or label/priority claim that state no longer supports. Repository
analysis the conversation already did, such as reading AGENTS.md, stays
useful and is not repeated.
The waiting and blocked explanations name the retry the deployment actually has.
A scheduled run proves a scan is configured, so it says the next scan will
retry. An event-only run does not, so it tells the reader to remove the
outstanding all-hands-bot request and request all-hands-bot again instead of
promising a scan that does not exist: GitHub will not accept a second request
while the first is still outstanding.
The gate leaves only one explanation per head. When the same head keeps the same hidden marker but the retry wording changes -- an event-only comment on a head whose automation is later switched to a cron scan -- the scheduled run rewrites that managed comment in place, so the comment always names the retry that is actually deployed, and an unchanged body is left untouched.
A scheduled scan drains outstanding reviewer requests fairly, but starting an
agent for every eligible pull request at once would overload the deployment, so
the scan starts at most MAX_NEW_PER_RUN new review conversations, counted
across every configured repository rather than per repository. The default
is 2, and the rendered config.json overrides it through the
max_new_per_run key that github-issue-to-pr and gitlab-issue-to-mr already
use.
all-hands-bot
request (or a trigger label) is ordered before an unrequested PR, then by the
oldest all-hands-bot review_requested event for a requested PR or the PR's
own creation time (oldest first) for an unrequested one, then by repository,
then by pull-request number, so the oldest work drains first and a later scan
reaches the remainder.review_requested event path and the trigger-label scan are
unchanged: an explicit request still starts its conversation immediately, and
only the scheduled scan's new conversations are bounded.The review prompt starts with a scope gate: using the repository's own guidance
(its scope categories and ownership boundaries, not a list of individual PR
numbers), the reviewer decides whether the change belongs in this repository
and has the product/architecture direction it needs. When it does not, the review
stops with a single event: COMMENT review that says whether the change should
move repositories, close, or receive a maintainer decision, and ends with the
🛑 MAINTAINER DECISION REQUIRED verdict. That outcome is neither an approval
nor a change request: it does not approve or merge the PR. The completion
handler recognizes the verdict and requests one configured maintainer through the
same handoff used after an approval. Both paths require a successfully fetched
same-repository closing issue labeled priority:medium or priority:high; a
missing link or priority label, low/normal priority, unresolved reference, or PR
reference does not authorize handoff. One qualifying issue is sufficient even
with other low-priority or missing references. Existing manual review requests
are unchanged. An in-scope change continues the existing review unchanged.
Before approving a change to user-visible UI behavior, the prompt requires live
evidence from a real running application when the repository's guidance demands
it: a screenshot, screen recording, or equivalent capture of the running app
that exercises the production-facing path. Unit tests, CSS-token or contract
assertions, generated mockups, and reconstructed captures may support the review
but cannot substitute for that evidence. When the required evidence is missing,
the reviewer publishes one event: COMMENT review naming exactly what is
missing and ends with 🔄 CHANGES REQUESTED, so approval is withheld and the
deterministic maintainer handoff does not fire. Non-UI changes keep the existing
requirement of the real command and its observed output, with tests insufficient
as sole proof.
The script prepares each review's workspace before the agent starts: the pull request's head commit is downloaded as a tarball and extracted to a directory of its own, which becomes the conversation's working directory. The agent is told not to clone, fetch, check out, or delete anything, and the script removes the checkout once the conversation has stopped. Nothing accumulates between runs.
The script imports shared GitHub transport from
scripts/github_client.py, installed with this skill. Include it beside
main.py when packaging manually, as shown below; catalog bundles include it
automatically.
Verify that the following secret is set in OpenHands Settings -> Secrets:
| Secret name | Token type | Minimum permissions |
|---|---|---|
GITHUB_PERSONAL_ACCESS_TOKEN | Classic PAT | repo for private repos or public_repo for public repos |
GITHUB_PERSONAL_ACCESS_TOKEN | Fine-grained PAT | Contents: Read, Metadata: Read, Pull requests: Read and Write, Issues: Read and Write |
Pull-request write access is required because the agent publishes a pull request review, not just an issue comment. The Agent Canvas catalog worker may also request a configured human reviewer after approval. A token with only Pull requests: Read will poll happily and then fail at the point of publishing or requesting the handoff.
When several repositories are monitored, the token must cover all of them.
Check with:
curl -s https://api.github.com/user \
-H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
| python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('login') or d.get('message'))"If the token is missing or invalid, inform the user and stop.
Follow these steps in order.
GITHUB_PERSONAL_ACCESS_TOKENRun the curl check above.
{"message": "Bad credentials"}: tell the user the
token is invalid and ask them to update it. Stop.Ask: "Which GitHub repositories should be monitored?
(Format: owner/repo, e.g. myorg/backend. List several separated by commas to
review them all from one automation.)"
Validate access to each repository:
curl -s "https://api.github.com/repos/{owner}/{repo}" \
-H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
| python3 -c "
import json, sys
d = json.load(sys.stdin)
if 'message' in d:
print('ERROR:', d['message'])
else:
print(f\"Accessible. Private: {d.get('private')}. Permissions: {d.get('permissions')}\")
"Record every accepted repository into REPOS = ["{owner}/{repo}", ...]. If one
repository fails the check, say which and ask whether to continue without it.
Each repository is polled independently and keeps its own state, so pull-request numbers never collide between them. The trigger label, tone, and schedule are shared by all of them; a repository needing different settings wants its own automation.
Ask: "Which PR label should trigger a review?
(Press Enter for the default: openhands-review.)"
Record the answer as TRIGGER_LABEL. If the label does not exist yet, tell the
user that GitHub will still record the event once the label is created and
applied to a PR.
The automation reviews a PR when it sees the latest matching labeled event for
that label. To request another review later, remove and re-apply the label.
Ask: *"What review tone should the reviewer use?
Map the choice to REVIEW_TONE:
| Answer | REVIEW_TONE | REVIEW_STYLE_INSTRUCTIONS |
|---|---|---|
| 1 / Enter | "thorough" | "" |
| 2 | "concise" | "" |
| 3 | "friendly" | "" |
Custom text, e.g. strict but kind | "thorough" | the custom text verbatim |
Ask: "How often should the automation poll for labeled PRs?
(Press Enter for the default: every 5 minutes.
Use a cron expression for a different interval, e.g. 0 * * * * = hourly)"
Default: */5 * * * *.
Record as CRON_SCHEDULE.
Read scripts/main.py from this skill's directory. Apply exactly seven constant
substitutions near the top of the file:
The script also reads a
config.jsonshipped beside it, if there is one, over these constants. That is how the catalog entry (automations/catalog/github-pr-reviewer/) configures an unmodified copy, since a declarative host cannot rewrite Python. This setup path substitutes the constants and ships noconfig.json, so the two never collide.
| Placeholder | Replace with |
|---|---|
REPOS = ["owner/repo"] | REPOS = ["{owner_repo}", ...] - one entry per repository collected in Step 2 |
TRIGGER_LABEL = "openhands-review" | TRIGGER_LABEL = "{trigger_label}" |
REVIEW_TONE = "thorough" | REVIEW_TONE = "{review_tone}" |
REVIEW_STYLE_INSTRUCTIONS = "" | REVIEW_STYLE_INSTRUCTIONS = "{style_instructions}" |
REPO_REVIEW_GUIDE_PATH = ".agents/skills/custom-codereview-guide.md" | leave unchanged to auto-load a repo review guide at this path, or set to "" to disable |
MAX_NEW_PER_RUN = 2 | leave unchanged to bound a scheduled scan to two new review conversations across all repositories, or raise it if the deployment can hold more agents at once |
DEFAULT_OPENHANDS_URL = "http://localhost:8000" | leave unchanged unless the user has a preference |
Use a safe string writer such as json.dumps(value) when inserting user-provided
repository names, labels, or style instructions into Python string literals.
json.dumps(list_of_repos) produces the whole REPOS list safely in one step.
Run these commands from this skill's directory and write the customized script to a temporary build directory:
mkdir -p /tmp/pr-reviewer-build
cp -L scripts/github_client.py /tmp/pr-reviewer-build/github_client.py
# write the customized main.py to /tmp/pr-reviewer-build/main.pyValidate syntax before packaging:
python3 -m py_compile /tmp/pr-reviewer-build/main.py && echo "Syntax OK"Fix any syntax errors before proceeding.
Determine the Automation backend URL and auth from the <RUNTIME_SERVICES>
block in your system context:
url_from_agentX-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEYtar -czf /tmp/pr-reviewer.tar.gz -C /tmp/pr-reviewer-build .
TARBALL_PATH=$(curl -s -X POST \
"${OPENHANDS_HOST}/api/automation/v1/uploads?name=github-pr-reviewer" \
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \
-H "Content-Type: application/gzip" \
--data-binary @/tmp/pr-reviewer.tar.gz \
| python3 -c "import json,sys; print(json.load(sys.stdin)['tarball_path'])")
echo "Uploaded: $TARBALL_PATH"curl -s -X POST "${OPENHANDS_HOST}/api/automation/v1" \
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"GitHub PR Reviewer: {repo_summary} label {trigger_label}\",
\"trigger\": {\"type\": \"cron\", \"schedule\": \"{cron_schedule}\"},
\"tarball_path\": \"$TARBALL_PATH\",
\"entrypoint\": \"python3 main.py\",
\"timeout\": 600
}" | python3 -m json.toolUse the single repository as {repo_summary} when there is one, and something
like 3 repos when there are several. A poll now downloads a tarball per queued
review, so the timeout allows for that; a run never waits for a review to
finish, only for it to be started.
Record the returned id.
Tell the user:
✅ GitHub PR Reviewer is running!
- Automation ID:
{id}- Repositories:
{owner}/{repo}, ... (one line each)- Trigger label:
{trigger_label}- Review tone:
{tone}- Polling schedule:
{cron_schedule}- State file per repository:
~/.openhands/workspaces/automation-state/github_pr_reviewer_label_event_{id}_{owner}__{repo}.jsonApply the
{trigger_label}label to a pull request to queue a review. Each label event is processed once. To request another review, remove and re-apply the label.The review is published as a pull request review on the head commit, with inline comments where a finding maps to a changed line.
Each cron run executes main.py, which resolves and validates
GITHUB_PERSONAL_ACCESS_TOKEN once, then processes every repository in REPOS
independently. One repository failing does not stop the others; the run fails
only if every repository fails.
For each repository:
references/state-schema.md).TRIGGER_LABEL:labeled issue event.{WORKSPACE_BASE}/repositories/{owner}__{repo}/pr-{number}-{sha12}. The
archive is checked as it is unpacked: a single root, no absolute or ..
paths, and symlinks skipped rather than materialised.status: "active" and the checkout path.idle, finished, error, or stuck,
asks GitHub whether a review by the token's own user exists for that head
SHA. If it does, the review is complete. If it does not, the agent's final
response is posted as a comment so the work is not lost.The completion callback fires once for the whole run.
references/state-schema.md - State JSON schema, field definitions, and
review lifecycle diagram.scripts/main.py - The complete automation script. Customize the five
constants at the top before packaging.tests/test_main.py - Unit tests for the checkout, its removal, and state
handling. Run them from the skill root with python -m pytest tests/ after
editing the script.| Symptom | Likely cause | Fix |
|---|---|---|
| Bot never queues reviews | Trigger label not present or no matching labeled event | Apply the configured label to the PR |
| "Bad credentials" in run logs | Token expired | Rotate and update GITHUB_PERSONAL_ACCESS_TOKEN |
| 404 on repo access | Repo name wrong or no access | Re-check the entry in REPOS and the token's permissions |
| One repository is skipped, others work | That repository failed its access check | Read the === owner/repo === block in the run log |
| Same PR not reviewed after new commits | Label event was already processed | Remove and re-apply the trigger label |
| Review paused with a failing-check comment | A current-head required check reported failure, cancelled, or timed_out | Fix the named checks and push; the review starts on the new head, or request all-hands-bot to review immediately |
| Review reported waiting on checks | A current-head required check is queued or in_progress, or has not reported yet | No action; a later scan or a new review request retries |
| Optional workflow failed but no review was paused | The failed workflow is not required, so the required-only scheduled gate ignored it | No action; only GitHub-required checks gate scheduled discovery |
| Only a few reviews start on a large backlog | The per-scan max_new_per_run bound (default 2) reached | No action; later scans drain the remaining oldest eligible PRs, or raise max_new_per_run if the deployment can hold more agents |
| Review result never posts | Conversation still running or stuck | Open the conversation link from the acknowledgement comment |
| Stale review suppressed | PR head SHA changed while the agent was reviewing | Re-apply the trigger label after the latest commit |
| Review arrives as a plain comment, not a review | Publishing failed, so the script posted the text as a fallback | Check that the token has Pull requests: Read and Write |
| Agent reports it cannot clone the repo | Prompt asked it not to; the workspace is already the checkout | No action - the code is at the head SHA in its working directory |
Checkouts remain under repositories/ | Their conversations had not stopped yet | They are removed by a later poll once the conversation is terminal |
© 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 14 other files (scripts, references) in skills/github-pr-reviewer of OpenHands/extensions.
Open the folder on GitHubat commit d008b81
GitHub PR Reviewer 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 |
|---|---|---|---|---|---|---|
| GitHub PR Reviewer this skillOpenHands/extensions | 157 | — | ~6.8k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Check PRonyx-dot-app/onyx | 32k | 2 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Contributor-First PR MergeHKUDS/OpenHarness | 16k | 1 repos | ~847 | Automated safety check: Pass | MIT | |
| Create Pull Requestcline/cline | 70k | 1 repos | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Pull Request Title and Body Writeropeninterpreter/openinterpreter | 69k | 2 repos | ~1.1k | 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.
onyx-dot-app/onyx
Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
cline/cline
Opens a GitHub pull request from your current branch with the gh CLI, after reviewing the commits and diff and gathering the details the PR needs.
openinterpreter/openinterpreter
Rewrites the title and body of one or more pull requests with gh, leading with why the change was made, then what changed, and describing only the net result.
prisma/orm
Runs a loop on a GitHub pull request: fetch review state, triage comments into actions, implement them and resolve threads, repeating until nothing actionable is left.
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
Create an automation that reviews GitHub pull requests when a configured reviewer is requested or a trigger label is applied. GitHub PR Reviewer is an agent skill from OpenHands/extensions. Create an automation that reviews GitHub pull requests when a configured reviewer is requested or a trigger label is applied.
GitHub PR Reviewer fits situations like: label is applied; tasks that involve Pull requests.
Run `npx skills add OpenHands/extensions --skill github-pr-reviewer -a claude-code`. Or copy the skill folder (skills/github-pr-reviewer in OpenHands/extensions) into .claude/skills/github-pr-reviewer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add OpenHands/extensions --skill github-pr-reviewer -a codex`. Or copy the skill folder (skills/github-pr-reviewer in OpenHands/extensions) into .agents/skills/github-pr-reviewer 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 github-pr-reviewer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/github-pr-reviewer, .gemini/skills/github-pr-reviewer, .github/skills/github-pr-reviewer and .opencode/skills/github-pr-reviewer in your project.
Going by SKILL.md and its folder, GitHub PR Reviewer needs Python for the scripts in its folder, the command-line tools its instructions call (python3, curl, gh and python) and credentials named GITHUB_PERSONAL_ACCESS_TOKEN and OPENHANDS_AUTOMATION_API_KEY. Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: api.github.com; the agent is likely to contact it when it follows the instructions. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
GitHub PR Reviewer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.8k tokens (SKILL.md is roughly 27k 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 2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with GitHub PR Reviewer: PR Babysitter (openinterpreter/openinterpreter, 69k stars), Check PR (onyx-dot-app/onyx, 32k stars), Contributor-First PR Merge (HKUDS/OpenHarness, 16k stars) and Create Pull Request (cline/cline, 70k 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.