mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:13:07 +00:00
Global (~/.config/opencode/opencode.jsonc) fica só com jina+playwright (remove github/postgres/forgejo/stalwart/office-word/jobspy) — manual como OPS89. Repo Teqo opencode.json: penpot+postgres com permission gated (penpot*/postgres*/query deny no build, allow só nos subagentes penpot/postgres). Novos .opencode/agent/penpot.md + postgres.md (mode subagent, docs de limite teqo vs teqo_wt*). Re-homed: jobspy→jobs, forgejo+office-word→lei-mercados-digitais, forgejo+stalwart→infra-solla (remove postgres pin, AGENTS.md sem office-word), forgejo→iara-pwa (limpa pins postgres/stalwart). Prosa: AGENTS-infra.md, prompt-montagem-home.md, project-status/engineering-audit sem MCP/pnpm issue. Validação: opencode debug config nos 5 repos (Teqo 4, jobs 3, lei 6, infra 7, iara 3 MCPs), gh auth ok, gate:fast verde.
21 KiB
21 KiB
Impl: Consolidar MCPs do opencode: global fica só com playwright + jina; penpot/postgres viram subagentes; GitHub MCP morre (CLI gh); forgejo/jobspy/office-word/stalwart re-homed para os projetos donos
Status: aprovado Atualizado em: 2026-08-24 Issue: #857 Intenção: docs/plans/ops92-consolidar-mcps.md Appetite restante: ~0,5–1 dia herdado (config-only + 2 subagentes + prosa; sem migration, sem testes novos; tracer bullet)
Leitura da intenção
- Outcome: abrir o opencode no Teqo expõe só
jina+playwright(e built-ins) no global;penpotepostgresvivem só em subagentes do repo Teqo; GitHub viaghCLI; cada projeto irmão expõe localmente só o MCP que usa — sessões baratas sem perder ferramenta quando chamada. - O que NÃO negociar: anti-goals da intenção — NÃO criar gerenciador de MCPs; NÃO automatizar config global (continua manual do dono, como OPS89); NÃO criar config morta em projeto que não pediu; NÃO tocar
eur-lex/mcp-brasilnolei-mercados-digitais; NÃO mexer em credenciais/tokens além de mover blocos; NÃO auditar/limpar configs fora dos destinos confirmados; freeze de migrations/LGPD/URLs não afetado. - O que reavaliar: hipóteses de "Direção no codebase" — confirmadas com leitura ao vivo:
- Global real
~/.config/opencode/opencode.jsonctem 7 MCPs (github:false+jina+playwright+postgres+forgejo+stalwart+office-word+jobspy) — remover 5 blocos inteiros, manter 2. - Repo Teqo
opencode.json(10 linhas) hoje só$schema+mcp.penpot(:4-8, token em.opencode/secrets/penpot-tokenvia{file:…}) — vai ganharpostgresirmão. - Subagentes existentes
.opencode/agent/*.md(4 arquivos) —design-vision*.mdcommode: subagent+model: deepinfra/Qwen…,designer-campanha-solla.mdcommode: all— dão o precedente de frontmatter (description/mode/model/temperature). - Irmãos verificados:
jobs/opencode.jsonsóprovider(herda tudo do global);lei-mercados-digitais/opencode.jsonsóeur-lex+mcp-brasil;infra-solla/opencode.jsoncdesligapostgres:falsee herdaforgejo/stalwart/office-worddos globais;iara-pwa/opencode.jsoncdesligapostgres:false+stalwart:false(Issue #5 dela) e herdaforgejo. scripts/worktree.mjs:239-258(copyOpendevSecrets) copia.opencode/secrets/*— vira no-op se o repo não declararpenpot(mas penpot permanece declarado, então continua vivo).- Menções
(MCP|pnpm issue)em skills:.agents/skills/project-status/SKILL.md:25,.agents/skills/work-issue/SKILL.md:82+engineering-audit/SKILL.md:69— trocar paragh/sem MCP.
- Global real
Abordagem recomendada
flowchart LR
G["~/.config/opencode/opencode.jsonc\n(global, manual, fora do git)\nANTES 7 MCPs -> DEPOIS só jina + playwright\nREMOVE github/postgres/forgejo/stalwart/office-word/jobspy"] --> T["Sessão opencode no Teqo\nbuilt-ins + 2 MCPs globais"]
R["opencode.json (repo Teqo)\nANTES só penpot (1)\nDEPOIS penpot + postgres\n + permission gate"] --> T
R --> S1[".opencode/agent/penpot.md\nsubagent, permission: penpot/* allow"]
R --> S2[".opencode/agent/postgres.md\nsubagent, permission: postgres/* allow"]
S1 --> T
S2 --> T
T -->|usa quando precisa| GH["GitHub via gh CLI\n(gh 2.98 auth ok)"]
G2["Re-homed (repos donos)\njobs/opencode.json -> jobspy\nlei/opencode.json -> forgejo+office-word\ninfra/opencode.jsonc -> forgejo+stalwart\niara/opencode.jsonc -> forgejo"] --> O["Sessões nesses repos\nexpõem só o dono"]
Decisões caras (deliberadas com rejeitadas):
D1 — Onde declarar penpot + postgres (caro: muda quem paga contexto em toda sessão)
Opções: A | B | C
Recomendação: A — ambos em opencode.json do repo Teqo (commitado) + 2 subagentes no repo
Alternativas rejeitadas: B porque global voltaria a pagar contexto em TODO projeto (anula o outcome: abrir no Teqo custa mínimo mas abrir em jobs/lei também pagaria penpot/postgres); C porque remover postgres totalmente perde a ferramenta local deste projeto (banco teqo é ferramenta diária, não "outro projeto" — a intenção fixa "ficam no Teqo mas só dentro de subagentes")
- A mantém o princípio "edit the owner, don't twin" (OPS82/OPS89): repo é o dono de penpot (design do site) e do postgres local; global paga 0.
- B (global) foi cogitado no gate aberto — rejeitado exatamente pelo corte "repo Teqo (
opencode.json+.opencode/agent/*.md)" registrado na intenção. - C (matar postgres) barateia ainda mais mas remove capacidade que o plano de intenção marca como aceito explícito (
postgresconsulta o banco local).
D2 — Gate de tools por agente: permission vs tools (caro: se errar o mecanismo, o gate é silenciosamente ignorado)
Opções: A | B | C
Recomendação: A — permission por agente (mecanismo vigente)
Alternativas rejeitadas: B porque AgentConfig.tools está deprecated no schema e opencode debug config já mostra agent.<nome>.permission vazio — tools seria ignorado sem erro visível, sessão primária continuaria vendo penpot/postgres e o outcome "só nos subagentes" falharia silenciosamente; C porque sem gate nenhum, penpot/postgres voltam a custar em toda sessão (anula D1)
- Validar na hora com
opencode debug config | grep -A2 permissioneopencode debug agent penpot/postgres— o executor valida o mecanismo vigente, sem inventar paralelo. - Precedente: intenção já sinaliza "mecanismo oficial de gate … marcado como deprecated em favor de
permission— o executor valida o mecanismo vigente na hora".
D3 — Global manual vs automação (caro: automação reverte decisão de propriedade)
Opções: A | B
Recomendação: A — edição manual pelo dono, fora do git (mesmo padrão OPS89, sem CI lendo opencode.json)
Alternativas rejeitadas: B porque automatizar o global cria gerenciador de MCPs (rabbit hole nomeado da intenção) e acopla CI a arquivo fora do repo que nenhum gate valida estruturalmente — já provado que nenhum gate/CI lê opencode.json (OPS89: zero readFileSync/JSON.parse em tests/, zero match em .github/)
- Arquivo
~/.config/opencode/opencode.jsoncé JSONC com comentários//pt-BR (estilocheapestinception/deepinfra) — blocos removidos manualmente, validado comopencode debug configapós.
D4 — Destinos do re-home (caro: colocar no projeto errado cria config morta = mesmo desperdício)
Opções: A | B | C
Recomendação: A — só os destinos confirmados no gate 2026-08-24 (intenção "Questões em aberto"): forgejo -> lei-mercados-digitais + infra-solla + iara-pwa; jobspy -> jobs; office-word -> lei-mercados-digitais; stalwart -> só infra-solla
Alternativas rejeitadas: B porque adicionar stalwart em iara-pwa contradiz decisão versionada da própria iara-pwa (opencode.jsonc Issue #5 "e-mail pessoal; fora do fluxo de dev") — já desabilita stalwart; C porque adicionar office-word em infra-solla cria twin sem dono (intenção decide "não — só lei-mercados-digitais; AGENTS.md do infra-solla sai coerente sem office-word")
- Prova:
iara-pwa/opencode.jsonc: stalwart { enabled:false }com comentário Issue #5;infra-solla/AGENTS.md:65lista hojeoffice-wordem uso — vai sair da lista. jobs/opencode.jsonhoje semmcp— herda tudo do global; após re-home, declara explicitamente sójobspy.
D5 — Morte do GitHub MCP e validação (caro: se gh não cobre, perde capacidade)
Opções: A | B
Recomendação: A — remover bloco github do global e usar gh CLI (já autenticado, já fallback real nos scripts do repo)
Alternativas rejeitadas: B porque reativar GitHub MCP exige OAuth nunca autorizado desde 17/08 (bloco já com enabled:false) e duplicaria canal com gh — scripts/check-changelog-append-only.mjs e check-plans-only-pr-closes.mjs já provam gh como fallback
- Verificação ao vivo:
gh auth status→fsollalogged in (GITHUB_TOKEN + keyring);opencode debug configapós limpeza não listagithubemmcp.
Componentes / mudanças
~/.config/opencode/opencode.jsonc(global, FORA do repo — MANUAL, dono aplica; não commitar) — remover 5 blocos demcp:github(jáenabled:falsemas ainda declara tipo/url — deletar inteiro),postgres,forgejo,stalwart,office-word,jobspy. Mantém sójina+playwright+provider(cheapestinference/deepinfra/vercel) +permission+model/compaction. Validar comopencode debug config(deve listar só 2 MCPs globais + o repo penpot/postgres quando dentro do Teqo).opencode.json(repo Teqo, raiz) — de 10 linhas ($schema+mcp.penpot) parapenpot+postgrescomo siblings emmcp.postgresbloco:type:local, command: [npx -y @modelcontextprotocol/server-postgres, postgresql://teqo:teqo@localhost:5432/teqo], enabled:true(mesmo command hoje no global). Adicionarpermissiontop-level para gating (mecanismo A da D2): denegar por default na sessão primária e liberar por agente — validar schema vigente (opencode debug configdeve mostraragent.penpot.permissioneagent.postgres.permissioncom allows). Sempermission, o Teqo voltaria a pagar 2 MCPs em toda sessão (anula D1 — B rejeitada)..opencode/agent/penpot.md(novo) —mode: subagent,descriptionfixa "usa Penpot MCP para geometria do site",modelherdado ou sem override,permissionliberandopenpot:*. Reusa frontmatter dedesign-vision.md(mode: subagent,model: deepinfra/Qwen…,temperature: 0.2) como precedente; não cria gerenciador dinâmico..opencode/agent/postgres.md(novo) —mode: subagent,description"consulta o banco local teqo (read-only por padrão)",permissionliberandopostgres:*. Mesmo molde. O MCP aponta parateqofixo (nãoteqo_wt*do worktree) — documentar limitação e nunca usar contra prodteqo_1313(guardguard-dev-db/assertTestDatabasecontinuam).scripts/worktree.mjs:239-258, 345— nenhuma mudança de código:copyOpendevSecretscontinua copiando.opencode/secrets/penpot-token; com penpot ainda declarado no repo, não vira no-op. Só nota de verificação: sem penpot no repo, o{file:.opencode/secrets/penpot-token}dangling fariaopencoderecusar abrir — por isso penpot permanece declarado (intenção: "a cópia de secrets continua necessária — penpot permanece declarado no repo").- Projetos irmãos (edits commitados nesses repos, não no Teqo — listar como verificação cruzada; no Teqo o diff é só prosa/docs):
jobs/opencode.json— adicionarmcp.jobspy(bloco hoje no global:command: [.venv/bin/python, mcp/jobspy_server.py]).lei-mercados-digitais/opencode.json— adicionarmcp.forgejo+mcp.office-word; mantereur-lex+mcp-brasilintactos.infra-solla/opencode.jsonc— declararmcp.forgejo+mcp.stalwartlocais (blocos copiados do global, comFORGEJO_*/JMAP_*); remover pin morto"postgres": {enabled:false}; atualizarAGENTS.md:65para removeroffice-wordda lista "Em uso" (ficaforgejo, jina, playwright, stalwart + locais airbnb/homeexchange/whatsapp).iara-pwa/opencode.jsonc— declararmcp.forgejolocal; limpar pins mortos"postgres": {enabled:false}e"stalwart": {enabled:false}(este último já éenabled:falseproposital, mas com re-home global sem stalwart, o pin vira ruído — remover e deixar comentário da Issue #5).
- Prosa/docs no Teqo:
AGENTS-infra.md:13— atualizar frase que cita.opencode/secrets/*(ex.:penpot-token, referenciado peloopencode.jsonMCP config → agorapenpot/postgresgated por subagentes).docs/campanha/prompt-montagem-home.md:24— atualizar "UsepenpotUtils…" para "via subagentepenpot(penpotMCP)" — hoje diz "MCP do Penpot (já configurado)" sem mencionar subagente..agents/skills/project-status/SKILL.md:25— trocarMCP/pnpm issueporgh CLI / pnpm issue(remove menção a MCP morto);engineering-audit/SKILL.md:69mesma limpeza.docs/campanha/plano-site-campanha-2026.mdse citar penpot MCP como ativo — verificar e atualizar.
- Migration: sem migration — config-only; nenhum schema Payload muda (
push:falsenão tocado). - Access / Consent: N/A — sem collection/PII; não afeta
CampaignUser/Consentfail-closed. - UI: N/A — Impeccable A (sem UI); TUI do opencode é consumidor de verificação, não produto.
Dados → forma (se aplicável)
Não há dado de negócio. Forma é tooling de dev — a única "forma" deliberada é a de gate (D2: permission vs tools), já decidida acima com rejeitadas e gatilho de revisitação (se o schema estabilizar outro mecanismo, validar com opencode debug config antes de replicar).
Fases verificáveis
- Tracer Teqo (repo + subagentes) — 40% do appetite —
opencode.jsoncompenpot+postgres+permissiongate; criar.opencode/agent/penpot.md+postgres.md(frontmatter no moldedesign-vision*.md). Verificar dentro do Teqo:opencode debug configlistapenpot+postgresnomcpmasagent penpot/postgrestêmpermissionallow; sessão primáriaopencode debug agent buildnão lista tools penpot/postgres;node -e "JSON.parse(require('fs').readFileSync('opencode.json','utf8'))"passa;pnpm gate:fastverde (nenhum teste lêopencode.jsonestruturalmente — já provado em OPS89). Push viapnpm push→ CIchecksverde. - Global manual (dono) — condiciona o aceite, ordem recomendada: antes do merge — remover do global os 5 blocos (
github/postgres/forgejo/stalwart/office-word/jobspy— github jáfalse, deletar). Verificar fora de qualquer repo ou no Teqo após:opencode debug configmostra sójina+playwrightemmcpglobal;gh auth statuscontinuaLogged in;opencode agent listsemgithub. Se o dono não aplicar antes do merge, a janela é aceita (global com twin temporário vs Teqo já limpo — configs são merged, sem perda) — gatilho: aceitar fecha só com Fase 2 verde. - Re-home irmãos (nos repos donos) — 30% do appetite, em PRs separados por repo —
jobs(+jobspy),lei-mercados-digitais(+forgejo+office-word),infra-solla(+forgejo+stalwart, remove postgres pin, AGENTS.md sem office-word),iara-pwa(+forgejo, limpa pins postgres/stalwart). Verificar por repo:opencode debug configdentro de cada repo lista só os MCPs donos + os 2 globais (jina/playwright); nenhum lista MCP de outro dono. - Prosa + validação de ponta a ponta — 30% do appetite — atualizar
AGENTS-infra.md,prompt-montagem-home.md,project-status/SKILL.md,engineering-audit/SKILL.md;grep -rn "MCP.*pnpm issue\|penpot MCP.*ativo" .agents docs AGENTS-infra.mddeve retornar só histórico ou nada; validar fluxo desejado: abrir opencode no Teqo →TaskparapenpotexecutapenpotUtils.getPageByIdcom sucesso;TaskparapostgresexecutaSELECT 1noteqo;gh issue view 857funciona;pnpm devsobe epnpm worktree next --stay --no-migrateprovisiona compenpot-tokencopiado (não "bad file reference").
Rabbit holes / Não escopo (engenharia)
- NÃO criar gerenciador/descoberta dinâmica de MCPs — só 2 subagentes fixos (corte da intenção; D1-B/C já rejeitados).
- NÃO automatizar o global (script que reescreve
~/.config/opencode/opencode.jsonc) — continua manual do dono (D3-B rejeitada; OPS89 já provou manual sem CI). - NÃO editar credenciais/tokens em claro — mover blocos e só; validar lendo (
{env:…}/{file:…}continuam referenciando env/arquivo, sem inline). - NÃO tocar
eur-lex/mcp-brasilnolei-mercados-digitaisnem auditar/limpar configs de projetos fora da lista de 4 irmãos. - NÃO reformatar JSONC globais além dos blocos removidos — tocar só
mcp.*, manterprovider.*/permission/model/compaction. - NÃO alterar
scripts/worktree.mjs— com penpot ainda no repo, a cópia de secrets não é no-op; mexer vira risco de "bad file reference". - NÃO trocar
postgresparateqo_wt*dinâmico — o MCP continua apontando parateqofixo; worktrees com banco isolado usampsql/DATABASE_URLdireto, não o MCP.
Riscos e mitigação
- Global JSONC inválido após edição manual → loader do opencode falha alto; mitigar com
opencode debug configimediatamente após colar epython3 -m json.toolnão serve (JSONC) — usaropencode debug configcomo validator; manter backup do arquivo antes. - Token leak no debug →
opencode debug configno global imprime secrets resolvidos (FORGEJO_ACCESS_TOKEN,JMAP_PASSWORD,penpot userToken); não colar saída em Issue/PR/log; ao validar nos irmãos, redigir tokens (grepporenabledsemdebugquando só precisa listar keys). - Permission gate silenciosamente ignorado (tools vs permission) → sessão primária continuaria vendo penpot/postgres e o custo volta; mitigar validando
opencode debug agent penpot/postgreseopencode debug agent buildapós D1; se o schema mudar, o plano volta a D2 com evidência (gatilho explícito). - Editar 4 repos irmãos cria config morta → só os destinos confirmados no gate (D4); cada PR irmão verificado com
opencode debug configdentro daquele repo (deve listar só dono + jina/playwright). scripts/worktree.mjsvira no-op sem penpot → não acontece porque penpot permanece declarado no repo Teqo (intenção trava); se alguém remover penpot doopencode.json, o worktree falha com "bad file reference" — gatilho de reversão imediata.postgresMCP aponta parateqofixo, não parateqo_wt*do worktree → subagente postgres no worktree consulta o banco errado se o dev esperateqo_wt; documentar nos dois.mdque o MCP é parateqo(main/shared) e que worktrees isolados devem usarpsql $DATABASE_URLdireto; nunca apontarDATABASE_URLparateqo_1313prod (guardguard-dev-db/assertTestDatabasecontinuam).- Global editado sem CI (sem rede de segurança automatizada) → nenhum gate lê
opencode.jsoncglobal; mitigar com verificação manualopencode debug config+gh auth status+opencode agent listna Fase 2; manter twin temporário (global+repo com mesmo bloco) até Fase 2 verde — configs são merged, sem janela de perda (só custo temporário). - Infra-solla AGENTS.md stale → após re-home,
grep -n office-word AGENTS.mddeve dar zero; CI deinfra-solla(docker compose config -q) não valida MCP, então a verificação é manual viaopencode debug confignaquele repo.
Aceite de engenharia
- Aceite de produto da intenção coberto: Teqo expõe só
playwright+jinano global;penpotepostgressó via subagentes no repo Teqo (compermissiongate validado); GitHub viaghsem perda; cada irmão expõe só o dono (forgejo/jobspy/office-word/stalwart nos destinos confirmados);pnpm dev,worktree nexte docs que citam penpot coerentes. - Invariantes AGENTS/engineering-standards: sem twin — global é owner só de
jina/playwright, cada repo é owner do seu MCP; sem gerenciador; sem automação do global; sem credencial inline; sem migration retroativa. - Testes de domínio previstos: sem testes novos — config-only;
pnpm gate:fastverde já cobre que nenhum teste lêopencode.jsonestruturalmente (OPS89); verificação éopencode debug config+gh auth status+Taskpenpot/postgres. - Prosa/docs vivos sem menção stale a "MCP/
pnpm issue" (skills) nem "penpot MCP ativo" sem subagente.
Self-score decision-quality
- Decisões caras têm rejeitadas? Sim — D1 (A|B|C: B paga contexto em todo projeto, C perde ferramenta local), D2 (A|B|C: B é deprecated silencioso, C anula gate), D3 (A|B: B vira gerenciador contra anti-goal), D4 (A|B|C: B contradiz Issue #5 iara, C cria config morta), D5 (A|B: B reanima OAuth morto) — formato
Opções: A | B | C / Recomendação: … — porque … / Alternativas rejeitadas: … porque …em todas. - Cabe no appetite? Sim — config-only + 2 subagentes + prosa +
opencode debug config; ~0,5–1 dia herdado mantido; sem migration, sem testes novos; tracerbullet Fase 1 entrega Teqo isolado antes de tocar irmãos. - Rabbit holes nomeados? Sim — gerenciador de MCPs, automação do global, credenciais em claro, reformatar global inteiro, tocar eur-lex/mcp-brasil, auditar outros projetos, worktree.mjs, postgres dinâmico — todos com corte "não fazer" explícito.
- Depth check reusa? Sim — reusa
opencode.jsonexistente (não duplica global), frontmatter de.opencode/agent/design-vision*.md(mode subagent/model/temperature), blocopostgresidêntico ao global,copyOpendevSecretsexistente,ghCLI já fallback nos scripts,permissionvigente (não inventa paralelo). - Intenção (aceite de produto) permanece satisfeita? Sim — engenharia não reescreveu outcome; só concretizou "penpot/postgres viram subagentes" + gate + re-home confirmado no gate 2026-08-24; nenhuma hipótese reavaliada muda resultado nem escopo.
Score: 5/5 — gate ≥4 atendido.