소스 정보
- 저장소
- existential-birds/beagle
- 최근 소스 활동
- 2026년 5월 31일 20:54
- 감지된 SKILL.md 언어
- 영어
- 스타
- 79
- 포크
- 8
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/existential-birds/beagle --skill respond-pr-feedback명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | respond-pr-feedback |
| description | Respond to review comments on a PR after evaluation and fixes |
| disable-model-invocation | true |
Post replies to review comments after you've evaluated the feedback and made fixes. Resolves conversation threads by default.
Invoke the respond-pr-feedback skill, optionally passing these flags:
respond-pr-feedback [--pr <number>] [--no-resolve]
Flags:
--pr <number> - PR number to target (default: current branch's PR)--no-resolve - Skip thread resolution after posting replies (default: resolve all)Run the fetch-pr-feedback skill first to evaluate the feedback and make any necessary fixes.
Advance only after each pass condition is met (objective checks—not assumed completion).
0; values parsed from gh pr view, gh repo view, and gh api user are non-empty and assigned to $PR_NUMBER, $PR_AUTHOR, $OWNER, $REPO, $CURRENT_USER—never invent owner, repo, or PR number.jq exits 0. If the filtered list is empty, output exactly All review comments have been addressed. and stop (do not call reply or GraphQL resolve APIs).gh api .../replies exits 0 before Step 5 attempts resolution for that item (unless --no-resolve).resolveReviewThread only when Step 3b provides a threadId for that comment’s id; if there is no mapping, skip resolution for that item without treating it as failure.Extract flags from $ARGUMENTS:
--pr <number> or detect from current branch--no-resolve flag (boolean, default false)# Get PR info (if --pr not specified, uses current branch)
gh pr view --json number,author --jq '{number, author: .author.login}'
# Get repo owner/name
gh repo view --json owner,name --jq '{owner: .owner.login, name: .name}'
# Get current authenticated user
gh api user --jq '.login'
Store as $PR_NUMBER, $PR_AUTHOR, $OWNER, $REPO, $CURRENT_USER.
Note: $OWNER, $REPO, etc. are placeholders. Substitute actual values from previous steps.
Fetch review comments, excluding PR author and current user, filtering to root comments that haven't been replied to.
Write the jq filter to a temp file using a heredoc with single-quoted delimiter (prevents shell escaping issues with !=, regex patterns, and angle brackets):
cat > /tmp/unreplied_comments.jq << 'JQEOF'
add // [] |
# Root comments from reviewers (not replies, not PR author, not current user)
[.[] | select(
.in_reply_to_id == null and
.user.login != $pr_author and
.user.login != $current_user
)] as $roots |
# IDs that current user has already replied to
[.[] | select(.user.login == $current_user) | .in_reply_to_id] as $replied |
# Filter to unreplied only
$roots | map(select(. as $c | $replied | index($c.id) == null)) |
# Dedup: group by path + line + reviewer, pick newest per group
group_by({
p: .path,
l: (.line // .original_line),
u: .user.login
}) |
map(sort_by(.created_at) | last) |
# Output needed fields
map({
id,
user: .user.login,
path,
line_display: (
.line as $end | .start_line as $start |
if $start and $start != $end then "\($start)-\($end)"
else "\($end // .original_line)" end
),
body
})
JQEOF
gh api --paginate "repos/$OWNER/$REPO/pulls/$PR_NUMBER/comments" | \
jq -s --arg pr_author "$PR_AUTHOR" --arg current_user "$CURRENT_USER" \
-f /tmp/unreplied_comments.jq
If no unreplied comments found, output: "All review comments have been addressed." and stop.
Fetch review thread IDs to enable resolution after posting replies:
gh api graphql -f query="
query {
repository(owner: \"$OWNER\", name: \"$REPO\") {
pullRequest(number: $PR_NUMBER) {
reviewThreads(first: 100) {
nodes {
id
isResolved
comments(first: 1) {
nodes { databaseId }
}
}
}
}
}
}
"
Build a lookup map: comment databaseId → thread id (unresolved threads only). This enables immediate resolution after posting each reply.
For each unreplied comment, determine the appropriate response based on your evaluation:
| Evaluation Outcome | Response |
|---|---|
| Feedback was incorrect/unfounded | Explain why the current code is correct |
| Feedback lacked context | Explain the design decision |
| Feedback was valid and fixed | "Fixed in $COMMIT_SHA" or brief description of change |
| Feedback was valid but won't fix | Explain the tradeoff/decision |
Tagging guideline: @-tag bot reviewers (e.g., @coderabbitai) to trigger their processing. Do not @-tag human reviewers.
Post reply to each comment:
gh api "repos/$OWNER/$REPO/pulls/$PR_NUMBER/comments/$COMMENT_ID/replies" \
-X POST --raw-field body="$RESPONSE"
This step runs by default. Skip only if --no-resolve was passed.
After posting each reply, look up the $THREAD_ID from the step 3b mapping using the comment's $COMMENT_ID:
gh api graphql -f query="
mutation {
resolveReviewThread(input: {threadId: \"$THREAD_ID\"}) {
thread { isResolved }
}
}
"
$COMMENT_ID has a matching thread ID in the lookup, resolve itGroup by reviewer:
### Reviewer: coderabbitai[bot]
| File:Line | Response Type | Thread |
|-----------|---------------|--------|
| `src/foo.ts:42` | Fixed in `abc1234` | Resolved |
| `src/bar.ts:15` | Explained design | Resolved |
### Reviewer: octocat
| File:Line | Response Type | Thread |
|-----------|---------------|--------|
| `src/baz.ts:7` | Won't fix | Resolved |
Footer:
**Threads resolved: 3/3**
@-tag bot reviewers to trigger re-processing; do not tag human reviewers# Respond to all reviewers on current PR (resolves threads)
respond-pr-feedback
# Respond on a specific PR
respond-pr-feedback --pr 123
# Respond without resolving threads
respond-pr-feedback --no-resolve