pantheon-opencode 1.5.2 → 1.6.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.pantheon/code-mode/README.md +4 -2
- package/.pantheon/code-mode/checkpoint_session.py +138 -102
- package/.pantheon/code-mode/compress-inline.py +102 -57
- package/.pantheon/code-mode/manifest.json +2 -8
- package/AGENTS.global.md +182 -0
- package/AGENTS.md +10 -891
- package/CHANGELOG.md +343 -0
- package/README.md +577 -79
- package/README.pt-BR.md +345 -60
- package/bin/pantheon-init.mjs +26 -3
- package/commands/pantheon-audit.md +7 -1
- package/commands/pantheon-consolidate.md +1 -1
- package/commands/pantheon-deepwork.md +14 -3
- package/commands/pantheon-focus.md +17 -0
- package/commands/pantheon-optimize.md +2 -2
- package/commands/pantheon-vision.md +61 -12
- package/package.json +30 -11
- package/plugin.json +2 -2
- package/pyproject.toml +11 -16
- package/scripts/build-agents-md.mjs +376 -58
- package/scripts/changelog-merge.mjs +161 -0
- package/scripts/check-plugin-v2-coverage.mjs +213 -0
- package/scripts/ci-validate-yaml.py +7 -5
- package/scripts/{code_mode_server.py → code_mode.py} +119 -27
- package/scripts/cost.mjs +244 -41
- package/scripts/doctor.mjs +236 -29
- package/scripts/install/agents-md.mjs +4 -4
- package/scripts/install/cli-ui.mjs +1 -1
- package/scripts/install/config-migration.mjs +319 -6
- package/scripts/install/health-check.mjs +26 -37
- package/scripts/install/interactive.mjs +7 -7
- package/scripts/install/migrate.mjs +1 -1
- package/scripts/install/opencode-version.mjs +246 -4
- package/scripts/install/opencode.mjs +627 -179
- package/scripts/install/plugin.mjs +43 -9
- package/scripts/install/shared.mjs +120 -12
- package/scripts/install/vision-prompt.mjs +161 -0
- package/scripts/install-mcp.mjs +28 -9
- package/scripts/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
- package/{src/mcp/mcp_resources_server.py → scripts/mcp_resources.py} +2 -2
- package/scripts/{memory_mcp_server.py → memory_mcp.py} +372 -198
- package/scripts/postinstall.mjs +0 -7
- package/scripts/probe-context-rehydrate.mjs +36 -13
- package/scripts/probe-pantheon-cost.mjs +71 -15
- package/scripts/prune.mjs +2 -2
- package/scripts/run-node-tests.mjs +189 -0
- package/scripts/sync-artifacts.mjs +26 -13
- package/scripts/sync-tui.mjs +24 -3
- package/scripts/test-opencode-v2-sandbox.sh +1913 -0
- package/scripts/validate-routing.mjs +43 -3
- package/scripts/validate-sandbox-install.mjs +138 -0
- package/scripts/versioning.mjs +13 -1
- package/scripts/vision-status.mjs +682 -0
- package/skills-lock.json +15 -16
- package/src/agents/aphrodite.md +20 -37
- package/src/agents/apollo.md +7 -3
- package/src/agents/athena.md +63 -35
- package/src/agents/demeter.md +8 -28
- package/src/agents/gaia.md +1 -1
- package/src/agents/hephaestus.md +10 -21
- package/src/agents/hermes.md +15 -38
- package/src/agents/iris.md +1 -1
- package/src/agents/mnemosyne.md +23 -60
- package/src/agents/nyx.md +1 -1
- package/src/agents/prometheus.md +16 -20
- package/src/agents/talos.md +10 -2
- package/src/agents/themis.md +5 -5
- package/src/agents/zeus.md +99 -130
- package/src/instructions/agent-return-format.instructions.md +18 -3
- package/src/instructions/backend-standards.instructions.md +2 -0
- package/src/instructions/frontend-standards.instructions.md +3 -1
- package/src/instructions/memory-protocol.instructions.md +11 -110
- package/src/instructions/zeus-anti-stall.instructions.md +14 -61
- package/src/instructions/zeus-communication-rules.instructions.md +0 -1
- package/src/instructions/zeus-council-synthesis.instructions.md +32 -260
- package/src/instructions/zeus-memory-operations.instructions.md +26 -0
- package/src/instructions/zeus-timeout-retry.instructions.md +40 -87
- package/src/mcp/{code_mode_server.py → code_mode.py} +119 -27
- package/src/mcp/eval_store.py +2 -2
- package/src/mcp/mcp_codemap_module.py +559 -129
- package/src/mcp/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
- package/{scripts/mcp_resources_server.py → src/mcp/mcp_resources.py} +2 -2
- package/src/mcp/{memory_mcp_server.py → memory_mcp.py} +373 -250
- package/src/mcp/{pantheon_vision_server.py → pantheon_vision.py} +396 -40
- package/src/mcp/requirements-mcp.txt +10 -6
- package/src/mcp/requirements-vision.txt +4 -2
- package/src/pantheon/cost-command.ts +399 -101
- package/src/pantheon/delegation-enforce.ts +10 -1
- package/src/pantheon/model-command.ts +18 -7
- package/src/pantheon/presets.d.mts +0 -8
- package/src/pantheon/presets.mjs +5 -32
- package/src/pantheon/todo-enforcer.ts +1 -1
- package/src/pantheon/v2-bounded-read.ts +640 -0
- package/src/pantheon/v2-delegation-enforce.ts +214 -0
- package/src/pantheon/v2-execute-after.ts +186 -0
- package/src/pantheon/v2-tools.ts +429 -0
- package/src/pantheon/v2-unsupported.d.mts +11 -0
- package/src/pantheon/v2-unsupported.mjs +90 -0
- package/src/pantheon/v2-vision.ts +622 -0
- package/src/pantheon/vision-local.ts +531 -0
- package/src/pantheon/vision.ts +1161 -116
- package/src/plugin-v2.ts +1244 -288
- package/src/plugin.ts +12 -9
- package/src/plugins/tui/dist/server.d.ts +1 -2
- package/src/plugins/tui/dist/server.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui-v2.d.ts +154 -0
- package/src/plugins/tui/dist/tui-v2.d.ts.map +1 -0
- package/src/plugins/tui/dist/tui-v2.js +659 -0
- package/src/plugins/tui/dist/tui-v2.js.map +1 -0
- package/src/plugins/tui/dist/tui.d.ts +85 -82
- package/src/plugins/tui/dist/tui.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui.js +72 -59
- package/src/plugins/tui/index-v2.ts +6 -0
- package/src/plugins/tui/package-lock.json +5504 -1341
- package/src/plugins/tui/package.json +25 -15
- package/src/plugins/tui/src/index-v2.tsx +734 -0
- package/src/plugins/tui/src/index.tsx +106 -85
- package/src/plugins/tui/src/opencode-v2.d.ts +13 -0
- package/src/plugins/tui/tsconfig.build.json +5 -0
- package/src/plugins/tui/tsconfig.typecheck.json +5 -0
- package/src/plugins/tui/tsdown.config.ts +22 -2
- package/src/plugins/tui/tui-v2.ts +2 -0
- package/src/plugins/tui/tui.ts +3 -0
- package/src/routing.yml +11 -22
- package/src/skills/README.md +34 -39
- package/src/skills/agent-coordination/SKILL.md +7 -2
- package/src/skills/artifact-management/SKILL.md +12 -5
- package/src/skills/auto-continue/SKILL.md +54 -95
- package/src/skills/code-review-checklist/SKILL.md +5 -5
- package/src/skills/context-compression/SKILL.md +26 -879
- package/src/skills/session-goal/SKILL.md +14 -5
- package/src/skills/spec-driven-development/SKILL.md +3 -1
- package/src/skills/tdd-with-agents/SKILL.md +18 -10
- package/.pantheon/code-mode/eval-llm-judge.py +0 -255
- package/.pantheon/code-mode/eval-monte-carlo.py +0 -368
- package/.pantheon/code-mode/eval-run.py +0 -197
- package/.pantheon/code-mode/eval-static.py +0 -321
- package/.pantheon/code-mode/session-end-save.py +0 -186
- package/.pantheon/code-mode/session-end-save.sh +0 -18
- package/opencode.json +0 -58
- package/scripts/recover-zenodo-deposition.mjs +0 -146
- package/scripts/test-opencode-v1-v2-sandbox.sh +0 -862
- package/scripts/validate-zenodo-release.mjs +0 -154
- package/scripts/zenodo-artifact.mjs +0 -94
- package/scripts/zenodo-release-state.mjs +0 -53
- package/src/skills/orchestration-workflow/SKILL.md +0 -311
package/CHANGELOG.md
CHANGED
|
@@ -18,6 +18,349 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
18
18
|
|
|
19
19
|
## ✅ Closed Issues
|
|
20
20
|
|
|
21
|
+
## [v1.6.0-beta.10] - 2026-10-12
|
|
22
|
+
|
|
23
|
+
## 🆕 What's New
|
|
24
|
+
|
|
25
|
+
- **Visible plan approval:** Zeus displays Athena's complete plan in the main
|
|
26
|
+
conversation before requesting approval, including for `/pantheon-deepwork`.
|
|
27
|
+
- **OpenCode V2 Vision:** adds `vision_describe` using the live image-capable
|
|
28
|
+
model catalog and OpenCode Zen authentication; relative image paths resolve
|
|
29
|
+
from the active project directory.
|
|
30
|
+
|
|
31
|
+
- **Menos contexto de instruções duplicadas no OpenCode V2:** regras comuns
|
|
32
|
+
entre as instruções globais e de projeto são emitidas uma vez, preservando
|
|
33
|
+
regras exclusivas. Na medição intercalada do beta-10 com OpenCode v2.0.29, o
|
|
34
|
+
proxy de contexto do primeiro request caiu 11,8%; input total e latência de
|
|
35
|
+
parede permanecem inconclusivos.
|
|
36
|
+
|
|
37
|
+
- **Admissão segura de subagents no OpenCode V2:** quando o host registra o
|
|
38
|
+
hook de permissões, Pantheon correlaciona o
|
|
39
|
+
agente, a sessão e o alvo do evento nativo `subagent` com o `source` da
|
|
40
|
+
avaliação de permissão, antes da criação da sessão filha. A matriz permite
|
|
41
|
+
Zeus→Apollo em uma sessão root e nega dispatches fora da matriz ou originados
|
|
42
|
+
em uma sessão filha. A canary isolada passou em 18/18 verificações no
|
|
43
|
+
OpenCode v2.0.29.
|
|
44
|
+
|
|
45
|
+
Evidência de F1 e F4A: `bench/results/f1-di-v229-interleaved-2026-10-14.md` e
|
|
46
|
+
`bench/results/f4a-v229-admission-identity-2026-10-14.md`. O resultado de
|
|
47
|
+
latência total e wall de F1 segue inconclusivo.
|
|
48
|
+
|
|
49
|
+
- **Especialista explícito como root no V2 (F3a):** no cenário one-shot B,
|
|
50
|
+
Talos iniciado explicitamente como agente root produziu o artefato correto
|
|
51
|
+
sem child em 5/5 runs na amostra inicial. Um recheck de integração posterior
|
|
52
|
+
encontrou 4/5; a instrução de Talos passou a exigir que arquivos pedidos
|
|
53
|
+
sejam realmente gravados com a ferramenta nativa. Uma nova coorte
|
|
54
|
+
pré-registrada passou em 5/5, sem children nem chamadas `subagent`. Nessa
|
|
55
|
+
coorte, o proxy de contexto do primeiro request foi 9.675 tokens para Talos
|
|
56
|
+
e 13.009 para Zeus (−25,6%, confirmado contra o spread intra-braço). Input
|
|
57
|
+
total e wall permanecem sem claim de ganho; não há claim de economia
|
|
58
|
+
monetária ou roteamento geral. O primeiro recheck e o follow-up são mantidos
|
|
59
|
+
separadamente em `bench/results/beta10-final-integration-2026-10-15.md` e
|
|
60
|
+
`bench/results/beta10-final-integration-followup-2026-10-15.md`; a evidência
|
|
61
|
+
inicial está em `bench/results/f3a-root-paired-2026-10-14.md`.
|
|
62
|
+
|
|
63
|
+
- **Leitura bounded no OpenCode V2:** adiciona `pantheon_bounded_read` para
|
|
64
|
+
sessões root do Zeus, com aprovação nativa por arquivo, sem grant persistente,
|
|
65
|
+
limites de chamadas/arquivos/linhas/bytes e scanner de segredos fail-closed.
|
|
66
|
+
Validado no OpenCode v2.0.29; detalhes e limitações em
|
|
67
|
+
`bench/results/f3b-v229-bounded-read-2026-10-15.md`.
|
|
68
|
+
|
|
69
|
+
## [v1.6.0-beta.9] - 2026-10-12
|
|
70
|
+
|
|
71
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
72
|
+
move this section to a versioned entry and reset the template below. -->
|
|
73
|
+
|
|
74
|
+
## 🆕 What's New
|
|
75
|
+
|
|
76
|
+
- **Entry point TUI dedicado ao OpenCode V2.** O pacote agora compila e instala
|
|
77
|
+
separadamente os loaders V1/V2, e adiciona `/pantheon-focus` para foco de
|
|
78
|
+
sessão sem depender das goal-tools ausentes no host V2.
|
|
79
|
+
|
|
80
|
+
## 🐞 Fixed
|
|
81
|
+
|
|
82
|
+
- **Instalação V2:** agentes e slash commands de projeto são instalados nos
|
|
83
|
+
diretórios descobertos pelo host; o TUI seleciona o bundle da geração correta
|
|
84
|
+
e o estado dos componentes só é marcado como instalado após sucesso.
|
|
85
|
+
- **`/pantheon-audit`:** inclui o scanner heurístico no pacote e localiza a cópia
|
|
86
|
+
instalada antes de executar a primeira camada.
|
|
87
|
+
- **`/pantheon-consolidate`:** delega a consolidação ao agente Mnemosyne, dono
|
|
88
|
+
da qualidade do banco de memória.
|
|
89
|
+
|
|
90
|
+
## ⚠️ Known Issues
|
|
91
|
+
|
|
92
|
+
- **Sidebar V2 na sessão inicial:** a captura do TUI recém-aberto ainda não
|
|
93
|
+
mostra o conteúdo Pantheon antes do primeiro prompt; validar o render inicial
|
|
94
|
+
interativo continua sendo um gate aberto para a beta.
|
|
95
|
+
- **Goal persistente no OpenCode V2:** as goal-tools não fazem parte da
|
|
96
|
+
superfície V2 suportada; `/pantheon-focus` não substitui uma goal-tool
|
|
97
|
+
persistente/removível do host.
|
|
98
|
+
|
|
99
|
+
## [v1.6.0-beta.8] - 2026-10-11
|
|
100
|
+
|
|
101
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
102
|
+
move this section to a versioned entry and reset the template below. -->
|
|
103
|
+
|
|
104
|
+
## 🐞 Fixed
|
|
105
|
+
|
|
106
|
+
- **opencode-v2** — repair session lookup and beta sandbox reuse
|
|
107
|
+
- **scripts** — isolate beta background service port
|
|
108
|
+
## [v1.6.0-beta.7] - 2026-10-10
|
|
109
|
+
|
|
110
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
111
|
+
move this section to a versioned entry and reset the template below. -->
|
|
112
|
+
|
|
113
|
+
## 🆕 What's New
|
|
114
|
+
|
|
115
|
+
- **Permissões MCP nativas por agente no OpenCode V1 e V2.** O instalador
|
|
116
|
+
converte a allowlist `mcp_tools` de cada agente em regras nativas: nega por
|
|
117
|
+
padrão os servidores Pantheon omitidos, libera apenas as ferramentas
|
|
118
|
+
declaradas e preserva MCPs de terceiros. O V2 mantém os servidores
|
|
119
|
+
conectados; as regras limitam quais ferramentas cada agente vê.
|
|
120
|
+
- **Guarda V2 de delegação alinhada ao contrato de permissões.** Os hooks de
|
|
121
|
+
permissão e de sessão aplicam as restrições de sessão somente-leitura e a
|
|
122
|
+
matriz caller→target sem conceder acesso além do configurado pelo host.
|
|
123
|
+
- **Menos chamadas automáticas de memória e compressão.** A busca de contexto
|
|
124
|
+
do Zeus reutiliza o resultado de início de tarefa, e o protocolo de
|
|
125
|
+
compressão deixa de recomendar pipelines automáticos extensos.
|
|
126
|
+
- **Prova de identidade da instalação do sandbox.** O teste global compara a
|
|
127
|
+
versão e arquivos do pacote instalado com este checkout e rejeita referências
|
|
128
|
+
npm antigas nas configurações ativas antes de validar o runtime.
|
|
129
|
+
- O `--prepare` agora gera `start-pantheon.sh` para abrir o TUI interativo com o
|
|
130
|
+
beta instalado e HOME, configuração XDG, projeto e banco de dados isolados do
|
|
131
|
+
sandbox. O launcher fixa a porta do serviço gerenciado em `49376` e falha sem
|
|
132
|
+
parar serviços existentes se a porta dedicada já estiver ocupada.
|
|
133
|
+
|
|
134
|
+
## 🐞 Fixed
|
|
135
|
+
|
|
136
|
+
- Referências versionadas/alias do pacote Pantheon que sobravam na lista
|
|
137
|
+
`plugins` agora são reconhecidas pelo instalador e substituídas pelo caminho
|
|
138
|
+
do plugin local correto, sem afetar plugins de terceiros com nomes parecidos.
|
|
139
|
+
- A suíte CI foi separada do caminho crítico de instalação/empacotamento para
|
|
140
|
+
reduzir o tempo até o resultado das verificações do pacote.
|
|
141
|
+
- O `run-test.sh` gerado agora define seu timeout do `mcp list` antes do uso
|
|
142
|
+
sob `set -u`; antes, a variável ausente interrompia o teste antes de chamar
|
|
143
|
+
o CLI. A saída do comando também fica disponível quando o gate falha.
|
|
144
|
+
|
|
145
|
+
## ⚠️ Known Issues
|
|
146
|
+
|
|
147
|
+
- **A delegação real ainda precisa de confirmação nesta beta.** O teste manual
|
|
148
|
+
anterior de `HERMES-PONG` foi negado com
|
|
149
|
+
`Pantheon delegation denied: authoritative caller session is unavailable`;
|
|
150
|
+
a correção de permissões e a instalação isolada precisam ser verificadas no
|
|
151
|
+
TUI OpenCode V2 antes de considerar a delegação validada.
|
|
152
|
+
## [v1.6.0-beta.6] - 2026-10-05
|
|
153
|
+
|
|
154
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
155
|
+
move this section to a versioned entry and reset the template below. -->
|
|
156
|
+
|
|
157
|
+
## 🆕 What's New
|
|
158
|
+
|
|
159
|
+
- **Política de suporte documentada: a linha 1.6.x é a ÚLTIMA compatível com OpenCode 1.X.** A partir de **1.7, toda release é breaking change com alvo em OpenCode 2.** O limite está escrito no `README.md` (seção "Compatibility and support policy", com matriz de suporte) e em `docs/INSTALLATION.md` (seção "OpenCode V1/V2 — contrato de plugin"), não duplicado em um documento novo: os dois arquivos já eram o ponto de entrada do contrato de plugin, e um terceiro documento seria um terceiro lugar para divergir. O texto distingue as duas células da linha 1.6.x — a célula 1.X é o contrato V1 (6 tools, lifecycle do board, hooks V1, compaction V1) e a célula OpenCode 2 é o contrato V2, que é real porém **menor**: 3 tools, sem as `pantheon_goal_*` e sem a matriz de delegação caller→target. **O suporte a OpenCode 2 na linha 1.6 é documentado como parcial, e não como completo**, por duas razões verificadas: (a) o canário de ferramentas V2 foi escrito contra `opencode 2.0.22`, host que não é publicado em nenhum canal npm — contra o `@opencode-ai/cli` instalável o mesmo canário falha 12/12, porque `/api/experimental/session/{id}/wait` foi promovido para `/api/session/{id}/wait` (404 no caminho antigo) e `ctx.tool.list` não existe mais; corrigindo apenas a rota, 10/12 passam no mesmo host, o que caracteriza descasamento canário/host e não regressão medida do plugin (issue #216, PR #213); (b) não existe perna V1 de validação end-to-end — `scripts/test-opencode-v2-sandbox.sh` é V2-only e rejeita `--run v1` — portanto a versão exata de host 1.X exercitada end-to-end pela linha 1.6 fica registrada como **não verificada**, e o caminho 1.X é sustentado pelo pin de dependência (`@opencode-ai/plugin` / `@opencode-ai/sdk` `1.18.33`), pelos testes unitários do gate de geração e pelos testes end-to-end do installer sobre a config emitida.
|
|
160
|
+
|
|
161
|
+
## 🐞 Fixed
|
|
162
|
+
|
|
163
|
+
- **Os exemplos de chamada MCP nos arquivos de prompt ensinavam um contrato que não existe no schema real.** Um `pantheon-persistence.kv_get` ao vivo foi rejeitado com `namespace: Missing key`; a linha que o produziu foi `src/agents/zeus.md:189` (`depth = kv_get("deleg:depth") ?? 0`), cuja cópia instalada em `~/.config/opencode/agents/zeus.md` é a que executou. A causa não era o servidor MCP: os arquivos de agente e de instrução ensinavam chamadas posicionais sem `namespace`, enquanto o schema real é `kv_get({ namespace /* obrigatório, sem default */, key, scope? })` — `kv_store.namespace` é igualmente obrigatório e `kv_store.value` é `str`. **A correção está nos docs, e não em adicionar um `namespace` default:** um default escreveria estado de coordenação no namespace errado silenciosamente, então *obrigatório* é o desenho correto. A mesma classe de defeito foi corrigida em `context_save` (posicional, com um helper `json()` inexistente e sem o `session_id` obrigatório → forma por palavra-chave com `content=JSON.stringify(...)`), em `memory_store` (`value` precisa ser uma string JSON codificada → agora iguala o padrão já correto de `metadata`, o que resolveu uma aut contradição no mesmo arquivo), na aritmética de profundidade (envolvida em `String(...)`, porque `kv_store.value` é `str` e não `int`) e em `memory_search(query, ...)` → `query=` em todas as instâncias. `AGENTS.md` é artefato gerado e foi reconstruído, nunca editado à mão.
|
|
164
|
+
- **Um bypass de permissão vivo: `edit: deny` não cobria `hashline_edit`.** A regra `edit: deny` é avaliada por nome de ferramenta, e `hashline_edit` não é `edit` — então os agentes restritos a `edit: deny` (`zeus`, `athena`, `iris`, `nyx`, `themis`) podiam editar arquivos assim mesmo, escrevendo no disco por um caminho que a negação não cobria. `hashline_edit: deny` foi adicionado a esses cinco agentes. **Não era uma condição de corrida nem um erro de configuração: era uma tabela de permissões incompleta**, o que significa que a negação nunca esteve de fato aplicada a quem só deveria ler.
|
|
165
|
+
- **`test:node` reportava sucesso tendo coletado zero testes.** `node --test <glob>` sai com 0 quando o glob não expande (Node >= 22), e foi exatamente o que aconteceu: um glob que nunca expandiu produziu um gate verde que não executou nada. Pior, `tests/` estava ausente da allow-list `files` do pacote, então um consumidor que rodasse `npm test` recebia esse verde. Agora os scripts de teste falham em voz alta quando a coleta é zero, e a guarda tem teste próprio (`tests/run-node-tests.test.mjs`) que a dirige como subprocesso — o contrato é o código de saída, então testá-la em processo não provaria nada.
|
|
166
|
+
## [v1.6.0-beta.5] - 2026-10-05
|
|
167
|
+
|
|
168
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
169
|
+
move this section to a versioned entry and reset the template below. -->
|
|
170
|
+
|
|
171
|
+
## 🆕 What's New
|
|
172
|
+
|
|
173
|
+
- **O gate de geração do plugin passa a ler a versão do host — e a superfície de ferramentas deixa de desaparecer num host OpenCode 2.x.** O seletor de geração tinha três defaults `'v1'` (`bin/pantheon-init.mjs`, `scripts/install/opencode.mjs` e a assinatura do resolver em `scripts/install/opencode-version.mjs`). Nesse ramo, o installer grava caminhos de arquivo `.ts` na chave singular `plugin`; um host 2.x rejeita caminhos de arquivo ali (`configured plugin path must be a directory`), **descarta** as entradas e, ao fazer isso, **remove** a entrada de diretório V2 que já estava registrada e funcionando. O sintoma era um host aparentemente saudável — a frota MCP subia normalmente — com um único WARN no log e **nenhuma** ferramenta do plugin no catálogo: sem `pantheon_cost`, sem `hashline_edit`, sem `pantheon_model`, sem BackgroundJobBoard e sem hooks. Os três defaults passam a `'auto'`, e `auto` consulta a versão do host. Precedência: flag explícita > `OPENCODE_VERSION` > basename `opencode2` > probe de `--version` > aviso e fallback `v1`. Isto restaura as **3** ferramentas que o contrato V2 registra (`hashline_edit`, `pantheon_cost`, `pantheon_model`); não é paridade com o V1 — ver **Issues Conhecidas**.
|
|
174
|
+
- **Uma instalação na geração V2 e o `doctor` agora declaram a superfície reduzida em vez de deixá-la ser descoberta.** A lista de recursos não suportados no V2 (`getUnsupportedFeatures()`) não tinha nenhum consumidor em produção — só testes a liam. O installer passa a imprimi-la ao lado do aviso de destino V2, e o `doctor` a reporta como um achado próprio, sem alterar o código de saída (uma instalação V2 é uma configuração suportada, não quebrada). A V2 registra 3 ferramentas, não 6, e não tem BackgroundJobBoard; as 3 ferramentas de goal não são registradas na V2 por desenho. O texto agora é único, vindo de `src/pantheon/v2-unsupported.mjs`.
|
|
175
|
+
- **Renomeação dos entrypoints MCP (issue #198).** Os cinco entrypoints Python deixaram de compartilhar o token `server.py`, então um `pkill -f server.py` amplo não derruba mais a frota inteira como efeito colateral. Inclui uma migração em tempo de instalação para que as instalações existentes não fiquem órfãs.
|
|
176
|
+
- **O pacote npm deixou de versionar e distribuir a configuração pessoal de desenvolvimento do OpenCode.** `opencode.json` e `.opencode/` (comandos, plugins e skills) saíram do controle de versão: a config carregava um endpoint MCP privado e overrides de permissão por desenvolvedor, e o harness V1 de comandos/plugins foi substituído por `src/plugin-v2.ts`. O `init` continua gerando a config do projeto do usuário, então instalações não são afetadas; para contribuidores, um `opencode.json` pessoal deve ir em `.git/info/exclude`.
|
|
177
|
+
- **Documentação: `ROADMAP.md` reescrito e um novo documento de fronteira.** O roadmap foi reescrito com as causas-raiz verificadas, e um novo documento — `docs/PERMISSIONS-QUALITY-DELEGATION.md` — mapeia os gates de qualidade, as quatro camadas de permissão e a delegação num só lugar, marcando explicitamente o que ainda não foi verificado.
|
|
178
|
+
|
|
179
|
+
## 🐞 Fixed
|
|
180
|
+
|
|
181
|
+
- **A leitura do banner de versão do host era quadrática.** Um banner longo custava **11,1 s** para ser interpretado, contra o timeout de **5 s** do spawn de `--version`; o timeout guarda o processo, não a leitura, então um host verboso conseguia estourá-lo. A interpretação passou a ser **linear**.
|
|
182
|
+
- **O `readOnlyRegistry` do V2 não era podado no `session.deleted`.** O registro é global ao processo e nunca era limpo quando uma sessão do V2 terminava, então entradas de sessões encerradas acumulavam. O `session.deleted` do V2 passa a podar o registro, como a V1 já fazia.
|
|
183
|
+
|
|
184
|
+
## ⚠️ Known Issues
|
|
185
|
+
|
|
186
|
+
- **Ação necessária: re-executar o `init` numa instalação afetada.** O `postinstall` **não** roda o `init`. Quem teve a configuração corrompida por uma instalação `v1` anterior **não** é auto-corrigido apenas por atualizar o pacote — é preciso rodar o installer de novo (`npx pantheon-opencode init`). Uma escolha correta de geração **auto-corrige** a configuração (o ramo V2 já remove as referências `.ts` do V1), mas só quando o installer roda. O mesmo vale para a renomeação dos entrypoints: instalações existentes continuam funcionando porque os arquivos antigos são mantidos, mas os caminhos só são corrigidos numa nova execução do installer; até lá, esses usuários permanecem nos entrypoints antigos e sujeitos ao efeito colateral do `server.py`.
|
|
187
|
+
- **A superfície V2 é menor que a V1 por desenho.** A V2 registra 3 ferramentas (`hashline_edit`, `pantheon_cost`, `pantheon_model`), não 6, e não tem BackgroundJobBoard; as 3 `pantheon_goal_*` são V1-only e a matriz de delegação caller→target não é replicada. O installer e o `doctor` agora **dizem** isso (ver What's New), mas a funcionalidade ausente não é restaurada.
|
|
188
|
+
- **O fallback continua a ser `v1`.** Quando o probe do host falha, não consegue ser interpretado, ou traz versões contraditórias, o resolver avisa **uma vez** e cai para `v1`, em vez de arriscar um host 1.x com uma entrada `plugins` que ele ignoraria. É um erro alto e visível, mas ainda é uma queda para a configuração V1.
|
|
189
|
+
|
|
190
|
+
## ✅ Closed Issues
|
|
191
|
+
|
|
192
|
+
- **A justificativa da matriz de delegação V1→V2 foi corrigida.** O texto dizia que o V2 "não expõe esse caminho de semeadura"; os tipos do SDK refutam isso. A causa real da matriz não replicada não é a ausência de um caminho de semeadura (`session.created` do V2 traz `properties.info: Session` com `parentID?`, o mesmo campo que a V1 semeia), mas a *segunda* fonte da V1 — o seed de `client.session.list()` para sessões anteriores ao carregamento do plugin — porque o `PluginContext` do V2 não expõe `client`. Se um host 2.0.22 ao vivo popula `info.parentID` nesse evento continua **não verificado** (nenhum canário lê payload de evento). A linha publicada em `v1.6.0-beta.4` fica como registro.
|
|
193
|
+
## [v1.6.0-beta.4] - 2026-10-03
|
|
194
|
+
|
|
195
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
196
|
+
move this section to a versioned entry and reset the template below. -->
|
|
197
|
+
|
|
198
|
+
## 🆕 What's New
|
|
199
|
+
|
|
200
|
+
- **Canário host-backed que dirige `hashline_edit` end-to-end** (`tests/canary/plugin-v2-tool-canary.test.mjs`, 12 casos): carrega `src/plugin-v2.ts` pelo loader real do host `opencode 2.0.22` e registra `Object.keys(ctx)` de dentro do host — medidos, `tool`/`event`/`permission`/`session` existem e `catalog` não. É o primeiro gate que dirige uma ferramenta do Pantheon por um host real. O canário existente só dirige o `read` embutido, e foi por isso que `draft.add()` sem `output` sobreviveu 26 dias com todos os testes verdes.
|
|
201
|
+
- **Os quatro domínios que o SDK `@opencode-ai/plugin` não tipa** (`tool`, `event`, `permission`, `session`) passaram a uma declaração estrutural local (`HostPluginContext`) e **um** cast documentado (`hostDomains()`), no lugar de seis `as unknown as Record<string, unknown>` que não verificavam tipo nenhum. Todo membro continua opcional e todo chamador reconferir antes de usar. A linha estável do SDK é `1.18.x` e não carrega o contrato do host — `1.18.34` (`latest`) é idêntica a `1.18.33`, então seguir o `dev` diário resolveria pior, não melhor.
|
|
202
|
+
|
|
203
|
+
## 🐞 Fixed
|
|
204
|
+
|
|
205
|
+
- `pantheon_cost` respondia `CORRUPT_DATA` em **toda** chamada contra o host 2.0.22: exigia a tabela `message`, que não existe nesse banco. Os tokens de assistant **estão** legíveis em `session_message`. **Não é renomeação:** `session_message` tem coluna `data`, mas não tem a chave `role` dentro dela — `json_type(data,'$.role')` é nulo em **0 de 40 307** linhas válidas. O V1 marca turnos de assistant com `data.role`; o V2 marca pela **coluna** `type`. Trocar apenas o nome da tabela casaria com nada e devolveria `status: OK` em silêncio. A detecção passa a ser por **presença de tabela**, porque as duas famílias coexistem em bancos migrados.
|
|
206
|
+
- `PANTHEON_OPENCODE_VERSION` nunca selecionou o schema: só mudava o **nome do arquivo**, e `opencode-v2.db` é o isolamento do sandbox via `OPENCODE_DB`, não um banco de host 2.x. A distinção v1/v2 é o **schema detectado**; a variável agora apenas restringe um conjunto já detectado e falha rápido quando pede uma família ausente.
|
|
207
|
+
- `scripts/cost.mjs` duplicava o mesmo bug literal, com o mesmo assert — o fallback continuava morto. `probe-pantheon-cost.mjs` acompanha.
|
|
208
|
+
- O report agora **declara a cobertura temporal** que ele mediu (janela varrida, linha mais antiga), em vez de apresentar totais como se cobrissem meses.
|
|
209
|
+
|
|
210
|
+
## ⚠️ Known Issues
|
|
211
|
+
|
|
212
|
+
- O canário **host-backed pula no CI**: o runner não tem binário `opencode`. O skip é **visível** no log (`::notice`), e os dois casos sem host rodam incondicionalmente, com `PANTHEON_TOOL_CANARY_BIN` apontado para um caminho inexistente. Rodar de verdade exige um modo no script de sandbox — **não feito**.
|
|
213
|
+
- A cobertura de custo do banco v2 é de **~8,3 dias** nesta máquina (primeiro registro em 2026-09-25). O histórico v1 (~96 dias) fica num diretório irmão com nome de epoch, que **não** é contrato e por isso não é descoberto automaticamente. Quem quiser aponta `PANTHEON_COST_DB`.
|
|
214
|
+
- `metadata.phase` nunca existiu em v1 nem em v2 — medido: 0 linhas de `session_message` têm `$.metadata.phase` nem `$.phase`. A coluna Phase sempre foi `unknown`. Não é regressão, é feature que nunca funcionou.
|
|
215
|
+
## [v1.6.0-beta.3] - 2026-10-03
|
|
216
|
+
|
|
217
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
218
|
+
move this section to a versioned entry and reset the template below. -->
|
|
219
|
+
|
|
220
|
+
## 🆕 What's New
|
|
221
|
+
- **Três ferramentas V2 agora executam de verdade**: `hashline_edit`,
|
|
222
|
+
`pantheon_cost` e `pantheon_model` rodam no host `opencode v2.0.x`. Antes
|
|
223
|
+
eram placeholders que declaravam sucesso sem fazer nada.
|
|
224
|
+
- **Enforcement de sessão read-only no caminho V2**: `apollo` e `gaia` voltam
|
|
225
|
+
a ter escrita bloqueada, com o guard registrado no próprio plugin V2 — sem
|
|
226
|
+
depender de uma ponte que a instalação V2 não monta.
|
|
227
|
+
- **Varredura de segredos de alta confiança no caminho V2**: o único hard block
|
|
228
|
+
de segurança que a V1 tinha, e que estava inerte por viver num plugin que a
|
|
229
|
+
instalação V2 não carrega, passa a rodar.
|
|
230
|
+
|
|
231
|
+
## 🐞 Fixed
|
|
232
|
+
- **As 6 ferramentas de plugin do V2 falhavam em 100% das chamadas**:
|
|
233
|
+
`hashline_edit`, `pantheon_cost` e `pantheon_model` lançavam
|
|
234
|
+
`Tool result declared output without an output schema` em toda invocação. A
|
|
235
|
+
causa era assimetria local — `draft.add()` não declarava `output` enquanto o
|
|
236
|
+
`execute` resolvia `{ output: string }`. O host exige simetria nos dois
|
|
237
|
+
sentidos: resultado com `output` e nenhuma declaração lança, assim como
|
|
238
|
+
declaração sem `output` no resultado. `output` passou a ser **obrigatório** na
|
|
239
|
+
interface `V2ToolDef`, então o compilador exige a declaração daqui em diante.
|
|
240
|
+
- **A suíte exigia o defeito**: `tests/pantheon/plugin-v2-contract.test.ts`
|
|
241
|
+
afirmava que o resultado carregava `.output` string — literalmente a condição
|
|
242
|
+
de falha, contra um mock que não reproduzia a exigência do host. O teste foi
|
|
243
|
+
reescrito para o invariante de simetria, contra um mock que constrói o
|
|
244
|
+
`outputSchema` a partir de `def.output` como o host faz
|
|
245
|
+
(`output: I.outputSchema ?? {}`), cobrindo as duas direções do bicondicional.
|
|
246
|
+
- **A imposição read-only não existia na superfície V2**: `createEnforcementGuard`
|
|
247
|
+
só era instanciado em `src/plugin.ts`, que o `opencode.json` da release não
|
|
248
|
+
declara — V2 nunca carrega V1. Com `hashline_edit` funcional, uma sessão
|
|
249
|
+
somente-leitura podia escrever arquivos. O guard passou a ser registrado no
|
|
250
|
+
hook `execute.before` do V2, e `pantheon_model` — que escreve
|
|
251
|
+
`active-preset.json` em escopo project e global — foi acrescentado a
|
|
252
|
+
`DEFAULT_BLOCKED_TOOLS`, o que corrige também a V1. `pantheon_cost` ficou de
|
|
253
|
+
fora de propósito: só lê `opencode.db`.
|
|
254
|
+
- **O único hard block de segurança da V1 estava inerte**: o scan de segredos de
|
|
255
|
+
alta confiança vivia em `src/plugins/pantheon-hooks.ts`, um plugin que a
|
|
256
|
+
instalação V2 não carrega — inerte por construção, não por má configuração.
|
|
257
|
+
Passou a rodar dentro do `execute.before` do V2
|
|
258
|
+
(`scripts/hooks/scan-secrets.sh`; exit 2 bloqueia, exit 1 é advisory e só
|
|
259
|
+
registra). O caminho do script foi verificado a partir do tarball instalado,
|
|
260
|
+
não só do repo.
|
|
261
|
+
- **Cinco comentários afirmavam cobertura que não existe** ("wired through the
|
|
262
|
+
V1…"). Corrigidos — é o defeito "anunciado como vivo, morto no caminho", a
|
|
263
|
+
mesma classe do bug original, transferida do tool para o controle de segurança.
|
|
264
|
+
|
|
265
|
+
## ⚠️ Known Issues
|
|
266
|
+
- **A release entrega 3 ferramentas V2 funcionais, não 6**:
|
|
267
|
+
`pantheon_goal_create`, `pantheon_goal_get` e `pantheon_goal_update` foram
|
|
268
|
+
**removidos** da superfície V2. `GoalLoopDeps` exige `store`, `client` e
|
|
269
|
+
`board`, que não existem no `PluginContext` V2, e a bridge V1 resolve para
|
|
270
|
+
`null` fora da V1. Registrá-las como placeholders não funcionais seria pior
|
|
271
|
+
que a ausência: anunciá-las seria mentira silenciosa. Marcador `goal-tools`
|
|
272
|
+
em `V2_UNSUPPORTED_FEATURES`. **Breaking** para quem usava esses tools no
|
|
273
|
+
host V2 — o contrato V1 permanece disponível para o goal loop.
|
|
274
|
+
- **A matriz de delegação nativa da V1 não é replicada na V2**: o guard V2 cobre
|
|
275
|
+
a lista de ferramentas bloqueadas, mas não a matriz caller→target nem a negação
|
|
276
|
+
de `task` em sessão filha. A matriz precisa de uma hierarquia de sessões
|
|
277
|
+
semeada a partir dos metadados de sessão, e o V2 não expõe esse caminho de
|
|
278
|
+
semeadura — `SessionHierarchyRegistry.isRoot` reporta `true` para sessões
|
|
279
|
+
desconhecidas enquanto não semeada, então semeá-la pela metade negaria todo
|
|
280
|
+
`task()`. O branch é pulado em vez de negado indiscriminadamente. Marcador
|
|
281
|
+
`delegation-matrix`. `task` continua negada em sessão somente-leitura pela
|
|
282
|
+
lista de ferramentas bloqueadas, então a profundidade 2 se sustenta; o que
|
|
283
|
+
não existe é a matriz. Coberto por `experimental.subagent_depth` nesta
|
|
284
|
+
configuração, mas a garantia do plugin não existe.
|
|
285
|
+
- **O log do scan de segredos escreve só em `.pantheon/logs/hooks.log`**: o
|
|
286
|
+
`PluginContext` V2 não expõe `client` nem `directory`, então os canais de log
|
|
287
|
+
estruturado e de toast da V1 não existem nessa superfície. É menos
|
|
288
|
+
observabilidade, não menos bloqueio.
|
|
289
|
+
- **Falha de infraestrutura do scanner é fail-open por decisão**: script ausente
|
|
290
|
+
ou timeout não bloqueiam. `runHook` nunca rejeita e um erro de infraestrutura
|
|
291
|
+
não deve negar chamadas não relacionadas. Ausência do script não bloqueia.
|
|
292
|
+
|
|
293
|
+
## ✅ Closed Issues
|
|
294
|
+
- **Drift de documentação no `README.pt-BR.md`**: a tabela de contrato de
|
|
295
|
+
runtime e o parágrafo de superfície listavam 6 ferramentas V2 e as 3 de goal,
|
|
296
|
+
que não estão registradas. Corrigido para 3 ferramentas, com a razão da
|
|
297
|
+
ausência e o ponto de imposição read-only.
|
|
298
|
+
- **Cinco comentários de falsa cobertura** sobre a imposição read-only e o scan
|
|
299
|
+
de segredos.
|
|
300
|
+
- **Shim do loader JSON do ajv elevado a bootstrap de módulo**: o patch de
|
|
301
|
+
`Module._extensions['.json']` era aplicado de dentro de `loadAjv()` e ficava
|
|
302
|
+
vivo durante todo o run, podendo vazar entre arquivos de teste e se manifestar
|
|
303
|
+
longe da causa. Agora instala, carrega e restaura em nível de módulo, antes de
|
|
304
|
+
qualquer corpo de teste, com `finally`.
|
|
305
|
+
## [v1.6.0-beta.2] - 2026-10-02
|
|
306
|
+
|
|
307
|
+
## 🆕 What's New
|
|
308
|
+
- **`steps` não é mais definido pelo Pantheon**: removido dos 14 agentes em
|
|
309
|
+
`src/agents/`. No OpenCode 2 o campo é opcional e **sem default** — ausente
|
|
310
|
+
significa **sem teto nativo**. O host não impõe teto; o Pantheon estava
|
|
311
|
+
escrevendo um.
|
|
312
|
+
- **Instalador v2 remove `steps` residual**: configs já instalados passam a ter
|
|
313
|
+
o `steps` apagado dos agentes gerenciados. Escopo restrito aos agentes que o
|
|
314
|
+
Pantheon gerencia — um agente definido pelo usuário nunca é tocado. O bloco V1
|
|
315
|
+
singular `agent` é deliberadamente intocado (V1 em retirada).
|
|
316
|
+
- **Substitutos ao teto**: `task(background=true)` para trabalho fora da
|
|
317
|
+
foreground, `experimental.subagent_depth` para aninhamento de subagentes e
|
|
318
|
+
paralelismo entre delegações independentes.
|
|
319
|
+
- **Limpeza**: `max_steps` e `max_compaction_items` removidos de
|
|
320
|
+
`src/routing.yml`. `loadRoutingMaxSteps` nunca teve um único import — 2
|
|
321
|
+
matches no repo (definição e typedef), ambos removidos.
|
|
322
|
+
|
|
323
|
+
## 🐞 Fixed
|
|
324
|
+
- **`migrateV1toV2` descartava campos gerenciados**: com os blocos `agent` (V1)
|
|
325
|
+
e `agents` (V2) coexistindo — o caso de qualquer config já instalado — o
|
|
326
|
+
spread raso fazia um substituir o outro por inteiro. Na ordem de chaves do
|
|
327
|
+
`opencode.json` real, o lado perdedor era o do usuário. Agora **mescla**: a
|
|
328
|
+
base é o bloco V2, os campos gerenciados do V1 sobrescrevem, e os campos do
|
|
329
|
+
usuário são preservados. Mesma semântica já usada em `install/opencode.mjs`.
|
|
330
|
+
- **`docs/platforms/README.md` tinha tabela de step limits errada**: 14 linhas
|
|
331
|
+
listando limites por agente, **nenhum valor batendo** com `src/agents/`.
|
|
332
|
+
Tabela removida e a seção reescrita.
|
|
333
|
+
|
|
334
|
+
## ⚠️ Known Issues
|
|
335
|
+
- **Permissões de agente**: V1 usa `permission` e V2 usa `permissions`; ao mesclar esses blocos, a chave legada `permission` pode permanecer inerte ao lado de `permissions`.
|
|
336
|
+
- **Migração — rode o init uma vez**: `npx pantheon-opencode init
|
|
337
|
+
--opencode-version=v2` **uma única vez** limpa o `steps` residual. Sem isso o
|
|
338
|
+
config instalado continua carregando o teto antigo.
|
|
339
|
+
- **O `.md` de agente instalado é sobrescrito no próximo sync**: editar
|
|
340
|
+
`~/.config/opencode/agents/*.md` esperando persistência **não funciona**.
|
|
341
|
+
Comportamento **pré-existente**, não é regressão desta mudança — mas agora
|
|
342
|
+
está documentado para não ser reportado como uma.
|
|
343
|
+
- **`steps` definido à mão num agente gerenciado é removido a cada install v2**:
|
|
344
|
+
o instalador não distingue um valor que ele escreveu de um valor que você
|
|
345
|
+
escreveu (mesma chave, mesmo valor). Workaround: definir no frontmatter do
|
|
346
|
+
agente — e lembrar que ele **também** é sobrescrito no próximo sync.
|
|
347
|
+
## [v1.6.0-beta.1] - 2026-09-30
|
|
348
|
+
|
|
349
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
350
|
+
move this section to a versioned entry and reset the template below. -->
|
|
351
|
+
|
|
352
|
+
## 🆕 What's New
|
|
353
|
+
- **OpenCode 2** — first Pantheon beta compatible with the OpenCode 2 plugin
|
|
354
|
+
contract.
|
|
355
|
+
- **memory** — preserve SQLite FTS5/BM25 keyword search and the `code_*` codemap
|
|
356
|
+
tools.
|
|
357
|
+
|
|
358
|
+
## 🐞 Fixed
|
|
359
|
+
- **memory** — remove the legacy vector-memory scripts and embedding/KNN/RRF
|
|
360
|
+
path.
|
|
361
|
+
- **CI/release** — keep validation fail-closed; expand `doctor` checks and add
|
|
362
|
+
the OpenCode 2 V2-only sandbox validator.
|
|
363
|
+
|
|
21
364
|
## [v1.5.2] - 2026-09-22
|
|
22
365
|
|
|
23
366
|
## 🐞 Fixed
|