
Pr Address Comments
Triage open GitHub PR review threads on the current branch with gh and scripts before you choose what to fix.
Overview
PR Address Comments is an agent skill for the Ship phase that fetches GitHub PR comment state with gh and produces a triage summary before any automatic fixes.
Install
npx skills add https://github.com/google-gemini/gemini-cli --skill pr-address-commentsWhat is this skill?
- Runs scripts/fetch-pr-info.js for full PR state and comment payload
- Summarizes resolved threads with ✅ and numbers open threads for triage
- Explicitly does not auto-fix—user guides what to address or skip
- Requires GitHub CLI (gh) for the Gemini CLI workflow
- Uses diff, commits, and comment authors including the current user
Adoption & trust: 781 installs on skills.sh; 105k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You have a pile of PR comments from bots and reviewers and no clear picture of which threads are still open on your branch.
Who is it for?
Solo builders using Gemini CLI on a branch with an open GitHub PR who already have gh authenticated.
Skip if: Repositories not on GitHub, workflows without gh CLI, or users who want the agent to silently apply every review comment without confirmation.
When should I use this skill?
User asks you to help address GitHub PR comments for the current branch of Gemini CLI.
What do I get? / Deliverables
You get a numbered summary of open and resolved feedback and explicitly choose what to fix, skip, or reply to before the agent edits code.
- PR comment and thread status summary
- Numbered list of open review items awaiting user decision
- Resolved-thread rollup with checkmark lines
Recommended Skills
Journey fit
Pull request comment resolution sits in Ship review—the gate between implementation and merge. Review subphase matches the skill’s sole job: summarize feedback and wait for human direction before edits.
How it compares
A structured PR triage ritual for Gemini CLI—not a generic code-review linter or merge bot.
Common Questions / FAQ
Who is pr-address-comments for?
Developers on the Gemini CLI who need help organizing GitHub pull request review comments on their current branch before making changes.
When should I use pr-address-comments?
Use it in Ship during code review when a PR has fresh automated or human comments and you want a full-thread summary before touching the codebase.
Is pr-address-comments safe to install?
Check the Security Audits panel on this page; the skill runs local Node scripts and gh against your repo—confirm org policies before installing in sensitive projects.
SKILL.md
READMESKILL.md - Pr Address Comments
You are helping the user address comments on their Pull Request. These comments may have come from an automated review agent or a team member. OBJECTIVE: Help the user review and address comments on their PR. # Comment Review Procedure 1. Run the `scripts/fetch-pr-info.js` script to get PR info and state. MAKE SURE you read the entire output of the command, even if it gets truncated. 2. Summarize the review status by analyzing the diff, commit log, and comments to see which still need to be addressed. Pay attention to the current user's comments. For resolved threads, summarize as a single line with a ✅. For open threads, provide a reference number e.g. [1] and the comment content. 3. Present your summary of the feedback and current state and allow the user to guide you as to what to fix/address/skip. DO NOT begin fixing issues automatically. #!/usr/bin/env node /** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /* eslint-env node */ /* global console, process */ import { exec } from 'node:child_process'; import { promisify } from 'node:util'; const execAsync = promisify(exec); async function run(cmd) { try { const { stdout } = await execAsync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'], }); return stdout.trim(); } catch { return null; } } const IGNORE_MESSAGES = [ 'thank you so much for your contribution to Gemini CLI!', "I'm currently reviewing this pull request and will post my feedback shortly.", 'This pull request is being closed because it is not currently linked to an issue.', ]; const shouldIgnore = (body) => { if (!body) return false; return IGNORE_MESSAGES.some((msg) => body.includes(msg)); }; async function main() { const branch = await run('git branch --show-current'); if (!branch) { console.error('❌ Could not determine current git branch.'); process.exit(1); } const gqlQuery = `query($branch:String!){repository(name:"gemini-cli",owner:"google-gemini"){pullRequests(headRefName:$branch,first:100){nodes{id,number,state,comments(first:100){nodes{createdAt,isMinimized,minimizedReason,author{login},body,url,authorAssociation}},reviews(first:100){nodes{id,author{login},createdAt,isMinimized,minimizedReason,body,state,comments(first:30){nodes{id,replyTo{id},author{login},createdAt,body,isMinimized,minimizedReason,path,line,startLine,originalLine,originalStartLine}}}}}}}}`; const [authInfo, diff, commits, rawJson] = await Promise.all([ run('gh auth status -a'), run('gh pr diff'), run( 'git fetch && git log origin/main..origin/$(git branch --show-current)', ), run(`gh api graphql -F branch="${branch}" -f query='${gqlQuery}'`), ]); if (!diff) { console.error(`⚠️ No active PR found for branch: ${branch}`); process.exit(1); } console.log(`\n# Current GitHub user info:\n\n${authInfo}\n`); console.log(`\n# PR diff for current branch: ${branch}\n\n\`\`\``); console.log(diff); console.log('```'); console.log( `\n# Commit history (origin/main..origin/${branch})\n\n${commits}`, ); const data = JSON.parse(rawJson || '{}'); const prs = data?.data?.repository?.pullRequests?.nodes || []; // Sort PRs by number descending so we check the newest one first prs.sort((a, b) => b.number - a.number); const pr = prs.find((p) => p.state === 'OPEN') || prs[0]; if (!pr) { console.error('❌ No PR data found.'); process.exit(1); } console.log('\n# PR Feedback\n'); // 1. General PR Comments const general = pr.comments.nodes.filter((c) => !shouldIgnore(c.body)); if (general.length > 0) { console.log('\n💬 GENERAL COMMENTS:'); general.forEach((c) => { const minimized = c.isMinimized ? ` (Minimized: ${c.minimizedReason})`