wt-mcp

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.

Category
访问服务器

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 é

Ú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 etapascreate (pasta + workspace + estado) e depois add projeto a projeto
  2. Presetcreate --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).

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选