wizz-method 1.4.0 → 1.4.1

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 (63) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/README.md +1 -1
  3. package/evals/routing/dataset.json +290 -0
  4. package/evals/routing/run-routing-eval.mjs +89 -0
  5. package/package.json +11 -3
  6. package/skills-registry.yaml +65 -28
  7. package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
  8. package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
  9. package/src/modules/wizz/agents/wizz-designer/SKILL.md +6 -8
  10. package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
  11. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +6 -5
  12. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
  13. package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
  14. package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
  15. package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -1
  16. package/src/skills-lib/auth-and-secrets/SKILL.md +29 -11
  17. package/src/skills-lib/desktop-security/SKILL.md +35 -4
  18. package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +52 -2083
  19. package/src/skills-lib/premium-landing-ui-researcher/references/audit-protocol.md +124 -0
  20. package/src/skills-lib/premium-landing-ui-researcher/references/component-sources.md +336 -0
  21. package/src/skills-lib/premium-landing-ui-researcher/references/core-goal.md +62 -0
  22. package/src/skills-lib/premium-landing-ui-researcher/references/dashboard-and-portfolio-modes.md +92 -0
  23. package/src/skills-lib/premium-landing-ui-researcher/references/handoffs.md +55 -0
  24. package/src/skills-lib/premium-landing-ui-researcher/references/landing-page-strategy.md +227 -0
  25. package/src/skills-lib/premium-landing-ui-researcher/references/mandatory-process.md +36 -0
  26. package/src/skills-lib/premium-landing-ui-researcher/references/output-format-and-quality.md +129 -0
  27. package/src/skills-lib/premium-landing-ui-researcher/references/prompt-templates.md +206 -0
  28. package/src/skills-lib/premium-landing-ui-researcher/references/site-levels.md +515 -0
  29. package/src/skills-lib/premium-landing-ui-researcher/references/source-first-protocol.md +144 -0
  30. package/src/skills-lib/premium-landing-ui-researcher/references/source-links.md +39 -0
  31. package/src/skills-lib/premium-landing-ui-researcher/references/stack-and-visual-direction.md +118 -0
  32. package/src/skills-lib/taste-skill/SKILL.md +33 -1177
  33. package/src/skills-lib/taste-skill/references/anti-slop-tells.md +110 -0
  34. package/src/skills-lib/taste-skill/references/architecture-conventions.md +39 -0
  35. package/src/skills-lib/taste-skill/references/block-library.md +61 -0
  36. package/src/skills-lib/taste-skill/references/brief-and-dials.md +89 -0
  37. package/src/skills-lib/taste-skill/references/dark-mode.md +23 -0
  38. package/src/skills-lib/taste-skill/references/design-directives.md +191 -0
  39. package/src/skills-lib/taste-skill/references/design-systems.md +267 -0
  40. package/src/skills-lib/taste-skill/references/motion-patterns.md +167 -0
  41. package/src/skills-lib/taste-skill/references/pattern-vocabulary.md +78 -0
  42. package/src/skills-lib/taste-skill/references/performance-a11y.md +33 -0
  43. package/src/skills-lib/taste-skill/references/preflight-checklist.md +73 -0
  44. package/src/skills-lib/taste-skill/references/redesign-protocol.md +52 -0
  45. package/src/skills-lib/web-security/SKILL.md +27 -2
  46. package/src/skills-lib/wizz-router/SKILL.md +21 -246
  47. package/src/skills-lib/wizz-router/references/auditoria-360.md +21 -0
  48. package/src/skills-lib/wizz-router/references/routing-table-flat.md +95 -0
  49. package/src/squads/advisory-board/agents/ray-dalio.md +0 -20
  50. package/tools/hooks/README.md +17 -0
  51. package/tools/hooks/security-defensive-context.js +70 -0
  52. package/tools/hooks/session-rules.js +38 -0
  53. package/tools/hooks/wizz-router-enforce.js +188 -0
  54. package/tools/installer/modules/skills-lib.js +70 -1
  55. package/tools/sync-global.mjs +84 -0
  56. package/.claude/settings.local.json +0 -8
  57. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  58. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  59. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  60. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
  61. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +0 -1
  62. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +0 -1
  63. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +0 -1
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "wizz-method",
3
3
  "owner": {
4
- "name": "Brian (Wizz) Madison"
4
+ "name": "Wizz! comms."
5
5
  },
6
- "description": "Breakthrough Method of Agile AI-driven Development — a full-lifecycle framework with agents and workflows for analysis, planning, architecture, and implementation.",
6
+ "description": "Wizz Method — a full-lifecycle AI development framework with agents and workflows for analysis, planning, architecture, and implementation. Independent fork of BMAD Method.",
7
7
  "license": "MIT",
