A CLI tool to automate git worktree and Docker Compose development workflows.
- π± Create isolated development environments using git worktrees
- π§ Automatic
.env
file generation from templates - π’ Smart port allocation to avoid conflicts
- π Centralized worktree management in
.sprout/
directory - π¨ Beautiful CLI interface with colors and tables
pip install sprout-cli
For development:
# Clone the repository
git clone https://github.com/SecDev-Lab/sprout.git
cd sprout
# Install in development mode
pip install -e ".[dev]"
Note: Sprout works in any git repository. .env.example
files are optional - if you don't have them, sprout will simply create worktrees without .env
generation.
- (Optional) Create a
.env.example
template in your project root (and optionally in subdirectories) for automatic.env
generation:
# API Configuration
API_KEY={{ API_KEY }}
API_PORT={{ auto_port() }}
# Database Configuration
DB_HOST=localhost
DB_PORT={{ auto_port() }}
# Example: Docker Compose variables (preserved as-is)
# sprout will NOT process ${...} syntax - it's passed through unchanged
# DB_NAME=${DB_NAME}
For monorepo or multi-service projects, you can create .env.example
files in subdirectories:
repo/
.env.example # Root configuration
service-a/
.env.example # Service A specific config
service-b/
.env.example # Service B specific config
- Create and navigate to a new development environment in one command:
cd $(sprout create feature-branch --path)
What happens when you run sprout create
:
- If
.env.example
files exist: Sprout will generate corresponding.env
files with populated variables and unique port assignments - If no
.env.example
files exist: Sprout will show a warning and create the worktree without.env
generation
This single command:
- Creates a new git worktree for
feature-branch
- Generates
.env
files from your templates (if.env.example
files exist) - Outputs the path to the new environment
- Changes to that directory when wrapped in
cd $(...)
- Start your services:
docker compose up -d
If you prefer to see the creation output first:
# Create the environment
sprout create feature-branch
# Then navigate to it
cd $(sprout path feature-branch)
Create a new development environment with automated setup.
Options:
--path
: Output only the worktree path (useful for shell command substitution)
Examples:
# Create and see progress messages
sprout create feature-xyz
# Create and navigate in one command
cd $(sprout create feature-xyz --path)
List all managed development environments with their status.
The output includes index numbers that can be used with other commands:
sprout ls
# Output:
# ββββββββ³ββββββββββββββββββ³ββββββββββββββββββ³βββββββββ³βββββββββββββββββββ
# β No. β Branch β Path β Status β Last Modified β
# β‘βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
# β 1 β feature-auth β .sprout/feat... β β 2025-06-27 14:30 β
# β 2 β bugfix-api β .sprout/bugf... β β 2025-06-27 15:45 β
# ββββββββ΄ββββββββββββββββββ΄ββββββββββββββββββ΄βββββββββ΄βββββββββββββββββββ
Remove a development environment (with confirmation prompts).
You can use either the branch name or the index number from sprout ls
:
# Remove by branch name
sprout rm feature-auth
# Remove by index number
sprout rm 1
Get the filesystem path of a development environment.
You can use either the branch name or the index number from sprout ls
:
# Get path by branch name
sprout path feature-auth
# Output: /path/to/project/.sprout/feature-auth
# Get path by index number
sprout path 1
# Output: /path/to/project/.sprout/feature-auth
# Use with cd command
cd $(sprout path 2)
Show the version of sprout.
sprout supports two types of placeholders in .env.example
:
-
Variable Placeholders:
{{ VARIABLE_NAME }}
- First: Checks if the variable exists in your environment (e.g.,
export API_KEY=xxx
) - Then: If not found in environment, prompts for user input
- Example:
{{ API_KEY }}
will use$API_KEY
if set, otherwise asks you to enter it
- First: Checks if the variable exists in your environment (e.g.,
-
Auto Port Assignment:
{{ auto_port() }}
- Automatically assigns available ports
- Avoids conflicts across ALL services in ALL sprout environments
- Checks system port availability
- Ensures global uniqueness even in monorepo setups
-
Docker Compose Syntax (Preserved):
${VARIABLE}
- NOT processed by sprout - passed through as-is
- Useful for Docker Compose variable substitution
- Example:
${DB_NAME:-default}
remains unchanged in generated.env
# Set environment variable
export API_KEY="my-secret-key"
# Create sprout environment - API_KEY will be automatically used
sprout create feature-branch
# β API_KEY in .env will be set to "my-secret-key" without prompting
# For unset variables, sprout will prompt
sprout create another-branch
# β Enter a value for 'DATABASE_URL': [user input required]
Try out the monorepo functionality with the included sample:
-
Navigate to the sample monorepo:
cd sample/monorepo
-
Set required environment variables:
export API_KEY="your-api-key" export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/myapp" export REACT_APP_API_KEY="your-frontend-api-key" export JWT_SECRET="your-jwt-secret" export SMTP_USER="your-smtp-username" export SMTP_PASS="your-smtp-password"
-
Create a development environment:
sprout create monorepo-feature
-
Navigate to the created environment:
cd .sprout/monorepo-feature
-
Verify all services have unique ports:
find . -name "*.env" -exec echo "=== {} ===" \; -exec cat {} \;
-
Start all services:
cd sample/monorepo docker-compose up -d
The sample includes:
- Root service: Database and Redis with shared configuration
- Frontend: React app with API integration
- Backend: REST API with authentication
- Shared: Utilities with message queue and monitoring
Each service gets unique, conflict-free ports automatically!
- Architecture Overview - Design philosophy, architecture, and implementation details
- Detailed Usage Guide - Comprehensive usage examples and troubleshooting
# Install development dependencies
make setup
# Run tests
make test
# Run tests with coverage
make test-cov
# Run linter
make lint
# Format code
make format
# Run type checking
make typecheck
- Python 3.11+
- Git
- Docker Compose (optional, for Docker-based workflows)
See LICENSE file.