feat(github): add triage-prs skill - #84
Conversation
Package the previously personal triage-prs skill into the github plugin, made generic for reuse: - Remove the Todoist integration (no cross-plugin MCP dependency) - Keep the single scoped gh api call for removing review requests (the one operation the GitHub MCP server does not cover), degrading gracefully when gh is unavailable - Gate the needs-rebase auto-dismiss rule on Prow detection - Prefer the upstream remote over origin, with an optional owner/repo argument to override detection entirely - Resolve the git remote via dynamic context injection instead of a runtime Bash call - Replace list_commits (broken for fork PRs whose head branch is not in the base repo) with pull_request_read get_commits - Drop unused update_pull_request and the list_pull_requests probe (Prow detection now reuses the first collected PR) - Explicit invocation only (disable-model-invocation), since the skill dismisses notifications and mutes subscriptions Bump plugin to 1.3.0 and document the skill in the plugin and root READMEs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
|
Warning Review limit reached
Next review available in: 53 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe GitHub plugin now includes the ChangesGitHub PR triage
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant Triage as triage-prs skill
participant Shell
participant GitHub
participant Agent
participant Prow
participant Gh as gh CLI
User->>Triage: Invoke triage-prs
Triage->>Shell: Resolve repository and authenticated user
Triage->>GitHub: Search and investigate candidate PRs
Triage->>Agent: Investigate PRs in parallel
Agent-->>Triage: Return structured PR findings
Triage->>User: Present batched triage choices
User-->>Triage: Confirm selected actions
Triage->>Prow: Submit Prow commands when applicable
Triage->>GitHub: Apply GitHub updates and notification cleanup
Triage->>Gh: Remove review requests when required
Triage-->>User: Report completed actions
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
Adds a reusable, explicitly invoked PR triage skill to the GitHub plugin.
Changes:
- Adds parallel PR investigation, classification, and triage workflows.
- Documents repository detection, Prow handling, and notification actions.
- Bumps the GitHub plugin minor version.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
README.md |
Updates the GitHub plugin summary. |
github/skills/triage-prs/SKILL.md |
Defines the new triage workflow. |
github/README.md |
Documents the skill and behavior. |
github/.claude-plugin/plugin.json |
Bumps version to 1.3.0. |
Suppressed comments (2)
github/skills/triage-prs/SKILL.md:116
list_notificationsis paginated, so this lookup only examines its default page. When the repository has more notifications than that page size, an auto-classified PR may not be found and its promised dismiss/unsubscribe action is silently skipped. Traverse all pages (preferably once for all PRs in this phase) before matching subjects.
- **`dismiss`**: `list_notifications(owner, repo)`, find the thread(s) whose `subject.url` matches this PR, `dismiss_notification(threadID, state: "done")`. Do **not** call `manage_notification_subscription`.
github/skills/triage-prs/SKILL.md:165
- This second notification lookup also reads only the default page, so user-selected actions can fail to find and clear a matching thread when it lies on a later page. Explicitly paginate through all notification pages before matching the PR.
Call `list_notifications(owner, repo)`. For each notification matching this PR:
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Paginate every list endpoint in the investigation phase, and both notification lookups (fetched once per phase and reused across PRs) - Only ignore the PR subscription when the chosen action removed every role held on the PR; partial removals dismiss the notification only - Bound the investigation fan-out to parallel batches of 10 agents Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (5)
github/skills/triage-prs/SKILL.md:167
- This second notification lookup also defaults to unread threads, so actions on PRs whose notifications were previously read will not clear or unsubscribe anything. Request read notifications explicitly here as well.
Call `list_notifications(owner, repo)` once, paginating through all pages, and reuse the results across PRs. For each notification matching this PR:
github/skills/triage-prs/SKILL.md:63
- Only querying check runs omits Commit Status API contexts used by many external CI systems. This can report a PR as green (and recommend “Ready to merge”) while a legacy status is failing or pending; aggregate both status sources for every PR.
2. `pull_request_read(method: "get_check_runs")` — aggregate to: X/Y passing, Z failing [names], W pending
github/skills/triage-prs/SKILL.md:64
- Using the raw state of the most recent review can let a later
COMMENTEDreview hide an earlierCHANGES_REQUESTEDorAPPROVEDdecision, even though comments do not supersede decisive reviews on GitHub. Track the latest review timestamp separately from the effective decision used by the action rules.
3. `pull_request_read(method: "get_reviews")` — find your most recent review (state + date); note all other reviewers and their states; record whether USERNAME appears at all (any state) as `reviewed_before`
github/skills/triage-prs/SKILL.md:170
- This checks the chosen action rather than its outcome. The
ghremoval may be skipped as described above, and Prow commands are asynchronous or can fail; muting immediately can therefore suppress future notifications while the user is still assigned or requested. Re-read the PR and confirm every held role is actually gone before ignoring the subscription.
2. `manage_notification_subscription(notificationID, action: "ignore")` — **only if the chosen action removed every role you held on the PR** (unassign when you were only assigned, remove review request when you were only a reviewer, or both removals when you held both roles). If a role remains — e.g. "Unassign me" chosen but you're still a requested reviewer — dismiss only, so future activity still notifies you.
github/skills/triage-prs/SKILL.md:118
list_notificationsdefaults to unread threads. If the user already read this PR’s notification, this lookup finds nothing, so the requested dismiss/unsubscribe action is silently skipped. Include read notifications when building the reusable lookup.
This issue also appears on line 167 of the same file.
- **`dismiss`**: from the notification list (call `list_notifications(owner, repo)` once for this phase, paginating through all pages, and reuse it across PRs), find the thread(s) whose `subject.url` matches this PR, `dismiss_notification(threadID, state: "done")`. Do **not** call `manage_notification_subscription`.
Address remaining reviewer feedback on the triage-prs skill: - Include read notifications in both notification lookups (the API returns only unread threads by default, silently skipping dismissals) - Aggregate commit status contexts alongside check runs, since Prow and other external CI report via statuses - Derive the effective review decision from the latest APPROVED or CHANGES_REQUESTED review, so a later COMMENTED review doesn't hide it - Don't mute a PR subscription when a removal step was skipped Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (4)
github/skills/triage-prs/SKILL.md:7
- This user-facing description says bot-blocked PRs are merely auto-cleared, but Phase 4 automatically calls
manage_notification_subscription(action: "ignore")for Prowlgtm+approvedPRs, muting all future notifications. Disclose that automatic unsubscribe side effect here so invoking the skill is informed.
auto-clears notifications for closed or bot-blocked PRs, then presents
batched triage options to unassign, remove review requests, or unsubscribe.
github/skills/triage-prs/SKILL.md:170
- Posting a Prow command is not proof that the role was removed: the comment returns before Prow processes its webhook, and Tide detection does not guarantee that Prow's separately registered
assignplugin handles/unassignor/unccin this repo. Ignoring the subscription immediately can therefore mute future notifications while the user remains assigned or review-requested. Verify the resulting PR roles before unsubscribing.
1. `dismiss_notification(threadID, state: "done")`
2. `manage_notification_subscription(notificationID, action: "ignore")` — **only if the chosen action removed every role you held on the PR** (unassign when you were only assigned, remove review request when you were only a reviewer, or both removals when you held both roles) **and every removal step actually executed** (e.g. don't ignore when the `gh` call was skipped as unavailable). If a role remains or a removal was skipped, dismiss only, so future activity still notifies you.
github/skills/triage-prs/SKILL.md:47
- Both discovery queries exclude PRs that were already closed before invocation, so those PRs never reach the investigation or Phase 4 dismissal path. As a result, the advertised closed-PR notification cleanup only works for the narrow race where a PR closes after this search. Include notification-backed closed candidates (or another bounded closed-PR lookup) before classification so existing stale notifications can actually be cleared.
This issue also appears on line 169 of the same file.
search_pull_requests(query: "assignee:@me is:open", owner, repo)
search_pull_requests(query: "review-requested:@me is:open", owner, repo)
github/README.md:35
- The README describes
lgtm+approvedhandling as clearing notifications, but the skill actually unsubscribes withaction: "ignore", which also mutes future activity. This automatic side effect should be explicit in the usage documentation.
auto-clears notifications for closed PRs (and, on Prow-managed repos, for
`needs-rebase` and `lgtm`+`approved` PRs), then presents batched options to
unassign, remove review requests, or unsubscribe. Explicit invocation only —
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@github/skills/triage-prs/SKILL.md`:
- Around line 10-11: Add a restricted allowed-tools Bash permission for the git
remote get-url command in the allowed-tools section of SKILL.md, covering the
remote-detection invocation used by the skill while preserving the existing
command restrictions.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: c2a07e01-afa1-47d6-92b4-8b995f9f17e8
📒 Files selected for processing (4)
README.mdgithub/.claude-plugin/plugin.jsongithub/README.mdgithub/skills/triage-prs/SKILL.md
Token-efficiency pass over the triage-prs skill: - Classify PRs from search data before dispatching any agents: engagement now comes from commenter:@me / reviewed-by:@me searches, so kept, dismissed, and unsubscribed PRs never spawn an investigation subagent (previously every PR was investigated, and engaged PRs discarded the result) - Trim agent calls: get_files and get_comments read a single page; full pagination is reserved for reviews, commits, and review threads - Hoist the duplicated notification-lookup procedure into one shared definition used by both phases - Drop redundant prose and the now-constant Previously Engaged and State report lines Net effect: the skill body shrinks ~20% and auto-classified PRs cost zero agent contexts at runtime. Phase count drops from six to five. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
Reference GitHub MCP tools by short name throughout the skill body, with a one-line mapping note; allowed-tools keeps the fully qualified names required for permission matching. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (4)
github/skills/triage-prs/SKILL.md:54
- A single arbitrary candidate is not a reliable repository-wide Prow probe. Tide statuses are asynchronous and may be absent on a new, draft, or otherwise ineligible PR, so this can set
HAS_PROWfalse for a Prow repository and send every later classification/action down the non-Prow path. Detect Prow from multiple candidates or another repository-level signal before applying a global flag.
If no candidates: print "No open PRs found where you are assigned or a requested reviewer in OWNER/REPO." and stop.
github/skills/triage-prs/SKILL.md:45
- Both candidate searches are constrained to
is:open, so the subsequent closed/merged classification cannot discover closed PRs (except for a race where a result closes after the search). As a result, the advertised auto-dismissal of closed PR notifications does not run. Collect relevant closed notification threads separately, or remove the closed-PR behavior from the skill and its documentation.
```text
github/skills/triage-prs/SKILL.md:115
- Draft status is collected but has no action category. Because the first applicable category for an unreviewed draft is currently
Review needed(and an approved green draft can becomeReady to merge), the recommendation can contradict GitHub's draft state. Add a highest-priority draft/waiting category so drafts are not presented as actionable or mergeable.
**Action categories** (pick highest-priority that applies):
github/skills/triage-prs/SKILL.md:86
- Comparing commit dates with the review timestamp does not reliably identify changes since review: rebased or cherry-picked commits can retain older dates, and author/committer dates need not reflect when a commit entered the PR. Reviews expose the reviewed
commit_id; locate that SHA in the ordered PR commit list and use the commits after it, with an explicit fallback when a force-push removed the reviewed SHA.
3. `get_reviews` — date of your most recent review (any state); for your effective decision use your latest `APPROVED` or `CHANGES_REQUESTED` review, since a later `COMMENTED` review does not supersede it; note all other reviewers and their states
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (5)
github/skills/triage-prs/SKILL.md:140
- These option labels omit the subscription mutation performed later: for an assigned-only or reviewer-only PR, selecting the role-removal option also calls
ignoreand mutes all future activity. Because that is a stronger side effect than unassigning or removing a review request, make the unsubscribe effect explicit in every option that triggers it (or offer it as a separate choice).
| `assigned` only | Skip / Unassign me |
| `reviewer` only | Skip / Remove review request |
| both | Skip / Unassign me / Remove review request / Unsubscribe (both) |
github/skills/triage-prs/SKILL.md:49
- All four searches are constrained to
is:open, so an already closed or merged PR can never entercandidates; the closed/merged rule at line 60 and the advertised automatic cleanup are reachable only if a PR closes during the run. Add a separate collection path that starts from matching notification threads and fetches their PR state before restricting manual triage to open PRs.
```text
search_pull_requests(query: "assignee:@me is:open", owner, repo) # role: assigned
search_pull_requests(query: "review-requested:@me is:open", owner, repo) # role: reviewer
search_pull_requests(query: "commenter:@me is:open", owner, repo) # engagement
search_pull_requests(query: "reviewed-by:@me is:open", owner, repo) # engagement
github/skills/triage-prs/SKILL.md:92
get_commentshas no reverse-sort parameter, and GitHub issue comments are returned oldest-first by default, so this unqualified single page is the oldest 100 comments rather than the “most recent page.” Active PRs will omit exactly the recent mentions and questions this step is intended to surface. Fetch the final page from pagination metadata, falling back to full pagination when needed.
7. `get_comments(perPage: 100)` — most recent page only; note mentions or questions directed at you
Paginate `get_reviews`, `get_commits`, and `get_review_comments` fully (`perPage: 100`; cursor via `after` for `get_review_comments`). Steps 4 and 7 deliberately read a single page.
github/skills/triage-prs/SKILL.md:165
- For Prow PRs, successfully posting
/unassignor/uncconly queues an asynchronous bot command; it does not establish that the role was removed. This can immediately ignore the thread even if Prow later rejects or fails to process the command, leaving a still-assigned reviewer with muted notifications. Re-read the PR and confirm the selected roles are absent before ignoring; otherwise dismiss only and report the removal as pending.
1. `dismiss_notification(threadID, state: "done")`
2. `manage_notification_subscription(notificationID, action: "ignore")` — **only if the chosen action removed every role you held on the PR** (unassign when you were only assigned, remove review request when you were only a reviewer, or both removals when you held both roles) **and every removal step actually executed** (e.g. don't ignore when the `gh` call was skipped as unavailable). If a role remains or a removal was skipped, dismiss only, so future activity still notifies you.
github/README.md:34
- This documentation says closed PR notifications are cleared, but the skill builds candidates exclusively from
is:opensearches, so PRs that are already closed or merged are never inspected. Either add the closed-notification collection path to the skill or remove this claim.
- **triage-prs** (`/github:triage-prs [owner/repo]`) — triages open PRs where you are
assigned or a requested reviewer. Auto-classifies PRs from search data first —
skipping ones you've already engaged with, and clearing notifications for closed
PRs (and, on Prow-managed repos, for `needs-rebase` and `lgtm`+`approved` PRs) —
Address reviewer findings on the restructured skill: - get_comments returns oldest-first, so a single unqualified page read the oldest comments; follow pagination to the final page instead - Anchor changes-since-review on the review's commit_id rather than commit dates, which rebases and cherry-picks can falsify - Probe up to three candidates for Prow detection, since new or draft PRs may have no status contexts yet - Add a Draft action category so drafts aren't recommended for review or merge - Confirm role removal (re-read the PR after async Prow commands) before muting a subscription, and disclose the mute side effect in triage option descriptions - Stop claiming closed-PR notification cleanup in the docs; is:open collection only catches PRs that close mid-run Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (3)
github/skills/triage-prs/SKILL.md:48
- Both candidate queries exclude already-closed PRs, so the later closed/merged classification cannot clear their notifications except in a narrow close-after-search race. This contradicts the PR description's claim that closed PR notifications are auto-cleared. Either collect assigned/review-requested PRs without the open-only filter and classify their state, or narrow the stated behavior to race handling.
search_pull_requests(query: "assignee:@me is:open", owner, repo) # role: assigned
search_pull_requests(query: "review-requested:@me is:open", owner, repo) # role: reviewer
github/skills/triage-prs/SKILL.md:93
get_check_runsis paginated by the GitHub MCP server, but this instruction omits it from the methods that must be paginated. PRs with more than one page of checks will therefore produce incomplete pass/fail/pending totals and may receive the wrong triage recommendation. Includeget_check_runsin the full-pagination list.
Paginate `get_reviews`, `get_commits`, and `get_review_comments` fully (`perPage: 100`; cursor via `after` for `get_review_comments`). Step 4 deliberately reads a single page.
github/skills/triage-prs/SKILL.md:160
- Updating
assigneesreplaces the complete assignee list, but the workflow never requires a fresh read before constructing it; the available Phase 2/3 data can be stale by the time batched triage finishes. If another assignee was added meanwhile, this update silently removes them. Re-read the PR immediately before the mutation and derive the replacement list from that response.
- Unassign: `issue_write(method: "update", owner, repo, issue_number: PR, assignees: [all current assignees except USERNAME])`
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
github/skills/triage-prs/SKILL.md (1)
25-27: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winMention review-request removal in the skill description.
Line 27 lists unassignment and unsubscribe, but not removal of review requests. Update the description so command discovery matches the available actions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@github/skills/triage-prs/SKILL.md` around lines 25 - 27, Update the “Triage PRs” skill description to explicitly mention removing review requests alongside unassigning and unsubscribing, so the listed actions match the available command behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@github/skills/triage-prs/SKILL.md`:
- Line 57: Update the Detect Prow procedure to inspect every Prow-like
candidate, rather than stopping at the first status-bearing PR or after three
empty candidates. For each candidate, call pull_request_read(method:
"get_status") and set HAS_PROW true immediately when any context name contains
"tide"; otherwise continue until a tide context is found or all candidates are
exhausted.
- Line 87: Update the effective-decision logic described in get_reviews to
exclude DISMISSED reviews, including dismissed CHANGES_REQUESTED reviews, when
selecting the latest active APPROVED or CHANGES_REQUESTED review; retain
DISMISSED reviews only as inactive history and preserve the existing handling of
other reviewers and states.
- Around line 47-50: Update the Phase 2 discovery searches in SKILL.md to
include a separate path for existing closed or merged pull requests, rather than
limiting all four role-based queries to is:open. Ensure discovered closed/merged
PRs reach the existing classification and notification-cleanup logic while
preserving the current open-PR searches.
---
Outside diff comments:
In `@github/skills/triage-prs/SKILL.md`:
- Around line 25-27: Update the “Triage PRs” skill description to explicitly
mention removing review requests alongside unassigning and unsubscribing, so the
listed actions match the available command behavior.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: c705f844-e1ab-4af8-a216-0a3b7d4896da
📒 Files selected for processing (2)
github/README.mdgithub/skills/triage-prs/SKILL.md
🚧 Files skipped from review as they are similar to previous changes (1)
- github/README.md
…e-prs - Keep probing candidates for a tide status context instead of stopping at the first PR that has any statuses; cap at five candidates - Exclude DISMISSED reviews from the effective review decision - Mention review-request removal in the skill intro alongside unassign and unsubscribe Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
…ests - Count only status-bearing candidates toward the five-candidate Prow detection cutoff; status-less PRs are uninformative - Keep a rolling last-100 comment buffer instead of only the final page, which can be short - Never delete a team-based review request (that removes it for the whole team); report it as team-scoped and offer unsubscribe instead Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (2)
github/skills/triage-prs/SKILL.md:66
- A PR that has been re-requested for review after a previous review appears in both
review-requested:@meandreviewed-by:@me, so this rule classifies it askeepand excludes it from investigation. That silently drops an active review request and also makes the later “Author addressed feedback” and “Re-review needed” paths effectively unreachable. Keep its notification untouched if desired, but route currently review-requested engaged PRs into the manual investigation path.
2. **Engaged** → `keep` (already invested — leave its notification alone and exclude it from all later phases)
README.md:20
- This still says all toolsets are enabled, but
github/.mcp.json:9explicitly enables a selected list andgithub/README.md:3describes them as selected toolsets. Use the same wording here so the marketplace summary accurately reflects the plugin configuration.
| [github](./github) | GitHub MCP server with all toolsets enabled, always loaded, plus a PR triage skill |
Push review fixes once per round (after all bot reviewers finish with the current head) rather than once per reviewer, and pause CodeRabbit auto-reviews during iterative push bursts, so its rate-limited incremental reviews aren't burned on intermediate states. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Suppressed comments (1)
github/skills/triage-prs/SKILL.md:163
- Team-scoped review requests currently have no executable triage action. This branch refuses to remove the team request and says the user can only unsubscribe, but Phase 4 offers a reviewer-only PR only “Skip” or “Remove review request,” while Phase 5 permits
ignoreonly after every role is removed—which cannot happen for the team role. Add a team-request-aware unsubscribe choice and allow that explicit choice to dismiss/ignore the notification without deleting the team's review request; the request source also needs to be carried back from the investigation so Phase 4 can present the right options.
- Remove review: `gh api repos/OWNER/REPO/pulls/PR/requested_reviewers -X DELETE -f 'reviewers[]=USERNAME'` (no GitHub MCP tool can remove a review request). If the request is team-based — USERNAME absent from `requested_reviewers` but a team appears in `requested_teams` — do **not** delete the team's request (that would remove it for every teammate); report that the request came via the team and can only be unsubscribed from, not individually removed. If `gh` is unavailable or unauthenticated, skip this call, note in the final summary that the review request must be removed manually, and continue with the remaining actions.
Batched fixes for all outstanding reviewer findings on the current head, per the new one-push-per-review-round convention: - Drop the vestigial yellow CI state the aggregation can never produce - Paginate get_check_runs and get_status fully so multi-page CI can't read as green - Re-read the PR before unassigning, since issue_write replaces the whole assignee set and stale data would drop new assignees - Give team-based review requests an executable path: agents report the request source, triage offers Unsubscribe instead of an impossible removal, and an explicit Unsubscribe choice may mute without role removal - Correct the root README's "all toolsets" claim to match .mcp.json Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
github/skills/triage-prs/SKILL.md:87
pull_request_read(method: "get")cannot supply the requested team information: the GitHub MCP server'sMinimalPullRequestincludesrequested_reviewersbut omitsrequested_teams. Team-only requests therefore cannot be classified as instructed, so the later team-specific option and safety check may never activate. Please infer a team request from the search result plus the absence ofUSERNAMEinrequested_reviewers, or add a supported lookup for requested teams and update the related checks.
1. `get` — title, author, draft status, labels, timestamps; whether your review request is individual (USERNAME in `requested_reviewers`) or team-based (only via `requested_teams`)
github/skills/triage-prs/SKILL.md:95
- The MCP implementation ignores
page/perPageforget_statusand callsGetCombinedStatus(..., nil). Attempting to paginate it therefore repeats the same default page and can loop or incorrectly claim a complete CI summary when more status contexts exist. Callget_statusonce and explicitly mark the status summary incomplete when its reported total exceeds the returned contexts.
Paginate `get_reviews`, `get_commits`, `get_review_comments`, `get_check_runs`, and `get_status` fully (`perPage: 100`; cursor via `after` for `get_review_comments`). Step 4 deliberately reads a single page.
|
|
||
| If no candidates: report the sweep result, print "No open PRs found where you are assigned or a requested reviewer in OWNER/REPO." and stop. | ||
|
|
||
| **Detect Prow:** call `pull_request_read(method: "get_status")` on candidates in order, setting `HAS_PROW = true` as soon as any context name contains `"tide"`. A candidate with other statuses but no tide context is not proof of absence — keep checking. Conclude non-Prow after five candidates that returned status contexts but none containing tide (status-less candidates, such as new or draft PRs, don't count toward the five), or when candidates are exhausted. |
Batched fixes from Copilot's review of the previous round: - Match the Prow tide status context exactly; a substring match could classify unrelated CI (e.g. tideways) as Prow and trigger bot commands and auto-unsubscribes on a non-Prow repo - Infer team-based review requests from the reviewer role plus USERNAME's absence from requested_reviewers, since the MCP get response omits requested_teams entirely - Call get_status once and flag an incomplete CI summary via total_count, since the server ignores pagination for it Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
Trim accumulated wording from the review-hardening rounds — no behavior changes — to clear the skillsaw context-budget warning that failed CI's lint check (3,081 tokens vs the 3,000 warn limit). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Suppressed comments (3)
github/skills/triage-prs/SKILL.md:146
- When a candidate has both roles and the review request is team-based, this literal replacement yields both
UnsubscribeandUnsubscribe (both). The user cannot tell which choice also removes the assignment, and the executor cannot map the duplicated action names reliably. Define distinct labels and semantics for keeping versus removing the assignment.
When the review request is team-based, replace "Remove review request" with "Unsubscribe" — a team request can't be individually removed, so muting is the only opt-out.
github/skills/triage-prs/SKILL.md:93
- Combining the final page with the entire prior page retains 101–199 comments whenever the final page is short, rather than the stated newest ~100. That can nearly double every subagent's comment context on active PRs. Combine the pages only long enough to slice the newest 100 comments.
7. `get_comments(perPage: 100)` — issue comments are oldest-first, so if the first page is full, follow pagination and keep the most recent ~100 comments (the final page plus the prior page when the final page is short). Note mentions or questions directed at you.
github/skills/triage-prs/SKILL.md:90
- This single-page read underreports large PRs: summing this page's additions/deletions and displaying
100+loses the complete totals for PRs with more than 100 files, even though the precedinggetresponse provideschanged_files,additions, anddeletions. Use those PR-level values for totals and reserve this page for selecting key filenames.
This issue also appears in the following locations of the same file:
- line 93
- line 146
4. `get_files(perPage: 100)` — first page only; file count ("100+" if truncated), key filenames, additions/deletions
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Suppressed comments (2)
github/skills/triage-prs/SKILL.md:90
- This single-page read cannot provide complete additions/deletions for PRs with more than 100 files, so the required
Filessummary can underreport its totals. The precedinggetresponse already provides PR-levelchanged_files,additions, anddeletions; use those complete values and reserve this page for selecting filenames.
4. `get_files(perPage: 100)` — first page only; file count ("100+" if truncated), key filenames, additions/deletions
github/skills/triage-prs/SKILL.md:146
- For a PR with both roles and a team-based request, literal replacement creates both
UnsubscribeandUnsubscribe (both). Those labels do not establish whether the assignment should also be removed, so the executor can apply the wrong action. Define distinct option sets and semantics for this case.
When the review request is team-based, replace "Remove review request" with "Unsubscribe" — a team request can't be individually removed, so muting is the only opt-out.
|
@coderabbitai review Generated by Claude Code |
|
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@README.md`:
- Line 20: Update the README table entry for the GitHub component so “always
loaded” clearly modifies the PR triage skill, using the wording “GitHub MCP
server with selected toolsets enabled, plus an always-loaded PR triage skill.”
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 4c3ab2d7-d8b7-4228-b1fe-1a6a5f8ce228
📒 Files selected for processing (3)
CLAUDE.mdREADME.mdgithub/skills/triage-prs/SKILL.md
🚧 Files skipped from review as they are similar to previous changes (1)
- CLAUDE.md
The comma chain read ambiguously; the always-loaded component is the MCP server (alwaysLoad in .mcp.json), not the on-demand triage skill. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Suppressed comments (2)
github/skills/triage-prs/SKILL.md:38
- This only stops for
__NO_REMOTE__. If a remote exists but is not one of the two recognized forms (for examplessh://git@github.com/OWNER/REPO.gitor a non-GitHubupstream), parsing leaves no validOWNER/REPOand the workflow proceeds into MCP andghcalls with invalid repository data. Validate parse success and stop with the argument-override message when detection cannot produce a valid GitHub repository.
**Repo identity:** if the repo argument above is non-empty, parse it as `OWNER/REPO`. Otherwise parse the detected remote URL — SSH (`git@github.com:OWNER/REPO.git`) or HTTPS (`https://github.com/OWNER/REPO`). If it is `__NO_REMOTE__` and no argument was given, print "No GitHub remote detected — re-run as `/github:triage-prs owner/repo`." and stop.
github/skills/triage-prs/SKILL.md:66
reviewed-by:@meis precisely the signal that a prior review exists, so this rule excludes every such candidate before Phase 3. A PR explicitly re-requested after new commits becomes bothreviewerandengagedand is skipped, while the later “Author addressed feedback”, “Re-review needed”, and “Waiting on author” paths are normally unreachable. Either allow currently review-requested PRs with prior reviews intomanual, or remove the dead review-history workflow and categories.
2. **Engaged** → `keep` (already invested — leave its notification alone and exclude it from all later phases)
Packages a previously personal
triage-prsskill into thegithubplugin, made generic for reuse.The skill (
/github:triage-prs [owner/repo], explicit invocation only) triages open PRs where you are assigned or a requested reviewer:needs-rebasePRs have their notifications dismissed whilelgtm+approvedPRs are unsubscribed — all before any subagent spawns.AskUserQuestion, with options to unassign, remove review requests, or unsubscribe. Subscriptions are muted only when every role you held was confirmably removed.Genericization
gh apicall for removing review requests (the one operation the GitHub MCP server does not cover), degrading gracefully whenghis unavailable.tidestatus context); theneeds-rebaseauto-dismiss only fires on Prow repos.upstreamremote overoriginfor fork workflows, resolved via dynamic context injection rather than a runtime Bash call, with an optionalowner/repoargument override.Robustness hardening (largely from Copilot/CodeRabbit review rounds)
filter: "include_read_notifications") and paginate fully, fetched once per phase.DISMISSEDreviews and is not superseded by laterCOMMENTEDreviews.list_commitscall had).Draftaction category so drafts are never recommended for review or merge.disable-model-invocation: true— the skill dismisses notifications and mutes subscriptions, so only the user can invoke it.Token efficiency
Housekeeping
1.2.0→1.3.0(minor: new skill).Validation
claude plugin validate .andclaude plugin validate ./githubpass.markdownlint-cli2: 0 issues;uvx skillsaw --strict: 0 errors, 0 warnings, grade A.🤖 Generated with Claude Code
https://claude.ai/code/session_01HjR9S1B6GLtPLBU1d596yK
Summary by CodeRabbit
New Features
Documentation
Chores
Summary by CodeRabbit
New Features
ghCLI fallback support.Documentation
Chores