pr-reply/SKILL.md
Draft friendly, concise replies to pull request review comments. Use when user pastes a PR comment, asks to "reply to a PR comment", "/pr-reply", "answer this reviewer", or wants help responding to review feedback. Don't use for posting comments to GitHub, creating new PRs, or reviewing PRs.
npx skillsauth add helderberto/skills pr-replyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Draft replies to reviewer comments grounded in the project's source of truth (specs, ADRs, CHANGELOG, code, prior PRs). Output is text only — the user posts to GitHub themselves.
git rev-parse --abbrev-ref HEADgit log --oneline -15ls docs/specs/ docs/adrs/ 2>/dev/nullAccept any of:
Quoted comment + file reference (most common, fastest)
@src/foo.ts
> Why are we wrapping JSON.stringify here?
GitHub permalink to a review comment — fetch with gh:
# https://github.com/<owner>/<repo>/pull/<n>#discussion_r<id>
gh api /repos/<owner>/<repo>/pulls/comments/<id>
Returns body, path, line, diff_hunk, user, in_reply_to_id. Use those fields to skip the "ask for file/line" step.
PR number — fetch all review comments to triage in bulk:
gh api /repos/<owner>/<repo>/pulls/<n>/comments --jq \
'.[] | {id, path, line, user: .user.login, body, in_reply_to_id}'
When user says "reply to all open comments on PR #289", iterate.
Code block pasted inline — treat the same as quoted text; extract the file path from a leading @path or fenced header.
Always confirm file + line before drafting if not derivable from input.
Resolve input — if a permalink or PR number is given, fetch via gh (see Inputs). Extract: comment body, file path, line, prior replies.
Locate sources of truth in this order, stopping when sufficient:
docs/specs/*.md — architecture decisions, design rationaledocs/adrs/*.md — legacy ADR location (if no specs/)CHANGELOG.md — historical context for "why does X exist"git log -- <file> — when the line was introduced and whygh pr list --search — prior debate on the same topicClassify the comment — picks the response shape:
| Type | Shape | |---|---| | Already-decided | Acknowledge + link to spec/decision + offer to revisit on concrete pain | | Valid in-scope | Acknowledge + plan the change inline | | Valid out-of-scope | Acknowledge + commit to follow-up + scope out of current PR | | Misconception | Correct gently with one fact + restate decision | | Praise / nit | One-liner |
Draft response following the rules below.
Iterate on request — user often asks shorter, friendlier, or rephrased.
—). Use commas, periods, parentheses, "but", "so", "and" instead. Em dashes read as AI-generated.Already-decided:
{Acknowledgment}. We landed on this in {spec/PR link}, {one-line reason}. Happy to revisit if there's a concrete pain point.
Out-of-scope:
{Acknowledgment}. {One-line answer}. Out of scope for this PR, but happy to address it in a follow-up.
Misconception:
{Acknowledgment}. Quick clarification: {correct fact}. {Restate intent if needed}.
In-scope fix:
{Acknowledgment}. I'll {specific action}. {One-line rationale if non-obvious}.
docs/specs/<file>.md), not a hallucinated pathAlready-decided (string-only contract debate):
We landed on this in a previous discussion. String-only simplifies the library but pushes parsing, defaults, and type assertions to every call site. We'd also lose compile-time enforcement (
setDarkMode("yes")would compile), and migration logic would scatter across MFEs instead of staying in the getter. Happy to revisit if there's a concrete pain point.
Out-of-scope (postbuild shim):
Good catch! The shim isn't browser-storage-specific. It was added earlier for
utils/to support consumers on older Jest versions that don't followexports. Out of scope for this PR, but happy to revisit in a follow-up.
Misconception (browser quota):
Good call, conservative start is easier to expand than retract. Quick clarification: 4KB isn't the browser cap (browsers allow ~5-10MB per origin), it's our soft ceiling against the 50KB per-MFE budget. Principle still applies though, so I'll drop the default to 2KB.
In-scope fix (missing CHANGELOG):
Good catch! Looks like the previous bumps landed without updating the CHANGELOG. I'll backfill the missing entries in this PR to avoid pushing the gap further.
testing
Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.
documentation
Compact the current conversation into a handoff doc so a fresh agent can continue the work. Use when user asks to "handoff", "/handoff", "hand this off", or wants to end a session mid-task. Don't use for summarising completed work, writing PRDs/plans/ADRs, or committing changes.
development
Create new agent skills with proper structure, progressive disclosure, and bundled resources. Use when user wants to create, write, or build a new skill, or asks "make a skill for X".
development
Tell the agent to zoom out and give broader context or a higher-level perspective. Use when you're unfamiliar with a section of code or need to understand how it fits into the bigger picture.