5.3 KiB
Worktree new: worktree genérico sem função pré-definida
Status: rascunho Atualizado em: 2026-08-10 Issue: #572 Priority: P3 Model: composer-2.5 model-local: deepseek-v4-flash-high Impeccable: A — N/A (CLI de dev; sem UI de produto) Canvas UI: N/A — sem UI Appetite: ~0,5–1 dia eng; um outcome verificável (worktree neutro criado e provisionado com um comando)
Intenção
worktree next está amarrado à fila de claim (próxima Issue claimável) e worktree plan ao /plan-issue — os dois carregam uma função pré-definida. Mas às vezes a intenção é aberta: explorar uma ideia antes de virar Issue, planejar e executar algo sem registrar nada, ou só conversar com o agente num ambiente isolado (como esta sessão). Hoje não existe um subcomando para isso — o usuário precisaria de um git worktree add manual, sem provisionamento (porta, bancos próprios, envs). Queremos worktree new [bag]: um worktree neutro, com o mesmo ambiente isolado dos outros, sem propósito declarado.
Persona e fluxo
- Persona / contexto: Francisco no terminal, querendo um espaço de trabalho isolado sem compromisso com a fila nem com a skill de planejamento.
- Job principal: criar um worktree provisionado e entrar nele, sem decidir antes o que vai fazer.
- Fluxo desejado:
worktree new→ branchwork/<n>sequencial livre, provisionado (slot/porta/bancos próprios, comentáriogerado por pnpm worktree new), e com o default-go (OPS24) termina comcdno worktree; com a OPS26, abre o opencode com os presets sem skill inicial — "apenas conversar".worktree new <bag>→ branchwork/<bag>(sufixo-2/-3em colisão).--staysuprime cd/launch. - Anti-goals de produto: não virar um segundo
plan(sem função de planejamento embutida); não colidir com a fila nem com os branches de claim; não propor branch sem provisionamento.
Objetivo e aceite
worktree new [bag]cria um worktree a partir deorigin/maincom branchwork/<bag>(colisão → sufixo-2/-3) ouwork/<n>sequencial livre sem bag — prefixo minúsculowork/…que nunca colide com<Code>-<slug>denextnem complans/plan-issue-…deplan.- Provisionamento idêntico ao
plan: env isolado compurpose: 'new', porta3100+slot, bancos próprios, migrations aplicadas;--no-migraterespeitado. - Cada invocação cria um worktree diferente (mesmo comportamento de paralelismo do
plan). - Herda a semântica da OPS24 (
--godefault,--stay) e, quando a OPS26 estiver em main, o launch do opencode sem primeira mensagem. worktree killfunciona de dentro dele (já é o padrão dos outros — nada novo aqui além do teste de colisão de nomes).- Help/uso do script (
pnpm worktreesem args) documenta o subcomando;AGENTS.mdatualizado.
Dados (intenção)
- Vou apresentar dados? Não.
Direção no codebase (hipótese)
- Áreas prováveis:
scripts/worktree.mjs(novocmdNewanálogo aocmdPlan— mesmoplanBranchName-like para o namespacework/, mesmo fluxo de taken-set,purpose: 'new'no provision);scripts/lib/worktree.mjs(função de nome de branch genérica, se valer a pena generalizar);.agents/shell/worktree.sh+.opencode/commands/worktree.md+AGENTS.md(documentação). - Precedente a olhar:
cmdPlan(scripts/worktree.mjs:343-401) é o molde — branch sem Issue,code: null, taken-set de refs locais+remotos. - Risco de acoplamento: o namespace
work/…precisa continuar minúsculo (a regra de colisão denexté o prefixo maiúsculo<Code>-<slug>); oreadLiveSlots/worktreeEnvironmentjá tratam qualquer branch.
Dependências
- OPS24 (semântica default-go/
--stay— onewnasce já no novo padrão, sem--goexplícito). - OPS26 (opcional: launch do opencode sem skill inicial — o
newfunciona sem ela).
Fora de escopo
- Uma "terceira função" embutida (ex.:
worktree new --issue) — para isso existemnexteplan. - Nomeação automática por data/hash randômico — sequencial (
<n>) e porbagcobrem os dois usos. - Mudanças no provisionamento.
Rabbit holes de produto
- "Worktree sem nome = bag aleatório": nomes legíveis (bag) ou sequenciais bastam; aleatório só atrapalha o
kill/localização. - "
newdeveria perguntar o que vamos fazer": o ponto é justamente não perguntar — worktree neutro, a conversa decide depois.
Questões em aberto (produto)
- Prefixo do branch? Opções: A)
work/<slug>| B)wip/<slug>| C)sandbox/<slug>. Recomendação: A — neutro, não dá a entender "em andamento" nem "brinquedo". (confirmado no gate —work/) newabre o opencode (OPS26) com o quê? Opções: A) com os presets mas sem primeira mensagem (só modelo + auto-approve; "apenas conversar") | B) sem abrir (só cd). Recomendação: A — é o caso de uso explícito do pedido ("apenas conversar com o agente"); quem não quer usa--stay. (confirmado no gate)
Referências
- GitHub Issue #572
scripts/worktree.mjs:343-401—cmdPlan: molde de branch sem Issue (taken-set,code: null, provision)scripts/lib/worktree.mjs—planBranchName(padrão de nome com sufixo de colisão a generalizar parawork/)AGENTS.mdseção "Per-worktree environments" — onde documentar o subcomando