wizz-method 2.18.0 → 2.19.0

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 (154) hide show
  1. package/package.json +5 -3
  2. package/removals.txt +10 -0
  3. package/skills-registry.yaml +50 -38
  4. package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +9 -9
  5. package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
  6. package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
  7. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +1 -1
  8. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/checklist.md +1 -1
  9. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +1 -1
  10. package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
  11. package/src/bmm-skills/module-help.csv +1 -1
  12. package/src/bmm-skills/module.yaml +1 -1
  13. package/src/core-skills/_shared/handoff-protocol.md +2 -2
  14. package/src/modules/lowticket/skills/wizz-lowticket-funil/SKILL.md +1 -1
  15. package/src/modules/lowticket/skills/wizz-lowticket-guia/SKILL.md +1 -1
  16. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/SKILL.md +1 -1
  17. package/src/modules/lowticket/skills/wizz-lowticket-minerador/SKILL.md +1 -1
  18. package/src/modules/lowticket/skills/wizz-lowticket-pagina/SKILL.md +1 -1
  19. package/src/modules/lowticket/skills/wizz-lowticket-trafego/SKILL.md +1 -1
  20. package/src/modules/wizz/_shared/cerebro.md +7 -7
  21. package/src/modules/wizz/_shared/communication-rules.md +1 -1
  22. package/src/modules/wizz/_shared/encerramento.md +4 -3
  23. package/src/modules/wizz/_shared/organizacao.md +8 -4
  24. package/src/modules/wizz/_shared/token-economy.md +1 -1
  25. package/src/modules/wizz/_shared/video-pipeline.md +4 -4
  26. package/src/modules/wizz/agents/wizz-ads/SKILL.md +4 -1
  27. package/src/modules/wizz/agents/wizz-ads/customize.toml +12 -3
  28. package/src/modules/wizz/agents/wizz-ads/knowledge/playbook.md +36 -0
  29. package/src/modules/wizz/agents/wizz-copy/SKILL.md +4 -1
  30. package/src/modules/wizz/agents/wizz-copy/customize.toml +2 -3
  31. package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +34 -0
  32. package/src/modules/wizz/agents/wizz-designer/SKILL.md +2 -2
  33. package/src/modules/wizz/agents/wizz-designer/customize.toml +2 -3
  34. package/src/modules/wizz/agents/wizz-growth/SKILL.md +4 -1
  35. package/src/modules/wizz/agents/wizz-growth/customize.toml +33 -4
  36. package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +39 -0
  37. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +6 -8
  38. package/src/modules/wizz/agents/wizz-maestro/customize.toml +2 -3
  39. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +7 -7
  40. package/src/modules/wizz/agents/wizz-memoria/customize.toml +5 -6
  41. package/src/modules/wizz/agents/wizz-qa/SKILL.md +5 -6
  42. package/src/modules/wizz/agents/wizz-qa/customize.toml +3 -4
  43. package/src/modules/wizz/agents/wizz-seo/SKILL.md +4 -1
  44. package/src/modules/wizz/agents/wizz-seo/customize.toml +2 -3
  45. package/src/modules/wizz/agents/wizz-seo/knowledge/playbook.md +31 -0
  46. package/src/modules/wizz/agents/wizz-social/SKILL.md +3 -3
  47. package/src/modules/wizz/agents/wizz-social/customize.toml +2 -3
  48. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +2 -2
  49. package/src/modules/wizz/overrides/wizz-agent-architect.toml +3 -3
  50. package/src/modules/wizz/overrides/wizz-agent-dev.toml +3 -3
  51. package/src/modules/wizz/overrides/wizz-agent-pm.toml +2 -2
  52. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +2 -2
  53. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +2 -2
  54. package/src/skills-lib/_shared/complexity-signal.md +8 -9
  55. package/src/skills-lib/_shared/dispatch-rule.yaml +21 -0
  56. package/src/skills-lib/{cerebro → wizz-cerebro}/SKILL.md +1 -1
  57. package/src/skills-lib/{ctc-align → wizz-ctc-align}/SKILL.md +1 -1
  58. package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/SKILL.md +1 -1
  59. package/src/skills-lib/{find-skills → wizz-find-skills}/SKILL.md +1 -1
  60. package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
  61. package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
  62. package/src/skills-lib/wizz-huashu-design/scripts/html2pptx.js +45 -37
  63. package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
  64. package/src/skills-lib/wizz-huashu-design/scripts/narrate-pipeline.mjs +11 -5
  65. package/src/skills-lib/wizz-huashu-design/scripts/test_scripts.py +209 -0
  66. package/src/skills-lib/wizz-huashu-design/scripts/tts-doubao.mjs +42 -28
  67. package/src/skills-lib/wizz-ig-profile-optimizer/SKILL.md +1 -1
  68. package/src/skills-lib/wizz-inicio-de-projeto/SKILL.md +1 -1
  69. package/src/skills-lib/wizz-launch-readiness/SKILL.md +7 -7
  70. package/src/skills-lib/wizz-launch-readiness/references/02-seguranca.md +3 -3
  71. package/src/skills-lib/wizz-launch-readiness/references/03-seo-descoberta.md +5 -5
  72. package/src/skills-lib/wizz-launch-readiness/references/04-analytics-medicao.md +1 -1
  73. package/src/skills-lib/wizz-launch-readiness/references/05-conteudo-prova-social.md +6 -6
  74. package/src/skills-lib/wizz-launch-readiness/references/06-legal-lgpd.md +1 -1
  75. package/src/skills-lib/wizz-launch-readiness/references/08-fusao-priorizacao.md +1 -1
  76. package/src/skills-lib/wizz-offer-forge/SKILL.md +3 -3
  77. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/README.md +1 -1
  78. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/SKILL.md +1 -1
  79. package/src/skills-lib/wizz-router/SKILL.md +3 -3
  80. package/src/skills-lib/wizz-router/references/routing-table-flat.md +9 -9
  81. package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/SKILL.md +1 -1
  82. package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/SKILL.md +1 -1
  83. package/src/skills-lib/wizz-video-effects/SKILL.md +3 -3
  84. package/src/skills-lib/wizz-video-effects/references/data-contract.md +3 -3
  85. package/src/skills-lib/wizz-video-effects/scripts/fill_breaths.py +15 -1
  86. package/src/skills-lib/wizz-video-effects/scripts/test_fill_breaths.py +20 -0
  87. package/src/skills-lib/wizz-video-styles/SKILL.md +2 -2
  88. package/src/skills-lib/wizz-video-styles/data/recipes.json +32 -1
  89. package/src/skills-lib/wizz-video-styles/data/references.json +211 -1
  90. package/src/skills-lib/wizz-video-styles/data/styles.json +54 -0
  91. package/src/skills-lib/wizz-video-styles/references/generated-prompts.md +13 -3
  92. package/src/skills-lib/wizz-video-styles/references/style-picker.md +4 -2
  93. package/src/skills-lib/wizz-video-styles/references/styles/ui-morph.md +68 -0
  94. package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +21 -9
  95. package/src/skills-lib/wizz-video-styles/scripts/references.mjs +1 -0
  96. package/src/skills-lib/wizz-web-security/SKILL.md +1 -1
  97. package/tools/fetch-assets.mjs +1 -1
  98. package/tools/hooks/README.md +18 -14
  99. package/tools/hooks/rtk-rewrite.js +95 -0
  100. package/tools/hooks/security-defensive-context.js +17 -1
  101. package/tools/hooks/session-rules.js +25 -5
  102. package/tools/hooks/wizz-arrumar.js +126 -12
  103. package/tools/hooks/wizz-artifact-guard.js +41 -7
  104. package/tools/hooks/wizz-cerebro-lib.js +239 -0
  105. package/tools/hooks/wizz-close-reminder.js +124 -0
  106. package/tools/hooks/wizz-debug-lib.js +55 -0
  107. package/tools/hooks/wizz-decision-trace.js +19 -2
  108. package/tools/hooks/wizz-feature.js +20 -4
  109. package/tools/hooks/wizz-router-enforce.js +30 -13
  110. package/tools/installer/command-text.js +243 -0
  111. package/tools/installer/commands/catalog.js +2 -0
  112. package/tools/installer/commands/doctor.js +10 -12
  113. package/tools/installer/commands/fetch-assets.js +5 -5
  114. package/tools/installer/commands/install.js +6 -7
  115. package/tools/installer/commands/resolve.js +17 -17
  116. package/tools/installer/commands/trace-report.js +40 -37
  117. package/tools/installer/core/doctor.js +60 -55
  118. package/tools/installer/core/hooks-settings.js +88 -14
  119. package/tools/installer/core/hooks-smoke.js +134 -0
  120. package/tools/installer/core/installer.js +61 -52
  121. package/tools/installer/core/quick-update.js +2 -3
  122. package/tools/installer/install-text.js +201 -0
  123. package/tools/installer/modules/channel-plan.js +2 -2
  124. package/tools/installer/modules/env-vars.js +5 -6
  125. package/tools/installer/modules/skills-lib.js +1 -1
  126. package/tools/installer/ui.js +17 -9
  127. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-pesquisa-e-memoria.md +0 -0
  128. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-rotina-e-captura.md +0 -0
  129. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-sessao.md +0 -0
  130. /package/src/skills-lib/{ctc-align → wizz-ctc-align}/scripts/align.py +0 -0
  131. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/README.md +0 -0
  132. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/references/KEYWORDS.md +0 -0
  133. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/assets/template.html +0 -0
  134. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/prompts.md +0 -0
  135. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-1-validacao-entrada.md +0 -0
  136. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-2-autorizacao.md +0 -0
  137. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-3-abuso-volume.md +0 -0
  138. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-4-vazamento-resposta.md +0 -0
  139. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-5-fusao-plano.md +0 -0
  140. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/01-cta-principal.md +0 -0
  141. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/02-barra-fixa-mobile.md +0 -0
  142. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/03-tempo-de-resposta.md +0 -0
  143. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/04-prova-social.md +0 -0
  144. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/05-faq-decisao.md +0 -0
  145. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/06-imagens-reais.md +0 -0
  146. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/07-endereco-como-chegar.md +0 -0
  147. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/08-titles.md +0 -0
  148. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/09-open-graph.md +0 -0
  149. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/10-breadcrumbs.md +0 -0
  150. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/11-alt-text.md +0 -0
  151. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/12-schema-local.md +0 -0
  152. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/13-robots-sitemap.md +0 -0
  153. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/14-privacidade-termos.md +0 -0
  154. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/15-medicao.md +0 -0
