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
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
// session-rules.js — SessionStart hook
|
|
2
|
+
//
|
|
3
|
+
// Fonte de verdade: wizz-method/tools/hooks/. Instalar via `npm run sync:global`.
|
|
4
|
+
//
|
|
5
|
+
// Três responsabilidades, um processo só (SessionStart roda 1x por sessão):
|
|
6
|
+
//
|
|
7
|
+
// 1. Regras de comunicação, injetadas UMA vez por sessão (antes:
|
|
8
|
+
// no-narration-enforce repetia ~80 tokens em TODO prompt via
|
|
9
|
+
// UserPromptSubmit). Mesmo conteúdo, custo fixo por sessão.
|
|
10
|
+
//
|
|
11
|
+
// 2. Feature ativa: resolve o `active_feature` SOZINHO, sem o usuário
|
|
12
|
+
// precisar invocar `wizz-set-feature` e responder duas perguntas. Ordem:
|
|
13
|
+
// branch git (mais fresco que o config) > `_wizz/bmm/config.yaml` > nada.
|
|
14
|
+
// Custo zero quando não há `_wizz/` nem branch de feature: a linha
|
|
15
|
+
// simplesmente não é emitida.
|
|
16
|
+
//
|
|
17
|
+
// 3. Teto da auto-memória: o teto de 40 memórias e 8 KB de índice está
|
|
18
|
+
// escrito no CLAUDE.md global desde 2026-08-28, mas nada disparava a
|
|
19
|
+
// checagem — quem estoura só descobre quando o índice já custa caro em
|
|
20
|
+
// toda sessão. Aqui a checagem acontece sozinha, 1x por sessão, e só
|
|
21
|
+
// fala quando há o que dizer. Abaixo de 90% do teto: silêncio, zero token.
|
|
22
|
+
//
|
|
23
|
+
// Nunca bloqueia: qualquer erro vira "sem feature ativa" e a sessão segue.
|
|
24
|
+
|
|
25
|
+
const fs = require('node:fs');
|
|
26
|
+
const os = require('node:os');
|
|
27
|
+
const path = require('node:path');
|
|
28
|
+
|
|
29
|
+
// Cópia comprimida e INTENCIONAL da regra de comunicação. A fonte é
|
|
30
|
+
// src/modules/wizz/_shared/communication-rules.md; este hook precisa ser
|
|
31
|
+
// autocontido porque roda de ~/.claude/hooks, longe do repo. Editou lá,
|
|
32
|
+
// edite aqui: test/test-feature-context.js falha se as duas divergirem.
|
|
33
|
+
const RULES =
|
|
34
|
+
'REGRA DE COMUNICAÇÃO (permanente, não-negociável): não narrar o passo a passo ' +
|
|
35
|
+
'enquanto trabalha; pausar e perguntar SÓ em decisão do usuário ou risco ' +
|
|
36
|
+
'irreversível; fechar SEMPRE com resumo curto em tópicos, linguagem simples, ' +
|
|
37
|
+
'sem jargão; sem em-dashes; comunicação enxuta por default, expandir só sob demanda.';
|
|
38
|
+
|
|
39
|
+
// Branches que NUNCA viram feature: são linha principal, não trabalho nomeado.
|
|
40
|
+
const TRUNK = new Set(['main', 'master', 'develop', 'dev', 'staging', 'stage', 'prod', 'production', 'trunk', 'default', 'release']);
|
|
41
|
+
|
|
42
|
+
// Branch de release/versão não é feature: nomeia um corte do produto, não um trabalho.
|
|
43
|
+
const RELEASE_PREFIX = /^(release|rc|v)[/-]/i;
|
|
44
|
+
|
|
45
|
+
// Prefixos de convenção que descrevem o TIPO do trabalho, não a feature.
|
|
46
|
+
const TYPE_PREFIX = /^(feat|feature|fix|bugfix|hotfix|chore|refactor|docs|test|perf|ci|build|style)[/-]/i;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Normaliza um texto livre para o mesmo slug kebab-case que a skill
|
|
50
|
+
* `wizz-set-feature` grava, para branch e config nunca divergirem por formato.
|
|
51
|
+
* @param {string} raw
|
|
52
|
+
* @returns {string} slug kebab-case, ou '' se não sobrar nada utilizável
|
|
53
|
+
*/
|
|
54
|
+
function toSlug(raw) {
|
|
55
|
+
if (typeof raw !== 'string') return '';
|
|
56
|
+
return raw
|
|
57
|
+
.normalize('NFD')
|
|
58
|
+
.replaceAll(/[\u0300-\u036F]/g, '')
|
|
59
|
+
.toLowerCase()
|
|
60
|
+
.replaceAll(/[^a-z0-9]+/g, '-')
|
|
61
|
+
.replaceAll(/^-+|-+$/g, '')
|
|
62
|
+
.slice(0, 60);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Lê o branch atual sem subprocesso: `.git/HEAD` já traz o ref, e um read de
|
|
67
|
+
* arquivo é mais barato e mais seguro que um `git` no PATH (que pode nem existir).
|
|
68
|
+
* Sobe até 6 níveis para achar o `.git` de um subdiretório do repo.
|
|
69
|
+
* @param {string} cwd
|
|
70
|
+
* @returns {string} nome do branch, ou '' (detached HEAD, sem repo, erro)
|
|
71
|
+
*/
|
|
72
|
+
function readGitBranch(cwd) {
|
|
73
|
+
let dir = cwd;
|
|
74
|
+
for (let i = 0; i < 6; i++) {
|
|
75
|
+
const gitPath = path.join(dir, '.git');
|
|
76
|
+
try {
|
|
77
|
+
const stat = fs.statSync(gitPath);
|
|
78
|
+
let headFile = path.join(gitPath, 'HEAD');
|
|
79
|
+
if (stat.isFile()) {
|
|
80
|
+
// worktree/submódulo: `.git` é um arquivo `gitdir: <caminho>`
|
|
81
|
+
const m = /^gitdir:\s*(.+)$/m.exec(fs.readFileSync(gitPath, 'utf8'));
|
|
82
|
+
if (!m) return '';
|
|
83
|
+
const resolved = path.resolve(dir, m[1].trim());
|
|
84
|
+
headFile = path.join(resolved, 'HEAD');
|
|
85
|
+
}
|
|
86
|
+
const head = fs.readFileSync(headFile, 'utf8').trim();
|
|
87
|
+
const ref = /^ref:\s*refs\/heads\/(.+)$/.exec(head);
|
|
88
|
+
return ref ? ref[1] : ''; // detached HEAD => sem branch => sem feature
|
|
89
|
+
} catch {
|
|
90
|
+
// segue subindo
|
|
91
|
+
}
|
|
92
|
+
const parent = path.dirname(dir);
|
|
93
|
+
if (parent === dir) break;
|
|
94
|
+
dir = parent;
|
|
95
|
+
}
|
|
96
|
+
return '';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Deriva um slug de feature do nome do branch. Branch de tronco e branch sem
|
|
101
|
+
* nome útil devolvem '' (nenhuma feature), nunca um slug inventado.
|
|
102
|
+
* @param {string} branch
|
|
103
|
+
* @returns {string}
|
|
104
|
+
*/
|
|
105
|
+
function featureFromBranch(branch) {
|
|
106
|
+
if (!branch) return '';
|
|
107
|
+
if (TRUNK.has(branch.toLowerCase())) return '';
|
|
108
|
+
if (RELEASE_PREFIX.test(branch)) return '';
|
|
109
|
+
const stripped = branch.replace(TYPE_PREFIX, '');
|
|
110
|
+
const slug = toSlug(stripped);
|
|
111
|
+
if (!slug || TRUNK.has(slug)) return '';
|
|
112
|
+
// Branch que é só um número de issue não descreve feature nenhuma.
|
|
113
|
+
if (/^\d+$/.test(slug)) return '';
|
|
114
|
+
return slug;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Lê `active_feature` do config do módulo bmm. Parser de 1 chave de propósito:
|
|
119
|
+
* o hook não pode depender de uma lib de YAML (roda fora do node_modules do repo).
|
|
120
|
+
* @param {string} cwd
|
|
121
|
+
* @returns {{slug: string, configPath: string}} slug '' quando ausente/vazio
|
|
122
|
+
*/
|
|
123
|
+
function readConfigFeature(cwd) {
|
|
124
|
+
const configPath = path.join(cwd, '_wizz', 'bmm', 'config.yaml');
|
|
125
|
+
try {
|
|
126
|
+
const text = fs.readFileSync(configPath, 'utf8');
|
|
127
|
+
const m = /^active_feature:\s*(.*)$/m.exec(text);
|
|
128
|
+
if (!m) return { slug: '', configPath };
|
|
129
|
+
const value = m[1]
|
|
130
|
+
.replace(/#.*$/, '')
|
|
131
|
+
.trim()
|
|
132
|
+
.replaceAll(/^["']|["']$/g, '');
|
|
133
|
+
return { slug: toSlug(value), configPath };
|
|
134
|
+
} catch {
|
|
135
|
+
return { slug: '', configPath };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Acha a raiz do projeto Wizz (a pasta que contém `_wizz/`) subindo do cwd.
|
|
141
|
+
* O agente costuma rodar de uma subpasta, então checar só o cwd erraria.
|
|
142
|
+
* @param {string} cwd
|
|
143
|
+
* @returns {string} caminho da raiz, ou '' se não for projeto Wizz
|
|
144
|
+
*/
|
|
145
|
+
function findWizzRoot(cwd) {
|
|
146
|
+
let dir = cwd;
|
|
147
|
+
for (let i = 0; i < 6; i++) {
|
|
148
|
+
try {
|
|
149
|
+
if (fs.existsSync(path.join(dir, '_wizz'))) return dir;
|
|
150
|
+
} catch {
|
|
151
|
+
// ignora e segue subindo
|
|
152
|
+
}
|
|
153
|
+
const parent = path.dirname(dir);
|
|
154
|
+
if (parent === dir) break;
|
|
155
|
+
dir = parent;
|
|
156
|
+
}
|
|
157
|
+
return '';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Monta a linha de contexto da feature. Devolve '' quando não há feature
|
|
162
|
+
* nenhuma. Silêncio custa zero token e é o caso comum fora de projeto Wizz.
|
|
163
|
+
* @param {string} cwd
|
|
164
|
+
* @returns {string}
|
|
165
|
+
*/
|
|
166
|
+
function buildFeatureContext(cwd) {
|
|
167
|
+
const wizzRoot = findWizzRoot(cwd);
|
|
168
|
+
const isWizzProject = Boolean(wizzRoot);
|
|
169
|
+
const fromConfig = isWizzProject ? readConfigFeature(wizzRoot) : { slug: '', configPath: '' };
|
|
170
|
+
const fromBranch = featureFromBranch(readGitBranch(cwd));
|
|
171
|
+
|
|
172
|
+
// O branch ganha do config: é o que descreve o trabalho de AGORA. O config
|
|
173
|
+
// pode ter ficado numa feature antiga que ninguém lembrou de trocar.
|
|
174
|
+
const active = fromBranch || fromConfig.slug;
|
|
175
|
+
if (!active) return '';
|
|
176
|
+
|
|
177
|
+
const parts = [
|
|
178
|
+
`FEATURE ATIVA: ${active}` + (fromBranch ? ' (derivada do branch git).' : ' (do config).'),
|
|
179
|
+
'Use como contexto sem perguntar nada:',
|
|
180
|
+
isWizzProject
|
|
181
|
+
? `artefatos de planejamento e implementação vão para as subpastas ${active}/;`
|
|
182
|
+
: 'não é projeto Wizz, então não há subpasta de artefato;',
|
|
183
|
+
`memória gravada nesta sessão leva tema/feature "${active}".`,
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
if (fromBranch && isWizzProject && fromConfig.slug !== fromBranch) {
|
|
187
|
+
parts.push(
|
|
188
|
+
`O config (_wizz/bmm/config.yaml) ainda diz "${fromConfig.slug || 'vazio'}": grave "${active}" nele na primeira vez que escrever um artefato, e avise em UMA linha.`,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
parts.push(
|
|
193
|
+
'NÃO peça confirmação de feature. Só invoque a skill wizz-set-feature se o usuário pedir explicitamente para trocar, ou se houver ambiguidade real entre duas features abertas.',
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
return parts.join(' ');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ── Teto da auto-memória ────────────────────────────────────────────────
|
|
200
|
+
// Fonte do teto: ~/.claude/CLAUDE.md ("Teto da auto-memória", 2026-08-28).
|
|
201
|
+
// Mudou lá, mude aqui: test/test-feature-context.js falha se divergirem.
|
|
202
|
+
const MEMORY_MAX_FILES = 40;
|
|
203
|
+
const MEMORY_MAX_INDEX_BYTES = 8 * 1024;
|
|
204
|
+
// Avisa ANTES de estourar. Estourar já significa sessões caras rodando faz
|
|
205
|
+
// tempo; o valor do aviso está em chegar enquanto a poda ainda é barata.
|
|
206
|
+
const MEMORY_WARN_RATIO = 0.9;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Resolve o diretório de auto-memória do projeto. O slug histórico do Claude
|
|
210
|
+
* Code troca `/` e `.` por `-`, mas nem sempre normalizou espaço do mesmo
|
|
211
|
+
* jeito, então há um fallback por basename. O fallback só vale quando há UM
|
|
212
|
+
* candidato: aviso apontando para o projeto errado é pior que aviso nenhum.
|
|
213
|
+
* @param {string} cwd
|
|
214
|
+
* @returns {string} caminho do diretório, ou '' quando não há memória
|
|
215
|
+
*/
|
|
216
|
+
function resolveMemoryDir(cwd) {
|
|
217
|
+
try {
|
|
218
|
+
const base = path.join(os.homedir(), '.claude', 'projects');
|
|
219
|
+
const direct = path.join(base, cwd.replaceAll(/[/.]/g, '-'), 'memory');
|
|
220
|
+
if (fs.existsSync(direct)) return direct;
|
|
221
|
+
|
|
222
|
+
const name = path.basename(cwd);
|
|
223
|
+
if (!name) return '';
|
|
224
|
+
const matches = fs
|
|
225
|
+
.readdirSync(base)
|
|
226
|
+
.filter((entry) => entry.endsWith(`-${name}`) || entry.endsWith(`-${name.replaceAll(/[ .]/g, '-')}`))
|
|
227
|
+
.map((entry) => path.join(base, entry, 'memory'))
|
|
228
|
+
.filter((dir) => fs.existsSync(dir));
|
|
229
|
+
return matches.length === 1 ? matches[0] : '';
|
|
230
|
+
} catch {
|
|
231
|
+
return '';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Conta as memórias e mede o índice. `_archive/` fica de fora de propósito:
|
|
237
|
+
* é exatamente para onde a poda move os originais, então contá-lo faria o
|
|
238
|
+
* aviso nunca sumir depois de resolvido.
|
|
239
|
+
* @param {string} memoryDir
|
|
240
|
+
* @returns {{files: number, indexBytes: number}}
|
|
241
|
+
*/
|
|
242
|
+
function measureMemory(memoryDir) {
|
|
243
|
+
let files = 0;
|
|
244
|
+
let indexBytes = 0;
|
|
245
|
+
try {
|
|
246
|
+
for (const entry of fs.readdirSync(memoryDir, { withFileTypes: true })) {
|
|
247
|
+
if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
|
|
248
|
+
if (entry.name === 'MEMORY.md') {
|
|
249
|
+
indexBytes = fs.statSync(path.join(memoryDir, entry.name)).size;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
files++;
|
|
253
|
+
}
|
|
254
|
+
} catch {
|
|
255
|
+
return { files: 0, indexBytes: 0 };
|
|
256
|
+
}
|
|
257
|
+
return { files, indexBytes };
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Monta o aviso a partir da medida. Parte pura de propósito: é o que decide o
|
|
262
|
+
* silêncio, então precisa ser testável sem montar um ~/.claude falso.
|
|
263
|
+
* Devolve '' abaixo de 90% dos dois tetos — o caso comum, e o silêncio é o
|
|
264
|
+
* que mantém o custo em zero.
|
|
265
|
+
* @param {number} files
|
|
266
|
+
* @param {number} indexBytes
|
|
267
|
+
* @returns {string}
|
|
268
|
+
*/
|
|
269
|
+
function formatMemoryCeiling(files, indexBytes) {
|
|
270
|
+
if (files === 0 && indexBytes === 0) return '';
|
|
271
|
+
|
|
272
|
+
const over = files > MEMORY_MAX_FILES || indexBytes > MEMORY_MAX_INDEX_BYTES;
|
|
273
|
+
const near =
|
|
274
|
+
files >= Math.floor(MEMORY_MAX_FILES * MEMORY_WARN_RATIO) || indexBytes >= Math.floor(MEMORY_MAX_INDEX_BYTES * MEMORY_WARN_RATIO);
|
|
275
|
+
if (!over && !near) return '';
|
|
276
|
+
|
|
277
|
+
const kb = (indexBytes / 1024).toFixed(1);
|
|
278
|
+
const estado = `${files}/${MEMORY_MAX_FILES} memórias e índice de ${kb}/8 KB`;
|
|
279
|
+
|
|
280
|
+
return over
|
|
281
|
+
? `TETO DA AUTO-MEMÓRIA ESTOURADO neste projeto: ${estado}. Acima do teto o índice custa mais token por sessão do que economiza. Antes de gravar qualquer memória nova, pode: funda por subsistema (N memórias do mesmo tema viram 1 arquivo com seções) e mova os originais para \`_archive/\`, que não entra no índice. Nunca apague. Método em project_poda_automemoria_plano.`
|
|
282
|
+
: `AUTO-MEMÓRIA PERTO DO TETO neste projeto: ${estado}. Ainda cabe, mas ao gravar memória nova prefira ATUALIZAR um registro existente a criar um segundo, e verifique se o fato não pertence a outra camada (decisão e estado de projeto são do Cérebro, não daqui).`;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Resolve, mede e formata. É o que o hook chama; a decisão de falar ou calar
|
|
287
|
+
* mora em formatMemoryCeiling.
|
|
288
|
+
* @param {string} cwd
|
|
289
|
+
* @returns {string}
|
|
290
|
+
*/
|
|
291
|
+
function buildMemoryCeilingContext(cwd) {
|
|
292
|
+
const memoryDir = resolveMemoryDir(cwd);
|
|
293
|
+
if (!memoryDir) return '';
|
|
294
|
+
const { files, indexBytes } = measureMemory(memoryDir);
|
|
295
|
+
return formatMemoryCeiling(files, indexBytes);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Só lê stdin quando o hook é invocado direto pelo Claude Code. Sob `require`
|
|
299
|
+
// (os testes), o módulo expõe as funções puras sem consumir stdin nem sair.
|
|
300
|
+
if (require.main === module) {
|
|
301
|
+
let input = '';
|
|
302
|
+
const stdinTimeout = setTimeout(() => finish(''), 3000);
|
|
303
|
+
process.stdin.setEncoding('utf8');
|
|
304
|
+
process.stdin.on('data', (chunk) => (input += chunk));
|
|
305
|
+
process.stdin.on('end', () => {
|
|
306
|
+
clearTimeout(stdinTimeout);
|
|
307
|
+
finish(input);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function finish(raw) {
|
|
312
|
+
let context = RULES;
|
|
313
|
+
|
|
314
|
+
// Um cwd só para as duas resoluções: o do payload manda, porque o
|
|
315
|
+
// process.cwd() do hook pode não ser o projeto da sessão. Feature e teto
|
|
316
|
+
// de memória olhando projetos diferentes seria pior que não avisar.
|
|
317
|
+
let cwd = process.cwd();
|
|
318
|
+
try {
|
|
319
|
+
const payload = JSON.parse(raw || '{}');
|
|
320
|
+
if (payload && typeof payload.cwd === 'string' && payload.cwd) cwd = payload.cwd;
|
|
321
|
+
} catch {
|
|
322
|
+
// payload ausente ou inválido: cai no cwd do processo
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
const feature = buildFeatureContext(cwd);
|
|
327
|
+
if (feature) context += `\n\n${feature}`;
|
|
328
|
+
} catch {
|
|
329
|
+
// resolução de feature NUNCA derruba as regras de comunicação
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
try {
|
|
333
|
+
const ceiling = buildMemoryCeilingContext(cwd);
|
|
334
|
+
if (ceiling) context += `\n\n${ceiling}`;
|
|
335
|
+
} catch {
|
|
336
|
+
// teto da memória é aviso, não gate: erro aqui não afeta o resto
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
try {
|
|
340
|
+
process.stdout.write(
|
|
341
|
+
JSON.stringify({
|
|
342
|
+
hookSpecificOutput: {
|
|
343
|
+
hookEventName: 'SessionStart',
|
|
344
|
+
additionalContext: context,
|
|
345
|
+
},
|
|
346
|
+
}),
|
|
347
|
+
);
|
|
348
|
+
} catch {
|
|
349
|
+
// nunca bloquear
|
|
350
|
+
}
|
|
351
|
+
process.exit(0);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
module.exports = {
|
|
355
|
+
MEMORY_MAX_FILES,
|
|
356
|
+
MEMORY_MAX_INDEX_BYTES,
|
|
357
|
+
MEMORY_WARN_RATIO,
|
|
358
|
+
resolveMemoryDir,
|
|
359
|
+
measureMemory,
|
|
360
|
+
formatMemoryCeiling,
|
|
361
|
+
buildMemoryCeilingContext,
|
|
362
|
+
toSlug,
|
|
363
|
+
featureFromBranch,
|
|
364
|
+
readConfigFeature,
|
|
365
|
+
findWizzRoot,
|
|
366
|
+
buildFeatureContext,
|
|
367
|
+
readGitBranch,
|
|
368
|
+
};
|