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
|
@@ -19,7 +19,7 @@ function normalizeChannelName(raw) {
|
|
|
19
19
|
/**
|
|
20
20
|
* Conservative quoting for tag names passed to git commands. Tags are
|
|
21
21
|
* user-typed (--pin) or come from the GitHub API. Only allow the semver
|
|
22
|
-
* character class we use to tag
|
|
22
|
+
* character class we use to tag Wizz releases; anything else throws.
|
|
23
23
|
*/
|
|
24
24
|
function quoteShell(ref) {
|
|
25
25
|
if (typeof ref !== 'string' || !/^[\w.\-+/]+$/.test(ref)) {
|
|
@@ -46,7 +46,7 @@ async function writeChannelMarker(markerPath, data) {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
const REGISTRY_CONFIG_PATH = path.join(getProjectRoot(), '
|
|
49
|
+
const REGISTRY_CONFIG_PATH = path.join(getProjectRoot(), 'wizz-modules.yaml');
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
52
|
* Manages official modules from the bundled registry file. The remote
|
|
@@ -109,7 +109,7 @@ class ExternalModuleManager {
|
|
|
109
109
|
name: mod.display_name || mod.name,
|
|
110
110
|
description: mod.description || '',
|
|
111
111
|
defaultSelected: mod.default_selected === true || mod.defaultSelected === true,
|
|
112
|
-
type: mod.type || '
|
|
112
|
+
type: mod.type || 'wizz-org',
|
|
113
113
|
npmPackage: mod.npm_package || mod.npmPackage || null,
|
|
114
114
|
pluginName: mod.plugin_name || mod.pluginName || null,
|
|
115
115
|
defaultChannel: normalizeChannelName(mod.default_channel || mod.defaultChannel) || 'stable',
|
|
@@ -153,7 +153,7 @@ class ExternalModuleManager {
|
|
|
153
153
|
* @returns {string} Path to the external modules cache directory
|
|
154
154
|
*/
|
|
155
155
|
getExternalCacheDir() {
|
|
156
|
-
const cacheDir = path.join(os.homedir(), '.
|
|
156
|
+
const cacheDir = path.join(os.homedir(), '.wizz', 'cache', 'external-modules');
|
|
157
157
|
return cacheDir;
|
|
158
158
|
}
|
|
159
159
|
|
|
@@ -255,7 +255,7 @@ class ExternalModuleManager {
|
|
|
255
255
|
// updates" and re-use the cached version silently — that's the right
|
|
256
256
|
// call for an update/quick-update, since the semantics don't change
|
|
257
257
|
// and the user isn't worse off than before they ran this command.
|
|
258
|
-
const cachedMarker = await readChannelMarker(path.join(moduleCacheDir, '.
|
|
258
|
+
const cachedMarker = await readChannelMarker(path.join(moduleCacheDir, '.wizz-channel.json'));
|
|
259
259
|
if (cachedMarker?.channel && (await fs.pathExists(moduleCacheDir))) {
|
|
260
260
|
if (!silent) {
|
|
261
261
|
await prompts.log.warn(
|
|
@@ -309,7 +309,7 @@ class ExternalModuleManager {
|
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
// ─── Clone or update cache by resolved channel ────────────────────────
|
|
312
|
-
const markerPath = path.join(moduleCacheDir, '.
|
|
312
|
+
const markerPath = path.join(moduleCacheDir, '.wizz-channel.json');
|
|
313
313
|
const currentMarker = await readChannelMarker(markerPath);
|
|
314
314
|
const needsChannelReset = currentMarker && currentMarker.channel !== resolved.channel;
|
|
315
315
|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Configures the recommended MCP servers for the chosen skill areas.
|
|
2
|
+
//
|
|
3
|
+
// The skills-registry.yaml is the single source of truth: besides mapping each
|
|
4
|
+
// AREA to its skills, it declares an `mcps:` list per area (plus a top-level
|
|
5
|
+
// `mcp_utility:` for cross-cutting servers like context7). This module reads
|
|
6
|
+
// that registry, resolves the user's chosen areas to a deduped set of MCP
|
|
7
|
+
// entries, and MERGES the selected ones into the project's `.mcp.json`.
|
|
8
|
+
//
|
|
9
|
+
// Design rules (kept deliberately conservative):
|
|
10
|
+
// - ADDITIVE: an existing server with the same id is never overwritten. The
|
|
11
|
+
// user's hand-tuned config always wins; we only ADD what is missing.
|
|
12
|
+
// - SECRETS STAY PLACEHOLDERS: `env` values come straight from the registry
|
|
13
|
+
// as `${VAR}` placeholders. We never read, infer, or write a real token.
|
|
14
|
+
// - NO-OP WHEN ABSENT: missing registry / no MCPs => returns empty, writes
|
|
15
|
+
// nothing. Always safe to call.
|
|
16
|
+
//
|
|
17
|
+
// The caller decides WHICH ids to write (the interactive multiselect) and which
|
|
18
|
+
// to merely recommend; this module exposes the resolution + merge primitives and
|
|
19
|
+
// a `claude mcp add` command renderer for the recommend path.
|
|
20
|
+
|
|
21
|
+
const path = require('node:path');
|
|
22
|
+
const fs = require('../fs-native');
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the recommended MCP entries for the chosen areas, deduped by id.
|
|
26
|
+
* Empty / undefined / containing 'all' means every area. The cross-cutting
|
|
27
|
+
* `mcp_utility:` servers are always included.
|
|
28
|
+
*
|
|
29
|
+
* @param {Object} registry - Parsed skills-registry.yaml
|
|
30
|
+
* @param {string[]} [selectedAreas] - Area keys to resolve
|
|
31
|
+
* @returns {Array<{id: string, when: string, server: Object, areas: string[]}>}
|
|
32
|
+
* One entry per unique MCP id, carrying which area(s) recommended it.
|
|
33
|
+
*/
|
|
34
|
+
function resolveMcps(registry, selectedAreas) {
|
|
35
|
+
const byId = new Map();
|
|
36
|
+
const areas = (registry && registry.areas) || {};
|
|
37
|
+
const wantAll = !selectedAreas || selectedAreas.length === 0 || selectedAreas.includes('all');
|
|
38
|
+
const chosen = wantAll ? Object.keys(areas) : selectedAreas;
|
|
39
|
+
|
|
40
|
+
const add = (mcp, areaKey) => {
|
|
41
|
+
if (!mcp || !mcp.id || !mcp.server) return;
|
|
42
|
+
const existing = byId.get(mcp.id);
|
|
43
|
+
if (existing) {
|
|
44
|
+
if (areaKey && !existing.areas.includes(areaKey)) existing.areas.push(areaKey);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
byId.set(mcp.id, {
|
|
48
|
+
id: mcp.id,
|
|
49
|
+
when: mcp.when || '',
|
|
50
|
+
server: mcp.server,
|
|
51
|
+
areas: areaKey ? [areaKey] : [],
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
for (const area of chosen) {
|
|
56
|
+
for (const mcp of (areas[area] && areas[area].mcps) || []) add(mcp, area);
|
|
57
|
+
}
|
|
58
|
+
// Cross-cutting servers are offered regardless of area selection.
|
|
59
|
+
for (const mcp of (registry && registry.mcp_utility) || []) add(mcp, null);
|
|
60
|
+
|
|
61
|
+
return [...byId.values()];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Normalize a registry `server` block into the shape written to `.mcp.json`.
|
|
66
|
+
* Drops empty `args`/`env` so the output stays minimal and diff-friendly.
|
|
67
|
+
* @param {Object} server - { command, args?, env? } from the registry
|
|
68
|
+
* @returns {Object} Sanitized server config
|
|
69
|
+
*/
|
|
70
|
+
function toServerConfig(server) {
|
|
71
|
+
const out = { command: server.command };
|
|
72
|
+
if (Array.isArray(server.args) && server.args.length > 0) out.args = [...server.args];
|
|
73
|
+
if (server.env && Object.keys(server.env).length > 0) out.env = { ...server.env };
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Render the `claude mcp add` command for an MCP entry — used to recommend
|
|
79
|
+
* servers the user chose NOT to write (nothing is lost; they can add later).
|
|
80
|
+
* @param {{id: string, server: Object}} mcp - Resolved MCP entry
|
|
81
|
+
* @returns {string} A copy-pasteable shell command
|
|
82
|
+
*/
|
|
83
|
+
function renderAddCommand({ id, server }) {
|
|
84
|
+
const envFlags = Object.entries(server.env || {})
|
|
85
|
+
.map(([k, v]) => `-e ${k}=${v}`)
|
|
86
|
+
.join(' ');
|
|
87
|
+
const args = (server.args || []).join(' ');
|
|
88
|
+
const cmd = `${server.command}${args ? ` ${args}` : ''}`;
|
|
89
|
+
return `claude mcp add ${id}${envFlags ? ` ${envFlags}` : ''} -- ${cmd}`.replaceAll(/\s+/g, ' ').trim();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Merge the chosen MCP entries into `<projectDir>/.mcp.json`, additively.
|
|
94
|
+
* Reads any existing file (preserving unknown keys and existing servers),
|
|
95
|
+
* adds only ids not already present, and writes back pretty-printed JSON.
|
|
96
|
+
*
|
|
97
|
+
* @param {Object} args
|
|
98
|
+
* @param {string} args.projectDir - Project root where `.mcp.json` lives
|
|
99
|
+
* @param {Array<{id: string, server: Object}>} args.mcps - Entries to write
|
|
100
|
+
* @param {(absPath: string) => void} [args.trackFile] - Record the written file
|
|
101
|
+
* @returns {Promise<{added: string[], skipped: string[], file: string|null}>}
|
|
102
|
+
* `added` = ids newly written, `skipped` = ids already present (left intact).
|
|
103
|
+
*/
|
|
104
|
+
async function writeMcpConfig({ projectDir, mcps, trackFile = () => {} }) {
|
|
105
|
+
if (!mcps || mcps.length === 0) return { added: [], skipped: [], file: null };
|
|
106
|
+
|
|
107
|
+
const file = path.join(projectDir, '.mcp.json');
|
|
108
|
+
let config = {};
|
|
109
|
+
if (await fs.pathExists(file)) {
|
|
110
|
+
try {
|
|
111
|
+
config = JSON.parse(await fs.readFile(file, 'utf8'));
|
|
112
|
+
} catch (error) {
|
|
113
|
+
throw new Error(`.mcp.json existe mas não é JSON válido: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!config || typeof config !== 'object') config = {};
|
|
117
|
+
if (!config.mcpServers || typeof config.mcpServers !== 'object') config.mcpServers = {};
|
|
118
|
+
|
|
119
|
+
const added = [];
|
|
120
|
+
const skipped = [];
|
|
121
|
+
for (const mcp of mcps) {
|
|
122
|
+
if (Object.prototype.hasOwnProperty.call(config.mcpServers, mcp.id)) {
|
|
123
|
+
skipped.push(mcp.id); // never clobber the user's existing server
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
config.mcpServers[mcp.id] = toServerConfig(mcp.server);
|
|
127
|
+
added.push(mcp.id);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (added.length === 0) return { added, skipped, file };
|
|
131
|
+
|
|
132
|
+
await fs.writeJson(file, config, { spaces: 2 });
|
|
133
|
+
trackFile(file);
|
|
134
|
+
return { added, skipped, file };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
module.exports = { resolveMcps, toServerConfig, renderAddCommand, writeMcpConfig };
|
|
@@ -264,27 +264,27 @@ class OfficialModules {
|
|
|
264
264
|
/**
|
|
265
265
|
* Install a module
|
|
266
266
|
* @param {string} moduleName - Code of the module to install (from module.yaml)
|
|
267
|
-
* @param {string}
|
|
267
|
+
* @param {string} wizzDir - Target wizz directory
|
|
268
268
|
* @param {Function} fileTrackingCallback - Optional callback to track installed files
|
|
269
269
|
* @param {Object} options - Additional installation options
|
|
270
270
|
* @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
|
|
271
271
|
* @param {Object} options.moduleConfig - Module configuration from config collector
|
|
272
272
|
* @param {Object} options.logger - Logger instance for output
|
|
273
273
|
*/
|
|
274
|
-
async install(moduleName,
|
|
274
|
+
async install(moduleName, wizzDir, fileTrackingCallback = null, options = {}) {
|
|
275
275
|
// Check if this module has a plugin resolution (custom marketplace install)
|
|
276
276
|
const { CustomModuleManager } = require('./custom-module-manager');
|
|
277
277
|
const customMgr = new CustomModuleManager();
|
|
278
278
|
const resolved = customMgr.getResolution(moduleName);
|
|
279
279
|
if (resolved) {
|
|
280
|
-
return this.installFromResolution(resolved,
|
|
280
|
+
return this.installFromResolution(resolved, wizzDir, fileTrackingCallback, options);
|
|
281
281
|
}
|
|
282
282
|
|
|
283
283
|
const sourcePath = await this.findModuleSource(moduleName, {
|
|
284
284
|
silent: options.silent,
|
|
285
285
|
channelOptions: options.channelOptions,
|
|
286
286
|
});
|
|
287
|
-
const targetPath = path.join(
|
|
287
|
+
const targetPath = path.join(wizzDir, moduleName);
|
|
288
288
|
|
|
289
289
|
if (!sourcePath) {
|
|
290
290
|
throw new Error(
|
|
@@ -299,18 +299,18 @@ class OfficialModules {
|
|
|
299
299
|
await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback, options.moduleConfig);
|
|
300
300
|
|
|
301
301
|
if (!options.skipModuleInstaller) {
|
|
302
|
-
await this.createModuleDirectories(moduleName,
|
|
302
|
+
await this.createModuleDirectories(moduleName, wizzDir, options);
|
|
303
303
|
}
|
|
304
304
|
|
|
305
305
|
const { Manifest } = require('../core/manifest');
|
|
306
306
|
const manifestObj = new Manifest();
|
|
307
|
-
const versionInfo = await manifestObj.getModuleVersionInfo(moduleName,
|
|
307
|
+
const versionInfo = await manifestObj.getModuleVersionInfo(moduleName, wizzDir, sourcePath);
|
|
308
308
|
|
|
309
309
|
// Pick up channel resolution recorded by the external manager (the only
|
|
310
310
|
// manager that does pre-clone resolution now that community is retired).
|
|
311
311
|
const resolution = this.externalModuleManager.getResolution(moduleName);
|
|
312
312
|
|
|
313
|
-
await manifestObj.addModule(
|
|
313
|
+
await manifestObj.addModule(wizzDir, moduleName, {
|
|
314
314
|
version: resolution?.version || versionInfo.version,
|
|
315
315
|
source: versionInfo.source,
|
|
316
316
|
npmPackage: versionInfo.npmPackage,
|
|
@@ -326,12 +326,12 @@ class OfficialModules {
|
|
|
326
326
|
* Install a module from a PluginResolver resolution result.
|
|
327
327
|
* Copies specific skill directories and places module-help.csv at the target root.
|
|
328
328
|
* @param {Object} resolved - ResolvedModule from PluginResolver
|
|
329
|
-
* @param {string}
|
|
329
|
+
* @param {string} wizzDir - Target wizz directory
|
|
330
330
|
* @param {Function} fileTrackingCallback - Optional callback to track installed files
|
|
331
331
|
* @param {Object} options - Installation options
|
|
332
332
|
*/
|
|
333
|
-
async installFromResolution(resolved,
|
|
334
|
-
const targetPath = path.join(
|
|
333
|
+
async installFromResolution(resolved, wizzDir, fileTrackingCallback = null, options = {}) {
|
|
334
|
+
const targetPath = path.join(wizzDir, resolved.code);
|
|
335
335
|
|
|
336
336
|
if (await fs.pathExists(targetPath)) {
|
|
337
337
|
await fs.remove(targetPath);
|
|
@@ -361,7 +361,7 @@ class OfficialModules {
|
|
|
361
361
|
|
|
362
362
|
// Create directories declared in module.yaml (strategies 1-4 may have these)
|
|
363
363
|
if (!options.skipModuleInstaller) {
|
|
364
|
-
await this.createModuleDirectories(resolved.code,
|
|
364
|
+
await this.createModuleDirectories(resolved.code, wizzDir, options);
|
|
365
365
|
}
|
|
366
366
|
|
|
367
367
|
// Update manifest. For custom-source installs we derive channel from the
|
|
@@ -382,7 +382,7 @@ class OfficialModules {
|
|
|
382
382
|
if (resolved.rawInput) manifestEntry.rawSource = resolved.rawInput;
|
|
383
383
|
}
|
|
384
384
|
if (resolved.localPath) manifestEntry.localPath = resolved.localPath;
|
|
385
|
-
await manifestObj.addModule(
|
|
385
|
+
await manifestObj.addModule(wizzDir, resolved.code, manifestEntry);
|
|
386
386
|
|
|
387
387
|
return {
|
|
388
388
|
success: true,
|
|
@@ -400,11 +400,11 @@ class OfficialModules {
|
|
|
400
400
|
/**
|
|
401
401
|
* Update an existing module
|
|
402
402
|
* @param {string} moduleName - Name of the module to update
|
|
403
|
-
* @param {string}
|
|
403
|
+
* @param {string} wizzDir - Target wizz directory
|
|
404
404
|
*/
|
|
405
|
-
async update(moduleName,
|
|
405
|
+
async update(moduleName, wizzDir) {
|
|
406
406
|
const sourcePath = await this.findModuleSource(moduleName);
|
|
407
|
-
const targetPath = path.join(
|
|
407
|
+
const targetPath = path.join(wizzDir, moduleName);
|
|
408
408
|
|
|
409
409
|
if (!sourcePath) {
|
|
410
410
|
throw new Error(`Module '${moduleName}' not found in any source location`);
|
|
@@ -426,10 +426,10 @@ class OfficialModules {
|
|
|
426
426
|
/**
|
|
427
427
|
* Remove a module
|
|
428
428
|
* @param {string} moduleName - Name of the module to remove
|
|
429
|
-
* @param {string}
|
|
429
|
+
* @param {string} wizzDir - Target wizz directory
|
|
430
430
|
*/
|
|
431
|
-
async remove(moduleName,
|
|
432
|
-
const targetPath = path.join(
|
|
431
|
+
async remove(moduleName, wizzDir) {
|
|
432
|
+
const targetPath = path.join(wizzDir, moduleName);
|
|
433
433
|
|
|
434
434
|
if (!(await fs.pathExists(targetPath))) {
|
|
435
435
|
throw new Error(`Module '${moduleName}' is not installed`);
|
|
@@ -446,22 +446,22 @@ class OfficialModules {
|
|
|
446
446
|
/**
|
|
447
447
|
* Check if a module is installed
|
|
448
448
|
* @param {string} moduleName - Name of the module
|
|
449
|
-
* @param {string}
|
|
449
|
+
* @param {string} wizzDir - Target wizz directory
|
|
450
450
|
* @returns {boolean} True if module is installed
|
|
451
451
|
*/
|
|
452
|
-
async isInstalled(moduleName,
|
|
453
|
-
const targetPath = path.join(
|
|
452
|
+
async isInstalled(moduleName, wizzDir) {
|
|
453
|
+
const targetPath = path.join(wizzDir, moduleName);
|
|
454
454
|
return await fs.pathExists(targetPath);
|
|
455
455
|
}
|
|
456
456
|
|
|
457
457
|
/**
|
|
458
458
|
* Get installed module info
|
|
459
459
|
* @param {string} moduleName - Name of the module
|
|
460
|
-
* @param {string}
|
|
460
|
+
* @param {string} wizzDir - Target wizz directory
|
|
461
461
|
* @returns {Object|null} Module info or null if not installed
|
|
462
462
|
*/
|
|
463
|
-
async getInstalledInfo(moduleName,
|
|
464
|
-
const targetPath = path.join(
|
|
463
|
+
async getInstalledInfo(moduleName, wizzDir) {
|
|
464
|
+
const targetPath = path.join(wizzDir, moduleName);
|
|
465
465
|
|
|
466
466
|
if (!(await fs.pathExists(targetPath))) {
|
|
467
467
|
return null;
|
|
@@ -557,17 +557,17 @@ class OfficialModules {
|
|
|
557
557
|
* This replaces the security-risky module installer pattern with declarative config
|
|
558
558
|
* During updates, if a directory path changed, moves the old directory to the new path
|
|
559
559
|
* @param {string} moduleName - Name of the module
|
|
560
|
-
* @param {string}
|
|
560
|
+
* @param {string} wizzDir - Target wizz directory
|
|
561
561
|
* @param {Object} options - Installation options
|
|
562
562
|
* @param {Object} options.moduleConfig - Module configuration from config collector
|
|
563
563
|
* @param {Object} options.existingModuleConfig - Previous module config (for detecting path changes during updates)
|
|
564
564
|
* @param {Object} options.coreConfig - Core configuration
|
|
565
565
|
* @returns {Promise<{createdDirs: string[], movedDirs: string[], createdWdsFolders: string[]}>} Created directories info
|
|
566
566
|
*/
|
|
567
|
-
async createModuleDirectories(moduleName,
|
|
567
|
+
async createModuleDirectories(moduleName, wizzDir, options = {}) {
|
|
568
568
|
const moduleConfig = options.moduleConfig || {};
|
|
569
569
|
const existingModuleConfig = options.existingModuleConfig || {};
|
|
570
|
-
const projectRoot = path.dirname(
|
|
570
|
+
const projectRoot = path.dirname(wizzDir);
|
|
571
571
|
const emptyResult = { createdDirs: [], movedDirs: [], createdWdsFolders: [] };
|
|
572
572
|
|
|
573
573
|
// Special handling for core module - it's in src/core-skills not src/modules
|
|
@@ -781,16 +781,16 @@ class OfficialModules {
|
|
|
781
781
|
// ─── Config collection methods (merged from ConfigCollector) ───
|
|
782
782
|
|
|
783
783
|
/**
|
|
784
|
-
* Find the
|
|
784
|
+
* Find the wizz installation directory in a project
|
|
785
785
|
* V6+ installations can use ANY folder name but ALWAYS have _config/manifest.yaml
|
|
786
786
|
* @param {string} projectDir - Project directory
|
|
787
|
-
* @returns {Promise<string>} Path to
|
|
787
|
+
* @returns {Promise<string>} Path to wizz directory
|
|
788
788
|
*/
|
|
789
|
-
async
|
|
789
|
+
async findWizzDir(projectDir) {
|
|
790
790
|
// Check if project directory exists
|
|
791
791
|
if (!(await fs.pathExists(projectDir))) {
|
|
792
792
|
// Project doesn't exist yet, return default
|
|
793
|
-
return path.join(projectDir, '
|
|
793
|
+
return path.join(projectDir, 'wizz');
|
|
794
794
|
}
|
|
795
795
|
|
|
796
796
|
// V6+ strategy: Look for ANY directory with _config/manifest.yaml
|
|
@@ -812,15 +812,15 @@ class OfficialModules {
|
|
|
812
812
|
|
|
813
813
|
// No V6+ installation found, return default
|
|
814
814
|
// This will be used for new installations
|
|
815
|
-
return path.join(projectDir, '
|
|
815
|
+
return path.join(projectDir, 'wizz');
|
|
816
816
|
}
|
|
817
817
|
|
|
818
818
|
/**
|
|
819
|
-
* Detect the existing
|
|
819
|
+
* Detect the existing WIZZ folder name in a project
|
|
820
820
|
* @param {string} projectDir - Project directory
|
|
821
821
|
* @returns {Promise<string|null>} Folder name (just the name, not full path) or null if not found
|
|
822
822
|
*/
|
|
823
|
-
async
|
|
823
|
+
async detectExistingWizzFolder(projectDir) {
|
|
824
824
|
// Check if project directory exists
|
|
825
825
|
if (!(await fs.pathExists(projectDir))) {
|
|
826
826
|
return null;
|
|
@@ -857,11 +857,11 @@ class OfficialModules {
|
|
|
857
857
|
return false;
|
|
858
858
|
}
|
|
859
859
|
|
|
860
|
-
// Find the actual
|
|
861
|
-
const
|
|
860
|
+
// Find the actual wizz directory (handles custom folder names)
|
|
861
|
+
const wizzDir = await this.findWizzDir(projectDir);
|
|
862
862
|
|
|
863
|
-
// Check if
|
|
864
|
-
if (!(await fs.pathExists(
|
|
863
|
+
// Check if wizz directory exists
|
|
864
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
865
865
|
return false;
|
|
866
866
|
}
|
|
867
867
|
|
|
@@ -871,7 +871,7 @@ class OfficialModules {
|
|
|
871
871
|
// every reinstall.
|
|
872
872
|
let foundAny = false;
|
|
873
873
|
for (const fileName of ['config.toml', 'config.user.toml']) {
|
|
874
|
-
const tomlPath = path.join(
|
|
874
|
+
const tomlPath = path.join(wizzDir, fileName);
|
|
875
875
|
if (!(await fs.pathExists(tomlPath))) continue;
|
|
876
876
|
try {
|
|
877
877
|
const content = await fs.readFile(tomlPath, 'utf8');
|
|
@@ -893,7 +893,7 @@ class OfficialModules {
|
|
|
893
893
|
}
|
|
894
894
|
|
|
895
895
|
// Fallback: legacy per-module config.yaml files (pre-v6 installations).
|
|
896
|
-
const entries = await fs.readdir(
|
|
896
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
897
897
|
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
898
898
|
for (const entry of entries) {
|
|
899
899
|
if (entry.isDirectory()) {
|
|
@@ -901,7 +901,7 @@ class OfficialModules {
|
|
|
901
901
|
continue;
|
|
902
902
|
}
|
|
903
903
|
|
|
904
|
-
const moduleConfigPath = path.join(
|
|
904
|
+
const moduleConfigPath = path.join(wizzDir, entry.name, 'config.yaml');
|
|
905
905
|
|
|
906
906
|
if (await fs.pathExists(moduleConfigPath)) {
|
|
907
907
|
try {
|
|
@@ -1447,7 +1447,7 @@ class OfficialModules {
|
|
|
1447
1447
|
result = username.charAt(0).toUpperCase() + username.slice(1);
|
|
1448
1448
|
}
|
|
1449
1449
|
} catch {
|
|
1450
|
-
// Do nothing, just return '
|
|
1450
|
+
// Do nothing, just return 'Wizz'
|
|
1451
1451
|
}
|
|
1452
1452
|
return result;
|
|
1453
1453
|
}
|
|
@@ -354,12 +354,12 @@ class PluginResolver {
|
|
|
354
354
|
|
|
355
355
|
/**
|
|
356
356
|
* Format a kebab-case or snake_case name into a display name.
|
|
357
|
-
* Strips common prefixes like "
|
|
357
|
+
* Strips common prefixes like "wizz-" or "wizz-agent-".
|
|
358
358
|
* @param {string} name - Raw name
|
|
359
359
|
* @returns {string} Formatted display name
|
|
360
360
|
*/
|
|
361
361
|
_formatDisplayName(name) {
|
|
362
|
-
let cleaned = name.replace(/^
|
|
362
|
+
let cleaned = name.replace(/^wizz-agent-/, '').replace(/^wizz-/, '');
|
|
363
363
|
return cleaned
|
|
364
364
|
.split(/[-_]/)
|
|
365
365
|
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
@@ -373,7 +373,7 @@ class PluginResolver {
|
|
|
373
373
|
* @returns {string} Menu code (e.g., "CC" for "code-coach")
|
|
374
374
|
*/
|
|
375
375
|
_generateMenuCode(name) {
|
|
376
|
-
const cleaned = name.replace(/^
|
|
376
|
+
const cleaned = name.replace(/^wizz-agent-/, '').replace(/^wizz-/, '');
|
|
377
377
|
const words = cleaned.split(/[-_]/).filter((w) => w.length > 0);
|
|
378
378
|
return words
|
|
379
379
|
.map((w) => w.charAt(0).toUpperCase())
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Installs the global skills library (src/skills-lib) into the project.
|
|
2
|
+
//
|
|
3
|
+
// The skills-registry.yaml is the single source of truth: it maps each AREA
|
|
4
|
+
// (designer, copy, seo, growth, ...) to the skill ids that area pulls. This
|
|
5
|
+
// module reads that registry, resolves the user's chosen areas to a set of
|
|
6
|
+
// skill ids, and copies only those skill directories into `_wizz/skills-lib/`.
|
|
7
|
+
//
|
|
8
|
+
// From there the existing verbatim-skill pipeline takes over untouched:
|
|
9
|
+
// collectSkills() discovers `_wizz/skills-lib/<id>/SKILL.md`
|
|
10
|
+
// → writeSkillManifest() records them in `_wizz/_config/skill-manifest.csv`
|
|
11
|
+
// → installVerbatimSkills() copies each into every selected IDE's skills dir.
|
|
12
|
+
//
|
|
13
|
+
// It also installs the registry itself into `_wizz/_config/` so the maestro can
|
|
14
|
+
// read the same file at runtime (the routing source and the install source stay
|
|
15
|
+
// identical by construction). Every step is a no-op when its source is missing.
|
|
16
|
+
|
|
17
|
+
const path = require('node:path');
|
|
18
|
+
const fs = require('../fs-native');
|
|
19
|
+
const yaml = require('yaml');
|
|
20
|
+
const { getProjectRoot, getSourcePath } = require('../project-root');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Resolve which skill ids to install from the registry for the chosen areas.
|
|
24
|
+
* Empty / undefined / containing 'all' means every area. Utility skills
|
|
25
|
+
* (graphify, find-skills, ...) are cross-cutting and always included.
|
|
26
|
+
* @param {Object} registry - Parsed skills-registry.yaml
|
|
27
|
+
* @param {string[]} [selectedAreas] - Area keys to install
|
|
28
|
+
* @returns {string[]} Deduped skill ids
|
|
29
|
+
*/
|
|
30
|
+
function resolveSkillIds(registry, selectedAreas) {
|
|
31
|
+
const ids = new Set();
|
|
32
|
+
const areas = (registry && registry.areas) || {};
|
|
33
|
+
const wantAll = !selectedAreas || selectedAreas.length === 0 || selectedAreas.includes('all');
|
|
34
|
+
const chosen = wantAll ? Object.keys(areas) : selectedAreas;
|
|
35
|
+
|
|
36
|
+
for (const area of chosen) {
|
|
37
|
+
const skills = (areas[area] && areas[area].skills) || [];
|
|
38
|
+
for (const skill of skills) {
|
|
39
|
+
if (skill && skill.id) ids.add(skill.id);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const util of (registry && registry.utility) || []) {
|
|
43
|
+
if (util && util.id) ids.add(util.id);
|
|
44
|
+
}
|
|
45
|
+
return [...ids];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Recursively collect every file path under a directory.
|
|
50
|
+
* @param {string} dir - Directory to walk
|
|
51
|
+
* @param {string[]} acc - Accumulator of absolute file paths
|
|
52
|
+
*/
|
|
53
|
+
async function collectFiles(dir, acc) {
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
57
|
+
} catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const full = path.join(dir, entry.name);
|
|
62
|
+
if (entry.isDirectory()) {
|
|
63
|
+
await collectFiles(full, acc);
|
|
64
|
+
} else {
|
|
65
|
+
acc.push(full);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const isCopyableEntry = (src) => {
|
|
71
|
+
const name = path.basename(src);
|
|
72
|
+
if (name === '.DS_Store' || name === 'Thumbs.db' || name === 'desktop.ini') return false;
|
|
73
|
+
return !(name.startsWith('.') && name !== '.gitkeep');
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Copy the area-selected skills from src/skills-lib into `_wizz/skills-lib`, and
|
|
78
|
+
* the registry into `_wizz/_config/skills-registry.yaml`. No-op when sources are
|
|
79
|
+
* absent (e.g. a dev tree without the library), so it is always safe to call.
|
|
80
|
+
*
|
|
81
|
+
* @param {Object} args
|
|
82
|
+
* @param {string} args.wizzDir - Installed `_wizz` directory
|
|
83
|
+
* @param {string[]} [args.selectedAreas] - Area keys; empty/undefined => all areas
|
|
84
|
+
* @param {(absPath: string) => void} [args.trackFile] - Record an installed file
|
|
85
|
+
* @returns {Promise<{copied: number, skipped: string[], registry: boolean}>}
|
|
86
|
+
*/
|
|
87
|
+
async function installSkillsLib({ wizzDir, selectedAreas, trackFile = () => {} }) {
|
|
88
|
+
const srcLib = getSourcePath('skills-lib');
|
|
89
|
+
const srcRegistry = path.join(getProjectRoot(), 'skills-registry.yaml');
|
|
90
|
+
|
|
91
|
+
if (!(await fs.pathExists(srcLib)) || !(await fs.pathExists(srcRegistry))) {
|
|
92
|
+
return { copied: 0, skipped: [], registry: false };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let registry;
|
|
96
|
+
try {
|
|
97
|
+
registry = yaml.parse(await fs.readFile(srcRegistry, 'utf8'));
|
|
98
|
+
} catch (error) {
|
|
99
|
+
throw new Error(`Failed to parse skills-registry.yaml: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const ids = resolveSkillIds(registry, selectedAreas);
|
|
103
|
+
const destLib = path.join(wizzDir, 'skills-lib');
|
|
104
|
+
const skipped = [];
|
|
105
|
+
let copied = 0;
|
|
106
|
+
|
|
107
|
+
for (const id of ids) {
|
|
108
|
+
const srcSkill = path.join(srcLib, id);
|
|
109
|
+
const skillMd = path.join(srcSkill, 'SKILL.md');
|
|
110
|
+
if (!(await fs.pathExists(skillMd))) {
|
|
111
|
+
// A registry id with no shipped skill directory — record and skip quietly.
|
|
112
|
+
skipped.push(id);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const destSkill = path.join(destLib, id);
|
|
117
|
+
await fs.remove(destSkill); // clear stale files before copy
|
|
118
|
+
await fs.copy(srcSkill, destSkill, { filter: isCopyableEntry });
|
|
119
|
+
|
|
120
|
+
const files = [];
|
|
121
|
+
await collectFiles(destSkill, files);
|
|
122
|
+
for (const file of files) trackFile(file);
|
|
123
|
+
copied++;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Install the registry so the maestro reads the same source at runtime.
|
|
127
|
+
const destRegistry = path.join(wizzDir, '_config', 'skills-registry.yaml');
|
|
128
|
+
await fs.ensureDir(path.dirname(destRegistry));
|
|
129
|
+
await fs.copy(srcRegistry, destRegistry);
|
|
130
|
+
trackFile(destRegistry);
|
|
131
|
+
|
|
132
|
+
return { copied, skipped, registry: true };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
module.exports = { installSkillsLib, resolveSkillIds };
|