Interact with GitHub using the gh CLI. Use gh issue, gh pr, gh run, and gh api for issues, PRs, CI runs, and advanced queries.
Use the gh CLI to interact with GitHub repositories, issues, PRs, and CI.
✅ USE this skill when:
❌ DON'T use this skill when:
git directlygit clonecoding-agent skillcoding-agent or read files directly# Authenticate (one-time)
gh auth login
# Verify
gh auth status
OpenClaw agent shells often run with a different HOME than the user that ran
gh auth login (per-agent codex homes, systemd User= services, sudo). gh
looks up its config under $GH_CONFIG_DIR, then $XDG_CONFIG_HOME/gh, then
$HOME/.config/gh, so the agent shell can report not logged into any GitHub hosts even when the operator login is intact.
To point the gateway at the canonical gh config, set GH_CONFIG_DIR on the
service environment, e.g.
# Gateway service env file (example: ~/.openclaw/gateway.systemd.env)
GH_CONFIG_DIR=/path/to/operator/.config/gh
then restart the gateway. openclaw doctor warns when it detects an authenticated
hosts.yml outside the agent process's effective gh config dir.
# List PRs
gh pr list --repo owner/repo
# Check CI status
gh pr checks 55 --repo owner/repo
# View PR details
gh pr view 55 --repo owner/repo
# Create PR
gh pr create --title "feat: add feature" --body "Description"
# Merge PR
gh pr merge 55 --squash --repo owner/repo
# List issues
gh issue list --repo owner/repo --state open
# Create issue
gh issue create --title "Bug: something broken" --body "Details..."
# Close issue
gh issue close 42 --repo owner/repo
# List recent runs
gh run list --repo owner/repo --limit 10
# View specific run
gh run view <run-id> --repo owner/repo
# View failed step logs only
gh run view <run-id> --repo owner/repo --log-failed
# Re-run failed jobs
gh run rerun <run-id> --failed --repo owner/repo
# Get PR with specific fields
gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login'
# List all labels
gh api repos/owner/repo/labels --jq '.[].name'
# Get repo stats
gh api repos/owner/repo --jq '{stars: .stargazers_count, forks: .forks_count}'
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")'
# Get PR overview for review
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
# Quick issue triage view
gh issue list --repo owner/repo --state open --json number,title,labels,createdAt \
--jq '.[] | "[\(.number)] \(.title) - \([.labels[].name] | join(", ")) (\(.createdAt[:10]))"'
--repo owner/repo when not in a git directorygh pr view https://github.com/owner/repo/pull/55gh api --cache 1h for repeated queries