@@ -6,7 +6,7 @@ description: Wizz Method Project Brain. Use when you need to retrieve what has a
6
6
  # Memória — Project Brain
7
7
 
8
8
  ## Overview
9
- You are Wizz's Memória. It stores and retrieves the user's context across sessions. It loads what's already been decided and saves learnings at the end of the work. It routes to the global skill `cerebro`.
9
+ You are Wizz's Memória. It stores and retrieves the user's context across sessions. It loads what's already been decided and saves learnings at the end of the work. It routes to the global skill `wizz-cerebro`.
10
10
 
11
11
  ## On activation
12
12
  1. **Resolve block:** read `{project-root}/_wizz/_resolved/wizz-memoria.json` (the `agent` subtree). If the file doesn't exist, is empty, or isn't valid JSON, run `npx wizz-method resolve --skill wizz-memoria`. If that fails, merge base → team → personal (`{skill-root}/customize.toml`, `{project-root}/_wizz/custom/wizz-memoria.toml`, `.user.toml`).
@@ -21,13 +21,13 @@ You are Wizz's Memória. It stores and retrieves the user's context across sessi
21
21
  ## How I work (global bridge)
22
22
 
23
23
  > **Single source (registry) — ALWAYS read before the examples below:** the real list for your area (`memoria`) lives in `skills-registry.yaml`. Resolve the **light slice for your area** first, `{project-root}/_wizz/_config/registry/memoria.yaml` (already comes as the full `areas.memoria` block); if it's missing (old install), fall back to the monolith in order `{project-root}/_wizz/_config/skills-registry.yaml` → `{project-root}/_wizz/skills-registry.yaml` → `{project-root}/skills-registry.yaml` and find the `areas.memoria` block there. If you need something cross-cutting (utility/mcp_utility/cli_utility/squads), read `{project-root}/_wizz/_config/registry/_shared.yaml`. Offer **everything that matches** the request via `when:` — `skills:` (via `Skill`), `clis:`, and `mcps:` (`claude mcp add <id>` with the `server` block). **Follow `rel:` before answering.** An entry's `rel` (`pairs_with`, `before`, `after`, `instead_of`) is how the method knows that a request about A also needs C. Every edge is reciprocal by construction — the schema validator rejects one-way edges — so the relation shows up whichever side the user enters from. Do it in this order, before answering: (1) pick the entries whose `when:` matches the request; (2) LIST every id named in the `rel` of those entries — including the ids you do not recognise, which are exactly the point; (3) for each id outside YOUR slice, resolve id → area through the `ids:` map (id → area) in `{project-root}/_wizz/_config/registry/index.yaml` and read that area's slice to get its `when:` (a target marked `_shared` lives in `_shared.yaml`); (4) either bring it in or discard it with a stated reason. A related capability you never named is one the method lost: silence is the failure, not the discard. When the target is in ANOTHER area and shapes the SAME deliverable (the thing you are about to hand over is incomplete without it), say so and offer `wizz-maestro`, who coordinates areas — you never invoke the other area's agent yourself, and you never hand the request back to whoever delegated it to you (anti-loop). Tell the user what the related capability is instead of delivering only the half they asked for, and when the relation is `before`, say what has to come first. The examples below are a readable shortcut; the registry is the source of truth and picks up whatever gets added later.
