# Worktree CLI: `--go` vira o padrão (escape `--stay`) e `kill` volta ao main Status: rascunho Atualizado em: 2026-08-10 Issue: #569 Priority: P2 Model: composer-2.5 model-local: deepseek-v4-flash-high Impeccable: A — N/A (CLI de dev; sem superfície de usuário de produto) Canvas UI: N/A — sem UI Appetite: ~0,5 dia eng; um outcome verificável (o terminal sempre termina no lugar certo) ## Intenção Hoje `pnpm worktree next` / `plan` só aplicam o `cd` com `--go` explícito — mas **quase toda** invocação quer ir para o worktree; o raro é ficar. O usuário lança `worktree next --go` e `worktree plan --go` todo dia, e o caso incomum (automação, olhar sem entrar, rodar de dentro do opencode) é o que deveria pedir o flag. Além disso, `worktree kill` destrói o worktree em que o shell está e deixa o terminal órfão num diretório que não existe mais — o output até imprime "Volte ao main: cd …", mas ninguém aplica esse cd, então o prompt do shell fica num cwd morto até o usuário sair manualmente. ## Persona e fluxo - **Persona / contexto:** Francisco no terminal (bash), fluxo diário de abrir/fechar worktrees; e o agente opencode rodando o comando `/worktree`. - **Job principal:** um comando `worktree` que termina me deixando no lugar certo — dentro do worktree quando crio, no repo principal quando destruo. - **Fluxo desejado:** `pnpm worktree next` (sem flags) cria/reusa e provisiona o worktree **e** aplica `cd ` no shell; `pnpm worktree plan` idem; `pnpm worktree kill` destrói, remove os bancos **e** aplica `cd
` (`~/Code/teqo`); quem não quer entrar usa `--stay`. - **Anti-goals de produto:** não criar um sistema de flags complexo (um escape só); não mudar a lógica determinística de branch/slot/provisionamento; não alterar o que `kill` destrói. ## Objetivo e aceite - `pnpm worktree next` e `pnpm worktree plan` sem flags aplicam o `cd` no shell do terminal (hoje exigem `--go`). - `--stay` suprime o `cd` (e a futura abertura de opencode — ver OPS26): o script imprime o caminho sem aplicar. - `--go` explícito continua aceito como no-op — não quebra hábito, script de automação ou a doc existente. - `pnpm worktree kill` termina com o shell no main repo; o cwd nunca fica num diretório destruído. - O comportamento vale nas duas superfícies que aplicam o cd: função `worktree()` do `.agents/shell/worktree.sh` (terminal) e comando `/worktree` do opencode (`.opencode/commands/worktree.md`). - **O comando `/worktree` no TUI do opencode continua criando/reutilizando o worktree (roda o script completo, com provisionamento) — o cd é consequência, não a função dele.** Com default-go, `/worktree next` cria + provisiona + aplica o cd na sessão; `/worktree plan` idem; `/worktree kill` destrói + aplica `cd
`. - `AGENTS.md` (seção "Per-worktree environments") reflete a nova semântica default-go/`--stay`. ## Dados (intenção) - **Vou apresentar dados?** Não — sem superfície de dados; é ergonomia de CLI de dev. ## Direção no codebase (hipótese) - **Áreas prováveis:** `scripts/worktree.mjs` (cmdNext/cmdPlan imprimem `cd ` por default; flag `--stay` no parseArgs; cmdKill imprime `cd ` no mesmo formato máquina que `next`/`plan` já usam); `.agents/shell/worktree.sh` (aplica o cd por default, suprime com `--stay`, aplica também no `kill`); `.opencode/commands/worktree.md` (texto de uso das três formas). - **Precedente a olhar:** o formato `cd ` já é o contrato entre o script e a função shell (sed parse na última linha); o kill já resolve `mainRoot` como `entries[0]?.path`. - **Risco de acoplamento:** o opencode command (`/worktree`) e a função shell dividem a mesma saída do script — qualquer mudança de formato quebra os dois; manter UMA linha `cd …` no fim, sempre. ## Dependências - Nenhuma. (Base de semântica para OPS26 e OPS27.) ## Fora de escopo - Abertura do opencode ao "go" — item próprio (OPS26). - O subcomando `worktree new` — item próprio (OPS27). - Mudanças no provisionamento (porta/bancos/env) — pré-existente, não é o alvo. ## Rabbit holes de produto - **"Vários escapes":** `--no-go`, `--here`, `--cd`… um só, com nome claro. - **"O script deve detectar terminal vs opencode":** não — o script imprime o `cd`; quem aplica (shell function vs opencode command) decide o que fazer com ele. Manter o contrato de saída simples. ## Questões em aberto (produto) - **Nome do escape?** **Opções:** A) `--stay` | B) `--no-go` | C) `--here`. **Recomendação:** A — curto, lê como o oposto de "go" e não parece flag de modo. _(confirmado no gate — `--stay`)_ - **`kill` deve suportar `--stay` (não voltar ao main)?** **Opções:** A) não — kill sempre volta ao main | B) sim, por simetria. **Recomendação:** A — ficar num cwd destruído é exatamente o bug que estamos corrigindo; quem roda kill por automação não depende do cwd do terminal pai. ## Referências - GitHub Issue #569 - `scripts/worktree.mjs:444-481` — `cmdKill` já imprime "Volte ao main: cd ${mainRoot}"; nada aplica - `scripts/worktree.mjs:329` e `400` — `if (go) console.log(\`cd ${dir}\`)`em`next`/`plan` - `.agents/shell/worktree.sh:36-39` — cd só quando `--go` presente - `.opencode/commands/worktree.md` — instrui o agente a aplicar o `cd` quando `--go` - `AGENTS.md` seção "Per-worktree environments" — documenta `worktree next [--go]` etc.