From metaswarm
Addresses GitHub PR review feedback systematically: fetches inline comments and review bodies, handles outside-diff-range comments, triages by priority, resolves threads with attribution.
npx claudepluginhub dsifry/metaswarmThis skill uses the workspace's default tool permissions.
Use when addressing PR review feedback, after receiving review comments from CodeRabbit, Cursor, or human reviewers - ensures systematic responses to each comment thread with proper attribution and thread resolution.
Reads open GitHub PR review comments, triages by severity and type, applies code fixes, and drafts replies. Use for addressing PR feedback, fixing review issues, and responding to code reviews.
Interactively addresses GitHub PR review feedback: verifies each comment against code, confirms fixes with user, applies changes, and posts responses.
Fetches unresolved GitHub PR comments and threads, analyzes reviewer feedback, implements fixes, builds/tests, commits/pushes changes, replies to comments, and resolves threads.
Share bugs, ideas, or general feedback.
Use when addressing PR review feedback, after receiving review comments from CodeRabbit, Cursor, or human reviewers - ensures systematic responses to each comment thread with proper attribution and thread resolution.
Activate this skill when ANY of these conditions are true:
Most developers forget steps 4-6. This skill ensures they happen.
Run the filtering script to identify actionable comments:
# Filter actionable vs non-actionable comments
bin/pr-comments-filter.sh <PR_NUMBER>
This script:
The filter script categorizes by priority:
| Priority | Marker | Action |
|---|---|---|
| CRITICAL | _⚠️ Potential issue_ | _🔴 Critical_ | Fix immediately |
| HIGH | _⚠️ Potential issue_ | _🟠 Major_ | Fix before merge |
| MEDIUM | _🟡 Minor_ or _🛠️ Refactor suggestion_ | _🟠 Major_ | Should fix |
| LOW | _🔵 Trivial_ / _🧹 Nitpick_ | Fix if quick |
| HUMAN | Non-bot comments | Always process |
For each actionable comment, further categorize as:
COMMONLY MISSED: CodeRabbit posts "Outside diff range" comments in the review body, not as inline threads. These are actionable feedback that MUST be addressed.
# Extract Outside diff range comments from review bodies
PR_NUMBER=<number>
OWNER=$(gh repo view --json owner -q .owner.login)
REPO_NAME=$(gh repo view --json name -q .name)
echo "=== OUTSIDE DIFF RANGE COMMENTS ==="
gh api "repos/$OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" --paginate | \
jq -r '.[] | select(.body | test("Outside diff range"; "i")) |
"Review ID: \(.id)\n\(.body)\n---"'
These comments are NOT in threads - they cannot be replied to inline. You must:
Run the out-of-scope detection script:
# Detect out-of-scope comments
bin/pr-comments-out-of-scope.sh <PR_NUMBER>
This script detects comments that:
isOutdated flag)IMPORTANT: Treat out-of-scope comments as IN SCOPE by default.
Use ultrathink to evaluate each out-of-scope comment:
ultrathink: Analyze this out-of-scope review comment:
- What is the reviewer asking for?
- How complex is this change? (lines of code, files affected)
- Does it require refactoring other systems?
- Can I complete this in under 30 minutes?
- Are there any risks or dependencies?
Recommend: FIX_NOW or CREATE_ISSUE
| Criteria | Action |
|---|---|
| Simple fix (< 30 min, < 3 files, no refactor) | FIX_NOW - Make the change immediately |
| Medium complexity (unclear scope) | ASK_USER - Present options |
| Major refactor (multiple systems, risky) | CREATE_ISSUE - Document for follow-up |
Fix the actual code issues. Commit and push.
After pushing fixes, respond to EACH comment thread individually:
PR_NUMBER=<number>
OWNER=$(gh repo view --json owner -q .owner.login)
REPO_NAME=$(gh repo view --json name -q .name)
CURRENT_USER=$(gh api user -q '.login')
COMMENT_ID=<id-from-filter-script>
gh api "/repos/$OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments/$COMMENT_ID/replies" \
-X POST \
-f body="Fixed in commit $(git rev-parse --short HEAD).
*(Response by Claude on behalf of @$CURRENT_USER)*"
Every thread must be resolved after responding. Use GraphQL to resolve:
THREAD_ID="PRRT_kwDOK-xA485..." # From GraphQL query
gh api graphql -f query='mutation {
resolveReviewThread(input: {threadId: "'"$THREAD_ID"'"}) {
thread { id isResolved }
}
}'
THE #1 WORKFLOW FAILURE: Stopping after Phase 5-6 without checking for NEW comments.
Automated reviewers (CodeRabbit, Cursor) analyze EVERY commit you push. They post NEW comments during/after their check runs.
# STEP 1: Wait for ALL CI/CD checks to complete
PR_NUMBER=<number>
echo "Waiting for CI/CD checks to complete..."
gh pr checks $PR_NUMBER --watch
# STEP 2: Check for NEW comments since your last response
OWNER=$(gh repo view --json owner -q .owner.login)
REPO_NAME=$(gh repo view --json name -q .name)
CURRENT_USER=$(gh api user -q '.login')
# Get timestamp of your last reply
LAST_REPLY=$(gh api "repos/$OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments" --paginate | \
jq -r "[.[] | select(.user.login == \"$CURRENT_USER\") | select(.in_reply_to_id)] | sort_by(.created_at) | last | .created_at")
# Handle case where user has no previous replies
if [ -z "$LAST_REPLY" ] || [ "$LAST_REPLY" = "null" ]; then
echo "No previous replies found - checking all comments as new"
LAST_REPLY="1970-01-01T00:00:00Z" # Unix epoch - treat all comments as new
fi
# Check for new comments after that time
NEW_COUNT=$(gh api "repos/$OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments" --paginate | \
jq -r --arg time "$LAST_REPLY" '[.[] | select(.in_reply_to_id == null) | select(.created_at > $time)] | length')
# STEP 3: Also check review bodies for new "Outside diff range" comments
NEW_REVIEWS=$(gh api "repos/$OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" --paginate | \
jq -r --arg time "$LAST_REPLY" '[.[] | select(.submitted_at > $time) | select(.body | test("Outside diff range"; "i"))] | length')
TOTAL_NEW=$((NEW_COUNT + NEW_REVIEWS))
if [ "$TOTAL_NEW" -gt 0 ]; then
echo "$NEW_COUNT NEW INLINE COMMENT(S) + $NEW_REVIEWS NEW REVIEW BODY COMMENT(S) DETECTED"
echo "ACTION: Return to Phase 1 and iterate"
else
echo "No new comments - safe to proceed to verification"
fi
If NEW comments found: Return to Phase 1. DO NOT proceed to verification.
Iteration Loop:
REPEAT:
Phase 1: Discover comments
Phase 2: Triage
Phase 3: Fix
Phase 4: Respond
Phase 5: Resolve threads
Phase 6: Handle unclear threads
Phase 7: Check for NEW comments after push
IF new comments found → GO TO Phase 1
IF no new comments → proceed to verification
Fixed in commit <hash>.
*(Response by Claude on behalf of @username)*
Acknowledged - this is a valid suggestion. Deferring to a future cleanup PR to keep this PR focused.
*(Response by Claude on behalf of @username)*
This is intentional because [reason]. The [thing] is designed to [explanation].
*(Response by Claude on behalf of @username)*
BLOCKING: You MUST run this script and show its output before declaring ANY PR ready:
bin/pr-comments-check.sh <PR_NUMBER>
This script:
If the script shows ANY unaddressed comments, you are NOT done. Address each unaddressed comment:
You must show the script output in your response as proof that all comments are addressed. Example:
Checking PR #908 for unaddressed comments...
=== Inline Code Review Comments ===
Comment 123 by cursor[bot] - 1 reply(s) [OK]
Comment 456 by coderabbitai[bot] - 1 reply(s) [OK]
=== General PR Discussion Comments ===
coderabbitai[bot]: <!-- summary -->...
All inline review comments have been addressed
A PR is NOT ready until this script returns success.
Before declaring PR comments handled:
bin/pr-comments-filter.sh <PR> to identify actionable commentsbin/pr-comments-out-of-scope.sh <PR> to find other out-of-scope feedbackDO NOT skip the "Outside diff range" check (Phase 2b) - this is the #2 cause of incomplete PR handling.
For the complete detailed workflow with all edge cases and troubleshooting, see:
the /metaswarm:handle-pr-comments command