Skip to main content
Glama

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


Related MCP server: batuta-mcp

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-workspace com 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:

  1. Em etapas — create (pasta + workspace + estado) e depois add projeto a projeto

  2. 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 = outro init.


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:

  1. Nome do produto

  2. 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

  1. Abra Cursor Settings → MCP (ou edite o JSON de MCP).

  2. Inclua o servidor abaixo.

  3. Salve e confirme que worktree-manager aparece 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, doctor com fix) exigem confirm=true (ou dry_run=true para 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).

Available Tools

13 tools
add_projectB

Adiciona um projeto (pelo nome da config) a uma task existente.

Inputs: task (required), project (required), base, branch, +2 more. Returns: object

create_taskB

Cria uma task vazia (pasta + workspace + estado), sem worktrees git.

Inputs: task (required), dry_run, product_root. Returns: object

create_with_presetC

Cria task e adiciona os projetos do preset (branch default = nome da task).

Inputs: task (required), preset (required), branch, dry_run, +3 more. Returns: object

doctorC

Diagnostica inconsistências; com fix=true tenta corrigir (exige confirm).

Inputs: fix, confirm, dry_run, product_root. Returns: object

list_projectsB

Lista projetos configurados no config.yml.

Inputs: product_root. Returns: object

list_tasksC

Lista tasks do estado (empty/ready/broken) com projetos e branches.

Inputs: product_root. Returns: object

open_workspaceC

Abre o .code-workspace no Cursor/VS Code.

Inputs: task (required), product_root. Returns: object

pruneA

Remove pastas órfãs e worktrees git fantasma. Exige confirm=true (ou dry_run).

Inputs: confirm, dry_run, product_root. Returns: object

removeC

Remove um projeto da task ou a task inteira. Exige confirm=true (ou dry_run).

Inputs: task (required), confirm, dry_run, project, +2 more. Returns: object

resolve_productC

Resolve o produto e resume name, projects, presets e tasks.

Inputs: product_root. Returns: object

statusB

Retorna git status (linhas) de cada projeto da task.

Inputs: task (required), product_root. Returns: object

syncC

Fetch + rebase/merge na base registrada de cada projeto da task.

Inputs: task (required), force, dry_run, project, +2 more. Returns: object

workspace_pathA

Retorna o path do .code-workspace da task (não abre o editor).

Inputs: task (required), product_root. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 13 tools

    Disambiguation4/5

    Most tools have clear, distinct purposes: listing, creating, syncing, removing, and diagnosing. Minor overlap exists between create_task and create_with_preset, and between remove and add_project, but descriptions clarify the differences.

    Naming Consistency3/5

    Names mix styles: some are verb_noun (list_tasks, create_task), while others are bare verbs (sync, remove, status, prune) or noun-ish (workspace_path, open_workspace). This inconsistency makes it less predictable, though still readable.

    Tool Count5/5

    With 13 tools, the server is well-scoped for managing development tasks and projects. Each tool addresses a distinct need without being overwhelming.

    Completeness4/5

    The tool surface covers core lifecycle operations: create, list, resolve, add, remove, sync, status, and maintenance. Minor gaps exist (e.g., no explicit update/rename task), but the set is sufficient for the domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      F
      maintenance
      MCP server that decomposes tasks into plans with disjoint file boundaries, validates overlaps, and creates git worktrees with a ready prompt per plan.
      3
      98 npm
      Apache 2.0
    • A
      license
      A
      quality
      D
      maintenance
      A filesystem-based MCP server for AI coding agents to coordinate work across git worktrees by claiming files, checking for conflicts, and logging progress without affecting the repository's git history.
      5
      MIT