home / skills / trailofbits / skills / using-gh-cli

This skill helps you interact with GitHub resources using the gh CLI, replacing curl or WebFetch for repos, PRs, issues, and API data.

npx playbooks add skill trailofbits/skills --skill using-gh-cli

Review the files below or copy the command above to add this skill to your agents.

Files (7)
SKILL.md
3.9 KB
---
name: using-gh-cli
description: "Guides usage of the GitHub CLI (gh) for interacting with GitHub repositories, PRs, issues, and API. Use when working with GitHub resources instead of WebFetch or curl."
allowed-tools:
  - Bash
  - Read
  - Glob
  - Grep
---

# Using the GitHub CLI (`gh`)

## When to Use

- **Browsing or reading code** from a GitHub repository — clone it and use Read/Glob/Grep
- Viewing or creating pull requests, issues, releases, or gists
- Fetching repo metadata or any GitHub API data
- Interacting with GitHub Actions (runs, workflows)
- Any task involving GitHub that you might otherwise use `curl`, `wget`, or `WebFetch` for

## When NOT to Use

- Non-GitHub URLs (use `WebFetch` or `curl` for those)
- Public web content that happens to be hosted on GitHub Pages (`*.github.io`) — those are regular websites
- Local git operations (`git commit`, `git push`) — use `git` directly

## Key Principle

**Always use `gh` instead of `curl`, `wget`, or `WebFetch` for GitHub URLs.** The `gh` CLI uses the user's authenticated token automatically, so it:

- Works with private repositories
- Avoids GitHub API rate limits (unauthenticated: 60 req/hr; authenticated: 5,000 req/hr)
- Handles pagination correctly
- Provides structured output and filtering

## Browsing Repository Code

**To read or browse files from a GitHub repo, clone it locally and use normal file tools** (Read, Glob, Grep). This is much faster and more natural than fetching files one-by-one via the API.

```bash
# Clone to a session-scoped temp directory (cleaned up automatically on session end)
clonedir="$TMPDIR/gh-clones-${CLAUDE_SESSION_ID}"
mkdir -p "$clonedir"
gh repo clone owner/repo "$clonedir/repo" -- --depth 1
```

After cloning, use the **Explore agent** (via the Task tool with `subagent_type=Explore`) to investigate the cloned repo. The Explore agent can use Read, Glob, and Grep across the clone efficiently — much better than calling them one at a time:

```
Task(subagent_type="Explore", prompt="In $clonedir/repo/, find how authentication is implemented")
```

For targeted lookups on a clone you already understand, use Read/Glob/Grep directly.

- `gh repo clone` uses the user's authenticated token — works with private repos
- `--depth 1` keeps the clone fast (only latest commit)
- No cleanup needed — a SessionEnd hook removes the clone directory automatically
- Use `gh api` only when you need a quick single-file lookup without cloning

## Quick Start

```bash
# View a repo
gh repo view owner/repo

# List and view PRs
gh pr list --repo owner/repo
gh pr view 123 --repo owner/repo

# List and view issues
gh issue list --repo owner/repo
gh issue view 456 --repo owner/repo

# Call any REST API endpoint
gh api repos/owner/repo/contents/README.md

# Call with pagination and jq filtering
gh api repos/owner/repo/pulls --paginate --jq '.[].title'
```

## Common Patterns

| Instead of | Use |
|------------|-----|
| `WebFetch` on `github.com/owner/repo` | `gh repo view owner/repo` |
| `WebFetch` on a blob/tree URL | Clone with `gh repo clone` and use Read/Glob/Grep |
| `WebFetch` on `raw.githubusercontent.com/...` | Clone with `gh repo clone` and use Read |
| `WebFetch` on `api.github.com/...` | `gh api <endpoint>` |
| `curl https://api.github.com/...` | `gh api <endpoint>` |
| `curl` with `-H "Authorization: token ..."` | `gh api <endpoint>` (auth is automatic) |
| `wget` to download a release asset | `gh release download --repo owner/repo` |

## References

- [Pull Requests](references/pull-requests.md) — list, view, create, merge, review PRs
- [Issues](references/issues.md) — list, view, create, close, comment on issues
- [Repos and Files](references/repos-and-files.md) — view repos, browse files, clone
- [API](references/api.md) — raw REST/GraphQL access, pagination, jq filtering
- [Releases](references/releases.md) — list, create, download releases
- [Actions](references/actions.md) — view runs, trigger workflows, check logs

Overview

This skill guides using the GitHub CLI (gh) to interact with repositories, pull requests, issues, releases, Actions, and the GitHub API. It explains when to prefer gh over raw HTTP tools and provides practical patterns for cloning, browsing, and API calls. The guidance focuses on authenticated, efficient, and reproducible workflows for security research and audit tasks.

How this skill works

The skill recommends using gh for any GitHub-hosted resource because gh automatically uses the user’s authenticated token, handles pagination, and returns structured output. For code inspection it favors cloning repos with gh repo clone and then using local file tools (Read/Glob/Grep) or an Explore subagent for fast, session-scoped analysis. For API-level needs it shows gh api commands and jq filtering for compact, repeatable queries.

When to use it

  • Browsing or reading repository code — clone with gh and inspect locally
  • Viewing, creating, or reviewing pull requests and issues
  • Fetching repository metadata or any GitHub API data instead of curl/WebFetch
  • Interacting with GitHub Actions, workflows, and run logs
  • Downloading release assets or querying private repo content

Best practices

  • Always prefer gh for GitHub URLs — it uses authenticated tokens and avoids unauthenticated rate limits
  • Clone with --depth 1 for quick, lightweight inspection of the latest commit
  • Use gh api with --paginate and --jq for structured, filtered API responses when you don’t need a full clone
  • Use local Read/Glob/Grep after cloning for fast bulk searches and code analysis
  • Avoid using gh for non-GitHub web pages or for local git operations where plain git is better

Example use cases

  • Quickly list open PR titles: gh pr list --repo owner/repo
  • Inspect a private repo file without manual auth by cloning and grepping the clone
  • Fetch all workflow runs and check logs for failure patterns via gh run list / gh run view
  • Download a release asset with gh release download --repo owner/repo
  • Query the REST API and filter results: gh api repos/owner/repo/pulls --paginate --jq '.[].title'

FAQ

Can gh access private repositories?

Yes. gh uses your authenticated token, so it can access private repositories without adding manual Authorization headers.

When should I still use curl or WebFetch?

Use curl/WebFetch for non-GitHub URLs or when interacting with generic web pages. For GitHub-hosted content and the API, prefer gh for correct auth, pagination, and structured output.