Skip to main content
skill CX Codex

gh-cli · logicrw — Claude Code skill: GitHub work through gh

Teaches the agent to handle GitHub tasks with the gh CLI instead of an MCP server: PRs, issues, code search, releases.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add logicrw/gh-cli-skill --skill gh-cli -a claude-code
Open on GitHub

What gh-cli does

This skill spells out how an agent should talk to GitHub using gh. It ships a reference of ready calls: listing and viewing pull requests, diffs, creating and merging, reviews with line-level comments, issues, repository files, code and repo search, commits, releases and tags. Anything outside that list goes through gh api directly.

The core rule is to ask for the fields you actually need. Commands run with --json and --jq, and long output gets trimmed with --limit or head. That keeps token usage down, since the agent never pulls a whole PR or issue object into context.

Auth comes from an existing gh auth setup — check it with gh auth status. Without a logged-in gh, none of the calls work, so verify the CLI is installed and authenticated before adding the skill. The author positions it as a replacement for the GitHub MCP server.

What it helps with

  • list open PRs with authors and update times
  • open a draft PR from a feature branch into main
  • attach a review comment to a specific file line
  • search code inside one repository
  • publish a release with a tag and notes

Example prompts for the agent

  • List the open PRs in this repo with number, title and author
  • Open a draft PR from feature-branch into main
  • Add a review comment on line 42 of file.py in PR 123

How to install gh-cli

1Skills CLI (Vercel)

npx skills add logicrw/gh-cli-skill --skill gh-cli -a claude-code

2Manually: put the files in place

~/.claude/skills/gh-cli/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/gh-cli/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about gh-cli

How do I install gh-cli in Claude Code?

Run npx skills add logicrw/gh-cli-skill --skill gh-cli -a claude-code. The skill file lands at ~/.claude/skills/gh-cli/SKILL.md.

What does gh-cli do?

It tells the agent how to run GitHub tasks through gh: pull requests, issues, files, search, commits, releases. Direct CLI calls stand in for the GitHub MCP server.

What does gh-cli need to work?

A configured gh auth. You can confirm the login with gh auth status.

Source text

SKILL.md · MIT
---
name: gh-cli
description: >
  GitHub CLI operations via `gh` command. Use when working with GitHub
  repositories, pull requests, issues, code search, releases, or any
  GitHub API operation. This skill replaces the GitHub MCP server with
  direct CLI calls. Triggers on: GitHub, PR, pull request, issue, repo,
  branch, release, tag, commit, fork, merge, review, gh.
---

# GitHub CLI (`gh`) — Agent Skill

Use the `gh` CLI for ALL GitHub operations. Always use `--json` for structured output and `--jq` for field selection to minimize token usage.

## Authentication

Already configured via `gh auth`. Verify with:

```bash
gh auth status
```

## Core Principle

**Always request only the fields you need** to minimize output tokens:

```bash
# ❌ Bad — returns everything
gh pr view 123

# ✅ Good — returns only what's needed
gh pr view 123 --json title,state,body,url --jq '{title,state,body,url}'
```

---

## Quick Reference

### Pull Requests

```bash
# List open PRs
gh pr list --json number,title,author,updatedAt --jq '.[] | {number,title,author:.author.login}'

# View PR details
gh pr view <number> --json title,state,body,headRefName,baseRefName,additions,deletions,changedFiles

# View PR diff
gh pr diff <number>

# View PR files changed
gh pr diff <number> --name-only

# Create PR
gh pr create --title "title" --body "description" --base main --head feature-branch

# Create draft PR
gh pr create --title "title" --body "description" --draft

# Merge PR
gh pr merge <number> --squash --delete-branch

# Review PR
gh pr review <number> --approve
gh pr review <number> --request-changes --body "feedback"
gh pr review <number> --comment --body "looks good"

# PR review comments
gh api repos/{owner}/{repo}/pulls/{number}/comments --jq '.[].body'

# Add review comment on specific line
gh api repos/{owner}/{repo}/pulls/{number}/comments \
  -f body="comment" -f path="file.py" -F line=42 -f side="RIGHT" \
  -f commit_id="$(gh pr view <number> --json headRefOid --jq .headRefOid)"

# Check PR CI status
gh pr checks <number>

# Update PR branch
gh pr update-branch <number>
```

### Issues

