Skip to main content

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

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.

Keyboard shortcuts

  • / : move the selection in the Issues or Pull Requests list
  • / : switch between the Issues and Pull Requests tabs
  • f: cycle the status filter (OPENCLOSEDALL for Issues; includes MERGED / DRAFT for PRs)
  • 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 or pull request with Claude
  • o: check out the selected pull request as a local branch
  • v: review the selected pull request diff with Claude
  • a: draft, preview, and post an AI-polished comment
  • Ctrl+E: create an Issue branch and let Claude implement the selected Issue
  • i / p: switch to Issues / Pull Requests
  • Ctrl+R / F5: refresh Issues and Pull Requests for the current repository
  • Ctrl+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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gh_claude-0.2.1.tar.gz (19.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gh_claude-0.2.1-py3-none-any.whl (19.0 kB view details)

Uploaded Python 3

File details

Details for the file gh_claude-0.2.1.tar.gz.

File metadata

  • Download URL: gh_claude-0.2.1.tar.gz
  • Upload date:
  • Size: 19.8 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

Hashes for gh_claude-0.2.1.tar.gz
Algorithm Hash digest
SHA256 b9a421f7126530ef36c574d06bf96e2c563f6c806401f69edac0d651ad0af158
MD5 e76b5cf0c66638c136a7a0821a3a0647
BLAKE2b-256 79acff9c997fdc0e9ad35bc6e78fed95a267d248308e94256c281da6eca9a50e

See more details on using hashes here.

File details

Details for the file gh_claude-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: gh_claude-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 19.0 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

Hashes for gh_claude-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c1b298d3a83decb7cc6b2212cf578f871963ddc05dacecb08c0a71a1683462f6
MD5 7a23d3595e060f5a5101961c13a3abfa
BLAKE2b-256 af88dafe765bafa605822b996e9291bbaadf8a0661210ab1032a847fd15fb088

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page