8
- "homepage": "https://github.com/bmad-code-org/WIZZ-METHOD",
9
- "repository": "https://github.com/bmad-code-org/WIZZ-METHOD",
8
+ "homepage": "https://method.wizzcomms.com",
9
+ "repository": "https://github.com/wizzcomms/wizz-method",
10
10
  "keywords": ["wizz", "agile", "ai", "orchestrator", "development", "methodology", "agents"],
11
11
  "plugins": [
12
12
  {
package/README.md CHANGED
@@ -59,7 +59,7 @@ Sem TTY, o idioma padrão é "Português (BR)". Use `--lang` ou a variável `WIZ
59
59
 
60
60
  ## Origem
61
61
 
62
- O Wizz Method é um fork independente do [Wizz Method](https://github.com/bmad-code-org/WIZZ-METHOD), mantido pela Wizz! comms. O motor continua o WIZZ: workflows, agentes de dev e produto e a arquitetura de skills. A camada Wizz adiciona marca, idioma, roteamento e os 7 agentes de agência por cima desse motor. Crédito e agradecimento ao projeto original.
62
+ O Wizz Method é um fork independente do [BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD), mantido pela Wizz! comms. O motor continua o BMAD: workflows, agentes de dev e produto e a arquitetura de skills. A camada Wizz adiciona marca, idioma, roteamento e os 7 agentes de agência por cima desse motor. Crédito e agradecimento ao projeto original.
63
63
 
64
64
  ## Documentação
65
65
 
@@ -0,0 +1,290 @@
1
+ [
2
+ {
3
+ "id": "t01",
4
+ "prompt": "oi",
5
+ "expected": "trivial",
6
+ "note": "saudação simples, sem ação"
7
+ },
8
+ {
9
+ "id": "t02",
10
+ "prompt": "obrigado",
11
+ "expected": "trivial",
12
+ "note": "agradecimento puro"
13
+ },
14
+ {
15
+ "id": "t03",
16
+ "prompt": "sim",
17
+ "expected": "trivial",
18
+ "note": "resposta curta (sim/não/ok)"
19
+ },
20
+ {
21
+ "id": "t04",
22
+ "prompt": "não",
23
+ "expected": "trivial",
24
+ "note": "resposta curta (sim/não/ok)"
25
+ },
26
+ {
27
+ "id": "t05",
28
+ "prompt": "ok",
29
+ "expected": "trivial",
30
+ "note": "resposta curta (sim/não/ok)"
31
+ },
32
+ {
33
+ "id": "t06",
34
+ "prompt": "o que foi feito?",
35
+ "expected": "trivial",
36
+ "note": "pergunta de status, sem ação técnica"
37
+ },
38
+ {
39
+ "id": "t07",
40
+ "prompt": "trocar 'envie' por 'enviar' na linha 42",
41
+ "expected": "trivial",
42
+ "note": "typo/rename de 1 linha"
43
+ },
44
+ {
45
+ "id": "t08",
46
+ "prompt": "rebatiza Home para Landing",
47
+ "expected": "trivial",
48
+ "note": "rename simples, 1 arquivo"
49
+ },
50
+ {
51
+ "id": "t09",
52
+ "prompt": "/help",
53
+ "expected": "trivial",
54
+ "note": "slash command"
55
+ },
56
+ {
57
+ "id": "t10",
58
+ "prompt": "/config",
59
+ "expected": "trivial",
60
+ "note": "slash command"
61
+ },
62
+ {
63
+ "id": "t11",
64
+ "prompt": "como tá o deploy?",
65
+ "expected": "trivial",
66
+ "note": "pergunta conversacional, sem ação"
67
+ },
68
+ {
69
+ "id": "t12",
70
+ "prompt": "tudo bem?",
71
+ "expected": "trivial",
72
+ "note": "conversação pura"
73
+ },
74
+ {
75
+ "id": "t13",
76
+ "prompt": "link?",
77
+ "expected": "trivial",
78
+ "note": "pergunta muito curta, sem verbo de ação"
79
+ },
80
+ {
81
+ "id": "t14",
82
+ "prompt": "esqueci a senha",
83
+ "expected": "trivial",
84
+ "note": "frase curta sem ação técnica (info only)"
85
+ },
86
+ {
87
+ "id": "a01",
88
+ "prompt": "redesenha o hero da landing com a nova brand",
89
+ "expected": "agent:designer",
90
+ "note": "UI update, 1 area, pontual"
91
+ },
92
+ {
93
+ "id": "a02",
94
+ "prompt": "cria um card component pra portfolio",
95
+ "expected": "agent:designer",
96
+ "note": "componente isolado, designer"
97
+ },
98
+ {
99
+ "id": "a03",
100
+ "prompt": "anima o scroll de entrada da página",
101
+ "expected": "agent:designer",
102
+ "note": "motion/animation, 1 area"
103
+ },
104
+ {
105
+ "id": "a04",
106
+ "prompt": "escreve uma headline pra vender este plano",
107
+ "expected": "agent:copy",
108
+ "note": "copy de venda, 1 area, focado"
109
+ },
110
+ {
111
+ "id": "a05",
112
+ "prompt": "melhora o email de onboarding",
113
+ "expected": "agent:copy",
114
+ "note": "email copy, 1 area"
115
+ },
116
+ {
117
+ "id": "a06",
118
+ "prompt": "cria 3 variações de CTA pra testar",
119
+ "expected": "agent:copy",
120
+ "note": "copy de botão, A/B ready, 1 area"
121
+ },
122
+ {
123
+ "id": "a07",
124
+ "prompt": "faz auditoria SEO do site",
125
+ "expected": "agent:seo",
126
+ "note": "auditoria, 1 area"
127
+ },
128
+ {
129
+ "id": "a08",
130
+ "prompt": "adiciona schema markup no produto",
131
+ "expected": "agent:seo",
132
+ "note": "schema SEO, 1 area, técnico"
133
+ },
134
+ {
135
+ "id": "a09",
136
+ "prompt": "otimiza as meta descriptions",
137
+ "expected": "agent:seo",
138
+ "note": "SEO on-page, 1 area"
139
+ },
140
+ {
141
+ "id": "a10",
142
+ "prompt": "como melhorar a taxa de conversão do signup?",
143
+ "expected": "agent:growth",
144
+ "note": "CRO question, 1 area, lightweight"
145
+ },
146
+ {
147
+ "id": "a11",
148
+ "prompt": "qual o melhor preço pra este feature?",
149
+ "expected": "agent:growth",
150
+ "note": "pricing, 1 area"
151
+ },
152
+ {
153
+ "id": "a12",
154
+ "prompt": "plano pra reduzir churn",
155
+ "expected": "agent:growth",
156
+ "note": "churn analysis, 1 area, mas esperaria maestro por depth — porém 'plano' é leve: just brainstorm; se fosse 'executa o plano' seria maestro"
157
+ },
158
+ {
159
+ "id": "a13",
160
+ "prompt": "cria post pra LinkedIn sobre o lançamento",
161
+ "expected": "agent:social",
162
+ "note": "social copy, 1 area"
163
+ },
164
+ {
165
+ "id": "a14",
166
+ "prompt": "escreve copy pra Instagram story",
167
+ "expected": "agent:social",
168
+ "note": "social content, 1 area"
169
+ },
170
+ {
171
+ "id": "a15",
172
+ "prompt": "cria variações de ad criativo pra Meta",
173
+ "expected": "agent:ads",
174
+ "note": "paid ads, 1 area, copywriting"
175
+ },
176
+ {
177
+ "id": "a16",
178
+ "prompt": "setup de tracking no Google Ads",
179
+ "expected": "agent:ads",
180
+ "note": "ads technical, 1 area"
181
+ },
182
+ {
183
+ "id": "a17",
184
+ "prompt": "roda teste E2E do fluxo de checkout",
185
+ "expected": "agent:qa",
186
+ "note": "QA, 1 area, pontual"
187
+ },
188
+ {
189
+ "id": "a18",
190
+ "prompt": "verifica visualmente a responsividade do site",
191
+ "expected": "agent:qa",
192
+ "note": "visual QA, 1 area"
193
+ },
194
+ {
195
+ "id": "a19",
196
+ "prompt": "anota que definimos não fazer autenticação social por hora",
197
+ "expected": "agent:memoria",
198
+ "note": "memory, decisão registrada"
199
+ },
200
+ {
201
+ "id": "a20",
202
+ "prompt": "salva a decisão sobre pricing em tiers",
203
+ "expected": "agent:memoria",
204
+ "note": "memory, arquitetura de preço"
205
+ },
206
+ {
207
+ "id": "a21",
208
+ "prompt": "corrige o bug de logout no mobile",
209
+ "expected": "agent:dev",
210
+ "note": "bug fix, 1 arquivo, pontual"
211
+ },
212
+ {
213
+ "id": "a22",
214
+ "prompt": "ajusta a cor do botão secundário",
215
+ "expected": "agent:dev",
216
+ "note": "CSS fix, 1 arquivo"
217
+ },
218
+ {
219
+ "id": "m01",
220
+ "prompt": "cria a landing completa, escreve a copy de venda e configura o tracking",
221
+ "expected": "maestro",
222
+ "note": "3 áreas (designer, copy, growth/ads), artefato alto"
223
+ },
224
+ {
225
+ "id": "m02",
226
+ "prompt": "novo produto do zero: UI, docs, schema SEO, post de lançamento",
227
+ "expected": "maestro",
228
+ "note": "4 áreas (designer, dev, seo, social), multi-passo alto"
229
+ },
230
+ {
231
+ "id": "m03",
232
+ "prompt": "auditoria completa do site: performance, SEO, segurança, acessibilidade",
233
+ "expected": "maestro",
234
+ "note": "2+ áreas, complexidade alta, relatório merecedor de memória"
235
+ },
236
+ {
237
+ "id": "m04",
238
+ "prompt": "redesenha o onboarding, reescreve os emails, testa tudo E2E",
239
+ "expected": "maestro",
240
+ "note": "3 áreas (designer, copy, qa), integrado"
241
+ },
242
+ {
243
+ "id": "m05",
244
+ "prompt": "plano de crescimento: pricing, copy, anúncios, CRO do signup",
245
+ "expected": "maestro",
246
+ "note": "3-4 áreas (growth, copy, ads), estratégico"
247
+ },
248
+ {
249
+ "id": "m06",
250
+ "prompt": "refactor de infra: banco de dados, APIs, deploy, monitoria",
251
+ "expected": "maestro",
252
+ "note": "1 área (dev) mas multi-passo pesado, arquitetura alta"
253
+ },
254
+ {
255
+ "id": "m07",
256
+ "prompt": "integra pagamento: back, front, testes, comunicação com cliente",
257
+ "expected": "maestro",
258
+ "note": "1 area (dev) mas multi-passo pesado, requer planning"
259
+ },
260
+ {
261
+ "id": "m08",
262
+ "prompt": "melhora de churn: análise, copy de reativação, anúncios, UI de upgrade",
263
+ "expected": "maestro",
264
+ "note": "3-4 áreas (growth, copy, ads, designer), integrado"
265
+ },
266
+ {
267
+ "id": "m09",
268
+ "prompt": "lançamento beta: site, emails, social, ads, suporte inicial",
269
+ "expected": "maestro",
270
+ "note": "4+ áreas (designer, copy, social, ads), event-driven"
271
+ },
272
+ {
273
+ "id": "m10",
274
+ "prompt": "internacionalização: tradução completa, schema por locale, testes",
275
+ "expected": "maestro",
276
+ "note": "2+ áreas (dev, seo, qa), multi-passo pesado"
277
+ },
278
+ {
279
+ "id": "m11",
280
+ "prompt": "migração de plataforma: arquitetura, testes, rollout, suporte",
281
+ "expected": "maestro",
282
+ "note": "1 área (dev) mas crítico, multi-passo, requer planning e memória"
283
+ },
284
+ {
285
+ "id": "m12",
286
+ "prompt": "estratégia de referral: programa, UI, emails, tracking, análise",
287
+ "expected": "maestro",
288
+ "note": "4+ áreas (growth, designer, copy, ads), artefato alto"
289
+ }
290
+ ]
@@ -0,0 +1,89 @@
1
+ // run-routing-eval.mjs — avalia o roteamento do Wizz Method contra
2
+ // evals/routing/dataset.json.
3
+ //
4
+ // Dois níveis:
5
+ // 1. DETERMINÍSTICO (default, rápido, roda em CI): valida o gate isTrivial()
6
+ // do hook wizz-router-enforce contra os rótulos do dataset.
7
+ // - expected "trivial" → isTrivial deve ser true
8
+ // - expected "agent:*"/"maestro" → isTrivial deve ser false
9
+ // 2. LLM (--llm, requer `claude` CLI logado, custa tokens): para os casos
10
+ // não-triviais, pergunta ao modelo qual a rota (agent:<area> | maestro)
11
+ // usando a mesma regra de dispatch do Diretor/maestro e compara.
12
+ //
13
+ // Uso:
14
+ // node evals/routing/run-routing-eval.mjs # só determinístico
15
+ // node evals/routing/run-routing-eval.mjs --llm # inclui rota via LLM
16
+ // node evals/routing/run-routing-eval.mjs --llm --model haiku
17
+
18
+ import fs from 'node:fs';
19
+ import path from 'node:path';
20
+ import { execFileSync } from 'node:child_process';
21
+ import { createRequire } from 'node:module';
22
+ import { fileURLToPath } from 'node:url';
23
+
24
+ const here = path.dirname(fileURLToPath(import.meta.url));
25
+ const repoRoot = path.resolve(here, '..', '..');
26
+ const require = createRequire(import.meta.url);
27
+ const { isTrivial } = require(path.join(repoRoot, 'tools', 'hooks', 'wizz-router-enforce.js'));
28
+
29
+ const dataset = JSON.parse(fs.readFileSync(path.join(here, 'dataset.json'), 'utf8'));
30
+ const useLlm = process.argv.includes('--llm');
31
+ const modelIdx = process.argv.indexOf('--model');
32
+ const model = modelIdx === -1 ? 'haiku' : process.argv[modelIdx + 1];
33
+
34
+ const DISPATCH_RULE =
35
+ 'Você é o Diretor do Wizz Method. Classifique o pedido do usuário em UMA rota:\n' +
36
+ '- "maestro": toca 2+ áreas OU 2+ fatores altos (multi-passo, precisa planejar, gera artefato pra memória).\n' +
37
+ '- "agent:<area>": 1 área só e leve. Áreas: designer, copy, seo, growth, social, ads, qa, memoria, dev.\n' +
38
+ 'Responda SÓ com JSON: {"route":"maestro"} ou {"route":"agent:<area>"}.';
39
+
40
+ let passTrivial = 0;
41
+ let failTrivial = 0;
42
+ let passRoute = 0;
43
+ let failRoute = 0;
44
+ const failures = [];
45
+
46
+ for (const item of dataset) {
47
+ const expectTrivial = item.expected === 'trivial';
48
+ const got = isTrivial(item.prompt);
49
+ if (got === expectTrivial) {
50
+ passTrivial++;
51
+ } else {
52
+ failTrivial++;
53
+ failures.push(`[isTrivial] ${item.id}: esperado ${expectTrivial}, veio ${got} — "${item.prompt}"`);
54
+ }
55
+
56
+ if (useLlm && !expectTrivial) {
57
+ try {
58
+ const raw = execFileSync(
59
+ 'claude',
60
+ ['-p', '--model', model, '--output-format', 'text', `${DISPATCH_RULE}\n\nPedido: ${item.prompt}`],
61
+ { encoding: 'utf8', timeout: 120_000 },
62
+ );
63
+ const match = raw.match(/\{[^}]*"route"[^}]*\}/);
64
+ const route = match ? JSON.parse(match[0]).route : null;
65
+ if (route === item.expected) {
66
+ passRoute++;
67
+ } else {
68
+ failRoute++;
69
+ failures.push(`[route] ${item.id}: esperado ${item.expected}, veio ${route} — "${item.prompt}"`);
70
+ }
71
+ } catch (error) {
72
+ failRoute++;
73
+ failures.push(`[route] ${item.id}: erro ao rodar claude -p (${error.message.split('\n')[0]})`);
74
+ }
75
+ }
76
+ }
77
+
78
+ console.log(`isTrivial: ${passTrivial}/${passTrivial + failTrivial} corretos`);
79
+ if (useLlm) {
80
+ const total = passRoute + failRoute;
81
+ console.log(`rota LLM (${model}): ${passRoute}/${total} corretos (${total ? Math.round((100 * passRoute) / total) : 0}%)`);
82
+ }
83
+ if (failures.length > 0) {
84
+ console.log('\nFalhas:');
85
+ for (const f of failures) console.log(` ✗ ${f}`);
86
+ }
87
+
88
+ // Gate: o determinístico é obrigatório; a rota LLM é informativa (meta ≥ 90%).
89
+ process.exitCode = failTrivial > 0 ? 1 : 0;
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.4.0",
4
+ "version": "1.4.1",
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",
@@ -42,10 +42,12 @@
42
42
  "prepare": "command -v husky >/dev/null 2>&1 && husky || exit 0",
43
43
  "quality": "npm run format:check && npm run lint && npm run lint:md && npm run docs:build && npm run test:install && npm run test:urls && npm run validate:refs && npm run validate:skills && npm run docs:validate-sidebar",
44
44
  "rebundle": "node tools/installer/bundlers/bundle-web.js rebundle",
45
- "test": "npm run test:refs && npm run test:install && npm run test:urls && npm run test:channels && npm run test:mcp && npm run test:cli && npm run test:deps && npm run lint && npm run lint:md && npm run format:check",
45
+ "sync:global": "node tools/sync-global.mjs",
46
+ "test": "npm run test:refs && npm run test:install && npm run test:urls && npm run test:channels && npm run test:mcp && npm run test:cli && npm run test:deps && npm run test:hooks && npm run lint && npm run lint:md && npm run format:check",
46
47
  "test:channels": "node test/test-installer-channels.js",
47
48
  "test:cli": "node test/test-cli-config.js",
48
49
  "test:deps": "node test/test-deps-cache.js",
50
+ "test:hooks": "node test/test-router-hook.js",
49
51
  "test:install": "node test/test-installation-components.js",
50
52
  "test:mcp": "node test/test-mcp-config.js",
51
53
  "test:refs": "node test/test-file-refs-csv.js",
@@ -71,6 +73,12 @@
71
73
  "markdownlint-cli2"
72
74
  ]
73
75
  },
76
+ "overrides": {
77
+ "markdownlint-cli2": {
78
+ "js-yaml": "^4.3.0",
79
+ "markdown-it": "^14.2.0"
80
+ }
81
+ },
74
82
  "dependencies": {
75
83
  "@clack/core": "^1.3.1",
76
84
  "@clack/prompts": "^1.4.0",
@@ -80,7 +88,7 @@
80
88
  "csv-parse": "^6.1.0",
81
89
  "glob": "^11.0.3",
82
90
  "ignore": "^7.0.5",
83
- "js-yaml": "^4.1.0",
91
+ "js-yaml": "^4.3.0",
84
92
  "picocolors": "^1.1.1",
85
93
  "semver": "^7.6.3",
86
94
  "xml2js": "^0.6.2",
@@ -61,43 +61,71 @@ areas:
61
61
  designer:
62
62
  agent: wizz-designer
63
63
  summary: "Design de produto e UI: interfaces, landing pages, design systems, motion, 3D."
64
+ # 3 PORTAS DE ENTRADA (2026-07, consolidação leve): o agente OFERECE/INVOCA
65
+ # apenas as skills com `entry: true`. As demais são puxadas PELA porta da sua
66
+ # camada (campo `door`) ou por pedido explícito do usuário — nunca oferecidas
67
+ # soltas. Nada foi fundido: todos os arquivos e references continuam intactos.
64
68
  skills:
69
+ # ── Porta 1: DIREÇÃO (decidir antes de construir) ──
70
+ - id: decision-maker
71
+ entry: true
72
+ door: direcao
73
+ when: "PORTA de direção: todo trabalho de decidir ANTES de construir. Brief visual inicial (6 decisões de estética + 3 lógicas) no kickoff. Puxa: taste-skill (direção anti-slop de brief novo) e motion-3d-director (decidir caminho motion/3D/vídeo)."
74
+ - id: taste-skill
75
+ door: direcao
76
+ when: "Anti-slop em briefs NOVOS: lê o brief, define a direção e audita contra defaults de AI."
77
+ - id: motion-3d-director
78
+ door: direcao
79
+ when: "Direção de motion/animação, 3D, WebGL, scroll cinematográfico, image-to-video. Decide o caminho ANTES de implementar."
80
+
81
+ # ── Porta 2: CONSTRUÇÃO E POLISH DE UI ──
65
82
  - id: ui-ux-pro-max
66
- when: "Design system, paleta, tipografia, componente; pedido de UI amplo. Principal de busca de padrões/estilos."
67
- - id: impeccable
68
- when: "Gate de polish/qualidade de frontend: hardening de UI, acessibilidade, anti-padrões. Refina o que existe."
69
- - id: huashu-design
70
- when: "Direção visual + protótipo HTML hi-fi, exploração de variantes, review 5-dim, export MP4/GIF."
83
+ entry: true
84
+ door: construcao
85
+ when: "PORTA de construção: criar/melhorar UI (design system, paleta, tipografia, componente, página). Puxa: premium-landing-ui-researcher (landing premium greenfield), ui-component-curator (1 componente em projeto existente), impeccable (gate de polish/acessibilidade), taste-redesign (anti-slop em código existente), huashu-design (protótipo HTML hi-fi/variantes/review) e react-components (Stitch→React)."
71
86
  - id: premium-landing-ui-researcher
87
+ door: construcao
72
88
  when: "Projeto NOVO (greenfield): cria landing premium do zero, hero, 3D high-end. Estratégia source-first."
73
89
  - id: ui-component-curator
90
+ door: construcao
74
91
  when: "Projeto EXISTENTE: qual componente/efeito adicionar que combina com o estilo atual."
75
- - id: motion-3d-director
76
- when: "Direção de motion/animação, 3D, WebGL, scroll cinematográfico, image-to-video."
77
- - id: remotion-best-practices
78
- when: "Vídeo programático em React (Remotion) especificamente."
92
+ - id: impeccable
93
+ door: construcao
94
+ when: "Gate de polish/qualidade de frontend: hardening de UI, acessibilidade, anti-padrões. Refina o que já existe."
95
+ - id: taste-redesign
96
+ door: construcao
97
+ when: "Anti-slop em projeto EXISTENTE: audita o código atual, lista problemas, prioriza fixes."
98
+ - id: huashu-design
99
+ door: construcao
100
+ when: "Direção visual + protótipo HTML hi-fi, exploração de variantes, review 5-dim, export MP4/GIF."
101
+ - id: react-components
102
+ door: construcao
103
+ when: "Converter design (Stitch MCP) em componentes React/Vite."
104
+
105
+ # ── Porta 3: MOTION E ASSETS (executar animação e gerar mídia) ──
79
106
  - id: animate
80
- when: "Craft de animação/micro-interação: regras do Emil Kowalski (saída > entrada, só transform/opacity, respeitar reduced-motion). Complementa o motion-3d-director com a execução fina. Traz references + exemplos .tsx."
107
+ entry: true
108
+ door: motion
109
+ when: "PORTA de motion/assets: executar animação e gerar mídia. Craft de micro-interação (regras do Emil Kowalski: saída > entrada, só transform/opacity, reduced-motion). Puxa: design-motion-principles (auditar animação existente), remotion-best-practices (vídeo em React), canvas-design (PNG/PDF por código) e algorithmic-art (visual generativo)."
81
110
  - id: design-motion-principles
111
+ door: motion
82
112
  when: "Auditor de movimento: revisa animação existente e aponta scale(0) no início, easing cru, reduced-motion faltando; pesa contenção/polimento/diversão pelo contexto."
113
+ - id: remotion-best-practices
114
+ door: motion
115
+ when: "Vídeo programático em React (Remotion) especificamente."
83
116
  - id: canvas-design
117
+ door: motion
84
118
  when: "Gerar PNG/PDF editável por código (carrossel, quote card, infográfico) com fonte/cor/logo sempre certos. Traz canvas-fonts."
85
119
  - id: algorithmic-art
120
+ door: motion
86
121
  when: "Visual generativo por código (flow fields, ruído, partículas) para fundo/textura de hero, único a cada render, sem cara de banco de imagem."
87
- - id: taste-skill
88
- when: "Anti-slop em briefs NOVOS: lê o brief, define a direção e audita contra defaults de AI."
89
- - id: taste-redesign
90
- when: "Anti-slop em projeto EXISTENTE: audita o código atual, lista problemas, prioriza fixes."
91
- - id: react-components
92
- when: "Converter design (Stitch MCP) em componentes React/Vite."
93
- - id: decision-maker
94
- when: "Brief visual inicial: força 6 decisões de estética + 3 lógicas. Entra no kickoff, antes de construir."
95
122
  mcps:
96
123
  - id: magic
97
124
  when: "Gerar/refinar componentes prontos via 21st.dev (UI builder, inspiration, refiner)."
98
125
  server:
99
126
  command: npx
100
- args: ["-y", "@21st-dev/magic"]
127
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
128
+ args: ["-y", "@21st-dev/magic@0.1.0"]
101
129
  env:
102
130
  API_KEY: "${MAGIC_API_KEY}"
103
131
  clis:
@@ -113,11 +141,13 @@ areas:
113
141
  when: "EDITAR vídeo por IA: cortes, selects, cenas, roughcut via XML/FFmpeg. Sugerir quando o pedido for editar/cortar vídeo. Clone-and-run no PROJETO (não é skill add), pesado: Ruby + Python + FFmpeg + WhisperX. AVISOS: ~GB de modelos (WhisperX), build demorado, só Apple Silicon."
114
142
  platform: darwin-arm64
115
143
  check: "test -d ./buttercut"
116
- install: "git clone https://github.com/barefootford/buttercut.git"
144
+ # Pin de supply chain (2026-07-06): checkout de SHA fixo; atualizar conscientemente.
145
+ install: "git clone https://github.com/barefootford/buttercut.git buttercut && git -C buttercut checkout 1383f964ebc8b43c4af17f70b3ec6f611b18b3ce"
117
146
  - id: voicebox
118
147
  when: "Voz/TTS/clonagem de voz local para narração/VO de vídeo (7 engines TTS + Whisper STT). App desktop que expõe endpoint MCP local em runtime. Clone-and-run no projeto."
119
148
  check: "test -d ./voicebox"
120
- install: "git clone https://github.com/jamiepine/voicebox.git"
149
+ # Pin de supply chain (2026-07-06): checkout de SHA fixo; atualizar conscientemente.
150
+ install: "git clone https://github.com/jamiepine/voicebox.git voicebox && git -C voicebox checkout f2cf2a729d733acd7c759d85c6ace2d602f50d6e"
121
151
  references:
122
152
  - "references/premium-agency-rules.md (regras $150k-tier, importadas por impeccable/huashu no modo high-end)"
123
153
 
@@ -212,7 +242,8 @@ areas:
212
242
  # before writing; if verify fails the server is skipped, not written.
213
243
  setup:
214
244
  bin: scrapling
215
- install: 'uv tool install "scrapling[ai]" || pipx install "scrapling[ai]" || pip install --user "scrapling[ai]"'
245
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
246
+ install: 'uv tool install "scrapling[ai]==0.4.10" || pipx install "scrapling[ai]==0.4.10" || pip install --user "scrapling[ai]==0.4.10"'
216
247
  post_install: "{bin} install"
217
248
  verify: "{bin} --version"
218
249
 
@@ -253,14 +284,16 @@ areas:
253
284
  when: "Gestão real de campanha Meta/Facebook/Instagram via API (criar/editar/medir ads)."
254
285
  server:
255
286
  command: npx
256
- args: ["-y", "mcp-meta-ads"]
287
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
288
+ args: ["-y", "mcp-meta-ads@1.0.0"]
257
289
  env:
258
290
  META_ACCESS_TOKEN: "${META_ACCESS_TOKEN}"
259
291
  clis:
260
292
  - id: arcads
261
293
  when: "GERAR vídeo-ad e imagem por IA (Seedance/Sora/Veo/Kling/OmniHuman + Nano Banana) e publicar como Meta ad. Clone-and-run no projeto: git clone + ./scripts/setup.sh; precisa Python 3.10+ e ARCADS API key em .env (META_ACCESS_TOKEN opcional p/ publicar)."
262
294
  check: "test -d ./arcads-claude-code"
263
- install: "git clone https://github.com/krusemediallc/arcads-claude-code.git"
295
+ # Pin de supply chain (2026-07-06): checkout de SHA fixo; atualizar conscientemente.
296
+ install: "git clone https://github.com/krusemediallc/arcads-claude-code.git arcads-claude-code && git -C arcads-claude-code checkout 0b0d3610bbdcfcc2607c77a748d6abb341adda46"
264
297
 
265
298
  architect:
266
299
  agent: wizz-agent-architect
@@ -291,7 +324,8 @@ areas:
291
324
  when: "Operar Supabase de verdade: rodar SQL, migrations, inspecionar schema/RLS, logs."
292
325
  server:
293
326
  command: npx
294
- args: ["-y", "@supabase/mcp-server-supabase@latest"]
327
+ # Pin de supply chain (2026-07-06): versão fixa (era @latest); atualizar conscientemente.
328
+ args: ["-y", "@supabase/mcp-server-supabase@0.8.2"]
295
329
  env:
296
330
  SUPABASE_ACCESS_TOKEN: "${SUPABASE_ACCESS_TOKEN}"
297
331
 
@@ -309,7 +343,8 @@ areas:
309
343
  - id: agent-browser
310
344
  when: "Dirigir um browser real pra E2E/verificação: navegar, clicar, preencher form, screenshot, console. É CLI, não MCP."
311
345
  check: "agent-browser --version"
312
- install: "npm install -g agent-browser"
346
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
347
+ install: "npm install -g agent-browser@0.27.0"
313
348
 
314
349
  analyst:
315
350
  agent: wizz-agent-analyst
@@ -324,7 +359,8 @@ areas:
324
359
  when: "Pesquisa web/prior-art durante planejamento (web search, descoberta de fontes)."
325
360
  server:
326
361
  command: npx
327
- args: ["-y", "exa-mcp-server"]
362
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
363
+ args: ["-y", "exa-mcp-server@3.2.1"]
328
364
  env:
329
365
  EXA_API_KEY: "${EXA_API_KEY}"
330
366
 
@@ -356,7 +392,8 @@ mcp_utility:
356
392
  when: "Docs atualizadas de qualquer lib/framework/SDK (React, Next, Prisma, Tailwind...). Útil em todo dev."
357
393
  server:
358
394
  command: npx
359
- args: ["-y", "@upstash/context7-mcp"]
395
+ # Pin de supply chain (2026-07-06): versão fixa; atualizar conscientemente.
396
+ args: ["-y", "@upstash/context7-mcp@3.2.2"]
360
397
 
361
398
  # ─────────────────────────────────────────────────────────────────────────────
362
399
  # CLIs — ferramentas de linha de comando que os agentes chamam direto (não são
@@ -20,7 +20,7 @@ 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 em `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml`). Ache o bloco `areas.ads` e 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` ( 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` 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).
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`
@@ -20,7 +20,7 @@ Você é o Copy do Wizz. Escreve textos que vendem, humaniza o que soa robótico
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 (`copy`) vive no `skills-registry.yaml` (resolva em `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml`). Ache o bloco `areas.copy` e 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 o que for adicionado depois.
23
+ > **Fonte única (registry) — leia SEMPRE antes dos exemplos abaixo:** a lista real da sua área (`copy`) vive no `skills-registry.yaml`. Resolva primeiro a **fatia leve da sua área**, `{project-root}/_wizz/_config/registry/copy.yaml` ( vem como o bloco `areas.copy` 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.copy` 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 o que for adicionado depois.
24
24
  - Copy de página, headline, proposta de valor → `copywriting`
25
25
  - E-mail, sequência, nurture → `email-sequence`
26
26
  - Deixar texto natural, remover cara de IA → `humanizer`