| name | github |
| description | GitHub operations via `gh` CLI: issues, PRs, CI runs, code review, API queries. Use when: (1) checking PR status or CI, (2) creating/commenting on issues, (3) listing/filtering PRs or issues, (4) viewing run logs. NOT for: complex web UI interactions requiring manual browser flows (use browser tooling when available), bulk operations across many repos (script with gh api), or when gh auth is not configured. |
GitHub Skill
Use the gh CLI to interact with GitHub repositories, issues, PRs, and CI.
Environment Check (MUST run first)
Before any GitHub operation, verify the gh CLI is available and authenticated:
#!/bin/bash
MISSING=()
if ! command -v gh &>/dev/null; then
MISSING+=("gh")
fi
if [ ${#MISSING[@]} -eq 0 ]; then
if gh auth status &>/dev/null 2>&1; then
echo "ENV_OK"
else
echo "ENV_AUTH_NEEDED"
fi
else
echo "ENV_MISSING: ${MISSING[*]}"
fi
If ENV_OK: proceed with the GitHub operation.
If ENV_AUTH_NEEDED: tell the user gh is installed but not authenticated. Ask them to run gh auth login.
If ENV_MISSING: tell the user gh CLI is not installed. Ask if they want to install it:
brew install gh
sudo apt install gh
conda install -c conda-forge gh
Do NOT install automatically — always get user confirmation first. If the user declines, suggest using git commands or the GitHub API directly as alternatives.
When to Use
✅ USE this skill when:
- Checking PR status, reviews, or merge readiness
- Viewing CI/workflow run status and logs
- Creating, closing, or commenting on issues
- Creating or merging pull requests
- Querying GitHub API for repository data
- Listing repos, releases, or collaborators
When NOT to Use
❌ DON'T use this skill when:
- Local git operations (commit, push, pull, branch) → use
git directly
- Non-GitHub repos (GitLab, Bitbucket, self-hosted) → different CLIs
- Cloning repositories → use
git clone
- Reviewing actual code changes → use
coding-agent skill
- Complex multi-file diffs → use
coding-agent or read files directly
Setup
gh auth login
gh auth status
Common Commands
Pull Requests
gh pr list --repo owner/repo
gh pr checks 55 --repo owner/repo
gh pr view 55 --repo owner/repo
gh pr create --title "feat: add feature" --body "Description"
gh pr merge 55 --squash --repo owner/repo
Issues
gh issue list --repo owner/repo --state open
gh issue create --title "Bug: something broken" --body "Details..."
gh issue close 42 --repo owner/repo
CI/Workflow Runs
gh run list --repo owner/repo --limit 10
gh run view <run-id> --repo owner/repo
gh run view <run-id> --repo owner/repo --log-failed
gh run rerun <run-id> --failed --repo owner/repo
API Queries
gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login'
gh api repos/owner/repo/labels --jq '.[].name'
gh api repos/owner/repo --jq '{stars: .stargazers_count, forks: .forks_count}'
JSON Output
Most commands support --json for structured output with --jq filtering:
gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"'
gh pr list --json number,title,state,mergeable --jq '.[] | select(.mergeable == "MERGEABLE")'
Templates
PR Review Summary
PR=55 REPO=owner/repo
echo "## PR #$PR Summary"
gh pr view $PR --repo $REPO --json title,body,author,additions,deletions,changedFiles \
--jq '"**\(.title)** by @\(.author.login)\n\n\(.body)\n\n📊 +\(.additions) -\(.deletions) across \(.changedFiles) files"'
gh pr checks $PR --repo $REPO
Issue Triage
gh issue list --repo owner/repo --state open --json number,title,labels,createdAt \
--jq '.[] | "[\(.number)] \(.title) - \([.labels[].name] | join(", ")) (\(.createdAt[:10]))"'
Notes
- Always specify
--repo owner/repo when not in a git directory
- Use URLs directly:
gh pr view https://github.com/owner/repo/pull/55
- Rate limits apply; use
gh api --cache 1h for repeated queries