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.
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
leaseIde continue de onde parou. - Reutilização rápida. A redefinição usa
git clean -fd, não-xfd, então arquivos ignorados, comonode_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.