| name | reply-review-rust |
| description | /reply-review 커맨드로 실행되는 PR 리뷰 답장 스킬. /address-review 로 리뷰 대응을 완료한 후, 각 리뷰 코멘트에 대응한 취지(또는 대응 불필요로 판단한 이유)를 회신하는 스킬이다. 대응 불필요로 판단된 지적에 대해서는 /address-review가 제시한 coding-style.md §섹션 근거를 회신에 포함하여 리뷰어에게 명확히 전달한다. 인수 없이 실행하면 직전 대화의 리뷰 대응 요약을 자동 추출하여 사용한다. PR 번호 또는 GitHub URL을 지정하면 해당 PR 코멘트에 답장한다. 답장 게시 전 반드시 회신 목록을 사용자에게 제시하고 승인을 받는다. |
/reply-review 스킬
스킬 개요
이 스킬은 /reply-review 커맨드가 입력될 때 자동으로 실행된다.
/address-review로 리뷰 대응을 완료한 후, 각 PR 리뷰 코멘트에
대응 결과를 회신하는 스킬이다.
전제 조건:
/address-review 실행이 완료되어 있을 것
- 직전 대화에 리뷰 대응 요약(대응한 지적 / 대응 불필요 지적)이 포함되어 있을 것
핵심 불변 조건:
- 게시 전 승인 필수 — 회신 목록을 사용자에게 제시하고 명시적 승인 후에만 게시
- 중복 답장 금지 — 이미 답장된 코멘트는 건너뜀
- 코드 무수정 — 소스 파일을 절대 변경하지 않음
- 근거 전달 — 대응 불필요 판단 시
/address-review가 제시한 coding-style.md §섹션 근거를 회신에 포함하여 리뷰어에게 명확히 전달한다
커맨드 문법
/reply-review 직전 대화의 대응 요약 + PR 정보 자동 사용
/reply-review --pr 42 PR #42의 코멘트에 답장
/reply-review https://github.com/{owner}/{repo}/pull/42 URL로 지정
실행 모드 판별
인수 없음 → [대화 모드] ← 기본값
직전 대화에서 PR 번호 + 대응 요약 자동 추출
STEP 0-CONV → STEP 1 → STEP 2 → STEP 3 → STEP 4
--pr 42 → [PR 번호 모드]
지정 PR 번호 사용 + 직전 대화에서 대응 요약 추출
STEP 0-PR → STEP 1 → STEP 2 → STEP 3 → STEP 4
URL 있음 → [URL 모드]
URL에서 PR 번호 추출 + 직전 대화에서 대응 요약 추출
STEP 0-URL → STEP 1 → STEP 2 → STEP 3 → STEP 4
STEP 1~4는 모든 모드 공통이다.
[대화 모드] STEP 0-CONV — 직전 대화에서 PR 번호 및 대응 요약 추출
인수 없이 실행했을 때 이 단계를 따른다.
Claude가 직전 대화 이력에서 아래 두 가지를 자동으로 추출한다:
① PR 번호 추출 기준 (우선순위 순):
/address-review --pr [번호] 실행 기록
/code-review --pr [번호] 실행 기록
/code-review-feedback --pr [번호] 실행 기록
- 대화 중 언급된
PR #[번호] 패턴
② 대응 요약 추출 기준:
/address-review 출력 결과 내 ## 리뷰 대응 요약 섹션
- 대응한 지적 목록 (지적 ID, 수정 내용)
- 대응 불필요 지적 목록 (지적 ID, 이유)
추출 결과 출력 형식:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📥 직전 대화에서 정보 추출 완료
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PR 번호: #[번호]
대응 지적: [N]건 (수정 완료)
불필요 지적: [N]건 (현상 유지)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
추출 실패 시:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ 직전 대화에서 필요한 정보를 찾을 수 없습니다
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
확인 항목:
A: PR 번호 — /reply-review --pr [번호] 로 명시적으로 지정
B: 대응 요약 — /address-review 를 먼저 실행해 주세요
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[PR 번호 모드] STEP 0-PR / [URL 모드] STEP 0-URL
PR 번호 또는 URL을 지정했을 때 이 단계를 따른다.
PR_NUMBER=[파싱된 번호]
PR 번호를 확보한 후, 직전 대화에서 대응 요약만 추출한다.
대응 요약을 찾을 수 없으면 STEP 0-CONV와 동일한 실패 안내를 출력하고 종료한다.
STEP 1 — PR 리뷰 코멘트 수집 및 답장 상태 확인
Bash 도구로 아래 커맨드를 직접 실행한다:
gh api repos/{owner}/{repo}/pulls/{번호}/comments \
--jq '[.[] | {id, path, line, body: .body[:100], in_reply_to_id, user_login: .user.login}]'
gh api repos/{owner}/{repo}/pulls/{번호}/reviews \
--jq '[.[] | select(.state != "PENDING") | {id, state, body: .body[:100], user_login: .user.login}]'
수집 후 매핑:
직전 대화의 대응 요약에서 추출한 지적 ID를 PR 코멘트 ID에 연결한다.
연결 기준: 파일명·행번호·키워드 매칭으로 대응 요약의 각 지적을 실제 코멘트에 매핑한다.
수집 결과 출력 형식:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 PR #[번호] 코멘트 수집 완료
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
인라인 코멘트: [N]건 (루트 [N]건 / 기존 답장 [N]건 제외)
전체 리뷰: [N]건
답장 대상: [N]건
이미 답장됨: [N]건 (건너뜀)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 2 — 회신 초안 작성
각 답장 대상 코멘트에 대해 대응 요약을 바탕으로 회신 초안을 작성한다.
회신 형식
대응 완료 지적에 대한 회신:
수정했습니다. {수정 내용의 간결한 설명}
> 🤖 Claude Code
대응 불필요로 판단한 지적에 대한 회신:
/address-review의 평가 결과에서 coding-style.md §섹션 근거를 추출하여 포함한다.
확인했습니다만, 아래 이유로 현상 유지로 했습니다.
{대응 불필요로 판단한 이유}
📐 판단 근거: coding-style.md §{섹션번호} {섹션명}
{해당 시} 🔒 보완: {security-style.md §섹션 / security-style.md §섹션 / test-style.md §섹션}
> 🤖 Claude Code
근거 추출 우선순위:
/address-review 출력의 근거: coding-style.md §[섹션] [섹션명] — [판단 이유] 필드
- 추출 실패 시: 기술적 타당성 설명만으로 회신 (근거 행 생략)
대응 요약에서 매핑되지 않은 코멘트 (매핑 실패):
확인했습니다. 검토 후 별도로 회신드리겠습니다.
> 🤖 Claude Code
STEP 3 — 회신 목록 제시 및 명시적 승인
사용자의 명시적 승인("게시") 없이는 gh api를 절대 호출하지 않는다.
이 단계는 3개의 하위 단계로 구성된다:
3-1. 회신 요약 목록 출력
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 게시 예정 회신 목록 — 총 [N]건
대상: PR #[번호]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 종류 위치 대응 결과 회신 요약
─── ────────── ──────────────────── ─────────── ─────────────────────────────
1 인라인 src/handler.rs:42 ✅ 수정 완료 unwrap() → Result 전파로 교체
2 인라인 src/handler.rs:87 ✅ 수정 완료 tokio::Mutex로 교체
3 인라인 src/repo.rs:15 ❌ 현상 유지 의도적 clone — 소유권 이전 필요
4 전체리뷰 (리뷰 본문) ✅ 수정 완료 문서화 추가 완료
이미 답장된 코멘트: [N]건 (건너뜀)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
아래에 각 회신의 상세 내용을 보여드립니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3-2. 회신 상세 초안 출력
요약 목록 직후, 실제 GitHub에 게시될 회신 내용을 번호 순서대로 출력한다.
─── #1 인라인 회신 ──────────────────────
📍 위치: src/handler.rs : 42행
👤 리뷰어: [리뷰어명]
💬 원본: "[코멘트 원문 앞 50자]..."
🔖 대응: ✅ 수정 완료
--- 게시될 내용 ---
수정했습니다. `unwrap()`을 `?` 연산자를 사용한 Result 전파로 교체했습니다.
관련 커밋: fix(handler): [A-RV-01] unwrap() → Result 전파로 교체
> 🤖 Claude Code
---
─── #3 인라인 회신 ──────────────────────
📍 위치: src/repo.rs : 15행
👤 리뷰어: [리뷰어명]
💬 원본: "[코멘트 원문 앞 50자]..."
🔖 대응: ❌ 현상 유지
--- 게시될 내용 ---
확인했습니다만, 아래 이유로 현상 유지로 했습니다.
이 `clone()`은 `Order` 값을 비동기 태스크에 이동시키기 위해 의도적으로
사용하고 있습니다. `Arc<T>`로 대체하면 오히려 복잡성이 증가하여 현재
설계를 유지하는 것이 적합하다고 판단했습니다.
📐 판단 근거: coding-style.md §1 Domain First — 불필요한 추상화보다 현재 구조가 변경 비용이 낮음
> 🤖 Claude Code
---
3-3. 명시적 승인 게이트
상세 초안 출력 후 반드시 이 프롬프트를 출력하고 응답을 기다린다.
사용자가 응답하기 전까지 gh api 호출을 포함한 어떤 액션도 실행하지 않는다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚦 PR #[번호]에 위 [N]건의 회신을 게시합니다.
게시 후에는 GitHub에서 각 리뷰어가 확인할 수 있습니다.
응답해 주세요:
✅ "게시" / "ok" / "ㅇ" → 전체 게시 (STEP 4 실행)
✏️ "수정해줘: [번호] [요청]" → 해당 번호 회신 재작성 후 재확인
❌ "취소" / "stop" → 게시하지 않고 종료
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
응답별 처리:
| 응답 | Claude 행동 |
|---|
"게시" / "ok" / "ㅇ" | STEP 4 실행 (전체 게시) |
"수정해줘: 3 [요청]" | #3 회신 재작성 → 3-2 해당 항목만 재출력 → 3-3 재표시 |
"취소" / "stop" / "ㄴ" | 게시 없이 종료 |
STEP 4 — GitHub PR 코멘트에 회신 게시
STEP 3-3에서 "게시" 승인을 받은 경우에만 이 단계를 실행한다.
4-1. 인라인 코멘트 답장 게시
각 인라인 코멘트에 개별 답장을 게시한다:
gh api repos/{owner}/{repo}/pulls/{번호}/comments/{comment_id}/replies \
--method POST \
-f body="[회신 내용]"
4-2. 전체 리뷰 본문에 대한 답장 게시
전체 리뷰(review body)에 대한 답장은 issue comment로 게시한다:
gh api repos/{owner}/{repo}/issues/{번호}/comments \
--method POST \
-f body="[회신 내용]"
4-3. 게시 순서 및 오류 처리
- 인라인 코멘트 → 전체 리뷰 순서로 게시한다
- 특정 코멘트 게시 실패 시: 실패 건을 기록하고 나머지 계속 진행
- 모든 게시 완료 후 결과를 일괄 출력한다
4-4. 게시 결과 출력
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ PR #[번호] 회신 게시 완료
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
성공: [N]건
✅ #1 src/handler.rs:42 — 회신 게시됨
✅ #2 src/handler.rs:87 — 회신 게시됨
✅ #3 src/repo.rs:15 — 회신 게시됨
✅ #4 전체 리뷰 — 회신 게시됨
실패: [N]건 (있는 경우)
❌ #X [위치] — [오류 원인]
URL: [PR URL]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
게시 실패 시 안내:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❌ 일부 회신 게시 실패
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
확인 사항:
gh auth status 인증 상태 확인
comment_id가 유효한지 확인 (PR이 닫혔거나 코멘트 삭제 가능)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
주의사항
- 게시 전 승인 필수 — STEP 3-3의 명시적 승인 없이 gh api를 절대 호출하지 않는다
- 중복 답장 금지 —
in_reply_to_id가 있는 코멘트(기존 답장)와 이미 본인이 답장한 코멘트는 건너뛴다
- 소스 무수정 — Edit / Write 도구를 사용하지 않는다
- 매핑 실패 처리 — 대응 요약에서 매핑되지 않은 코멘트에는 확인 중 메시지를 게시한다
- coding-style.md 근거 전달 —
/address-review 출력에서 coding-style.md §섹션 근거를 추출하여 대응 불필요 회신에 반드시 포함한다. 근거를 추출할 수 없는 경우에만 생략한다
- 근거 창작 금지 — coding-style.md §섹션 근거는 반드시
/address-review 평가 결과에서 가져온다. Claude가 임의로 만들지 않는다
참조 파일
| 파일 | 용도 | 로드 시점 |
|---|
../../rules/coding-style.md | 대응 불필요 근거 검증 참조 | STEP 2 회신 초안 작성 시 (근거 검증용) |
../../rules/security-style.md | 보안 관련 대응 불필요 근거 검증 참조 | STEP 2 회신 초안 작성 시 (보안 근거 검증용) |
../../rules/test-style.md | 테스트 품질 관련 대응 불필요 근거 검증 참조 | STEP 2 회신 초안 작성 시 (테스트 근거 검증용) |