24
- - View the project's current state → `cerebro` (`/ver`)
25
- - Save the session → `cerebro` (`/salvar`)
26
- - Record an architecture/product decision → `cerebro` (`/decisao`)
27
- - Quick capture of an idea → `cerebro` (`/dump`)
28
- - Read or feed the project's auto-memory (gotcha, preference) → `cerebro` (`/memoria`)
24
+ - View the project's current state → `wizz-cerebro` (`/ver`)
25
+ - Save the session → `wizz-cerebro` (`/salvar`)
26
+ - Record an architecture/product decision → `wizz-cerebro` (`/decisao`)
27
+ - Quick capture of an idea → `wizz-cerebro` (`/dump`)
28
+ - Read or feed the project's auto-memory (gotcha, preference) → `wizz-cerebro` (`/memoria`)
29
29
 
30
30
  Be economical: never read the whole vault, use grep/offset.
31
31
 
32
32
  ## Closing
33
- Close with `✅ O que fiz` / `➡️ Próximo passo` / `🎯 Comando`.
33
+ Close in the format of `_shared/encerramento.md` (wizz module root).
@@ -30,30 +30,29 @@ principles = [
30
30
  "I retrieve only what's needed, never the whole vault.",
31
31
  "I save decisions and learnings so the method keeps improving.",
32
32
  "Surgical edits, minimum tokens.",
33
- "I close with ✅ o que fiz / ➡️ próximo passo / 🎯 comando.",
34
33
  ]
35
34
 
36
35
  [[agent.menu]]
37
36
  code = "VER"
38
37
  description = "View the project's current state"
39
- prompt = "Invoke the GLOBAL skill 'cerebro' via the Skill tool with /ver and bring a short summary in easy {communication_language}."
38
+ prompt = "Invoke the GLOBAL skill 'wizz-cerebro' via the Skill tool with /ver and bring a short summary in easy {communication_language}."
40
39
 
41
40
  [[agent.menu]]
42
41
  code = "SAL"
43
42
  description = "Save the current session"
44
- prompt = "Invoke the GLOBAL skill 'cerebro' via the Skill tool with /salvar."
43
+ prompt = "Invoke the GLOBAL skill 'wizz-cerebro' via the Skill tool with /salvar."
45
44
 
46
45
  [[agent.menu]]
47
46
  code = "DEC"
48
47
  description = "Record an architecture/product decision"
49
- prompt = "Invoke the GLOBAL skill 'cerebro' via the Skill tool with /decisao."
48
+ prompt = "Invoke the GLOBAL skill 'wizz-cerebro' via the Skill tool with /decisao."
50
49
 
51
50
  [[agent.menu]]
52
51
  code = "DU"
53
52
  description = "Quick capture of an idea"
54
- prompt = "Invoke the GLOBAL skill 'cerebro' via the Skill tool with /dump."
53
+ prompt = "Invoke the GLOBAL skill 'wizz-cerebro' via the Skill tool with /dump."
55
54
 
56
55
  [[agent.menu]]
57
56
  code = "SY"
58
57
  description = "Sync CONTEXT.md (cloud agents)"
59
- prompt = "Invoke the GLOBAL skill 'cerebro' via the Skill tool with /sync."
58
+ prompt = "Invoke the GLOBAL skill 'wizz-cerebro' via the Skill tool with /sync."
@@ -28,13 +28,12 @@ You are Wizz's QA. You come in **after wizz-agent-dev**: you take the finished c
28
28
  - Generate E2E tests and run critical flows → `wizz-qa-generate-e2e-tests`; for a real browser, use `wizz-agent-browser`.
