Skip to main content

gh-claude

A modern, keyboard-first TUI for managing GitHub issues and pull requests across multiple repositories. It uses Textual for the interface, GitHub CLI for data, and Claude Code for issue drafting and analysis.

License: MIT

PyPI: gh-claude
Repository: masaaaaa725/ghc

Requirements

Install

pip install gh-claude
# or
uv tool install gh-claude

Update an existing uv tool install:

uv tool upgrade gh-claude

Publishing

Every push to main runs .github/workflows/publish.yml, which bumps the patch version in pyproject.toml, publishes that version to PyPI, and commits the bump back to main (with [skip ci] to avoid a loop).

One-time setup on PyPI (Trusted Publishing):

  1. Open PyPI publishing settings for gh-claude
  2. Add a GitHub publisher:
    • Owner: masaaaaa725
    • Repository: ghc
    • Workflow: publish.yml
    • Environment: pypi
  3. In GitHub, create an Environment named pypi (Settings → Environments)

After that, merges to main publish automatically. Users can then run uv tool upgrade gh-claude.

Run

gh-claude
# alias
ghc

From a local checkout:

uv sync
uv run gh-claude

The app detects the GitHub repository in the current directory. Press r or Ctrl+P to switch to any repository returned by gh repo list.

Choosing a Claude model

By default, ghc uses whatever model the claude CLI defaults to. Set a starting model with the --model flag:

ghc --model claude-opus-4-6

To avoid passing the flag every time, set the GHC_MODEL environment variable, or persist a default in ~/.config/ghc/config.toml:

model = "claude-sonnet-4-6"

Precedence: --model flag > GHC_MODEL environment variable > config file > the claude CLI's own default.

Press m at any time inside ghc to switch models without restarting — pick a preset or type any model ID. The active model is shown in the footer, and the choice is saved to ~/.config/ghc/config.toml so it's used again the next time you start ghc (unless overridden by --model or GHC_MODEL). Picking "Claude Code default" clears the saved override.

Keyboard shortcuts

  • ↑ / ↓: move the selection in the Issues, Pull Requests, GitHub Actions, or Secrets list
  • ← / → / Tab / Shift+Tab: cycle between the Issues, Pull Requests, GitHub Actions, and Secrets tabs
  • f: cycle the status filter (OPEN → CLOSED → ALL for Issues; includes MERGED / DRAFT for PRs; SUCCESS / FAILURE / IN_PROGRESS / QUEUED / CANCELLED for GitHub Actions; ALL / REPOSITORY / ENVIRONMENT for Secrets)
  • /: filter the active list by title, label, or author; Enter applies, Esc cancels
  • r / Ctrl+P: searchable repository picker (↑/↓ to move, Enter to select, Esc to cancel)
  • c: turn rough notes into a reviewed GitHub issue with Claude
  • s: summarize the selected issue, pull request, or workflow run with Claude
  • o: check out the selected pull request as a local branch
  • v: review the selected pull request diff with Claude, and save the result
  • e: view, edit, and save a custom AI review prompt (Ctrl+D resets to the default)
  • a: draft, preview, and post an AI-polished comment (issues and pull requests only)
  • Ctrl+E: create an Issue branch and let Claude implement the selected Issue
  • i / p / w / k: switch to Issues / Pull Requests / GitHub Actions / Secrets
  • Ctrl+R / F5: refresh Issues, Pull Requests, GitHub Actions, and Secrets for the current repository
  • Ctrl+C: quit

GitHub Actions lists recent workflow runs for the current repository (status, workflow, branch, event, and last update time). Press g to open the run on GitHub, or s to have Claude summarize a failed run. Re-running jobs from within ghc is not yet supported.

Secrets lists the names of repository-level GitHub Secrets and per-environment secrets (scope, visibility, and last update time). Per GitHub's security model, secret values are never exposed by the API or CLI, so only names and metadata are shown. Press g to open GitHub's settings page for the selected secret.

Press e to customize the instructions Claude follows for AI review (v). The prompt is saved to ~/.config/ghc/review_prompt.md and reused across sessions; press Ctrl+D inside the editor to clear it and fall back to the built-in default.

Pressing v on a pull request saves the AI review to ~/.config/ghc/reviews.json, keyed by repository and PR number, so it survives restarts. Whenever a pull request has a saved review — right after running v, or when you open its detail again later, even in a new ghc session — the detail view splits into two columns: the PR's own content on the left, and the AI review on the right. Press v again to re-review and refresh the saved copy.

Project layout

.
├── pyproject.toml
├── uv.lock
├── src/                # Import package `ghc` (PyPI name: `gh-claude`)
│   ├── __init__.py
│   ├── __main__.py
│   ├── app.py          # Main Textual app and interactions
│   ├── app.tcss        # Dark UI theme
│   ├── clients.py      # Async gh / claude / git wrappers
│   ├── models.py       # Domain models
│   └── screens.py      # Repository and issue workflow modals
└── tests/
    ├── test_app.py
    ├── test_clients.py
    ├── test_models.py
    └── test_screens.py

All external commands are executed without a shell via asyncio.create_subprocess_exec. GitHub read operations request JSON explicitly; commands such as gh pr diff, gh pr checkout, gh issue create, and gh issue comment are exceptions because those GitHub CLI commands do not support --json.

Ctrl+E is intentionally limited to the repository currently checked out on disk. After confirmation, it creates issue-<number>-<slug> with git checkout -b, then runs Claude Code in print mode. Claude is instructed not to commit, push, or modify unrelated files; always review the working tree after it finishes.

Test

uv run pytest

Metadata

Release files for gh-claude 0.11.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gh-claude 0.11.1
File Size Uploaded Provenance
gh_claude-0.11.1.tar.gz 36.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for gh-claude 0.11.1
File Interpreter ABI Platform
gh_claude-0.11.1-py3-none-any.whl Python 3 none any Details

Total release size: 66.1 kB

Release files / gh_claude-0.11.1.tar.gz

Download URL gh_claude-0.11.1.tar.gz
Size 36.6 kB
Tags Source
SHA-256 checksum
How to use checksums
246562d1d3b13d4893c979ef069dd0ded488badf1a886b3beea924d17a54a516
BLAKE2b-256 checksum
How to use checksums
2c629b1689690a07fe4d656c32436ae4e2b9a8118439447880f4d930034f4cd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / gh_claude-0.11.1-py3-none-any.whl

Download URL gh_claude-0.11.1-py3-none-any.whl
Size 29.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
051657230a88b5b581690634c67a88f9ab8663cb53972a790e288241155f4074
BLAKE2b-256 checksum
How to use checksums
a87083be7abd69e6e36bafc8ea885a8cccf085edc17e1f9cc0281755f64ceb4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for gh-claude 0.11.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page