I have a very normal development flow. So when I have a bit of pressure going on, I ask Claude to create worktree from my Staging branch, but when I complete my work and try to push, it pushes straight to staging. No merge request, no review and staging proceeds with the deployment.
One folder per task#
Almost every ticket I pick up at work touches more than one repo. Before copse, every one of them started with the same prompt, typed by hand: pull staging in the frontend, pull staging in the backend, cut feature/pro-1139 from origin in both, then start.
Git worktrees help with half of that. A worktree is a second checkout of the same repo in a different folder, so you can work on a branch without disturbing the one you already have open. But one task across two or three repos means two or three worktrees scattered in different places, each with its own branch to set up. And once agents are doing some of the work, every ticket needs its own clean copy of each repo, so two jobs don't trip over each other.
So I asked Claude Code for "a task-based work tree CLI" that finds every repo one or two levels down, and puts all the worktrees for one issue in one folder. Before building anything, it went looking. Canopy, gwm, git-worktree-manager and a few others either needed a config file listing the repos, didn't group anything by task, or gave every repo the same branch. None of them quite fit how I work, so I built my own.
copse new PRO-123 -r api -r web -b feature/pro-123That gives you tasks/PRO-123/api and tasks/PRO-123/web, each on its own branch. There's no config file and no database. A task is just a folder. Each repo can have its own branch and base if it needs one, and copse ls shows which ones are dirty, ahead or behind.
It was built for agents from the first message. With --json it prints something a script can read, and if there's no terminal to ask questions in, it exits instead of waiting at a prompt forever. My global CLAUDE.md now says that when I ask for a ticket like PRO-123, Claude runs copse new first and points every edit at tasks/PRO-123/<repo>/, never the main checkout.
Cleanup had to be boring and safe. copse rm won't remove a worktree with uncommitted changes unless you force it. It'll only delete a branch it created for that task, which it tracks with a small note in the repo's git config. A branch like develop that you attached yourself stays where it is.
A day, more or less#
The whole thing happened in one sitting. Claude Code did most of the typing, with one agent writing and another reviewing. I made the calls and got to be wrong about my own push.
First message at 2:42 pm. Four releases on PyPI within ten hours.
It's on GitHub and PyPI, MIT licensed. uv tool install copse gets you the CLI, and npx skills add errhythm/copse gets you the skill that teaches Claude Code how to use it.
