Launch Claude Code agents on GitHub repos with isolated workspaces and optional Docker dev environments
Project description
luv
A CLI that launches Claude Code agents on GitHub repos with isolated workspaces and optional Docker dev environments.
luv clones a repo, creates a branch, and drops you into a Claude session ready to work. When the repo ships a .luv/settings.json, it spins up Docker Compose automatically so every command runs in the right environment.
Install
# With uv (recommended)
uv tool install luv-cli
# With pip
pip install luv-cli
Requirements: Claude Code CLI and GitHub CLI (gh) must be installed and authenticated.
Quick start
# Configure your default GitHub org (one-time setup)
luv --init
# Create a new workspace and launch Claude
luv my-repo "add user authentication"
# Use a different org inline
luv other-org/my-repo "fix the bug"
# Reopen workspace #42
luv my-repo 42
# Open any GitHub PR by URL
luv -l https://github.com/org/repo/pull/123
# Open a shell instead of Claude
luv -n my-repo 42
# Resume last Claude session
luv -r my-repo 42
# Clean up fully-merged workspaces
luv --clean
How it works
- Clones the repo into
~/prs/{repo}-{number}/ - Creates a new branch
luv-{number} - Trusts the project in Claude Code config
- Launches Claude with Opus and max effort
All workspaces live under ~/prs/. The number comes from the repo's GitHub issue counter to avoid collisions.
Commands
| Command | Description |
|---|---|
luv --init |
Configure default GitHub org |
luv [org/]<repo> [prompt...] |
Create a new workspace and launch Claude |
luv [org/]<repo> <number> [prompt] |
Reopen an existing workspace |
luv -l <PR URL> [prompt] |
Open any GitHub PR by URL |
luv [org/]<repo> -pr <number> [prompt] |
Open a PR by repo + number |
luv --clean |
Delete workspaces where the branch is fully pushed/merged |
luv --clean -f |
Force delete all workspaces |
Flags
| Flag | Description |
|---|---|
-n |
Navigate: open a shell instead of Claude |
-r |
Resume: resume the last Claude session |
-f, --force |
Skip safety checks (with --clean) |
Docker dev environments
If a repo contains .luv/settings.json with a compose_file key, luv automatically starts a Docker Compose environment and runs Claude inside the dev-environment container.
Setup
1. Create .luv/settings.json in your repo:
{
"compose_file": ".luv/docker-compose.yml"
}
The compose_file path is relative to the repo root.
2. Create the Docker Compose file:
services:
dev-environment:
image: your-org/dev-env:latest
volumes:
- .:/workspace
working_dir: /workspace
stdin_open: true
tty: true
depends_on:
- postgres
postgres:
image: postgres:16
environment:
POSTGRES_PASSWORD: dev
The dev-environment service must have Claude Code installed in its image.
How Docker mode works
- Detects
.luv/settings.jsonwithcompose_filekey - Tears down any stale environment from a previous run
- Starts
docker compose up -d --buildwith a unique project name (luv-{repo}-{number}) for network/volume isolation - Verifies the
dev-environmentservice is running - Runs Claude inside the container via
docker compose exec - The repo is volume-mounted, so all file changes and git commits are visible on the host
- On exit (including Ctrl-C), tears down the environment with
docker compose down -v
Docker mode works with all flags: -n opens a bash shell in the container, -r resumes a Claude session in the container.
Workspace cleanup
luv --clean scans ~/prs/ and safely removes workspaces that are fully pushed. It checks:
- Working tree is clean (no uncommitted changes)
- No unpushed commits
- If the remote branch is gone, verifies the PR was merged and local HEAD matches
Use luv --clean -f to skip all safety checks and delete everything.
Configuration
Run luv --init to set your default GitHub org. This saves to ~/.luv/config.json.
You can also pass org/repo inline to override the default for any command (e.g., luv other-org/my-repo).
License
MIT
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
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 luv_cli-0.0.2.tar.gz.
File metadata
- Download URL: luv_cli-0.0.2.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9444b1a72223079317a52cc6eb25d70a089c36cb9e28339d15e0b512e30f7e6
|
|
| MD5 |
829e684d0223b46d2ed77e5a8665c05d
|
|
| BLAKE2b-256 |
50f856f32a9f26274b68752153f77428b48cc30d87a132e0a7add75a6c46c336
|
Provenance
The following attestation bundles were made for luv_cli-0.0.2.tar.gz:
Publisher:
publish.yml on exospherehost/luv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
luv_cli-0.0.2.tar.gz -
Subject digest:
e9444b1a72223079317a52cc6eb25d70a089c36cb9e28339d15e0b512e30f7e6 - Sigstore transparency entry: 1265491768
- Sigstore integration time:
-
Permalink:
exospherehost/luv@d9e10344d4ea4aa9e1842c9634094c863741dc14 -
Branch / Tag:
refs/tags/v0.0.2 - Owner: https://github.com/exospherehost
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d9e10344d4ea4aa9e1842c9634094c863741dc14 -
Trigger Event:
push
-
Statement type:
File details
Details for the file luv_cli-0.0.2-py3-none-any.whl.
File metadata
- Download URL: luv_cli-0.0.2-py3-none-any.whl
- Upload date:
- Size: 10.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75fdba248cc7ef2656212d9021ce17ebfae331b6e5d2ed00713862c5c8531288
|
|
| MD5 |
97b3a0c715f6eb269711aee675fc9314
|
|
| BLAKE2b-256 |
002ddc176a4be40e53543b273cb86f29fee5be9ab571b207976ea98c2b97734b
|
Provenance
The following attestation bundles were made for luv_cli-0.0.2-py3-none-any.whl:
Publisher:
publish.yml on exospherehost/luv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
luv_cli-0.0.2-py3-none-any.whl -
Subject digest:
75fdba248cc7ef2656212d9021ce17ebfae331b6e5d2ed00713862c5c8531288 - Sigstore transparency entry: 1265491901
- Sigstore integration time:
-
Permalink:
exospherehost/luv@d9e10344d4ea4aa9e1842c9634094c863741dc14 -
Branch / Tag:
refs/tags/v0.0.2 - Owner: https://github.com/exospherehost
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d9e10344d4ea4aa9e1842c9634094c863741dc14 -
Trigger Event:
push
-
Statement type: