5.3 KiB
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
worktreeque 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 aplicacd <dir>no shell;pnpm worktree planidem;pnpm worktree killdestrói, remove os bancos e aplicacd <main>(~/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
killdestrói.
Objetivo e aceite
pnpm worktree nextepnpm worktree plansem flags aplicam ocdno shell do terminal (hoje exigem--go).--staysuprime ocd(e a futura abertura de opencode — ver OPS26): o script imprime o caminho sem aplicar.--goexplícito continua aceito como no-op — não quebra hábito, script de automação ou a doc existente.pnpm worktree killtermina 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/worktreedo opencode (.opencode/commands/worktree.md). - O comando
/worktreeno 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 nextcria + provisiona + aplica o cd na sessão;/worktree planidem;/worktree killdestrói + aplicacd <main>. 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 imprimemcd <dir>por default; flag--stayno parseArgs; cmdKill imprimecd <mainRoot>no mesmo formato máquina quenext/planjá usam);.agents/shell/worktree.sh(aplica o cd por default, suprime com--stay, aplica também nokill);.opencode/commands/worktree.md(texto de uso das três formas). - Precedente a olhar: o formato
cd <dir>já é o contrato entre o script e a função shell (sed parse na última linha); o kill já resolvemainRootcomoentries[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 linhacd …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) killdeve 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—cmdKilljá imprime "Volte ao main: cd ${mainRoot}"; nada aplicascripts/worktree.mjs:329e400—if (go) console.log(\cd ${dir}`)emnext/plan`.agents/shell/worktree.sh:36-39— cd só quando--gopresente.opencode/commands/worktree.md— instrui o agente a aplicar ocdquando--goAGENTS.mdseção "Per-worktree environments" — documentaworktree next [--go]etc.