feat(scripts): worktree() shell function applies the --go cd

This commit is contained in:
Francisco Solla 2026-08-07 01:37:02 -03:00
parent b61f1ec36a
commit af6ae72034
3 changed files with 58 additions and 5 deletions

49
.agents/shell/worktree.sh Normal file
View file

@ -0,0 +1,49 @@
# worktree — CLI determinístico de worktrees em torno da fila de claim, com um
# `--go` que realmente troca de diretório.
#
# A lógica determinística (fila → branch → worktree) vive em scripts/worktree.mjs;
# esta função é só a camada de shell que APLICA o `cd <dir>` que o script imprime,
# porque um processo filho (node) não consegue mudar o cwd do shell que o chamou.
#
# Instalação (uma linha no profile):
# source <repo>/.agents/shell/worktree.sh
#
# Uso (terminal interativo):
# worktree next [--go] cria/reutiliza o worktree da próxima Issue claimável;
# com --go, cd para dentro dele
# worktree kill [--force]
#
# Read-only no GitHub — claim continua sendo `pnpm agent:claim`.
worktree() {
local src="${BASH_SOURCE[0]:-$0}"
local root
root="$(cd "$(dirname "$src")/../.." && pwd)"
local has_go=0
local arg
for arg in "$@"; do
if [ "$arg" = "--go" ]; then
has_go=1
fi
done
if [ "$has_go" -eq 0 ]; then
node "$root/scripts/worktree.mjs" "$@"
return $?
fi
local out
out="$(node "$root/scripts/worktree.mjs" "$@")" || return $?
printf '%s\n' "$out"
local dir
dir="$(printf '%s\n' "$out" | sed -n 's/^cd //p' | tail -n 1)"
if [ -n "$dir" ] && [ -d "$dir" ]; then
cd "$dir" || return $?
printf '→ %s\n' "$PWD"
else
printf 'worktree: não consegui aplicar o `cd` da saída do script.\n' >&2
return 1
fi
}

View file

@ -25,6 +25,8 @@ pnpm worktree kill [--force] # destrói o worktree em que o shell atual está
No opencode, isso é o comando **`/worktree next`** / **`/worktree kill`** (`.opencode/commands/worktree.md`), que só repassa `$ARGUMENTS` para o script.
No terminal interativo, para `--go` trocar de diretório de verdade, use a função `worktree()` de **`.agents/shell/worktree.sh`** (uma linha de `source` no profile): o script imprime `cd <dir>` e a função o aplica no shell que te chamou — node não consegue mudar o cwd do shell pai.
## Fluxo quando invocado como skill (agentes que não têm opencode)
1. Rode `pnpm worktree next` e leia a saída inteira. Se a fila estiver vazia, ele para sozinho — não crie worktree sem Issue.

View file

@ -4,10 +4,11 @@
*
* pnpm worktree next [--go] cria worktree a partir de origin/main para a
* próxima Issue claimável; branch `<code>-<slug>`.
* Com `--go`, imprime `cd <dir>` no fim para o
* shell chamador aplicar (node não muda o cwd
* do shell pai; no terminal: `eval "$(pnpm
* worktree next --go)"`).
* Com `--go`, imprime `cd <dir>` no fim — node
* não muda o cwd do shell pai; o shell chamador
* aplica (opencode/CDP usa o opencode command;
* terminal interativo: função `worktree()` em
* `.agents/shell/worktree.sh`, sourced no profile).
* pnpm worktree kill [--force] destrói o worktree em que o shell atual está
* (recusa worktree sujo sem `--force`)
*
@ -131,7 +132,8 @@ const subcommand = positional[0]
if (!subcommand) {
console.log('Uso: pnpm worktree next [--go] | kill [--force]')
console.log(' next [--go] cria worktree da próxima Issue claimável (branch <code>-<slug>);')
console.log(' com --go imprime `cd <dir>` no fim para o shell chamador aplicar')
console.log(' com --go imprime `cd <dir>` no fim (quem aplica o cd: opencode')
console.log(' command, ou a função `worktree()` de .agents/shell/worktree.sh)')
console.log(' kill [--force] destrói o worktree em que você está (recusa sujo sem --force)')
process.exit(1)
}