```bash
# List issues
gh issue list --json number,title,labels,assignees --jq '.[] | {number,title,labels:[.labels[].name]}'

# View issue
gh issue view <number> --json title,body,state,labels,assignees,comments

# Create issue
gh issue create --title "title" --body "description" --label "bug"

# Comment on issue
gh issue comment <number> --body "comment text"

# Close issue
gh issue close <number> --reason completed

# Edit issue
gh issue edit <number> --title "new title" --add-label "priority"

# Search issues
gh issue list --search "keyword in:title,body" --json number,title
```

### Repository & Files

```bash
# View repo info
gh repo view --json name,description,defaultBranchRef --jq '{name,description,branch:.defaultBranchRef.name}'

# Get file contents (use gh api to avoid raw output issues)
gh api repos/{owner}/{repo}/contents/{path} --jq '.content' | base64 -d
# Or with ref:
gh api repos/{owner}/{repo}/contents/{path}?ref={branch} --jq '.content' | base64 -d

# List directory
gh api repos/{owner}/{repo}/contents/{path} --jq '.[].name'

# Create/update file
gh api repos/{owner}/{repo}/contents/{path} \
  -X PUT \
  -f message="commit message" \
  -f content="$(echo -n 'file content' | base64)" \
  -f branch="branch-name"
# For update, include sha:
  -f sha="<blob_sha>"

# Delete file
gh api repos/{owner}/{repo}/contents/{path} \
  -X DELETE \
  -f message="delete file" \
  -f sha="<blob_sha>" \
  -f branch="branch-name"

# Push multiple files — use git directly
git add file1 file2 && git commit -m "message" && git push

# Create branch
gh api repos/{owner}/{repo}/git/refs \
  -f ref="refs/heads/new-branch" \
  -f sha="$(gh api repos/{owner}/{repo}/git/ref/heads/main --jq '.object.sha')"

# List branches
gh api repos/{owner}/{repo}/branches --jq '.[].name'

# Fork repo
gh repo fork {owner}/{repo}

# Create repo
gh repo create {name} --public --description "desc"
```

### Search

```bash
# Search code
gh search code "query" --repo {owner}/{repo} --json path,repository,textMatches
gh search code "query language:python" --json path,repository

# Search repos
gh search repos "query" --json fullName,description,stargazersCount --jq '.[] | {name:.fullName,stars:.stargazersCount}'

# Search issues across GitHub
gh search issues "query" --json number,title,repository

# Search PRs
gh search prs "query" --json number,title,repository
```

### Commits & History

```bash
# List commits
gh api repos/{owner}/{repo}/commits --jq '.[].commit.message' | head -20
gh api repos/{owner}/{repo}/commits?sha={branch}\&per_page=10 --jq '.[] | {sha: .sha[:7], message: .commit.message}'

# View specific commit
gh api repos/{owner}/{repo}/commits/{sha} --jq '{message:.commit.message,files:[.files[].filename],stats:.stats}'

# Get commit diff
gh api repos/{owner}/{repo}/commits/{sha} -H "Accept: application/vnd.github.diff"
```

### Releases & Tags

```bash
# List releases
gh release list --json tagName,name,publishedAt

# View latest release
gh release view --json tagName,name,body

# View specific release
gh release view {tag} --json tagName,name,body

# List tags
gh api repos/{owner}/{repo}/tags --jq '.[].name'

# Create release
gh release create {tag} --title "title" --notes "release notes"
```

### Advanced API Access

For any operation not covered above, use `gh api` directly:

```bash
# GET request
gh api repos/{owner}/{repo}/actions/runs --jq '.workflow_runs[:3] | .[].conclusion'

# POST request
gh api repos/{owner}/{repo}/issues/{number}/comments -f body="comment"

# With pagination
gh api repos/{owner}/{repo}/issues --paginate --jq '.[].number'

# Get authenticated user
gh api user --jq '{login,name,email}'

# Team members
gh api orgs/{org}/teams/{team}/members --jq '.[].login'
```

## Output Optimization

Always minimize output for agent consumption:

1. **Use `--json` + `--jq`** for structured, minimal output
2. **Limit results** with `--limit` or API `per_page` parameter
3. **Select fields** — never dump full objects
4. **Pipe to `head`** for long outputs: `| head -50`

## Error Handling

```bash
# Check if command succeeded
gh pr view 999 --json state 2>/dev/null && echo "exists" || echo "not found"

# Safe API call with error handling
gh api repos/{owner}/{repo}/contents/{path} 2>/dev/null || echo "file not found"
```

© logicrw · MIT · logicrw/gh-cli-skill

Similar skills

All skills for Git and GitHub →

gh-cli by other authors comes first.

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor