Manage isolated development environments with git worktrees and Docker-sandboxed Claude agents.
Vibe mounts your repo into a single long-lived Docker container and creates git worktrees inside it for agent isolation. Multiple agents run as separate processes in one container, each in its own worktree.
- Single container per project — shared filesystem, fast worktree creation
- Git worktrees inside the container at
/worktrees/<feature>for code isolation - Loop mode for running Claude repeatedly (in Ralph Wiggum loops) until task completion
.vibe.yamlfor project-specific config (file copying, env vars, mounts, networking)
# Clone the repo
git clone https://github.com/novarii/vibe-cli.git
cd vibe-cli
# Build and install
make installRequires:
- Go 1.21+
- Docker
- Git
# Create a new feature worktree and start Claude
vibe new auth
# Create multiple worktrees at once
vibe new auth payments api
# Open an existing worktree
vibe open auth
# Run autonomous loop until PR is created
vibe loop auth --yolo
# List all worktrees
vibe list
# Open a shell in a worktree
vibe terminal auth
# Clean up when done
vibe cleanup auth
# Stop the container
vibe stopCreates git worktrees inside the container and starts a Claude session.
vibe new auth # Create worktree, launch Claude
vibe new auth payments api # Create multiple worktrees
vibe new auth --base develop # Base on develop branch- Creates worktree at
/worktrees/<feature>inside the container - Creates branch
feature/<feature> - With a single feature, launches an interactive Claude session
- With multiple features, prints a summary
Flags:
--base BRANCH- Base branch for new worktrees (default:main)
Reopens an existing worktree and continues the previous Claude session.
vibe open authRuns an autonomous loop where Claude executes a prompt file repeatedly.
vibe loop auth # Interactive mode
vibe loop auth --yolo # Full auto mode
vibe loop auth --max-iterations 50 # Limit iterations
vibe loop auth --completion-promise DONE # Custom exit conditionFlags:
--yolo- Non-interactive mode with formatted streaming output--max-iterations N- Stop after N iterations (0 = unlimited)--completion-promise TEXT- Stop when<promise>TEXT</promise>detected--detect-pr- Stop when GitHub PR URL detected (default: true)--prompt-file FILE- Custom prompt file (default: prompt.md)
Exit conditions:
- Max iterations reached
- Completion promise detected in output
- PR created (GitHub URL detected)
- User interrupt (Ctrl+C)
- Claude error (non-zero exit)
Lists all worktrees inside the project's container with their branches.
vibe listOpens an interactive shell in the container at the feature's worktree.
vibe terminal auth
vibe term auth # alias
vibe sh auth # aliasRemoves worktrees and branches inside the container.
vibe cleanup auth # Remove worktree and branch
vibe cleanup auth payments # Remove multiple features
vibe cleanup auth --force # Force removal with uncommitted changes
vibe cleanup auth --remove-container # Also stop and remove the containerFlags:
--force, -f- Force removal even with uncommitted changes--remove-container- Also stop and remove the Docker container
Stops the project's Docker container. It can be restarted later by any command that needs it.
vibe stop--container NAME- Override container name suffix (default: project name). Use this to run multiple containers for different contexts:
vibe new auth --container backend # Creates container vibe-backend
vibe new auth --container frontend # Creates container vibe-frontend- Single container: Your repo is bind-mounted at
/repoinside a long-lived Docker container - Worktree isolation: Each feature gets its own worktree at
/worktrees/<feature>with branchfeature/<feature> - Prompt-driven: Place a
prompt.mdin your worktree with instructions for Claude - Loop execution: In loop mode, Claude reads
prompt.mdeach iteration and works autonomously
The Docker container:
- Uses
vibe-claude:latestimage (built from the included Dockerfile) - Mounts your repo at
/repo - Creates worktrees at
/worktrees/<feature> - Mounts
~/.claudefor Claude authentication - Forwards SSH agent socket for git push/PR creation
- Passes
GH_TOKENenv var for GitHub CLI auth (if set)
Create a .vibe.yaml in your project root:
# Files to copy from /repo to worktree after creation (for gitignored files)
copy:
- .env
- .env.local
- node_modules
# Environment variables to pass to the container
env:
- DATABASE_URL
- API_KEY
# Additional volume mounts
mounts:
- source: /path/on/host
target: /path/in/container
# Docker network to connect to
network: my-network
# Script to run after worktree creation
post_create: npm install| Option | Description |
|---|---|
copy |
Files/globs to copy from /repo to worktree after creation |
env |
Environment variable names to pass through to the container |
mounts |
Additional volume mounts (source/target pairs) |
network |
Docker network to connect the container to |
post_create |
Script to run after worktree creation |
GH_TOKEN- GitHub personal access token forghCLI in containers- Any variables listed in
.vibe.yamlenvsection
# 1. Create a prompt file in your repo
cat > prompt.md << 'EOF'
Study specs/ and implement the next incomplete task.
- Write tests first
- Run tests after changes
- When tests pass, commit and open a PR
EOF
# 2. Start a new feature
vibe new calculator-refactor
# 3. Or run fully autonomous
vibe loop calculator-refactor --yolo --max-iterations 20
# 4. Check on progress
vibe list
vibe terminal calculator-refactor
# 5. Clean up
vibe cleanup calculator-refactorMIT