wt-mcp
MCP server for managing git worktrees per product, enabling agents to create, list, sync, and open tasks with multiple projects, reusable YAML config, and auto-generated Cursor/VS Code workspaces.
README
worktree-manager
CLI para gerenciar git worktrees por produto: várias tasks em paralelo, com config YAML reutilizável, cópia de arquivos/dependências e workspace Cursor/VS Code gerado automaticamente.
Binário: wt · MCP: wt-mcp · Python 3.11+
Índice
- Para quem é
- Como funciona
- Instalação
- Início rápido
- Fluxos de trabalho
- Comandos
- Configuração
- Estado
- MCP para agentes
- Vários produtos
- Documentação
- Desenvolvimento
Para quem é
Útil quando você:
- Mantém mais de um repositório por produto (ex.: API + web, backend + mobile)
- Cria uma pasta por task/ticket com worktrees git isoladas
- Quer reaproveitar arquivos locais (
.env,launch.json,node_modules, etc.) - Abre tudo num
.code-workspacecom pastas extras (docs, utilitários, specs)
Não é um wrapper genérico de git worktree para um único repo solto — o foco é o workspace de produto com N projetos.
Como funciona
Pasta do produto/
├── api/ ← repositório git
├── web/ ← repositório git
├── docs/ ← pasta extra no workspace
└── .worktree-manager/ ← pasta do manager
├── config.yml ← config (versionável)
├── state.yml ← estado local (não versionar)
└── worktrees/
└── TASK-123/
├── api/ ← worktree
├── web/ ← worktree
└── TASK-123.code-workspace
Dois caminhos para criar tasks:
- Em etapas —
create(pasta + workspace + estado) e depoisaddprojeto a projeto - Preset —
create --preset …encadeia create + vários adds
A branch de trabalho default é o nome da task (--branch sobrescreve; no preset, --branch proj=b por projeto).
A base de origem é por projeto (default_base no YAML, com override via --base).
Execute os comandos na pasta base do produto (pai de
.worktree-manager/) ou dentro de.worktree-manager/.
Outro produto = outra pasta = outroinit.
Instalação
Desenvolvimento (recomendado hoje)
git clone <url-deste-repo> worktree-manager
cd worktree-manager
uv venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
uv pip install -e ".[dev]"
wt --version
Alternativa com pip:
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Deixe o venv ativo (ou exponha wt no PATH) para usar em qualquer pasta de produto.
Início rápido
1. Entre na pasta do produto
cd ~/projetos/meu-produto
Estrutura mínima esperada: repositórios git lado a lado (ex.: api/, web/).
2. Inicialize a config
wt init
O assistente pergunta:
- Nome do produto
- Loop de projetos: path → nome (default: basename) → default base
Cria .worktree-manager/config.yml (worktrees em .worktree-manager/worktrees/).
Depois edite copy, workspace_folders e presets, ou use wt projects add.
3. Complete o YAML (exemplo)
name: meu-produto
root: .
worktrees_dir: worktrees
workspace_file: "{task}.code-workspace"
workspace_folders:
- path: docs
projects:
api:
path: api
default_base: main
copy:
- from: .env.local
to: .env.local
web:
path: web
default_base: main
copy:
- from: node_modules
to: node_modules
strategy: rsync
presets:
backend: [api]
frontend: [web]
fullstack: [api, web]
Veja o schema completo em docs/configuracao.md e exemplos em docs/exemplos/.
4. Crie uma task
Rápido (preset):
wt create TASK-123 --preset fullstack --open
# ou com branches explícitas:
wt create TASK-123 --preset fullstack --branch feature/TASK-123 --open
Em etapas:
wt create TASK-123
wt add TASK-123 api
wt add TASK-123 web --base develop
wt open TASK-123
5. Gerencie
wt list
wt status TASK-123
wt sync TASK-123
wt doctor
wt doctor --fix
wt prune
wt remove TASK-123 --force
Fluxos de trabalho
Só um projeto da stack
wt create TASK-10 --preset backend
Começar parcial e evoluir
wt create TASK-11
wt add TASK-11 api --branch feature/TASK-11
# ... trabalhar só na API ...
wt add TASK-11 web --branch feature/TASK-11
Branches e bases diferentes por projeto no mesmo preset
wt create TASK-12 \
--preset fullstack \
--branch api=feature/TASK-12-api \
--branch web=feature/TASK-12-ui \
--base api=main \
--base web=develop
Simular antes de executar
wt create TASK-13 --preset fullstack --dry-run
wt add TASK-13 api --dry-run
wt remove TASK-13 --force --dry-run
wt sync TASK-13 --dry-run
Remover um projeto sem apagar a task
wt remove TASK-12 web --force
Remover tudo (e opcionalmente a branch local)
wt remove TASK-12 --force --delete-branch
Comandos
| Comando | Descrição |
|---|---|
wt init |
Cria .worktree-manager/config.yml |
wt create <task> |
Cria task vazia (pasta + workspace + estado) |
wt create <task> --preset <nome> |
Create + adds do preset |
wt add <task> <project> [--branch <b>] [--base <b>] |
Adiciona projeto à task (branch default = task) |
wt remove <task> [project] --force |
Remove projeto da task ou a task inteira |
wt list |
Lista tasks do estado |
wt projects list |
Lista projetos do config.yml |
wt projects add <path> [--name] [--base] |
Adiciona projeto à config (nome default = basename) |
wt projects remove <nome> --force |
Remove projeto da config |
wt status <task> |
git status dos projetos da task |
wt sync <task> [project] |
Fetch + rebase/merge na base registrada |
wt open <task> |
Abre o .code-workspace (Cursor/VS Code) |
wt doctor [--fix] |
Diagnóstico; --fix tenta corrigir |
wt prune |
Limpa órfãos e ghosts |
wt help [comando] |
Ajuda detalhada |
wt --help / wt --version |
Ajuda curta e versão |
Opções úteis:
| Opção | Onde | Efeito |
|---|---|---|
--branch |
add, create --preset |
Branch de trabalho (default: nome da task) |
--branch proj=b |
create --preset |
Branch por projeto (repetível) |
--base |
add |
Base de origem (senão usa default_base) |
--base proj=branch |
create --preset |
Override de base por projeto |
--strategy |
sync |
rebase (default) ou merge |
--open |
create |
Abre o workspace ao terminar |
--delete-branch |
remove |
Apaga a branch local criada |
--dry-run |
create, add, remove, sync, doctor --fix, prune |
Mostra o plano sem alterar nada |
--force |
remove, sync |
Confirma remoção / permite dirty no sync |
Referência detalhada: docs/comandos.md.
Configuração
Arquivo: .worktree-manager/config.yml.
| Campo | Obrigatório | Default | Descrição |
|---|---|---|---|
name |
sim | — | Nome do produto |
root |
não | . |
Raiz relativa ao produto (pai de .worktree-manager/) |
worktrees_dir |
não | worktrees |
Pasta das tasks (relativa a .worktree-manager/) |
workspace_file |
não | {task}.code-workspace |
Nome do workspace gerado |
workspace_folders |
não | [] |
Pastas extras no workspace |
projects.<id>.path |
sim | — | Path do repositório (relativo à raiz do produto) |
projects.<id>.default_base |
sim | — | Branch de origem padrão |
projects.<id>.copy |
não | [] |
Arquivos/pastas a copiar no add |
projects.<id>.copy[].strategy |
não | rsync |
rsync | copy | skip |
presets |
não | {} |
Nome → lista de ids de projeto |
Não existem allowed_bases nem pattern automático de branch.
Guia completo do schema, init e estado: docs/configuracao.md.
Estado
Arquivo local: .worktree-manager/state.yml.
| Config | Estado | |
|---|---|---|
| Responde | O que pode ser feito | O que já existe |
| Versionar? | Sim (config.yml é útil no time) |
Não |
| Quem escreve | init + edição humana |
Só o CLI |
Sugestão de .gitignore no produto:
.worktree-manager/state.yml
O wt doctor compara estado, pastas em disco e git worktree list (órfãos, drift de branch, worktrees fantasma, etc.).
wt doctor --fix e wt prune corrigem o que for seguro; wt sync atualiza as branches da task com a base.
MCP para agentes
O servidor wt-mcp expõe as mesmas operações da CLI via Model Context Protocol (stdio), para agentes Cursor (e outros clientes MCP) criarem/listarem/sincronizarem tasks sem parsear stdout.
Pré-requisito: pacote instalado (uv tool install --editable . ou uv pip install -e .) e wt-mcp no PATH (which wt-mcp).
Adicionar no Cursor
- Abra Cursor Settings → MCP (ou edite o JSON de MCP).
- Inclua o servidor abaixo.
- Salve e confirme que
worktree-manageraparece como conectado (tools disponíveis no chat/agente).
Global (~/.cursor/mcp.json):
{
"mcpServers": {
"worktree-manager": {
"command": "wt-mcp",
"args": []
}
}
}
Só neste repo (.cursor/mcp.json na raiz do projeto):
{
"mcpServers": {
"worktree-manager": {
"command": "wt-mcp",
"args": []
}
}
}
Se wt-mcp não estiver no PATH, use o caminho absoluto do venv:
{
"mcpServers": {
"worktree-manager": {
"command": "/caminho/para/worktree-manager/.venv/bin/wt-mcp",
"args": []
}
}
}
Uso pelo agente
- Passe
product_root(path absoluto da pasta do produto) quando o cwd do agente não for o produto. - Respostas:
{ "ok": true, "data": … }ou{ "ok": false, "error": { "kind", "message" } }. - Ações destrutivas (
remove,prune,doctorcomfix) exigemconfirm=true(oudry_run=truepara simular).
| Tool | Equivale a |
|---|---|
resolve_product / list_tasks / list_projects |
inventário |
create_task / create_with_preset / add_project |
wt create / --preset / wt add |
remove |
wt remove … --force |
status / sync |
wt status / wt sync |
doctor / prune |
wt doctor [--fix] / wt prune |
workspace_path / open_workspace |
path do workspace / wt open |
Skill opcional (orquestra MCP ou CLI): .cursor/skills/worktree-manager/.
Detalhes e contrato de erro: docs/mcp.md.
Vários produtos
Cada produto tem sua própria pasta .worktree-manager/:
ProdutoA/
├── api/
└── .worktree-manager/
├── config.yml
└── worktrees/
ProdutoB/
├── backend/
├── mobile/
└── .worktree-manager/
├── config.yml
└── worktrees/
cd ~/projetos/ProdutoA && wt init
cd ~/projetos/ProdutoB && wt init
Documentação
| Documento | Conteúdo |
|---|---|
| README.md | Porta de entrada (este arquivo) |
| docs/configuracao.md | Schema YAML, init, estado |
| docs/comandos.md | Referência detalhada dos comandos |
| docs/mcp.md | Servidor MCP (wt-mcp) para agentes |
| docs/exemplos/ | YAMLs de exemplo (genérico + casos) |
| docs/migracao-clinic.md | Caso: migrar script legado Clinic → wt |
| docs/plano-desenvolvimento.md | Histórico de fases / backlog interno |
Exemplos prontos para copiar:
# stack API + web (genérico)
mkdir -p /caminho/do/produto/worktree-manager
cp docs/exemplos/api-web.yml /caminho/do/produto/.worktree-manager/config.yml
# caso Clinic (referência)
mkdir -p /caminho/do/Clinic/worktree-manager
cp docs/exemplos/clinic.yml /caminho/do/Clinic/.worktree-manager/config.yml
Skill opcional do Cursor (orquestra MCP/wt, sem reimplementar lógica):
.cursor/skills/worktree-manager/
Desenvolvimento
source .venv/bin/activate
uv pip install -e ".[dev]"
pytest
wt --help
wt-mcp # sobe o servidor MCP em stdio (usado pelo Cursor)
Layout do pacote:
src/worktree_manager/
├── cli/ # comandos Typer
├── config/ # load/validate/write YAML
├── state/ # estado local
├── git/ # operações git
├── workspace/ # geração .code-workspace
├── mcp/ # servidor MCP (wt-mcp)
├── copyops.py # cópias declarativas
└── services.py # create/add/remove/sync/doctor/prune
Plano e backlog: docs/plano-desenvolvimento.md.
Licença
MIT (ver pyproject.toml).
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。