codymaster 4.1.4 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -2
- package/README.md +56 -86
- package/dist/index.js +130 -16
- package/dist/ui/box.js +2 -2
- package/dist/ui/onboarding.js +11 -5
- package/install.sh +317 -35
- package/package.json +8 -8
- package/public/dashboard/app.js +1270 -0
- package/public/dashboard/index.html +218 -0
- package/public/dashboard/style.css +440 -0
- package/skills/AGENTS.md +61 -0
- package/skills/CLAUDE.md +158 -0
- package/skills/boxme-git-config/SKILL.md +56 -0
- package/skills/boxme-local-dev/SKILL.md +66 -0
- package/skills/build.sh +30 -0
- package/skills/cf +314 -0
- package/skills/cf 2 +313 -0
- package/skills/cm-ads-tracker/SKILL.md +364 -69
- package/skills/cm-auto-publisher/SKILL.md +81 -0
- package/skills/cm-booking-calendar/SKILL.md +521 -0
- package/skills/cm-booking-calendar/references/industry-patterns.md +527 -0
- package/skills/cm-booking-calendar/templates/booking-form.css +626 -0
- package/skills/cm-booking-calendar/templates/booking-form.html +477 -0
- package/skills/cm-booking-calendar/templates/calendar-engine.js +419 -0
- package/skills/cm-booking-calendar/templates/calendar-export.js +395 -0
- package/skills/cm-booking-calendar/templates/reminder-config.js +629 -0
- package/skills/cm-brainstorm-idea/SKILL.md +15 -24
- package/skills/cm-clean-code/SKILL.md +300 -0
- package/skills/cm-code-review/SKILL.md +0 -27
- package/skills/cm-codeintell/SKILL.md +598 -0
- package/skills/cm-content-factory/.content-factory-state.json +132 -0
- package/skills/cm-content-factory/.git 2/logs/refs/heads/main +1 -0
- package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +1 -0
- package/skills/cm-content-factory/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
- package/skills/cm-content-factory/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
- package/skills/cm-content-factory/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
- package/skills/cm-content-factory/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
- package/skills/cm-content-factory/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
- package/skills/cm-content-factory/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
- package/skills/cm-content-factory/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
- package/skills/cm-content-factory/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
- package/skills/cm-content-factory/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
- package/skills/cm-content-factory/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
- package/skills/cm-content-factory/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
- package/skills/cm-content-factory/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
- package/skills/cm-content-factory/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
- package/skills/cm-content-factory/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
- package/skills/cm-content-factory/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
- package/skills/cm-content-factory/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
- package/skills/cm-content-factory/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
- package/skills/cm-content-factory/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
- package/skills/cm-content-factory/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
- package/skills/cm-content-factory/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
- package/skills/cm-content-factory/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
- package/skills/cm-content-factory/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
- package/skills/cm-content-factory/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
- package/skills/cm-content-factory/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
- package/skills/cm-content-factory/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
- package/skills/cm-content-factory/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
- package/skills/cm-content-factory/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
- package/skills/cm-content-factory/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
- package/skills/cm-content-factory/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
- package/skills/cm-content-factory/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
- package/skills/cm-content-factory/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
- package/skills/cm-content-factory/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
- package/skills/cm-content-factory/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
- package/skills/cm-content-factory/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
- package/skills/cm-content-factory/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
- package/skills/cm-content-factory/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
- package/skills/cm-content-factory/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
- package/skills/cm-content-factory/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +5 -0
- package/skills/cm-content-factory/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
- package/skills/cm-content-factory/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
- package/skills/cm-content-factory/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
- package/skills/cm-content-factory/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
- package/skills/cm-content-factory/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
- package/skills/cm-content-factory/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
- package/skills/cm-content-factory/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
- package/skills/cm-content-factory/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
- package/skills/cm-content-factory/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
- package/skills/cm-content-factory/.git 2/refs/heads/main +1 -0
- package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +1 -0
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +76 -0
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +1 -0
- package/skills/cm-content-factory/AGENTS.md +61 -0
- package/skills/cm-content-factory/CLAUDE.md +63 -0
- package/skills/cm-content-factory/CURSOR.md +43 -0
- package/skills/cm-content-factory/Content Factory.zip +0 -0
- package/skills/cm-content-factory/cf +313 -0
- package/skills/cm-content-factory/config.schema.json +397 -0
- package/skills/cm-content-factory/dashboard/app.js +556 -0
- package/skills/cm-content-factory/dashboard/index.html +397 -0
- package/skills/cm-content-factory/dashboard/style.css +1211 -0
- package/skills/cm-content-factory/examples/01-real-estate.config.json +146 -0
- package/skills/cm-content-factory/examples/02-personal-finance.config.json +146 -0
- package/skills/cm-content-factory/examples/03-health-wellness.config.json +147 -0
- package/skills/cm-content-factory/examples/04-saas-software.config.json +147 -0
- package/skills/cm-content-factory/examples/05-legal-services.config.json +147 -0
- package/skills/cm-content-factory/examples/06-insurance.config.json +146 -0
- package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +146 -0
- package/skills/cm-content-factory/examples/08-online-education.config.json +147 -0
- package/skills/cm-content-factory/examples/09-crypto-defi.config.json +147 -0
- package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +147 -0
- package/skills/cm-content-factory/examples/11-home-services.config.json +146 -0
- package/skills/cm-content-factory/examples/12-dental-clinic.config.json +147 -0
- package/skills/cm-content-factory/examples/13-pet-care.config.json +147 -0
- package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +147 -0
- package/skills/cm-content-factory/examples/15-ai-automation.config.json +147 -0
- package/skills/cm-content-factory/examples/16-wedding-events.config.json +147 -0
- package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +148 -0
- package/skills/cm-content-factory/examples/18-cybersecurity.config.json +147 -0
- package/skills/cm-content-factory/examples/19-food-restaurant.config.json +148 -0
- package/skills/cm-content-factory/examples/20-solar-energy.config.json +147 -0
- package/skills/cm-content-factory/examples/fitness-blog.config.json +116 -0
- package/skills/cm-content-factory/examples/tech-blog.config.json +107 -0
- package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +72 -0
- package/skills/cm-content-factory/extensions/hooks.py +126 -0
- package/skills/cm-content-factory/extensions/openclaw_adapter.py +132 -0
- package/skills/cm-content-factory/landing/index.html +680 -0
- package/skills/cm-content-factory/landing/script.js +101 -0
- package/skills/cm-content-factory/landing/style.css +1216 -0
- package/skills/cm-content-factory/landing/translations.js +508 -0
- package/skills/cm-content-factory/logs/events.jsonl +11 -0
- package/skills/cm-content-factory/profiles/_template.profile.json +231 -0
- package/skills/cm-content-factory/profiles/finance.profile.json +278 -0
- package/skills/cm-content-factory/profiles/legal.profile.json +263 -0
- package/skills/cm-content-factory/profiles/medical-research.profile.json +321 -0
- package/skills/cm-content-factory/profiles/technology.profile.json +275 -0
- package/skills/cm-content-factory/scripts/agent_dispatcher.py +266 -0
- package/skills/cm-content-factory/scripts/audit.py +106 -0
- package/skills/cm-content-factory/scripts/dashboard_server.py +225 -0
- package/skills/cm-content-factory/scripts/deploy.py +146 -0
- package/skills/cm-content-factory/scripts/extract.py +132 -0
- package/skills/cm-content-factory/scripts/landing_generator.py +459 -0
- package/skills/cm-content-factory/scripts/memory.py +521 -0
- package/skills/cm-content-factory/scripts/monetize.py +239 -0
- package/skills/cm-content-factory/scripts/pipeline.py +357 -0
- package/skills/cm-content-factory/scripts/plan.py +163 -0
- package/skills/cm-content-factory/scripts/publish.py +145 -0
- package/skills/cm-content-factory/scripts/research.py +337 -0
- package/skills/cm-content-factory/scripts/scaffold.py +464 -0
- package/skills/cm-content-factory/scripts/scoreboard.py +336 -0
- package/skills/cm-content-factory/scripts/seo.py +90 -0
- package/skills/cm-content-factory/scripts/state_manager.py +320 -0
- package/skills/cm-content-factory/scripts/token_manager.py +268 -0
- package/skills/cm-content-factory/scripts/validate.py +221 -0
- package/skills/cm-content-factory/scripts/wizard.py +329 -0
- package/skills/cm-content-factory/scripts/write.py +93 -0
- package/skills/cm-content-factory/sites/docs-site/src/assets/houston.webp +0 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/architecture.md +90 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +54 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +38 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +65 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +48 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +39 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +42 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +51 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +52 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +86 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +80 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +58 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +102 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +29 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +55 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +29 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +41 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +40 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +56 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +46 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +45 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +108 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +22 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +52 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +58 -0
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +92 -0
- package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +575 -0
- package/skills/cm-content-factory/tests/conftest.py +66 -0
- package/skills/cm-content-factory/tests/test_agent_dispatcher.py +125 -0
- package/skills/cm-content-factory/tests/test_memory.py +128 -0
- package/skills/cm-content-factory/tests/test_pipeline.py +107 -0
- package/skills/cm-content-factory/tests/test_research.py +56 -0
- package/skills/cm-content-factory/tests/test_state_manager.py +131 -0
- package/skills/cm-content-factory/tests/test_token_manager.py +110 -0
- package/skills/cm-content-factory/tests/test_wizard.py +121 -0
- package/skills/cm-continuity/SKILL.md +7 -0
- package/skills/cm-cro-methodology/SKILL.md +290 -0
- package/skills/cm-dashboard/SKILL.md +7 -525
- package/skills/cm-debugging/SKILL.md +7 -116
- package/skills/cm-deep-search/SKILL.md +5 -1
- package/skills/cm-dockit/README.md +6 -15
- package/skills/cm-dockit/SKILL.md +20 -37
- package/skills/cm-execution/SKILL.md +6 -1
- package/skills/cm-frappe-agent/SKILL.md +134 -0
- package/skills/cm-frappe-agent/agents/doctype-architect.md +596 -0
- package/skills/cm-frappe-agent/agents/erpnext-customizer.md +643 -0
- package/skills/cm-frappe-agent/agents/frappe-backend.md +814 -0
- package/skills/cm-frappe-agent/agents/frappe-custom-frontend.md +557 -0
- package/skills/cm-frappe-agent/agents/frappe-debugger.md +625 -0
- package/skills/cm-frappe-agent/agents/frappe-fixer.md +275 -0
- package/skills/cm-frappe-agent/agents/frappe-frontend.md +660 -0
- package/skills/cm-frappe-agent/agents/frappe-installer.md +158 -0
- package/skills/cm-frappe-agent/agents/frappe-performance.md +307 -0
- package/skills/cm-frappe-agent/agents/frappe-planner.md +419 -0
- package/skills/cm-frappe-agent/agents/frappe-remote-ops.md +153 -0
- package/skills/cm-frappe-agent/agents/github-workflow.md +286 -0
- package/skills/cm-frappe-agent/commands/frappe-app.md +351 -0
- package/skills/cm-frappe-agent/commands/frappe-backend.md +162 -0
- package/skills/cm-frappe-agent/commands/frappe-bench.md +254 -0
- package/skills/cm-frappe-agent/commands/frappe-debug.md +263 -0
- package/skills/cm-frappe-agent/commands/frappe-doctype-create.md +272 -0
- package/skills/cm-frappe-agent/commands/frappe-doctype-field.md +310 -0
- package/skills/cm-frappe-agent/commands/frappe-erpnext.md +210 -0
- package/skills/cm-frappe-agent/commands/frappe-fix.md +59 -0
- package/skills/cm-frappe-agent/commands/frappe-frontend.md +210 -0
- package/skills/cm-frappe-agent/commands/frappe-fullstack.md +243 -0
- package/skills/cm-frappe-agent/commands/frappe-github.md +57 -0
- package/skills/cm-frappe-agent/commands/frappe-install.md +52 -0
- package/skills/cm-frappe-agent/commands/frappe-plan.md +442 -0
- package/skills/cm-frappe-agent/commands/frappe-remote.md +58 -0
- package/skills/cm-frappe-agent/commands/frappe-test.md +356 -0
- package/skills/cm-frappe-agent/docs/README.md +51 -0
- package/skills/cm-frappe-agent/docs/agents-catalog.md +113 -0
- package/skills/cm-frappe-agent/docs/architecture.md +149 -0
- package/skills/cm-frappe-agent/docs/commands-catalog.md +82 -0
- package/skills/cm-frappe-agent/docs/resources-catalog.md +66 -0
- package/skills/cm-frappe-agent/docs/sitemap-urls.txt +52 -0
- package/skills/cm-frappe-agent/docs/sitemap.md +81 -0
- package/skills/cm-frappe-agent/docs/sop/user-guide.md +178 -0
- package/skills/cm-frappe-agent/docs/sop/vibe-coding-guide.md +122 -0
- package/skills/cm-frappe-agent/resources/7-layer-architecture.md +985 -0
- package/skills/cm-frappe-agent/resources/bench_commands.md +73 -0
- package/skills/cm-frappe-agent/resources/code-patterns-guide.md +948 -0
- package/skills/cm-frappe-agent/resources/common_pitfalls.md +266 -0
- package/skills/cm-frappe-agent/resources/doctype-registry.md +158 -0
- package/skills/cm-frappe-agent/resources/installation-guide.md +289 -0
- package/skills/cm-frappe-agent/resources/rest-api-patterns.md +182 -0
- package/skills/cm-frappe-agent/resources/scaffold_checklist.md +82 -0
- package/skills/cm-frappe-agent/resources/upgrade_patterns.md +113 -0
- package/skills/cm-frappe-agent/resources/web-form-patterns.md +252 -0
- package/skills/cm-frappe-agent/skills/bench-commands/SKILL.md +621 -0
- package/skills/cm-frappe-agent/skills/client-scripts/SKILL.md +642 -0
- package/skills/cm-frappe-agent/skills/doctype-patterns/SKILL.md +576 -0
- package/skills/cm-frappe-agent/skills/frappe-api/SKILL.md +740 -0
- package/skills/cm-frappe-agent/skills/remote-operations/SKILL.md +47 -0
- package/skills/cm-frappe-agent/skills/server-scripts/SKILL.md +608 -0
- package/skills/cm-frappe-agent/skills/web-forms/SKILL.md +46 -0
- package/skills/cm-git-worktrees/SKILL.md +0 -7
- package/skills/cm-google-form/SKILL.md +266 -0
- package/skills/cm-google-form/templates/apps-script.js +55 -0
- package/skills/cm-google-form/templates/form-markup.html +110 -0
- package/skills/cm-google-form/templates/form-submit.js +201 -0
- package/skills/cm-google-form/templates/toast.css +152 -0
- package/skills/cm-growth-hacking/SKILL.md +293 -0
- package/skills/cm-growth-hacking/bottom-sheet-engine.md +261 -0
- package/skills/cm-growth-hacking/calendar-integration.md +264 -0
- package/skills/cm-growth-hacking/references/engagement-patterns.md +346 -0
- package/skills/cm-growth-hacking/templates/bottom-sheet.css +528 -0
- package/skills/cm-growth-hacking/templates/bottom-sheet.js +269 -0
- package/skills/cm-growth-hacking/templates/calendar-cta.js +213 -0
- package/skills/cm-growth-hacking/templates/tracking-events.js +211 -0
- package/skills/cm-growth-hacking/templates/trigger-manager.js +254 -0
- package/skills/cm-growth-hacking/tracking-events.md +246 -0
- package/skills/cm-growth-hacking/trigger-system.md +342 -0
- package/skills/cm-how-it-work/SKILL.md +20 -4
- package/skills/cm-identity-guard/SKILL.md +0 -11
- package/skills/cm-jtbd/SKILL.md +1 -1
- package/skills/cm-notebooklm/SKILL.md +172 -0
- package/skills/cm-notebooklm/references/command_reference.md +94 -0
- package/skills/cm-notebooklm/references/workflows.md +60 -0
- package/skills/cm-notebooklm/resources/knowledge_sources.md +106 -0
- package/skills/cm-notebooklm/scripts/brain-sync.sh +453 -0
- package/skills/cm-notebooklm/scripts/graduate_wisdom.py +101 -0
- package/skills/cm-planning/SKILL.md +39 -52
- package/skills/cm-project-bootstrap/SKILL.md +1308 -99
- package/skills/cm-quality-gate/SKILL.md +13 -106
- package/skills/cm-reactor/SKILL.md +274 -0
- package/skills/cm-safe-deploy/SKILL.md +415 -52
- package/skills/cm-safe-i18n/SKILL.md +1 -22
- package/skills/cm-secret-shield/SKILL.md +2 -2
- package/skills/cm-security-gate/SKILL.md +114 -0
- package/skills/cm-skill-chain/SKILL.md +2 -2
- package/skills/cm-skill-index/SKILL.md +9 -6
- package/skills/cm-skill-mastery/SKILL.md +2 -15
- package/skills/cm-start/SKILL.md +9 -0
- package/skills/cm-tdd/SKILL.md +16 -49
- package/skills/cm-ui-preview/SKILL.md +35 -173
- package/skills/cm-ux-master/FEATURES-v4.md +305 -0
- package/skills/cm-ux-master/README-ru.md +135 -0
- package/skills/cm-ux-master/README-vi.md +135 -0
- package/skills/cm-ux-master/README-zh.md +135 -0
- package/skills/cm-ux-master/README.md +489 -0
- package/skills/cm-ux-master/SKILL.md +773 -62
- package/skills/cm-ux-master/cli/README.md +180 -0
- package/skills/cm-ux-master/cli/pyproject.toml +106 -0
- package/skills/cm-ux-master/cli/requirements.txt +21 -0
- package/skills/cm-ux-master/cli/templates/base/skill-core.md +262 -0
- package/skills/cm-ux-master/cli/templates/platforms/claude.yaml +21 -0
- package/skills/cm-ux-master/cli/templates/platforms/cursor.yaml +21 -0
- package/skills/cm-ux-master/cli/templates/platforms/figma.yaml +24 -0
- package/skills/cm-ux-master/cli/templates/platforms/vscode-mcp.yaml +28 -0
- package/skills/cm-ux-master/cli/templates/platforms/windsurf.yaml +21 -0
- package/skills/cm-ux-master/cli/uxmaster/__init__.py +10 -0
- package/skills/cm-ux-master/cli/uxmaster/__main__.py +19 -0
- package/skills/cm-ux-master/cli/uxmaster/cli.py +349 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/__init__.py +8 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/extract.py +18 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/init.py +58 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +194 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/search.py +23 -0
- package/skills/cm-ux-master/cli/uxmaster/commands/validate.py +270 -0
- package/skills/cm-ux-master/cli/uxmaster/search_engine.py +532 -0
- package/skills/cm-ux-master/cli/uxmaster/template_engine.py +458 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/__init__.py +9 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/console.py +42 -0
- package/skills/cm-ux-master/cli/uxmaster/utils/detect.py +83 -0
- package/skills/cm-ux-master/data/accessibility-advanced.csv +26 -0
- package/skills/cm-ux-master/data/animation.csv +31 -0
- package/skills/cm-ux-master/data/charts.csv +26 -0
- package/skills/cm-ux-master/data/colors.csv +97 -0
- package/skills/cm-ux-master/data/design-tests.csv +37 -0
- package/skills/cm-ux-master/data/devices.csv +21 -0
- package/skills/cm-ux-master/data/icons.csv +101 -0
- package/skills/cm-ux-master/data/landing.csv +31 -0
- package/skills/cm-ux-master/data/products.csv +97 -0
- package/skills/cm-ux-master/data/react-performance.csv +45 -0
- package/skills/cm-ux-master/data/responsive.csv +26 -0
- package/skills/cm-ux-master/data/semi-tokens.csv +52 -0
- package/skills/cm-ux-master/data/stacks/angular.csv +34 -0
- package/skills/cm-ux-master/data/stacks/astro.csv +54 -0
- package/skills/cm-ux-master/data/stacks/electron.csv +32 -0
- package/skills/cm-ux-master/data/stacks/flutter.csv +53 -0
- package/skills/cm-ux-master/data/stacks/html-tailwind.csv +56 -0
- package/skills/cm-ux-master/data/stacks/htmx.csv +28 -0
- package/skills/cm-ux-master/data/stacks/jetpack-compose.csv +53 -0
- package/skills/cm-ux-master/data/stacks/nextjs.csv +53 -0
- package/skills/cm-ux-master/data/stacks/nuxt-ui.csv +51 -0
- package/skills/cm-ux-master/data/stacks/nuxtjs.csv +59 -0
- package/skills/cm-ux-master/data/stacks/react-native.csv +52 -0
- package/skills/cm-ux-master/data/stacks/react.csv +54 -0
- package/skills/cm-ux-master/data/stacks/shadcn.csv +61 -0
- package/skills/cm-ux-master/data/stacks/svelte.csv +54 -0
- package/skills/cm-ux-master/data/stacks/swiftui.csv +51 -0
- package/skills/cm-ux-master/data/stacks/tauri.csv +29 -0
- package/skills/cm-ux-master/data/stacks/vue.csv +50 -0
- package/skills/cm-ux-master/data/styles.csv +68 -0
- package/skills/cm-ux-master/data/typography.csv +58 -0
- package/skills/cm-ux-master/data/ui-reasoning.csv +101 -0
- package/skills/cm-ux-master/data/ux-guidelines.csv +100 -0
- package/skills/cm-ux-master/data/ux-laws.csv +49 -0
- package/skills/cm-ux-master/data/web-interface.csv +31 -0
- package/skills/cm-ux-master/docs/LANDING-PAGE.html +377 -0
- package/skills/cm-ux-master/docs/README.md +108 -0
- package/skills/cm-ux-master/docs/css/styles.css +573 -0
- package/skills/cm-ux-master/docs/examples/demo-script.md +319 -0
- package/skills/cm-ux-master/docs/guides/for-designers.md +692 -0
- package/skills/cm-ux-master/docs/guides/for-developers.md +778 -0
- package/skills/cm-ux-master/docs/guides/for-product-managers.md +693 -0
- package/skills/cm-ux-master/docs/guides/react-guide-vi.md +50 -0
- package/skills/cm-ux-master/docs/index.html +1062 -0
- package/skills/cm-ux-master/docs/js/i18n.js +84 -0
- package/skills/cm-ux-master/docs/js/lang/de.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/en.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/fr.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/hi.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/id.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ja.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ko.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/ru.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/vi.js +145 -0
- package/skills/cm-ux-master/docs/js/lang/zh.js +145 -0
- package/skills/cm-ux-master/docs/js/main.js +117 -0
- package/skills/cm-ux-master/docs/plan/PHASE1-COMPLETION.md +217 -0
- package/skills/cm-ux-master/docs/plan/PHASE2-COMPLETION.md +199 -0
- package/skills/cm-ux-master/docs/plan/PHASE2-ENHANCED-COMPLETION.md +352 -0
- package/skills/cm-ux-master/docs/plan/PHASE3-VALIDATION-COMPLETION.md +499 -0
- package/skills/cm-ux-master/docs/plan/PHASE4-TESTING-POLISH-COMPLETION.md +483 -0
- package/skills/cm-ux-master/docs/plan/UXM-2.0-ROADMAP.md +681 -0
- package/skills/cm-ux-master/docs/plan/WOW-PITCH.md +410 -0
- package/skills/cm-ux-master/docs/technical/api-reference.md +824 -0
- package/skills/cm-ux-master/docs/technical/harvester-v4.md +328 -0
- package/skills/cm-ux-master/docs/technical/how-it-works.md +1128 -0
- package/skills/cm-ux-master/docs/tutorials/quickstart.md +339 -0
- package/skills/cm-ux-master/docs/tutorials/tutorials.md +939 -0
- package/skills/cm-ux-master/docs/tutorials/user-guide.md +716 -0
- package/skills/cm-ux-master/examples/README.md +63 -0
- package/skills/cm-ux-master/mcp/__init__.py +3 -0
- package/skills/cm-ux-master/mcp/integrations/__init__.py +11 -0
- package/skills/cm-ux-master/mcp/integrations/figma/__init__.py +6 -0
- package/skills/cm-ux-master/mcp/integrations/figma/client.py +293 -0
- package/skills/cm-ux-master/mcp/integrations/figma/plugin/code.js +561 -0
- package/skills/cm-ux-master/mcp/integrations/figma/plugin/ui.html +334 -0
- package/skills/cm-ux-master/mcp/integrations/stitch/__init__.py +5 -0
- package/skills/cm-ux-master/mcp/integrations/stitch/client.py +410 -0
- package/skills/cm-ux-master/mcp/integrations/vscode/package.json +167 -0
- package/skills/cm-ux-master/mcp/integrations/vscode/src/extension.ts +81 -0
- package/skills/cm-ux-master/mcp/mcp-config.json +274 -0
- package/skills/cm-ux-master/mcp/server.py +771 -0
- package/skills/cm-ux-master/mcp/tools/__init__.py +13 -0
- package/skills/cm-ux-master/mcp-server/server.py +595 -0
- package/skills/cm-ux-master/output/fila/FilaDashboard.tsx +47 -0
- package/skills/cm-ux-master/output/fila/components/badge/component.tsx +35 -0
- package/skills/cm-ux-master/output/fila/components/badge/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/button/component.tsx +53 -0
- package/skills/cm-ux-master/output/fila/components/button/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/card/component.tsx +35 -0
- package/skills/cm-ux-master/output/fila/components/card/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/components/input/component.tsx +41 -0
- package/skills/cm-ux-master/output/fila/components/input/index.ts +1 -0
- package/skills/cm-ux-master/output/fila/design-system.css +151 -0
- package/skills/cm-ux-master/output/fila/design-system.html +1596 -0
- package/skills/cm-ux-master/output/fila/design-system.json +168 -0
- package/skills/cm-ux-master/output/fila/figma-tokens.json +523 -0
- package/skills/cm-ux-master/output/fila/harvest-v4-raw.json +406 -0
- package/skills/cm-ux-master/output/fila/semi-theme-override.css +95 -0
- package/skills/cm-ux-master/output/haravan/HaravanDashboard.tsx +103 -0
- package/skills/cm-ux-master/output/haravan/design-system-v3-live.html +2716 -0
- package/skills/cm-ux-master/output/haravan/design-system-v3.html +1770 -0
- package/skills/cm-ux-master/output/haravan/design-system.html +914 -0
- package/skills/cm-ux-master/output/haravan/figma-tokens.json +84 -0
- package/skills/cm-ux-master/output/haravan/haravan-harvest.json +33 -0
- package/skills/cm-ux-master/output/haravan/harvest-v3-raw.json +167 -0
- package/skills/cm-ux-master/output/haravan/semi-theme-override.css +39 -0
- package/skills/cm-ux-master/references/audit-template.md +257 -0
- package/skills/cm-ux-master/references/cultural-ux.md +346 -0
- package/skills/cm-ux-master/references/dark-patterns.md +362 -0
- package/skills/cm-ux-master/references/heuristic-conflicts.md +296 -0
- package/skills/cm-ux-master/references/krug-principles.md +289 -0
- package/skills/cm-ux-master/references/nielsen-heuristics.md +360 -0
- package/skills/cm-ux-master/references/wcag-checklist.md +306 -0
- package/skills/cm-ux-master/scripts/component_generator.py +631 -0
- package/skills/cm-ux-master/scripts/core.py +305 -0
- package/skills/cm-ux-master/scripts/demo_validation.py +452 -0
- package/skills/cm-ux-master/scripts/design_doc_generator.py +1325 -0
- package/skills/cm-ux-master/scripts/design_system.py +1141 -0
- package/skills/cm-ux-master/scripts/design_system_indexer.py +889 -0
- package/skills/cm-ux-master/scripts/extract_i18n.py +251 -0
- package/skills/cm-ux-master/scripts/extractor.py +1437 -0
- package/skills/cm-ux-master/scripts/figma_bridge.py +406 -0
- package/skills/cm-ux-master/scripts/generate.py +147 -0
- package/skills/cm-ux-master/scripts/harvest_session.py +207 -0
- package/skills/cm-ux-master/scripts/harvester.js +240 -0
- package/skills/cm-ux-master/scripts/harvester_browser.py +717 -0
- package/skills/cm-ux-master/scripts/harvester_cli.py +431 -0
- package/skills/cm-ux-master/scripts/harvester_v1.js +275 -0
- package/skills/cm-ux-master/scripts/harvester_v3.js +620 -0
- package/skills/cm-ux-master/scripts/harvester_v4.js +1003 -0
- package/skills/cm-ux-master/scripts/install.py +528 -0
- package/skills/cm-ux-master/scripts/license.py +81 -0
- package/skills/cm-ux-master/scripts/media/qrpayment.png +0 -0
- package/skills/cm-ux-master/scripts/pro_stubs.py +120 -0
- package/skills/cm-ux-master/scripts/project_registry.py +217 -0
- package/skills/cm-ux-master/scripts/search.py +114 -0
- package/skills/cm-ux-master/scripts/semi_mcp_bridge.py +425 -0
- package/skills/cm-ux-master/scripts/stitch_integration.py +583 -0
- package/skills/cm-ux-master/scripts/test_harvester_v4.py +335 -0
- package/skills/cm-ux-master/scripts/token_mapper.py +626 -0
- package/skills/cm-ux-master/scripts/validation_engine.py +1571 -0
- package/skills/cm-ux-master/scripts/wizard.py +653 -0
- package/skills/cm-ux-master/setup.py +93 -0
- package/skills/cm-ux-master/templates/base/flutter-widget.dart +69 -0
- package/skills/cm-ux-master/templates/base/html-page.html +152 -0
- package/skills/cm-ux-master/templates/base/react-component.tsx +47 -0
- package/skills/cm-ux-master/templates/base/swiftui-view.swift +62 -0
- package/skills/cm-ux-master/templates/quick-start.sh +176 -0
- package/skills/cm-ux-master/tests/automation/batch-validate.sh +250 -0
- package/skills/cm-ux-master/tests/automation/generate-test-projects.sh +561 -0
- package/skills/cm-ux-master/tests/automation/run-all-tests.sh +315 -0
- package/skills/cm-ux-master/tests/test_design_doc.py +145 -0
- package/skills/cm-ux-master/tests/test_devices.py +74 -0
- package/skills/cm-ux-master/tests/test_generator.py +116 -0
- package/skills/cm-ux-master/tests/test_harvest_session.py +131 -0
- package/skills/cm-ux-master/tests/test_harvester.py +127 -0
- package/skills/cm-ux-master/tests/test_harvester_v3.py +324 -0
- package/skills/cm-ux-master/tests/test_mcp_server.py +496 -0
- package/skills/cm-ux-master/tests/test_new_domains.py +108 -0
- package/skills/cm-ux-master/tests/test_new_stacks.py +103 -0
- package/skills/cm-ux-master/tests/test_project_registry.py +146 -0
- package/skills/cm-ux-master/tests/test_semi_mcp_bridge.py +207 -0
- package/skills/cm-ux-master/tests/test_token_mapper.py +247 -0
- package/skills/cm-ux-master/tests/test_validation_engine.py +617 -0
- package/skills/config.schema.json +397 -0
- package/skills/frappe-app-builder.zip +0 -0
- package/skills/jobs-to-be-done/SKILL.md +266 -0
- package/skills/jobs-to-be-done/references/case-studies.md +154 -0
- package/skills/jobs-to-be-done/references/competitive-strategy.md +280 -0
- package/skills/jobs-to-be-done/references/diagnostics.md +158 -0
- package/skills/jobs-to-be-done/references/innovation-process.md +392 -0
- package/skills/jobs-to-be-done/references/organizational-change.md +328 -0
- package/skills/marketplace-report-crawler/SKILL.md +176 -0
- package/skills/marketplace-report-crawler/config/accounts.json +41 -0
- package/skills/marketplace-report-crawler/config/report-types.json +422 -0
- package/skills/marketplace-report-crawler/config/sessions.json +3 -0
- package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +102 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +114 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +94 -0
- package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +272 -0
- package/skills/marketplace-report-crawler/scripts/crawl-runner.js +281 -0
- package/skills/marketplace-report-crawler/scripts/session-check.sh +72 -0
- package/skills/marketplace-report-crawler/scripts/session-manager.sh +349 -0
- package/skills/marketplace-report-crawler/scripts/setup-folders.sh +83 -0
- package/skills/medical-research/SKILL.md +194 -0
- package/skills/medical-research/scripts/evidence_checker.py +288 -0
- package/skills/mom-test/SKILL.md +267 -0
- package/skills/mom-test/references/avoiding-bad-data.md +221 -0
- package/skills/mom-test/references/case-studies.md +306 -0
- package/skills/mom-test/references/commitment-advancement.md +219 -0
- package/skills/mom-test/references/finding-conversations.md +251 -0
- package/skills/mom-test/references/processing-learning.md +256 -0
- package/skills/mom-test/references/question-patterns.md +198 -0
- package/skills/pandasai-analytics/SKILL.md +251 -0
- package/skills/release-it/SKILL.md +235 -0
- package/skills/release-it/references/anti-patterns.md +279 -0
- package/skills/release-it/references/capacity-planning.md +285 -0
- package/skills/release-it/references/chaos-engineering.md +325 -0
- package/skills/release-it/references/deployment-strategies.md +331 -0
- package/skills/release-it/references/observability.md +301 -0
- package/skills/release-it/references/stability-patterns.md +355 -0
- package/skills/scripts/sync-ide-skills.sh +61 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +37 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +34 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +51 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +39 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +52 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +25 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +31 -0
- package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +25 -0
- package/skills/skill-creator-ultra/README.md +1242 -0
- package/skills/skill-creator-ultra/SKILL.md +388 -0
- package/skills/skill-creator-ultra/agents/analyzer.md +274 -0
- package/skills/skill-creator-ultra/agents/comparator.md +202 -0
- package/skills/skill-creator-ultra/agents/grader.md +223 -0
- package/skills/skill-creator-ultra/assets/eval_review.html +146 -0
- package/skills/skill-creator-ultra/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator-ultra/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +109 -0
- package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +116 -0
- package/skills/skill-creator-ultra/examples/example_api_docs.md +189 -0
- package/skills/skill-creator-ultra/examples/example_db_migration.md +253 -0
- package/skills/skill-creator-ultra/examples/example_git_commit.md +111 -0
- package/skills/skill-creator-ultra/install.ps1 +289 -0
- package/skills/skill-creator-ultra/install.sh +313 -0
- package/skills/skill-creator-ultra/phases/phase1_interview.md +202 -0
- package/skills/skill-creator-ultra/phases/phase2_extract.md +55 -0
- package/skills/skill-creator-ultra/phases/phase3_detect.md +57 -0
- package/skills/skill-creator-ultra/phases/phase4_generate.md +543 -0
- package/skills/skill-creator-ultra/phases/phase5_test.md +319 -0
- package/skills/skill-creator-ultra/phases/phase6_eval.md +301 -0
- package/skills/skill-creator-ultra/phases/phase7_iterate.md +103 -0
- package/skills/skill-creator-ultra/phases/phase8_optimize.md +113 -0
- package/skills/skill-creator-ultra/resources/advanced_patterns.md +499 -0
- package/skills/skill-creator-ultra/resources/anti_patterns.md +376 -0
- package/skills/skill-creator-ultra/resources/blueprints.md +498 -0
- package/skills/skill-creator-ultra/resources/checklist.md +243 -0
- package/skills/skill-creator-ultra/resources/composition_cookbook.md +291 -0
- package/skills/skill-creator-ultra/resources/description_optimization.md +90 -0
- package/skills/skill-creator-ultra/resources/eval_guide.md +133 -0
- package/skills/skill-creator-ultra/resources/industry_questions.md +189 -0
- package/skills/skill-creator-ultra/resources/interview_questions.md +200 -0
- package/skills/skill-creator-ultra/resources/pattern_detection.md +200 -0
- package/skills/skill-creator-ultra/resources/prompt_engineering.md +531 -0
- package/skills/skill-creator-ultra/resources/schemas.md +430 -0
- package/skills/skill-creator-ultra/resources/script_integration.md +593 -0
- package/skills/skill-creator-ultra/resources/scripts_guide.md +339 -0
- package/skills/skill-creator-ultra/resources/skill_template.md +124 -0
- package/skills/skill-creator-ultra/resources/skill_writing_guide.md +634 -0
- package/skills/skill-creator-ultra/resources/versioning_guide.md +193 -0
- package/skills/skill-creator-ultra/scripts/ci_eval.py +200 -0
- package/skills/skill-creator-ultra/scripts/package_skill.py +165 -0
- package/skills/skill-creator-ultra/scripts/simulate_skill.py +398 -0
- package/skills/skill-creator-ultra/scripts/skill_audit.py +611 -0
- package/skills/skill-creator-ultra/scripts/skill_compare.py +265 -0
- package/skills/skill-creator-ultra/scripts/skill_export.py +334 -0
- package/skills/skill-creator-ultra/scripts/skill_scaffold.py +403 -0
- package/skills/skill-creator-ultra/scripts/skill_stats.py +339 -0
- package/skills/skill-creator-ultra/scripts/validate_skill.py +411 -0
- package/skills/tailwind-mastery/SKILL.md +229 -0
- package/skills/vercel-react-best-practices/AGENTS.md +3373 -0
- package/skills/vercel-react-best-practices/README.md +123 -0
- package/skills/vercel-react-best-practices/SKILL.md +143 -0
- package/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +142 -0
- package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/skills/cro-methodology/SKILL.md +0 -98
- /package/skills/{cro-methodology → cm-cro-methodology}/references/COPYWRITING.md +0 -0
- /package/skills/{cro-methodology → cm-cro-methodology}/references/OBJECTIONS.md +0 -0
- /package/skills/{cro-methodology → cm-cro-methodology}/references/PERSUASION.md +0 -0
- /package/skills/{cro-methodology → cm-cro-methodology}/references/RESEARCH.md +0 -0
- /package/skills/{cro-methodology → cm-cro-methodology}/references/funnel-analysis.md +0 -0
- /package/skills/{cro-methodology → cm-cro-methodology}/references/testing-methodology.md +0 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
UX-Master Template Engine
|
|
4
|
+
|
|
5
|
+
Advanced template system supporting:
|
|
6
|
+
- YAML-based platform configurations
|
|
7
|
+
- Conditional blocks: {{#if pro}}...{{/if}}
|
|
8
|
+
- Loops: {{#each stacks}}...{{/each}}
|
|
9
|
+
- Partials: {{> quick-reference}}
|
|
10
|
+
- Variables: {{variable_name}}
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import re
|
|
14
|
+
import yaml
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Callable, Optional
|
|
18
|
+
from rich.console import Console
|
|
19
|
+
|
|
20
|
+
console = Console()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class PlatformConfig:
|
|
25
|
+
"""Platform configuration for skill generation."""
|
|
26
|
+
platform: str
|
|
27
|
+
display_name: str
|
|
28
|
+
install_type: str # 'full', 'reference', 'mcp'
|
|
29
|
+
folder_structure: dict
|
|
30
|
+
script_path: str
|
|
31
|
+
frontmatter: Optional[dict] = None
|
|
32
|
+
sections: dict = field(default_factory=dict)
|
|
33
|
+
title: str = "UX Master - Design Intelligence"
|
|
34
|
+
description: str = ""
|
|
35
|
+
skill_or_workflow: str = "Skill"
|
|
36
|
+
# NEW: MCP-specific fields
|
|
37
|
+
mcp_capabilities: list = field(default_factory=list)
|
|
38
|
+
tool_endpoints: list = field(default_factory=list)
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def from_yaml(cls, yaml_path: Path) -> "PlatformConfig":
|
|
42
|
+
"""Load platform config from YAML file."""
|
|
43
|
+
with open(yaml_path, 'r', encoding='utf-8') as f:
|
|
44
|
+
data = yaml.safe_load(f)
|
|
45
|
+
return cls(**data)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TemplateEngine:
|
|
49
|
+
"""Advanced template engine with rich features."""
|
|
50
|
+
|
|
51
|
+
def __init__(self, templates_dir: Optional[Path] = None):
|
|
52
|
+
"""Initialize template engine.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
templates_dir: Directory containing templates
|
|
56
|
+
"""
|
|
57
|
+
if templates_dir is None:
|
|
58
|
+
self.templates_dir = Path(__file__).parent.parent / "templates"
|
|
59
|
+
else:
|
|
60
|
+
self.templates_dir = Path(templates_dir)
|
|
61
|
+
|
|
62
|
+
self._cache: dict[str, str] = {}
|
|
63
|
+
self._helpers: dict[str, Callable] = {
|
|
64
|
+
'upper': str.upper,
|
|
65
|
+
'lower': str.lower,
|
|
66
|
+
'title': str.title,
|
|
67
|
+
'snake_case': self._to_snake_case,
|
|
68
|
+
'kebab_case': self._to_kebab_case,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
def render(self, template: str, context: dict[str, Any]) -> str:
|
|
72
|
+
"""Render template with context.
|
|
73
|
+
|
|
74
|
+
Supports:
|
|
75
|
+
- Variables: {{name}} or {{name | upper}}
|
|
76
|
+
- Conditionals: {{#if condition}}...{{/if}}
|
|
77
|
+
- Unless: {{#unless condition}}...{{/unless}}
|
|
78
|
+
- Loops: {{#each items}}...{{/each}}
|
|
79
|
+
- Partials: {{> partial_name}}
|
|
80
|
+
- Comments: {{! comment }}
|
|
81
|
+
"""
|
|
82
|
+
result = template
|
|
83
|
+
|
|
84
|
+
# Remove comments first
|
|
85
|
+
result = self._remove_comments(result)
|
|
86
|
+
|
|
87
|
+
# Process partials
|
|
88
|
+
result = self._process_partials(result)
|
|
89
|
+
|
|
90
|
+
# Process conditionals (handle nested)
|
|
91
|
+
result = self._process_conditionals(result, context)
|
|
92
|
+
|
|
93
|
+
# Process loops
|
|
94
|
+
result = self._process_loops(result, context)
|
|
95
|
+
|
|
96
|
+
# Process variables
|
|
97
|
+
result = self._process_variables(result, context)
|
|
98
|
+
|
|
99
|
+
return result
|
|
100
|
+
|
|
101
|
+
def render_file(self, template_name: str, context: dict[str, Any]) -> str:
|
|
102
|
+
"""Render template from file."""
|
|
103
|
+
template_path = self.templates_dir / "base" / f"{template_name}.md"
|
|
104
|
+
if not template_path.exists():
|
|
105
|
+
raise FileNotFoundError(f"Template not found: {template_path}")
|
|
106
|
+
|
|
107
|
+
with open(template_path, 'r', encoding='utf-8') as f:
|
|
108
|
+
template = f.read()
|
|
109
|
+
|
|
110
|
+
return self.render(template, context)
|
|
111
|
+
|
|
112
|
+
def render_platform_config(self, config: PlatformConfig) -> str:
|
|
113
|
+
"""Render complete skill file for a platform."""
|
|
114
|
+
context = {
|
|
115
|
+
'platform': config.platform,
|
|
116
|
+
'display_name': config.display_name,
|
|
117
|
+
'title': config.title,
|
|
118
|
+
'description': config.description,
|
|
119
|
+
'skill_or_workflow': config.skill_or_workflow,
|
|
120
|
+
'script_path': config.script_path,
|
|
121
|
+
'frontmatter': config.frontmatter,
|
|
122
|
+
'sections': config.sections,
|
|
123
|
+
'mcp_capabilities': config.mcp_capabilities,
|
|
124
|
+
'tool_endpoints': config.tool_endpoints,
|
|
125
|
+
'has_ux_laws': True,
|
|
126
|
+
'has_design_tests': True,
|
|
127
|
+
'has_validation': True,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
# Render frontmatter if exists
|
|
131
|
+
lines = []
|
|
132
|
+
if config.frontmatter:
|
|
133
|
+
lines.append("---")
|
|
134
|
+
for key, value in config.frontmatter.items():
|
|
135
|
+
if isinstance(value, list):
|
|
136
|
+
lines.append(f"{key}:")
|
|
137
|
+
for item in value:
|
|
138
|
+
lines.append(f" - {item}")
|
|
139
|
+
elif isinstance(value, dict):
|
|
140
|
+
lines.append(f"{key}:")
|
|
141
|
+
for k, v in value.items():
|
|
142
|
+
lines.append(f" {k}: {v}")
|
|
143
|
+
else:
|
|
144
|
+
lines.append(f"{key}: {value}")
|
|
145
|
+
lines.append("---")
|
|
146
|
+
lines.append("")
|
|
147
|
+
|
|
148
|
+
# Render main content
|
|
149
|
+
content = self.render_file("skill-core", context)
|
|
150
|
+
lines.append(content)
|
|
151
|
+
|
|
152
|
+
# Add quick reference if enabled
|
|
153
|
+
if config.sections.get('quick_reference', False):
|
|
154
|
+
quick_ref = self.render_file("quick-reference", context)
|
|
155
|
+
lines.append("")
|
|
156
|
+
lines.append(quick_ref)
|
|
157
|
+
|
|
158
|
+
return "\n".join(lines)
|
|
159
|
+
|
|
160
|
+
def _remove_comments(self, template: str) -> str:
|
|
161
|
+
"""Remove template comments."""
|
|
162
|
+
return re.sub(r'\{\{!.*?\}\}', '', template, flags=re.DOTALL)
|
|
163
|
+
|
|
164
|
+
def _process_partials(self, template: str) -> str:
|
|
165
|
+
"""Process partial includes."""
|
|
166
|
+
pattern = r'\{\{>\s*(\w+(-\w+)*)\s*\}\}'
|
|
167
|
+
|
|
168
|
+
def replace_partial(match: re.Match) -> str:
|
|
169
|
+
partial_name = match.group(1)
|
|
170
|
+
try:
|
|
171
|
+
partial_path = self.templates_dir / "partials" / f"{partial_name}.md"
|
|
172
|
+
if partial_path.exists():
|
|
173
|
+
with open(partial_path, 'r', encoding='utf-8') as f:
|
|
174
|
+
return f.read()
|
|
175
|
+
return f"<!-- Partial '{partial_name}' not found -->"
|
|
176
|
+
except Exception as e:
|
|
177
|
+
return f"<!-- Error loading partial '{partial_name}': {e} -->"
|
|
178
|
+
|
|
179
|
+
return re.sub(pattern, replace_partial, template)
|
|
180
|
+
|
|
181
|
+
def _process_conditionals(self, template: str, context: dict) -> str:
|
|
182
|
+
"""Process conditional blocks."""
|
|
183
|
+
# Handle {{#if condition}}...{{/if}}
|
|
184
|
+
def replace_if(match: re.Match) -> str:
|
|
185
|
+
condition = match.group(1).strip()
|
|
186
|
+
content = match.group(2)
|
|
187
|
+
|
|
188
|
+
# Evaluate condition
|
|
189
|
+
if self._evaluate_condition(condition, context):
|
|
190
|
+
return self._process_conditionals(content, context)
|
|
191
|
+
return ""
|
|
192
|
+
|
|
193
|
+
# Handle {{#unless condition}}...{{/unless}}
|
|
194
|
+
def replace_unless(match: re.Match) -> str:
|
|
195
|
+
condition = match.group(1).strip()
|
|
196
|
+
content = match.group(2)
|
|
197
|
+
|
|
198
|
+
if not self._evaluate_condition(condition, context):
|
|
199
|
+
return self._process_conditionals(content, context)
|
|
200
|
+
return ""
|
|
201
|
+
|
|
202
|
+
# Handle {{#if condition}}...{{else}}...{{/if}}
|
|
203
|
+
def replace_if_else(match: re.Match) -> str:
|
|
204
|
+
condition = match.group(1).strip()
|
|
205
|
+
if_content = match.group(2)
|
|
206
|
+
else_content = match.group(4) if match.group(4) else ""
|
|
207
|
+
|
|
208
|
+
if self._evaluate_condition(condition, context):
|
|
209
|
+
return self._process_conditionals(if_content, context)
|
|
210
|
+
else:
|
|
211
|
+
return self._process_conditionals(else_content, context)
|
|
212
|
+
|
|
213
|
+
result = template
|
|
214
|
+
# Process nested if-else first
|
|
215
|
+
result = re.sub(
|
|
216
|
+
r'\{\{#if\s+([^}]+)\}\}(.*?)\{\{else\}\}(.*?)\{\{/if\}\}',
|
|
217
|
+
replace_if_else, result, flags=re.DOTALL
|
|
218
|
+
)
|
|
219
|
+
# Then simple if
|
|
220
|
+
result = re.sub(
|
|
221
|
+
r'\{\{#if\s+([^}]+)\}\}(.*?)\{\{/if\}\}',
|
|
222
|
+
replace_if, result, flags=re.DOTALL
|
|
223
|
+
)
|
|
224
|
+
# Then unless
|
|
225
|
+
result = re.sub(
|
|
226
|
+
r'\{\{#unless\s+([^}]+)\}\}(.*?)\{\{/unless\}\}',
|
|
227
|
+
replace_unless, result, flags=re.DOTALL
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
return result
|
|
231
|
+
|
|
232
|
+
def _process_loops(self, template: str, context: dict) -> str:
|
|
233
|
+
"""Process loop blocks."""
|
|
234
|
+
pattern = r'\{\{#each\s+(\w+)\}\}(.*?)\{\{/each\}\}'
|
|
235
|
+
|
|
236
|
+
def replace_loop(match: re.Match) -> str:
|
|
237
|
+
list_name = match.group(1)
|
|
238
|
+
content = match.group(2)
|
|
239
|
+
|
|
240
|
+
items = context.get(list_name, [])
|
|
241
|
+
if not items:
|
|
242
|
+
return ""
|
|
243
|
+
|
|
244
|
+
results = []
|
|
245
|
+
for i, item in enumerate(items):
|
|
246
|
+
item_context = {**context, 'this': item, '@index': i, '@first': i == 0, '@last': i == len(items) - 1}
|
|
247
|
+
# Handle {{this.property}} or just {{this}}
|
|
248
|
+
item_content = content
|
|
249
|
+
if isinstance(item, dict):
|
|
250
|
+
for key, value in item.items():
|
|
251
|
+
item_content = item_content.replace(f'{{{{this.{key}}}}}', str(value))
|
|
252
|
+
else:
|
|
253
|
+
item_content = item_content.replace('{{this}}', str(item))
|
|
254
|
+
item_content = self._process_variables(item_content, item_context)
|
|
255
|
+
results.append(item_content)
|
|
256
|
+
|
|
257
|
+
return "".join(results)
|
|
258
|
+
|
|
259
|
+
return re.sub(pattern, replace_loop, template, flags=re.DOTALL)
|
|
260
|
+
|
|
261
|
+
def _process_variables(self, template: str, context: dict) -> str:
|
|
262
|
+
"""Process variable substitutions with optional filters."""
|
|
263
|
+
# Pattern: {{variable}} or {{variable | filter}} or {{variable.nested}}
|
|
264
|
+
pattern = r'\{\{\s*([\w.]+)(?:\s*\|\s*(\w+))?\s*\}\}'
|
|
265
|
+
|
|
266
|
+
def replace_var(match: re.Match) -> str:
|
|
267
|
+
var_path = match.group(1)
|
|
268
|
+
filter_name = match.group(2)
|
|
269
|
+
|
|
270
|
+
# Get value from context (support nested: obj.prop)
|
|
271
|
+
value = self._get_nested_value(context, var_path)
|
|
272
|
+
|
|
273
|
+
if value is None:
|
|
274
|
+
return f"{{{{{var_path}}}}}" # Keep original if not found
|
|
275
|
+
|
|
276
|
+
result = str(value)
|
|
277
|
+
|
|
278
|
+
# Apply filter if specified
|
|
279
|
+
if filter_name and filter_name in self._helpers:
|
|
280
|
+
result = self._helpers[filter_name](result)
|
|
281
|
+
|
|
282
|
+
return result
|
|
283
|
+
|
|
284
|
+
return re.sub(pattern, replace_var, template)
|
|
285
|
+
|
|
286
|
+
def _evaluate_condition(self, condition: str, context: dict) -> bool:
|
|
287
|
+
"""Evaluate a condition string."""
|
|
288
|
+
condition = condition.strip()
|
|
289
|
+
|
|
290
|
+
# Handle negation
|
|
291
|
+
if condition.startswith('!'):
|
|
292
|
+
return not self._evaluate_condition(condition[1:], context)
|
|
293
|
+
|
|
294
|
+
# Handle comparisons
|
|
295
|
+
if '==' in condition:
|
|
296
|
+
left, right = condition.split('==', 1)
|
|
297
|
+
left_val = self._get_nested_value(context, left.strip())
|
|
298
|
+
right_val = right.strip().strip('"\'')
|
|
299
|
+
return str(left_val) == right_val
|
|
300
|
+
|
|
301
|
+
if '!=' in condition:
|
|
302
|
+
left, right = condition.split('!=', 1)
|
|
303
|
+
left_val = self._get_nested_value(context, left.strip())
|
|
304
|
+
right_val = right.strip().strip('"\'')
|
|
305
|
+
return str(left_val) != right_val
|
|
306
|
+
|
|
307
|
+
# Simple truthiness check
|
|
308
|
+
value = self._get_nested_value(context, condition)
|
|
309
|
+
return bool(value)
|
|
310
|
+
|
|
311
|
+
def _get_nested_value(self, context: dict, path: str) -> Any:
|
|
312
|
+
"""Get value from nested dict using dot notation."""
|
|
313
|
+
parts = path.split('.')
|
|
314
|
+
value = context
|
|
315
|
+
|
|
316
|
+
for part in parts:
|
|
317
|
+
if isinstance(value, dict):
|
|
318
|
+
value = value.get(part)
|
|
319
|
+
else:
|
|
320
|
+
return None
|
|
321
|
+
if value is None:
|
|
322
|
+
return None
|
|
323
|
+
|
|
324
|
+
return value
|
|
325
|
+
|
|
326
|
+
def _to_snake_case(self, s: str) -> str:
|
|
327
|
+
"""Convert string to snake_case."""
|
|
328
|
+
s = re.sub(r'(?<!^)(?=[A-Z])', '_', s).lower()
|
|
329
|
+
s = re.sub(r'[\s-]+', '_', s)
|
|
330
|
+
return s
|
|
331
|
+
|
|
332
|
+
def _to_kebab_case(self, s: str) -> str:
|
|
333
|
+
"""Convert string to kebab-case."""
|
|
334
|
+
s = re.sub(r'(?<!^)(?=[A-Z])', '-', s).lower()
|
|
335
|
+
s = re.sub(r'[\s_]+', '-', s)
|
|
336
|
+
return s
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
class PlatformManager:
|
|
340
|
+
"""Manages platform configurations and generation."""
|
|
341
|
+
|
|
342
|
+
# Map AI types to platform config files
|
|
343
|
+
AI_TO_PLATFORM = {
|
|
344
|
+
'claude': 'claude',
|
|
345
|
+
'cursor': 'cursor',
|
|
346
|
+
'windsurf': 'windsurf',
|
|
347
|
+
'antigravity': 'antigravity',
|
|
348
|
+
'copilot': 'copilot',
|
|
349
|
+
'kiro': 'kiro',
|
|
350
|
+
'opencode': 'opencode',
|
|
351
|
+
'roocode': 'roocode',
|
|
352
|
+
'codex': 'codex',
|
|
353
|
+
'qoder': 'qoder',
|
|
354
|
+
'gemini': 'gemini',
|
|
355
|
+
'trae': 'trae',
|
|
356
|
+
'continue': 'continue',
|
|
357
|
+
'codebuddy': 'codebuddy',
|
|
358
|
+
'droid': 'droid',
|
|
359
|
+
'cline': 'cline',
|
|
360
|
+
'all': 'all',
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
def __init__(self, templates_dir: Optional[Path] = None):
|
|
364
|
+
self.engine = TemplateEngine(templates_dir)
|
|
365
|
+
self.platforms_dir = self.engine.templates_dir / "platforms"
|
|
366
|
+
|
|
367
|
+
def load_platform_config(self, ai_type: str) -> PlatformConfig:
|
|
368
|
+
"""Load configuration for an AI assistant type."""
|
|
369
|
+
platform_name = self.AI_TO_PLATFORM.get(ai_type)
|
|
370
|
+
if not platform_name:
|
|
371
|
+
raise ValueError(f"Unknown AI type: {ai_type}. Available: {list(self.AI_TO_PLATFORM.keys())}")
|
|
372
|
+
|
|
373
|
+
config_path = self.platforms_dir / f"{platform_name}.yaml"
|
|
374
|
+
if not config_path.exists():
|
|
375
|
+
raise FileNotFoundError(f"Platform config not found: {config_path}")
|
|
376
|
+
|
|
377
|
+
return PlatformConfig.from_yaml(config_path)
|
|
378
|
+
|
|
379
|
+
def generate_skill(self, ai_type: str, output_dir: Path) -> list[str]:
|
|
380
|
+
"""Generate skill files for a platform."""
|
|
381
|
+
config = self.load_platform_config(ai_type)
|
|
382
|
+
|
|
383
|
+
# Determine output path
|
|
384
|
+
skill_dir = output_dir / config.folder_structure['root'] / config.folder_structure['skillPath']
|
|
385
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
386
|
+
|
|
387
|
+
# Render skill content
|
|
388
|
+
content = self.engine.render_platform_config(config)
|
|
389
|
+
|
|
390
|
+
# Write skill file
|
|
391
|
+
skill_file = skill_dir / config.folder_structure['filename']
|
|
392
|
+
with open(skill_file, 'w', encoding='utf-8') as f:
|
|
393
|
+
f.write(content)
|
|
394
|
+
|
|
395
|
+
created = [str(skill_file)]
|
|
396
|
+
|
|
397
|
+
# Copy data and scripts if full install
|
|
398
|
+
if config.install_type == 'full':
|
|
399
|
+
created.extend(self._copy_data_and_scripts(skill_dir))
|
|
400
|
+
|
|
401
|
+
return created
|
|
402
|
+
|
|
403
|
+
def generate_all_platforms(self, output_dir: Path) -> list[str]:
|
|
404
|
+
"""Generate skill files for all platforms."""
|
|
405
|
+
all_created = []
|
|
406
|
+
for ai_type in self.AI_TO_PLATFORM.keys():
|
|
407
|
+
if ai_type == 'all':
|
|
408
|
+
continue
|
|
409
|
+
try:
|
|
410
|
+
created = self.generate_skill(ai_type, output_dir)
|
|
411
|
+
all_created.extend(created)
|
|
412
|
+
except Exception as e:
|
|
413
|
+
console.print(f"[yellow]Warning: Failed to generate for {ai_type}: {e}[/yellow]")
|
|
414
|
+
|
|
415
|
+
return all_created
|
|
416
|
+
|
|
417
|
+
def list_supported_platforms(self) -> dict[str, str]:
|
|
418
|
+
"""List all supported AI platforms."""
|
|
419
|
+
platforms = {}
|
|
420
|
+
for ai_type, platform_name in self.AI_TO_PLATFORM.items():
|
|
421
|
+
if ai_type == 'all':
|
|
422
|
+
continue
|
|
423
|
+
try:
|
|
424
|
+
config = self.load_platform_config(ai_type)
|
|
425
|
+
platforms[ai_type] = config.display_name
|
|
426
|
+
except:
|
|
427
|
+
platforms[ai_type] = platform_name
|
|
428
|
+
|
|
429
|
+
return platforms
|
|
430
|
+
|
|
431
|
+
def _copy_data_and_scripts(self, skill_dir: Path) -> list[str]:
|
|
432
|
+
"""Copy data and scripts to skill directory."""
|
|
433
|
+
created = []
|
|
434
|
+
|
|
435
|
+
# Find source directories
|
|
436
|
+
cli_dir = self.engine.templates_dir.parent
|
|
437
|
+
|
|
438
|
+
# Copy data (relative to existing ux-master structure)
|
|
439
|
+
data_source = cli_dir.parent / "data"
|
|
440
|
+
if data_source.exists():
|
|
441
|
+
import shutil
|
|
442
|
+
data_target = skill_dir / "data"
|
|
443
|
+
if data_target.exists():
|
|
444
|
+
shutil.rmtree(data_target)
|
|
445
|
+
shutil.copytree(data_source, data_target)
|
|
446
|
+
created.append(str(data_target))
|
|
447
|
+
|
|
448
|
+
# Copy scripts
|
|
449
|
+
scripts_source = cli_dir.parent / "scripts"
|
|
450
|
+
if scripts_source.exists():
|
|
451
|
+
import shutil
|
|
452
|
+
scripts_target = skill_dir / "scripts"
|
|
453
|
+
if scripts_target.exists():
|
|
454
|
+
shutil.rmtree(scripts_target)
|
|
455
|
+
shutil.copytree(scripts_source, scripts_target)
|
|
456
|
+
created.append(str(scripts_target))
|
|
457
|
+
|
|
458
|
+
return created
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Utility functions for UX-Master CLI."""
|
|
2
|
+
|
|
3
|
+
from .console import console, print_banner, print_success, print_error
|
|
4
|
+
from .detect import detect_ai_type, get_ai_type_description
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"console", "print_banner", "print_success", "print_error",
|
|
8
|
+
"detect_ai_type", "get_ai_type_description"
|
|
9
|
+
]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Console utilities for rich output."""
|
|
2
|
+
|
|
3
|
+
from rich.console import Console
|
|
4
|
+
from rich.panel import Panel
|
|
5
|
+
from rich.text import Text
|
|
6
|
+
|
|
7
|
+
console = Console()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def print_banner():
|
|
11
|
+
"""Print UX-Master banner."""
|
|
12
|
+
banner_text = Text()
|
|
13
|
+
banner_text.append("UX-Master ", style="bold cyan")
|
|
14
|
+
banner_text.append("v2.0.0", style="dim")
|
|
15
|
+
|
|
16
|
+
panel = Panel(
|
|
17
|
+
banner_text,
|
|
18
|
+
subtitle="Ultimate UX Design Intelligence",
|
|
19
|
+
subtitle_align="center",
|
|
20
|
+
border_style="cyan"
|
|
21
|
+
)
|
|
22
|
+
console.print(panel)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def print_success(message: str):
|
|
26
|
+
"""Print success message."""
|
|
27
|
+
console.print(f"[bold green]✓[/bold green] {message}")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def print_error(message: str):
|
|
31
|
+
"""Print error message."""
|
|
32
|
+
console.print(f"[bold red]✗[/bold red] {message}")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def print_warning(message: str):
|
|
36
|
+
"""Print warning message."""
|
|
37
|
+
console.print(f"[bold yellow]⚠[/bold yellow] {message}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def print_info(message: str):
|
|
41
|
+
"""Print info message."""
|
|
42
|
+
console.print(f"[blue]ℹ[/blue] {message}")
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""AI assistant detection utilities."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional, Tuple
|
|
5
|
+
|
|
6
|
+
# AI type descriptions
|
|
7
|
+
AI_DESCRIPTIONS = {
|
|
8
|
+
"claude": "Claude Code (Anthropic)",
|
|
9
|
+
"cursor": "Cursor IDE",
|
|
10
|
+
"windsurf": "Windsurf IDE",
|
|
11
|
+
"antigravity": "Antigravity (VS Code extension)",
|
|
12
|
+
"copilot": "GitHub Copilot",
|
|
13
|
+
"kiro": "Kiro (VS Code extension)",
|
|
14
|
+
"opencode": "OpenCode CLI",
|
|
15
|
+
"roocode": "Roo Code (VS Code extension)",
|
|
16
|
+
"codex": "Codex CLI (OpenAI)",
|
|
17
|
+
"qoder": "Qoder IDE",
|
|
18
|
+
"gemini": "Gemini CLI (Google)",
|
|
19
|
+
"trae": "Trae IDE",
|
|
20
|
+
"continue": "Continue (VS Code extension)",
|
|
21
|
+
"codebuddy": "CodeBuddy IDE",
|
|
22
|
+
"droid": "Droid (Factory)",
|
|
23
|
+
"cline": "Cline (VS Code extension)",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def detect_ai_type() -> Tuple[list[str], Optional[str]]:
|
|
28
|
+
"""Detect which AI assistants are installed.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Tuple of (detected_types, suggested_type)
|
|
32
|
+
"""
|
|
33
|
+
detected = []
|
|
34
|
+
suggested = None
|
|
35
|
+
|
|
36
|
+
# Check for common configuration directories
|
|
37
|
+
cwd = Path.cwd()
|
|
38
|
+
home = Path.home()
|
|
39
|
+
|
|
40
|
+
# Check current project
|
|
41
|
+
indicators = {
|
|
42
|
+
".claude": "claude",
|
|
43
|
+
".cursor": "cursor",
|
|
44
|
+
".windsurf": "windsurf",
|
|
45
|
+
".antigravity": "antigravity",
|
|
46
|
+
".kiro": "kiro",
|
|
47
|
+
".opencode": "opencode",
|
|
48
|
+
".roocode": "roocode",
|
|
49
|
+
".codex": "codex",
|
|
50
|
+
".qoder": "qoder",
|
|
51
|
+
".trae": "trae",
|
|
52
|
+
".continue": "continue",
|
|
53
|
+
".factory": "droid",
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for folder, ai_type in indicators.items():
|
|
57
|
+
if (cwd / folder).exists():
|
|
58
|
+
detected.append(ai_type)
|
|
59
|
+
if suggested is None:
|
|
60
|
+
suggested = ai_type
|
|
61
|
+
|
|
62
|
+
# Check global configs
|
|
63
|
+
global_indicators = {
|
|
64
|
+
home / ".claude": "claude",
|
|
65
|
+
home / ".cursor": "cursor",
|
|
66
|
+
home / ".config" / "claude": "claude",
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
for path, ai_type in global_indicators.items():
|
|
70
|
+
if path.exists() and ai_type not in detected:
|
|
71
|
+
detected.append(ai_type)
|
|
72
|
+
|
|
73
|
+
return detected, suggested
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def get_ai_type_description(ai_type: str) -> str:
|
|
77
|
+
"""Get human-readable description for AI type."""
|
|
78
|
+
return AI_DESCRIPTIONS.get(ai_type, ai_type.title())
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def list_all_ai_types() -> dict[str, str]:
|
|
82
|
+
"""List all supported AI types."""
|
|
83
|
+
return AI_DESCRIPTIONS.copy()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Category,WCAG_Criterion,Keywords,Description,Do,Don't,Code_Good,Code_Bad,Severity,Level
|
|
2
|
+
Focus,2.4.7 Focus Visible,focus visible indicator keyboard outline ring,Ensure focus indicator is clearly visible on all interactive elements,Use focus-visible with 2px+ outline offset from element,Remove outline without replacement,":focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }",":focus { outline: none; }",High,AA
|
|
3
|
+
Focus,2.4.11 Focus Not Obscured,focus obscured covered hidden sticky,Ensure focused element is not obscured by sticky/fixed elements,scroll-margin-top to account for sticky headers,Fixed headers covering focused form fields,"scroll-margin-top: 80px; /* height of sticky header */","/* No scroll-margin with position:sticky header */",High,AA
|
|
4
|
+
Focus,2.4.12 Focus Not Obscured Enhanced,focus visible enhanced fully visible,Focused element must be fully visible (not partially hidden),Ensure entire focused element is in viewport,Allowing partial visibility of focused element,"scrollIntoView({ block: 'center' })","/* Focus hidden behind modal overlay */",Medium,AAA
|
|
5
|
+
Focus,2.4.13 Focus Appearance,focus appearance thickness area contrast,Focus indicator must have sufficient size and contrast,3:1 contrast ratio + 2px thickness + covers full perimeter,Thin single-side border change as only indicator,":focus-visible { outline: 3px solid #1e40af; outline-offset: 3px; }",":focus { border-bottom: 1px solid gray; }",High,AAA
|
|
6
|
+
Target,2.5.8 Target Size Minimum,target size minimum 24px touch click,Interactive targets must be at least 24×24px CSS pixels,min-width: 24px min-height: 24px for all interactive elements,Inline links or buttons smaller than 24px,"min-height: 24px; min-width: 24px;","font-size: 12px; /* tiny link */",High,AA
|
|
7
|
+
Target,2.5.5 Target Size Enhanced,target size enhanced 44px touch mobile,Interactive targets should be at least 44×44px for comfortable touch,44×44px minimum on mobile + adequate spacing between targets,Small targets close together on touch screens,"min-height: 44px; min-width: 44px; gap: 8px;","height: 20px; /* icon button */",Medium,AAA
|
|
8
|
+
Motion,2.3.3 Animation from Interactions,animation interaction motion triggered,Animations triggered by interaction can be disabled by users,Provide prefers-reduced-motion override for all animations,Animations that cannot be paused or disabled,"@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition-duration: 0.01ms !important; } }","/* No reduced-motion media query */",High,AAA
|
|
9
|
+
Motion,2.2.2 Pause Stop Hide,pause stop hide auto-play carousel animation moving,Content that auto-plays can be paused stopped or hidden,Provide visible pause/stop controls for auto-playing content,Auto-playing carousels or videos without controls,"<button aria-label='Pause slideshow'>⏸</button>","<div class='carousel auto-play'> /* no pause */",High,AA
|
|
10
|
+
Color,1.4.1 Use of Color,color alone information status,Color is not the only means of conveying information,Use icons + text + color for states like error/success,Red border only to indicate error,"<span class='error'>❌ Invalid email</span>","<input style='border-color:red'> /* color only */",High,AA
|
|
11
|
+
Color,1.4.3 Contrast Minimum,contrast ratio text background 4.5 3,Text has minimum contrast ratio against background,4.5:1 for normal text + 3:1 for large text (18pt+/14pt bold),Low contrast gray text on light backgrounds,"color: #1e293b; background: #ffffff; /* 14.5:1 ratio */","color: #9ca3af; background: #f3f4f6; /* 2.2:1 ratio */",High,AA
|
|
12
|
+
Color,1.4.6 Contrast Enhanced,contrast enhanced 7 ratio strict,Enhanced contrast ratios for maximum readability,7:1 for normal text + 4.5:1 for large text,Decorative text below 7:1 ratio on content pages,"color: #0f172a; background: #ffffff; /* 17.8:1 ratio */","color: #6b7280; background: #ffffff; /* 4.6:1 ratio */",Medium,AAA
|
|
13
|
+
Color,1.4.11 Non-Text Contrast,non-text contrast ui component border icon,UI components and graphical objects have 3:1 contrast against adjacent colors,3:1 contrast for borders icons focus indicators,Low contrast borders or icons on similar backgrounds,"border: 2px solid #6b7280; /* 5.9:1 vs white */","border: 1px solid #e5e7eb; /* 1.4:1 vs white */",High,AA
|
|
14
|
+
Structure,1.3.1 Info and Relationships,semantic html structure heading landmark,Programmatically communicate structure and relationships,Use semantic HTML elements and ARIA landmarks,"<div> soup without semantic meaning","<nav aria-label='Main'><ul>...</ul></nav>","<div class='nav'><div>...</div></div>",High,AA
|
|
15
|
+
Structure,1.3.2 Meaningful Sequence,reading order dom visual logical,DOM order matches visual and logical reading order,Ensure CSS layout doesn't reorder content visually vs DOM,CSS order or flex-direction that breaks reading flow,"/* DOM matches visual order */","order: -1; /* visually first but last in DOM */",High,AA
|
|
16
|
+
Structure,2.4.6 Headings and Labels,headings labels descriptive hierarchy,Headings and labels describe topic or purpose,Descriptive headings in logical hierarchy (h1→h2→h3),Vague headings or skipped heading levels,"<h1>Dashboard</h1><h2>Revenue</h2><h3>Monthly</h3>","<h1>Page</h1><h3>Section</h3> /* skipped h2 */",Medium,AA
|
|
17
|
+
Forms,3.3.2 Labels or Instructions,label input form instruction required,Inputs have visible labels explaining required format,Visible <label> associated with each input,Placeholder-only inputs without labels,"<label for='email'>Email address</label><input id='email'>","<input placeholder='Email'> /* no label */",High,AA
|
|
18
|
+
Forms,3.3.1 Error Identification,error identification form validation message,Errors are clearly identified and described in text,Specific error message near the field + aria-describedby,Generic "form has errors" at top of page,"<p id='email-error' role='alert'>Enter a valid email address</p>","<p>Form has errors</p> /* at top */",High,AA
|
|
19
|
+
Forms,3.3.3 Error Suggestion,error suggestion correction format example,Suggest corrections when input errors are detected,Show expected format or example values near errors,Only showing "invalid" without help,"<p>Expected format: MM/DD/YYYY (e.g. 12/25/2025)</p>","<p>Invalid date</p> /* no help */",Medium,AA
|
|
20
|
+
Forms,3.3.8 Accessible Authentication,accessible authentication captcha password,Authentication doesn't rely solely on cognitive function tests,Allow paste in password fields + support password managers,Blocking paste in password fields or using text CAPTCHAs,"<input type='password' autocomplete='current-password'>","<input onpaste='return false'> /* blocks paste */",High,AA
|
|
21
|
+
Cognitive,3.2.6 Consistent Help,consistent help location support contact,Help mechanisms appear in same relative order across pages,Place help link/chat in consistent location (e.g. footer or FAB),Help in different locations on different pages,"/* Help always in bottom-right corner */","/* Help in header on page A footer on page B */",Medium,AA
|
|
22
|
+
Cognitive,2.4.1 Bypass Blocks,skip navigation link bypass repeated,Provide skip links to bypass repeated content blocks,Hidden skip link that appears on focus before main nav,No skip navigation link,"<a href='#main' class='sr-only focus:not-sr-only'>Skip to content</a>","/* No skip link */",High,AA
|
|
23
|
+
Screen Reader,4.1.2 Name Role Value,aria name role value state widget,Custom components expose name role and value to assistive technology,ARIA attributes on custom widgets matching behavior,Custom widgets without ARIA,<button aria-expanded='true' aria-controls='menu'>Menu</button>,<div onclick='toggleMenu()'>Menu</div>,High,AA
|
|
24
|
+
Screen Reader,1.1.1 Text Alternatives,alt text image description decorative,Non-text content has text alternatives,Descriptive alt text for informative images + alt='' for decorative,"Missing alt attributes or alt='image'","<img alt='Revenue chart showing 23% growth in Q4'>","<img alt='chart'> or <img> /* no alt */",High,AA
|
|
25
|
+
Screen Reader,4.1.3 Status Messages,status message aria-live polite assertive,Status messages are announced by screen readers without focus change,aria-live regions for dynamic content updates,Status changes that aren't announced,"<div role='status' aria-live='polite'>3 results found</div>","<div>3 results found</div> /* not announced */",High,AA
|
|
26
|
+
Media,1.2.1 Audio/Video Alternatives,audio video captions transcript alternative,Pre-recorded audio/video has alternatives,Captions for video + transcripts for audio,Auto-play video without captions,"<video><track kind='captions' src='captions.vtt' srclang='en'></video>","<video autoplay> /* no captions */",High,AA
|