From xonovex-skill-github
Use when delivering a pull request and its review on GitHub (github.com or GitHub Enterprise Server) from the command line with the `gh` CLI and `gh api` — opening a PR with `gh pr create`, posting a structured review with line-anchored inline comments, resolving review threads, detecting that the host is GitHub from the git remote, and scoping a classic or fine-grained token. Triggers on a github.com / GHES remote, `gh pr create`, `gh api .../pulls/.../reviews`, an inline review comment by path+line, resolving a review thread (resolveReviewThread), REQUEST_CHANGES / branch-protection merge gating, or GH_TOKEN / GH_ENTERPRISE_TOKEN scopes — even when the user doesn't say 'gh' but the repo is hosted on GitHub.
How this skill is triggered — by the user, by Claude, or both
Slash command
/xonovex-skill-github:github-guideThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
How to realize a pull request and its review on GitHub from the shell. This is the host-**delivery** tier: it does not teach the craft, only how to land it on GitHub.
How to realize a pull request and its review on GitHub from the shell. This is the host-delivery tier: it does not teach the craft, only how to land it on GitHub.
code-review-guide.pull-request-guide.git-guide's push reference.This skill only takes those finished artifacts and posts them through gh / gh api.
The one thing to internalize: a GitHub review is one atomic object — a single POST .../pulls/{n}/reviews carries the summary body, every line-anchored inline comment, AND the APPROVE / REQUEST_CHANGES / COMMENT verdict together — but gh pr review posts only the summary verdict, so inline comments drop to gh api (REST) and resolving a thread drops to gh api graphql (GraphQL-only), while merge-blocking lives entirely in branch protection / rulesets, not in the review.
When this skill fires:
gh auth status then a real read call (gh api user) — before any write.gh api the moment you need an inline comment or a thread resolve; the high-level gh pr verbs cannot do either.references/*.md file matching the task, not everything upfront.gh authenticated to the target host. First-time install + gh auth login + protocol + clone + verify are in references/onboarding.md; token families, per-operation least-privilege scopes, and storage are in references/auth.md.gh repo view --json nameWithOwner,url resolves it; a github.com host (or a GHES host) on git remote get-url origin is the detection signal. For GHES, set GH_HOST / --hostname and use GH_ENTERPRISE_TOKEN (see auth).gh pr create --base <target> --head <source> --title … --body-file - auto-pushes the branch if it isn't on the remote and sets reviewers/labels/assignees in one call; the raw POST /repos/{owner}/{repo}/pulls does NOT push. See references/create.md.git-guide's job; this skill assumes the source branch builds on the latest target. See git-guide's push reference.gh pr review only carries the summary + verdict; batch the summary, every inline comment, and the verdict into one gh api … /pulls/{n}/reviews object. See references/review-post.md.code-review-guide's; this skill only anchors and submits them.gh pr create --body-file takes a description authored per pull-request-guide.resolveReviewThread by thread node id (PRRT_…), matched by id never by line; list threads with pullRequest.reviewThreads. See references/review-resolve.md.POST/PATCH .../git/refs, PUT .../contents) — Contents: read is enough only to OPEN a PR and POST a review, never to push.gh pr edit --body / --body-file replaces the whole description (never appends) — fetch first (gh pr view N --json body -q .body), recombine, then set; metadata is incremental via paired --add-* / --remove-* flags.gh pr create is not create-or-update — it aborts non-zero if an open PR already exists for the branch; guard with || gh pr view --json url -q .url. Only --web proceeds anyway, and --dry-run "may still push git changes".gh pr review has no inline support (cli/cli#12396) and the standalone .../pulls/{n}/comments endpoint 422s on line/side payloads (cli/cli#13358) — put inline comments inside one .../reviews object.line in the reviews API is a file line number + side, NOT the deprecated diff position (never compute position); a multi-line range needs start_line/start_side preceding line/side in the same hunk. Anchor to the PR HEAD sha or comments go "outdated".PUT .../dismissals) — another person's approval does not override it.repo suffices.Closes #N in the PR body auto-closes the issue only when the PR merges into the default branch; cross-repo needs Closes owner/repo#N. There is no gh flag for it.X-Accepted-GitHub-Permissions header (gh api -i <endpoint>) for the exact required permission.# 0. confirm the host is GitHub and you can read
gh repo view --json nameWithOwner,url -q '.url' # github.com/... or your GHES host
gh auth status && gh api user -q '.login'
# 1. open the PR (gh pushes feat/x if it isn't on the remote); idempotency guard
gh pr create --base main --head feat/x \
--title "feat: guard null user" --body-file pr-body.md \
--reviewer org/team-slug --assignee @me --label enhancement \
|| gh pr view feat/x --json url -q .url
# 2. post ONE review object: summary + inline comment + verdict (gh pr review can't do inline)
HEAD=$(gh pr view 123 --json headRefOid -q .headRefOid)
gh api --method POST repos/{owner}/{repo}/pulls/123/reviews \
-f commit_id="$HEAD" -f event=REQUEST_CHANGES \
-f body=$'## Summary\nOne blocking issue, see inline.' \
-f 'comments[][path]=src/app.ts' \
-F 'comments[][line]=42' \
-f 'comments[][side]=RIGHT' \
-f 'comments[][body]=**issue (blocking):** guard against a null `user` here.'
# 3. list threads, then resolve by node id (never by line) — GraphQL only
gh api graphql -f query='query($o:String!,$r:String!,$n:Int!){repository(owner:$o,name:$r){pullRequest(number:$n){reviewThreads(first:100){nodes{id isResolved path comments(first:1){nodes{databaseId body}}}}}}}' \
-F o=OWNER -F r=REPO -F n=123
gh api graphql -f query='mutation($t:ID!){resolveReviewThread(input:{threadId:$t}){thread{id isResolved}}}' \
-f t=PRRT_kwDOxxxxx
Each reference is a trigger — read only the one matching the user's intent; do not preload everything.
gh, running gh auth login, picking HTTPS vs SSH, making gh the git credential helper, cloning, and verifying with a read call (GHES included).gh pr create flags, draft, reviewers/labels, issue-linking and auto-close semantics, the additive-body / replace-on-edit trap, idempotency guard, and the raw POST /pulls REST equivalent..../reviews object, the exact path/line/side inline anchor model, the REQUEST_CHANGES blocking mechanism, and deep-linking from html_url.reviewThreads, matching a finding to a thread by id (never line), the GraphQL resolveReviewThread mutation, in-thread replies, and the conversation-resolution merge gate.Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.
npx claudepluginhub xonovex/platform --plugin xonovex-skill-github