# 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(s) based on CodeRabbit feedback item(s). **Files modified:** - `path/to/file-a.ts` - `path/to/file-b.ts` **Commit:** `` The latest autofix changes are on the `` 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.