GitHub CLI (gh) — Setup and Usage
Purpose
Ensures the GitHub CLI (gh) is available and provides correct usage patterns for AI agents operating in environments where gh may not be pre-installed and where git remotes point to local proxies instead of github.com.
When to Use
ghcommand not found orshutil.which("gh")returns None- Need to interact with GitHub API (issues, PRs, releases, workflows)
- Repository remote does not point to
github.com(proxy environments) - Need authenticated GitHub operations with
GITHUB_TOKEN - Managing GitHub Issues, Projects V2, Milestones, or Labels
Installation
gh is assumed to be already installed via the system package manager:
- macOS:
brew install gh - Windows:
winget install GitHub.cli - Linux (Debian/Ubuntu):
apt install gh
For CI monitoring operations (watching workflow runs, checking statuses, waiting for jobs), use ci_monitor.cjs:
node src/resources/skills/github-workflows/references/gh/scripts/ci_monitor.cjs
Authentication
GITHUB_TOKEN environment variable provides automatic authentication. No manual gh auth login needed.
# Verify authentication
gh auth status
If GITHUB_TOKEN is set, gh authenticates automatically for all API calls.
Repository Detection
Git remote points to a local proxy (127.0.0.1), NOT github.com. Every gh command fails without explicit repo specification:
failed to determine base repo: none of the git remotes configured for this
repository point to a known GitHub host.
RULE: Pass -R (or --repo) on EVERY gh command:
gh <command> -R open-gsd/gsd-pi
This applies to ALL gh subcommands: pr, issue, run, api, release, project, etc.
Common Commands (v2.87.0)
Pull Requests
# List open PRs
gh pr list -R open-gsd/gsd-pi
# View PR details
gh pr view <number> -R open-gsd/gsd-pi
# Check PR CI status
gh pr checks <number> -R open-gsd/gsd-pi
# Create PR
gh pr create -R open-gsd/gsd-pi --title "title" --body "body"
# View PR comments
gh api repos/open-gsd/gsd-pi/pulls/<number>/comments
Issues
# List issues
gh issue list -R open-gsd/gsd-pi
# List by label
gh issue list -R open-gsd/gsd-pi --label "priority:p1" --state open
# Create issue with labels and milestone
# NOTE: Do NOT use labels for issue classification (bug, feature, etc.)
# Use labels for metadata (priority, status, auto-generated) only.
# Issue classification uses GitHub Issue Types, set via GraphQL after creation.
gh issue create -R open-gsd/gsd-pi \
--title "feat: add feature X" \
--label "priority:p1" \
--milestone "v1.0"
# View issue
gh issue view <number> -R open-gsd/gsd-pi
# Close issue with comment
gh issue close <number> -R open-gsd/gsd-pi --comment "Implemented in PR #N"
# Edit labels on issue
gh issue edit <number> -R open-gsd/gsd-pi \
--add-label "status:in-progress" \
--remove-label "status:needs-grooming"
Issue Types (Classification)
gh issue create has no --type flag. Issue types (Bug, Feature Request, etc.) are set via GraphQL after creation:
# Step 1: Create the issue (returns URL)
ISSUE_URL=$(gh issue create -R open-gsd/gsd-pi \
--title "..." --body "...")
# Step 2: Set the issue type via GraphQL
ISSUE_NUM=$(echo "$ISSUE_URL" | grep -oE '[0-9]+$')
ISSUE_ID=$(gh api graphql -f query='{ repository(owner:"open-gsd",name:"gsd-pi") { issue(number:'"$ISSUE_NUM"') { id } } }' --jq '.data.repository.issue.id')
TYPE_ID=$(gh api graphql -f query='{ repository(owner:"open-gsd",name:"gsd-pi") { issueTypes(first:20) { nodes { id name } } } }' --jq '.data.repository.issueTypes.nodes[] | select(.name=="Bug") | .id')
gh api graphql -f query='mutation { updateIssue(input:{id:"'"$ISSUE_ID"'",issueTypeId:"'"$TYPE_ID"'"}) { issue { number } } }'
Replace "Bug" with the appropriate type name ("Feature Request", "Task", etc.).
Labels
# List all labels
gh label list -R open-gsd/gsd-pi
# Create label
gh label create "priority:p1" --color "E99695" \
--description "High priority" -R open-gsd/gsd-pi
See labels.md for the full taxonomy and color codes.
Projects V2
# List projects
gh project list --owner open-gsd
# Create project
gh project create --owner open-gsd --title "gsd-pi Backlog"
# Add issue to project
gh project item-add 1 --owner open-gsd \
--url https://github.com/open-gsd/gsd-pi/issues/42
See projects-v2.md for field creation and item editing commands.
Milestones
gh has no native milestone subcommand — use gh api with the REST endpoint:
# List milestones
gh api repos/open-gsd/gsd-pi/milestones
# Create milestone
gh api repos/open-gsd/gsd-pi/milestones \
-X POST -f title="v1.0" -f due_on="2026-03-31T00:00:00Z"
# Assign milestone to issue
gh api repos/open-gsd/gsd-pi/issues/42 \
-X PATCH -F milestone=1
See milestones.md for full CRUD reference.
Workflow Runs
# List recent runs
gh run list -R open-gsd/gsd-pi --limit 5
# View specific run
gh run view <run-id> -R open-gsd/gsd-pi
# View failed job logs
gh run view <run-id> -R open-gsd/gsd-pi --log-failed
Releases
# List releases
gh release list -R open-gsd/gsd-pi
# View latest release
gh release view --repo open-gsd/gsd-pi
API (Direct)
# GET request
gh api repos/open-gsd/gsd-pi
# POST with fields
gh api repos/open-gsd/gsd-pi/issues -f title="Bug" -f body="Details"
# GraphQL
gh api graphql -f query='{ viewer { login } }'
# Paginated results
gh api repos/open-gsd/gsd-pi/contributors --paginate
Repository
# Clone
gh repo clone open-gsd/gsd-pi
# View repo info
gh repo view -R open-gsd/gsd-pi
Output Formatting
# JSON output
gh pr list -R open-gsd/gsd-pi --json number,title,state
# JQ filtering
gh pr list -R open-gsd/gsd-pi --json number,title --jq '.[].title'
# Template formatting
gh pr list -R open-gsd/gsd-pi --json number,title \
--template '{{range .}}#{{.number}} {{.title}}{{"\n"}}{{end}}'
Reference Files
- labels.md — Label taxonomy (priority, type, status), color codes, bulk setup
- milestones.md — Milestone CRUD via REST API, naming conventions
- projects-v2.md — GitHub Projects V2 commands, custom fields, GraphQL queries
- issue-stories.md — Issue as story format, body template, lifecycle, backlog item field mapping
Sources
- GitHub CLI Manual — official reference
- GitHub CLI Releases — binary downloads
- GitHub REST API — Issues — milestones, labels, issues
- GitHub Projects V2 API — GraphQL API
gh version 2.87.2 (2026-02-20)— version verified by installation test