AgentSkillsCN

review-comments

审查 PR 上的评论,并在完成必要操作后,对每条评论进行回复并将其标记为已解决。您可以传入 PR 编号作为参数,也可以不传;如果不传入,则默认使用当前分支的 PR。

SKILL.md
--- frontmatter
name: review-comments
description: PR에 달린 리뷰 코멘트를 검토하고, 필요한 작업을 수행한 후, 각 코멘트에 reply를 달고 resolve합니다. PR 번호를 인자로 전달하거나 생략하면 현재 브랜치의 PR을 사용합니다.

PR Review Comments Handler

PR 리뷰 코멘트를 처리하는 워크플로우입니다.

사용법

code
/review-comments [PR번호]

PR 번호를 생략하면 현재 브랜치의 PR을 자동으로 찾습니다.

워크플로우

Step 1: PR 정보 확인

PR 번호가 주어지지 않은 경우:

bash
gh pr view --json number -q .number

Step 2: 리뷰 코멘트 및 스레드 정보 가져오기

GraphQL을 사용하여 코멘트와 스레드 ID를 한 번에 가져옵니다:

bash
gh api graphql -f query='
query($owner: String!, $repo: String!, $pr_number: Int!) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $pr_number) {
      reviewThreads(first: 100) {
        nodes {
          id
          isResolved
          comments(first: 50) {
            nodes {
              databaseId
              body
              path
              line
              diffHunk
              author { login }
            }
          }
        }
      }
    }
  }
}' -f owner="{owner}" -f repo="{repo}" -F pr_number={pr_number}

반환되는 주요 필드:

  • id (thread): 스레드 ID (resolve에 사용)
  • isResolved: 스레드 해결 여부
  • databaseId: 코멘트 ID (REST API의 comment id와 동일, reply에 사용)
  • body: 코멘트 내용
  • path: 파일 경로
  • line: 파일의 절대 라인 번호
  • diffHunk: 관련 diff 컨텍스트

Step 3: 각 코멘트 분석 및 처리

각 코멘트에 대해:

  1. 코멘트 내용을 읽고 요청사항 파악
  2. 제안의 적절성 판단:
    • 적절한 경우: suggestion 코드 블록이 있으면 적용, 필요한 코드 수정 수행, 변경사항 커밋 및 푸시
    • 부적절한 경우: 거부하고 거부 사유를 명확히 작성 (예: 기존 설계 의도와 충돌, 성능 저하, 범위 초과 등)

Step 4: Reply 달기

각 코멘트에 조치 내용을 reply로 작성:

bash
gh api repos/{owner}/{repo}/pulls/{pr_number}/comments/{comment_id}/replies \
  -f body="조치 내용을 여기에 작성"

Step 5: Thread Resolve

Step 2에서 가져온 스레드 ID를 사용하여 각 thread를 resolve합니다:

bash
gh api graphql -f query='
mutation {
  resolveReviewThread(input: {threadId: "{thread_id}"}) {
    thread { isResolved }
  }
}'

주의사항

  • Reply와 Resolve 전에 반드시 코드 변경을 먼저 커밋/푸시해야 함
  • Bot이 작성한 코멘트도 처리 대상에 포함됨 (Gemini Code Assist 등)
  • suggestion 블록이 있는 코멘트는 해당 코드를 적용
  • Thread ID와 Comment ID(databaseId)는 다름에 주의: reply에는 databaseId, resolve에는 thread id 사용
  • 거부 시에도 반드시 reply와 resolve를 수행 (거부 사유를 명확히 기재)
  • 거부 사유 예시: 설계 의도와 충돌, 과도한 추상화, 성능 저하, 범위 초과, 이미 다른 방식으로 해결됨

예시 출력

코멘트조치상태
Type Safety 개선 제안적용 완료✅ Resolved
Argument Parsing 개선적용 완료✅ Resolved
불필요한 추상화 제안거부: 현재 단일 사용처이며 과도한 추상화❌ Resolved