diff --git a/.agents/shell/worktree.sh b/.agents/shell/worktree.sh new file mode 100644 index 00000000..0958b001 --- /dev/null +++ b/.agents/shell/worktree.sh @@ -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 ` 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 /.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 +} diff --git a/.agents/skills/worktree-next-issue/SKILL.md b/.agents/skills/worktree-next-issue/SKILL.md index b33b2230..e474b685 100644 --- a/.agents/skills/worktree-next-issue/SKILL.md +++ b/.agents/skills/worktree-next-issue/SKILL.md @@ -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 ` 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. diff --git a/scripts/worktree.mjs b/scripts/worktree.mjs index 8b4e8f3a..3ecf1899 100644 --- a/scripts/worktree.mjs +++ b/scripts/worktree.mjs @@ -4,10 +4,11 @@ * * pnpm worktree next [--go] cria worktree a partir de origin/main para a * próxima Issue claimável; branch `-`. - * Com `--go`, imprime `cd ` 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 ` 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 -);') - console.log(' com --go imprime `cd ` no fim para o shell chamador aplicar') + console.log(' com --go imprime `cd ` 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) }