wizz-method 2.0.0 → 2.1.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 (311) hide show
  1. package/LICENSE +60 -30
  2. package/README.md +80 -31
  3. package/SECURITY.md +24 -0
  4. package/THIRD-PARTY-NOTICES.md +136 -0
  5. package/package.json +31 -17
  6. package/skills-registry.yaml +128 -7
  7. package/src/bmm-skills/1-analysis/research/wizz-domain-research/SKILL.md +3 -4
  8. package/src/bmm-skills/1-analysis/research/wizz-domain-research/domain-steps/step-06-research-synthesis.md +1 -1
  9. package/src/bmm-skills/1-analysis/research/wizz-market-research/SKILL.md +3 -4
  10. package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +1 -1
  11. package/src/bmm-skills/1-analysis/research/wizz-technical-research/SKILL.md +3 -4
  12. package/src/bmm-skills/1-analysis/research/wizz-technical-research/technical-steps/step-06-research-synthesis.md +1 -1
  13. package/src/bmm-skills/1-analysis/wizz-agent-analyst/SKILL.md +3 -4
  14. package/src/bmm-skills/1-analysis/wizz-agent-tech-writer/SKILL.md +3 -4
  15. package/src/bmm-skills/1-analysis/wizz-document-project/SKILL.md +3 -4
  16. package/src/bmm-skills/1-analysis/wizz-document-project/workflows/deep-dive-instructions.md +1 -1
  17. package/src/bmm-skills/1-analysis/wizz-document-project/workflows/full-scan-instructions.md +1 -1
  18. package/src/bmm-skills/1-analysis/wizz-prfaq/SKILL.md +3 -4
  19. package/src/bmm-skills/1-analysis/wizz-prfaq/references/verdict.md +1 -1
  20. package/src/bmm-skills/1-analysis/wizz-product-brief/SKILL.md +1 -1
  21. package/src/bmm-skills/2-plan-workflows/wizz-agent-pm/SKILL.md +3 -4
  22. package/src/bmm-skills/2-plan-workflows/wizz-agent-ux-designer/SKILL.md +3 -4
  23. package/src/bmm-skills/2-plan-workflows/wizz-create-prd/SKILL.md +1 -1
  24. package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/SKILL.md +1 -1
  25. package/src/bmm-skills/2-plan-workflows/wizz-prd/SKILL.md +1 -1
  26. package/src/bmm-skills/2-plan-workflows/wizz-ux/SKILL.md +1 -1
  27. package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/SKILL.md +1 -1
  28. package/src/bmm-skills/3-solutioning/wizz-agent-architect/SKILL.md +3 -4
  29. package/src/bmm-skills/3-solutioning/wizz-architecture/SKILL.md +9 -9
  30. package/src/bmm-skills/3-solutioning/wizz-architecture/references/headless.md +1 -1
  31. package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/SKILL.md +3 -4
  32. package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/steps/step-06-final-assessment.md +1 -1
  33. package/src/bmm-skills/3-solutioning/wizz-create-architecture/SKILL.md +1 -1
  34. package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/SKILL.md +3 -4
  35. package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/steps/step-04-final-validation.md +1 -1
  36. package/src/bmm-skills/3-solutioning/wizz-generate-project-context/SKILL.md +3 -4
  37. package/src/bmm-skills/3-solutioning/wizz-generate-project-context/steps/step-03-complete.md +1 -1
  38. package/src/bmm-skills/4-implementation/wizz-agent-dev/SKILL.md +3 -4
  39. package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/SKILL.md +3 -4
  40. package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/step-05-wrapup.md +1 -1
  41. package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +3 -4
  42. package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +3 -8
  43. package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/blind-hunter.md +20 -0
  44. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-04-present.md +1 -1
  45. package/src/bmm-skills/4-implementation/wizz-correct-course/SKILL.md +4 -5
  46. package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +4 -5
  47. package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +4 -5
  48. package/src/bmm-skills/4-implementation/wizz-investigate/SKILL.md +1 -1
  49. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +4 -5
  50. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +4 -5
  51. package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +10 -22
  52. package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/blind-hunter.md +20 -0
  53. package/src/bmm-skills/4-implementation/wizz-quick-dev/step-05-present.md +1 -1
  54. package/src/bmm-skills/4-implementation/wizz-quick-dev/step-oneshot.md +1 -1
  55. package/src/bmm-skills/4-implementation/wizz-retrospective/SKILL.md +1 -2
  56. package/src/bmm-skills/4-implementation/wizz-sprint-planning/SKILL.md +1 -1
  57. package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -6
  58. package/src/core-skills/_shared/handoff-protocol.md +9 -0
  59. package/src/core-skills/wizz-advanced-elicitation/SKILL.md +2 -2
  60. package/src/core-skills/wizz-brainstorming/SKILL.md +6 -6
  61. package/src/core-skills/wizz-brainstorming/references/converge.md +1 -1
  62. package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
  63. package/src/core-skills/wizz-brainstorming/references/headless.md +3 -3
  64. package/src/core-skills/wizz-brainstorming/references/mode-autonomous.md +1 -1
  65. package/src/core-skills/wizz-customize/SKILL.md +13 -10
  66. package/src/core-skills/wizz-forge-idea/SKILL.md +6 -6
  67. package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-314.pyc +0 -0
  68. package/src/core-skills/wizz-forge-idea/scripts/resolve_personas.py +17 -1
  69. package/src/core-skills/wizz-party-mode/SKILL.md +3 -3
  70. package/src/core-skills/wizz-party-mode/references/create-party.md +1 -1
  71. package/src/core-skills/wizz-party-mode/references/party-memory.md +2 -2
  72. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  73. package/src/core-skills/wizz-party-mode/scripts/resolve_party.py +17 -1
  74. package/src/core-skills/wizz-review-adversarial-general/SKILL.md +1 -1
  75. package/src/core-skills/wizz-spec/SKILL.md +5 -5
  76. package/src/modules/lowticket/README.md +6 -6
  77. package/src/modules/lowticket/module.yaml +4 -1
  78. package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/SKILL.md +4 -4
  79. package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/references/copy-das-paginas.md +1 -1
  80. package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/SKILL.md +1 -1
  81. package/src/modules/lowticket/skills/{lowticket-minerador → wizz-lowticket-minerador}/SKILL.md +3 -3
  82. package/src/modules/lowticket/skills/{lowticket-minerador → wizz-lowticket-minerador}/references/rubrica.md +1 -1
  83. package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/SKILL.md +4 -4
  84. package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/SKILL.md +3 -3
  85. package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/references/reguas.md +1 -1
  86. package/src/modules/wizz/_shared/communication-rules.md +1 -1
  87. package/src/modules/wizz/_shared/despacho-barato.md +9 -0
  88. package/src/modules/wizz/_shared/token-economy.md +7 -0
  89. package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
  90. package/src/modules/wizz/agents/wizz-ads/customize.toml +1 -2
  91. package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
  92. package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -2
  93. package/src/modules/wizz/agents/wizz-designer/SKILL.md +1 -1
  94. package/src/modules/wizz/agents/wizz-designer/customize.toml +1 -2
  95. package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
  96. package/src/modules/wizz/agents/wizz-growth/customize.toml +1 -2
  97. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +5 -5
  98. package/src/modules/wizz/agents/wizz-maestro/customize.toml +4 -8
  99. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
  100. package/src/modules/wizz/agents/wizz-memoria/customize.toml +1 -2
  101. package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
  102. package/src/modules/wizz/agents/wizz-qa/customize.toml +1 -2
  103. package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
  104. package/src/modules/wizz/agents/wizz-seo/customize.toml +1 -2
  105. package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -1
  106. package/src/modules/wizz/agents/wizz-social/customize.toml +1 -2
  107. package/src/modules/wizz/module.yaml +3 -0
  108. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +1 -2
  109. package/src/modules/wizz/overrides/wizz-agent-architect.toml +1 -2
  110. package/src/modules/wizz/overrides/wizz-agent-dev.toml +1 -2
  111. package/src/modules/wizz/overrides/wizz-agent-pm.toml +1 -2
  112. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +1 -2
  113. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +1 -2
  114. package/src/modules/wizz/subagents/codex/wizz-exec-haiku.toml +2 -0
  115. package/src/modules/wizz/subagents/codex/wizz-exec-opus.toml +2 -0
  116. package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +2 -0
  117. package/src/modules/wizz/subagents/codex/wizz-exec-sonnet.toml +2 -0
  118. package/src/modules/wizz/subagents/gemini/wizz-exec-haiku.md +4 -1
  119. package/src/modules/wizz/subagents/gemini/wizz-exec-opus.md +4 -1
  120. package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +4 -1
  121. package/src/modules/wizz/subagents/gemini/wizz-exec-sonnet.md +4 -1
  122. package/src/modules/wizz/subagents/opencode/wizz-exec-haiku.md +4 -1
  123. package/src/modules/wizz/subagents/opencode/wizz-exec-opus.md +4 -1
  124. package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +4 -1
  125. package/src/modules/wizz/subagents/opencode/wizz-exec-sonnet.md +4 -1
  126. package/src/modules/wizz/subagents/spec.yaml +148 -0
  127. package/src/modules/wizz/subagents/wizz-exec-haiku.md +4 -1
  128. package/src/modules/wizz/subagents/wizz-exec-opus.md +4 -1
  129. package/src/modules/wizz/subagents/wizz-exec-review.md +4 -1
  130. package/src/modules/wizz/subagents/wizz-exec-sonnet.md +4 -1
  131. package/src/scripts/__pycache__/resolve_customization.cpython-314.pyc +0 -0
  132. package/src/scripts/memlog.js +368 -0
  133. package/src/scripts/resolve_customization.py +124 -15
  134. package/src/skills-lib/_shared/complexity-signal.md +14 -0
  135. package/src/skills-lib/wizz-canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
  136. package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
  137. package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
  138. package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
  139. package/src/skills-lib/wizz-impeccable/LICENSE.txt +202 -0
  140. package/src/skills-lib/wizz-offer-forge/SKILL.md +1 -1
  141. package/src/skills-lib/wizz-react-components/LICENSE.txt +202 -0
  142. package/src/skills-lib/wizz-router/SKILL.md +2 -2
  143. package/src/skills-lib/wizz-supabase-postgres-best-practices/LICENSE +21 -0
  144. package/src/skills-lib/wizz-taste-skill/SKILL.md +1 -1
  145. package/src/skills-lib/wizz-tracking-audit/SKILL.md +1 -1
  146. package/tools/fetch-assets.mjs +70 -38
  147. package/tools/hooks/README.md +22 -0
  148. package/tools/hooks/rtk-rewrite.sh +280 -0
  149. package/tools/hooks/security-defensive-context.js +70 -0
  150. package/tools/hooks/session-rules.js +368 -0
  151. package/tools/hooks/wizz-decision-trace.js +389 -0
  152. package/tools/hooks/wizz-router-enforce.js +258 -0
  153. package/tools/installer/banner.js +1 -1
  154. package/tools/installer/commands/doctor.js +124 -0
  155. package/tools/installer/commands/fetch-assets.js +7 -8
  156. package/tools/installer/commands/install.js +1 -1
  157. package/tools/installer/commands/resolve.js +95 -0
  158. package/tools/installer/core/doctor.js +648 -0
  159. package/tools/installer/core/hash-cache.js +156 -0
  160. package/tools/installer/core/help-catalog.js +4 -1
  161. package/tools/installer/core/hooks-settings.js +178 -0
  162. package/tools/installer/core/installer.js +297 -15
  163. package/tools/installer/core/legacy-warnings.js +0 -4
  164. package/tools/installer/core/manifest-generator.js +121 -43
  165. package/tools/installer/core/manifest.js +36 -32
  166. package/tools/installer/core/module-config-writer.js +4 -1
  167. package/tools/installer/core/python-check.js +60 -63
  168. package/tools/installer/core/quick-update.js +76 -43
  169. package/tools/installer/core/resolved-config.js +168 -0
  170. package/tools/installer/core/resolved-customizations.js +736 -0
  171. package/tools/installer/core/resolved-includes.js +262 -0
  172. package/tools/installer/core/resolved-schema.js +148 -0
  173. package/tools/installer/core/user-file-preservation.js +40 -8
  174. package/tools/installer/core/wizz-dir.js +117 -0
  175. package/tools/installer/core/yaml-cache.js +105 -0
  176. package/tools/installer/fs-native.js +97 -6
  177. package/tools/installer/ide/_config-driven.js +12 -75
  178. package/tools/installer/ide/platform-codes.js +111 -16
  179. package/tools/installer/ide/platform-codes.yaml +45 -100
  180. package/tools/installer/ide/shared/path-utils.js +6 -208
  181. package/tools/installer/install-messages.yaml +4 -14
  182. package/tools/installer/modules/channel-plan.js +15 -2
  183. package/tools/installer/modules/config-collector.js +762 -0
  184. package/tools/installer/modules/config-values.js +352 -0
  185. package/tools/installer/modules/custom-module-manager.js +161 -28
  186. package/tools/installer/modules/env-vars.js +119 -0
  187. package/tools/installer/modules/external-manager.js +133 -60
  188. package/tools/installer/modules/git-cache-utils.js +125 -0
  189. package/tools/installer/modules/module-catalog.js +565 -0
  190. package/tools/installer/modules/module-installer.js +618 -0
  191. package/tools/installer/modules/module-interface.js +86 -0
  192. package/tools/installer/modules/official-modules.js +98 -2172
  193. package/tools/installer/modules/pin-spec.js +125 -0
  194. package/tools/installer/modules/plugin-resolver.js +4 -0
  195. package/tools/installer/modules/skills-lib.js +3 -6
  196. package/tools/installer/prompts.js +0 -3
  197. package/tools/installer/ui.js +89 -54
  198. package/tools/installer/wizz-cli.js +1 -1
  199. package/tools/lib/frontmatter.js +139 -0
  200. package/tools/lib/sync-targets.mjs +49 -0
  201. package/tools/lib/walk.js +93 -0
  202. package/wizz-modules.yaml +9 -0
  203. package/src/scripts/__pycache__/memlog.cpython-313.pyc +0 -0
  204. package/src/scripts/memlog.py +0 -233
  205. package/src/scripts/tests/__pycache__/test_memlog.cpython-313-pytest-9.1.1.pyc +0 -0
  206. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-313-pytest-9.1.1.pyc +0 -0
  207. package/src/scripts/tests/test_memlog.py +0 -306
  208. package/src/skills-lib/wizz-huashu-design/assets/showcases/INDEX.md +0 -115
  209. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-build.html +0 -235
  210. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-build.png +0 -0
  211. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-pentagram.html +0 -229
  212. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-pentagram.png +0 -0
  213. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-takram.html +0 -288
  214. package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-takram.png +0 -0
  215. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-build.html +0 -503
  216. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-build.png +0 -0
  217. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-pentagram.html +0 -600
  218. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-pentagram.png +0 -0
  219. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-takram.html +0 -670
  220. package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-takram.png +0 -0
  221. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-build.html +0 -382
  222. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-build.png +0 -0
  223. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-pentagram.html +0 -536
  224. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-pentagram.png +0 -0
  225. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-takram.html +0 -497
  226. package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-takram.png +0 -0
  227. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-build.html +0 -385
  228. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-build.png +0 -0
  229. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html +0 -422
  230. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png +0 -0
  231. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-takram.html +0 -499
  232. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-takram.png +0 -0
  233. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html +0 -562
  234. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png +0 -0
  235. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html +0 -548
  236. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png +0 -0
  237. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html +0 -696
  238. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png +0 -0
  239. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-build.html +0 -372
  240. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-build.png +0 -0
  241. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html +0 -460
  242. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png +0 -0
  243. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-takram.html +0 -494
  244. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-takram.png +0 -0
  245. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-build.html +0 -367
  246. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-build.png +0 -0
  247. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-pentagram.html +0 -368
  248. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-pentagram.png +0 -0
  249. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-takram.html +0 -459
  250. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-takram.png +0 -0
  251. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-build.html +0 -493
  252. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-build.png +0 -0
  253. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-pentagram.html +0 -556
  254. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-pentagram.png +0 -0
  255. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-takram.html +0 -604
  256. package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-takram.png +0 -0
  257. package/tools/installer/file-ops.js +0 -204
  258. package/tools/installer/ide/shared/skill-manifest.js +0 -57
  259. package/tools/installer/yaml-format.js +0 -245
  260. package/web-bundles/README.md +0 -46
  261. package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +0 -86
  262. package/web-bundles/brainstorming-coach/SKILL.md +0 -83
  263. package/web-bundles/brainstorming-coach/brain-methods.csv +0 -62
  264. package/web-bundles/bundles.json +0 -139
  265. package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +0 -88
  266. package/web-bundles/market-and-industry-research/SKILL.md +0 -59
  267. package/web-bundles/prd-coach/INSTRUCTIONS.md +0 -86
  268. package/web-bundles/prd-coach/SKILL.md +0 -101
  269. package/web-bundles/prd-coach/prd-template.md +0 -165
  270. package/web-bundles/prd-coach/prd-validation-checklist.md +0 -135
  271. package/web-bundles/prfaq-coach/INSTRUCTIONS.md +0 -86
  272. package/web-bundles/prfaq-coach/SKILL.md +0 -139
  273. package/web-bundles/product-brief-coach/INSTRUCTIONS.md +0 -86
  274. package/web-bundles/product-brief-coach/SKILL.md +0 -113
  275. package/web-bundles/ux-coach/INSTRUCTIONS.md +0 -92
  276. package/web-bundles/ux-coach/SKILL.md +0 -187
  277. package/web-bundles/ux-coach/ux-validation.md +0 -100
  278. /package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/references/mapa-do-funil.md +0 -0
  279. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/CATALOGO.md +0 -0
  280. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/01-principios.md +0 -0
  281. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/02-diagnostico-funil.md +0 -0
  282. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/03-campanha-bidcap.md +0 -0
  283. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04-criativos.md +0 -0
  284. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04a-criativos-ia.md +0 -0
  285. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04b-criativos-formatos.md +0 -0
  286. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/05-oferta.md +0 -0
  287. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06-pagina-vendas.md +0 -0
  288. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06a-instagram.md +0 -0
  289. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06b-player-vsl.md +0 -0
  290. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/07-funil-upsell.md +0 -0
  291. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/07a-copy-humanizacao.md +0 -0
  292. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/08-pesquisa-publico.md +0 -0
  293. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/09-especialista-coproducao.md +0 -0
  294. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/10-levantar-caixa.md +0 -0
  295. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/11-checklist-roi.md +0 -0
  296. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12-mineracao-ofertas.md +0 -0
  297. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12a-mineracao-veredito.md +0 -0
  298. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12b-fabrica-de-ofertas.md +0 -0
  299. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12c-anatomia-low-ticket.md +0 -0
  300. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/13-benchmarks-vsl.md +0 -0
  301. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/14-vocabulario.md +0 -0
  302. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/15-como-estender.md +0 -0
  303. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/17-rastreamento.md +0 -0
  304. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/18-copy-desejo-oferta.md +0 -0
  305. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/INDEX.md +0 -0
  306. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/guardrails.md +0 -0
  307. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/pontos-em-aberto.md +0 -0
  308. /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/references/swipe-file.md +0 -0
  309. /package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/references/metas-e-medicao.md +0 -0
  310. /package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/references/padroes-de-codigo.md +0 -0
  311. /package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/references/formato-do-diagnostico.md +0 -0
