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.
- package/LICENSE +60 -30
- package/README.md +80 -31
- package/SECURITY.md +24 -0
- package/THIRD-PARTY-NOTICES.md +136 -0
- package/package.json +31 -17
- package/skills-registry.yaml +128 -7
- package/src/bmm-skills/1-analysis/research/wizz-domain-research/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/research/wizz-domain-research/domain-steps/step-06-research-synthesis.md +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-market-research/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-technical-research/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/research/wizz-technical-research/technical-steps/step-06-research-synthesis.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-agent-analyst/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/wizz-agent-tech-writer/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/wizz-document-project/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/wizz-document-project/workflows/deep-dive-instructions.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/workflows/full-scan-instructions.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-prfaq/SKILL.md +3 -4
- package/src/bmm-skills/1-analysis/wizz-prfaq/references/verdict.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-product-brief/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-agent-pm/SKILL.md +3 -4
- package/src/bmm-skills/2-plan-workflows/wizz-agent-ux-designer/SKILL.md +3 -4
- package/src/bmm-skills/2-plan-workflows/wizz-create-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-ux/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/SKILL.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-agent-architect/SKILL.md +3 -4
- package/src/bmm-skills/3-solutioning/wizz-architecture/SKILL.md +9 -9
- package/src/bmm-skills/3-solutioning/wizz-architecture/references/headless.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/SKILL.md +3 -4
- package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/steps/step-06-final-assessment.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-architecture/SKILL.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/SKILL.md +3 -4
- package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/steps/step-04-final-validation.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-generate-project-context/SKILL.md +3 -4
- package/src/bmm-skills/3-solutioning/wizz-generate-project-context/steps/step-03-complete.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-agent-dev/SKILL.md +3 -4
- package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/SKILL.md +3 -4
- package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/step-05-wrapup.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +3 -4
- package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +3 -8
- package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/blind-hunter.md +20 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-04-present.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-correct-course/SKILL.md +4 -5
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +4 -5
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +4 -5
- package/src/bmm-skills/4-implementation/wizz-investigate/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +4 -5
- package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +4 -5
- package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +10 -22
- package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/blind-hunter.md +20 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-05-present.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-oneshot.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-retrospective/SKILL.md +1 -2
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -6
- package/src/core-skills/_shared/handoff-protocol.md +9 -0
- package/src/core-skills/wizz-advanced-elicitation/SKILL.md +2 -2
- package/src/core-skills/wizz-brainstorming/SKILL.md +6 -6
- package/src/core-skills/wizz-brainstorming/references/converge.md +1 -1
- package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
- package/src/core-skills/wizz-brainstorming/references/headless.md +3 -3
- package/src/core-skills/wizz-brainstorming/references/mode-autonomous.md +1 -1
- package/src/core-skills/wizz-customize/SKILL.md +13 -10
- package/src/core-skills/wizz-forge-idea/SKILL.md +6 -6
- package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/scripts/resolve_personas.py +17 -1
- package/src/core-skills/wizz-party-mode/SKILL.md +3 -3
- package/src/core-skills/wizz-party-mode/references/create-party.md +1 -1
- package/src/core-skills/wizz-party-mode/references/party-memory.md +2 -2
- package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-party-mode/scripts/resolve_party.py +17 -1
- package/src/core-skills/wizz-review-adversarial-general/SKILL.md +1 -1
- package/src/core-skills/wizz-spec/SKILL.md +5 -5
- package/src/modules/lowticket/README.md +6 -6
- package/src/modules/lowticket/module.yaml +4 -1
- package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/SKILL.md +4 -4
- package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/references/copy-das-paginas.md +1 -1
- package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/SKILL.md +1 -1
- package/src/modules/lowticket/skills/{lowticket-minerador → wizz-lowticket-minerador}/SKILL.md +3 -3
- package/src/modules/lowticket/skills/{lowticket-minerador → wizz-lowticket-minerador}/references/rubrica.md +1 -1
- package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/SKILL.md +4 -4
- package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/SKILL.md +3 -3
- package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/references/reguas.md +1 -1
- package/src/modules/wizz/_shared/communication-rules.md +1 -1
- package/src/modules/wizz/_shared/despacho-barato.md +9 -0
- package/src/modules/wizz/_shared/token-economy.md +7 -0
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-ads/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-designer/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-growth/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +5 -5
- package/src/modules/wizz/agents/wizz-maestro/customize.toml +4 -8
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-memoria/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-qa/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-seo/customize.toml +1 -2
- package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-social/customize.toml +1 -2
- package/src/modules/wizz/module.yaml +3 -0
- package/src/modules/wizz/overrides/wizz-agent-analyst.toml +1 -2
- package/src/modules/wizz/overrides/wizz-agent-architect.toml +1 -2
- package/src/modules/wizz/overrides/wizz-agent-dev.toml +1 -2
- package/src/modules/wizz/overrides/wizz-agent-pm.toml +1 -2
- package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +1 -2
- package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +1 -2
- package/src/modules/wizz/subagents/codex/wizz-exec-haiku.toml +2 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-opus.toml +2 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +2 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-sonnet.toml +2 -0
- package/src/modules/wizz/subagents/gemini/wizz-exec-haiku.md +4 -1
- package/src/modules/wizz/subagents/gemini/wizz-exec-opus.md +4 -1
- package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +4 -1
- package/src/modules/wizz/subagents/gemini/wizz-exec-sonnet.md +4 -1
- package/src/modules/wizz/subagents/opencode/wizz-exec-haiku.md +4 -1
- package/src/modules/wizz/subagents/opencode/wizz-exec-opus.md +4 -1
- package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +4 -1
- package/src/modules/wizz/subagents/opencode/wizz-exec-sonnet.md +4 -1
- package/src/modules/wizz/subagents/spec.yaml +148 -0
- package/src/modules/wizz/subagents/wizz-exec-haiku.md +4 -1
- package/src/modules/wizz/subagents/wizz-exec-opus.md +4 -1
- package/src/modules/wizz/subagents/wizz-exec-review.md +4 -1
- package/src/modules/wizz/subagents/wizz-exec-sonnet.md +4 -1
- package/src/scripts/__pycache__/resolve_customization.cpython-314.pyc +0 -0
- package/src/scripts/memlog.js +368 -0
- package/src/scripts/resolve_customization.py +124 -15
- package/src/skills-lib/_shared/complexity-signal.md +14 -0
- package/src/skills-lib/wizz-canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
- package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
- package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
- package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
- package/src/skills-lib/wizz-impeccable/LICENSE.txt +202 -0
- package/src/skills-lib/wizz-offer-forge/SKILL.md +1 -1
- package/src/skills-lib/wizz-react-components/LICENSE.txt +202 -0
- package/src/skills-lib/wizz-router/SKILL.md +2 -2
- package/src/skills-lib/wizz-supabase-postgres-best-practices/LICENSE +21 -0
- package/src/skills-lib/wizz-taste-skill/SKILL.md +1 -1
- package/src/skills-lib/wizz-tracking-audit/SKILL.md +1 -1
- package/tools/fetch-assets.mjs +70 -38
- package/tools/hooks/README.md +22 -0
- package/tools/hooks/rtk-rewrite.sh +280 -0
- package/tools/hooks/security-defensive-context.js +70 -0
- package/tools/hooks/session-rules.js +368 -0
- package/tools/hooks/wizz-decision-trace.js +389 -0
- package/tools/hooks/wizz-router-enforce.js +258 -0
- package/tools/installer/banner.js +1 -1
- package/tools/installer/commands/doctor.js +124 -0
- package/tools/installer/commands/fetch-assets.js +7 -8
- package/tools/installer/commands/install.js +1 -1
- package/tools/installer/commands/resolve.js +95 -0
- package/tools/installer/core/doctor.js +648 -0
- package/tools/installer/core/hash-cache.js +156 -0
- package/tools/installer/core/help-catalog.js +4 -1
- package/tools/installer/core/hooks-settings.js +178 -0
- package/tools/installer/core/installer.js +297 -15
- package/tools/installer/core/legacy-warnings.js +0 -4
- package/tools/installer/core/manifest-generator.js +121 -43
- package/tools/installer/core/manifest.js +36 -32
- package/tools/installer/core/module-config-writer.js +4 -1
- package/tools/installer/core/python-check.js +60 -63
- package/tools/installer/core/quick-update.js +76 -43
- package/tools/installer/core/resolved-config.js +168 -0
- package/tools/installer/core/resolved-customizations.js +736 -0
- package/tools/installer/core/resolved-includes.js +262 -0
- package/tools/installer/core/resolved-schema.js +148 -0
- package/tools/installer/core/user-file-preservation.js +40 -8
- package/tools/installer/core/wizz-dir.js +117 -0
- package/tools/installer/core/yaml-cache.js +105 -0
- package/tools/installer/fs-native.js +97 -6
- package/tools/installer/ide/_config-driven.js +12 -75
- package/tools/installer/ide/platform-codes.js +111 -16
- package/tools/installer/ide/platform-codes.yaml +45 -100
- package/tools/installer/ide/shared/path-utils.js +6 -208
- package/tools/installer/install-messages.yaml +4 -14
- package/tools/installer/modules/channel-plan.js +15 -2
- package/tools/installer/modules/config-collector.js +762 -0
- package/tools/installer/modules/config-values.js +352 -0
- package/tools/installer/modules/custom-module-manager.js +161 -28
- package/tools/installer/modules/env-vars.js +119 -0
- package/tools/installer/modules/external-manager.js +133 -60
- package/tools/installer/modules/git-cache-utils.js +125 -0
- package/tools/installer/modules/module-catalog.js +565 -0
- package/tools/installer/modules/module-installer.js +618 -0
- package/tools/installer/modules/module-interface.js +86 -0
- package/tools/installer/modules/official-modules.js +98 -2172
- package/tools/installer/modules/pin-spec.js +125 -0
- package/tools/installer/modules/plugin-resolver.js +4 -0
- package/tools/installer/modules/skills-lib.js +3 -6
- package/tools/installer/prompts.js +0 -3
- package/tools/installer/ui.js +89 -54
- package/tools/installer/wizz-cli.js +1 -1
- package/tools/lib/frontmatter.js +139 -0
- package/tools/lib/sync-targets.mjs +49 -0
- package/tools/lib/walk.js +93 -0
- package/wizz-modules.yaml +9 -0
- package/src/scripts/__pycache__/memlog.cpython-313.pyc +0 -0
- package/src/scripts/memlog.py +0 -233
- package/src/scripts/tests/__pycache__/test_memlog.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/scripts/tests/test_memlog.py +0 -306
- package/src/skills-lib/wizz-huashu-design/assets/showcases/INDEX.md +0 -115
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-build.html +0 -235
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-pentagram.html +0 -229
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-takram.html +0 -288
- package/src/skills-lib/wizz-huashu-design/assets/showcases/cover/cover-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-build.html +0 -503
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-pentagram.html +0 -600
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-takram.html +0 -670
- package/src/skills-lib/wizz-huashu-design/assets/showcases/infographic/infographic-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-build.html +0 -382
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-pentagram.html +0 -536
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-takram.html +0 -497
- package/src/skills-lib/wizz-huashu-design/assets/showcases/ppt/ppt-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-build.html +0 -385
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html +0 -422
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-takram.html +0 -499
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-nav/ainav-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html +0 -562
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html +0 -548
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html +0 -696
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-build.html +0 -372
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html +0 -460
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-takram.html +0 -494
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-devdocs/devdocs-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-build.html +0 -367
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-pentagram.html +0 -368
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-takram.html +0 -459
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-homepage/homepage-takram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-build.html +0 -493
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-build.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-pentagram.html +0 -556
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-pentagram.png +0 -0
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-takram.html +0 -604
- package/src/skills-lib/wizz-huashu-design/assets/showcases/website-saas/saas-takram.png +0 -0
- package/tools/installer/file-ops.js +0 -204
- package/tools/installer/ide/shared/skill-manifest.js +0 -57
- package/tools/installer/yaml-format.js +0 -245
- package/web-bundles/README.md +0 -46
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +0 -86
- package/web-bundles/brainstorming-coach/SKILL.md +0 -83
- package/web-bundles/brainstorming-coach/brain-methods.csv +0 -62
- package/web-bundles/bundles.json +0 -139
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +0 -88
- package/web-bundles/market-and-industry-research/SKILL.md +0 -59
- package/web-bundles/prd-coach/INSTRUCTIONS.md +0 -86
- package/web-bundles/prd-coach/SKILL.md +0 -101
- package/web-bundles/prd-coach/prd-template.md +0 -165
- package/web-bundles/prd-coach/prd-validation-checklist.md +0 -135
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +0 -86
- package/web-bundles/prfaq-coach/SKILL.md +0 -139
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +0 -86
- package/web-bundles/product-brief-coach/SKILL.md +0 -113
- package/web-bundles/ux-coach/INSTRUCTIONS.md +0 -92
- package/web-bundles/ux-coach/SKILL.md +0 -187
- package/web-bundles/ux-coach/ux-validation.md +0 -100
- /package/src/modules/lowticket/skills/{lowticket-funil → wizz-lowticket-funil}/references/mapa-do-funil.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/CATALOGO.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/01-principios.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/02-diagnostico-funil.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/03-campanha-bidcap.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04-criativos.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04a-criativos-ia.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/04b-criativos-formatos.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/05-oferta.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06-pagina-vendas.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06a-instagram.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/06b-player-vsl.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/07-funil-upsell.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/07a-copy-humanizacao.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/08-pesquisa-publico.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/09-especialista-coproducao.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/10-levantar-caixa.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/11-checklist-roi.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12-mineracao-ofertas.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12a-mineracao-veredito.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12b-fabrica-de-ofertas.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/12c-anatomia-low-ticket.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/13-benchmarks-vsl.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/14-vocabulario.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/15-como-estender.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/17-rastreamento.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/18-copy-desejo-oferta.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/INDEX.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/guardrails.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/knowledge/pontos-em-aberto.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-metodologia → wizz-lowticket-metodologia}/references/swipe-file.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/references/metas-e-medicao.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-pagina → wizz-lowticket-pagina}/references/padroes-de-codigo.md +0 -0
- /package/src/modules/lowticket/skills/{lowticket-trafego → wizz-lowticket-trafego}/references/formato-do-diagnostico.md +0 -0
package/tools/fetch-assets.mjs
CHANGED
|
@@ -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
|
|
8
|
-
// é o
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
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
|
|
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
|
-
|
|
47
|
-
|
|
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: `${
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
160
|
-
|
|
182
|
+
for (const tmpFile of tmpFiles) {
|
|
183
|
+
extractTarGz(tmpFile, destDir);
|
|
184
|
+
}
|
|
161
185
|
} finally {
|
|
162
|
-
|
|
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
|
-
|
|
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
|
+
});
|