Agent skill

Review PR

by GEOLYTIX in GEOLYTIX/xyz

A skill your agent uses when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I…

MITAuto-check passedDevelopment

Install Review PR

skills CLI
$ npx skills add GEOLYTIX/xyz --skill review-pr -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install GEOLYTIX/xyz review-pr --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/GEOLYTIX/xyz.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/review-pr .claude/skills/review-pr && rm -rf skills-src

Use ~/.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/

Facts

Skill name
review-pr
GitHub stars
133
Token cost
~4.1k tokens
SKILL.md length
2,473 words
Files
1
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I…

  • Works in 6 steps: Work out what is under review. A pull… → Read the linked issue in full, not just… → Read the pull request comments, and… → …
  • Reviewing a pull request
  • SKILL.md covers Gather The Changes, Read Every Touched Method In…, Check Listeners And Repeated… and Check The Change Stays In Scope, plus 3 more sections
  • Calls git, gh and pnpm

What it does

Review PR is an agent skill from GEOLYTIX/xyz. Use when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I push", "look at PR 1234", or asks whether a change is ready to merge. Produces a terminal report covering whole-method correctness, listener and callback registration, scope creep across modules, test coverage for touched modules, and JSDoc conformance.

Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Pull requests, Technical documentation and Test coverage. It works with JavaScript and Node.js. The repository describes itself as: An open source javascript framework for spatial data and application interfaces. The licence is MIT.

When your agent uses it

  • Reviewing a pull request
  • Uncommitted working changes in the XYZ/MAPP repository — whether the user asks to review this PR
  • Check my changes before I push
  • Look at PR 1234

Example prompts

  • “review this PR”
  • “check my changes before I push”
  • “look at PR 1234”
  • “/review-pr”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Work out what is under review. A pull request number or URL means gh pr view --repo GEOLYTIX/xyz for the description and linked issues and…
  2. Read the linked issue in full, not just the pull request description. XYZ issues frequently carry the reproduction, the scope, and the…
  3. Read the pull request comments, and search for issues that reference the pull request number. This is where reviewers record the things…
  4. List every touched file before reading any of them, so the shape of the change is clear before its details are. A change touching one…
  5. Note which halves of the codebase the change touches, because it decides which checks below apply. apps/mapp/lib/ is the browser library…
  6. For a large diff, parallel subagents can help, but split the work by concern rather than by file. One subagent per touched module reads…

What it can do on your machine

Read from SKILL.md and the folder at commit 6d3dacc. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • gh
    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, gh and pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Review PR loads about 4.1k tokens when it runs. Until then it costs about 110 tokens; SKILL.md has 2,473 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~110
When it runs · the whole SKILL.md, loaded when a task matches
~4.1k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from GEOLYTIX/xyz at commit 6d3dacc, republished under its MIT licence (© GEOLYTIX). 2,473 words, ~4,078 tokens.