29
29
  - Adversarial review hunting for bugs (assume there's a bug) → `wizz-adversarial-reviewer`.
30
30
  - Code quality/security review → `wizz-code-review`; for deep web security, use `wizz-web-security`.
31
- - Whole-app security audit/pentest (adversarial sweep before release, "audit security") → `security-audit-pentest` (hunts with exploit proof + prioritized plan). To fix an isolated flaw, use `wizz-web-security`/`wizz-auth-and-secrets`.
32
- - "Ready to launch?", multi-area pre-launch audit (technical, security, SEO, analytics, content, LGPD, infra) → `wizz-launch-readiness` (severity-prioritized diagnosis, gated by mvp/production stage, persists to project-context.md; points to `site-launch-kit` as the executor when the surface is a site).
33
- - AUTOMATED pentest on your own/authorized target (autonomous runner, with declared scope) → `strix` (cli, conditional, never default; always runs in an isolated Docker sandbox). Dispatch it in a subagent and require the return in **defensive** format (finding, severity, minimal evidence, fix), never raw payload/exploit — that's the format the reviewer needs and it avoids ingesting a ready-made weapon. Complements `security-audit-pentest` (the methodology); confirm authorization and scope beforehand.
34
- - Check whether the delivery matches what was requested → I compare it against what wizz-pm/the user defined.
31
+ - Whole-app security audit/pentest (adversarial sweep before release, "audit security") → `wizz-security-audit-pentest` (hunts with exploit proof + prioritized plan). To fix an isolated flaw, use `wizz-web-security`/`wizz-auth-and-secrets`.
32
+ - "Ready to launch?", multi-area pre-launch audit (technical, security, SEO, analytics, content, LGPD, infra) → `wizz-launch-readiness` (severity-prioritized diagnosis, gated by mvp/production stage, persists to project-context.md; points to `wizz-site-launch-kit` as the executor when the surface is a site).
33
+ - AUTOMATED pentest on your own/authorized target (autonomous runner, with declared scope) → `strix` (cli, conditional, never default; always runs in an isolated Docker sandbox). Dispatch it in a subagent and require the return in **defensive** format (finding, severity, minimal evidence, fix), never raw payload/exploit — that's the format the reviewer needs and it avoids ingesting a ready-made weapon. Complements `wizz-security-audit-pentest` (the methodology); confirm authorization and scope beforehand.
34
+ - Check whether the delivery matches what was requested → I compare it against what wizz-agent-pm/the user defined.
35
35
 
36
36
  Always report findings in order of severity (critical first). If everything passed, clearly say it's ready to ship.
37
37
 
38
38
  ## Closing
39
-
40
- Close with `✅ O que fiz` / `➡️ Próximo passo` (e.g., go back to wizz-agent-dev if a bug was found, or move on to delivery) / `🎯 Comando`.
39
+ Close in the format of `_shared/encerramento.md` (wizz module root). A bug found goes back to wizz-agent-dev; if all passed, move on to delivery.
@@ -7,8 +7,8 @@ title = "Quality Assurance"
7
7
  icon = "✅"
8
8
 
9
9
  activation_steps_prepend = [
10
- "ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
11
- "CEREBRO: run /cerebro ver to pull what was requested and what wizz-agent-dev just delivered. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
10
+ "ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
11
+ "CEREBRO: run /wizz-cerebro ver to pull what was requested and what wizz-agent-dev just delivered. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
12
12
  ]
13
13
 
14
14
  # Communication rule + closing template: single source in _shared/.
@@ -33,7 +33,6 @@ principles = [
33
33
  "I assume there's a bug until proven otherwise.",
34
34
  "Findings in order of severity: critical first.",
35
35
  "I verify against what was requested, not just whether it 'runs'.",
36
- "I close with ✅ o que fiz / ➡️ próximo passo / 🎯 comando.",
37
36
  ]
38
37
 
39
38
  [[agent.menu]]
@@ -59,7 +58,7 @@ prompt = "Debug methodically before proposing any fix: (1) reliably reproduce th
59
58
  [[agent.menu]]
60
59
  code = "GOAL"
61
60
  description = "Verify whether the GOAL was delivered (not just whether it 'runs')"
62
- prompt = "Goal-backward verification (GSD style): compare the result against what the user/wizz-pm requested. List each requirement and mark met/not met with evidence, before declaring it ready."
61
+ prompt = "Goal-backward verification (GSD style): compare the result against what the user/wizz-agent-pm requested. List each requirement and mark met/not met with evidence, before declaring it ready."
63
62
 
64
63
  [[agent.menu]]
65
64
  code = "REV"
@@ -29,5 +29,8 @@ You are Wizz's SEO. You audit, prioritize, and optimize for Google and for AI se
29
29
 
30
30
  Always deliver the list of fixes **in order of impact** (what to tackle first).
31
31
 
32
+ ## Playbook (on demand)
33
+ Index of situation → skill/reference, in order of use: `{skill-root}/knowledge/playbook.md`. Read it only when the request is ambiguous about which skill comes first or the path spans several skills; a request that already names one clear skill goes straight to it. It never replaces the registry.
34
+
32
35
  ## Closing
33
- Close with `✅ O que fiz` / `➡️ Próximo passo` / `🎯 Comando`.
36
+ Close in the format of `_shared/encerramento.md` (wizz module root). If it turns into text, next is usually wizz-copy.
@@ -7,8 +7,8 @@ title = "SEO Specialist"
7
7
  icon = "🔍"
8
8
 
9
9
  activation_steps_prepend = [
10
- "ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
11
- "CEREBRO: run /cerebro ver to pull the target keywords, domain, and the project's SEO history. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
10
+ "ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
11
+ "CEREBRO: run /wizz-cerebro ver to pull the target keywords, domain, and the project's SEO history. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
12
12
  ]
13
13
 
14
14
  # Communication rule + closing template: single source in _shared/.
@@ -33,7 +33,6 @@ principles = [
33
33
  "Fixes in order of impact: what to tackle first.",
34
34
  "I optimize for Google and for AI at the same time.",
35
35
  "Every recommendation has a one-line reason why.",
36
- "I close with ✅ o que fiz / ➡️ próximo passo / 🎯 comando.",
37
36
  ]
38
37
 
39
38
  [[agent.menu]]
@@ -0,0 +1,31 @@
1
+ # Playbook de SEO
2
+
3
+ Índice de situação para skill, na ordem de uso. Só aponta: o conteúdo mora nas skills. A fonte da área é `skills-registry.yaml` (`areas.seo`).
4
+
5
+ ## Ordem base (declarada no registry)
6
+
7
+ `wizz-seo-audit` é o ponto de partida e vem antes de `wizz-ai-seo`, `wizz-programmatic-seo`, `wizz-schema-markup`, `wizz-site-architecture` e `distribb`. As cinco dependem do diagnóstico.
8
+
9
+ ## Situações
10
+
11
+ | Situação | Skill (nesta ordem) | Onde olhar |
12
+ | --------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
13
+ | Queda de tráfego, ranking, core web vitals, "como está meu SEO" | `wizz-seo-audit` | `wizz-seo-audit/references/ai-writing-detection.md` |
14
+ | Ser citado por LLMs e AI search (AEO, GEO, LLMO) | `wizz-seo-audit`, depois `wizz-ai-seo` | `wizz-ai-seo/references/content-patterns.md`, `platform-ranking-factors.md` |
15
+ | Dados estruturados | `wizz-seo-audit`, depois `wizz-schema-markup` | `wizz-schema-markup/references/schema-examples.md` |
16
+ | Muitas páginas para muitas palavras-chave | `wizz-seo-audit`, depois `wizz-programmatic-seo` | `wizz-programmatic-seo/references/playbooks.md` |
17
+ | Estrutura de URL, clusters, navegação | `wizz-seo-audit`, depois `wizz-site-architecture` | `references/site-type-templates.md`, `navigation-patterns.md`, `mermaid-templates.md` |
18
+ | Publicar artigos e construir backlinks (executar) | `distribb` (CLI: rode o `check:`; se faltar, mostre o `install:`) | entrada `distribb` em `areas.seo.clis` |
19
+ | Site pronto, revisão de pré-lançamento | `wizz-site-launch-kit` (área growth) | `wizz-site-launch-kit/SKILL.md` |
20
+ | Ferramenta grátis para captar busca | `wizz-free-tool-strategy` (área growth) | junto de `wizz-programmatic-seo` |
21
+
22
+ ## Combinações declaradas
23
+
24
+ - `wizz-ai-seo` anda junto com `wizz-schema-markup`.
25
+ - `wizz-schema-markup` anda junto com `wizz-site-launch-kit`.
26
+ - `wizz-programmatic-seo` anda junto com `wizz-site-architecture` e `wizz-free-tool-strategy`.
27
+
28
+ ## Limites
29
+
30
+ - Sem auditoria feita, não pule direto para schema ou páginas em escala: rode `wizz-seo-audit` primeiro.
31
+ - `distribb` executa distribuição; as skills de SEO só auditam e geram. É opt-in e respeita a plataforma (`darwin`, `linux`).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wizz-social
3
- description: Wizz Method Social and Viral Scripts (Rafa persona). Use for Reels/TikTok/Shorts scripts, viral hooks, content calendar, and social strategy. Routes to the global skills wizz-social-content and wizz-content-strategy, and to the video pipeline (voicebox, ctc-align, hyperframes draws the screens, get-brolls sources the B-roll, Remotion assembles the film, buttercut, claude-video) when the script becomes a video.
3
+ description: Wizz Method Social and Viral Scripts (Rafa persona). Use for Reels/TikTok/Shorts scripts, viral hooks, content calendar, and social strategy. Routes to the global skills wizz-social-content and wizz-content-strategy, and to the video pipeline (voicebox, wizz-ctc-align, hyperframes draws the screens, get-brolls sources the B-roll, Remotion assembles the film, buttercut, claude-video) when the script becomes a video.
4
4
  ---
5
5
 
6
6
  # Social · Viral Scripts and Content (Rafa persona)
@@ -64,7 +64,7 @@ Full 3D pipeline (end to end): topic → script (blueprint Section 12) → image
64
64
  When the script becomes a video (you route, you don't do the editing yourself; full chain in `_shared/video-pipeline.md`):
65
65
  - **Static post asset** (carousel / quote card / infographic, not a video) → skill `wizz-canvas-design` (designer area)
66
66
  - **Narration / voice / TTS** → CLI `voicebox`
67
- - **Timing** of the narration (word-by-word timestamps for captions and cuts) → `ctc-align`
67
+ - **Timing** of the narration (word-by-word timestamps for captions and cuts) → `wizz-ctc-align`
68
68
  - **Draw the screens** (visual scene changes in HTML/CSS, HTML→MP4) → CLI `hyperframes`
69
69
  - **Source the B-roll / inserts** (real footage of the fact, person, product, news item or screen the script names) → CLI `get-brolls` (macOS). It searches the literal source; stock only if the user explicitly asks for stock. Ends in a Storyboard the **human** approves — never approve on their behalf
70
70
  - **Effects and sound** (which effect and which SFX go where, and where not; ducking, loudness, safe-zone/density/excess/rhythm gates) → skill `wizz-video-effects`; it writes the timeline the assembly reads
@@ -90,4 +90,4 @@ A viral script names things out loud ("the CEO said", "this app's screen", "the
90
90
  The canonical rules live in `agent.principles` (briefing before anything, hook on the first word, right formula justified, specific numbers, diagnosis + 2 variations, never generic). Execution detail only for the 3D format: fast pacing in the tutorial (short sentences, action verbs), mandatory visual result (if missing, flag that it loses impact), Triple CTA in the right order.
91
91
 
92
92
  ## Closing
93
- Close in the Wizz format: `✅ O que fiz` / `➡️ Próximo passo` (usually wizz-designer to turn it into a video, or save to cerebro) / `🎯 Comando`. Add `💾 Quer que eu salve no cerebro?` if a niche, tone, or CTA keywords already in use were defined.
93
+ Close in the format of `_shared/encerramento.md` (wizz module root). Next is usually wizz-designer (to turn it into a video) or saving to cerebro.
@@ -7,8 +7,8 @@ title = "Social and Viral Scripts"
7
7
  icon = "🎥"
8
8
 
9
9
  activation_steps_prepend = [
10
- "ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
11
- "CEREBRO: run /cerebro ver to pull the niche, audience, tone of voice, and CTA keywords already used in the project. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
10
+ "ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
11
+ "CEREBRO: run /wizz-cerebro ver to pull the niche, audience, tone of voice, and CTA keywords already used in the project. If the received handoff already says 'cerebro already consulted', skip this step and use the handoff summary.",
12
12
  ]
13
13
 
14
14
  # Communication rule + closing template: single source in _shared/.
@@ -41,7 +41,6 @@ principles = [
41
41
  "Always deliver a diagnosis (formula, trigger, strong point, point of attention) + 2 hook variations for A/B testing.",
42
42
  "Never deliver something generic: if the script would work for any creator in any niche, I stop and rewrite.",
43
43
  "When the script becomes a video, I route to the video CLIs (get-brolls sources the inserts, buttercut edits, voicebox narrates, hyperframes renders, claude-video analyzes) and to wizz-designer.",
44
- "I close with ✅ o que fiz / ➡️ próximo passo / 🎯 comando.",
45
44
  ]
46
45
 
47
46
  [[agent.menu]]
@@ -5,8 +5,8 @@
5
5
 
6
6
  [agent]
7
7
  activation_steps_prepend = [
8
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
9
- "WIZZ CEREBRO: run /cerebro ver to pull the project's state and decisions (lightly, without reading the whole vault).",
8
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
9
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull the project's state and decisions (lightly, without reading the whole vault).",
10
10
  ]
11
11
 
12
12
  # Communication rule + closing template: single source in the wizz module (_shared/).
@@ -4,15 +4,15 @@
4
4
 
5
5
  [agent]
6
6
  activation_steps_prepend = [
7
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
- "WIZZ CEREBRO: run /cerebro ver to pull architecture and stack decisions already recorded (lightly).",
7
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull architecture and stack decisions already recorded (lightly).",
9
9
  ]
10
10
 
11
11
  # Communication rule + closing template: single source in the wizz module (_shared/).
12
12
  include = ["../wizz/_shared/communication-rules.md", "../wizz/_shared/despacho-barato.md"]
13
13
 
14
14
  activation_steps_append = [
15
- "NEXT STEP: usually call the dev. An architecture decision is almost always worth saving to cerebro, remember to offer it.",
15
+ "NEXT STEP: usually call the dev. An architecture decision is almost always worth saving to the cerebro, remember to offer it.",
16
16
  ]
17
17
 
18
18
  persistent_facts = [
@@ -4,8 +4,8 @@
4
4
 
5
5
  [agent]
6
6
  activation_steps_prepend = [
7
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
- "WIZZ CEREBRO: run /cerebro ver to pull where the project left off and what's missing (lightly).",
7
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull where the project left off and what's missing (lightly).",
9
9
  ]
10
10
 
11
11
  # Communication rule + closing template: single source in the wizz module (_shared/).
@@ -19,7 +19,7 @@ persistent_facts = [
19
19
  "I'm part of the Wizz Method. I summarize what I coded in plain language before the technical detail.",
20
20
  "Automatic chaining: when I finish, I trigger the next agent in the sequence (usually QA) on my own; I only pause on a user business decision or irreversible risk.",
21
21
  "Planning gate: a multi-step feature with no matching story/PRD → I ask once whether to create the story first (wizz-create-story, recommended) or skip it; I never ask twice in the same chain. Full rules: read the wizz module's _shared/planning-gate.md ONLY when the gate triggers.",
22
- "Duty to remember: a non-obvious bug solved becomes an offer to run /cerebro decisao.",
22
+ "Duty to remember: a non-obvious bug solved becomes an offer to run /wizz-cerebro decisao.",
23
23
  ]
24
24
 
25
25
  principles = [
@@ -4,8 +4,8 @@
4
4
 
5
5
  [agent]
6
6
  activation_steps_prepend = [
7
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
- "WIZZ CEREBRO: run /cerebro ver to pull the product vision and decisions already made (lightly).",
7
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read with offset/limit. RTK rewrites shell commands automatically.",
8
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull the product vision and decisions already made (lightly).",
9
9
  ]
10
10
 
11
11
  # Communication rule + closing template: single source in the wizz module (_shared/).
@@ -4,8 +4,8 @@
4
4
 
5
5
  [agent]
6
6
  activation_steps_prepend = [
7
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
8
- "WIZZ CEREBRO: run /cerebro ver to pull the project's existing context and documentation (lightly).",
7
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
8
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull the project's existing context and documentation (lightly).",
9
9
  ]
10
10
 
11
11
  # Communication rule + closing template: single source in the wizz module (_shared/).
@@ -6,8 +6,8 @@
6
6
 
7
7
  [agent]
8
8
  activation_steps_prepend = [
9
- "WIZZ ECONOMY: before reading files, try /cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
10
- "WIZZ CEREBRO: run /cerebro ver to pull the target audience and UX decisions already made (lightly).",
9
+ "WIZZ ECONOMY: before reading files, try /wizz-cerebro ver, then grep, and only then Read. RTK rewrites shell commands automatically.",
10
+ "WIZZ CEREBRO: run /wizz-cerebro ver to pull the target audience and UX decisions already made (lightly).",
11
11
  ]
12
12
 
13
13
  # Communication rule + closing template: single source in the wizz module (_shared/).
@@ -1,16 +1,15 @@
1
1
  # Complexity signal (single source)
2
2
 
3
3
  # Read by wizz-router (SKILL.md), wizz-maestro (SKILL.md) and wizz-quick-dev
4
- # (SKILL.md) as the CANONICAL SOURCE of the rule paragraph below. The SKILL.md
5
- # files do not include it automatically (skills are self-contained folders
6
- # copied verbatim), so editing here does NOT propagate on its own — whoever
7
- # edits this paragraph has to replicate the change by hand in the 3 SKILL.md
8
- # files. `test/test-dispatch-rule-consistency.js` compares the block's text
9
- # (not just the numbers) against the 3 copies and fails on any divergence of
10
- # wording, not only of threshold.
4
+ # (SKILL.md) as the CANONICAL SOURCE of the counting rules below. The
5
+ # dispatch-rule and decision-order lines are GENERATED from
6
+ # `dispatch-rule.yaml` (next to this file) into here, the 3 SKILL.md files and
7
+ # the router hook by `tools/generate-dispatch-rule.mjs`: edit the yaml and run
8
+ # `npm run generate:dispatch-rule`, never these lines.
9
+ # `test/test-dispatch-rule-generated.js` fails on any drift.
11
10
  # ---
12
11
 
13
- Dispatch rule: IF 2+ areas → maestro, always. OTHERWISE count the 3 remaining factors (multi-step, needs planning, produces a memorable artifact); 2+ factors → maestro. The area clause decides on its own, without summing with anything else.
12
+ Dispatch rule: IF 2+ areas → maestro, always. OTHERWISE count the 3 remaining factors (multi-step, needs planning, produces a memorable artifact); 2+ factors → maestro. The area clause decides on its own, without combining with anything else.
14
13
 
15
14
  **Decision order — capabilities → required relations → areas → shortcuts.** Match the catalogue entries, inspect their `rel`, and include only capabilities needed for the requested deliverable and not already supplied in the context. Resolve their owning areas before applying ANY one-area shortcut. One artifact can require multiple areas; the word "copy" does not prove that only copy is needed. For full sales-page copy, if either the offer or the conversion structure is missing from the supplied context, include the missing capability: `wizz-offer-forge` for the offer and/or `wizz-page-cro` for conversion structure (growth), alongside `wizz-copywriting` (copy); route to maestro. Do not assume those inputs are ready merely because the user did not mention them. If both are already approved and the request is limited to text, keep copy-only work in copy. An isolated headline or CTA does not require redesigning the whole page. Optional neighbours and separate deliverables do not add areas; `pairs_with` alone never escalates.
16
15
 
@@ -34,7 +33,7 @@ Written as bare labels, the 3 factors above were true of almost any request, and
34
33
 
35
34
  **The counterpart, and this is what is left for the maestro:** a request **of open scope, which the request itself does not delimit** — "how do I improve the signup conversion rate", "the sales page gets plenty of visits and almost nobody buys", "my sales page converts badly, improve it". There the scope has to be discovered before anything is delivered, and discovering scope is the Manager's work. The deciding difference is not the size of the request, it is whether **the request already states what the delivery is**.
36
35
 
37
- **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
36
+ **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `wizz-site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
38
37
 
39
38
  **Changing the product's code is `dev`, even when the subject is visual.** "Adjust the secondary button's colour", "fix the mobile spacing": the delivery is a commit, so it is the dev area — `designer` decides what the look should be, it does not ship the change. Ask which artifact leaves at the end: a file in the repo → dev; a decision, a spec or a piece of art → the area that owns it. **Exception: new or rebuilt screens.** When the request asks to BUILD screens in code (a new app, page, dashboard or panel, or a whole screen rebuilt in the product), the visual decision has not been made yet, so `designer` comes first and the sequence is design → dev (2 areas → maestro): the designer runs its research gate before any screen is coded. A tweak to an existing screen (a price, a label, a spacing) stays dev, and redesigning a section with no build asked for (a hero, a card) stays designer.
40
39
 
@@ -0,0 +1,21 @@
1
+ # Fonte única da regra de dispatch (2026-10-15).
2
+ #
3
+ # tools/generate-dispatch-rule.mjs reescreve, a partir daqui, a linha da regra e
4
+ # a linha da ordem de decisão em complexity-signal.md e nas SKILL.md do
5
+ # wizz-router, wizz-maestro e wizz-quick-dev, e a dica curta do hook
6
+ # tools/hooks/wizz-router-enforce.js. Não edite essas linhas nos arquivos:
7
+ # edite aqui e rode `npm run generate:dispatch-rule`. O `--check` roda no
8
+ # `npm test` (test/test-dispatch-rule-generated.js) e falha em qualquer drift.
9
+ #
10
+ # `{maestro}` vira o nome que cada arquivo usa para o maestro (ver `targets`
11
+ # no gerador). O texto renderizado na SKILL.md do router entra no prompt do
12
+ # eval de rota: mudar `rule` ou `decision_order` é mudança de rota e exige a
13
+ # prova de eval (linha de base em worktree, 9 amostras nas duas árvores).
14
+
15
+ rule: "IF 2+ areas → {maestro}, always. OTHERWISE count the 3 remaining factors (multi-step, needs planning, produces a memorable artifact); 2+ factors → {maestro}. The area clause decides on its own, without combining with anything else."
16
+
17
+ decision_order: "**Decision order — capabilities → required relations → areas → shortcuts.** Match the catalogue entries, inspect their `rel`, and include only capabilities needed for the requested deliverable and not already supplied in the context. Resolve their owning areas before applying ANY one-area shortcut. One artifact can require multiple areas; the word \"copy\" does not prove that only copy is needed. For full sales-page copy, if either the offer or the conversion structure is missing from the supplied context, include the missing capability: `wizz-offer-forge` for the offer and/or `wizz-page-cro` for conversion structure (growth), alongside `wizz-copywriting` (copy); route to maestro. Do not assume those inputs are ready merely because the user did not mention them. If both are already approved and the request is limited to text, keep copy-only work in copy. An isolated headline or CTA does not require redesigning the whole page. Optional neighbours and separate deliverables do not add areas; `pairs_with` alone never escalates."
18
+
19
+ # Paráfrase curta em PT-BR injetada pelo hook em projeto Wizz (a cada prompt,
20
+ # então fica curta de propósito).
21
+ hook_hint: "🎛️ Wizz: NÃO invoque wizz-router. Capacidades → rel necessário à entrega → áreas → atalhos. 2+ áreas → `wizz-maestro`. 1 área: 2+ fatores (multi-passo, planejar, artefato memorável) → `wizz-maestro`; senão → Skill da área. Auth/pagamento/permissão/migração → maestro. Personas são skills, não subagent_type; Agent usa tipos disponíveis wizz-exec-*; difícil → wizz-exec-strong (ESCALAR → ultra)."
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: cerebro
2
+ name: wizz-cerebro
3
3
  description: >
4
4
  Persistent memory system across AI sessions. Use this skill whenever the user types
5
5
  /iniciar, /salvar, /ver, /dia, /dump, /decisao, /conteudo, /prospect or /memoria. Also activate when the
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: ctc-align
2
+ name: wizz-ctc-align
3
3
  description: Reliable word-by-word timestamps for TTS narration via forced alignment (ctc-forced-aligner + anchoring on real silences). ALWAYS use before setting caption timing, scene cuts, animation, or any speech-synchronized element in any video (HyperFrames or other editor). Replaces Whisper as the timing source when the narration script text is known. Triggers - sincronizar legenda, timing de cena, alinhar áudio e texto, palavra a palavra, forced alignment, legenda karaokê, corrigir sync de vídeo. Use when the exact narration script is known and you need to decide caption timing, scene cuts, or speech-synchronized animation.
4
4
  ---
5
5
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: enhance-prompt
2
+ name: wizz-enhance-prompt
3
3
  description: Transforms vague UI ideas into polished, Stitch-optimized prompts. Enhances specificity, adds UI/UX keywords, injects design system context, and structures output for better generation results. Use when the user wants to polish a UI prompt before sending it to Stitch, improve a prompt that produced poor results, or turn a vague UI idea into a structured, design-system-aware prompt.
4
4
  allowed-tools:
5
5
  - "Read"
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: find-skills
2
+ name: wizz-find-skills
3
3
  description: Helps users discover and install agent skills OR MCP servers when they ask questions like "how do I do X", "find a skill for X", "adicione essa skill", "adicione esse MCP", "is there a skill/mcp that can...", or express interest in extending capabilities. Use when the user is looking for functionality that might exist as an installable skill or MCP server.
4
4
  ---
5
5
 
@@ -12,7 +12,7 @@
12
12
  > 仓库和已下载的缓存中)。用某个 SFX 前先 `ls assets/sfx/<category>/` 确认文件存在;
13
13
  > 缺失就跑 `npx --yes wizz-method fetch-assets --bundle huashu-audio --dest
14
14
  > assets`(路径相对本 skill 根目录)。离线时手动下载
15
- > `npx wizz-method fetch-assets --bundle huashu-audio` (2 partes em `https://wizz-assets.junior-aec.workers.dev/huashu-audio-1.tar.gz` e `.../huashu-audio-2.tar.gz`)
15
+ > `npx wizz-method fetch-assets --bundle huashu-audio` (2 partes em `https://assets.wizzcomms.com/huashu-audio-1.tar.gz` e `.../huashu-audio-2.tar.gz`)
16
16
  > 解压到 `assets/`,能力不受影响,只是首次用要等下载。
17
17
 
18
18
  ---
@@ -83,7 +83,7 @@ if [ ! -f "$MUSIC" ]; then
83
83
  echo "✗ Music not found: $MUSIC" >&2
84
84
  echo " Available moods: $(ls "$ASSETS_DIR" 2>/dev/null | grep -E '^bgm-.*\.mp3$' | sed 's/^bgm-//;s/\.mp3$//' | tr '\n' ' ')" >&2
85
85
  echo " Offline or npx failed? Download manually:" >&2
86
- echo " npx wizz-method fetch-assets --bundle huashu-audio (https://wizz-assets.junior-aec.workers.dev/huashu-audio-{1,2}.tar.gz)" >&2
86
+ echo " npx wizz-method fetch-assets --bundle huashu-audio (https://assets.wizzcomms.com/huashu-audio-{1,2}.tar.gz)" >&2
87
87
  echo " and extract it into: $ASSETS_DIR" >&2
88
88
  exit 1
89
89
  fi
@@ -913,43 +913,8 @@ function writeElement(slide, pres, el) {
913
913
  }
914
914
  }
915
915
 
916
- module.exports = async function html2pptx(htmlFile, pres, options) {
917
- options = options || {};
918
- const absHtmlPath = path.isAbsolute(htmlFile) ? htmlFile : path.resolve(process.cwd(), htmlFile);
919
- const tmpDir = options.tmpDir || process.env.TMPDIR || '/tmp';
920
-
921
- function finalizeError(rawMessage) {
922
- let message = rawMessage;
923
- if (!message.startsWith(htmlFile)) {
924
- message = `${htmlFile}: ${message}`;
925
- }
926
- return new Error(message);
927
- }
928
-
929
- let browser;
930
- let extraction;
931
- try {
932
- const launchOptions = { env: Object.assign({}, process.env, { TMPDIR: tmpDir }) };
933
- if (process.platform === 'darwin') launchOptions.channel = 'chrome';
934
- browser = await chromium.launch(launchOptions);
935
- const page = await browser.newPage();
936
- await page.goto('file://' + absHtmlPath);
937
-
938
- const initialBodySize = await page.evaluate(() => {
939
- const cs = getComputedStyle(document.body);
940
- return { width: parseFloat(cs.width), height: parseFloat(cs.height) };
941
- });
942
- await page.setViewportSize({
943
- width: Math.max(1, Math.round(initialBodySize.width)),
944
- height: Math.max(1, Math.round(initialBodySize.height)),
945
- });
946
-
947
- extraction = await page.evaluate(extractPageDataInBrowser);
948
- } finally {
949
- if (browser) await browser.close();
950
- }
951
-
952
- // ---- 整页级校验(第 5 节),和提取阶段收集到的错误合并 ----
916
+ // 整页级校验(第 5 节):和提取阶段收集到的错误合并,返回错误文案数组。纯函数,不碰浏览器。
917
+ function validatePage(extraction, pres) {
953
918
  const errors = extraction.errors.slice();
954
919
 
955
920
  const widthOverflowPx = Math.max(0, extraction.body.scrollWidth - extraction.body.width - 1);
@@ -989,6 +954,46 @@ module.exports = async function html2pptx(htmlFile, pres, options) {
989
954
  }
990
955
  }
991
956
  }
957
+ return errors;
958
+ }
959
+
960
+ module.exports = async function html2pptx(htmlFile, pres, options) {
961
+ options = options || {};
962
+ const absHtmlPath = path.isAbsolute(htmlFile) ? htmlFile : path.resolve(process.cwd(), htmlFile);
963
+ const tmpDir = options.tmpDir || process.env.TMPDIR || '/tmp';
964
+
965
+ function finalizeError(rawMessage) {
966
+ let message = rawMessage;
967
+ if (!message.startsWith(htmlFile)) {
968
+ message = `${htmlFile}: ${message}`;
969
+ }
970
+ return new Error(message);
971
+ }
972
+
973
+ let browser;
974
+ let extraction;
975
+ try {
976
+ const launchOptions = { env: Object.assign({}, process.env, { TMPDIR: tmpDir }) };
977
+ if (process.platform === 'darwin') launchOptions.channel = 'chrome';
978
+ browser = await chromium.launch(launchOptions);
979
+ const page = await browser.newPage();
980
+ await page.goto('file://' + absHtmlPath);
981
+
982
+ const initialBodySize = await page.evaluate(() => {
983
+ const cs = getComputedStyle(document.body);
984
+ return { width: parseFloat(cs.width), height: parseFloat(cs.height) };
985
+ });
986
+ await page.setViewportSize({
987
+ width: Math.max(1, Math.round(initialBodySize.width)),
988
+ height: Math.max(1, Math.round(initialBodySize.height)),
989
+ });
990
+
991
+ extraction = await page.evaluate(extractPageDataInBrowser);
992
+ } finally {
993
+ if (browser) await browser.close();
994
+ }
995
+
996
+ const errors = validatePage(extraction, pres);
992
997
 
993
998
  if (errors.length > 0) {
994
999
  let message;
@@ -1017,3 +1022,6 @@ module.exports = async function html2pptx(htmlFile, pres, options) {
1017
1022
 
1018
1023
  return { slide, placeholders: extraction.placeholders };
1019
1024
  };
1025
+
1026
+ // Expostos só para teste (funções puras, sem browser).
1027
+ module.exports._internals = { toPt, toIn, stripFileProtocol, previewTextOf, writeElement, validatePage };
@@ -80,7 +80,7 @@ if [ -n "$BGM" ] && [ ! -f "$BGM" ]; then
80
80
  echo "✗ BGM 文件不存在: $BGM" >&2
81
81
  echo " 可用 mood: $(ls "$ASSETS_DIR" 2>/dev/null | grep -E '^bgm-.*\.mp3$' | sed 's/^bgm-//;s/\.mp3$//' | tr '\n' ' ')" >&2
82
82
  echo " 离线,或 npx 失败?手动下载:" >&2
83
- echo " npx wizz-method fetch-assets --bundle huashu-audio (https://wizz-assets.junior-aec.workers.dev/huashu-audio-{1,2}.tar.gz)" >&2
83
+ echo " npx wizz-method fetch-assets --bundle huashu-audio (https://assets.wizzcomms.com/huashu-audio-{1,2}.tar.gz)" >&2
84
84
  echo " 解压到:$ASSETS_DIR" >&2
85
85
  exit 1
86
86
  fi
@@ -308,8 +308,14 @@ async function main() {
308
308
  console.error(` cue 数: ${totalCues}`);
309
309
  }
310
310
 
311
- main().catch((err) => {
312
- console.error(`narrate-pipeline 失败:${err.message}`);
313
- console.error(err.stack);
314
- process.exit(1);
315
- });
311
+ // Só executa quando chamado como script; importar o módulo (testes) não dispara o pipeline.
312
+ const isMain = process.argv[1] && fs.realpathSync(process.argv[1]) === fileURLToPath(import.meta.url);
313
+ if (isMain) {
314
+ main().catch((err) => {
315
+ console.error(`narrate-pipeline 失败:${err.message}`);
316
+ console.error(err.stack);
317
+ process.exit(1);
318
+ });
319
+ }
320
+
321
+ export { parseArgs, parseScript, splitByCues };