A modern multi-repository GitHub TUI with Claude Code integration
Project description
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.
Keyboard shortcuts
↑/↓: move the selection in the Issues or Pull Requests list←/→: switch between the Issues and Pull Requests tabsf: cycle the status filter (OPEN→CLOSED→ALLfor Issues; includesMERGED/DRAFTfor PRs)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 or pull request with Claudeo: check out the selected pull request as a local branchv: review the selected pull request diff with Claudea: draft, preview, and post an AI-polished commentCtrl+E: create an Issue branch and let Claude implement the selected Issuei/p: switch to Issues / Pull RequestsCtrl+R/F5: refresh Issues and Pull Requests for the current repositoryCtrl+C: quit
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gh_claude-0.3.1.tar.gz.
File metadata
- Download URL: gh_claude-0.3.1.tar.gz
- Upload date:
- Size: 22.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1351a53d012089e7da7c49b4424886ae1cfacd99563ae9c994ccf830ea94e49
|
|
| MD5 |
92e0728609a4f1c4b9ca7e43e2d1c1f2
|
|
| BLAKE2b-256 |
be3923c4832908e1229f61e012630284396bc75e666bd1792ebc8e6495359582
|
File details
Details for the file gh_claude-0.3.1-py3-none-any.whl.
File metadata
- Download URL: gh_claude-0.3.1-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46cf8452314b0c567b5aed9c8d00ed28e6e5137bd8469260479012f138eea845
|
|
| MD5 |
611304e586a091027e46226698d99a10
|
|
| BLAKE2b-256 |
0c3bd972dd987a8c9f0ee800e2c82ddacf6cc72aca90a609b9f92b990bf63f54
|