wizz-method 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +9 -9
- package/README.md +4 -4
- package/build/artifacts/llms-full.txt +218 -218
- package/build/artifacts/llms.txt +4 -4
- package/build/site/explanation/advanced-elicitation/index.html +2 -2
- package/build/site/explanation/adversarial-review/index.html +2 -2
- package/build/site/explanation/analysis-phase/index.html +2 -2
- package/build/site/explanation/brainstorming/index.html +2 -2
- package/build/site/explanation/checkpoint-preview/index.html +2 -2
- package/build/site/explanation/established-projects-faq/index.html +2 -2
- package/build/site/explanation/forensic-investigation/index.html +2 -2
- package/build/site/explanation/named-agents/index.html +6 -6
- package/build/site/explanation/party-mode/index.html +3 -3
- package/build/site/explanation/preventing-agent-conflicts/index.html +2 -2
- package/build/site/explanation/project-context/index.html +2 -2
- package/build/site/explanation/quick-dev/index.html +2 -2
- package/build/site/explanation/web-bundles/index.html +2 -2
- package/build/site/explanation/why-solutioning-matters/index.html +2 -2
- package/build/site/how-to/{customize-bmad → customize-wizz}/index.html +6 -6
- package/build/site/how-to/established-projects/index.html +2 -2
- package/build/site/how-to/{expand-bmad-for-your-org → expand-wizz-for-your-org}/index.html +7 -7
- package/build/site/how-to/{get-answers-about-bmad → get-answers-about-wizz}/index.html +3 -3
- package/build/site/how-to/install-custom-modules/index.html +3 -3
- package/build/site/how-to/{install-bmad → install-wizz}/index.html +6 -6
- package/build/site/how-to/non-interactive-installation/index.html +3 -3
- package/build/site/how-to/project-context/index.html +2 -2
- package/build/site/how-to/quick-fixes/index.html +2 -2
- package/build/site/how-to/shard-large-documents/index.html +2 -2
- package/build/site/how-to/upgrade-to-v6/index.html +8 -8
- package/build/site/how-to/use-web-bundles/index.html +2 -2
- package/build/site/index.html +3 -3
- package/build/site/llms-full.txt +218 -218
- package/build/site/llms.txt +4 -4
- package/build/site/pagefind/fragment/en_296ddb9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_583316f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_67825a4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/{en_41cab15.pf_fragment → en_887ce56.pf_fragment} +0 -0
- package/build/site/pagefind/fragment/en_92d7cc7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/{en_56b1635.pf_fragment → en_9b57d7d.pf_fragment} +0 -0
- package/build/site/pagefind/fragment/en_ba9fb37.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_bfc56b6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_c6d9e48.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_cdd885c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_d890205.pf_fragment +0 -0
- package/build/site/pagefind/index/en_5b9d8c6.pf_index +0 -0
- package/build/site/pagefind/index/en_868614c.pf_index +0 -0
- package/build/site/pagefind/index/en_e4f9bff.pf_index +0 -0
- package/build/site/pagefind/pagefind-entry.json +1 -1
- package/build/site/pagefind/pagefind.en_4e69d7f053.pf_meta +0 -0
- package/build/site/reference/agents/index.html +2 -2
- package/build/site/reference/commands/index.html +3 -3
- package/build/site/reference/core-tools/index.html +3 -3
- package/build/site/reference/modules/index.html +4 -4
- package/build/site/reference/testing/index.html +2 -2
- package/build/site/reference/workflow-map/index.html +2 -2
- package/build/site/roadmap/index.html +2 -2
- package/build/site/sitemap-0.xml +1 -1
- package/build/site/tutorials/getting-started/index.html +4 -4
- package/build/site/workflow-map-diagram-fr.html +2 -2
- package/package.json +11 -9
- package/removals.txt +46 -46
- package/skills-registry.yaml +318 -0
- package/src/bmm-skills/1-analysis/research/wizz-domain-research/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-market-research/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-technical-research/customize.toml +2 -1
- package/src/bmm-skills/1-analysis/wizz-agent-analyst/customize.toml +2 -2
- package/src/bmm-skills/1-analysis/wizz-agent-tech-writer/customize.toml +2 -2
- package/src/bmm-skills/1-analysis/wizz-document-project/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/index-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/project-overview-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/source-tree-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-prfaq/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/wizz-product-brief/SKILL.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-product-brief/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-agent-pm/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-agent-ux-designer/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-create-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-create-prd/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-prd/SKILL.md +3 -3
- package/src/bmm-skills/2-plan-workflows/wizz-prd/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-ux/SKILL.md +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-agent-architect/customize.toml +2 -2
- package/src/bmm-skills/3-solutioning/wizz-architecture/SKILL.md +2 -2
- package/src/bmm-skills/3-solutioning/wizz-architecture/customize.toml +4 -2
- package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-architecture/SKILL.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-architecture/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-generate-project-context/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-agent-dev/customize.toml +3 -2
- package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-correct-course/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +2 -2
- package/src/bmm-skills/4-implementation/wizz-create-story/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-investigate/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +7 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-01-clarify-and-route.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-retrospective/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
- package/src/bmm-skills/4-implementation/wizz-sprint-status/customize.toml +1 -1
- package/src/bmm-skills/module-help.csv +32 -32
- package/src/bmm-skills/module.yaml +1 -1
- package/src/core-skills/module-help.csv +3 -3
- package/src/core-skills/module.yaml +4 -4
- package/src/core-skills/wizz-brainstorming/SKILL.md +1 -1
- package/src/core-skills/wizz-brainstorming/analysis/catalog-analysis.md +4 -4
- package/src/core-skills/wizz-brainstorming/assets/brain-selector.html +5 -5
- package/src/core-skills/wizz-brainstorming/customize.toml +1 -1
- package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
- package/src/core-skills/wizz-brainstorming/scripts/brain.py +5 -5
- package/src/core-skills/wizz-brainstorming/scripts/tests/test_brain.py +1 -1
- package/src/core-skills/wizz-brainstorming/scripts/tests/test_memlog.py +3 -3
- package/src/core-skills/wizz-customize/SKILL.md +6 -6
- package/src/core-skills/wizz-customize/scripts/list_customizable_skills.py +3 -3
- package/src/core-skills/wizz-customize/scripts/tests/test_list_customizable_skills.py +13 -13
- package/src/core-skills/wizz-editorial-review-prose/SKILL.md +20 -45
- package/src/core-skills/wizz-editorial-review-structure/SKILL.md +1 -1
- package/src/core-skills/wizz-help/SKILL.md +3 -3
- package/src/core-skills/wizz-party-mode/SKILL.md +5 -3
- package/src/core-skills/wizz-party-mode/customize.toml +896 -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 +2 -2
- package/src/core-skills/wizz-party-mode/scripts/tests/test-resolve_party.py +1 -1
- package/src/core-skills/wizz-review-adversarial-general/SKILL.md +23 -12
- package/src/core-skills/wizz-spec/SKILL.md +3 -3
- package/src/core-skills/wizz-spec/customize.toml +2 -2
- package/src/modules/wizz/README.md +5 -5
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +48 -24
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-analyst.toml → wizz-agent-analyst.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-architect.toml → wizz-agent-architect.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-dev.toml → wizz-agent-dev.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-pm.toml → wizz-agent-pm.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-tech-writer.toml → wizz-agent-tech-writer.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-ux-designer.toml → wizz-agent-ux-designer.toml} +1 -1
- package/src/modules/wizz/scripts/wizz-init.mjs +7 -7
- package/src/scripts/resolve_config.py +7 -7
- package/src/scripts/resolve_customization.py +2 -2
- package/src/scripts/tests/test_memlog.py +1 -1
- package/src/skills-lib/ab-test-setup/SKILL.md +266 -0
- package/src/skills-lib/ab-test-setup/evals/evals.json +105 -0
- package/src/skills-lib/ab-test-setup/references/sample-size-guide.md +263 -0
- package/src/skills-lib/ab-test-setup/references/test-templates.md +277 -0
- package/src/skills-lib/ad-creative/SKILL.md +362 -0
- package/src/skills-lib/ad-creative/evals/evals.json +90 -0
- package/src/skills-lib/ad-creative/references/generative-tools.md +637 -0
- package/src/skills-lib/ad-creative/references/platform-specs.md +213 -0
- package/src/skills-lib/adversarial-reviewer/SKILL.md +122 -0
- package/src/skills-lib/agent-browser/SKILL.md +139 -0
- package/src/skills-lib/ai-seo/SKILL.md +398 -0
- package/src/skills-lib/ai-seo/evals/evals.json +90 -0
- package/src/skills-lib/ai-seo/references/content-patterns.md +285 -0
- package/src/skills-lib/ai-seo/references/platform-ranking-factors.md +152 -0
- package/src/skills-lib/analytics-tracking/SKILL.md +309 -0
- package/src/skills-lib/analytics-tracking/evals/evals.json +90 -0
- package/src/skills-lib/analytics-tracking/references/event-library.md +260 -0
- package/src/skills-lib/analytics-tracking/references/ga4-implementation.md +300 -0
- package/src/skills-lib/analytics-tracking/references/gtm-implementation.md +390 -0
- package/src/skills-lib/auth-and-secrets/SKILL.md +82 -0
- package/src/skills-lib/caching-and-queues/SKILL.md +58 -0
- package/src/skills-lib/cerebro/SKILL.md +368 -0
- package/src/skills-lib/churn-prevention/SKILL.md +424 -0
- package/src/skills-lib/churn-prevention/evals/evals.json +93 -0
- package/src/skills-lib/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/src/skills-lib/churn-prevention/references/dunning-playbook.md +408 -0
- package/src/skills-lib/cloud-and-infra/SKILL.md +36 -0
- package/src/skills-lib/cold-email/SKILL.md +158 -0
- package/src/skills-lib/cold-email/evals/evals.json +94 -0
- package/src/skills-lib/cold-email/references/benchmarks.md +83 -0
- package/src/skills-lib/cold-email/references/follow-up-sequences.md +81 -0
- package/src/skills-lib/cold-email/references/frameworks.md +90 -0
- package/src/skills-lib/cold-email/references/personalization.md +79 -0
- package/src/skills-lib/cold-email/references/subject-lines.md +53 -0
- package/src/skills-lib/competitor-alternatives/SKILL.md +256 -0
- package/src/skills-lib/competitor-alternatives/evals/evals.json +93 -0
- package/src/skills-lib/competitor-alternatives/references/content-architecture.md +271 -0
- package/src/skills-lib/competitor-alternatives/references/templates.md +223 -0
- package/src/skills-lib/content-strategy/SKILL.md +359 -0
- package/src/skills-lib/content-strategy/evals/evals.json +90 -0
- package/src/skills-lib/copy-editing/SKILL.md +447 -0
- package/src/skills-lib/copy-editing/evals/evals.json +89 -0
- package/src/skills-lib/copy-editing/references/plain-english-alternatives.md +394 -0
- package/src/skills-lib/copywriting/SKILL.md +252 -0
- package/src/skills-lib/copywriting/evals/evals.json +111 -0
- package/src/skills-lib/copywriting/references/copy-frameworks.md +344 -0
- package/src/skills-lib/copywriting/references/natural-transitions.md +272 -0
- package/src/skills-lib/database-and-deps/SKILL.md +80 -0
- package/src/skills-lib/database-scaling/SKILL.md +44 -0
- package/src/skills-lib/decision-maker/SKILL.md +534 -0
- package/src/skills-lib/desktop-security/SKILL.md +43 -0
- package/src/skills-lib/email-sequence/SKILL.md +309 -0
- package/src/skills-lib/email-sequence/evals/evals.json +93 -0
- package/src/skills-lib/email-sequence/references/copy-guidelines.md +113 -0
- package/src/skills-lib/email-sequence/references/email-types.md +515 -0
- package/src/skills-lib/email-sequence/references/sequence-templates.md +168 -0
- package/src/skills-lib/enhance-prompt/README.md +34 -0
- package/src/skills-lib/enhance-prompt/SKILL.md +204 -0
- package/src/skills-lib/enhance-prompt/references/KEYWORDS.md +114 -0
- package/src/skills-lib/find-skills/SKILL.md +181 -0
- package/src/skills-lib/form-cro/SKILL.md +429 -0
- package/src/skills-lib/form-cro/evals/evals.json +90 -0
- package/src/skills-lib/free-tool-strategy/SKILL.md +178 -0
- package/src/skills-lib/free-tool-strategy/evals/evals.json +90 -0
- package/src/skills-lib/free-tool-strategy/references/tool-types.md +217 -0
- package/src/skills-lib/graphify/.graphify_version +1 -0
- package/src/skills-lib/graphify/SKILL.md +1217 -0
- package/src/skills-lib/huashu-design/LICENSE +21 -0
- package/src/skills-lib/huashu-design/README.en.md +309 -0
- package/src/skills-lib/huashu-design/README.md +348 -0
- package/src/skills-lib/huashu-design/SKILL.md +631 -0
- package/src/skills-lib/huashu-design/assets/android_frame.jsx +175 -0
- package/src/skills-lib/huashu-design/assets/animations.jsx +348 -0
- package/src/skills-lib/huashu-design/assets/banner.svg +198 -0
- package/src/skills-lib/huashu-design/assets/bgm-ad.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/bgm-educational-alt.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/bgm-educational.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/bgm-tech.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/bgm-tutorial-alt.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/bgm-tutorial.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/browser_window.jsx +166 -0
- package/src/skills-lib/huashu-design/assets/deck_index.html +348 -0
- package/src/skills-lib/huashu-design/assets/deck_stage.js +420 -0
- package/src/skills-lib/huashu-design/assets/design_canvas.jsx +205 -0
- package/src/skills-lib/huashu-design/assets/director-notes-samples/launch-film-30s-sample.md +1713 -0
- package/src/skills-lib/huashu-design/assets/ios_frame.jsx +192 -0
- package/src/skills-lib/huashu-design/assets/macos_window.jsx +96 -0
- package/src/skills-lib/huashu-design/assets/narration_stage.jsx +476 -0
- package/src/skills-lib/huashu-design/assets/personal-asset-index.example.json +71 -0
- package/src/skills-lib/huashu-design/assets/sfx/container/card-flip.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/container/card-snap.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/container/modal-open.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/container/stack-collapse.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/feedback/achievement.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/feedback/error-tone.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/feedback/notification-pop.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/feedback/success-chime.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/impact/brand-stamp.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/impact/drop-thud.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal-v2.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/keyboard/delete-key.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/keyboard/enter.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/keyboard/space-tap.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/keyboard/type-fast.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/keyboard/type.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/magic/ai-process.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/magic/sparkle.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/magic/transform.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/progress/complete-done.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/progress/generate-start.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/progress/loading-tick.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/terminal/command-execute.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/terminal/cursor-blink.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/terminal/output-appear.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/transition/dissolve.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/transition/slide-in.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/transition/swipe-horizontal.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh-fast.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/click-soft.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/click.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/focus.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/hover-subtle.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/tap-finger.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/sfx/ui/toggle-on.mp3 +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/INDEX.md +115 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.html +235 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.html +229 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.html +288 -0
- package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.html +503 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.html +600 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.html +670 -0
- package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.html +382 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.html +536 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.html +497 -0
- package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.html +385 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html +422 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.html +499 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html +562 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html +548 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html +696 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.html +372 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html +460 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.html +494 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.html +367 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.html +368 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.html +459 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.html +493 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.html +556 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.png +0 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.html +604 -0
- package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.png +0 -0
- package/src/skills-lib/huashu-design/demos/c1-ios-prototype-en.html +1145 -0
- package/src/skills-lib/huashu-design/demos/c1-ios-prototype.html +1142 -0
- package/src/skills-lib/huashu-design/demos/c2-slides-pptx-en.html +1055 -0
- package/src/skills-lib/huashu-design/demos/c2-slides-pptx.html +1055 -0
- package/src/skills-lib/huashu-design/demos/c3-motion-design-en.html +1134 -0
- package/src/skills-lib/huashu-design/demos/c3-motion-design.html +1134 -0
- package/src/skills-lib/huashu-design/demos/c4-tweaks-en.html +989 -0
- package/src/skills-lib/huashu-design/demos/c4-tweaks.html +989 -0
- package/src/skills-lib/huashu-design/demos/c5-infographic-en.html +816 -0
- package/src/skills-lib/huashu-design/demos/c5-infographic.html +813 -0
- package/src/skills-lib/huashu-design/demos/c6-expert-review-en.html +885 -0
- package/src/skills-lib/huashu-design/demos/c6-expert-review.html +894 -0
- package/src/skills-lib/huashu-design/demos/hero-animation-v10-en.html +1498 -0
- package/src/skills-lib/huashu-design/demos/md-html-narration/md-html-demo.html +615 -0
- package/src/skills-lib/huashu-design/demos/md-html-narration/script.md +69 -0
- package/src/skills-lib/huashu-design/demos/voiceover-demo/script.md +17 -0
- package/src/skills-lib/huashu-design/demos/voiceover-demo//344/273/200/344/271/210/346/230/257token.html +201 -0
- package/src/skills-lib/huashu-design/demos/w1-brand-protocol-en.html +684 -0
- package/src/skills-lib/huashu-design/demos/w1-brand-protocol.html +696 -0
- package/src/skills-lib/huashu-design/demos/w2-junior-designer-en.html +983 -0
- package/src/skills-lib/huashu-design/demos/w2-junior-designer.html +994 -0
- package/src/skills-lib/huashu-design/demos/w3-fallback-advisor-en.html +647 -0
- package/src/skills-lib/huashu-design/demos/w3-fallback-advisor.html +704 -0
- package/src/skills-lib/huashu-design/package-lock.json +846 -0
- package/src/skills-lib/huashu-design/package.json +8 -0
- package/src/skills-lib/huashu-design/references/animation-best-practices.md +506 -0
- package/src/skills-lib/huashu-design/references/animation-pitfalls.md +402 -0
- package/src/skills-lib/huashu-design/references/animations.md +249 -0
- package/src/skills-lib/huashu-design/references/apple-gallery-showcase.md +338 -0
- package/src/skills-lib/huashu-design/references/audio-design-rules.md +260 -0
- package/src/skills-lib/huashu-design/references/brand-asset-protocol.md +250 -0
- package/src/skills-lib/huashu-design/references/cinematic-patterns.md +264 -0
- package/src/skills-lib/huashu-design/references/content-guidelines.md +260 -0
- package/src/skills-lib/huashu-design/references/critique-guide.md +199 -0
- package/src/skills-lib/huashu-design/references/design-context.md +213 -0
- package/src/skills-lib/huashu-design/references/design-styles.md +370 -0
- package/src/skills-lib/huashu-design/references/editable-pptx.md +334 -0
- package/src/skills-lib/huashu-design/references/hero-animation-case-study.md +250 -0
- package/src/skills-lib/huashu-design/references/launch-film-director-notes.md +293 -0
- package/src/skills-lib/huashu-design/references/multi-perspective-parallel-case-study.md +267 -0
- package/src/skills-lib/huashu-design/references/react-setup.md +276 -0
- package/src/skills-lib/huashu-design/references/scene-templates.md +262 -0
- package/src/skills-lib/huashu-design/references/sfx-library.md +226 -0
- package/src/skills-lib/huashu-design/references/slide-decks.md +745 -0
- package/src/skills-lib/huashu-design/references/tweaks-system.md +313 -0
- package/src/skills-lib/huashu-design/references/verification.md +183 -0
- package/src/skills-lib/huashu-design/references/video-export.md +232 -0
- package/src/skills-lib/huashu-design/references/voiceover-pipeline.md +397 -0
- package/src/skills-lib/huashu-design/references/workflow.md +216 -0
- package/src/skills-lib/huashu-design/scripts/add-music.sh +108 -0
- package/src/skills-lib/huashu-design/scripts/convert-formats.sh +83 -0
- package/src/skills-lib/huashu-design/scripts/export_deck_pdf.mjs +98 -0
- package/src/skills-lib/huashu-design/scripts/export_deck_pptx.mjs +107 -0
- package/src/skills-lib/huashu-design/scripts/export_deck_stage_pdf.mjs +130 -0
- package/src/skills-lib/huashu-design/scripts/fetch_images.py +94 -0
- package/src/skills-lib/huashu-design/scripts/gen_deck_thumbs.mjs +55 -0
- package/src/skills-lib/huashu-design/scripts/html2pptx.js +1178 -0
- package/src/skills-lib/huashu-design/scripts/mix-voiceover.sh +127 -0
- package/src/skills-lib/huashu-design/scripts/narrate-pipeline.mjs +315 -0
- package/src/skills-lib/huashu-design/scripts/render-narration.sh +151 -0
- package/src/skills-lib/huashu-design/scripts/render-video-seek.js +238 -0
- package/src/skills-lib/huashu-design/scripts/render-video.js +289 -0
- package/src/skills-lib/huashu-design/scripts/tts-doubao.mjs +184 -0
- package/src/skills-lib/huashu-design/scripts/verify.py +154 -0
- package/src/skills-lib/huashu-design/test-prompts.json +38 -0
- package/src/skills-lib/humanizer/LICENSE +21 -0
- package/src/skills-lib/humanizer/README.md +145 -0
- package/src/skills-lib/humanizer/SKILL.md +474 -0
- package/src/skills-lib/humanizer/WARP.md +53 -0
- package/src/skills-lib/impeccable/SKILL.md +186 -0
- package/src/skills-lib/implementation-planner/SKILL.md +630 -0
- package/src/skills-lib/infrastructure/SKILL.md +34 -0
- package/src/skills-lib/inicio-de-projeto/SKILL.md +313 -0
- package/src/skills-lib/launch-strategy/SKILL.md +353 -0
- package/src/skills-lib/launch-strategy/evals/evals.json +91 -0
- package/src/skills-lib/marketing-ideas/SKILL.md +167 -0
- package/src/skills-lib/marketing-ideas/evals/evals.json +90 -0
- package/src/skills-lib/marketing-ideas/references/ideas-by-category.md +366 -0
- package/src/skills-lib/marketing-psychology/SKILL.md +455 -0
- package/src/skills-lib/marketing-psychology/evals/evals.json +88 -0
- package/src/skills-lib/motion-3d-director/SKILL.md +485 -0
- package/src/skills-lib/onboarding-cro/SKILL.md +220 -0
- package/src/skills-lib/onboarding-cro/evals/evals.json +92 -0
- package/src/skills-lib/onboarding-cro/references/experiments.md +258 -0
- package/src/skills-lib/page-cro/SKILL.md +182 -0
- package/src/skills-lib/page-cro/evals/evals.json +111 -0
- package/src/skills-lib/page-cro/references/experiments.md +248 -0
- package/src/skills-lib/paid-ads/SKILL.md +315 -0
- package/src/skills-lib/paid-ads/evals/evals.json +90 -0
- package/src/skills-lib/paid-ads/references/ad-copy-templates.md +207 -0
- package/src/skills-lib/paid-ads/references/audience-targeting.md +243 -0
- package/src/skills-lib/paid-ads/references/platform-setup-checklists.md +277 -0
- package/src/skills-lib/paywall-upgrade-cro/SKILL.md +227 -0
- package/src/skills-lib/paywall-upgrade-cro/evals/evals.json +93 -0
- package/src/skills-lib/paywall-upgrade-cro/references/experiments.md +164 -0
- package/src/skills-lib/popup-cro/SKILL.md +453 -0
- package/src/skills-lib/popup-cro/evals/evals.json +94 -0
- package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +2090 -0
- package/src/skills-lib/pricing-strategy/SKILL.md +231 -0
- package/src/skills-lib/pricing-strategy/evals/evals.json +90 -0
- package/src/skills-lib/pricing-strategy/references/research-methods.md +152 -0
- package/src/skills-lib/pricing-strategy/references/tier-structure.md +232 -0
- package/src/skills-lib/product-marketing-context/SKILL.md +241 -0
- package/src/skills-lib/product-marketing-context/evals/evals.json +85 -0
- package/src/skills-lib/programmatic-seo/SKILL.md +238 -0
- package/src/skills-lib/programmatic-seo/evals/evals.json +94 -0
- package/src/skills-lib/programmatic-seo/references/playbooks.md +308 -0
- package/src/skills-lib/react-components/README.md +36 -0
- package/src/skills-lib/react-components/SKILL.md +51 -0
- package/src/skills-lib/react-components/examples/gold-standard-card.tsx +80 -0
- package/src/skills-lib/react-components/package-lock.json +231 -0
- package/src/skills-lib/react-components/package.json +16 -0
- package/src/skills-lib/react-components/resources/architecture-checklist.md +15 -0
- package/src/skills-lib/react-components/resources/component-template.tsx +37 -0
- package/src/skills-lib/react-components/resources/stitch-api-reference.md +14 -0
- package/src/skills-lib/react-components/resources/style-guide.json +27 -0
- package/src/skills-lib/react-components/scripts/fetch-stitch.sh +30 -0
- package/src/skills-lib/react-components/scripts/validate.js +70 -0
- package/src/skills-lib/references/premium-agency-rules.md +79 -0
- package/src/skills-lib/referral-program/SKILL.md +255 -0
- package/src/skills-lib/referral-program/evals/evals.json +89 -0
- package/src/skills-lib/referral-program/references/affiliate-programs.md +164 -0
- package/src/skills-lib/referral-program/references/program-examples.md +143 -0
- package/src/skills-lib/remotion-best-practices/SKILL.md +61 -0
- package/src/skills-lib/remotion-best-practices/rules/3d.md +86 -0
- package/src/skills-lib/remotion-best-practices/rules/animations.md +27 -0
- package/src/skills-lib/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/src/skills-lib/remotion-best-practices/rules/assets.md +78 -0
- package/src/skills-lib/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/src/skills-lib/remotion-best-practices/rules/audio.md +169 -0
- package/src/skills-lib/remotion-best-practices/rules/calculate-metadata.md +134 -0
- package/src/skills-lib/remotion-best-practices/rules/can-decode.md +75 -0
- package/src/skills-lib/remotion-best-practices/rules/charts.md +120 -0
- package/src/skills-lib/remotion-best-practices/rules/compositions.md +154 -0
- package/src/skills-lib/remotion-best-practices/rules/display-captions.md +184 -0
- package/src/skills-lib/remotion-best-practices/rules/extract-frames.md +229 -0
- package/src/skills-lib/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/src/skills-lib/remotion-best-practices/rules/fonts.md +152 -0
- package/src/skills-lib/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/src/skills-lib/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/src/skills-lib/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/src/skills-lib/remotion-best-practices/rules/gifs.md +141 -0
- package/src/skills-lib/remotion-best-practices/rules/images.md +134 -0
- package/src/skills-lib/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/src/skills-lib/remotion-best-practices/rules/light-leaks.md +73 -0
- package/src/skills-lib/remotion-best-practices/rules/lottie.md +70 -0
- package/src/skills-lib/remotion-best-practices/rules/maps.md +412 -0
- package/src/skills-lib/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/src/skills-lib/remotion-best-practices/rules/measuring-text.md +140 -0
- package/src/skills-lib/remotion-best-practices/rules/parameters.md +109 -0
- package/src/skills-lib/remotion-best-practices/rules/sequencing.md +118 -0
- package/src/skills-lib/remotion-best-practices/rules/sfx.md +26 -0
- package/src/skills-lib/remotion-best-practices/rules/subtitles.md +36 -0
- package/src/skills-lib/remotion-best-practices/rules/tailwind.md +11 -0
- package/src/skills-lib/remotion-best-practices/rules/text-animations.md +20 -0
- package/src/skills-lib/remotion-best-practices/rules/timing.md +179 -0
- package/src/skills-lib/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/src/skills-lib/remotion-best-practices/rules/transitions.md +197 -0
- package/src/skills-lib/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/src/skills-lib/remotion-best-practices/rules/trimming.md +51 -0
- package/src/skills-lib/remotion-best-practices/rules/videos.md +171 -0
- package/src/skills-lib/remotion-best-practices/rules/voiceover.md +99 -0
- package/src/skills-lib/revops/SKILL.md +343 -0
- package/src/skills-lib/revops/evals/evals.json +91 -0
- package/src/skills-lib/revops/references/automation-playbooks.md +290 -0
- package/src/skills-lib/revops/references/lifecycle-definitions.md +278 -0
- package/src/skills-lib/revops/references/routing-rules.md +203 -0
- package/src/skills-lib/revops/references/scoring-models.md +247 -0
- package/src/skills-lib/sales-enablement/SKILL.md +349 -0
- package/src/skills-lib/sales-enablement/evals/evals.json +91 -0
- package/src/skills-lib/sales-enablement/references/deck-frameworks.md +263 -0
- package/src/skills-lib/sales-enablement/references/demo-scripts.md +355 -0
- package/src/skills-lib/sales-enablement/references/objection-library.md +270 -0
- package/src/skills-lib/sales-enablement/references/one-pager-templates.md +208 -0
- package/src/skills-lib/schema-markup/SKILL.md +179 -0
- package/src/skills-lib/schema-markup/evals/evals.json +87 -0
- package/src/skills-lib/schema-markup/references/schema-examples.md +398 -0
- package/src/skills-lib/seo-audit/SKILL.md +412 -0
- package/src/skills-lib/seo-audit/evals/evals.json +136 -0
- package/src/skills-lib/seo-audit/references/ai-writing-detection.md +200 -0
- package/src/skills-lib/signup-flow-cro/SKILL.md +359 -0
- package/src/skills-lib/signup-flow-cro/evals/evals.json +88 -0
- package/src/skills-lib/site-architecture/SKILL.md +357 -0
- package/src/skills-lib/site-architecture/evals/evals.json +88 -0
- package/src/skills-lib/site-architecture/references/mermaid-templates.md +216 -0
- package/src/skills-lib/site-architecture/references/navigation-patterns.md +305 -0
- package/src/skills-lib/site-architecture/references/site-type-templates.md +293 -0
- package/src/skills-lib/social-content/SKILL.md +278 -0
- package/src/skills-lib/social-content/evals/evals.json +92 -0
- package/src/skills-lib/social-content/references/platforms.md +170 -0
- package/src/skills-lib/social-content/references/post-templates.md +177 -0
- package/src/skills-lib/social-content/references/reverse-engineering.md +195 -0
- package/src/skills-lib/supabase-postgres-best-practices/AGENTS.md +68 -0
- package/src/skills-lib/supabase-postgres-best-practices/CLAUDE.md +68 -0
- package/src/skills-lib/supabase-postgres-best-practices/README.md +116 -0
- package/src/skills-lib/supabase-postgres-best-practices/SKILL.md +64 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/_contributing.md +171 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/_template.md +34 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
- package/src/skills-lib/taste-redesign/SKILL.md +178 -0
- package/src/skills-lib/taste-skill/SKILL.md +1206 -0
- package/src/skills-lib/ui-component-curator/SKILL.md +102 -0
- package/src/skills-lib/ui-ux-pro-max/SKILL.md +377 -0
- package/src/skills-lib/ui-ux-pro-max/data/charts.csv +26 -0
- package/src/skills-lib/ui-ux-pro-max/data/colors.csv +97 -0
- package/src/skills-lib/ui-ux-pro-max/data/icons.csv +101 -0
- package/src/skills-lib/ui-ux-pro-max/data/landing.csv +31 -0
- package/src/skills-lib/ui-ux-pro-max/data/products.csv +97 -0
- package/src/skills-lib/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/src/skills-lib/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/src/skills-lib/ui-ux-pro-max/data/styles.csv +68 -0
- package/src/skills-lib/ui-ux-pro-max/data/typography.csv +58 -0
- package/src/skills-lib/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/src/skills-lib/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/src/skills-lib/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/core.py +253 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +1 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +1 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +1 -0
- package/src/skills-lib/ui-ux-pro-max/scripts/search.py +114 -0
- package/src/skills-lib/web-security/SKILL.md +147 -0
- package/src/skills-lib/wizz-router/SKILL.md +257 -0
- package/src/squads/README.md +39 -0
- package/src/squads/advisory-board/README.md +34 -0
- package/src/squads/advisory-board/agents/board-chair.md +161 -0
- package/src/squads/advisory-board/agents/brene-brown.md +296 -0
- package/src/squads/advisory-board/agents/charlie-munger.md +590 -0
- package/src/squads/advisory-board/agents/derek-sivers.md +268 -0
- package/src/squads/advisory-board/agents/naval-ravikant.md +251 -0
- package/src/squads/advisory-board/agents/patrick-lencioni.md +394 -0
- package/src/squads/advisory-board/agents/peter-thiel.md +269 -0
- package/src/squads/advisory-board/agents/ray-dalio.md +587 -0
- package/src/squads/advisory-board/agents/reid-hoffman.md +278 -0
- package/src/squads/advisory-board/agents/simon-sinek.md +291 -0
- package/src/squads/advisory-board/agents/yvon-chouinard.md +275 -0
- package/src/squads/advisory-board/squad.yaml +50 -0
- package/src/squads/brand-squad/README.md +60 -0
- package/src/squads/brand-squad/agents/al-ries.md +175 -0
- package/src/squads/brand-squad/agents/alina-wheeler.md +184 -0
- package/src/squads/brand-squad/agents/archetype-consultant.md +215 -0
- package/src/squads/brand-squad/agents/brand-chief.md +158 -0
- package/src/squads/brand-squad/agents/byron-sharp.md +169 -0
- package/src/squads/brand-squad/agents/david-aaker.md +166 -0
- package/src/squads/brand-squad/agents/denise-yohn.md +172 -0
- package/src/squads/brand-squad/agents/domain-scout.md +135 -0
- package/src/squads/brand-squad/agents/donald-miller.md +179 -0
- package/src/squads/brand-squad/agents/emily-heyward.md +147 -0
- package/src/squads/brand-squad/agents/jean-noel-kapferer.md +189 -0
- package/src/squads/brand-squad/agents/kevin-keller.md +199 -0
- package/src/squads/brand-squad/agents/marty-neumeier.md +170 -0
- package/src/squads/brand-squad/agents/miller-sticky-brand.md +180 -0
- package/src/squads/brand-squad/agents/naming-strategist.md +171 -0
- package/src/squads/brand-squad/squad.yaml +117 -0
- package/src/squads/c-level-squad/README.md +29 -0
- package/src/squads/c-level-squad/agents/caio-architect.md +235 -0
- package/src/squads/c-level-squad/agents/cio-engineer.md +209 -0
- package/src/squads/c-level-squad/agents/cmo-architect.md +208 -0
- package/src/squads/c-level-squad/agents/coo-orchestrator.md +193 -0
- package/src/squads/c-level-squad/agents/cto-architect.md +194 -0
- package/src/squads/c-level-squad/agents/vision-chief.md +201 -0
- package/src/squads/c-level-squad/squad.yaml +45 -0
- package/src/squads/claude-code-mastery/README.md +146 -0
- package/src/squads/claude-code-mastery/agents/claude-mastery-chief.md +554 -0
- package/src/squads/claude-code-mastery/agents/config-engineer.md +865 -0
- package/src/squads/claude-code-mastery/agents/hooks-architect.md +1013 -0
- package/src/squads/claude-code-mastery/agents/mcp-integrator.md +791 -0
- package/src/squads/claude-code-mastery/agents/project-integrator.md +1196 -0
- package/src/squads/claude-code-mastery/agents/roadmap-sentinel.md +931 -0
- package/src/squads/claude-code-mastery/agents/skill-craftsman.md +1250 -0
- package/src/squads/claude-code-mastery/agents/swarm-orchestrator.md +1008 -0
- package/src/squads/copy-squad/README.md +65 -0
- package/src/squads/copy-squad/agents/andre-chaperon.md +206 -0
- package/src/squads/copy-squad/agents/ben-settle.md +194 -0
- package/src/squads/copy-squad/agents/claude-hopkins.md +182 -0
- package/src/squads/copy-squad/agents/clayton-makepeace.md +225 -0
- package/src/squads/copy-squad/agents/copy-chief.md +166 -0
- package/src/squads/copy-squad/agents/dan-kennedy.md +202 -0
- package/src/squads/copy-squad/agents/dan-koe.md +223 -0
- package/src/squads/copy-squad/agents/david-deutsch.md +197 -0
- package/src/squads/copy-squad/agents/david-ogilvy.md +198 -0
- package/src/squads/copy-squad/agents/eugene-schwartz.md +238 -0
- package/src/squads/copy-squad/agents/frank-kern.md +195 -0
- package/src/squads/copy-squad/agents/gary-bencivenga.md +197 -0
- package/src/squads/copy-squad/agents/gary-halbert.md +219 -0
- package/src/squads/copy-squad/agents/jim-rutz.md +193 -0
- package/src/squads/copy-squad/agents/joe-sugarman.md +234 -0
- package/src/squads/copy-squad/agents/john-carlton.md +203 -0
- package/src/squads/copy-squad/agents/jon-benson.md +196 -0
- package/src/squads/copy-squad/agents/parris-lampropoulos.md +188 -0
- package/src/squads/copy-squad/agents/robert-collier.md +183 -0
- package/src/squads/copy-squad/agents/russell-brunson.md +229 -0
- package/src/squads/copy-squad/agents/ry-schwartz.md +185 -0
- package/src/squads/copy-squad/agents/stefan-georgi.md +188 -0
- package/src/squads/copy-squad/agents/todd-brown.md +171 -0
- package/src/squads/copy-squad/squad.yaml +87 -0
- package/src/squads/cybersecurity/README.md +38 -0
- package/src/squads/cybersecurity/agents/busterer.md +108 -0
- package/src/squads/cybersecurity/agents/cartographer.md +114 -0
- package/src/squads/cybersecurity/agents/chris-sanders.md +205 -0
- package/src/squads/cybersecurity/agents/command-generator.md +121 -0
- package/src/squads/cybersecurity/agents/cyber-chief.md +120 -0
- package/src/squads/cybersecurity/agents/dirber.md +111 -0
- package/src/squads/cybersecurity/agents/fuzzer.md +121 -0
- package/src/squads/cybersecurity/agents/georgia-weidman.md +178 -0
- package/src/squads/cybersecurity/agents/jim-manico.md +182 -0
- package/src/squads/cybersecurity/agents/marcus-carey.md +200 -0
- package/src/squads/cybersecurity/agents/omar-santos.md +206 -0
- package/src/squads/cybersecurity/agents/peter-kim.md +179 -0
- package/src/squads/cybersecurity/agents/ripper.md +121 -0
- package/src/squads/cybersecurity/agents/rogue.md +116 -0
- package/src/squads/cybersecurity/agents/shannon-runner.md +108 -0
- package/src/squads/cybersecurity/squad.yaml +56 -0
- package/src/squads/data-squad/README.md +30 -0
- package/src/squads/data-squad/agents/avinash-kaushik.md +268 -0
- package/src/squads/data-squad/agents/data-chief.md +167 -0
- package/src/squads/data-squad/agents/david-spinks.md +277 -0
- package/src/squads/data-squad/agents/nick-mehta.md +294 -0
- package/src/squads/data-squad/agents/peter-fader.md +246 -0
- package/src/squads/data-squad/agents/sean-ellis.md +303 -0
- package/src/squads/data-squad/agents/wes-kao.md +268 -0
- package/src/squads/data-squad/squad.yaml +46 -0
- package/src/squads/design-squad/README.md +31 -0
- package/src/squads/design-squad/agents/brad-frost.md +185 -0
- package/src/squads/design-squad/agents/dan-mall.md +178 -0
- package/src/squads/design-squad/agents/dave-malouf.md +198 -0
- package/src/squads/design-squad/agents/design-chief.md +109 -0
- package/src/squads/design-squad/agents/design-system-architect.md +109 -0
- package/src/squads/design-squad/agents/ui-engineer.md +102 -0
- package/src/squads/design-squad/agents/ux-designer.md +105 -0
- package/src/squads/design-squad/agents/visual-generator.md +108 -0
- package/src/squads/design-squad/squad.yaml +48 -0
- package/src/squads/hormozi-squad/README.md +39 -0
- package/src/squads/hormozi-squad/agents/hormozi-ads.md +159 -0
- package/src/squads/hormozi-squad/agents/hormozi-advisor.md +178 -0
- package/src/squads/hormozi-squad/agents/hormozi-audit.md +178 -0
- package/src/squads/hormozi-squad/agents/hormozi-chief.md +111 -0
- package/src/squads/hormozi-squad/agents/hormozi-closer.md +179 -0
- package/src/squads/hormozi-squad/agents/hormozi-content.md +166 -0
- package/src/squads/hormozi-squad/agents/hormozi-copy.md +152 -0
- package/src/squads/hormozi-squad/agents/hormozi-hooks.md +177 -0
- package/src/squads/hormozi-squad/agents/hormozi-launch.md +160 -0
- package/src/squads/hormozi-squad/agents/hormozi-leads.md +198 -0
- package/src/squads/hormozi-squad/agents/hormozi-models.md +191 -0
- package/src/squads/hormozi-squad/agents/hormozi-offers.md +197 -0
- package/src/squads/hormozi-squad/agents/hormozi-pricing.md +151 -0
- package/src/squads/hormozi-squad/agents/hormozi-retention.md +166 -0
- package/src/squads/hormozi-squad/agents/hormozi-scale.md +175 -0
- package/src/squads/hormozi-squad/agents/hormozi-workshop.md +160 -0
- package/src/squads/hormozi-squad/squad.yaml +60 -0
- package/src/squads/movement/README.md +29 -0
- package/src/squads/movement/agents/analista-de-impacto.md +350 -0
- package/src/squads/movement/agents/estrategista-de-ciclo.md +301 -0
- package/src/squads/movement/agents/fenomenologo.md +169 -0
- package/src/squads/movement/agents/identitario.md +265 -0
- package/src/squads/movement/agents/manifestador.md +279 -0
- package/src/squads/movement/agents/movement-architect.md +210 -0
- package/src/squads/movement/agents/movement-chief.md +135 -0
- package/src/squads/movement/squad.yaml +45 -0
- package/src/squads/storytelling/README.md +35 -0
- package/src/squads/storytelling/agents/blake-snyder.md +225 -0
- package/src/squads/storytelling/agents/dan-harmon.md +167 -0
- package/src/squads/storytelling/agents/joseph-campbell.md +184 -0
- package/src/squads/storytelling/agents/keith-johnstone.md +157 -0
- package/src/squads/storytelling/agents/kindra-hall.md +162 -0
- package/src/squads/storytelling/agents/marshall-ganz.md +167 -0
- package/src/squads/storytelling/agents/matthew-dicks.md +152 -0
- package/src/squads/storytelling/agents/nancy-duarte.md +154 -0
- package/src/squads/storytelling/agents/oren-klaff.md +166 -0
- package/src/squads/storytelling/agents/park-howell.md +152 -0
- package/src/squads/storytelling/agents/shawn-coyne.md +208 -0
- package/src/squads/storytelling/agents/story-chief.md +155 -0
- package/src/squads/storytelling/squad.yaml +52 -0
- package/src/squads/traffic-masters/README.md +39 -0
- package/src/squads/traffic-masters/agents/ad-midas.md +149 -0
- package/src/squads/traffic-masters/agents/ads-analyst.md +135 -0
- package/src/squads/traffic-masters/agents/creative-analyst.md +142 -0
- package/src/squads/traffic-masters/agents/depesh-mandalia.md +174 -0
- package/src/squads/traffic-masters/agents/fiscal.md +144 -0
- package/src/squads/traffic-masters/agents/kasim-aslam.md +158 -0
- package/src/squads/traffic-masters/agents/media-buyer.md +159 -0
- package/src/squads/traffic-masters/agents/molly-pittman.md +185 -0
- package/src/squads/traffic-masters/agents/nicholas-kusmich.md +157 -0
- package/src/squads/traffic-masters/agents/pedro-sobral.md +158 -0
- package/src/squads/traffic-masters/agents/performance-analyst.md +135 -0
- package/src/squads/traffic-masters/agents/pixel-specialist.md +144 -0
- package/src/squads/traffic-masters/agents/ralph-burns.md +163 -0
- package/src/squads/traffic-masters/agents/scale-optimizer.md +144 -0
- package/src/squads/traffic-masters/agents/tom-breeze.md +175 -0
- package/src/squads/traffic-masters/agents/traffic-chief.md +97 -0
- package/src/squads/traffic-masters/squad.yaml +59 -0
- package/tools/bundle-web-bundles.js +1 -1
- package/tools/format-workflow-md.js +2 -2
- package/tools/installer/commands/install.js +13 -1
- package/tools/installer/commands/status.js +9 -9
- package/tools/installer/commands/uninstall.js +5 -5
- package/tools/installer/core/config.js +20 -0
- package/tools/installer/core/existing-install.js +8 -8
- package/tools/installer/core/install-paths.js +13 -13
- package/tools/installer/core/installer.js +202 -102
- package/tools/installer/core/legacy-warnings.js +16 -16
- package/tools/installer/core/manifest-generator.js +44 -33
- package/tools/installer/core/manifest.js +30 -30
- package/tools/installer/core/python-check.js +7 -7
- package/tools/installer/ide/_config-driven.js +97 -97
- package/tools/installer/ide/manager.js +17 -17
- package/tools/installer/ide/platform-codes.yaml +5 -5
- package/tools/installer/ide/shared/installed-skills.js +13 -13
- package/tools/installer/ide/shared/path-utils.js +46 -46
- package/tools/installer/ide/shared/skill-manifest.js +4 -4
- package/tools/installer/install-messages.yaml +1 -1
- package/tools/installer/list-options.js +3 -3
- package/tools/installer/modules/channel-plan.js +1 -1
- package/tools/installer/modules/channel-resolver.js +1 -1
- package/tools/installer/modules/cli-config.js +145 -0
- package/tools/installer/modules/custom-module-manager.js +16 -16
- package/tools/installer/modules/external-manager.js +6 -6
- package/tools/installer/modules/mcp-config.js +137 -0
- package/tools/installer/modules/official-modules.js +42 -42
- package/tools/installer/modules/plugin-resolver.js +3 -3
- package/tools/installer/modules/skills-lib.js +135 -0
- package/tools/installer/project-root.js +13 -13
- package/tools/installer/prompts.js +1 -1
- package/tools/installer/set-overrides.js +6 -6
- package/tools/installer/ui.js +239 -29
- package/tools/installer/yaml-format.js +1 -1
- package/tools/migrate-custom-module-paths.js +11 -11
- package/tools/skill-validator.md +6 -6
- package/tools/validate-skills.js +10 -5
- package/web-bundles/README.md +4 -4
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +1 -1
- package/web-bundles/bundles.json +6 -6
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +1 -1
- package/web-bundles/prd-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/ux-coach/INSTRUCTIONS.md +1 -1
- package/{bmad-modules.yaml → wizz-modules.yaml} +15 -15
- package/build/site/pagefind/fragment/en_5ad92a9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_7aea5bc.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_81bcd7f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_938e9c4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_b51d75b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_c9fea21.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_e07e982.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f4389af.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f52c9f9.pf_fragment +0 -0
- package/build/site/pagefind/index/en_82c64dc.pf_index +0 -0
- package/build/site/pagefind/index/en_d0dd3c7.pf_index +0 -0
- package/build/site/pagefind/index/en_e890f88.pf_index +0 -0
- package/build/site/pagefind/pagefind.en_ee1b8a17c8.pf_meta +0 -0
- /package/build/site/img/{bmad-dark.png → wizz-dark.png} +0 -0
- /package/build/site/img/{bmad-light.png → wizz-light.png} +0 -0
- /package/src/bmm-skills/1-analysis/wizz-prfaq/{bmad-manifest.json → wizz-manifest.json} +0 -0
- /package/tools/installer/{bmad-cli.js → wizz-cli.js} +0 -0
|
@@ -2,13 +2,16 @@ const path = require('node:path');
|
|
|
2
2
|
const fs = require('../fs-native');
|
|
3
3
|
const { Manifest } = require('./manifest');
|
|
4
4
|
const { OfficialModules } = require('../modules/official-modules');
|
|
5
|
+
const { installSkillsLib } = require('../modules/skills-lib');
|
|
6
|
+
const { writeMcpConfig, renderAddCommand } = require('../modules/mcp-config');
|
|
7
|
+
const { installClis, renderInstallCommand } = require('../modules/cli-config');
|
|
5
8
|
const { IdeManager } = require('../ide/manager');
|
|
6
9
|
const { FileOps } = require('../file-ops');
|
|
7
10
|
const { Config } = require('./config');
|
|
8
11
|
const { getProjectRoot, getSourcePath } = require('../project-root');
|
|
9
12
|
const { ManifestGenerator } = require('./manifest-generator');
|
|
10
13
|
const prompts = require('../prompts');
|
|
11
|
-
const {
|
|
14
|
+
const { WIZZ_FOLDER_NAME } = require('../ide/shared/path-utils');
|
|
12
15
|
const { InstallPaths } = require('./install-paths');
|
|
13
16
|
const { ExternalModuleManager } = require('../modules/external-manager');
|
|
14
17
|
const { resolveModuleVersion } = require('../modules/version-resolver');
|
|
@@ -24,7 +27,7 @@ class Installer {
|
|
|
24
27
|
this.ideManager = new IdeManager();
|
|
25
28
|
this.fileOps = new FileOps();
|
|
26
29
|
this.installedFiles = new Set(); // Track all installed files
|
|
27
|
-
this.
|
|
30
|
+
this.wizzFolderName = WIZZ_FOLDER_NAME;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
/**
|
|
@@ -41,7 +44,7 @@ class Installer {
|
|
|
41
44
|
const config = Config.build(originalConfig);
|
|
42
45
|
const paths = await InstallPaths.create(config);
|
|
43
46
|
const officialModules = await OfficialModules.build(config, paths);
|
|
44
|
-
const existingInstall = await ExistingInstall.detect(paths.
|
|
47
|
+
const existingInstall = await ExistingInstall.detect(paths.wizzDir);
|
|
45
48
|
|
|
46
49
|
try {
|
|
47
50
|
await warnPreNativeSkillsLegacy({
|
|
@@ -50,7 +53,7 @@ class Installer {
|
|
|
50
53
|
});
|
|
51
54
|
} catch (error) {
|
|
52
55
|
// Legacy-dir scan is informational; never let it abort install.
|
|
53
|
-
await prompts.log.warn(`Warning: Could not check for legacy
|
|
56
|
+
await prompts.log.warn(`Warning: Could not check for legacy WIZZ entries: ${error.message}`);
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
if (existingInstall.installed) {
|
|
@@ -64,7 +67,7 @@ class Installer {
|
|
|
64
67
|
// Capture pre-install module versions for from→to display
|
|
65
68
|
const preInstallVersions = new Map();
|
|
66
69
|
if (existingInstall.installed) {
|
|
67
|
-
const existingModules = await this.manifest.getAllModuleVersions(paths.
|
|
70
|
+
const existingModules = await this.manifest.getAllModuleVersions(paths.wizzDir);
|
|
68
71
|
for (const mod of existingModules) {
|
|
69
72
|
if (mod.name && mod.version) {
|
|
70
73
|
preInstallVersions.set(mod.name, mod.version);
|
|
@@ -78,7 +81,7 @@ class Installer {
|
|
|
78
81
|
|
|
79
82
|
// Capture previously installed skill rows before they get overwritten
|
|
80
83
|
const preservedModules = originalConfig._preserveModules || [];
|
|
81
|
-
const previousSkillManifestRows = await this._readSkillManifestRows(paths.
|
|
84
|
+
const previousSkillManifestRows = await this._readSkillManifestRows(paths.wizzDir);
|
|
82
85
|
const previousSkillIds = this._getPreviousSkillIdsForCleanup(previousSkillManifestRows, preservedModules);
|
|
83
86
|
|
|
84
87
|
const allModules = config.modules || [];
|
|
@@ -98,13 +101,13 @@ class Installer {
|
|
|
98
101
|
|
|
99
102
|
// Skills are now in IDE directories — remove redundant copies from _wizz/.
|
|
100
103
|
// Also cleans up skill dirs left by older installer versions.
|
|
101
|
-
await this._cleanupSkillDirs(paths.
|
|
104
|
+
await this._cleanupSkillDirs(paths.wizzDir);
|
|
102
105
|
|
|
103
106
|
const restoreResult = await this._restoreUserFiles(paths, updateState);
|
|
104
107
|
|
|
105
108
|
// Render consolidated summary
|
|
106
109
|
await this.renderInstallSummary(results, {
|
|
107
|
-
|
|
110
|
+
wizzDir: paths.wizzDir,
|
|
108
111
|
modules: config.modules,
|
|
109
112
|
ides: config.ides,
|
|
110
113
|
customFiles: restoreResult.customFiles.length > 0 ? restoreResult.customFiles : undefined,
|
|
@@ -114,7 +117,7 @@ class Installer {
|
|
|
114
117
|
|
|
115
118
|
return {
|
|
116
119
|
success: true,
|
|
117
|
-
path: paths.
|
|
120
|
+
path: paths.wizzDir,
|
|
118
121
|
modules: config.modules,
|
|
119
122
|
ides: config.ides,
|
|
120
123
|
projectDir: paths.projectRoot,
|
|
@@ -256,7 +259,7 @@ class Installer {
|
|
|
256
259
|
installTasks.push({
|
|
257
260
|
title: 'Creating module directories',
|
|
258
261
|
task: async (message) => {
|
|
259
|
-
const verboseMode = process.env.
|
|
262
|
+
const verboseMode = process.env.WIZZ_VERBOSE_INSTALL === 'true' || config.verbose;
|
|
260
263
|
const moduleLogger = {
|
|
261
264
|
log: async (msg) => (verboseMode ? await prompts.log.message(msg) : undefined),
|
|
262
265
|
error: async (msg) => await prompts.log.error(msg),
|
|
@@ -266,7 +269,7 @@ class Installer {
|
|
|
266
269
|
if (config.modules && config.modules.length > 0) {
|
|
267
270
|
for (const moduleName of config.modules) {
|
|
268
271
|
message(`Setting up ${moduleName}...`);
|
|
269
|
-
const result = await officialModules.createModuleDirectories(moduleName, paths.
|
|
272
|
+
const result = await officialModules.createModuleDirectories(moduleName, paths.wizzDir, {
|
|
270
273
|
installedIDEs: config.ides || [],
|
|
271
274
|
moduleConfig: moduleConfigs[moduleName] || {},
|
|
272
275
|
existingModuleConfig: officialModules.existingConfig?.[moduleName] || {},
|
|
@@ -290,13 +293,110 @@ class Installer {
|
|
|
290
293
|
const configTask = {
|
|
291
294
|
title: 'Generating configurations',
|
|
292
295
|
task: async (message) => {
|
|
293
|
-
await this.generateModuleConfigs(paths.
|
|
296
|
+
await this.generateModuleConfigs(paths.wizzDir, moduleConfigs);
|
|
294
297
|
addResult('Configurations', 'ok', 'generated');
|
|
295
298
|
|
|
296
299
|
this.installedFiles.add(paths.manifestFile());
|
|
297
300
|
this.installedFiles.add(paths.centralConfig());
|
|
298
301
|
this.installedFiles.add(paths.centralUserConfig());
|
|
299
302
|
|
|
303
|
+
// Install the global skills library (area-filtered) BEFORE manifests, so
|
|
304
|
+
// collectSkills discovers `_wizz/skills-lib/<id>` and the verbatim pipeline
|
|
305
|
+
// carries them into each IDE. Gated on the `wizz` module; additive, so a
|
|
306
|
+
// failure here warns and never aborts the install.
|
|
307
|
+
if (!config.isQuickUpdate() && (config.modules || []).includes('wizz')) {
|
|
308
|
+
message('Installing global skills...');
|
|
309
|
+
try {
|
|
310
|
+
const result = await installSkillsLib({
|
|
311
|
+
wizzDir: paths.wizzDir,
|
|
312
|
+
selectedAreas: config.selectedAreas || [],
|
|
313
|
+
trackFile: (p) => this.installedFiles.add(p),
|
|
314
|
+
});
|
|
315
|
+
if (result.registry) {
|
|
316
|
+
addResult('Global skills', 'ok', `${result.copied} installed`);
|
|
317
|
+
}
|
|
318
|
+
if (result.skipped.length > 0) {
|
|
319
|
+
await prompts.log.warn(`Skills no registry sem pasta em skills-lib (ignoradas): ${result.skipped.join(', ')}`);
|
|
320
|
+
}
|
|
321
|
+
} catch (error) {
|
|
322
|
+
await prompts.log.warn(`Falha ao instalar skills globais: ${error.message}`);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Configure recommended MCP servers for the chosen areas. The user's
|
|
326
|
+
// multiselect already split them into write vs recommend; we merge the
|
|
327
|
+
// chosen ones into .mcp.json (additive) and print `claude mcp add` for
|
|
328
|
+
// the rest. Additive + placeholder-secret, so it never clobbers config
|
|
329
|
+
// or leaks tokens; a failure warns and never aborts the install.
|
|
330
|
+
const mcpPlan = config.mcpPlan || { toWrite: [], toRecommend: [] };
|
|
331
|
+
try {
|
|
332
|
+
const toWrite = mcpPlan.toWrite || [];
|
|
333
|
+
if (toWrite.length > 0) {
|
|
334
|
+
message('Configuring MCP servers...');
|
|
335
|
+
// Intentionally NOT tracked in installedFiles: .mcp.json is a
|
|
336
|
+
// shared, user-owned config we merge into (it may hold the user's
|
|
337
|
+
// own servers). Tracking it would expose it to uninstall removal
|
|
338
|
+
// and manifest hash-management, which must never touch it.
|
|
339
|
+
const mcpResult = await writeMcpConfig({
|
|
340
|
+
projectDir: paths.projectRoot,
|
|
341
|
+
mcps: toWrite,
|
|
342
|
+
});
|
|
343
|
+
if (mcpResult.added.length > 0) {
|
|
344
|
+
addResult('MCP servers', 'ok', `${mcpResult.added.join(', ')} → .mcp.json`);
|
|
345
|
+
}
|
|
346
|
+
if (mcpResult.skipped.length > 0) {
|
|
347
|
+
await prompts.log.info(`MCPs já presentes no .mcp.json (mantidos): ${mcpResult.skipped.join(', ')}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const toRecommend = mcpPlan.toRecommend || [];
|
|
351
|
+
if (toRecommend.length > 0) {
|
|
352
|
+
const lines = toRecommend.map((m) => ` ${renderAddCommand(m)}`).join('\n');
|
|
353
|
+
await prompts.log.info(`MCPs recomendados (rode quando quiser):\n${lines}`);
|
|
354
|
+
}
|
|
355
|
+
// Remind only when a written server expects secrets the user must fill.
|
|
356
|
+
const needsSecrets = toWrite.filter((m) => m.server && m.server.env && Object.keys(m.server.env).length > 0);
|
|
357
|
+
if (needsSecrets.length > 0) {
|
|
358
|
+
const vars = [...new Set(needsSecrets.flatMap((m) => Object.values(m.server.env)))];
|
|
359
|
+
await prompts.log.warn(`Defina as variáveis de ambiente dos MCPs antes de usar: ${vars.join(', ')}`);
|
|
360
|
+
}
|
|
361
|
+
} catch (error) {
|
|
362
|
+
await prompts.log.warn(`Falha ao configurar MCPs: ${error.message}`);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Install/recommend the CLIs the agents shell out to (agent-browser,
|
|
366
|
+
// rtk). The ui already detected what's present and split the rest into
|
|
367
|
+
// install-now vs recommend; here we run the chosen install commands and
|
|
368
|
+
// print the rest. Install runs system commands (npm install -g, curl |
|
|
369
|
+
// sh) — a failure warns and never aborts the install. CLIs are not
|
|
370
|
+
// tracked in installedFiles (they live outside the project tree).
|
|
371
|
+
const cliPlan = config.cliPlan || { toInstall: [], toRecommend: [], alreadyInstalled: [] };
|
|
372
|
+
try {
|
|
373
|
+
const alreadyInstalled = cliPlan.alreadyInstalled || [];
|
|
374
|
+
if (alreadyInstalled.length > 0) {
|
|
375
|
+
await prompts.log.info(`CLIs já instalados (mantidos): ${alreadyInstalled.map((c) => c.id).join(', ')}`);
|
|
376
|
+
}
|
|
377
|
+
const toInstall = cliPlan.toInstall || [];
|
|
378
|
+
if (toInstall.length > 0) {
|
|
379
|
+
message('Installing CLIs...');
|
|
380
|
+
const cliResult = await installClis({ clis: toInstall });
|
|
381
|
+
if (cliResult.installed.length > 0) {
|
|
382
|
+
addResult('CLIs', 'ok', `instalados: ${cliResult.installed.join(', ')}`);
|
|
383
|
+
}
|
|
384
|
+
for (const f of cliResult.failed) {
|
|
385
|
+
await prompts.log.warn(
|
|
386
|
+
`Falha ao instalar CLI ${f.id}: ${f.error}. Rode manualmente: ${renderInstallCommand(toInstall.find((c) => c.id === f.id) || {})}`,
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const toRecommend = cliPlan.toRecommend || [];
|
|
391
|
+
if (toRecommend.length > 0) {
|
|
392
|
+
const lines = toRecommend.map((c) => ` ${renderInstallCommand(c)}`).join('\n');
|
|
393
|
+
await prompts.log.info(`CLIs recomendados (rode quando quiser):\n${lines}`);
|
|
394
|
+
}
|
|
395
|
+
} catch (error) {
|
|
396
|
+
await prompts.log.warn(`Falha ao configurar CLIs: ${error.message}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
300
400
|
message('Generating manifests...');
|
|
301
401
|
const manifestGen = new ManifestGenerator();
|
|
302
402
|
const preservedModules = originalConfig._preserveModules || [];
|
|
@@ -314,14 +414,14 @@ class Installer {
|
|
|
314
414
|
modulesForCsvPreserve = preservedModules.length > 0 ? [...allModules, ...preservedModules] : allModules;
|
|
315
415
|
}
|
|
316
416
|
|
|
317
|
-
await this._trackPreservedModuleFiles(paths.
|
|
417
|
+
await this._trackPreservedModuleFiles(paths.wizzDir, preservedModules);
|
|
318
418
|
|
|
319
|
-
await manifestGen.generateManifests(paths.
|
|
419
|
+
await manifestGen.generateManifests(paths.wizzDir, allModulesForManifest, [...this.installedFiles], {
|
|
320
420
|
ides: config.ides || [],
|
|
321
421
|
preservedModules: modulesForCsvPreserve,
|
|
322
422
|
moduleConfigs,
|
|
323
423
|
});
|
|
324
|
-
await this._appendPreservedSkillManifestRows(paths.
|
|
424
|
+
await this._appendPreservedSkillManifestRows(paths.wizzDir, previousSkillManifestRows, preservedModules);
|
|
325
425
|
|
|
326
426
|
// Apply post-install --set TOML patches. Runs after writeCentralConfig
|
|
327
427
|
// (inside generateManifests above) so the patch operates on the
|
|
@@ -329,7 +429,7 @@ class Installer {
|
|
|
329
429
|
// See `tools/installer/set-overrides.js` for routing rules.
|
|
330
430
|
if (config.setOverrides && Object.keys(config.setOverrides).length > 0) {
|
|
331
431
|
const { applySetOverrides } = require('../set-overrides');
|
|
332
|
-
const applied = await applySetOverrides(config.setOverrides, paths.
|
|
432
|
+
const applied = await applySetOverrides(config.setOverrides, paths.wizzDir);
|
|
333
433
|
if (applied.length > 0) {
|
|
334
434
|
const summary = applied.map((a) => `${a.module}.${a.key} → ${a.file}`).join(', ');
|
|
335
435
|
await prompts.log.info(`Applied --set overrides: ${summary}`);
|
|
@@ -337,7 +437,7 @@ class Installer {
|
|
|
337
437
|
}
|
|
338
438
|
|
|
339
439
|
message('Generating help catalog...');
|
|
340
|
-
await this.mergeModuleHelpCatalogs(paths.
|
|
440
|
+
await this.mergeModuleHelpCatalogs(paths.wizzDir, manifestGen.agents);
|
|
341
441
|
addResult('Help catalog', 'ok');
|
|
342
442
|
|
|
343
443
|
return 'Configurations generated';
|
|
@@ -380,7 +480,7 @@ class Installer {
|
|
|
380
480
|
return;
|
|
381
481
|
}
|
|
382
482
|
|
|
383
|
-
const setupResults = await this.ideManager.setupBatch(validIdes, paths.projectRoot, paths.
|
|
483
|
+
const setupResults = await this.ideManager.setupBatch(validIdes, paths.projectRoot, paths.wizzDir, {
|
|
384
484
|
selectedModules: allModules || [],
|
|
385
485
|
verbose: config.verbose,
|
|
386
486
|
previousSkillIds,
|
|
@@ -401,41 +501,41 @@ class Installer {
|
|
|
401
501
|
* Skills are self-contained in IDE directories, so _wizz/ only needs
|
|
402
502
|
* module-level files (config.yaml, _config/, etc.).
|
|
403
503
|
* Also cleans up skill dirs left by older installer versions.
|
|
404
|
-
* @param {string}
|
|
504
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
405
505
|
*/
|
|
406
|
-
async _cleanupSkillDirs(
|
|
506
|
+
async _cleanupSkillDirs(wizzDir) {
|
|
407
507
|
const csv = require('csv-parse/sync');
|
|
408
|
-
const csvPath = path.join(
|
|
508
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
409
509
|
if (!(await fs.pathExists(csvPath))) return;
|
|
410
510
|
|
|
411
511
|
const csvContent = await fs.readFile(csvPath, 'utf8');
|
|
412
512
|
const records = csv.parse(csvContent, { columns: true, skip_empty_lines: true });
|
|
413
|
-
const
|
|
414
|
-
const
|
|
513
|
+
const wizzFolderName = path.basename(wizzDir);
|
|
514
|
+
const wizzPrefix = wizzFolderName + '/';
|
|
415
515
|
|
|
416
516
|
for (const record of records) {
|
|
417
517
|
if (!record.path) continue;
|
|
418
|
-
const relativePath = record.path.startsWith(
|
|
419
|
-
const sourceDir = path.dirname(path.join(
|
|
518
|
+
const relativePath = record.path.startsWith(wizzPrefix) ? record.path.slice(wizzPrefix.length) : record.path;
|
|
519
|
+
const sourceDir = path.dirname(path.join(wizzDir, relativePath));
|
|
420
520
|
if (await fs.pathExists(sourceDir)) {
|
|
421
521
|
await fs.remove(sourceDir);
|
|
422
|
-
await this._removeEmptyParents(path.dirname(sourceDir),
|
|
522
|
+
await this._removeEmptyParents(path.dirname(sourceDir), wizzDir);
|
|
423
523
|
}
|
|
424
524
|
}
|
|
425
525
|
}
|
|
426
526
|
|
|
427
527
|
/**
|
|
428
528
|
* Remove now-empty parent directories left behind after skill dir cleanup.
|
|
429
|
-
* Walks up from dir, stopping at (and never removing)
|
|
529
|
+
* Walks up from dir, stopping at (and never removing) wizzDir. Best-effort:
|
|
430
530
|
* a directory that vanishes or fills in mid-walk just ends the walk.
|
|
431
531
|
* @param {string} dir - Directory to start walking up from
|
|
432
|
-
* @param {string}
|
|
532
|
+
* @param {string} wizzDir - WIZZ installation directory (boundary)
|
|
433
533
|
*/
|
|
434
|
-
async _removeEmptyParents(dir,
|
|
534
|
+
async _removeEmptyParents(dir, wizzDir) {
|
|
435
535
|
let current = dir;
|
|
436
536
|
while (true) {
|
|
437
537
|
// Path-boundary check (not a string prefix, so siblings like _wizz2 don't match).
|
|
438
|
-
const rel = path.relative(
|
|
538
|
+
const rel = path.relative(wizzDir, current);
|
|
439
539
|
if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) break;
|
|
440
540
|
try {
|
|
441
541
|
const entries = await fs.readdir(current);
|
|
@@ -448,8 +548,8 @@ class Installer {
|
|
|
448
548
|
}
|
|
449
549
|
}
|
|
450
550
|
|
|
451
|
-
async _readSkillManifestRows(
|
|
452
|
-
const csvPath = path.join(
|
|
551
|
+
async _readSkillManifestRows(wizzDir) {
|
|
552
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
453
553
|
if (!(await fs.pathExists(csvPath))) return [];
|
|
454
554
|
|
|
455
555
|
try {
|
|
@@ -473,17 +573,17 @@ class Installer {
|
|
|
473
573
|
return ids;
|
|
474
574
|
}
|
|
475
575
|
|
|
476
|
-
async _appendPreservedSkillManifestRows(
|
|
576
|
+
async _appendPreservedSkillManifestRows(wizzDir, previousRows, preservedModules = []) {
|
|
477
577
|
if (!previousRows || previousRows.length === 0 || preservedModules.length === 0) return;
|
|
478
578
|
|
|
479
579
|
const preservedModuleSet = new Set(preservedModules);
|
|
480
580
|
const rowsToPreserve = previousRows.filter((row) => row.canonicalId && row.module && preservedModuleSet.has(row.module));
|
|
481
581
|
if (rowsToPreserve.length === 0) return;
|
|
482
582
|
|
|
483
|
-
const csvPath = path.join(
|
|
583
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
484
584
|
if (!(await fs.pathExists(csvPath))) return;
|
|
485
585
|
|
|
486
|
-
const currentRows = await this._readSkillManifestRows(
|
|
586
|
+
const currentRows = await this._readSkillManifestRows(wizzDir);
|
|
487
587
|
const activeIds = new Set(currentRows.map((row) => row.canonicalId).filter(Boolean));
|
|
488
588
|
const appendedRows = [];
|
|
489
589
|
|
|
@@ -529,7 +629,7 @@ class Installer {
|
|
|
529
629
|
message(`Restoring ${updateState.customFiles.length} custom files...`);
|
|
530
630
|
|
|
531
631
|
for (const originalPath of updateState.customFiles) {
|
|
532
|
-
const relativePath = path.relative(paths.
|
|
632
|
+
const relativePath = path.relative(paths.wizzDir, originalPath);
|
|
533
633
|
const backupPath = path.join(updateState.tempBackupDir, relativePath);
|
|
534
634
|
|
|
535
635
|
if (await fs.pathExists(backupPath)) {
|
|
@@ -552,7 +652,7 @@ class Installer {
|
|
|
552
652
|
message(`Restoring ${restoredModifiedFiles.length} modified files as .bak...`);
|
|
553
653
|
|
|
554
654
|
for (const modifiedFile of restoredModifiedFiles) {
|
|
555
|
-
const relativePath = path.relative(paths.
|
|
655
|
+
const relativePath = path.relative(paths.wizzDir, modifiedFile.path);
|
|
556
656
|
const tempBackupPath = path.join(updateState.tempModifiedBackupDir, relativePath);
|
|
557
657
|
const bakPath = modifiedFile.path + '.bak';
|
|
558
658
|
|
|
@@ -584,8 +684,8 @@ class Installer {
|
|
|
584
684
|
*/
|
|
585
685
|
async _prepareUpdateState(paths, config, existingInstall, officialModules) {
|
|
586
686
|
// Detect custom and modified files BEFORE updating (compare current files vs files-manifest.csv)
|
|
587
|
-
const existingFilesManifest = await this.readFilesManifest(paths.
|
|
588
|
-
const { customFiles, modifiedFiles } = await this.detectCustomFiles(paths.
|
|
687
|
+
const existingFilesManifest = await this.readFilesManifest(paths.wizzDir);
|
|
688
|
+
const { customFiles, modifiedFiles } = await this.detectCustomFiles(paths.wizzDir, existingFilesManifest);
|
|
589
689
|
|
|
590
690
|
// Preserve existing core configuration during updates
|
|
591
691
|
// (no-op for quick-update which already has core config from collectModuleConfigQuick)
|
|
@@ -630,7 +730,7 @@ class Installer {
|
|
|
630
730
|
await fs.ensureDir(tempBackupDir);
|
|
631
731
|
|
|
632
732
|
for (const customFile of customFiles) {
|
|
633
|
-
const relativePath = path.relative(paths.
|
|
733
|
+
const relativePath = path.relative(paths.wizzDir, customFile);
|
|
634
734
|
const backupPath = path.join(tempBackupDir, relativePath);
|
|
635
735
|
await fs.ensureDir(path.dirname(backupPath));
|
|
636
736
|
await fs.copy(customFile, backupPath);
|
|
@@ -642,7 +742,7 @@ class Installer {
|
|
|
642
742
|
await fs.ensureDir(tempModifiedBackupDir);
|
|
643
743
|
|
|
644
744
|
for (const modifiedFile of modifiedFiles) {
|
|
645
|
-
const relativePath = path.relative(paths.
|
|
745
|
+
const relativePath = path.relative(paths.wizzDir, modifiedFile.path);
|
|
646
746
|
const tempBackupPath = path.join(tempModifiedBackupDir, relativePath);
|
|
647
747
|
await fs.ensureDir(path.dirname(tempBackupPath));
|
|
648
748
|
await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true });
|
|
@@ -696,9 +796,9 @@ class Installer {
|
|
|
696
796
|
}
|
|
697
797
|
}
|
|
698
798
|
|
|
699
|
-
async _trackPreservedModuleFiles(
|
|
799
|
+
async _trackPreservedModuleFiles(wizzDir, preservedModules = []) {
|
|
700
800
|
for (const moduleName of preservedModules) {
|
|
701
|
-
const modulePath = path.join(
|
|
801
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
702
802
|
if (await fs.pathExists(modulePath)) {
|
|
703
803
|
await this._trackFilesRecursive(modulePath);
|
|
704
804
|
}
|
|
@@ -727,7 +827,7 @@ class Installer {
|
|
|
727
827
|
const moduleConfig = officialModules.moduleConfigs[moduleName] || {};
|
|
728
828
|
const installResult = await officialModules.install(
|
|
729
829
|
moduleName,
|
|
730
|
-
paths.
|
|
830
|
+
paths.wizzDir,
|
|
731
831
|
(filePath) => {
|
|
732
832
|
this.installedFiles.add(filePath);
|
|
733
833
|
},
|
|
@@ -769,11 +869,11 @@ class Installer {
|
|
|
769
869
|
|
|
770
870
|
/**
|
|
771
871
|
* Read files-manifest.csv
|
|
772
|
-
* @param {string}
|
|
872
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
773
873
|
* @returns {Array} Array of file entries from files-manifest.csv
|
|
774
874
|
*/
|
|
775
|
-
async readFilesManifest(
|
|
776
|
-
const filesManifestPath = path.join(
|
|
875
|
+
async readFilesManifest(wizzDir) {
|
|
876
|
+
const filesManifestPath = path.join(wizzDir, '_config', 'files-manifest.csv');
|
|
777
877
|
if (!(await fs.pathExists(filesManifestPath))) {
|
|
778
878
|
return [];
|
|
779
879
|
}
|
|
@@ -825,11 +925,11 @@ class Installer {
|
|
|
825
925
|
|
|
826
926
|
/**
|
|
827
927
|
* Detect custom and modified files
|
|
828
|
-
* @param {string}
|
|
928
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
829
929
|
* @param {Array} existingFilesManifest - Previous files from files-manifest.csv
|
|
830
930
|
* @returns {Object} Object with customFiles and modifiedFiles arrays
|
|
831
931
|
*/
|
|
832
|
-
async detectCustomFiles(
|
|
932
|
+
async detectCustomFiles(wizzDir, existingFilesManifest) {
|
|
833
933
|
const customFiles = [];
|
|
834
934
|
const modifiedFiles = [];
|
|
835
935
|
|
|
@@ -837,7 +937,7 @@ class Installer {
|
|
|
837
937
|
// per-user runtime data generated by agents with sidecars. These files
|
|
838
938
|
// aren't installer-managed and must never be reported as "custom" or
|
|
839
939
|
// "modified" — they're user state, not user overrides.
|
|
840
|
-
const
|
|
940
|
+
const wizzMemoryPaths = ['_memory', 'memory'];
|
|
841
941
|
|
|
842
942
|
// Check if the manifest has hashes - if not, we can't detect modifications
|
|
843
943
|
let manifestHasHashes = false;
|
|
@@ -849,7 +949,7 @@ class Installer {
|
|
|
849
949
|
const installedFilesMap = new Map();
|
|
850
950
|
for (const fileEntry of existingFilesManifest) {
|
|
851
951
|
if (fileEntry.path) {
|
|
852
|
-
const absolutePath = path.join(
|
|
952
|
+
const absolutePath = path.join(wizzDir, fileEntry.path);
|
|
853
953
|
installedFilesMap.set(path.normalize(absolutePath), {
|
|
854
954
|
hash: fileEntry.hash,
|
|
855
955
|
relativePath: fileEntry.path,
|
|
@@ -857,7 +957,7 @@ class Installer {
|
|
|
857
957
|
}
|
|
858
958
|
}
|
|
859
959
|
|
|
860
|
-
// Recursively scan
|
|
960
|
+
// Recursively scan wizzDir for all files
|
|
861
961
|
const scanDirectory = async (dir) => {
|
|
862
962
|
try {
|
|
863
963
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -875,7 +975,7 @@ class Installer {
|
|
|
875
975
|
const fileInfo = installedFilesMap.get(normalizedPath);
|
|
876
976
|
|
|
877
977
|
// Skip certain system files that are auto-generated
|
|
878
|
-
const relativePath = path.relative(
|
|
978
|
+
const relativePath = path.relative(wizzDir, fullPath);
|
|
879
979
|
const fileName = path.basename(fullPath);
|
|
880
980
|
|
|
881
981
|
// Skip _config directory EXCEPT for modified agent customizations
|
|
@@ -883,7 +983,7 @@ class Installer {
|
|
|
883
983
|
// Special handling for .customize.yaml files - only preserve if modified
|
|
884
984
|
if (relativePath.includes('/agents/') && fileName.endsWith('.customize.yaml')) {
|
|
885
985
|
// Check if the customization file has been modified from manifest
|
|
886
|
-
const manifestPath = path.join(
|
|
986
|
+
const manifestPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
887
987
|
if (await fs.pathExists(manifestPath)) {
|
|
888
988
|
const crypto = require('node:crypto');
|
|
889
989
|
const currentContent = await fs.readFile(fullPath, 'utf8');
|
|
@@ -903,7 +1003,7 @@ class Installer {
|
|
|
903
1003
|
continue;
|
|
904
1004
|
}
|
|
905
1005
|
|
|
906
|
-
if (
|
|
1006
|
+
if (wizzMemoryPaths.some((mp) => relativePath === mp || relativePath.startsWith(mp + '/'))) {
|
|
907
1007
|
continue;
|
|
908
1008
|
}
|
|
909
1009
|
|
|
@@ -937,29 +1037,29 @@ class Installer {
|
|
|
937
1037
|
}
|
|
938
1038
|
};
|
|
939
1039
|
|
|
940
|
-
await scanDirectory(
|
|
1040
|
+
await scanDirectory(wizzDir);
|
|
941
1041
|
return { customFiles, modifiedFiles };
|
|
942
1042
|
}
|
|
943
1043
|
|
|
944
1044
|
/**
|
|
945
1045
|
* Generate clean config.yaml files for each installed module
|
|
946
|
-
* @param {string}
|
|
1046
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
947
1047
|
* @param {Object} moduleConfigs - Collected configuration values
|
|
948
1048
|
*/
|
|
949
|
-
async generateModuleConfigs(
|
|
1049
|
+
async generateModuleConfigs(wizzDir, moduleConfigs) {
|
|
950
1050
|
const yaml = require('yaml');
|
|
951
1051
|
|
|
952
1052
|
// Extract core config values to share with other modules
|
|
953
1053
|
const coreConfig = moduleConfigs.core || {};
|
|
954
1054
|
|
|
955
1055
|
// Get all installed module directories
|
|
956
|
-
const entries = await fs.readdir(
|
|
1056
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
957
1057
|
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
958
1058
|
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
959
1059
|
|
|
960
1060
|
// Generate config.yaml for each installed module
|
|
961
1061
|
for (const moduleName of installedModules) {
|
|
962
|
-
const modulePath = path.join(
|
|
1062
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
963
1063
|
|
|
964
1064
|
// Get module-specific config or use empty object if none
|
|
965
1065
|
const config = moduleConfigs[moduleName] || {};
|
|
@@ -1040,17 +1140,17 @@ class Installer {
|
|
|
1040
1140
|
* Merge all module-help.csv files into a single wizz-help.csv.
|
|
1041
1141
|
* Scans all installed modules for module-help.csv and merges them.
|
|
1042
1142
|
* Output preserves the source schema verbatim — see schema below.
|
|
1043
|
-
* @param {string}
|
|
1143
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
1044
1144
|
* @param {Array<Object>} _agentEntries - Unused; retained for call-site compatibility
|
|
1045
1145
|
*/
|
|
1046
|
-
async mergeModuleHelpCatalogs(
|
|
1146
|
+
async mergeModuleHelpCatalogs(wizzDir, _agentEntries = []) {
|
|
1047
1147
|
const allRows = [];
|
|
1048
1148
|
const headerRow = MODULE_HELP_CSV_HEADER;
|
|
1049
1149
|
const COLUMN_COUNT = 13;
|
|
1050
1150
|
const PHASE_INDEX = 7;
|
|
1051
1151
|
|
|
1052
1152
|
// Get all installed module directories
|
|
1053
|
-
const entries = await fs.readdir(
|
|
1153
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
1054
1154
|
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
1055
1155
|
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
1056
1156
|
|
|
@@ -1065,7 +1165,7 @@ class Installer {
|
|
|
1065
1165
|
|
|
1066
1166
|
// Map installed module paths
|
|
1067
1167
|
for (const moduleName of installedModules) {
|
|
1068
|
-
const modulePath = path.join(
|
|
1168
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
1069
1169
|
modulePaths.set(moduleName, modulePath);
|
|
1070
1170
|
}
|
|
1071
1171
|
|
|
@@ -1111,7 +1211,7 @@ class Installer {
|
|
|
1111
1211
|
allRows.push(padded.map((c) => this.escapeCSVField(c)).join(','));
|
|
1112
1212
|
}
|
|
1113
1213
|
|
|
1114
|
-
if (process.env.
|
|
1214
|
+
if (process.env.WIZZ_VERBOSE_INSTALL === 'true') {
|
|
1115
1215
|
await prompts.log.message(` Merged module-help from: ${moduleName}`);
|
|
1116
1216
|
}
|
|
1117
1217
|
} catch (error) {
|
|
@@ -1136,7 +1236,7 @@ class Installer {
|
|
|
1136
1236
|
const sortedRows = decorated.map((d) => d.row);
|
|
1137
1237
|
|
|
1138
1238
|
// Write merged catalog
|
|
1139
|
-
const outputDir = path.join(
|
|
1239
|
+
const outputDir = path.join(wizzDir, '_config');
|
|
1140
1240
|
await fs.ensureDir(outputDir);
|
|
1141
1241
|
const outputPath = path.join(outputDir, 'wizz-help.csv');
|
|
1142
1242
|
|
|
@@ -1146,7 +1246,7 @@ class Installer {
|
|
|
1146
1246
|
// Track the installed file
|
|
1147
1247
|
this.installedFiles.add(outputPath);
|
|
1148
1248
|
|
|
1149
|
-
if (process.env.
|
|
1249
|
+
if (process.env.WIZZ_VERBOSE_INSTALL === 'true') {
|
|
1150
1250
|
await prompts.log.message(` Generated wizz-help.csv: ${sortedRows.length} workflows`);
|
|
1151
1251
|
}
|
|
1152
1252
|
}
|
|
@@ -1154,7 +1254,7 @@ class Installer {
|
|
|
1154
1254
|
/**
|
|
1155
1255
|
* Render a consolidated install summary using prompts.note()
|
|
1156
1256
|
* @param {Array} results - Array of {step, status: 'ok'|'error'|'warn', detail}
|
|
1157
|
-
* @param {Object} context - {
|
|
1257
|
+
* @param {Object} context - {wizzDir, modules, ides, customFiles, modifiedFiles}
|
|
1158
1258
|
*/
|
|
1159
1259
|
async renderInstallSummary(results, context = {}) {
|
|
1160
1260
|
const color = await prompts.getColor();
|
|
@@ -1216,8 +1316,8 @@ class Installer {
|
|
|
1216
1316
|
|
|
1217
1317
|
// Context and warnings
|
|
1218
1318
|
lines.push('');
|
|
1219
|
-
if (context.
|
|
1220
|
-
lines.push(` Installed to: ${context.
|
|
1319
|
+
if (context.wizzDir) {
|
|
1320
|
+
lines.push(` Installed to: ${context.wizzDir}`);
|
|
1221
1321
|
}
|
|
1222
1322
|
if (context.customFiles && context.customFiles.length > 0) {
|
|
1223
1323
|
lines.push(` ${color.cyan(`Custom files preserved: ${context.customFiles.length}`)}`);
|
|
@@ -1250,18 +1350,18 @@ class Installer {
|
|
|
1250
1350
|
*/
|
|
1251
1351
|
async quickUpdate(config) {
|
|
1252
1352
|
const projectDir = path.resolve(config.directory);
|
|
1253
|
-
const {
|
|
1353
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1254
1354
|
|
|
1255
|
-
// Check if
|
|
1256
|
-
if (!(await fs.pathExists(
|
|
1257
|
-
throw new Error(`Wizz not installed at ${
|
|
1355
|
+
// Check if wizz directory exists
|
|
1356
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
1357
|
+
throw new Error(`Wizz not installed at ${wizzDir}. Use regular install for first-time setup.`);
|
|
1258
1358
|
}
|
|
1259
1359
|
|
|
1260
1360
|
// Detect existing installation
|
|
1261
|
-
const existingInstall = await ExistingInstall.detect(
|
|
1361
|
+
const existingInstall = await ExistingInstall.detect(wizzDir);
|
|
1262
1362
|
const installedModules = existingInstall.moduleIds;
|
|
1263
1363
|
const configuredIdes = existingInstall.ides;
|
|
1264
|
-
const projectRoot = path.dirname(
|
|
1364
|
+
const projectRoot = path.dirname(wizzDir);
|
|
1265
1365
|
|
|
1266
1366
|
// Get available modules (what we have source for)
|
|
1267
1367
|
const availableModulesData = await new OfficialModules().listAvailable();
|
|
@@ -1285,7 +1385,7 @@ class Installer {
|
|
|
1285
1385
|
const customMgr = new CustomModuleManager();
|
|
1286
1386
|
for (const moduleId of installedModules) {
|
|
1287
1387
|
if (!availableModules.some((m) => m.id === moduleId)) {
|
|
1288
|
-
const customSource = await customMgr.findModuleSourceByCode(moduleId, {
|
|
1388
|
+
const customSource = await customMgr.findModuleSourceByCode(moduleId, { wizzDir });
|
|
1289
1389
|
if (customSource) {
|
|
1290
1390
|
availableModules.push({
|
|
1291
1391
|
id: moduleId,
|
|
@@ -1313,7 +1413,7 @@ class Installer {
|
|
|
1313
1413
|
// silently redecide it. Without this, modules previously on 'next' or
|
|
1314
1414
|
// 'pinned' would trigger a stable-channel tag lookup at config-collection
|
|
1315
1415
|
// time, burning GitHub API quota and potentially failing.
|
|
1316
|
-
const manifestData = await this.manifest.read(
|
|
1416
|
+
const manifestData = await this.manifest.read(wizzDir);
|
|
1317
1417
|
const channelOptions = { global: null, nextSet: new Set(), pins: new Map(), warnings: [] };
|
|
1318
1418
|
if (manifestData?.modulesDetailed) {
|
|
1319
1419
|
const { fetchStableTags, classifyUpgrade, parseGitHubRepo } = require('../modules/channel-resolver');
|
|
@@ -1418,7 +1518,7 @@ class Installer {
|
|
|
1418
1518
|
}
|
|
1419
1519
|
|
|
1420
1520
|
/**
|
|
1421
|
-
* Uninstall
|
|
1521
|
+
* Uninstall WIZZ with selective removal options
|
|
1422
1522
|
* @param {string} directory - Project directory
|
|
1423
1523
|
* @param {Object} options - Uninstall options
|
|
1424
1524
|
* @param {boolean} [options.removeModules=true] - Remove _wizz/ directory
|
|
@@ -1428,15 +1528,15 @@ class Installer {
|
|
|
1428
1528
|
*/
|
|
1429
1529
|
async uninstall(directory, options = {}) {
|
|
1430
1530
|
const projectDir = path.resolve(directory);
|
|
1431
|
-
const {
|
|
1531
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1432
1532
|
|
|
1433
|
-
if (!(await fs.pathExists(
|
|
1533
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
1434
1534
|
return { success: false, reason: 'not-installed' };
|
|
1435
1535
|
}
|
|
1436
1536
|
|
|
1437
1537
|
// 1. DETECT: Read state BEFORE deleting anything
|
|
1438
|
-
const existingInstall = await ExistingInstall.detect(
|
|
1439
|
-
const outputFolder = await this._readOutputFolder(
|
|
1538
|
+
const existingInstall = await ExistingInstall.detect(wizzDir);
|
|
1539
|
+
const outputFolder = await this._readOutputFolder(wizzDir);
|
|
1440
1540
|
|
|
1441
1541
|
const removed = { modules: false, ideConfigs: false, outputFolder: false };
|
|
1442
1542
|
|
|
@@ -1451,7 +1551,7 @@ class Installer {
|
|
|
1451
1551
|
removed.outputFolder = await this.uninstallOutputFolder(projectDir, outputFolder);
|
|
1452
1552
|
}
|
|
1453
1553
|
|
|
1454
|
-
// 4.
|
|
1554
|
+
// 4. WIZZ DIRECTORY (last, after everything that needs it)
|
|
1455
1555
|
if (options.removeModules !== false) {
|
|
1456
1556
|
removed.modules = await this.uninstallModules(projectDir);
|
|
1457
1557
|
}
|
|
@@ -1502,9 +1602,9 @@ class Installer {
|
|
|
1502
1602
|
* @returns {Promise<boolean>} Whether the directory was removed
|
|
1503
1603
|
*/
|
|
1504
1604
|
async uninstallModules(projectDir) {
|
|
1505
|
-
const {
|
|
1506
|
-
if (await fs.pathExists(
|
|
1507
|
-
await fs.remove(
|
|
1605
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1606
|
+
if (await fs.pathExists(wizzDir)) {
|
|
1607
|
+
await fs.remove(wizzDir);
|
|
1508
1608
|
return true;
|
|
1509
1609
|
}
|
|
1510
1610
|
return false;
|
|
@@ -1515,8 +1615,8 @@ class Installer {
|
|
|
1515
1615
|
*/
|
|
1516
1616
|
async getStatus(directory) {
|
|
1517
1617
|
const projectDir = path.resolve(directory);
|
|
1518
|
-
const {
|
|
1519
|
-
return await ExistingInstall.detect(
|
|
1618
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1619
|
+
return await ExistingInstall.detect(wizzDir);
|
|
1520
1620
|
}
|
|
1521
1621
|
|
|
1522
1622
|
/**
|
|
@@ -1528,37 +1628,37 @@ class Installer {
|
|
|
1528
1628
|
|
|
1529
1629
|
/**
|
|
1530
1630
|
* Get the configured output folder name for a project
|
|
1531
|
-
* Resolves
|
|
1631
|
+
* Resolves wizzDir internally from projectDir
|
|
1532
1632
|
* @param {string} projectDir - Project directory
|
|
1533
1633
|
* @returns {string} Output folder name (relative, default: '_wizz-output')
|
|
1534
1634
|
*/
|
|
1535
1635
|
async getOutputFolder(projectDir) {
|
|
1536
|
-
const {
|
|
1537
|
-
return this._readOutputFolder(
|
|
1636
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1637
|
+
return this._readOutputFolder(wizzDir);
|
|
1538
1638
|
}
|
|
1539
1639
|
|
|
1540
1640
|
/**
|
|
1541
|
-
* Find the
|
|
1641
|
+
* Find the wizz installation directory in a project
|
|
1542
1642
|
* Always uses the standard _wizz folder name
|
|
1543
1643
|
* @param {string} projectDir - Project directory
|
|
1544
|
-
* @returns {Promise<Object>} {
|
|
1644
|
+
* @returns {Promise<Object>} { wizzDir: string }
|
|
1545
1645
|
*/
|
|
1546
|
-
async
|
|
1547
|
-
const
|
|
1548
|
-
return {
|
|
1646
|
+
async findWizzDir(projectDir) {
|
|
1647
|
+
const wizzDir = path.join(projectDir, WIZZ_FOLDER_NAME);
|
|
1648
|
+
return { wizzDir };
|
|
1549
1649
|
}
|
|
1550
1650
|
|
|
1551
1651
|
/**
|
|
1552
1652
|
* Read the output_folder setting from module config files
|
|
1553
1653
|
* Checks bmm/config.yaml first, then other module configs
|
|
1554
|
-
* @param {string}
|
|
1654
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
1555
1655
|
* @returns {string} Output folder path or default
|
|
1556
1656
|
*/
|
|
1557
|
-
async _readOutputFolder(
|
|
1657
|
+
async _readOutputFolder(wizzDir) {
|
|
1558
1658
|
const yaml = require('yaml');
|
|
1559
1659
|
|
|
1560
1660
|
// Check bmm/config.yaml first (most common)
|
|
1561
|
-
const bmmConfigPath = path.join(
|
|
1661
|
+
const bmmConfigPath = path.join(wizzDir, 'bmm', 'config.yaml');
|
|
1562
1662
|
if (await fs.pathExists(bmmConfigPath)) {
|
|
1563
1663
|
try {
|
|
1564
1664
|
const content = await fs.readFile(bmmConfigPath, 'utf8');
|
|
@@ -1574,10 +1674,10 @@ class Installer {
|
|
|
1574
1674
|
|
|
1575
1675
|
// Scan other module config.yaml files
|
|
1576
1676
|
try {
|
|
1577
|
-
const entries = await fs.readdir(
|
|
1677
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
1578
1678
|
for (const entry of entries) {
|
|
1579
1679
|
if (!entry.isDirectory() || entry.name === 'bmm' || entry.name.startsWith('_')) continue;
|
|
1580
|
-
const configPath = path.join(
|
|
1680
|
+
const configPath = path.join(wizzDir, entry.name, 'config.yaml');
|
|
1581
1681
|
if (await fs.pathExists(configPath)) {
|
|
1582
1682
|
try {
|
|
1583
1683
|
const content = await fs.readFile(configPath, 'utf8');
|