Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add OpenHands/extensions --skill github-pr-reviewergit clone --depth 1 https://github.com/OpenHands/extensionsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/openhands/extensions/github-pr-reviewer)<a href="https://agentmods.dev/skills/openhands/extensions/github-pr-reviewer"><img src="https://agentmods.dev/badge/skills/openhands/extensions/github-pr-reviewer/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/openhands/extensions/github-pr-reviewer"><img src="https://agentmods.dev/badge/skills/openhands/extensions/github-pr-reviewer.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 8 findings, up to high
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- high Supply Chain · line 187 Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.Fix: Avoid downloading and executing remote scripts. Use trusted packages from PyPI/npm. If remote fetch is required, verify checksums and use HTTPS.
- high Supply Chain · line 200 Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.Fix: Avoid downloading and executing remote scripts. Use trusted packages from PyPI/npm. If remote fetch is required, verify checksums and use HTTPS.
- medium Data Exfiltration · line 51 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 81 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 187 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 200 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- low Supply Chain · line 51 Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.Fix: Avoid downloading and executing remote scripts. Use trusted packages from PyPI/npm. If remote fetch is required, verify checksums and use HTTPS.
- low Supply Chain · line 81 Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.Fix: Avoid downloading and executing remote scripts. Use trusted packages from PyPI/npm. If remote fetch is required, verify checksums and use HTTPS.
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00053 | $0.06566 |
| Opus 5.5 | $0.00021 | $0.02626 |
| Sonnet 5.5 | $0.00011 | $0.01313 |
| Haiku 4.5 | $0.00005 | $0.00657 |
Grade A, and why
github-pr-reviewer scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
curl -s https://api.github.com/user \ How it starts
The opening of the file, as written. The whole thing — 538 lines — stays where its author put it; the contents beside it link to each section on GitHub.
GitHub PR Reviewer Automation
Agent Canvas catalog
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:
- Only checks GitHub reports as required decide the scheduled gate. An optional workflow that fails - including one that fails before creating any check run - does not block a head whose required checks pass.
- A completed required run on the exact head whose conclusion is
failure,cancelled, ortimed_outblocks the review. Any other unrecognized conclusion fails closed as a block rather than silently approving. - A completed required run whose conclusion is
success,neutral, orskippeddoes not block. A requiredcommit statuscontext is classified alongside required check runs. - A
queuedorin_progressrequired 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. - When the required-check signal cannot be read or is empty, the gate falls back
to every current-head check run and workflow run, so a red head still blocks.
In that fallback, workflow runs are read as well as check runs, because a
workflow can fail before creating any check run - a workflow-level error, or a
pull_requestrun 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 andgh pr checksboth 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. - A scheduled scan considers the trigger label and every open PR, including drafts,
that still holds an outstanding
all-hands-botreview request. That is what resumes a request made while CI was running: the request is keyed by its ownreview_requestedevent, 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 ofrequested_reviewers. - The scheduled scan also reviews open, non-draft PRs that nobody requested
and that carry no trigger label, once their current head has no completed
review by this account. That is what keeps reviewing PRs after the outstanding
requests are exhausted. The delivery key is the stable
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. - Each scheduled scan classifies the whole open backlog, including
unrequested PRs. Blocked, pending, draft, or already-reviewed heads therefore
cannot hide an eligible head behind an inspection window. The separate
max_new_per_runquota limits only newly created review conversations, not the number of PRs inspected; explicit requests and trigger labels retain priority when eligible candidates are drained. - A gate stop on an unrequested head posts no managed comment. A PR nobody asked about that is merely red or pending is simply skipped without starting an agent, which is what keeps a scan over a large backlog from posting a gate comment on every PR. The managed comment is the answer to an explicit request, so a requested or labeled head that is red or pending still gets its explanation.
- Workflow runs are read as well as check runs, because a workflow can fail
before creating any check run - a workflow-level error, or a
pull_requestrun 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 andgh pr checksboth 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. - Runs attributed to any other (obsolete) head SHA are ignored, so a stale failure cannot block the push that fixed it. This applies to workflow runs too.
- Only the latest run of each logical check or workflow counts. A logical check is its name plus the reporting app identity, and a logical workflow is its name plus workflow ID. The latest is chosen by the run ID (the reliable creation sequence) with the start time as a tie-break, so a re-run that fixed a check supersedes its earlier failure on the same SHA while a newer queued or in-progress re-run supersedes an earlier success and makes the head wait. Ordering by the run ID keeps a run whose start time is still absent in its true creation position in both directions.
What ships with it
14 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- .claude-plugin 7 B
- .codex-plugin 7 B
- .plugin/plugin.json 672 B
- commands/pr-reviewer-setup.md 434 B
- README.md 12 KB
- references/state-schema.md 6.7 KB
- references/windows.md 1.7 KB
- scripts/agent_conversation.py 42 B runs code
- scripts/github_client.py 37 B runs code
- scripts/main.py 52 KB runs code
- scripts/maintainer_handoff.py 5.0 KB runs code
- scripts/publication.py 11 KB runs code
- scripts/worker.py 65 KB runs code
- tests/test_main.py 31 KB runs code
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago Changed · +23 lines 546561b68a7c
- 11d ago Changed · +4 lines 6c1b48f524f5
- 12d ago Changed · +12 lines 1fe581cfcb1f
- 17d ago Changed · -9 lines d35abc63129f
- 21d ago Changed · +152 lines d599fc3002a7
- 24d ago Changed · +23 lines c8b265394dcf
- 25d ago Changed · +3 lines · -6 tokens per session 2af5b8777c76
- 1mo ago Changed · +7 lines 881316952c4c
- 1mo ago Changed · +7 lines 4fbd45b93d30
- 1mo ago First seen · 316 lines · 59 tokens per session scan A 73d743013473
github-pr-reviewer is a skill published in the GitHub repository OpenHands/extensions (167 stars, last pushed today), licensed MIT. It adds 53 tokens to every session and 6,566 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
review-implement-phase
Implements triaged review actions, commits focused fixes, and posts Done plus resolves threads. Use when the user wants only the implementation phase of the review-framework workflow.
pr
Draft a PR body from OMC's paper trail — the smallest visual that proves the change, evidence consumed from the verify protocol (never re-collected), reversibility from the ADR test on the diff, glossary language throughout.
otto-pr-review-loop
Run Polly and OCR on a PR until all findings settle.
engram-branch-pr
PR creation workflow for Engram following the issue-first enforcement system. Trigger: When creating a pull request, opening a PR, or preparing changes for review.
verify-behavior
Verify or reproduce visible product behavior by driving the real UI with pi-computer-use's checked tools, requiring verified expect postconditions and durable state evidence for meaningful UI flows. Use when triage needs visual reproduction, implementation needs behavioral proof, review needs interactive confirmation…
github-contributor
A step-by-step guide for contributing code, tests, documentation, or build changes to open-source projects you do not maintain. It explains how to prepare a pull request that follows the project’s rules and is easier for maintainers to review.