wizz-method 1.18.1 → 1.18.3

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.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/skills-registry.yaml +0 -9
  4. package/src/core-skills/_shared/handoff-protocol.md +4 -3
  5. package/src/modules/wizz/README.md +2 -2
  6. package/src/modules/wizz/_shared/model-ladder.md +21 -5
  7. package/src/modules/wizz/_shared/token-economy.md +3 -3
  8. package/src/modules/wizz/agents/wizz-ads/SKILL.md +3 -6
  9. package/src/modules/wizz/agents/wizz-ads/customize.toml +2 -9
  10. package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -1
  11. package/src/modules/wizz/agents/wizz-designer/customize.toml +1 -1
  12. package/src/modules/wizz/agents/wizz-growth/customize.toml +1 -1
  13. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +1 -1
  14. package/src/modules/wizz/agents/wizz-maestro/customize.toml +1 -1
  15. package/src/modules/wizz/agents/wizz-memoria/customize.toml +1 -1
  16. package/src/modules/wizz/agents/wizz-qa/customize.toml +1 -1
  17. package/src/modules/wizz/agents/wizz-seo/customize.toml +1 -1
  18. package/src/modules/wizz/agents/wizz-social/customize.toml +1 -1
  19. package/src/modules/wizz/module.yaml +1 -1
  20. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +1 -1
  21. package/src/modules/wizz/overrides/wizz-agent-architect.toml +1 -1
  22. package/src/modules/wizz/overrides/wizz-agent-dev.toml +1 -1
  23. package/src/modules/wizz/overrides/wizz-agent-pm.toml +1 -1
  24. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +1 -1
  25. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +1 -1
  26. package/src/modules/wizz/subagents/codex/wizz-exec-opus.toml +1 -1
  27. package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +3 -2
  28. package/src/modules/wizz/subagents/gemini/wizz-exec-opus.md +1 -1
  29. package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +2 -1
  30. package/src/modules/wizz/subagents/opencode/wizz-exec-opus.md +1 -1
  31. package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +2 -1
  32. package/src/modules/wizz/subagents/wizz-exec-opus.md +1 -1
  33. package/src/modules/wizz/subagents/wizz-exec-review.md +2 -2
  34. package/src/skills-lib/ad-creative/SKILL.md +1 -1
  35. package/src/skills-lib/paid-ads/SKILL.md +1 -1
  36. package/src/skills-lib/wizz-router/references/routing-table-flat.md +2 -5
  37. package/tools/installer/core/installer.js +20 -3
  38. package/tools/installer/modules/env-vars.js +41 -0
  39. package/tools/installer/modules/mcp-config.js +98 -14
  40. package/tools/installer/ui.js +6 -1
package/README.md CHANGED
@@ -21,7 +21,7 @@ O ponto de entrada técnico é o `wizz-router`: ele faz a triagem e manda pedido
21
21
  | ✍️ `wizz-copy` | Copy, e-mail, headlines | copywriting, email-sequence, humanizer, copy-editing |
22
22
  | 🔍 `wizz-seo` | SEO tradicional e de IA | seo-audit, ai-seo, schema-markup, programmatic-seo, site-architecture |
23
23
  | 📈 `wizz-growth` | Marketing, CRO, lançamento, preço, churn | marketing-ideas, page-cro, launch-strategy, pricing-strategy, churn-prevention |
24
- | 📢 `wizz-ads` | Mídia paga | paid-ads, ad-creative, analytics-tracking, MCP meta-ads |
24
+ | 📢 `wizz-ads` | Mídia paga | paid-ads, ad-creative, analytics-tracking |
25
25
  | 🧠 `wizz-memoria` | Memória do projeto | cerebro |
26
26
 
27
27
  Os papéis de dev e produto reusam os agentes WIZZ (Mary, John, Winston, Amelia, Sally, Paige), personalizados em PT-BR pelos overrides em `src/modules/wizz/overrides/`.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "wizz-method",
4
- "version": "1.18.1",
4
+ "version": "1.18.3",
5
5
  "description": "Wizz Method — método de agência orientado por IA em PT-BR (fork independente do BMad Method)",
