chore(OPS112): modelos padrao do worktree --go/--zen (DeepSeek V4.1 Flash / Muse Spark 1.3 Free)

This commit is contained in:
Francisco Solla 2026-09-15 23:09:35 -03:00
parent 2e389365a3
commit 2b055df358
8 changed files with 82 additions and 16 deletions

View file

@ -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() {

View file

@ -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-<bag>` (sufixo `-2`/`-3` se o nome já estiver vivo); sem `bag` → próximo sequencial `plans/plan-issue-<n>` 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 `<Code>-<slug>` 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/<bag>` (sufixo `-2`/`-3` em colisão) ou `work/<n>` 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 <dir>` 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 <main>` no fim (a sessão nunca fica num diretório destruído).
**Default-go:** `next`, `plan` e `new` imprimem `cd <dir>` 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 <main>` 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 <abs>/scripts/agent-session.mjs start --purpose=<next|plan|new|fix> --dir=<dir> --model <preset|map> [--issue <N>] [--argument "<bag>"]` **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 <N>` no `next`, `/plan-issue` no `plan`, `/bug-fix <bag>` no `fix`; `new` abre só a sessão) e anexa o TUI (`opencode attach -s <id>`) — 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 <abs>/scripts/agent-session.mjs start --purpose=<next|plan|new|fix> --dir=<dir> --model <preset|map> [--issue <N>] [--argument "<bag>"]` **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 <N>` no `next`, `/plan-issue` no `plan`, `/bug-fix <bag>` no `fix`; `new` abre só a sessão) e anexa o TUI (`opencode attach -s <id>`) — 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)

View file

@ -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 <dir>` na última linha — aplique-o na sessão de shell atual (`cd <dir>`) 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 <dir>` na última linha — aplique-o na sessão de shell atual (`cd <dir>`) 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-<bag>`, ou `plans/plan-issue-<n>` 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 <dir>` 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/<bag>`, ou `work/<n>` 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 <dir>` 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/<bag>`, ou `fix/<n>` 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="<bag>"` e o driver destacado auto-submete `/bug-fix <bag>` (a descrição chega com a skill). Mesmo contrato de `cd` do `plan`: aplique a última linha `cd <dir>` por padrão; `--stay` suprime; flag de modelo como no `next`.

View file

@ -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.

View file

@ -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.
---

View file

@ -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',

View file

@ -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

View file

@ -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',