# grove

> Original em inglês. Tradução gerada por IA, não pelo autor. [Ler o original em inglês](https://www.ferueda.com/projects/grove).

> Um pool rápido de worktrees Git reutilizáveis com reservas persistentes, disponível por CLI e SDK.

Se você executa muitas tarefas no mesmo repositório, conhece a rotina. Agentes, CI, tarefas paralelas, tanto faz. Clonar de novo. Fazer fetch de novo. Esperar. Criei o Grove para escapar disso.

É um SDK e uma CLI em TypeScript que mantêm um pool de worktrees Git prontos para uso. Você adquire uma reserva, recebe um checkout isolado associado a um `leaseId` estável, faz seu trabalho e libera quando termina. Sem clonar tudo novamente a cada vez. Sem ficar olhando para `git fetch` enquanto outras três tarefas se acumulam atrás.

[Veja o código no GitHub](https://github.com/ferueda/grove)

## Qual problema ele resolve

A maioria das ferramentas trata cada tarefa como um começo do zero. O Grove trata checkouts mais como algo que você pega emprestado e devolve.

Você reserva um espaço com um ID de reserva, faz checkout de uma branch ou referência, executa sua tarefa (mesmo se o processo reiniciar) e depois libera, repara ou destrói o espaço. Seus commits e alterações locais permanecem até você escolher uma política de limpeza: preservar (`preserve`), redefinir (`reset`) ou colocar em quarentena se algo der errado.

## Do que eu gosto

Algumas coisas das quais tenho bastante orgulho:

- **Reservas persistentes.** O estado sobrevive a reinicializações. Adquira novamente o mesmo `leaseId` e continue de onde parou.
- **Reutilização rápida.** A redefinição usa `git clean -fd`, não `-xfd`, então arquivos ignorados, como `node_modules`, continuam ali entre execuções.
- **Recuperação de falhas.** Registro antecipado do estado e um `repair()` explícito quando algo fica preso no meio de uma operação.

## CLI e SDK

O Grove oferece duas formas de uso.

Há uma **CLI** (`@ferueda/grove-cli`) para executar comandos no terminal ou em scripts de shell. Todos os comandos aceitam `--json` com estruturas de resposta estáveis, ótimo para conectar ferramentas e fazer automações rápidas.

Também criei um **SDK TypeScript** (`@ferueda/grove`) porque meus agentes e automações precisavam criar worktrees diretamente no código. Sem chamar uma CLI pelo shell, sem analisar stdout. Seu orquestrador chama `acquire`, recebe um caminho, executa o trabalho e chama `release`. Essa é a interface que eu realmente queria para fluxos com agentes.