@@ -4,11 +4,15 @@
4
4
  // Por que existe: `huashu-design/assets/**/*.mp3` (~30MB) e
5
5
  // `canvas-design/canvas-fonts/**/*.ttf` (~5.5MB) inflavam o pacote npm em
6
6
  // ~73%, mas só são necessários no primeiro uso real de export de vídeo
7
- // (BGM/SFX) ou de uma variante de fonte específica. Fonte de verdade dos BGM
8
- // é o GitHub Release assets-v1 (fora do git e do tarball desde o P2 da
9
- // auditoria 360°); os SFX pequenos e as fontes seguem no git. Este script baixa o
10
- // bundle certo, no lugar certo, verificando sha256 (mesmo espírito do pin
11
- // com checksum do rtk — nunca extrai um bundle adulterado).
7
+ // (BGM/SFX) ou de uma variante de fonte específica. Fonte de verdade dos
8
+ // bundles é o host público de assets da Wizz! comms. (Cloudflare Workers com
9
+ // assets estáticos, ASSETS_BASE abaixo; saiu do GitHub Releases em 2026-09-12
10
+ // porque o repo virou privado e o download passaria a exigir token); os SFX
11
+ // pequenos e as fontes seguem no git. Este script baixa o bundle certo, no
12
+ // lugar certo, verificando sha256 (mesmo espírito do pin com checksum do rtk
13
+ // — nunca extrai um bundle adulterado). Um bundle pode vir em `parts` (o host
14
+ // limita cada arquivo a 25 MiB): todas as partes são baixadas e verificadas
15
+ // antes de qualquer extração.
12
16
  //
