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.3.1.tar.gz (22.9 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.3.1-py3-none-any.whl (20.6 kB view details)

Uploaded Python 3

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

Hashes for gh_claude-0.3.1.tar.gz
Algorithm Hash digest
SHA256 b1351a53d012089e7da7c49b4424886ae1cfacd99563ae9c994ccf830ea94e49
MD5 92e0728609a4f1c4b9ca7e43e2d1c1f2
BLAKE2b-256 be3923c4832908e1229f61e012630284396bc75e666bd1792ebc8e6495359582

See more details on using hashes here.

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

Hashes for gh_claude-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 46cf8452314b0c567b5aed9c8d00ed28e6e5137bd8469260479012f138eea845
MD5 611304e586a091027e46226698d99a10
BLAKE2b-256 0c3bd972dd987a8c9f0ee800e2c82ddacf6cc72aca90a609b9f92b990bf63f54

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