mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-06-11 21:13:32 -07:00
update
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# GitHub Workflow Primitives
|
||||
|
||||
GitHub-specific commands and data-handling rules for CodeRabbit review-thread based skills.
|
||||
|
||||
Use this helper when a skill needs thread-aware CodeRabbit PR feedback, not flat PR summaries. The `autofix` skill mirrors the required execution flow in `SKILL.md`; this file exists as a reusable companion for other skills.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- `gh` authenticated (`gh auth status`)
|
||||
- current branch associated with a GitHub repository
|
||||
|
||||
## 1. Resolve Current PR
|
||||
|
||||
Get the PR number for the current branch:
|
||||
|
||||
```bash
|
||||
pr_number=$(gh pr list --head "$(git branch --show-current)" --state open --json number --jq '.[0].number')
|
||||
|
||||
if [ -z "$pr_number" ] || [ "$pr_number" = "null" ]; then
|
||||
# no open PR for this branch
|
||||
fi
|
||||
```
|
||||
|
||||
If no PR exists and the user wants one created, derive title/body from the latest commit:
|
||||
|
||||
```bash
|
||||
title=$(git log -1 --pretty=format:'%s')
|
||||
body=$(git log -1 --pretty=format:'%b')
|
||||
gh pr create --title "$title" --body "${body:-Auto-created by CodeRabbit autofix}"
|
||||
```
|
||||
|
||||
## 2. Resolve Repository Coordinates
|
||||
|
||||
```bash
|
||||
owner=$(gh repo view --json owner --jq '.owner.login')
|
||||
repo=$(gh repo view --json name --jq '.name')
|
||||
```
|
||||
|
||||
## 3. Fetch Thread-Aware CodeRabbit Feedback
|
||||
|
||||
Fetch review threads with GitHub GraphQL using cursor pagination:
|
||||
|
||||
```bash
|
||||
all_threads='[]'
|
||||
cursor=""
|
||||
|
||||
while :; do
|
||||
args=(-F owner="$owner" -F repo="$repo" -F pr="$pr_number")
|
||||
if [ -n "$cursor" ]; then
|
||||
args+=(-F cursor="$cursor")
|
||||
fi
|
||||
|
||||
response=$(gh api graphql "${args[@]}" -f query='query($owner:String!, $repo:String!, $pr:Int!, $cursor:String) {
|
||||
repository(owner:$owner, name:$repo) {
|
||||
pullRequest(number:$pr) {
|
||||
title
|
||||
reviewThreads(first:100, after:$cursor) {
|
||||
pageInfo {
|
||||
hasNextPage
|
||||
endCursor
|
||||
}
|
||||
nodes {
|
||||
isResolved
|
||||
isOutdated
|
||||
comments(first:1) {
|
||||
nodes {
|
||||
databaseId
|
||||
body
|
||||
path
|
||||
line
|
||||
startLine
|
||||
originalLine
|
||||
author { login }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}')
|
||||
|
||||
all_threads=$(jq -c --argjson response "$response" '
|
||||
. + $response.data.repository.pullRequest.reviewThreads.nodes
|
||||
' <<<"$all_threads")
|
||||
|
||||
has_next=$(jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.hasNextPage' <<<"$response")
|
||||
cursor=$(jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.endCursor // empty' <<<"$response")
|
||||
[ "$has_next" = "true" ] || break
|
||||
done
|
||||
```
|
||||
|
||||
Treat only these threads as actionable:
|
||||
|
||||
- root comment author is `coderabbitai`, `coderabbit[bot]`, or `coderabbitai[bot]`
|
||||
- `isResolved == false`
|
||||
- `isOutdated == false`
|
||||
|
||||
Keep each selected thread as one issue unit. Do not collapse top-level PR comments or review summaries into issue records.
|
||||
|
||||
To detect CodeRabbit's "Come back again in a few minutes" status message, use top-level PR comments/reviews separately:
|
||||
|
||||
```bash
|
||||
gh pr view "$pr_number" --json comments,reviews --jq '
|
||||
[
|
||||
(.comments[]?
|
||||
| select(.author.login == "coderabbitai" or .author.login == "coderabbit[bot]" or .author.login == "coderabbitai[bot]")
|
||||
| .body // empty),
|
||||
(.reviews[]?
|
||||
| select(.author.login == "coderabbitai" or .author.login == "coderabbit[bot]" or .author.login == "coderabbitai[bot]")
|
||||
| .body // empty)
|
||||
]
|
||||
| map(select(test("Come back again in a few minutes")))
|
||||
| length
|
||||
'
|
||||
```
|
||||
|
||||
## 4. Post Summary Comment
|
||||
|
||||
Use the same `pr_number` from Section 1:
|
||||
|
||||
```bash
|
||||
gh pr comment "$pr_number" --body "$(cat <<'EOF'
|
||||
## Fixes Applied Successfully
|
||||
|
||||
Fixed <file-count> file(s) based on <issue-count> CodeRabbit feedback item(s).
|
||||
|
||||
**Files modified:**
|
||||
- `path/to/file-a.ts`
|
||||
- `path/to/file-b.ts`
|
||||
|
||||
**Commit:** `<commit-sha>`
|
||||
|
||||
The latest autofix changes are on the `<branch-name>` branch.
|
||||
|
||||
EOF
|
||||
)"
|
||||
```
|
||||
|
||||
Write this comment from local state only. Do not include raw reviewer prompts or secret-bearing output.
|
||||
|
||||
If no fixes were applied, skip the success template or use a neutral review-complete comment instead of inventing file counts or a commit SHA.
|
||||
|
||||
## 5. Optional Reaction
|
||||
|
||||
If useful, react to the main CodeRabbit comment with 👍 after the summary is posted.
|
||||
Reference in New Issue
Block a user