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
- Python 3.13+
- uv or pip
- GitHub CLI (
gh auth login) - Claude Code (
claude) - Git
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):
- Open PyPI publishing settings for gh-claude
- Add a GitHub publisher:
- Owner:
masaaaaa725 - Repository:
ghc - Workflow:
publish.yml - Environment:
pypi
- Owner:
- 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, or GitHub Actions list←/→: cycle between the Issues, Pull Requests, and GitHub Actions tabsf: cycle the status filter (OPEN→CLOSED→ALLfor Issues; includesMERGED/DRAFTfor PRs;SUCCESS/FAILURE/IN_PROGRESS/QUEUED/CANCELLEDfor GitHub Actions)r/Ctrl+P: searchable repository picker (↑/↓to move,Enterto select,Escto cancel)c: turn rough notes into a reviewed GitHub issue with Claudes: summarize the selected issue, pull request, or workflow run with Claudeo: check out the selected pull request as a local branchv: review the selected pull request diff with Claudee: view, edit, and save a custom AI review prompt (Ctrl+Dresets 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 Issuei/p/w: switch to Issues / Pull Requests / GitHub ActionsCtrl+R/F5: refresh Issues, Pull Requests, and GitHub Actions for the current repositoryCtrl+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.
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.
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.8.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| gh_claude-0.8.1.tar.gz | 32.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gh_claude-0.8.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 58.9 kB
Release files / gh_claude-0.8.1.tar.gz
| Download URL | gh_claude-0.8.1.tar.gz |
|---|---|
| Size | 32.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c6c830bb614b8fd9dbb37b49697bbd0f7760b4014ecb1ff3124a5406ee4faf91
|
|
BLAKE2b-256 checksum How to use checksums |
52a30a223eb26657bc19230cad7156d8621911e68c777bb59e7649d5706daa61
|
| 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.8.1-py3-none-any.whl
| Download URL | gh_claude-0.8.1-py3-none-any.whl |
|---|---|
| Size | 26.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1590e9053f7474052743d64c7e29e00e882477d0747225abd63ce5bfd4abe53e
|
|
BLAKE2b-256 checksum How to use checksums |
c6241b7b98e3f59c59505c9a728a8e932ca4bfe38152731e712deb3cbab70382
|
| 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.8.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.