Download SKILL.mdSave it as .claude/skills/review-pr/SKILL.md (or your agent's skills folder).
name
review-pr
description
Use when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I push", "look at PR 1234", or asks whether a change is ready to merge. Produces a terminal report covering whole-method correctness, listener and callback registration, scope creep across modules, test coverage for touched modules, and JSDoc conformance.

Review PR

Review a change to XYZ/MAPP and report what a careful maintainer would raise. Write the report to the terminal; do not post it to GitHub and do not edit the code under review unless the user asks for fixes afterwards.

Two people use this review. A contributor runs it on their own working changes before pushing, so findings need to be specific enough to act on without further digging. A maintainer runs it while reading someone else's pull request, so the report needs to be readable top to bottom without the repository open alongside it. Write for both: name the file and line for every finding, and say what is wrong rather than only which rule was broken.

Gather The Changes

  1. Work out what is under review. A pull request number or URL means gh pr view <n> --repo GEOLYTIX/xyz for the description and linked issues and gh pr diff <n> --repo GEOLYTIX/xyz for the change. Pass --repo explicitly: a fork clone will otherwise resolve to the fork, where the pull request does not exist. No argument means review the working branch, diffed against the branch it targets rather than against main — XYZ maintains major, minor and patch release branches alongside main, and diffing a patch-based branch against main buries the change in unrelated commits. Take the base from gh pr view --json baseRefName when there is a pull request, or from the branch's upstream, and confirm with the user when neither is clear. Add git status for anything uncommitted. Ask which is meant only if the request is genuinely ambiguous — a dirty working tree on a feature branch usually means the uncommitted work is the subject.
  2. Read the linked issue in full, not just the pull request description. XYZ issues frequently carry the reproduction, the scope, and the motivation that the pull request summarises in a sentence. Where a linked issue exists it is the yardstick for the scope check below. Plenty of XYZ pull requests reference a Linear ticket such as ENG-295 instead, which you cannot read — when there is no readable linked issue, say so in the report and fall back to the pull request description, and treat the scope check as a judgement rather than a comparison.
  3. Read the pull request comments, and search for issues that reference the pull request number. This is where reviewers record the things that never reach the description: a maintainer asking whether the change is in scope, or an issue opened about this change while it was being reviewed. Issue #2955 was filed by a maintainer during the review of #2945 and is the single most useful thing a reviewer of that pull request could read, yet nothing in the pull request itself points to it. gh pr view <n> --comments and a search for the number will both surface this.
  4. List every touched file before reading any of them, so the shape of the change is clear before its details are. A change touching one module and its test reads very differently from the same fix scattered over nine.
  5. Note which halves of the codebase the change touches, because it decides which checks below apply. apps/mapp/lib/** is the browser library, where the listener and registration check earns its keep. apps/xyz/** is the Node API, where the Vitest coverage check does. A purely server-side change has no listeners to examine, and saying so in one line is the right outcome — not silence, and not a manufactured finding.
  6. For a large diff, parallel subagents can help, but split the work by concern rather than by file. One subagent per touched module reads quickly and hides exactly the bugs worth finding: a change that widens a route in router.js and a change to the handler in verify.js are each defensible alone and wrong together. Keep the reading of the diff in the main thread so the report is written with the whole change in view, and have any subagent return findings rather than file contents.

Read Every Touched Method In Full

Read each changed function in its entirety in its post-change state, not just the lines the diff shows. For working changes that is the file on disk. For a pull request you have not checked out, fetch its head first — git fetch upstream pull/<n>/head for an open pull request, or git fetch upstream when it is already merged — and then read with git show FETCH_HEAD:<path> or git show <merge-sha>:<path>. Reading this way rather than checking the branch out leaves whatever the user has in progress untouched, which matters because they may be reviewing someone else's pull request from inside their own unfinished work.

Then find the callers. Searching the bare function name is not enough in MAPP, where modules collect their functions into a methods object and export that as the default, so callers reach a private function through the module name instead — layerStyle.panel(entry), not panel(entry). Search for the exported path as well as the bare name, or you will conclude a function has one caller when it has three.

A diff hunk cannot tell you whether the change is right, only what moved. Reading the whole method and its callers is what surfaces the things reviewers actually miss:

  • A guard added at the top of a function that the only caller already performs.
  • An early return that now skips cleanup, an event unbind, or a cache write further down.
  • A parameter that changed meaning for one caller but not the others.
  • A promise that is no longer awaited, or an error path that now returns undefined where callers expect an object.
  • A method that was correct for the reported case but is now wrong for a second case it also serves.

When a change touches a route in apps/xyz/router.js, compare the middleware the route carried before against what it carries now. Express routes in XYZ get their request handling from the registration they match, so widening or narrowing a path can silently move a request onto a registration with a different middleware chain — the handler is untouched and still passes its tests, while a parameter it depends on quietly stops being populated. Read both registrations, not just the changed line, and name any middleware the request no longer passes through.

When the change fixes a regression, find the commit that introduced it with git log -L <start>,<end>:<path>. This reframes a review more often than any other single step: it shows whether the change restores the original behaviour or layers a second mechanism on top of the one that broke, which is the difference between a fix and a workaround that leaves the fault in place.

Report on the method as it now stands. Whether the original issue is fixed is necessary but not sufficient — a change that resolves the issue and breaks a sibling path is not ready.

A pre-existing bug you find inside a method the change touches is worth reporting as a [Note], labelled as pre-existing, with a suggestion to open its own issue. It is real, and the reviewer is the person best placed to see it — but holding a pull request for a fault it did not introduce is how good changes stall.

Check Listeners And Repeated Registration

MAPP builds its interfaces by registering callbacks, and those registrations outlive the code that made them. The failure is rarely a crash; it is the same handler firing two or three times because nothing removed the previous one.

For each touched registration, ask whether calling the surrounding function twice leaves one registration or two:

  • addEventListener without a matching removeEventListener, an AbortController signal, or { once: true }, on a target that outlives the call — window, document, the mapview, or a layer.
  • A push into a persistent array or an assignment into a persistent object, such as layer.showCallbacks, mapview.interactions, or a layer.style entry. These are the easiest to miss because they read as ordinary assignment rather than as subscription.
  • OpenLayers interactions, overlays, and sources added to the map without a corresponding removal.
  • Anything registered inside a function that runs again on a user action — switching a theme, reloading a layer, reopening a dialog, changing a locale.

Issue #2955 is the shape to look for: a legend method appended to layer.showCallbacks[] each time the theme changed, never removed, so every theme switch added another legend. Nothing errored. The symptom was duplicated behaviour, and only reading the registration alongside its teardown revealed it.

Where a registration is deliberately permanent, say so in the report rather than flagging it — a listener bound once at initialisation on a target that lives for the session is not a leak.

Show full SKILL.md (1,032 more words)Show less

Check The Change Stays In Scope

CONTRIBUTING.md asks that a pull request address a single issue, so that each can be reviewed on its own merits. Compare the touched modules against what the linked issue describes.

Flag a module that the issue does not explain. Renaming a variable in a file the fix merely passes through, reformatting an untouched block, or fixing a second unrelated bug all make the change harder to review and harder to revert. Say which modules are justified by the issue and which are not, and suggest the unrelated ones move to their own pull request.

Be careful to distinguish scope creep from a fix that genuinely needs breadth. A change to a shared utility legitimately touches every caller, and a rename the issue asks for legitimately spans files. The question is whether the issue accounts for the spread, not whether the number of files is large.

Check Tests And Coverage

XYZ has two test systems and the distinction decides what to ask for. Read vitest.config.mjs and the relevant package.json rather than relying on TESTING.md for paths — the documented config has drifted from the real one before.

  • XYZ API — apps/xyz/mod/**, plus its utils and plugins. Covered by Vitest under apps/xyz/tests/**. Run pnpm test:xyz:coverage and read the per-file table for the touched files.
  • MAPP library — apps/mapp/lib/**. Outside the Vitest run entirely, so it never appears in that coverage table and its absence there means nothing. The browser suite TESTING.md describes runs from a built bundle at public/js/tests/, and its source is not in this repository, so there is no per-file coverage figure to quote for a MAPP module. Say that plainly rather than reporting a coverage gap that is an artefact of which suite exists.

Then judge the change:

  • A new feature without a test is a finding, and the report should name the file the test belongs in.
  • A touched module whose coverage is unchanged and low is worth raising, with the current percentage quoted so the reader can weigh it. Treat this as a discussion to open rather than a gate: several XYZ modules start near zero, and demanding full coverage on a one-line fix in one of them is how a reasonable pull request gets stuck.
  • A bug fix with no test that fails before the fix is the finding most worth making. Say which case the test should cover.
  • Run the suite. A suite that runs and fails is a blocking finding regardless of anything else in the report. A suite you could not run — dependencies not installed, environment not configured — is not a failure and must not be reported as one; record it as a check that could not be completed, and say why. The distinction matters because a reader who sees "tests failed" will look for a bug that may not exist.
  • Make sure the suite actually ran. These scripts go through turbo, which replays a cached result when nothing it tracks has changed: the run returns in milliseconds and prints >>> FULL TURBO with no test counts. Reporting a pass from a cached artefact is the worst outcome available to this check, because it reads exactly like a real pass. If you see that marker, re-run with --force and report the counts from the run that actually executed.
  • A touched file missing from the coverage table altogether is a different finding from one with low coverage, and more interesting. It usually means the tests mock the module out rather than exercise it, so the suite passes while the changed code never executes. Say which it is.

Check Documentation

Check touched functions and modules against DOCUMENTATION.md:

  • Module comments carry the module path as the title, a short description of purpose, and @requires for linked modules.
  • Function comments begin with @function, are marked @async where they are, and carry an @description. Functions should not be anonymous.
  • @param lists only actual function arguments. @property documents the properties the method genuinely reads, with optional ones in square brackets.
  • @returns states when a promise is returned and when it may reject, in the form @returns {Promise<Object|Error>}.
  • Shared MAPP objects belong in a global @typedef, with nested typedefs named by the dash convention — the style object of layer is layer-style, and its theme is layer-style-theme.
  • Superseded functions kept for legacy configurations are marked @deprecated and warn when called.

Flag a new exported function with no JSDoc, and a changed signature whose @param list no longer matches. A missing @description on an otherwise documented function is worth a note rather than a blocking finding.

Report Format

Write to the terminal in Markdown, using this shape:

markdown
# Review: <PR title and number, or branch name>

<Two or three sentences: what the change does, whether it resolves the linked
issue, and the single most important thing the reader should know.>

## Findings

### [Blocking] <short title>
`apps/mapp/lib/<path>.mjs:142`
What is wrong, why it matters, and what would resolve it.

### [Consider] <short title>
`apps/xyz/mod/<path>.js:88`
...

### [Note] <short title>
...

## Checks

| Check | Result |
|---|---|
| Touched methods read in full | <n> methods across <n> files |
| Listeners and registration | <findings, "no registrations touched", or "not applicable — no MAPP code"> |
| Scope | <modules justified against the issue, or "no readable issue — judged against the description"> |
| Tests and coverage | <suite result, whether it ran or replayed from cache, coverage on touched files> |
| Documentation | <conformance summary> |

Keep every row even when a check did not apply, and say which of the three it was: examined and clean, not applicable to this change, or not completed and why. A reader scanning the table needs to tell those apart, and a missing row reads as an oversight.

Order findings by severity, most serious first. Use [Blocking] for a correctness bug, a failing suite, or a leaked registration; [Consider] for something a maintainer would likely ask for but could merge without; [Note] for an observation worth recording. A clean review still gets the Checks table — knowing what was examined is most of the value when nothing is wrong.

Say plainly when a check could not be completed, for example when the suite could not run or the linked issue was not available, rather than reporting that check as passed. A review that quietly skips a check is worse than one that reports the gap, because the reader cannot tell the difference between examined and overlooked.

Keep findings concrete. "This listener is never removed, so switching the theme twice renders two legends" tells the reader what to do; "improve event handling" does not.

Report what you found, not what would make the review look thorough. A small, correct change deserves a short report and an empty Findings section, and padding it with style preferences or speculative concerns trains the reader to skim — which costs you the one finding that mattered. If you suspect something but could not confirm it, say what you checked and what remains unknown rather than either dropping it or asserting it.

© GEOLYTIX, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/review-pr of GEOLYTIX/xyz.

Open the folder on GitHubat commit 6d3dacc

Compare with similar skills

Review PR 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.

Review PR compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Review PR this skillGEOLYTIX/xyz133—~4.1kAutomated safety check: PassMIT
Aidd Reviewparalleldrive/aidd384—~945Automated safety check: PassMIT
Test Revieweraxelixlabs/axelix148—~3.2kAutomated safety check: PassLGPL-3.0
Generate Release Notesteambit/bit18k—~2.2kAutomated safety check: PassCustom licence
Review Implement Phaseprisma/orm48k—~1.7kAutomated safety check: PassApache-2.0
Pretty Mermaid Rendererimxv/Pretty-mermaid-skills1.5k—~2kAutomated safety check: PassMIT

Similar skills

  • Aidd Review

    paralleldrive/aidd

    Conduct a thorough code review focusing on code quality, best practices, security, test coverage, and adherence to project standards and functional requirements.

    384 GitHub stars~945 tokensUpdated 3 mo ago
    DevelopmentAuto-check passed
  • Test Reviewer

    axelixlabs/axelix

    Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions.

    148 GitHub stars~3.2k tokensUpdated today
    MobileAuto-check passed
  • Generate comprehensive release notes for Bit from git commits and pull requests.

    18k GitHub stars~2.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Implements triaged pull request review actions, commits focused fixes, posts status replies on GitHub and resolves the threads.

    48k GitHub stars~1.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Pretty Mermaid Renderer

    imxv/Pretty-mermaid-skills

    Writes and renders Mermaid diagrams as themed SVG, PNG or terminal ASCII and Unicode art with a bundled Node.js CLI that needs no browser.

    1.5k GitHub stars~2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • React Router PR Finish Line

    remix-run/react-router

    Takes a blocked community pull request in React Router and adds the missing tests, change file or docs so it can merge, working on the contributor's branch.

    57k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed

More from GEOLYTIX/xyz

  • Release Notes

    GEOLYTIX/xyz

    A skill your agent uses when drafting, generating, revising, or reviewing GitHub release notes, changelogs, or a "What's Changed" section for an XYZ release.

    133 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Review PR

What does Review PR do?

A skill your agent uses when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I…. Review PR is an agent skill from GEOLYTIX/xyz. Use when reviewing a pull request, a branch, or uncommitted working changes in the XYZ/MAPP repository — whether the user asks to "review this PR", "check my changes before I push", "look at PR 1234", or asks whether a change is ready to merge.

When should I use Review PR?

Review PR fits situations like: reviewing a pull request; uncommitted working changes in the XYZ/MAPP repository — whether the user asks to review this PR; check my changes before I push; look at PR 1234.

How do I install Review PR in Claude Code?

Run `npx skills add GEOLYTIX/xyz --skill review-pr -a claude-code`. Or copy the skill folder (.claude/skills/review-pr in GEOLYTIX/xyz) into .claude/skills/review-pr in your project. Claude Code loads it when a task matches its description.

How do I install Review PR in Codex?

Run `npx skills add GEOLYTIX/xyz --skill review-pr -a codex`. Or copy the skill folder (.claude/skills/review-pr in GEOLYTIX/xyz) into .agents/skills/review-pr in your project. Codex loads it when a task matches its description.

Can I use Review PR in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add GEOLYTIX/xyz --skill review-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/review-pr, .gemini/skills/review-pr, .github/skills/review-pr and .opencode/skills/review-pr in your project.

What does Review PR need to run?

Going by SKILL.md and its folder, Review PR needs the command-line tools its instructions call (git, gh and pnpm).

Does Review PR access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Review PR safe to install?

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.

What licence does Review PR use?

Review PR is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Review PR use?

About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Review PR?

Skills that share tags, products or a category with Review PR: Aidd Review (paralleldrive/aidd, 384 stars), Test Reviewer (axelixlabs/axelix, 148 stars), Generate Release Notes (teambit/bit, 18k stars) and Review Implement Phase (prisma/orm, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Review PR?

GEOLYTIX (a GitHub organization) maintains it in GEOLYTIX/xyz, which has 133 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 8, 2026.

Source: GEOLYTIX/xyz on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.