13
17
  // Uso:
14
18
  // node tools/fetch-assets.mjs <bundle> [--dest <dir>] [--force]
@@ -35,22 +39,32 @@ const __filename = fileURLToPath(import.meta.url);
35
39
  const __dirname = path.dirname(__filename);
36
40
  const PACKAGE_ROOT = path.resolve(__dirname, '..');
37
41
 
38
- const RELEASE_BASE = 'https://github.com/wizzcomms/wizz-method/releases/download/assets-v1';
42
+ export const ASSETS_BASE = 'https://wizz-assets.junior-aec.workers.dev';
39
43
 
40
44
  // Fonte única dos bundles conhecidos. `dest` é relativo ao root do pacote
41
45
  // (repo em dev, node_modules/wizz-method quando instalado via npm — a mesma
42
46
  // árvore src/skills-lib/ existe nos dois casos). `marker` é um arquivo que só
43
- // existe depois de extraído com sucesso; presença dele = cache hit.
47
+ // existe depois de extraído com sucesso; presença dele = cache hit (num bundle
48
+ // em `parts`, o marker mora na ÚLTIMA parte, senão um download interrompido
49
+ // no meio contaria como cache).
44
50
  export const BUNDLES = {
45
51
  'huashu-audio': {
46
- url: `${RELEASE_BASE}/huashu-audio.tar.gz`,
47
- sha256: 'd20ddaefb7fd560837dec8d57ae8698ee51ef553d61a1367f0491183c613129f',
52
+ parts: [
53
+ {
54
+ url: `${ASSETS_BASE}/huashu-audio-1.tar.gz`,
55
+ sha256: 'a575040a0341ac77a9135dffbba176891def1d9fb8599fddd659cc773a671b9e',
56
+ },
57
+ {
58
+ url: `${ASSETS_BASE}/huashu-audio-2.tar.gz`,
59
+ sha256: '6f739cae53b5eb7935a6372fbdc85c1cab47cef80310074e39989122e169c4d9',
60
+ },
61
+ ],
48
62
  dest: 'src/skills-lib/wizz-huashu-design/assets',
49
63
  marker: 'bgm-ad.mp3',
50
- description: '6 trilhas BGM + SFX (huashu-design/assets/**/*.mp3, ~27MB)',
64
+ description: '6 trilhas BGM + SFX (huashu-design/assets/**/*.mp3, ~27MB em 2 partes)',
51
65
  },
52
66
  'canvas-fonts': {
53
- url: `${RELEASE_BASE}/canvas-fonts.tar.gz`,
67
+ url: `${ASSETS_BASE}/canvas-fonts.tar.gz`,
54
68
  sha256: '7ac839f1dee2883b8e9a7022f246cfece4e203a2fd6ea23c81a5ffa49b812396',
55
69
  dest: 'src/skills-lib/wizz-canvas-design/canvas-fonts',
56
70
  marker: 'Outfit-Regular.ttf',
@@ -124,42 +138,52 @@ function isCached(destDir, marker) {
124
138
  *
125
139
  * @returns {Promise<{ cached: boolean }>}
126
140
  */
127
- export async function fetchBundle({ url, sha256, dest, marker, force = false }) {
141
+ export async function fetchBundle({ url, sha256, parts, dest, marker, force = false }) {
128
142
  const destDir = path.isAbsolute(dest) ? dest : path.join(PACKAGE_ROOT, dest);
143
+ const partList = Array.isArray(parts) && parts.length > 0 ? parts : [{ url, sha256 }];
129
144
 
130
145
  if (!force && isCached(destDir, marker)) {
131
146
  return { cached: true, dest: destDir };
132
147
  }
133
148
 
134
- const tmpFile = path.join(os.tmpdir(), `wizz-fetch-assets-${crypto.randomBytes(6).toString('hex')}.tar.gz`);
149
+ // Baixa e verifica TODAS as partes antes de extrair qualquer uma: uma parte
150
+ // corrompida ou fora do ar nunca deixa o destino meio preenchido.
151
+ const tmpFiles = [];
152
+ const cleanup = () => {
153
+ for (const f of tmpFiles) fs.rmSync(f, { force: true });
154
+ };
135
155
  try {
136
- await download(url, tmpFile);
137
- } catch (error) {
138
- fs.rmSync(tmpFile, { force: true });
139
- if (isNetworkError(error)) {
140
- throw new FetchAssetsError(
141
- `Sem conexão para baixar o asset (${error.code || error.message}).\n` +
142
- ` Baixe manualmente: ${url}\n` +
143
- ` E extraia em: ${destDir}`,
144
- { cause: error },
145
- );
146
- }
147
- throw error;
148
- }
156
+ for (const part of partList) {
157
+ const tmpFile = path.join(os.tmpdir(), `wizz-fetch-assets-${crypto.randomBytes(6).toString('hex')}.tar.gz`);
158
+ tmpFiles.push(tmpFile);
159
+ try {
160
+ await download(part.url, tmpFile);
161
+ } catch (error) {
162
+ if (isNetworkError(error)) {
163
+ throw new FetchAssetsError(
164
+ `Sem conexão para baixar o asset (${error.code || error.message}).\n` +
165
+ ` Baixe manualmente: ${partList.map((p) => p.url).join('\n ')}\n` +
166
+ ` E extraia em: ${destDir}`,
167
+ { cause: error },
168
+ );
169
+ }
170
+ throw error;
171
+ }
149
172
 
150
- const actualSha256 = await sha256File(tmpFile);
151
- if (actualSha256 !== sha256) {
152
- fs.rmSync(tmpFile, { force: true });
153
- throw new FetchAssetsError(
154
- `sha256 não confere para ${url}\n esperado: ${sha256}\n obtido: ${actualSha256}\n` +
155
- `Download abortado, nada foi extraído (bundle pode estar corrompido ou adulterado).`,
156
- );
157
- }
173
+ const actualSha256 = await sha256File(tmpFile);
174
+ if (actualSha256 !== part.sha256) {
175
+ throw new FetchAssetsError(
176
+ `sha256 não confere para ${part.url}\n esperado: ${part.sha256}\n obtido: ${actualSha256}\n` +
177
+ `Download abortado, nada foi extraído (bundle pode estar corrompido ou adulterado).`,
178
+ );
179
+ }
180
+ }
158
181
 
159
- try {
160
- extractTarGz(tmpFile, destDir);
182
+ for (const tmpFile of tmpFiles) {
183
+ extractTarGz(tmpFile, destDir);
184
+ }
161
185
  } finally {
162
- fs.rmSync(tmpFile, { force: true });
186
+ cleanup();
163
187
  }
164
188
 
165
189
  return { cached: false, dest: destDir };
@@ -167,7 +191,14 @@ export async function fetchBundle({ url, sha256, dest, marker, force = false })
167
191
 
168
192
  export class FetchAssetsError extends Error {}
169
193
 
170
- async function fetchNamedBundle(name, { dest, force } = {}) {
194
+ /**
195
+ * Resolve um bundle do catálogo `BUNDLES` pelo nome e baixa. É o ÚNICO lugar
196
+ * que traduz a entrada do catálogo em argumentos de `fetchBundle`: o wrapper
197
+ * do CLI (`tools/installer/commands/fetch-assets.js`) chama esta função, nunca
198
+ * remonta o objeto à mão. Um wrapper que remontava esqueceu `parts` e quebrava
199
+ * todo bundle em partes com "Cannot read properties of undefined" (2026-09-12).
200
+ */
201
+ export async function fetchNamedBundle(name, { dest, force } = {}) {
171
202
  const bundle = BUNDLES[name];
172
203
  if (!bundle) {
173
204
  throw new FetchAssetsError(`Bundle desconhecido: "${name}". Disponíveis: ${Object.keys(BUNDLES).join(', ')}`);
@@ -175,6 +206,7 @@ async function fetchNamedBundle(name, { dest, force } = {}) {
175
206
  return fetchBundle({
176
207
  url: bundle.url,
177
208
  sha256: bundle.sha256,
209
+ parts: bundle.parts,
178
210
  dest: dest || bundle.dest,
179
211
  marker: bundle.marker,
180
212
  force,
@@ -0,0 +1,22 @@
1
+ # Hooks (fonte de verdade)
2
+
3
+ Os hooks do Claude Code usados pelo Wizz Method vivem AQUI e são instalados em
4
+ `~/.claude/hooks/` via `npm run sync:global`. Nunca edite a cópia global direto:
5
+ ela é substituída no próximo sync.
6
+
7
+ | Hook | Evento | O que faz |
8
+ | ------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | `wizz-router-enforce.js` | UserPromptSubmit | Gate `isTrivial()` + injeção curta: em projeto Wizz (`_wizz/`) manda delegar direto ao maestro/agente da área (sem router); fora, manda pro `wizz-router`. |
10
+ | `session-rules.js` | SessionStart | Duas coisas num processo só: injeta as regras de comunicação 1x por sessão (antes era por prompt) e resolve a FEATURE ATIVA sozinho (branch git > `_wizz/bmm/config.yaml` > nada), para ninguém precisar invocar `wizz-set-feature`. Branch de tronco e de release não viram feature; sem feature a linha não é emitida (custo zero). A feature também é o `tema` da memória. |
11
+ | `security-defensive-context.js` | PreToolUse (Skill) | Metodologia defensiva/escopada ao invocar skills de segurança. Genérico por projeto (v2). |
12
+ | `rtk-rewrite.sh` | PreToolUse (Bash) | Reescreve comandos de shell via `rtk rewrite` (token economy). Fork local do hook gerado pelo instalador upstream do rtk, com 3 patches (auditoria 2026-07-07, C4/RT1; e 2026-09-11, RT-H3): reescrita linha a linha em comando multi-linha (o binário só reescrevia a 1ª linha), timeout interno por linha (`RTK_HOOK_TIMEOUT`, default 3s) que não depende do `timeout`/`gtimeout` do GNU coreutils, e cache do version-guard (`RTK_CACHE_TTL_SECONDS`, default 1h, em `${XDG_CACHE_HOME:-$HOME/.cache}/wizz/rtk-version`) pra não rodar `rtk --version` a cada `Bash` tool call da sessão. Requer `rtk` + `jq` no PATH; fail-open em ambos (e no cache: ilegível/corrompido/expirado recomputa em silêncio). |
13
+
14
+ Removidos em 2026-07 (arquivados em `~/.claude/hooks-archive/`):
15
+ `no-narration-enforce.js` (absorvido pelo session-rules) e `vault-reminder.js`.
16
+
17
+ Testes: `npm run test:hooks` (isTrivial + contexto por modo), `npm run test:feature-context` (resolução da feature ativa: tronco não vira feature, branch ganha do config, silêncio quando não há feature) e `node test/test-rtk-hook.js` (rewrite básico + multi-linha do `rtk-rewrite.sh`, smoke test que exercita o binário `rtk` real quando disponível, e o cache do version-guard: criado na 1ª chamada e reusado na 2ª, TTL expirado força recompute, path do binário mudou invalida, cache corrompido não quebra e se auto-cura).
18
+ Evals de roteamento: `node evals/routing/run-routing-eval.mjs [--llm]`.
19
+
20
+ Drift repo ↔ global: `npm run sync:check` compara hash de cada hook (e skill) entre o repo e `~/.claude`, sem escrever nada — é lembrete (fail-open), não gate; roda no fim do `npm test`. Achou drift? `npm run sync:global` atualiza `~/.claude`.
21
+
22
+ Registro por projeto (RT-C1, item 3): o installer copia estes hooks para `_wizz/hooks/` de cada projeto instalado e registra a chamada em `.claude/settings.json` do projeto, via merge puro em `tools/installer/core/hooks-settings.js`. Antes de registrar, ele lê o `settings.json` GLOBAL do usuário (`~/.claude/settings.json`, ou o path apontado por `WIZZ_GLOBAL_SETTINGS_FILE` quando definido) e pula qualquer hook nosso que já esteja registrado lá no mesmo evento, para não rodar o mesmo hook 2x numa máquina onde o mantenedor já fez o registro global (decisão do dono, 2026-09-11). Settings global ausente ou com JSON inválido não filtra nada.
@@ -0,0 +1,280 @@
1
+ #!/usr/bin/env bash
2
+ # rtk-hook-version: 3-wizz3
3
+ # RTK Claude Code hook — rewrites commands to use rtk for token savings.
4
+ # Requires: rtk >= 0.23.0, jq
5
+ #
6
+ # Fonte de verdade: tools/hooks/rtk-rewrite.sh neste repo. Instalado em
7
+ # ~/.claude/hooks/ via `npm run sync:global` (nunca editar a cópia global
8
+ # direto: ela é substituída no próximo sync). Isto é um FORK local do hook
9
+ # gerado pelo instalador upstream do rtk (que documenta "single source of
10
+ # truth = src/discover/registry.rs, não edite este arquivo"): mantemos a
11
+ # delegação da lógica de rewrite pro binário `rtk rewrite`, mas aplicamos 3
12
+ # patches locais que o upstream não tem (auditoria 2026-07-07, C4/RT1; e
13
+ # auditoria 2026-09-11, RT-H3):
14
+ #
15
+ # 1. Bug de comando multi-linha: `rtk rewrite` (confirmado ainda presente
16
+ # no binário 0.43.0, reportado
17
+ # upstream) só reescreve a 1ª linha de um comando multi-linha; as
18
+ # demais passam cruas, sem aviso, gerando saída mista. Correção: este
19
+ # hook detecta comando multi-linha e chama `rtk rewrite` LINHA A LINHA,
20
+ # preservando a reescrita completa em vez de só a primeira linha.
21
+ # 2. Timeout interno por linha (RTK_HOOK_TIMEOUT, default 3s): evita que
22
+ # uma chamada travada a `rtk rewrite` prenda o prompt inteiro. Não
23
+ # depende do `timeout`/`gtimeout` do GNU coreutils (ausente por padrão
24
+ # no macOS) — usa um watcher em background portátil (bash puro).
25
+ # Isso é além do timeout de 5s já configurado no bloco PreToolUse do
26
+ # settings.json (defesa em profundidade, não substituição).
27
+ # 3. Cache do version-guard (RTK_CACHE_TTL_SECONDS, default 1h): sem isso
28
+ # o guard rodava `rtk --version` + parsing a CADA Bash tool call da
29
+ # sessão (5 spawns/chamada). Ver comentário em `rtk_version_ok` abaixo
30
+ # para o formato do cache e o motivo do diretório escolhido.
31
+ #
32
+ # Version guard (floor de compatibilidade do subcomando `rewrite`, 0.23.0):
33
+ # é diferente do pin de supply chain do registry (`cli_utility.rtk`, hoje
34
+ # v0.43.0) — aquele controla o que o installer OFERECE instalar; este
35
+ # controla o que ESTE hook aceita rodar sem quebrar.
36
+
37
+ RTK_HOOK_TIMEOUT="${RTK_HOOK_TIMEOUT:-3}"
38
+
39
+ # Cache do version-guard (RT-H3, auditoria 2026-09-11): sem cache, o guard
40
+ # de versão rodava `rtk --version` + `grep` + `head` + 2x `cut` (5 spawns)
41
+ # a CADA Bash tool call da sessão inteira, só pra confirmar um dado que não
42
+ # muda no meio da sessão. Agora fica em cache com TTL de 1h, invalidado
43
+ # também se o binário `rtk` do PATH mudar de lugar (upgrade/reinstall no
44
+ # meio da sessão).
45
+ #
46
+ # Local do cache: ${XDG_CACHE_HOME:-$HOME/.cache}/wizz/rtk-version.
47
+ # XDG_CACHE_HOME é o padrão em Linux e cada vez mais respeitado em macOS
48
+ # também (Homebrew, uv, Docker Desktop já escrevem em ~/.cache); cai pra
49
+ # $HOME/.cache quando ausente, que existe nas duas plataformas — mais
50
+ # portátil que hardcodar um dos dois. Preferido a ${TMPDIR:-/tmp}: TMPDIR
51
+ # é o certo pra artefato descartável de UM processo, mas o objetivo aqui é
52
+ # sobreviver a Bash calls dentro da mesma sessão (e entre sessões, já que a
53
+ # versão instalada muda raramente) — cache "de configuração", não "de
54
+ # processo". Conteúdo não é sensível (só path do binário, status ok/old e
55
+ # timestamp), então não precisa do isolamento por-UID que TMPDIR daria.
56
+ RTK_CACHE_TTL_SECONDS="${RTK_CACHE_TTL_SECONDS:-3600}"
57
+ RTK_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/wizz"
58
+ RTK_CACHE_FILE="$RTK_CACHE_DIR/rtk-version"
59
+
60
+ if ! command -v jq &>/dev/null; then
61
+ echo "[rtk] WARNING: jq is not installed. Hook cannot rewrite commands. Install jq: https://jqlang.github.io/jq/download/" >&2
62
+ exit 0
63
+ fi
64
+
65
+ if ! command -v rtk &>/dev/null; then
66
+ echo "[rtk] WARNING: rtk is not installed or not in PATH. Hook cannot rewrite commands. Install: https://github.com/rtk-ai/rtk#installation" >&2
67
+ exit 0
68
+ fi
69
+
70
+ # rtk_version_ok — true (exit 0) quando o `rtk` do PATH é >= 0.23.0 (piso de
71
+ # compatibilidade do subcomando `rewrite`). Resultado cacheado em
72
+ # $RTK_CACHE_FILE por $RTK_CACHE_TTL_SECONDS; cache ilegível, corrompido,
73
+ # expirado, ou com path de binário diferente do atual é ignorado em
74
+ # silêncio e recomputado — fail-open, mesma filosofia do resto do hook: um
75
+ # cache ruim nunca deve travar o rewrite, só custar 1 recomputo.
76
+ #
77
+ # Caminho quente (cache válido): zero spawns — `command -v` é builtin do
78
+ # bash, `read` lê o arquivo sem subshell, e `$EPOCHSECONDS` (bash >= 5,
79
+ # padrão no macOS/Linux modernos) evita o spawn de `date`; em bash < 5 cai
80
+ # pra `date +%s` (1 spawn). Caminho frio (cache ausente/expirado, ~1x/h):
81
+ # `rtk --version` + `mktemp` + `mv` (3 spawns, contra 5 de antes, e só uma
82
+ # vez por hora em vez de a cada comando).
83
+ rtk_version_ok() {
84
+ local rtk_path cached_path cached_status cached_ts now elapsed
85
+ rtk_path=$(command -v rtk)
86
+ now="${EPOCHSECONDS:-$(date +%s)}"
87
+
88
+ if [ -r "$RTK_CACHE_FILE" ]; then
89
+ IFS=$'\t' read -r cached_path cached_status cached_ts _ <"$RTK_CACHE_FILE" 2>/dev/null
90
+ case "$cached_ts" in
91
+ '' | *[!0-9]*) cached_ts="" ;;
92
+ esac
93
+ if [ -n "$cached_ts" ] && [ "$cached_path" = "$rtk_path" ] &&
94
+ { [ "$cached_status" = "ok" ] || [ "$cached_status" = "old" ]; }; then
95
+ elapsed=$((now - cached_ts))
96
+ if [ "$elapsed" -ge 0 ] && [ "$elapsed" -lt "$RTK_CACHE_TTL_SECONDS" ]; then
97
+ [ "$cached_status" = "ok" ]
98
+ return $?
99
+ fi
100
+ fi
101
+ fi
102
+
103
+ # Cache ausente/corrompido/expirado/binário mudou: recomputa (1 spawn:
104
+ # `rtk --version`). Extração de X.Y.Z via builtins (case + parameter
105
+ # expansion), sem grep/cut, equivalente ao antigo
106
+ # `grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1` + `cut -d. -f1/f2`.
107
+ local version_line word vnum major minor status
108
+ version_line=$(rtk --version 2>/dev/null)
109
+ status="ok"
110
+ vnum=""
111
+ for word in $version_line; do
112
+ case "$word" in
113
+ v[0-9]*.[0-9]*.[0-9]*) word="${word#v}" ;;
114
+ esac
115
+ case "$word" in
116
+ [0-9]*.[0-9]*.[0-9]*)
117
+ vnum="$word"
118
+ break
119
+ ;;
120
+ esac
121
+ done
122
+ if [ -n "$vnum" ]; then
123
+ major="${vnum%%.*}"
124
+ minor="${vnum#*.}"
125
+ minor="${minor%%.*}"
126
+ case "$major" in '' | *[!0-9]*) major=0 ;; esac
127
+ case "$minor" in '' | *[!0-9]*) minor=0 ;; esac
128
+ # Require >= 0.23.0
129
+ if [ "$major" -eq 0 ] && [ "$minor" -lt 23 ]; then
130
+ status="old"
131
+ echo "[rtk] WARNING: rtk $vnum is too old (need >= 0.23.0). Upgrade: cargo install rtk" >&2
132
+ fi
133
+ fi
134
+
135
+ # Escrita atômica (tmp + mv no mesmo dir): qualquer falha (dir não
136
+ # gravável, disco cheio, /tmp somente-leitura) é ignorada — o cache é só
137
+ # uma otimização, nunca uma dependência.
138
+ if mkdir -p "$RTK_CACHE_DIR" 2>/dev/null; then
139
+ local tmp
140
+ tmp=$(mktemp "$RTK_CACHE_DIR/.rtk-version.XXXXXX" 2>/dev/null) && {
141
+ printf '%s\t%s\t%s\n' "$rtk_path" "$status" "$now" >"$tmp" 2>/dev/null &&
142
+ mv -f "$tmp" "$RTK_CACHE_FILE" 2>/dev/null
143
+ rm -f "$tmp" 2>/dev/null
144
+ }
145
+ fi
146
+
147
+ [ "$status" = "ok" ]
148
+ }
149
+
150
+ if ! rtk_version_ok; then
151
+ exit 0
152
+ fi
153
+
154
+ # multiline_unsafe <cmd> — retorna 0 (unsafe) quando reescrever linha a
155
+ # linha pode corromper o comando: heredoc (linhas de corpo que parecem
156
+ # comando seriam reescritas, ex. `git status` dentro de `cat <<EOF`),
157
+ # continuação com `\` no fim da linha (a linha seguinte é argumento, não
158
+ # comando) ou aspas desbalanceadas numa linha (string atravessa a quebra).
159
+ # Nesses casos o comando passa INTACTO (fail-open), sem reescrita parcial.
160
+ multiline_unsafe() {
161
+ local cmd="$1"
162
+ case "$cmd" in
163
+ *"<<"*) return 0 ;;
164
+ esac
165
+ local line dq sq
166
+ while IFS= read -r line || [ -n "$line" ]; do
167
+ case "$line" in
168
+ *\\) return 0 ;;
169
+ esac
170
+ dq=$(printf '%s' "$line" | tr -cd '"' | wc -c)
171
+ sq=$(printf '%s' "$line" | tr -cd "'" | wc -c)
172
+ if [ $((dq % 2)) -ne 0 ] || [ $((sq % 2)) -ne 0 ]; then
173
+ return 0
174
+ fi
175
+ done <<RTK_HOOK_GUARD_EOF
176
+ $cmd
177
+ RTK_HOOK_GUARD_EOF
178
+ return 1
179
+ }
180
+
181
+ # rewrite_one <line> — imprime a linha reescrita, limitada por
182
+ # RTK_HOOK_TIMEOUT segundos. Em timeout ou qualquer falha do rtk, imprime a
183
+ # linha original sem alteração (fail-open, mesma filosofia do resto do hook).
184
+ rewrite_one() {
185
+ local line="$1"
186
+ if [ -z "$line" ]; then
187
+ printf '%s' ''
188
+ return 0
189
+ fi
190
+ local tmp
191
+ tmp=$(mktemp 2>/dev/null) || {
192
+ printf '%s' "$line"
193
+ return 0
194
+ }
195
+ ( rtk rewrite "$line" >"$tmp" 2>/dev/null ) &
196
+ local pid=$!
197
+ # O watcher roda com stdout/stderr em /dev/null: esta função é chamada
198
+ # dentro de $(...), e um filho que herdasse o pipe da substituição de
199
+ # comando seguraria o chamador até o `sleep` terminar (3 s por chamada,
200
+ # mesmo com o rtk respondendo em ms). O trap mata o `sleep` quando o
201
+ # watcher recebe TERM, para não sobrar um kill tardio num pid reciclado.
202
+ (
203
+ trap 'kill "$sleeper" 2>/dev/null; exit 0' TERM
204
+ sleep "$RTK_HOOK_TIMEOUT" &
205
+ sleeper=$!
206
+ wait "$sleeper"
207
+ kill -TERM "$pid" 2>/dev/null
208
+ ) >/dev/null 2>&1 &
209
+ local watcher=$!
210
+ wait "$pid" 2>/dev/null
211
+ local status=$?
212
+ kill -TERM "$watcher" 2>/dev/null
213
+ wait "$watcher" 2>/dev/null
214
+
215
+ # Exit codes do `rtk rewrite`: 0 = reescrito (≤0.30.x), 3 = reescrito
216
+ # (0.43.0+, apesar do --help ainda dizer 0), 1 = sem equivalente (sem
217
+ # output). Qualquer outro status (timeout/SIGTERM=143, erro) = fail-open.
218
+ if { [ "$status" -eq 0 ] || [ "$status" -eq 3 ]; } && [ -s "$tmp" ]; then
219
+ cat "$tmp"
220
+ else
221
+ printf '%s' "$line"
222
+ fi
223
+ rm -f "$tmp" 2>/dev/null
224
+ }
225
+
226
+ INPUT=$(cat)
227
+ CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
228
+
229
+ if [ -z "$CMD" ]; then
230
+ exit 0
231
+ fi
232
+
233
+ case "$CMD" in
234
+ *$'\n'*)
235
+ # Comando multi-linha: reescreve linha a linha (bug RT1/C4), exceto
236
+ # quando o guard detecta risco de corrupção (heredoc, continuação,
237
+ # string multi-linha) — aí passa intacto. O heredoc do loop (não um
238
+ # pipe) garante que ele roda no shell atual, não numa subshell, para
239
+ # REWRITTEN sobreviver ao loop.
240
+ if multiline_unsafe "$CMD"; then
241
+ exit 0
242
+ fi
243
+ REWRITTEN=""
244
+ first=1
245
+ while IFS= read -r line || [ -n "$line" ]; do
246
+ rewritten_line=$(rewrite_one "$line")
247
+ if [ "$first" -eq 1 ]; then
248
+ REWRITTEN="$rewritten_line"
249
+ first=0
250
+ else
251
+ REWRITTEN="$REWRITTEN
252
+ $rewritten_line"
253
+ fi
254
+ done <<RTK_HOOK_EOF
255
+ $CMD
256
+ RTK_HOOK_EOF
257
+ ;;
258
+ *)
259
+ REWRITTEN=$(rewrite_one "$CMD")
260
+ ;;
261
+ esac
262
+
263
+ # No change — nothing to do.
264
+ if [ "$CMD" = "$REWRITTEN" ]; then
265
+ exit 0
266
+ fi
267
+
268
+ ORIGINAL_INPUT=$(echo "$INPUT" | jq -c '.tool_input')
269
+ UPDATED_INPUT=$(echo "$ORIGINAL_INPUT" | jq --arg cmd "$REWRITTEN" '.command = $cmd')
270
+
271
+ jq -n \
272
+ --argjson updated "$UPDATED_INPUT" \
273
+ '{
274
+ "hookSpecificOutput": {
275
+ "hookEventName": "PreToolUse",
276
+ "permissionDecision": "allow",
277
+ "permissionDecisionReason": "RTK auto-rewrite",
278
+ "updatedInput": $updated
279
+ }
280
+ }'
@@ -0,0 +1,70 @@
1
+ /**
2
+ * security-defensive-context.js
3
+ *
4
+ * Fonte de verdade: wizz-method/tools/hooks/. Instalar via `npm run sync:global`.
5
+ *
6
+ * Hook PreToolUse: quando o usuário invoca uma skill de segurança, injeta
7
+ * instruções de metodologia que orientam o modelo a trabalhar de forma
8
+ * defensiva, escopada e por dimensão — evitando o padrão de varredura ampla
9
+ * que aciona os safeguards de cibersegurança da Anthropic.
10
+ *
11
+ * v2 (2026-07): contexto genérico por projeto (a v1 hardcodava o stack do MeJu
12
+ * e injetava esse contexto em QUALQUER projeto).
13
+ *
14
+ * IMPORTANTE: guia o COMPORTAMENTO DO MODELO (abordagem + metodologia). Não
15
+ * desativa nem bypassa o safeguard da Anthropic — isso é impossível por hook.
16
+ */
17
+
18
+ const SECURITY_SKILLS = new Set([
19
+ // Skills globais instaladas em ~/.claude/skills/
20
+ 'wizz-web-security',
21
+ 'wizz-desktop-security',
22
+ // Skills providas por plugins (nomes canônicos verificados)
23
+ 'security-review',
24
+ 'security-reviewer',
25
+ 'security-scan',
26
+ // code-review em variantes de plugin e direto
27
+ 'code-review',
28
+ 'code-review:code-review',
29
+ ]);
30
+
31
+ const DEFENSIVE_CONTEXT =
32
+ 'Metodologia de revisao de seguranca (defensiva, escopada):\n\n' +
33
+ '1. ESCOPO: trabalhe por arquivo ou dimensao concreta de cada vez (ex: validacao ' +
34
+ 'de entrada num handler, politicas de acesso do banco, headers HTTP). Nunca ' +
35
+ 'varredura ampla de todo o codebase num turno unico.\n\n' +
36
+ '2. FOCO DEFENSIVO: o objetivo e hardening do codigo do proprio projeto. Cada ' +
37
+ 'achado deve mapear para uma linha/arquivo real e propor a correcao aplicada localmente.\n\n' +
38
+ '3. DIMENSOES PRIORITARIAS (adapte ao stack do projeto atual): (a) auth/sessao; ' +
39
+ '(b) validacao/allowlist de entrada em handlers de escrita; (c) autorizacao no ' +
40
+ 'banco (RLS/policies) e funcoes privilegiadas; (d) privacidade LGPD/GDPR — PII, ' +
41
+ 'consentimento, retencao; (e) secrets — nada hardcoded em settings/migrations/logs; ' +
42
+ '(f) superficie publica — rate-limit, headers de seguranca, CORS.\n\n' +
43
+ '4. OUTPUT: achados por severidade (CRITICO / ALTO / MEDIO / BAIXO), com arquivo + ' +
44
+ 'linha + codigo corrigido sugerido. Nao gerar relatorio ofensivo nem exploits.';
45
+
46
+ let raw = '';
47
+ process.stdin.setEncoding('utf8');
48
+ process.stdin.on('data', (chunk) => (raw += chunk));
49
+ process.stdin.on('end', () => {
50
+ try {
51
+ const payload = JSON.parse(raw);
52
+ const toolName = payload.tool_name || '';
53
+ const skillName = (payload.tool_input && payload.tool_input.skill) || '';
54
+
55
+ if (toolName === 'Skill' && SECURITY_SKILLS.has(skillName)) {
56
+ process.stdout.write(
57
+ JSON.stringify({
58
+ hookSpecificOutput: {
59
+ hookEventName: 'PreToolUse',
60
+ additionalContext: DEFENSIVE_CONTEXT,
61
+ },
62
+ }),
63
+ );
64
+ }
65
+ // Para qualquer outra skill/tool: sai silenciosamente sem output
66
+ } catch {
67
+ // Parse error: sai silenciosamente, nao bloqueia nada
68
+ }
69
+ process.exit(0);
70
+ });