A lightweight framework for making simultaneous agentic updates to multiple repositories.
The first time you are setting up this project, you will need to:
- Install uv
- Run
uv syncto create a virtual environment and install all dependencies - Copy
config-example.tomltoconfig.tomland fill in your configuration and credentials
Optional config:
expected_source_repo_branch(example:"dev"): if set, Launchpad will pause before creating each worktree until the source repo is on this branch.
Once this project is set up, you can get started with:
uv run python launch.py -hYou can load work items from a local text file. Each line that starts with - is treated as a work item title; all other lines are ignored. The file's parent directory is used as the relevant source directory for the items it contains.
# Load work items from a local todo file
uv run python launch.py --todo-file ./todo
# The flag can be repeated to combine multiple files
uv run python launch.py --todo-file ./todo --todo-file ../other-repo/todoExample todo file:
- Add retry logic to the upload client
- Fix the off-by-one error in the pagination helper
You can load work items directly from GitHub issues:
Set github.access_token in config.toml if queries need private-repo access.
# Pull issues using a GitHub issue query for one repo
uv run python launch.py --github-issue-query "repo:owner/repo is:open label:bug sort:updated-desc"
# Launch a single issue by number
uv run python launch.py --github-issue-query "repo:owner/repo is:issue 123"
# Mix and match multiple sources
uv run python launch.py \
--todo-file ./todo \
--github-issue-query "repo:owner/repo-a is:open assignee:@me" \
--github-issue-query "org:owner is:open label:bug"The query uses GitHub's issue search syntax. To target a single issue, include the issue number directly in the query string along with the repo qualifier.
You can load work items from Jira using JQL:
uv run python launch.py --jira-jql "project = CORE AND status = 'Backlog' ORDER BY created DESC"
# Launch a single Jira ticket by key
uv run python launch.py --jira-jql "key = CORE-123"Required config for Jira (set in config.toml):
jira.org_namejira.emailjira.api_token
You can load work items from Linear:
# Launch a single Linear issue by identifier
uv run python launch.py --linear-query "ENG-123"
# Pull issues using a Linear IssueFilter as JSON
uv run python launch.py --linear-query '{"team":{"key":{"eq":"ENG"}},"state":{"type":{"neq":"completed"}}}'The query is either an issue identifier (e.g. ENG-123) or a Linear IssueFilter encoded as JSON.
Required config for Linear (set in config.toml):
linear.api_key— a Linear personal API key