6
6
  "keywords": [
7
7
  "agile",
@@ -355,15 +355,6 @@ areas:
355
355
  not_when:
356
356
  - "Google Ads institucional, campanha de marca, lead gen B2B."
357
357
  - "Escrever copy ou criativo: a skill lê número, não produz anúncio."
358
- mcps:
359
- - id: meta-ads
360
- when: "Gestão real de campanha Meta/Facebook/Instagram via API (criar/editar/medir ads)."
361
- server:
362
- command: npx
363
- # Pin de supply chain (2026-08-23): versão fixa; atualizar conscientemente.
364
- args: ["-y", "mcp-meta-ads@1.0.0"]
365
- env:
366
- META_ACCESS_TOKEN: "${META_ACCESS_TOKEN}"
367
358
 
368
359
  architect:
369
360
  agent: wizz-agent-architect
@@ -26,9 +26,10 @@ o entrypoint da skill e apenas as referências necessárias (progressive disclos
26
26
  `haiku | sonnet | opus | review`. Quem recebe despacha `wizz-exec-<hint>`
27
27
  (nativo em Claude Code, Codex, OpenCode e Gemini CLI). Escalada: no
28
28
  máximo 1 degrau acima se o executor devolver ambiguidade ou os testes
29
- falharem 2x. `opus` é condicional, só quando a sessão que delega roda
30
- acima de Opus (detalhe completo em `_shared/model-ladder.md`, no
31
- módulo wizz). Campo opcional: sem ele o handoff funciona normal.
29
+ falharem 2x. `opus` é degrau real só quando a sessão que delega roda
30
+ acima de Opus (Fable); em sessão Opus quem recebe pula para `review`
31
+ (detalhe completo em `_shared/model-ladder.md`, no módulo wizz).
32
+ Campo opcional: sem ele o handoff funciona normal.
32
33
  - precisa planejar (opcional): veredito sim/não do fator de planejamento
33
34
  do sinal de complexidade, avaliado por quem delega. Evita que quem
34
35
  recebe re-derive o sinal para aplicar o Gate de Planejamento
@@ -11,7 +11,7 @@ Personalização do WIZZ para a Wizz: linguagem fácil e resumida, cada agente t
11
11
  | `wizz-copy` | ✍️ | Copy, e-mail, headlines | copywriting, email-sequence, humanizer, copy-editing |
12
12
  | `wizz-seo` | 🔍 | SEO tradicional e de IA | seo-audit, ai-seo, schema-markup, programmatic-seo, site-architecture |
13
13
  | `wizz-growth` | 📈 | Marketing, CRO, lançamento, preço, churn | marketing-ideas, page-cro, launch-strategy, pricing-strategy, churn-prevention |
14
- | `wizz-ads` | 📢 | Mídia paga | paid-ads, ad-creative, analytics-tracking, MCP meta-ads |
14
+ | `wizz-ads` | 📢 | Mídia paga | paid-ads, ad-creative, analytics-tracking |
15
15
  | `wizz-memoria` | 🧠 | Memória do projeto | cerebro |
16
16
 
17
17
  Os papéis de dev/produto reusam os agentes WIZZ (Mary, John, Winston, Amelia, Sally, Paige), personalizados em PT-BR pelos overrides em `overrides/`.
@@ -19,7 +19,7 @@ Os papéis de dev/produto reusam os agentes WIZZ (Mary, John, Winston, Amelia, S
19
19
  ## Camada Wizz (em todos os agentes)
20
20
 
21
21
  - **Encerramento** (`_shared/encerramento.md`): bloco ✅/➡️/🎯 ao terminar.
22
- - **Economia de token** (`_shared/token-economy.md`): cerebro → grep antes de ler arquivos; RTK reescreve shell; trabalho mecânico vira linha-fato na ativação de todo agente (2+ subagentes `wizz-exec-haiku`/`wizz-exec-sonnet` em paralelo, nunca na sessão principal), com `wizz-exec-opus` condicional e `wizz-exec-review` (inherit) nos degraus acima; escada completa em `_shared/model-ladder.md`.
22
+ - **Economia de token** (`_shared/token-economy.md`): cerebro → grep antes de ler arquivos; RTK reescreve shell; trabalho mecânico vira linha-fato na ativação de todo agente (2+ subagentes `wizz-exec-haiku`/`wizz-exec-sonnet` em paralelo, nunca na sessão principal), o modelo da sessão é o chefe (orquestra e decide, não executa): `wizz-exec-opus` é o destino padrão do trabalho difícil em sessão Fable e `wizz-exec-review` roda pinado no degrau Forte, nunca herda a sessão; escada completa em `_shared/model-ladder.md`.
23
23
  - **Cerebro** (`_shared/cerebro.md`): auto-load leve na ativação, lembrete de salvar no fim.
24
24
  - **Idioma**: escolhido no `wizz-init` (padrão Português (BR)), gravado em `_wizz/bmm/config.yaml`.
25
25
  - **Encadeamento**: automático. O maestro anuncia a sequência e ela roda em ordem até o fim; pausa só em decisão de negócio ou risco irreversível.
@@ -2,6 +2,20 @@
2
2
 
3
3
  Os nomes `wizz-exec-haiku`/`wizz-exec-sonnet`/`wizz-exec-opus` são nomes de DEGRAU, não do modelo subjacente: em outras plataformas o modelo por trás muda, o nome do degrau fica.
4
4
 
5
+ ## O chefe é o modelo da sessão
6
+
7
+ O modelo da sessão principal é o chefe: orquestra, arbitra conflito entre executor e revisor, decide arquitetura e produto. O chefe não executa; delega para os degraus abaixo dele. Quem é o chefe muda com o `/model` da sessão, e o que muda junto é só QUAIS degraus ficam abaixo:
8
+
9
+ | Sessão (chefe) | Degraus abaixo do chefe | Onde cai trabalho difícil |
10
+ |---|---|---|
11
+ | Fable / Mythos (acima de Opus) | haiku, sonnet, opus, review | `wizz-exec-opus` |
12
+ | Opus | haiku, sonnet, review | o próprio chefe (é o mesmo modelo do degrau Forte, com o contexto já carregado) |
13
+ | Sonnet ou abaixo | haiku, review | o próprio chefe; review continua pinado no degrau Forte (revisa forte mesmo em sessão barata) |
14
+
15
+ Como saber quem é o chefe em Claude Code: o system prompt declara o modelo da sessão ("You are powered by the model named ..."). Fable e Mythos ficam acima de Opus.
16
+
17
+ A mesma lógica vale em toda plataforma, trocando os nomes pelos da tabela abaixo. Em Codex: sessão num modelo acima de gpt-5.6 (ex.: astra) → `wizz-exec-opus` (gpt-5.6, effort high) é o destino padrão do difícil e `wizz-exec-review` roda nele; sessão já em gpt-5.6 → o chefe absorve o degrau Forte. Em OpenCode e Gemini CLI, idem com claude-opus-5 e gemini-3-pro-preview.
18
+
5
19
  ## Tabela de degraus
6
20
 
7
21
  | Degrau | Subagente | Uso | Claude Code | Codex | OpenCode | Gemini CLI |
@@ -9,14 +23,16 @@ Os nomes `wizz-exec-haiku`/`wizz-exec-sonnet`/`wizz-exec-opus` são nomes de DEG
9
23
  | Mecânico | `wizz-exec-haiku` | varredura, rename, diff repetitivo, mudança 100% especificada | haiku | gpt-5.6-luna (effort low) | anthropic/claude-haiku-4-5 | gemini-3-flash-preview |
10
24
  | Padrão | `wizz-exec-sonnet` | feature pequena/média definida, bug com causa conhecida, testes | sonnet | gpt-5.6-terra (effort medium) | anthropic/claude-sonnet-5 | gemini-3-flash-preview |
11
25
  | Forte | `wizz-exec-opus` | bug sem causa clara, refactor cruzando módulos, decisão técnica local | opus | gpt-5.6 (effort high) | anthropic/claude-opus-5 | gemini-3-pro-preview |
12
- | Sessão | `wizz-exec-review` | review de diff, arbitragem, arquitetura local | inherit | sem model (usa `default_subagent_model`) | sem model (herda a sessão) | sem model (herda a sessão) |
26
+ | Revisão | `wizz-exec-review` | review de diff produzido por qualquer degrau; pinado no modelo Forte, nunca herda a sessão | opus | gpt-5.6 (effort high) | anthropic/claude-opus-5 | gemini-3-pro-preview |
13
27
 
14
28
  ## Regras
15
29
 
16
30
  1. Despacho inicial: o menor degrau que qualifica.
17
- 2. Escalada automática por evidência: se o executor devolveu ambiguidade OU os testes falharam 2x no mesmo brief, reemita o MESMO brief 1 degrau acima. Máximo 1 escalada; depois o trabalho volta para a sessão principal.
18
- 3. Degrau Forte é condicional: use quando a sessão principal roda um modelo ACIMA de Opus (ex.: Fable). Se a sessão é Opus ou abaixo, pule de Padrão direto para `wizz-exec-review` ou para a sessão (pinar opus numa sessão opus duplica custo sem ganho).
19
- 4. Implementa barato, revisa forte: diff produzido por `wizz-exec-haiku`/`wizz-exec-sonnet` passa por `wizz-exec-review` antes de integrar; conflito entre executor e revisor sobe para a sessão principal decidir.
20
- 5. Decisão de arquitetura ou produto nunca desce a escada: fica na sessão principal ou com o usuário.
31
+ 2. Escalada automática por evidência: se o executor devolveu ambiguidade OU os testes falharam 2x no mesmo brief, reemita o MESMO brief 1 degrau acima. Máximo 1 escalada; depois o trabalho volta para o chefe. Em sessão Fable, Sonnet sobe para `wizz-exec-opus`; em sessão Opus, Sonnet sobe direto para o chefe.
32
+ 3. Degrau Forte segue o chefe: em sessão acima de Opus (Fable, Mythos), `wizz-exec-opus` é o destino PADRÃO de bug sem causa clara, refactor cruzando módulos e decisão técnica local; o chefe não faz esse trabalho na própria sessão. Em sessão Opus ou abaixo, o degrau Forte coincide com o chefe ou fica acima dele: pule de Padrão direto para `wizz-exec-review` ou para o chefe (pinar opus numa sessão opus duplica custo sem ganho).
33
+ 4. Implementa barato, revisa forte: diff produzido por `wizz-exec-haiku`/`wizz-exec-sonnet`/`wizz-exec-opus` passa por `wizz-exec-review` antes de integrar. O revisor roda pinado no degrau Forte da plataforma, não no modelo da sessão: em sessão Fable o review sai do Fable e vai para Opus; em sessão Opus nada muda. Conflito entre executor e revisor sobe para o chefe decidir.
34
+ 5. Decisão de arquitetura ou produto nunca desce a escada: fica com o chefe ou com o usuário.
35
+ 6. Transparência: todo despacho diz no texto ao usuário o degrau e a quantidade ("3 × Sonnet", "1 × Opus para review"). Nunca só "executores".
36
+ 7. Quantidade sem teto: dispare quantos subagentes o trabalho pedir, um por unidade independente (arquivo, módulo, frente de verificação). O mínimo é 2 em paralelo; máximo não existe. O que limita é a partição (dois agentes nunca editam o mesmo arquivo), não um número.
21
37
 
22
38
  Nota final: modelos da tabela conferidos em 2026-08-20 nas docs oficiais de cada plataforma. Se seu plano usar outros modelos, edite os arquivos instalados (`.claude/agents/`, `.codex/agents/`, `.opencode/agents/`, `.gemini/agents/`).
@@ -33,10 +33,10 @@ Trabalho mecânico NUNCA roda na sessão principal. Isso inclui: varredura de ar
33
33
 
34
34
  - **`wizz-exec-haiku`**: varredura, lookup, renomeação, diff mecânico, mudança já 100% especificada. Sem ambiguidade nenhuma.
35
35
  - **`wizz-exec-sonnet`**: implementação do dia a dia, bug com causa raiz já conhecida, edição multi-arquivo, testes.
36
- - **`wizz-exec-opus`** (condicional): bug sem causa clara, refactor cruzando módulos. entra quando a sessão principal roda acima de Opus; senão pula direto para review ou sessão.
37
- - **`wizz-exec-review`** (model inherit): review do diff produzido pelos degraus acima antes de integrar.
36
+ - **`wizz-exec-opus`**: bug sem causa clara, refactor cruzando módulos, decisão técnica local. Destino padrão desse trabalho quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve o degrau e pula para review.
37
+ - **`wizz-exec-review`** (pinado no degrau Forte, `opus` em Claude Code): review do diff produzido pelos degraus acima antes de integrar. Não herda a sessão: em sessão Fable o review vai para Opus.
38
38
 
39
- Escalada: se o executor devolveu ambiguidade ou os testes falharam 2x no mesmo brief, reemita 1 degrau acima. Máximo 1 escalada por brief. Detalhe completo, tabela por plataforma e regras 1-5: `_shared/model-ladder.md`.
39
+ Escalada: se o executor devolveu ambiguidade ou os testes falharam 2x no mesmo brief, reemita 1 degrau acima. Máximo 1 escalada por brief. O modelo da sessão é o chefe: orquestra, arbitra e decide; não executa. Todo despacho diz ao usuário degrau e quantidade. Quantidade sem teto: quantos o trabalho pedir, um por unidade independente. Detalhe completo, tabela por plataforma e regras 1-7: `_shared/model-ladder.md`.
40
40
 
41
41
  Review de diff pode ir para `wizz-exec-review`; arquitetura e decisão de produto ficam no modelo da sessão principal (isso já está nas regras de review de wizz-quick-dev e wizz-code-review; não muda).
42
42
 
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: wizz-ads
3
- description: Wizz Method Paid Media Agent. Use when you need ad campaigns (Google, Meta, TikTok, LinkedIn), ad creatives, and tracking. Routes to paid-ads, ad-creative and analytics-tracking, and uses the meta-ads MCP for real management on Meta.
3
+ description: Wizz Method Paid Media Agent. Use when you need ad campaigns (Google, Meta, TikTok, LinkedIn), ad creatives, and tracking. Routes to paid-ads, ad-creative and analytics-tracking.
4
4
  ---
5
5
 
6
6
  # Ads — Mídia Paga
7
7
 
8
8
  ## Visão geral
9
- Você é o Ads do Wizz. Planeja campanhas, gera variações de criativo e acompanha métricas. Roteia para as skills globais via a ferramenta `Skill` e usa o MCP `meta-ads` quando for gestão real de campanhas Meta.
9
+ Você é o Ads do Wizz. Planeja campanhas, gera variações de criativo e acompanha métricas. Roteia para as skills globais via a ferramenta `Skill`.
10
10
 
11
11
  ## Na ativação
12
12
  1. **Resolver bloco:** rode `python3 {project-root}/_wizz/scripts/resolve_customization.py --skill {skill-root} --key agent`. Se falhar, mescle base → time → pessoal (`{skill-root}/customize.toml`, `{project-root}/_wizz/custom/{skill-name}.toml`, `.user.toml`).
@@ -20,13 +20,10 @@ Você é o Ads do Wizz. Planeja campanhas, gera variações de criativo e acompa
20
20
 
21
21
  ## Como trabalho (ponte global)
22
22
 
23
- > **Fonte única (registry) — leia SEMPRE antes dos exemplos abaixo:** a lista real da sua área (`ads`) vive no `skills-registry.yaml`. Resolva primeiro a **fatia leve da sua área**, `{project-root}/_wizz/_config/registry/ads.yaml` (já vem como o bloco `areas.ads` completo); se faltar (install antigo), caia pro monólito na ordem `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml` e ache o bloco `areas.ads` lá dentro. Precisando de algo cross-cutting (utility/mcp_utility/cli_utility/squads), leia `{project-root}/_wizz/_config/registry/_shared.yaml`. Ofereça **tudo que casar** com o pedido pelo `when:` — `skills:` (via `Skill`), `clis:` (`check:` → se faltar mostre o `install:`, opt-in, respeite `platform:`) e `mcps:` (`claude mcp add <id>` com o bloco `server`, ex. `meta-ads`). Os exemplos abaixo são atalho legível; o registry é a verdade e pega novidades automático (ex. `arcads` p/ gerar vídeo-ad).
23
+ > **Fonte única (registry) — leia SEMPRE antes dos exemplos abaixo:** a lista real da sua área (`ads`) vive no `skills-registry.yaml`. Resolva primeiro a **fatia leve da sua área**, `{project-root}/_wizz/_config/registry/ads.yaml` (já vem como o bloco `areas.ads` completo); se faltar (install antigo), caia pro monólito na ordem `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml` e ache o bloco `areas.ads` lá dentro. Precisando de algo cross-cutting (utility/mcp_utility/cli_utility/squads), leia `{project-root}/_wizz/_config/registry/_shared.yaml`. Ofereça **tudo que casar** com o pedido pelo `when:` — `skills:` (via `Skill`), `clis:` (`check:` → se faltar mostre o `install:`, opt-in, respeite `platform:`) e `mcps:` (`claude mcp add <id>` com o bloco `server`). Os exemplos abaixo são atalho legível; o registry é a verdade e pega novidades automático (ex. `arcads` p/ gerar vídeo-ad).
24
24
  - Estratégia de campanha, segmentação, lances, ROAS → `paid-ads`
25
25
  - Variações de criativo, headlines, copy de anúncio → `ad-creative`
26
26
  - Tracking, conversões, UTMs, pixel → `analytics-tracking`
27
- - Gestão real de campanha Meta (criar/editar/medir) → MCP `meta-ads`
28
-
29
- Nunca exponha o `META_ACCESS_TOKEN` em log ou código.
30
27
 
31
28
  ## Encerramento
32
29
  Termine com `✅ O que fiz` / `➡️ Próximo passo` / `🎯 Comando`.
@@ -16,17 +16,15 @@ include = ["../../_shared/communication-rules.md"]
16
16
 
17
17
  activation_steps_append = [
18
18
  "CEREBRO: no encerramento, se definiu estrutura de campanha, lembre de oferecer salvar no cerebro.",
19
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
20
  ]
21
21
 
22
22
  persistent_facts = [
23
23
  "Gate de planejamento: pedido de execução com complexidade alta e sem PRD/story/brief correspondente → pergunto 1x se crio o artefato antes (recomendado) ou pulo; nunca 2x na mesma cadeia. Regras completas: ler _shared/planning-gate.md do módulo wizz SÓ quando o gate disparar.",
24
- "Nunca exponho o META_ACCESS_TOKEN em log, código ou commit.",
25
- "Para gestão real de Meta uso o MCP meta-ads; para estratégia uso a skill paid-ads.",
26
24
  "Falo PT-BR fácil. Toda campanha precisa de tracking antes de subir.",
27
25
  ]
28
26
 
29
- role = "Planejar e gerenciar mídia paga (estratégia, criativo, tracking) roteando para as skills globais e para o MCP meta-ads."
27
+ role = "Planejar e gerenciar mídia paga (estratégia, criativo, tracking) roteando para as skills globais."
30
28
  identity = "Gestor de tráfego orientado a ROAS: testa criativos, corta o que não performa, escala o que funciona."
31
29
  communication_style = "Direto e numérico, em PT-BR fácil. Fala em CPA, ROAS e próximos testes."
32
30
 
@@ -51,8 +49,3 @@ prompt = "Invoque a skill GLOBAL 'ad-creative' via a ferramenta Skill para gerar
51
49
  code = "TR"
52
50
  description = "Tracking, conversões, UTMs, pixel"
53
51
  prompt = "Invoque a skill GLOBAL 'analytics-tracking' via a ferramenta Skill."
54
-
55
- [[agent.menu]]
56
- code = "ME"
57
- description = "Gestão real de campanha Meta (criar/editar/medir)"
58
- prompt = "Use o MCP 'meta-ads' (via ToolSearch para carregar as ferramentas) para gerenciar campanhas reais no Meta. Nunca exponha o token."
@@ -16,7 +16,7 @@ include = ["../../_shared/communication-rules.md"]
16
16
 
17
17
  activation_steps_append = [
18
18
  "CEREBRO: no encerramento, se definiu tom de voz/posicionamento, lembre de oferecer salvar no cerebro.",
19
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
20
  ]
21
21
 
22
22
  persistent_facts = [
@@ -17,7 +17,7 @@ include = ["../../_shared/communication-rules.md"]
17
17
 
18
18
  activation_steps_append = [
19
19
  "PRÓXIMO PASSO: normalmente chamar o wizz-agent-dev para construir; wizz-quick-dev se for ajuste pontual. Se decidiu algo de marca, lembre de oferecer salvar no cerebro.",
20
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
21
21
  ]
22
22
 
23
23
  persistent_facts = [
@@ -16,7 +16,7 @@ include = ["../../_shared/communication-rules.md"]
16
16
 
17
17
  activation_steps_append = [
18
18
  "CEREBRO: no encerramento, se definiu estratégia/preço, lembre de oferecer salvar no cerebro.",
19
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
20
  ]
21
21
 
22
22
  persistent_facts = [
@@ -75,7 +75,7 @@ O Diretor (`wizz-router`) já fez a triagem e te entregou porque é complexo. Se
75
75
  2. **Enriquecimento = o `skills-registry.yaml`**. Para a área escolhida, ele diz O QUE o agente puxa:
76
76
  - `areas:` — `agent` (deve casar com o do menu) e `skills:` (cada uma com `id` + `when` curto). Instrua o agente a invocar a(s) skill(s) global(is) cujo `when` casa com o pedido.
77
77
  - `utility:` — skills cross-cutting (find-skills, enhance-prompt, wizz-router). Ofereça quando couber.
78
- - `mcps:` (por área) e `mcp_utility:` (cross-cutting) — MCP servers que a área usa pra AGIR de verdade (ex: architect→supabase, ads→meta-ads, analyst→exa, util→context7; qa NÃO usa MCP de browser — é agent-browser via CLI). Se o pedido precisa de acesso real à ferramenta e o MCP não está ativo (`claude mcp list`), proponha `claude mcp add <id> -- <command>` usando o bloco `server` do registry (secrets via env/placeholder).
78
+ - `mcps:` (por área) e `mcp_utility:` (cross-cutting) — MCP servers que a área usa pra AGIR de verdade (ex: architect→supabase, analyst→exa, util→context7; qa NÃO usa MCP de browser — é agent-browser via CLI). Se o pedido precisa de acesso real à ferramenta e o MCP não está ativo (`claude mcp list`), proponha `claude mcp add <id> -- <command>` usando o bloco `server` do registry (secrets via env/placeholder).
79
79
  - `clis:` (por área) e `cli_utility:` (cross-cutting) — ferramentas de linha de comando que o agente chama direto (não são skill nem MCP): ex. qa→agent-browser; designer→hyperframes/claude-video/buttercut/voicebox (vídeo); ads→arcads; growth→scrapling; seo→distribb. Quando o `when:` casar com o pedido, ofereça a tool: rode o `check:` pra ver se já está instalada; se não, mostre o `install:` (opt-in, nunca auto-rode sem confirmar). Respeite o campo `platform:` — se presente e não casar com o OS/arch atual, NÃO ofereça (ex.: `buttercut` é `darwin-arm64`, só Apple Silicon). Clone-and-run (buttercut/voicebox/arcads) instala no projeto; avise sobre deps pesadas.
80
80
  - `squads:` — painéis consultivos (rodam via `wizz-party-mode`). Quando o pedido pedir validação/estratégia de um `domain`, rode o squad ANTES do agente em `advises` executar.
81
81
 
@@ -17,7 +17,7 @@ activation_steps_prepend = [
17
17
  include = ["../../_shared/communication-rules.md", "../../_shared/planning-gate.md"]
18
18
 
19
19
  activation_steps_append = [
20
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
21
21
  ]
22
22
 
23
23
  persistent_facts = [
@@ -14,7 +14,7 @@ activation_steps_prepend = [
14
14
  include = ["../../_shared/communication-rules.md"]
15
15
 
16
16
  activation_steps_append = [
17
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
17
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
18
18
  ]
19
19
 
20
20
  persistent_facts = [
@@ -16,7 +16,7 @@ include = ["../../_shared/communication-rules.md"]
16
16
 
17
17
  activation_steps_append = [
18
18
  "PRÓXIMO PASSO: voltar pro wizz-agent-dev se achou bug, ou seguir pra entrega. Se achou um bug não-óbvio, lembre de oferecer salvar no cerebro.",
19
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
20
  ]
21
21
 
22
22
  persistent_facts = [
@@ -16,7 +16,7 @@ include = ["../../_shared/communication-rules.md"]
16
16
 
17
17
  activation_steps_append = [
18
18
  "CEREBRO: no encerramento, se definiu estratégia de keywords, lembre de oferecer salvar no cerebro.",
19
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
20
  ]
21
21
 
22
22
  persistent_facts = [
@@ -17,7 +17,7 @@ include = ["../../_shared/communication-rules.md"]
17
17
  activation_steps_append = [
18
18
  "APRESENTAÇÃO: na primeira mensagem da sessão use uma variação de 'E aí! Sou o Rafa, teu parceiro de viralização haha. Me fala o tema e a gente monta um roteiro que vai parar o scroll. Mas antes de escrever qualquer coisa, preciso de algumas infos, me responde aí:' seguida das perguntas de briefing.",
19
19
  "CEREBRO: no encerramento, se definiu nicho, tom ou palavras-chave de CTA, lembre de oferecer salvar no cerebro.",
20
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
20
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
21
21
  ]
22
22
 
23
23
  persistent_facts = [
@@ -114,7 +114,7 @@ agents:
114
114
  title: Mídia Paga
115
115
  icon: "📢"
116
116
  team: wizz
117
- description: "Gerencia anúncios pagos roteando para paid-ads, ad-creative e analytics-tracking (e o MCP meta-ads). Cria variações de criativo e acompanha métricas."
117
+ description: "Gerencia anúncios pagos roteando para paid-ads, ad-creative e analytics-tracking. Cria variações de criativo e acompanha métricas."
118
118
 
119
119
  - code: wizz-memoria
120
120
  name: Memória
@@ -13,7 +13,7 @@ activation_steps_prepend = [
13
13
  include = ["../wizz/_shared/communication-rules.md"]
14
14
 
15
15
  activation_steps_append = [
16
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
16
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
17
17
  ]
18
18
 
19
19
  persistent_facts = [
@@ -13,7 +13,7 @@ include = ["../wizz/_shared/communication-rules.md"]
13
13
 
14
14
  activation_steps_append = [
15
15
  "PRÓXIMO PASSO: normalmente chamar o dev. Decisão de arquitetura quase sempre vale salvar no cerebro, lembre de oferecer.",
16
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
16
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
17
17
  ]
18
18
 
19
19
  persistent_facts = [
@@ -13,7 +13,7 @@ include = ["../wizz/_shared/communication-rules.md"]
13
13
 
14
14
  activation_steps_append = [
15
15
  "PRÓXIMO PASSO: normalmente chamar o wizz-qa para testar. Se resolveu um bug não-óbvio ou armadilha, lembre de oferecer salvar no cerebro.",
16
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
16
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
17
17
  ]
18
18
 
19
19
  persistent_facts = [
@@ -13,7 +13,7 @@ include = ["../wizz/_shared/communication-rules.md"]
13
13
 
14
14
  activation_steps_append = [
15
15
  "PRÓXIMO PASSO: normalmente chamar o arquiteto ou o dev. Se decidiu escopo/prioridade, lembre de oferecer salvar no cerebro.",
16
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
16
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
17
17
  ]
18
18
 
19
19
  persistent_facts = [
@@ -12,7 +12,7 @@ activation_steps_prepend = [
12
12
  include = ["../wizz/_shared/communication-rules.md"]
13
13
 
14
14
  activation_steps_append = [
15
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
15
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
16
16
  ]
17
17
 
18
18
  persistent_facts = [
@@ -15,7 +15,7 @@ include = ["../wizz/_shared/communication-rules.md"]
15
15
 
16
16
  activation_steps_append = [
17
17
  "PRÓXIMO PASSO: para visual premium/landing/motion, indique o wizz-designer.",
18
- "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. Trabalho difícil escala pra wizz-exec-opus (só se a sessão roda acima de Opus) e review de diff vai pro wizz-exec-review (modelo da sessão); escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
18
+ "Trabalho mecânico (varredura, lookup, diff repetitivo, mudança já especificada): não execute na sessão; dispare 2+ subagentes wizz-exec-haiku/wizz-exec-sonnet em paralelo, um por arquivo/módulo. O modelo da sessão é o chefe: orquestra e decide, não executa. Trabalho difícil vai pro wizz-exec-opus quando a sessão roda acima de Opus (Fable); em sessão Opus o chefe absorve esse degrau. Review de diff vai sempre pro wizz-exec-review (pinado em opus, não herda a sessão). Diga ao usuário degrau e quantidade de cada despacho. Escada completa em _shared/model-ladder.md e regra em _shared/token-economy.md do módulo wizz.",
19
19
  ]
20
20
 
21
21
  persistent_facts = [
@@ -1,6 +1,6 @@
1
1
  name = "wizz-exec-opus"
2
2
  description = """
3
- Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Degrau condicional: despachar quando a sessão principal roda um modelo acima deste degrau; se a sessão já é o topo, pule e use wizz-exec-review. Atenção: "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo Claude Opus; o modelo real deste subagente é gpt-5.6.
3
+ Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Em sessão acima deste degrau é o destino padrão desse trabalho: o chefe da sessão delega em vez de fazer. Se a sessão já é o topo, o chefe absorve este degrau: pule para wizz-exec-review. Atenção: "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo Claude Opus; o modelo real deste subagente é gpt-5.6.
4
4
  """
5
5
  model = "gpt-5.6"
6
6
  model_reasoning_effort = "high"
@@ -1,8 +1,9 @@
1
1
  name = "wizz-exec-review"
2
2
  description = """
3
- Revisor do Wizz Method. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. Atenção: "review" aqui é o DEGRAU de revisão da escada Wizz; não fixa um modelo próprio, herda o da sessão.
3
+ Revisor do Wizz Method. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. Atenção: "review" aqui é o DEGRAU de revisão da escada Wizz; pinado no degrau Forte da plataforma (gpt-5.6, effort high), não no modelo da sessão.
4
4
  """
5
- # sem model: usa o default_subagent_model da sessão
5
+ model = "gpt-5.6"
6
+ model_reasoning_effort = "high"
6
7
  sandbox_mode = "read-only"
7
8
  developer_instructions = """
8
9
  Você é um revisor adversarial do Wizz Method. Recebe um diff ou o resultado de um executor mais barato e assume que existe bug, mesmo que o resultado pareça limpo. Procure ativamente.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wizz-exec-opus
3
- description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Degrau condicional: despachar quando a sessão principal roda um modelo acima deste degrau; se a sessão já é o topo, pule e use wizz-exec-review. "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo subjacente.
3
+ description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Em sessão acima deste degrau é o destino padrão desse trabalho: o chefe da sessão delega em vez de fazer. Se a sessão já é o topo, o chefe absorve este degrau: pule para wizz-exec-review. "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo subjacente.
4
4
  kind: local
5
5
  model: gemini-3-pro-preview
6
6
  ---
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: wizz-exec-review
3
- description: Revisor do Wizz Method, herda o modelo da sessão por default. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. "review" aqui é o DEGRAU de revisão da escada Wizz.
3
+ description: Revisor do Wizz Method pinado no degrau Forte da plataforma (gemini-3-pro-preview), não no modelo da sessão. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. "review" aqui é o DEGRAU de revisão da escada Wizz.
4
4
  kind: local
5
+ model: gemini-3-pro-preview
5
6
  ---
6
7
 
7
8
  Você é um revisor adversarial do Wizz Method. Recebe um diff ou o resultado de um executor mais barato e assume que existe bug, mesmo que o resultado pareça limpo. Procure ativamente.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Degrau condicional: despachar quando a sessão principal roda um modelo acima deste degrau; se a sessão já é o topo, pule e use wizz-exec-review. "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo subjacente.
2
+ description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Em sessão acima deste degrau é o destino padrão desse trabalho: o chefe da sessão delega em vez de fazer. Se a sessão já é o topo, o chefe absorve este degrau: pule para wizz-exec-review. "opus" aqui é o DEGRAU mais forte da escada Wizz, não o modelo subjacente.
3
3
  mode: subagent
4
4
  model: anthropic/claude-opus-5
5
5
  ---
@@ -1,6 +1,7 @@
1
1
  ---
2
- description: Revisor do Wizz Method no modelo herdado da sessão pai. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. "review" aqui é o DEGRAU de revisão da escada Wizz.
2
+ description: Revisor do Wizz Method pinado no degrau Forte da plataforma (claude-opus-5), não no modelo da sessão pai. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha. "review" aqui é o DEGRAU de revisão da escada Wizz.
3
3
  mode: subagent
4
+ model: anthropic/claude-opus-5
4
5
  permission:
5
6
  edit: deny
6
7
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wizz-exec-opus
3
- description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Degrau condicional: despachar quando a sessão principal roda um modelo acima de Opus (ex.: Fable); se a sessão é Opus, pule este degrau e use wizz-exec-review.
3
+ description: Executor forte do Wizz Method para trabalho difícil. Bug sem causa conhecida, refactor que cruza módulos, decisão técnica local. Em sessão acima de Opus (Fable, Mythos) é o destino padrão desse trabalho: o chefe da sessão delega em vez de fazer. Em sessão Opus o chefe absorve este degrau: pule para wizz-exec-review.
4
4
  model: opus
5
5
  ---
6
6
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: wizz-exec-review
3
- description: Revisor do Wizz Method no modelo da sessão (inherit). Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha.
4
- model: inherit
3
+ description: Revisor do Wizz Method pinado no degrau Forte (opus), nunca no modelo da sessão. Em sessão Fable o review sai do chefe e vai para Opus; em sessão Opus nada muda. Recebe um diff ou resultado de executor mais barato e revisa correção, segurança, regressão e aderência ao escopo. Não implementa: devolve veredito e lista de problemas com arquivo:linha.
4
+ model: opus
5
5
  ---
6
6
 
7
7
  Você é um revisor adversarial do Wizz Method. Recebe um diff ou o resultado de um executor mais barato e assume que existe bug, mesmo que o resultado pareça limpo. Procure ativamente.
@@ -335,7 +335,7 @@ For pulling performance data and managing campaigns, see the [tools registry](..
335
335
  | Platform | Pull Performance Data | Manage Campaigns | Guide |
336
336
  |----------|:---------------------:|:----------------:|-------|
337
337
  | **Google Ads** | `google-ads campaigns list`, `google-ads reports get` | `google-ads campaigns create` | [google-ads.md](../../tools/integrations/google-ads.md) |
338
- | **Meta Ads** | `meta-ads insights get` | `meta-ads campaigns list` | [meta-ads.md](../../tools/integrations/meta-ads.md) |
338
+ | **Meta Ads** | - | - | - |
339
339
  | **LinkedIn Ads** | `linkedin-ads analytics get` | `linkedin-ads campaigns list` | [linkedin-ads.md](../../tools/integrations/linkedin-ads.md) |
340
340
  | **TikTok Ads** | `tiktok-ads reports get` | `tiktok-ads campaigns list` | [tiktok-ads.md](../../tools/integrations/tiktok-ads.md) |
341
341
 
@@ -298,7 +298,7 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key adver
298
298
  | Platform | Best For | MCP | Guide |
299
299
  |----------|----------|:---:|-------|
300
300
  | **Google Ads** | Search intent, high-intent traffic | ✓ | [google-ads.md](../../tools/integrations/google-ads.md) |
301
- | **Meta Ads** | Demand gen, visual products, B2C | - | [meta-ads.md](../../tools/integrations/meta-ads.md) |
301
+ | **Meta Ads** | Demand gen, visual products, B2C | - | - |
302
302
  | **LinkedIn Ads** | B2B, job title targeting | - | [linkedin-ads.md](../../tools/integrations/linkedin-ads.md) |
303
303
  | **TikTok Ads** | Younger demographics, video | - | [tiktok-ads.md](../../tools/integrations/tiktok-ads.md) |
304
304
 
@@ -59,8 +59,7 @@ Use esta tabela pra mapear skills/CLIs/MCPs direto **fora de projeto Wizz** (sem
59
59
  | Intenção / palavras-chave | Skills a oferecer | Prioridade |
60
60
  |---|---|---|
61
61
  | Ideias de marketing, estratégia de marketing, posicionamento | `marketing-ideas` + `marketing-psychology` + `product-marketing-context` | 1 |
62
- | Paid ads, anúncios, Google Ads, Meta Ads, TikTok Ads, mídia paga | `paid-ads` + `ad-creative` + `analytics-tracking` + **MCP meta-ads** | 1 |
63
- | Gestão de campanha Meta/Facebook/Instagram via API real | **MCP meta-ads** (`mcp-meta-ads`) direto | 1 |
62
+ | Paid ads, anúncios, Google Ads, Meta Ads, TikTok Ads, mídia paga | `paid-ads` + `ad-creative` + `analytics-tracking` | 1 |
64
63
  | Pixel/UTM/atribuição erradas, "a venda não bate com o gerenciador", "onde está furando o funil", tráfego orgânico inflado, conferir tracking antes de subir campanha | `tracking-audit` (+ `analytics-tracking` se for SaaS/produto) | 1 |
65
64
  | Lançamento de feature, lançamento de produto, go-to-market | `launch-strategy` + `social-content` + `email-sequence` | 1 |
66
65
  | Site pronto pra subir, pré-lançamento de SITE, "revisa antes do deploy", checklist de go-live, ou item pontual pré-lançamento (og:image/prévia de link, FAQ com schema, robots.txt, LGPD, alt text) | `site-launch-kit` | 1 |
@@ -97,6 +96,4 @@ Quando nenhuma skill/MCP instalado cobrir o pedido, **classifique o que falta**
97
96
 
98
97
  **Falta um MCP:** informe → `claude mcp list` → consulte `skills-registry.yaml` (`mcps:`/`mcp_utility:`, com `server` pronto) → proponha `claude mcp add <id> [-e VAR=$VAR] -- <command> [args]`. Secrets sempre via env/placeholder, nunca token real.
99
98
 
100
- MCPs comuns: context7 (docs de libs), supabase (Postgres), meta-ads (Meta), exa (pesquisa). Browser/E2E é sempre via CLI `agent-browser`, nunca via MCP Playwright.
101
-
102
- Para paid ads Meta, o MCP `mcp-meta-ads` dá acesso real à API Meta Marketing (campanhas, ad sets, ads, métricas, criativos). Combine com `paid-ads` + `ad-creative` + `analytics-tracking`. O `META_ACCESS_TOKEN` vem de env local: nunca exponha em logs ou código commitado.
99
+ MCPs comuns: context7 (docs de libs), supabase (Postgres), exa (pesquisa). Browser/E2E é sempre via CLI `agent-browser`, nunca via MCP Playwright.
@@ -4,7 +4,7 @@ const { Manifest } = require('./manifest');
4
4
  const { OfficialModules } = require('../modules/official-modules');
5
5
  const { installSkillsLib } = require('../modules/skills-lib');
6
6
  const { writeMcpConfig, renderAddCommand, prepareMcps, partitionAlreadyConfigured } = require('../modules/mcp-config');
7
- const { promptMissingEnvVars } = require('../modules/env-vars');
7
+ const { promptMissingEnvVars, mcpsWithMissingRequiredEnv } = require('../modules/env-vars');
8
8
  const { installClis, renderInstallCommand } = require('../modules/cli-config');
9
9
  const { writeDepsCache, readPreviousMcpPins } = require('../modules/deps-cache');
10
10
  const { IdeManager } = require('../ide/manager');
@@ -423,7 +423,7 @@ class Installer {
423
423
  // is still cheap for an already-installed binary: prepareMcp is
424
424
  // detect-first, so only a genuinely missing binary pays for the
425
425
  // network-heavy install/post_install steps.
426
- const { ready: mcpsReady, failed: mcpsFailed } = await prepareMcps({ mcps: toWrite });
426
+ let { ready: mcpsReady, failed: mcpsFailed } = await prepareMcps({ mcps: toWrite });
427
427
  for (const f of mcpsFailed) {
428
428
  await prompts.log.warn(
429
429
  `MCP ${f.id} não pôde ser preparado (${f.error}). Config NÃO escrita para evitar ENOENT — instale manualmente e adicione depois com \`claude mcp add\`.`,
@@ -451,10 +451,27 @@ class Installer {
451
451
  mcps: mcpsReady,
452
452
  });
453
453
  const envInteractive = !config.skipPrompts && !!process.stdin.isTTY;
454
- await promptMissingEnvVars(mcpsForEnvVars, {
454
+ const envResult = await promptMissingEnvVars(mcpsForEnvVars, {
455
455
  projectDir: paths.projectRoot,
456
456
  interactive: envInteractive,
457
457
  });
458
+
459
+ // A required (no-default) var that stayed unresolved means
460
+ // the server would be written with a permanently-broken
461
+ // literal `${VAR}` — never write it (E1: never fail the
462
+ // install, just drop that server and tell the user how to
463
+ // retry).
464
+ const missingEnv = mcpsWithMissingRequiredEnv(mcpsReady, envResult.skipped);
465
+ if (missingEnv.length > 0) {
466
+ const missingIds = new Set(missingEnv.map((m) => m.id));
467
+ mcpsReady = mcpsReady.filter((m) => !missingIds.has(m.id));
468
+ for (const m of missingEnv) {
469
+ await prompts.log.warn(
470
+ `MCP ${m.id} não gravado: faltou ${m.missing.join(', ')}. Rode o installer de novo quando tiver a chave, ou adicione com \`claude mcp add\`.`,
471
+ );
472
+ }
473
+ addResult('MCP servers', 'warn', `não gravados por falta de env var: ${missingEnv.map((m) => m.id).join(', ')}`);
474
+ }
458
475
  } catch (error) {
459
476
  await prompts.log.warn(`Falha ao configurar env vars dos MCPs: ${error.message}`);
460
477
  addResult('MCP env vars', 'warn', error.message);
@@ -589,9 +589,50 @@ async function promptMissingEnvVars(mcps, opts = {}) {
589
589
  };
590
590
  }
591
591
 
592
+ /**
593
+ * Find which of `mcps` have at least one REQUIRED (`hasDefault: false`) env
594
+ * placeholder that stayed unresolved, per the `skipped` list returned by
595
+ * `promptMissingEnvVars`/`resolveEnvVars`. A var WITH a default
596
+ * (`hasDefault: true`) is fine even when skipped — the Claude Code runtime
597
+ * resolves `${VAR:-default}` itself — so only `hasDefault: false` entries
598
+ * count here.
599
+ *
600
+ * Writing a server whose required placeholder never resolved to anywhere
601
+ * (not `process.env`, not `.env`, not the global store, not typed
602
+ * interactively) would embed a literal, permanently-broken `${VAR}` into
603
+ * `.mcp.json`: the server sits in the config but can never actually start.
604
+ * Callers use this to drop such a server from the write instead. Pure: no
605
+ * I/O.
606
+ *
607
+ * @param {Array<{id: string}>} mcps - Resolved MCP entries to check
608
+ * @param {Array<{name: string, mcpIds: string[], hasDefault: boolean}>} [skipped]
609
+ * - The `skipped` array from `promptMissingEnvVars`/`resolveEnvVars`
610
+ * @returns {Array<{id: string, missing: string[]}>} One entry per affected
611
+ * MCP id, with the names of its unresolved required vars (in encounter order)
612
+ */
613
+ function mcpsWithMissingRequiredEnv(mcps, skipped) {
614
+ const missingByMcpId = new Map();
615
+ for (const entry of skipped || []) {
616
+ if (!entry || entry.hasDefault) continue;
617
+ for (const id of entry.mcpIds || []) {
618
+ if (!missingByMcpId.has(id)) missingByMcpId.set(id, []);
619
+ missingByMcpId.get(id).push(entry.name);
620
+ }
621
+ }
622
+
623
+ const result = [];
624
+ for (const mcp of mcps || []) {
625
+ if (mcp && mcp.id && missingByMcpId.has(mcp.id)) {
626
+ result.push({ id: mcp.id, missing: missingByMcpId.get(mcp.id) });
627
+ }
628
+ }
629
+ return result;
630
+ }
631
+
592
632
  module.exports = {
593
633
  extractEnvPlaceholders,
594
634
  resolveEnvVars,
635
+ mcpsWithMissingRequiredEnv,
595
636
  persistEnvValues,
596
637
  persistProjectEnv,
597
638
  persistGlobalEnv,
@@ -326,25 +326,101 @@ async function partitionAlreadyConfigured({ projectDir, mcps }) {
326
326
  return { toPrepare, alreadyConfigured };
327
327
  }
328
328
 
329
+ /**
330
+ * Resolve the set of MCP ids covered by an installed Claude Code plugin
331
+ * (`~/.claude/plugins/installed_plugins.json`). A plugin key in that file's
332
+ * `plugins` map is `<name>@<marketplace>` (e.g.
333
+ * `supabase@claude-plugins-official`); the plugin covers catalog MCP id
334
+ * `<name>`. If the plugin ships its own `.mcp.json`
335
+ * (`<installPath>/.mcp.json`, `installPath` from the plugin's install
336
+ * record) with an `mcpServers` block, every key in that block is ALSO
337
+ * covered (e.g. the `vercel` plugin ships a server named `vercel`).
338
+ *
339
+ * Read failures at the top level (missing/malformed
340
+ * `installed_plugins.json`) fall back to "nothing covered", same spirit as
341
+ * the `~/.claude.json` handling in `partitionGloballyConfigured`. A failure
342
+ * reading ONE plugin's own `.mcp.json` (missing `installPath`, missing
343
+ * file, malformed JSON) only skips that plugin's extra ids — the plugin's
344
+ * own name stays covered, since that didn't require reading anything past
345
+ * the already-parsed top-level file.
346
+ *
347
+ * @param {string} [installedPluginsPath] - Override of
348
+ * `~/.claude/plugins/installed_plugins.json` (tests)
349
+ * @returns {Promise<Set<string>>}
350
+ */
351
+ async function resolvePluginCoveredIds(installedPluginsPath) {
352
+ const file = installedPluginsPath || path.join(os.homedir(), '.claude', 'plugins', 'installed_plugins.json');
353
+ const ids = new Set();
354
+
355
+ if (!(await fs.pathExists(file))) return ids;
356
+
357
+ let data;
358
+ try {
359
+ data = JSON.parse(await fs.readFile(file, 'utf8'));
360
+ } catch {
361
+ return ids;
362
+ }
363
+
364
+ const plugins = data && typeof data === 'object' && data.plugins && typeof data.plugins === 'object' ? data.plugins : null;
365
+ if (!plugins) return ids;
366
+
367
+ for (const [key, entries] of Object.entries(plugins)) {
368
+ const name = String(key).split('@')[0];
369
+ if (name) ids.add(name);
370
+
371
+ if (!Array.isArray(entries)) continue;
372
+ for (const entry of entries) {
373
+ const installPath = entry && entry.installPath;
374
+ if (!installPath || typeof installPath !== 'string') continue;
375
+
376
+ const mcpJsonPath = path.join(installPath, '.mcp.json');
377
+ try {
378
+ if (!(await fs.pathExists(mcpJsonPath))) continue;
379
+ const mcpConfig = JSON.parse(await fs.readFile(mcpJsonPath, 'utf8'));
380
+ const servers =
381
+ mcpConfig && typeof mcpConfig === 'object' && mcpConfig.mcpServers && !Array.isArray(mcpConfig.mcpServers)
382
+ ? mcpConfig.mcpServers
383
+ : null;
384
+ if (servers) {
385
+ for (const serverKey of Object.keys(servers)) ids.add(serverKey);
386
+ }
387
+ } catch {
388
+ // Malformed/unreadable plugin .mcp.json: skip its extra ids, the
389
+ // plugin's own name (added above) stays covered.
390
+ }
391
+ }
392
+ }
393
+
394
+ return ids;
395
+ }
396
+
329
397
  /**
330
398
  * Split resolved MCP entries into those still worth offering/installing in
331
- * the project and those the user already configured GLOBALLY (user scope, the
332
- * `mcpServers` key of `~/.claude.json`). A server configured there is live in
333
- * every project already usually with the real key embedded — so writing the
334
- * registry's `${VAR}`-placeholder copy into the project `.mcp.json` would at
335
- * best duplicate it and at worst shadow a working global config with a broken
336
- * placeholder one, then prompt the user for a key they already provided.
399
+ * the project and those the user already has covered elsewhere: configured
400
+ * GLOBALLY (user scope, the `mcpServers` key of `~/.claude.json`), or
401
+ * covered by an installed Claude Code PLUGIN
402
+ * (`~/.claude/plugins/installed_plugins.json`, see
403
+ * `resolvePluginCoveredIds`). Either way, the server is already live
404
+ * usually with the real key embedded so writing the registry's
405
+ * `${VAR}`-placeholder copy into the project `.mcp.json` would at best
406
+ * duplicate it and at worst shadow a working config with a broken
407
+ * placeholder one, then prompt the user for a key they already have.
337
408
  *
338
- * Read failures (missing/malformed `~/.claude.json`) fall back to "nothing is
339
- * global", the safe default: worst case the user sees the old behavior.
409
+ * Read failures (missing/malformed `~/.claude.json` or
410
+ * `installed_plugins.json`) fall back to "nothing is global"/"nothing is
411
+ * plugin-covered", the safe default: worst case the user sees the old
412
+ * behavior. An id present in BOTH sources is reported once, in
413
+ * `globallyConfigured` only (never duplicated into `pluginCovered`).
340
414
  *
341
415
  * @param {Object} args
342
416
  * @param {Array<{id: string}>} args.mcps - Resolved MCP entries to partition
343
417
  * @param {string} [args.claudeJsonPath] - Override of `~/.claude.json` (tests)
344
- * @returns {Promise<{toInstall: Array<Object>, globallyConfigured: string[]}>}
418
+ * @param {string} [args.installedPluginsPath] - Override of
419
+ * `~/.claude/plugins/installed_plugins.json` (tests)
420
+ * @returns {Promise<{toInstall: Array<Object>, globallyConfigured: string[], pluginCovered: string[]}>}
345
421
  */
346
- async function partitionGloballyConfigured({ mcps, claudeJsonPath }) {
347
- if (!mcps || mcps.length === 0) return { toInstall: [], globallyConfigured: [] };
422
+ async function partitionGloballyConfigured({ mcps, claudeJsonPath, installedPluginsPath }) {
423
+ if (!mcps || mcps.length === 0) return { toInstall: [], globallyConfigured: [], pluginCovered: [] };
348
424
 
349
425
  const file = claudeJsonPath || path.join(os.homedir(), '.claude.json');
350
426
  let globalIds = new Set();
@@ -359,13 +435,21 @@ async function partitionGloballyConfigured({ mcps, claudeJsonPath }) {
359
435
  }
360
436
  }
361
437
 
438
+ const pluginIds = await resolvePluginCoveredIds(installedPluginsPath);
439
+
362
440
  const toInstall = [];
363
441
  const globallyConfigured = [];
442
+ const pluginCovered = [];
364
443
  for (const mcp of mcps) {
365
- if (mcp && mcp.id && globalIds.has(mcp.id)) globallyConfigured.push(mcp.id);
366
- else toInstall.push(mcp);
444
+ if (mcp && mcp.id && globalIds.has(mcp.id)) {
445
+ globallyConfigured.push(mcp.id);
446
+ } else if (mcp && mcp.id && pluginIds.has(mcp.id)) {
447
+ pluginCovered.push(mcp.id);
448
+ } else {
449
+ toInstall.push(mcp);
450
+ }
367
451
  }
368
- return { toInstall, globallyConfigured };
452
+ return { toInstall, globallyConfigured, pluginCovered };
369
453
  }
370
454
 
371
455
  /**
@@ -629,9 +629,14 @@ class UI {
629
629
  // duplicate config and re-prompt for a key that already works. Filter it
630
630
  // out of every path below (multiselect, --mcps, --yes) with an info line
631
631
  // so nothing disappears silently.
632
- const { toInstall, globallyConfigured } = await partitionGloballyConfigured({ mcps: resolved });
632
+ const { toInstall, globallyConfigured, pluginCovered } = await partitionGloballyConfigured({ mcps: resolved });
633
633
  if (globallyConfigured.length > 0) {
634
634
  await prompts.log.info(`MCPs já configurados no seu Claude global (~/.claude.json), pulados: ${globallyConfigured.join(', ')}`);
635
+ }
636
+ if (pluginCovered.length > 0) {
637
+ await prompts.log.info(`MCPs já cobertos por plugin do Claude Code (user scope), pulados: ${pluginCovered.join(', ')}`);
638
+ }
639
+ if (globallyConfigured.length > 0 || pluginCovered.length > 0) {
635
640
  resolved = toInstall;
636
641
  if (resolved.length === 0) return { toWrite: [], toRecommend: [] };
637
642
  }