diff --git a/.agents/shell/worktree.sh b/.agents/shell/worktree.sh index 5b1d2344..32808e8d 100644 --- a/.agents/shell/worktree.sh +++ b/.agents/shell/worktree.sh @@ -20,10 +20,10 @@ # rejeita o flag e só imprime o helper; variantes ficam na config global da # máquina, via Ctrl+T). Modelo por invocação: `--cheap` # (cheapestinference/deepseek-v4-flash), `--pro` (deepseek/deepseek-v4-pro), -# `--zen` (opencode-go/ox-alpha-free), `--go` (opencode-go/hy3), `--alibaba` +# `--zen` (opencode/muse-spark-1.3-contributor-free), `--go` (opencode-go/deepseek-v4.1-flash), `--alibaba` # (alibaba-token-plan/deepseek-v4-flash), `--glm` (opencode-go/glm-5.3-flash), # `--free` (openrouter/openrouter/free) no mapa fixo `WORKTREE_MODEL_MAP` -# (OPS93 menu; valores OPS95); sem flag o preset `deepseek/deepseek-flash` +# (OPS93 menu; valores OPS95; `--go`/`--zen` OPS112); sem flag o preset `deepseek/deepseek-flash` # permanece. Sem `exec` de propósito: ao sair do opencode, o terminal volta ao # shell dentro do worktree. Presets são constantes em scripts/lib/worktree.mjs; # o ciclo de vida das sessões vive em scripts/agent-session.mjs. O marcador @@ -64,8 +64,8 @@ # flag de modelo como no `next` # worktree kill [--force] destrói o worktree atual e cd para o main por padrão # -# `--go` remapeado em OPS93 para o provider OpenCode Go e em OPS95 para o modelo `opencode-go/hy3` -# (antes no-op do OPS24). Claim determinístico: `next` claima antes de criar o worktree (mesma fila e +# `--go` remapeado em OPS93 para o provider OpenCode Go, em OPS95 para `opencode-go/hy3` +# e em OPS112 para `opencode-go/deepseek-v4.1-flash` (antes no-op do OPS24). Claim determinístico: `next` claima antes de criar o worktree (mesma fila e # lock de `pnpm agent:claim`); `plan`/`new`/`fix`/`kill` não tocam Issues. worktree() { diff --git a/.agents/skills/worktree-next-issue/SKILL.md b/.agents/skills/worktree-next-issue/SKILL.md index 0e80d72e..6a883542 100644 --- a/.agents/skills/worktree-next-issue/SKILL.md +++ b/.agents/skills/worktree-next-issue/SKILL.md @@ -29,9 +29,9 @@ No opencode, isso é o comando **`/worktree next`** / **`/worktree kill`** (`.op `plan` é o primo do `next`: worktree de **planejamento** para rodar a skill `/plan-issue` sem ocupar o main. **Cada invocação cria um DIFERENTE** (sessões paralelas): com `bag` opcional → branch `plans/plan-issue-` (sufixo `-2`/`-3` se o nome já estiver vivo); sem `bag` → próximo sequencial `plans/plan-issue-` livre. Não é nomeado por Issue nenhuma — proposital, para um `next` posterior da próxima Issue nunca colidir em branch nem em slot (prefixo minúsculo `plans/…` vs branch `-` sempre uppercase-led). `new` é o irmão **neutro** (sem função pré-definida — explorar ideia, conversar, planejar sem registrar): mesma semântica de "um DIFERENTE por invocação", branch `work/` (sufixo `-2`/`-3` em colisão) ou `work/` sequencial, prefixo `work/…` que não colide com `next` nem `plan`. O fluxo desta skill (fila → próxima Issue → implementação) é só `next`. -**Default-go:** `next`, `plan` e `new` imprimem `cd ` na última linha **por padrão**; `--stay` suprime; modelos por invocação via `--cheap/--pro/--zen/--go/--alibaba/--glm/--free` (mapa fixo `WORKTREE_MODEL_MAP`, at-most-one; sem flag o preset permanece); `--go` remapeado em OPS93 para o provider OpenCode Go e em OPS95 para `opencode-go/hy3` (antes no-op do OPS24). No terminal interativo, use a função `worktree()` de **`.agents/shell/worktree.sh`** (uma linha de `source` no profile) para o `cd` ser aplicado de verdade no shell que te chamou — node não consegue mudar o cwd do shell pai. `kill` também imprime `cd
` no fim (a sessão nunca fica num diretório destruído). +**Default-go:** `next`, `plan` e `new` imprimem `cd ` na última linha **por padrão**; `--stay` suprime; modelos por invocação via `--cheap/--pro/--zen/--go/--alibaba/--glm/--free` (mapa fixo `WORKTREE_MODEL_MAP`, at-most-one; sem flag o preset permanece); `--go` remapeado em OPS93 para o provider OpenCode Go, em OPS95 para `opencode-go/hy3` e em OPS112 para `opencode-go/deepseek-v4.1-flash` (antes no-op do OPS24). No terminal interativo, use a função `worktree()` de **`.agents/shell/worktree.sh`** (uma linha de `source` no profile) para o `cd` ser aplicado de verdade no shell que te chamou — node não consegue mudar o cwd do shell pai. `kill` também imprime `cd
` no fim (a sessão nunca fica num diretório destruído). -**Launch do opencode (OPS26 + OPS33 + OPS31 + OPS93 + OPS95 + OPS110):** só a função shell marca `TEQO_WORKTREE_TERMINAL=1`; com o marcador, `next`/`plan`/`new`/`fix` imprimem também a diretiva `launch node /scripts/agent-session.mjs start --purpose= --dir= --model [--issue ] [--argument ""]` **antes** do `cd`, e a função a executa depois do cd. Desde a OPS110 o launch não abre um TUI dono da sessão: o `agent-session` sobe/reaproveita o `opencode serve` compartilhado, cria a sessão endereçável, dispara o driver destacado (auto-submete `/work-issue --issue ` no `next`, `/plan-issue` no `plan`, `/bug-fix ` no `fix`; `new` abre só a sessão) e anexa o TUI (`opencode attach -s `) — fechar o terminal **não** encerra o run; reentre com `pnpm agent:session attach` e encerre com `pnpm agent:session stop` (ver a seção "Sessões persistentes" de `docs/AGENT-OPS.md`). Sem `--variant` na diretiva (OPS95: o yargs do TUI rejeita o flag desconhecido e só imprime o helper — variantes ficam na config global do opencode, selecionáveis via Ctrl+T; `opencode run --variant max` segue sendo a via CLI para runs headless). Modelo por invocação via `--cheap` (cheapestinference/deepseek-v4-flash), `--pro` (deepseek/deepseek-v4-pro), `--zen` (opencode-go/ox-alpha-free), `--go` (opencode-go/hy3), `--alibaba` (alibaba-token-plan/deepseek-v4-flash) — valores corrigidos no OPS95 — e `--glm` (opencode-go/glm-5.3-flash, OPS100), `--free` (openrouter/openrouter/free, OPS100); sem flag o preset `deepseek/deepseek-flash` permanece. Sem `exec`: sair do opencode volta ao shell no worktree. Presets e mapa são constantes em `scripts/lib/worktree.mjs`; o ciclo de vida das sessões (serve/start/attach/stop/list) vive em `scripts/agent-session.mjs`. **O comando `/worktree` do opencode (e qualquer automação sem o marcador) nunca lança o TUI.** +**Launch do opencode (OPS26 + OPS33 + OPS31 + OPS93 + OPS95 + OPS110):** só a função shell marca `TEQO_WORKTREE_TERMINAL=1`; com o marcador, `next`/`plan`/`new`/`fix` imprimem também a diretiva `launch node /scripts/agent-session.mjs start --purpose= --dir= --model [--issue ] [--argument ""]` **antes** do `cd`, e a função a executa depois do cd. Desde a OPS110 o launch não abre um TUI dono da sessão: o `agent-session` sobe/reaproveita o `opencode serve` compartilhado, cria a sessão endereçável, dispara o driver destacado (auto-submete `/work-issue --issue ` no `next`, `/plan-issue` no `plan`, `/bug-fix ` no `fix`; `new` abre só a sessão) e anexa o TUI (`opencode attach -s `) — fechar o terminal **não** encerra o run; reentre com `pnpm agent:session attach` e encerre com `pnpm agent:session stop` (ver a seção "Sessões persistentes" de `docs/AGENT-OPS.md`). Sem `--variant` na diretiva (OPS95: o yargs do TUI rejeita o flag desconhecido e só imprime o helper — variantes ficam na config global do opencode, selecionáveis via Ctrl+T; `opencode run --variant max` segue sendo a via CLI para runs headless). Modelo por invocação via `--cheap` (cheapestinference/deepseek-v4-flash), `--pro` (deepseek/deepseek-v4-pro), `--zen` (opencode/muse-spark-1.3-contributor-free), `--go` (opencode-go/deepseek-v4.1-flash), `--alibaba` (alibaba-token-plan/deepseek-v4-flash) — valores corrigidos no OPS95 (`--go`/`--zen` em OPS112) — e `--glm` (opencode-go/glm-5.3-flash, OPS100), `--free` (openrouter/openrouter/free, OPS100); sem flag o preset `deepseek/deepseek-flash` permanece. Sem `exec`: sair do opencode volta ao shell no worktree. Presets e mapa são constantes em `scripts/lib/worktree.mjs`; o ciclo de vida das sessões (serve/start/attach/stop/list) vive em `scripts/agent-session.mjs`. **O comando `/worktree` do opencode (e qualquer automação sem o marcador) nunca lança o TUI.** ## Fluxo quando invocado como skill (agentes que não têm opencode) diff --git a/.opencode/commands/worktree.md b/.opencode/commands/worktree.md index 4c855ae4..0d81512f 100644 --- a/.opencode/commands/worktree.md +++ b/.opencode/commands/worktree.md @@ -4,7 +4,7 @@ description: Claima a próxima Issue (next [--issue N] [--stay] [--cheap|--pro|- Rode o script determinístico abaixo (não improvise a lógica) e reporte o resultado de forma concisa. -- `next [--issue N] [--stay] [--cheap|--pro|--zen|--go|--alibaba|--glm|--free]`: **claima** a próxima Issue claimável da fila (mesma fila/ordem e lock otimista de `pnpm agent:claim`) e cria (ou reutiliza) o worktree dela. Claim falhou → reporte o motivo — não há worktree. `--issue N` claima a Issue direcionada (`ready`) ou **reabre** uma já claimada (`in-progress`, sem re-claim). A saída avisa "já claimada — NÃO rodar `pnpm agent:claim`". Por padrão o script imprime `cd ` na última linha — aplique-o na sessão de shell atual (`cd `) e reporte o novo diretório. `--stay` suprime o `cd` (não troque de diretório) mas o claim ainda acontece. `--cheap/--pro/--zen/--go/--alibaba/--glm/--free` escolhe o modelo por invocação no mapa fixo `WORKTREE_MODEL_MAP` (cheap=cheapestinference/deepseek-v4-flash, pro=deepseek/deepseek-v4-pro, zen=opencode-go/ox-alpha-free, go=opencode-go/hy3, alibaba=alibaba-token-plan/deepseek-v4-flash, glm=opencode-go/glm-5.3-flash, free=openrouter/openrouter/free); at-most-one (múltiplas → erro). +- `next [--issue N] [--stay] [--cheap|--pro|--zen|--go|--alibaba|--glm|--free]`: **claima** a próxima Issue claimável da fila (mesma fila/ordem e lock otimista de `pnpm agent:claim`) e cria (ou reutiliza) o worktree dela. Claim falhou → reporte o motivo — não há worktree. `--issue N` claima a Issue direcionada (`ready`) ou **reabre** uma já claimada (`in-progress`, sem re-claim). A saída avisa "já claimada — NÃO rodar `pnpm agent:claim`". Por padrão o script imprime `cd ` na última linha — aplique-o na sessão de shell atual (`cd `) e reporte o novo diretório. `--stay` suprime o `cd` (não troque de diretório) mas o claim ainda acontece. `--cheap/--pro/--zen/--go/--alibaba/--glm/--free` escolhe o modelo por invocação no mapa fixo `WORKTREE_MODEL_MAP` (cheap=cheapestinference/deepseek-v4-flash, pro=deepseek/deepseek-v4-pro, zen=opencode/muse-spark-1.3-contributor-free, go=opencode-go/deepseek-v4.1-flash, alibaba=alibaba-token-plan/deepseek-v4-flash, glm=opencode-go/glm-5.3-flash, free=openrouter/openrouter/free); at-most-one (múltiplas → erro). - `plan [bag] [--stay] [--cheap|--pro|--zen|--go|--alibaba|--glm|--free]`: cria um worktree de planejamento **diferente a cada invocação** (branch `plans/plan-issue-`, ou `plans/plan-issue-` sequencial sem bag; sufixo `-2`/`-3` em colisão) para rodar `/plan-issue` sem ocupar o main; nunca conflita com `next`. Não claima nada. Mesmo contrato de `cd` do `next`: aplique a última linha `cd ` por padrão; `--stay` suprime; flag de modelo como no `next`. - `new [bag] [--stay] [--cheap|--pro|--zen|--go|--alibaba|--glm|--free]`: cria um worktree **neutro** (sem função pré-definida — explorar ideia, conversar, planejar sem registrar nada) **diferente a cada invocação** (branch `work/`, ou `work/` sequencial sem bag; sufixo `-2`/`-3` em colisão); o prefixo minúsculo `work/…` nunca conflita com `next` nem `plan`. Não claima nada. Mesmo contrato de `cd` do `plan`: aplique a última linha `cd ` por padrão; `--stay` suprime; flag de modelo como no `next`. - `fix [bag] [--stay] [--cheap|--pro|--zen|--go|--alibaba|--glm|--free]`: cria um worktree de **correção de bug** (skill `/bug-fix`) **diferente a cada invocação** (branch `fix/`, ou `fix/` sequencial sem bag; sufixo `-2`/`-3` em colisão); o prefixo minúsculo `fix/…` nunca conflita com `next`, `plan` nem `new`. **Não claima nem cria Issues** — o registro do bug é o post-mortem da skill. O bag é a descrição do bug: no terminal, o launch carrega `--argument=""` e o driver destacado auto-submete `/bug-fix ` (a descrição chega com a skill). Mesmo contrato de `cd` do `plan`: aplique a última linha `cd ` por padrão; `--stay` suprime; flag de modelo como no `next`. diff --git a/docs/changelog/2026-09-15-ops112.md b/docs/changelog/2026-09-15-ops112.md new file mode 100644 index 00000000..31d8de65 --- /dev/null +++ b/docs/changelog/2026-09-15-ops112.md @@ -0,0 +1 @@ +**OPS112 — Modelos padrão do worktree: `--go` → DeepSeek V4.1 Flash, `--zen` → Muse Spark 1.3 Free (2026-09-15):** dois valores do mapa fixo `WORKTREE_MODEL_MAP` (`scripts/lib/worktree.mjs`): go=opencode-go/hy3 → opencode-go/deepseek-v4.1-flash, zen=opencode-go/ox-alpha-free → opencode/muse-spark-1.3-contributor-free (o free do Muse Spark só existe no provider `opencode`/Zen). Preset sem flag (`deepseek/deepseek-flash`), demais chaves (cheap/pro/alibaba/glm/free) e guardrail at-most-one intactos. Superfícies sincronizadas na mesma entrega (docblocks de `scripts/worktree.mjs` e `.agents/shell/worktree.sh` com nota histórica preservada, `.opencode/commands/worktree.md`, skill `worktree-next-issue`, pin `tests/unit/worktree.unit.spec.ts`); skill `local-database` cita o mapa sem IDs e não muda. diff --git a/docs/plans/worktree-modelos-go-zen-impl.md b/docs/plans/worktree-modelos-go-zen-impl.md new file mode 100644 index 00000000..d61e25d7 --- /dev/null +++ b/docs/plans/worktree-modelos-go-zen-impl.md @@ -0,0 +1,63 @@ +# Impl: Modelos padrão do worktree: --go → DeepSeek V4.1 Flash e --zen → Muse Spark 1.3 Free + +Status: rascunho +Atualizado em: 2026-09-15 +Issue: #1048 +Intenção: docs/plans/worktree-modelos-go-zen.md +Appetite restante: herdado (~0,5 dia — 2 valores do mapa + textos + pin) + +## Leitura da intenção + +- **Outcome:** Flags --go e --zen resolvem para os novos IDs de modelo +- **O que NÃO negociar:** Preset sem flag (deepseek/deepseek-flash) intocado; demais flags do mapa; reintroduzir --variant +- **O que reavaliar:** Se scripts/worktree.mjs é realmente HIGH_RISK e se o pin unitário cobre todas as superfícies + +## Abordagem recomendada + +- **Opções:** A (update direto do mapa + sync de todas as superfícies + pin) | B (só mapa, ignorar doc/shell) | C (script automatizado para sync) +- **Recomendação:** A — por quê (coerência total, precedente OPS95/100/101) +- **Rejeitadas:** B por contrato divergente; C por over-engineering (são 2 valores, não um catálogo) + +### Componentes / mudanças + +- **`scripts/lib/worktree.mjs`** (fonte única): Atualizar WORKTREE_MODEL_MAP go e zen + docblock OPS112 +- **`scripts/worktree.mjs`**: Atualizar docblocks (help interpeta o mapa sozinho) +- **`.agents/shell/worktree.sh`**: Docblock da função +- **`.opencode/commands/worktree.md`**: Bloco do `next` +- **`.agents/skills/worktree-next-issue/SKILL.md`**: Prose do default-go e launch +- **`tests/unit/worktree.unit.spec.ts`**: Pin toEqual do mapa +- **`.agents/skills/local-database/SKILL.md`**: Confirmar citação (nada muda) +- **`docs/changelog/2026-09-15-ops112.md`**: Nova entrada + +### Dados → forma + +- Itens config-only: literais de produto (IDs pedidos), nada de schema/DB/access + +## Fases verificáveis + +1. **Atualizar fonte única** — scripts/lib/worktree.mjs go e zen +2. **Sync de todas as superfícies** — docblocks, scripts, shell, commands, skills +3. **Pin unitário** — tests/unit/worktree.unit.spec.ts +4. **Changelog** — docs/changelog/2026-09-15-ops112.md +5. **Gates** — `pnpm gate:fast`; push via `pnpm push` + +## Rabbit holes / Não escopo (engenharia) + +- Não mexer no preset canônico +- Não criar nova flag ou mecanismo +- Não editar docs históricos/congelados + +## Riscos e mitigação + +- scripts/worktree.mjs é HIGH_RISK_EXACT → diff nele dispara unit/int full + e2e curado; mitigar confirmando que help text muda automaticamente com o mapa +- ID do --zen muda de provider (opencode-go → opencode) → confirmar que a flag name ainda faz sentido + +## Aceite de engenharia + +- [ ] Acerte de produto da intenção coberto +- [ ] Invariantes de codebase +- [ ] Testes de domínio (unit) onde access/write paths mudam + +Self-score decision-quality ≥4 antes de marcar aprovado ou executar. + +--- diff --git a/scripts/lib/worktree.mjs b/scripts/lib/worktree.mjs index a9614c6f..0dc983ec 100644 --- a/scripts/lib/worktree.mjs +++ b/scripts/lib/worktree.mjs @@ -42,7 +42,9 @@ export const OPENCODE_PRESET_MODEL = /** * Per-invocation model map — fixed menu of named flags (OPS93; values * corrected in OPS95 after the OPS93 delivery shipped wrong IDs; OPS100 adds - * `--glm` and `--free`). The directive picks `WORKTREE_MODEL_MAP[flag]` when + * `--glm` and `--free`). OPS112 corrects `--go` → DeepSeek V4.1 Flash and + * `--zen` → Muse Spark 1.3 Free. + * The directive picks `WORKTREE_MODEL_MAP[flag]` when * a single flag is present, otherwise falls back to `OPENCODE_PRESET_MODEL`. * No `--variant` is emitted (the TUI yargs rejects the flag — OPS95): * variants live on the machine's global config, selectable via Ctrl+T @@ -51,8 +53,8 @@ export const OPENCODE_PRESET_MODEL = export const WORKTREE_MODEL_MAP = { cheap: 'cheapestinference/deepseek-v4-flash', pro: 'deepseek/deepseek-v4-pro', - zen: 'opencode-go/ox-alpha-free', - go: 'opencode-go/hy3', + zen: 'opencode/muse-spark-1.3-contributor-free', + go: 'opencode-go/deepseek-v4.1-flash', alibaba: 'alibaba-token-plan/deepseek-v4-flash', glm: 'opencode-go/glm-5.3-flash', free: 'openrouter/openrouter/free', diff --git a/scripts/worktree.mjs b/scripts/worktree.mjs index 9379eb41..a36a60d7 100644 --- a/scripts/worktree.mjs +++ b/scripts/worktree.mjs @@ -23,10 +23,10 @@ * escolhe o modelo por invocação no mapa fixo * `WORKTREE_MODEL_MAP` (cheap=cheapestinference/ * deepseek-v4-flash, pro=deepseek/deepseek-v4-pro, - * zen=opencode-go/ox-alpha-free, go=opencode-go/ - * hy3, alibaba=alibaba-token-plan/deepseek-v4-flash, + * zen=opencode/muse-spark-1.3-contributor-free, go=opencode-go/deepseek-v4.1-flash, + * alibaba=alibaba-token-plan/deepseek-v4-flash, * glm=opencode-go/glm-5.3-flash, free=openrouter/ - * openrouter/free; OPS95 + OPS100) — sem flag o preset + * openrouter/free; OPS95 + OPS100 + OPS112) — sem flag o preset * `deepseek/deepseek-flash` permanece. * Chamado do terminal interativo (com * `TEQO_WORKTREE_TERMINAL=1`, que só a função shell diff --git a/tests/unit/worktree.unit.spec.ts b/tests/unit/worktree.unit.spec.ts index bc54c623..2612cb40 100644 --- a/tests/unit/worktree.unit.spec.ts +++ b/tests/unit/worktree.unit.spec.ts @@ -345,13 +345,13 @@ describe('opencodeHeadlessArgs + headlessDirective (OPS106 auto-unblock)', () => }) }) -describe('resolveWorktreeModel + WORKTREE_MODEL_MAP (OPS93 menu, OPS95 values, OPS100 glm/free)', () => { +describe('resolveWorktreeModel + WORKTREE_MODEL_MAP (OPS93 menu, OPS95 values, OPS100 glm/free, OPS112 go/zen)', () => { it('pins the 7-flag map — cheap/pro/zen/go/alibaba/glm/free', () => { expect(WORKTREE_MODEL_MAP).toEqual({ cheap: 'cheapestinference/deepseek-v4-flash', pro: 'deepseek/deepseek-v4-pro', - zen: 'opencode-go/ox-alpha-free', - go: 'opencode-go/hy3', + zen: 'opencode/muse-spark-1.3-contributor-free', + go: 'opencode-go/deepseek-v4.1-flash', alibaba: 'alibaba-token-plan/deepseek-v4-flash', glm: 'opencode-go/glm-5.3-flash', free: 'openrouter/openrouter/free',