원클릭으로
handling-pr-comments
// Address PR review feedback systematically — fetch inline comments, review bodies, handle outside-diff-range comments, resolve threads with proper attribution
// Address PR review feedback systematically — fetch inline comments, review bodies, handle outside-diff-range comments, resolve threads with proper attribution
Interactive project setup — detects your project, configures metaswarm, writes project-local files
Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work
Diagnostic status report — shows metaswarm installation state, project setup, and potential issues
4-phase execution loop for work units - IMPLEMENT, VALIDATE, ADVERSARIAL REVIEW, COMMIT
Create comprehensive GitHub issues with TDD plans, acceptance criteria, and agent instructions for autonomous PR lifecycle management
Monitor a PR through to merge — handle CI failures, review comments, and thread resolution automatically until all checks pass
| name | handling-pr-comments |
| description | Address PR review feedback systematically — fetch inline comments, review bodies, handle outside-diff-range comments, resolve threads with proper attribution |
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