Spawn multi-repo worktree workspaces for feature development
Project description
Spawnpoint
Spawn multi-repo worktree workspaces for feature development.
Working on a feature that spans multiple repos? Spawnpoint creates a dedicated folder with git worktrees from each repo on the same branch, installs dependencies, and copies over config files — so you can start coding (or start a Claude session) immediately.
Install
macOS app
Download the latest .dmg from Releases and drag Spawnpoint into Applications. Lives in your menu bar — no terminal required.
Source: mac/.
CLI
pipx install spawnpoint
Or with pip:
pip install spawnpoint
This installs both spawnpoint and sp as CLI commands. All examples below use sp for brevity.
Quick Start
sp create # select repos, name a branch, spawn worktrees
sp create -y # auto-select default base branches (skip base branch prompts)
sp list # view all workspaces
sp add # add repos to the current workspace
sp cleanup # select and remove worktree workspaces
On first run, Spawnpoint will ask you to configure your scan directories and workspace location.
How It Works
- Select repos — Spawnpoint scans your code directories and presents a fuzzy-searchable list of git repos
- Name a branch — Enter a branch name for your feature
- Spawn — For each repo, Spawnpoint:
- Creates a git worktree (or new branch if needed)
- Initializes submodules
- Copies
.envfiles,CLAUDE.md, and other config files from the original repo - Installs dependencies (detects npm/pnpm/yarn/bun, pip/uv/poetry, bundler, go modules)
All worktrees land in a single folder (~/.spawnpoint/workspaces/<branch-name>/) so you can open the whole workspace in your editor or start an AI coding session.
Commands
| Command | Description |
|---|---|
sp create |
Spawn worktree workspaces |
sp create -y |
Auto-select default base branches |
sp list |
List all workspaces |
sp list --cd |
Interactively select a workspace to cd into |
sp repos |
List repositories available to select |
sp add |
Add repos to the current workspace |
sp cleanup |
Remove worktree workspaces |
sp init |
Run interactive setup |
sp config |
View current config |
sp config --edit |
Edit config in $EDITOR |
sp config --reset |
Reset to defaults |
sp update |
Update to latest version |
sp --version |
Show version |
Adding repos to a workspace
When you're inside a spawnpoint workspace and need another repo, run:
sp add
Spawnpoint detects the current workspace and branch, shows repos not yet in the workspace, and adds them. If the workspace was originally single-repo, it automatically restructures to multi-repo layout.
Listing workspaces
sp list
Shows a table of all workspaces with repo count, branch, dirty status, and age.
Use sp list --cd (or sp list with shell integration) to interactively pick a workspace and cd into it.
Non-Interactive Mode (for agents & scripts)
Every interactive command can run fully non-interactively with --no-input (-n), so coding agents and scripts can drive Spawnpoint without prompts. In this mode, every selection must be supplied via flags — a missing required flag exits non-zero with a clear error instead of hanging.
Add --json to any command for machine-readable output on stdout (human-readable text stays on stderr).
Discover what's available
sp repos --json # repos you can pass to --repos
sp list --json # existing workspaces (names usable as --workspaces / --workspace)
Create a workspace
sp create --no-input --repos api,web --branch feat-x --base main --json
--repos— comma-separated repo names (match the names fromsp repos).--branch— branch name (required).--base— base branch for branches that don't exist yet. Optional; defaults to each repo's detected default branch. Required only if no default can be detected.
On success it prints the workspace path to stdout (capture with $(...)), or full JSON with --json.
Add repos to the current workspace
Run from inside a workspace:
sp add --no-input --repos api --base main --json
Remove workspaces
sp cleanup --no-input --workspaces feat-x,bug-y --delete-branches --json
--workspaces— comma-separated workspace names (fromsp list).--delete-branches/--keep-branches— required; whether to delete the branches from parent repos.
cd into a workspace
sp list --cd --no-input --workspace feat-x
Prints the workspace path to stdout (and writes the cd-path file used by shell integration).
If no config exists yet, non-interactive commands auto-create one from detected defaults instead of prompting.
Agent skill
A bundled Claude Code / agent skill teaches agents to drive Spawnpoint non-interactively. Install it via skills.sh:
npx skills add mihirgupta0900/spawnpoint
This adds the spawnpoint skill so agents automatically know to use --no-input --json and the correct flags for each command.
Configuration
Config lives at ~/.spawnpoint/config.toml:
# Directories to scan for git repos
scan_dirs = ['~/code', '~/projects']
# Where workspaces are created
worktree_dir = '~/.spawnpoint/workspaces'
# Additional directories to scan during cleanup (for worktrees created at previous locations)
additional_worktree_dirs = []
# How deep to scan for repos (1-4)
scan_depth = 2
# Files/dirs to copy into new worktrees
copy_patterns_globs = ['.env*']
copy_patterns_files = ['AGENT.md', 'CLAUDE.md', 'GEMINI.md']
copy_patterns_dirs = ['.vscode', 'docs']
# Auto-install dependencies after worktree creation
auto_install_deps = true
# Check for new versions on startup
check_updates = true
Additional worktree dirs
If you change worktree_dir, workspaces created at the old location won't be found during cleanup. Add the old path to additional_worktree_dirs so cleanup and list can still find them:
worktree_dir = '~/new-location/workspaces'
additional_worktree_dirs = ['~/.spawnpoint/workspaces']
When creating a new branch, Spawnpoint automatically detects the repo's default branch to use as the base. No configuration needed.
Shell Integration
During sp init, you'll be offered to install a shell function that wraps common commands with auto-cd:
sp() {
local cmd="${1:-create}"
shift 2>/dev/null
local cd_file="$HOME/.spawnpoint/.cd_path"
rm -f "$cd_file"
case "$cmd" in
create) spawnpoint create "$@" ;;
list|ls) spawnpoint list --cd "$@" ;;
*) spawnpoint "$cmd" "$@" ;;
esac
if [ -f "$cd_file" ]; then
local dir=$(cat "$cd_file")
rm -f "$cd_file"
[ -n "$dir" ] && cd "$dir"
fi
}
With shell integration:
sp— create a workspace and cd into itsp listorsp ls— pick a workspace and cd into itsp cleanup,sp add, etc. — passed through to spawnpoint
Without shell integration, sp still works for all commands — you just won't get auto-cd for create/list.
Requirements
- Python 3.10+
- git
Uninstall
pipx uninstall spawnpoint
rm -rf ~/.spawnpoint
License
MIT
Project details
Release history Release notifications | RSS feed
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 spawnpoint-0.10.0.tar.gz.
File metadata
- Download URL: spawnpoint-0.10.0.tar.gz
- Upload date:
- Size: 2.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3674ef4d8c73102e49cf11412ca6c1a1a24f6c56cbaa5dad7f912cd241f15854
|
|
| MD5 |
fe512bf1f2a24b2dbef5be86b4cbb219
|
|
| BLAKE2b-256 |
9c0986567064ec6ff7420f247f46a3f74bd9e34b94eb33ec5fd1fef4432ca246
|
Provenance
The following attestation bundles were made for spawnpoint-0.10.0.tar.gz:
Publisher:
publish.yml on mihirgupta0900/spawnpoint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spawnpoint-0.10.0.tar.gz -
Subject digest:
3674ef4d8c73102e49cf11412ca6c1a1a24f6c56cbaa5dad7f912cd241f15854 - Sigstore transparency entry: 1708043660
- Sigstore integration time:
-
Permalink:
mihirgupta0900/spawnpoint@70d307f6f2b7603c87aeb689c97d5883a7b262b9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mihirgupta0900
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@70d307f6f2b7603c87aeb689c97d5883a7b262b9 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file spawnpoint-0.10.0-py3-none-any.whl.
File metadata
- Download URL: spawnpoint-0.10.0-py3-none-any.whl
- Upload date:
- Size: 30.3 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 |
ebe54a561939fbf41141897e7ccfcfa54e38f8e5e59d8203e4022bf81a987758
|
|
| MD5 |
4e88231ee75c80aad200d5092bfb4f7c
|
|
| BLAKE2b-256 |
972b1bf78bd9a428be3cc44502919df992e8bce0b489f3915a1244f44f1c283f
|
Provenance
The following attestation bundles were made for spawnpoint-0.10.0-py3-none-any.whl:
Publisher:
publish.yml on mihirgupta0900/spawnpoint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spawnpoint-0.10.0-py3-none-any.whl -
Subject digest:
ebe54a561939fbf41141897e7ccfcfa54e38f8e5e59d8203e4022bf81a987758 - Sigstore transparency entry: 1708043673
- Sigstore integration time:
-
Permalink:
mihirgupta0900/spawnpoint@70d307f6f2b7603c87aeb689c97d5883a7b262b9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mihirgupta0900
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@70d307f6f2b7603c87aeb689c97d5883a7b262b9 -
Trigger Event:
workflow_dispatch
-
Statement type: