codymaster 4.1.4 → 4.3.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/CHANGELOG.md +22 -2
- package/README.md +54 -84
- package/dist/index.js +118 -4
- package/install.sh +2 -2
- package/package.json +3 -8
- 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 +1307 -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
|
@@ -1,120 +1,483 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cm-safe-deploy
|
|
3
|
-
description: Use when setting up deployment infrastructure for any project - establishes multi-gate deploy pipeline with test gates, build verification, frontend safety checks,
|
|
3
|
+
description: Use when setting up deployment infrastructure for any project - establishes multi-gate deploy pipeline with test gates, build verification, frontend safety checks, and rollback strategy before code reaches production
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Safe Deploy Pipeline v2
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
A deploy without gates is a deploy with hope. Hope is not a strategy.
|
|
11
|
+
|
|
12
|
+
**Core principle:** Every project needs a multi-gate deploy pipeline. Code passes through syntax → tests → i18n → build → verify → deploy, with hard stops at each gate. No gate skipping. No "it'll be fine."
|
|
13
|
+
|
|
14
|
+
> [!CAUTION]
|
|
15
|
+
> **March 2026 Incident:** 572 backend tests passed green while `app.js` had catastrophic syntax errors → white screen in production. This pipeline exists because `test:gate` alone was NOT enough.
|
|
9
16
|
|
|
10
17
|
## The Iron Law
|
|
11
18
|
|
|
12
|
-
|
|
19
|
+
```
|
|
20
|
+
NO DEPLOY WITHOUT PASSING ALL GATES.
|
|
21
|
+
GATES ARE SEQUENTIAL. EACH MUST PASS BEFORE THE NEXT RUNS.
|
|
22
|
+
SYNTAX CHECK IS GATE 1. IF IT FAILS, NOTHING ELSE RUNS.
|
|
23
|
+
```
|
|
13
24
|
|
|
14
25
|
## When to Use
|
|
15
26
|
|
|
27
|
+
**ALWAYS** when:
|
|
16
28
|
- Setting up a new project's deployment infrastructure
|
|
17
|
-
-
|
|
29
|
+
- A project has no test gate before deploy
|
|
30
|
+
- Project deploys directly from `git push`
|
|
18
31
|
- After a production incident caused by untested code
|
|
19
32
|
- Adding CI/CD to an existing project
|
|
20
33
|
|
|
21
|
-
## The
|
|
34
|
+
## The 7-Gate Pipeline
|
|
35
|
+
|
|
36
|
+
```dot
|
|
37
|
+
digraph pipeline {
|
|
38
|
+
rankdir=LR;
|
|
39
|
+
gate0 [label="Gate 0\nSecret\nHygiene", shape=box, style=filled, fillcolor="#ffc0cb"];
|
|
40
|
+
gate1 [label="Gate 1\nSyntax", shape=box, style=filled, fillcolor="#ffcccc"];
|
|
41
|
+
gate2 [label="Gate 2\nTest\nSuite", shape=box, style=filled, fillcolor="#ffe0cc"];
|
|
42
|
+
gate3 [label="Gate 3\ni18n\nParity", shape=box, style=filled, fillcolor="#e0ccff"];
|
|
43
|
+
gate4 [label="Gate 4\nBuild", shape=box, style=filled, fillcolor="#ffffcc"];
|
|
44
|
+
gate5 [label="Gate 5\nDist\nVerify", shape=box, style=filled, fillcolor="#ccffcc"];
|
|
45
|
+
gate6 [label="Gate 6\nDeploy +\nSmoke", shape=box, style=filled, fillcolor="#cce5ff"];
|
|
46
|
+
fail [label="STOP\nFix first", shape=box, style=filled, fillcolor="#ff9999"];
|
|
47
|
+
|
|
48
|
+
gate0 -> gate1 [label="pass"];
|
|
49
|
+
gate0 -> fail [label="fail"];
|
|
50
|
+
gate1 -> gate2 [label="pass"];
|
|
51
|
+
gate1 -> fail [label="fail"];
|
|
52
|
+
gate2 -> gate3 [label="pass"];
|
|
53
|
+
gate2 -> fail [label="fail"];
|
|
54
|
+
gate3 -> gate4 [label="pass"];
|
|
55
|
+
gate3 -> fail [label="fail"];
|
|
56
|
+
gate4 -> gate5 [label="pass"];
|
|
57
|
+
gate4 -> fail [label="fail"];
|
|
58
|
+
gate5 -> gate6 [label="pass"];
|
|
59
|
+
gate5 -> fail [label="fail"];
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### Gate 0: Secret Hygiene (FASTEST FAIL — < 0.5 seconds)
|
|
66
|
+
|
|
67
|
+
> [!CAUTION]
|
|
68
|
+
> **March 2026 Security Incident:** `SUPABASE_SERVICE_KEY` was accidentally committed to `wrangler.jsonc`. This exposed a service-role key that bypasses Row Level Security in git history. Gate 0 prevents this from ever reaching the remote.
|
|
69
|
+
|
|
70
|
+
**The Rule: Where Each Variable Lives**
|
|
71
|
+
|
|
72
|
+
| Variable Type | Correct Location | WRONG Location |
|
|
73
|
+
|--------------|-----------------|----------------|
|
|
74
|
+
| Supabase URL (public) | `wrangler.jsonc` vars section | ❌ Hardcoded in code |
|
|
75
|
+
| `SUPABASE_SERVICE_KEY` | Cloudflare Secret (`wrangler secret put`) | ❌ `wrangler.jsonc` |
|
|
76
|
+
| `SUPABASE_ANON_KEY` | Cloudflare Secret | ❌ `wrangler.jsonc` |
|
|
77
|
+
| DB connection strings | Cloudflare Secret | ❌ Anywhere in repo |
|
|
78
|
+
| Local dev secrets | `.dev.vars` (gitignored) | ❌ `wrangler.jsonc` |
|
|
79
|
+
| Build config (non-secret) | `wrangler.jsonc` | — |
|
|
80
|
+
|
|
81
|
+
**Secret Hygiene Check (Enhanced — Repo-Wide):**
|
|
82
|
+
|
|
83
|
+
> Calls `cm-secret-shield` Layer 4 for deep scanning. Below is the essential check:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
node -e "
|
|
87
|
+
const fs = require('fs');
|
|
88
|
+
const { execSync } = require('child_process');
|
|
89
|
+
|
|
90
|
+
// 1. Check wrangler config for secrets
|
|
91
|
+
const wranglerFiles = ['wrangler.jsonc', 'wrangler.toml', 'wrangler.json'];
|
|
92
|
+
const dangerous = ['SERVICE_KEY', 'ANON_KEY', 'DB_PASSWORD', 'SECRET_KEY', 'PRIVATE_KEY', 'API_SECRET'];
|
|
93
|
+
let failed = false;
|
|
94
|
+
|
|
95
|
+
for (const wf of wranglerFiles) {
|
|
96
|
+
if (!fs.existsSync(wf)) continue;
|
|
97
|
+
const src = fs.readFileSync(wf, 'utf-8');
|
|
98
|
+
for (const key of dangerous) {
|
|
99
|
+
// Check for actual values, not just variable names
|
|
100
|
+
const valuePattern = new RegExp(key + '\\\\s*[=:]\\\\s*[\"\'][a-zA-Z0-9/+=]{20,}', 'g');
|
|
101
|
+
if (valuePattern.test(src)) {
|
|
102
|
+
console.error('❌ DANGEROUS: ' + wf + ' contains a ' + key + ' VALUE');
|
|
103
|
+
console.error(' Fix: wrangler secret put ' + key + ' (then remove from ' + wf + ')');
|
|
104
|
+
failed = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 2. Check .gitignore has required patterns
|
|
110
|
+
if (fs.existsSync('.gitignore')) {
|
|
111
|
+
const gi = fs.readFileSync('.gitignore', 'utf-8');
|
|
112
|
+
const required = ['.env', '.dev.vars'];
|
|
113
|
+
const missing = required.filter(r => !gi.includes(r));
|
|
114
|
+
if (missing.length > 0) {
|
|
115
|
+
console.error('❌ .gitignore missing: ' + missing.join(', '));
|
|
116
|
+
failed = true;
|
|
117
|
+
}
|
|
118
|
+
} else {
|
|
119
|
+
console.error('❌ No .gitignore found!');
|
|
120
|
+
failed = true;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 3. Check .env files aren't tracked by git
|
|
124
|
+
try {
|
|
125
|
+
const tracked = execSync('git ls-files', { encoding: 'utf-8' });
|
|
126
|
+
const badFiles = ['.env', '.dev.vars', '.env.local', '.env.production'];
|
|
127
|
+
const trackedBad = badFiles.filter(f => tracked.split('\\n').includes(f));
|
|
128
|
+
if (trackedBad.length > 0) {
|
|
129
|
+
console.error('❌ CRITICAL: Secret files tracked by git: ' + trackedBad.join(', '));
|
|
130
|
+
console.error(' Fix: git rm --cached ' + trackedBad.join(' '));
|
|
131
|
+
failed = true;
|
|
132
|
+
}
|
|
133
|
+
} catch (e) { /* not a git repo */ }
|
|
22
134
|
|
|
135
|
+
if (failed) {
|
|
136
|
+
console.error('\\n🛡️ Gate 0 FAILED. Fix issues above before deploying.');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
console.log('✅ Gate 0 passed: repo-wide secret hygiene verified');
|
|
140
|
+
"
|
|
23
141
|
```
|
|
24
|
-
|
|
25
|
-
|
|
142
|
+
|
|
143
|
+
**Setup `.dev.vars` for local development:**
|
|
144
|
+
```bash
|
|
145
|
+
# .dev.vars — local only, NEVER committed
|
|
146
|
+
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
|
|
147
|
+
SUPABASE_SERVICE_KEY=YOUR_SERVICE_KEY
|
|
148
|
+
|
|
149
|
+
# Add to .gitignore:
|
|
150
|
+
echo ".dev.vars" >> .gitignore
|
|
151
|
+
|
|
152
|
+
# Commit the template:
|
|
153
|
+
cp .dev.vars .dev.vars.example # Remove values first
|
|
154
|
+
git add .dev.vars.example
|
|
26
155
|
```
|
|
27
156
|
|
|
28
|
-
|
|
157
|
+
**If secrets were already committed:**
|
|
158
|
+
```bash
|
|
159
|
+
# Remove from git history (URGENT — do before pushing)
|
|
160
|
+
git filter-repo --path wrangler.jsonc --invert-paths # Nuclear option
|
|
161
|
+
# OR just remove the value from wrangler.jsonc and add as secret:
|
|
162
|
+
wrangler secret put SUPABASE_SERVICE_KEY
|
|
163
|
+
# Then rotate the key immediately in Supabase dashboard
|
|
164
|
+
```
|
|
29
165
|
|
|
30
166
|
---
|
|
31
167
|
|
|
32
|
-
### Gate
|
|
168
|
+
### Gate 1: Syntax Validation (FAST FAIL)
|
|
33
169
|
|
|
34
|
-
|
|
170
|
+
> [!IMPORTANT]
|
|
171
|
+
> This gate runs in < 1 second and catches the EXACT class of errors that caused the March 2026 incident. Run it BEFORE the test suite (which takes 10-30s).
|
|
35
172
|
|
|
36
|
-
|
|
173
|
+
| Stack | Command | What it checks |
|
|
174
|
+
|-------|---------|---------------|
|
|
175
|
+
| Vanilla JS | `node -c path/to/app.js` | JavaScript parse errors |
|
|
176
|
+
| TypeScript | `npx tsc --noEmit` | Type errors + syntax |
|
|
177
|
+
| Python | `python -m py_compile app.py` | Python syntax |
|
|
178
|
+
| Go | `go vet ./...` | Go static analysis |
|
|
37
179
|
|
|
38
|
-
|
|
180
|
+
**For frontend monoliths without TypeScript:**
|
|
181
|
+
```bash
|
|
182
|
+
# Ultra-fast syntax check — fails in < 1s if broken
|
|
183
|
+
node -c public/static/app.js
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Why separate from Gate 2?**
|
|
187
|
+
- `node -c` takes < 1 second. Test suite takes 10-30 seconds.
|
|
188
|
+
- If syntax is broken, 100% of tests will fail anyway — but with confusing error messages.
|
|
189
|
+
- A fast syntax check gives you the EXACT line number of the error instantly.
|
|
39
190
|
|
|
40
|
-
|
|
41
|
-
|-------|---------|
|
|
42
|
-
| Vanilla JS | `node -c path/to/app.js` |
|
|
43
|
-
| TypeScript | `npx tsc --noEmit` |
|
|
44
|
-
| Python | `python -m py_compile app.py` |
|
|
191
|
+
**REQUIRED SUB-SKILL:** Use `cm-quality-gate` for parser-based validation inside the test suite (Layer 1).
|
|
45
192
|
|
|
46
|
-
|
|
193
|
+
---
|
|
47
194
|
|
|
48
195
|
### Gate 2: Test Suite
|
|
49
196
|
|
|
50
|
-
|
|
197
|
+
The test suite MUST include:
|
|
51
198
|
|
|
52
|
-
|
|
199
|
+
| Test Category | What it validates | Priority |
|
|
200
|
+
|--------------|-------------------|----------|
|
|
201
|
+
| **Frontend safety** | JS syntax, function integrity, corruption patterns | **CRITICAL** |
|
|
202
|
+
| **Backend API** | Routes return correct data | Required |
|
|
203
|
+
| **Business logic** | Calculations, rules, validation | Required |
|
|
204
|
+
| **i18n sync** | Translation key parity, orphaned keys | Required for multi-lang |
|
|
205
|
+
| **Integration** | End-to-end workflows | Recommended |
|
|
53
206
|
|
|
54
|
-
|
|
207
|
+
**Setup the test:gate script:**
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"scripts": {
|
|
211
|
+
"test:gate": "vitest run --reporter=verbose"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Gate decision:**
|
|
217
|
+
```
|
|
218
|
+
IF 0 failures → proceed to Gate 3
|
|
219
|
+
IF any failures → STOP. Fix before continuing.
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**REQUIRED SUB-SKILL:** Use `cm-quality-gate` for enforcement discipline.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
### Gate 3: i18n Parity Check (for multi-language projects)
|
|
227
|
+
|
|
228
|
+
> [!NOTE]
|
|
229
|
+
> Skip this gate if the project does not have i18n. For projects with i18n, this gate catches what test suites can miss: key drift between languages that causes blank strings in production.
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# All language files must have identical key counts
|
|
233
|
+
node -e "
|
|
234
|
+
const fs = require('fs');
|
|
235
|
+
const path = require('path');
|
|
236
|
+
const I18N_DIR = 'public/static/i18n';
|
|
237
|
+
const langs = ['vi','en','th','ph'];
|
|
238
|
+
const results = {};
|
|
239
|
+
let allMatch = true;
|
|
240
|
+
|
|
241
|
+
for (const lang of langs) {
|
|
242
|
+
const filePath = path.join(I18N_DIR, lang + '.json');
|
|
243
|
+
const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
244
|
+
const flatKeys = JSON.stringify(data).split('\":').length - 1;
|
|
245
|
+
results[lang] = flatKeys;
|
|
246
|
+
console.log(lang + ': ' + flatKeys + ' keys');
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const counts = Object.values(results);
|
|
250
|
+
if (new Set(counts).size !== 1) {
|
|
251
|
+
console.error('❌ KEY PARITY FAILURE! Counts differ across languages.');
|
|
252
|
+
console.error(JSON.stringify(results));
|
|
253
|
+
process.exit(1);
|
|
254
|
+
} else {
|
|
255
|
+
console.log('✅ Key parity: all languages have ' + counts[0] + ' keys');
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Check for null/empty values
|
|
259
|
+
let nullCount = 0;
|
|
260
|
+
for (const lang of langs) {
|
|
261
|
+
const data = JSON.parse(fs.readFileSync(path.join(I18N_DIR, lang + '.json'), 'utf-8'));
|
|
262
|
+
const check = (obj, prefix) => {
|
|
263
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
264
|
+
if (k === '_meta') continue;
|
|
265
|
+
if (typeof v === 'object' && v !== null) { check(v, prefix + '.' + k); continue; }
|
|
266
|
+
if (v === null || v === undefined || v === '') {
|
|
267
|
+
console.error(' ⚠ ' + lang + '.' + prefix + '.' + k + ' is null/empty');
|
|
268
|
+
nullCount++;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
check(data, lang);
|
|
273
|
+
}
|
|
274
|
+
if (nullCount > 0) {
|
|
275
|
+
console.error('❌ Found ' + nullCount + ' null/empty translation values!');
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
console.log('✅ No null/empty values');
|
|
279
|
+
"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**What this catches:**
|
|
283
|
+
- Keys added to `vi.json` but forgotten in `en.json` → blank strings for English users
|
|
284
|
+
- Null values from bad translation scripts → `t()` returns key name instead of translation
|
|
285
|
+
- Key count drift between languages → inconsistent UX
|
|
286
|
+
|
|
287
|
+
---
|
|
55
288
|
|
|
56
289
|
### Gate 4: Build Verification
|
|
57
290
|
|
|
58
|
-
|
|
291
|
+
Production build must succeed without errors.
|
|
59
292
|
|
|
60
|
-
|
|
293
|
+
```bash
|
|
294
|
+
npm run build
|
|
295
|
+
```
|
|
61
296
|
|
|
62
|
-
|
|
297
|
+
**What this catches that tests don't:**
|
|
298
|
+
- Import resolution failures
|
|
299
|
+
- Tree-shaking errors
|
|
300
|
+
- Missing environment variables
|
|
301
|
+
- Asset compilation failures
|
|
302
|
+
- Bundle size explosions
|
|
63
303
|
|
|
64
|
-
|
|
304
|
+
**Optional: Bundle size guard:**
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"scripts": {
|
|
308
|
+
"build:verify": "npm run build && node -e \"const s=require('fs').statSync('dist/_worker.js').size; if(s>2e6) {console.error('Bundle too large: '+s); process.exit(1)}\""
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
### Gate 5: Dist Asset Verification (NEW)
|
|
316
|
+
|
|
317
|
+
> [!IMPORTANT]
|
|
318
|
+
> The build can "succeed" but produce an incomplete dist/ directory. This gate catches missing critical assets.
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# Verify critical files exist in dist/
|
|
322
|
+
node -e "
|
|
323
|
+
const fs = require('fs');
|
|
324
|
+
const required = [
|
|
325
|
+
'dist/_worker.js',
|
|
326
|
+
'dist/static/app.js',
|
|
327
|
+
'dist/static/style.css',
|
|
328
|
+
'dist/static/i18n/vi.json',
|
|
329
|
+
'dist/static/i18n/en.json',
|
|
330
|
+
'dist/static/i18n/th.json',
|
|
331
|
+
'dist/static/i18n/ph.json',
|
|
332
|
+
];
|
|
333
|
+
const missing = required.filter(f => !fs.existsSync(f));
|
|
334
|
+
if (missing.length > 0) {
|
|
335
|
+
console.error('❌ Missing files in dist/:');
|
|
336
|
+
missing.forEach(f => console.error(' ' + f));
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
console.log('✅ All ' + required.length + ' critical files present in dist/');
|
|
340
|
+
"
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**Adapt `required` array to your project.** At minimum, verify:
|
|
344
|
+
- Worker/server entry point exists
|
|
345
|
+
- Frontend JS/CSS files exist
|
|
346
|
+
- Translation files are copied
|
|
347
|
+
- Critical images/assets are present
|
|
65
348
|
|
|
66
|
-
|
|
349
|
+
---
|
|
67
350
|
|
|
68
|
-
### Gate
|
|
351
|
+
### Gate 6: Deploy + Post-Deploy Smoke Test
|
|
69
352
|
|
|
70
|
-
|
|
353
|
+
Only after Gates 1-5 pass.
|
|
71
354
|
|
|
72
|
-
|
|
355
|
+
**Deploy command varies by platform:**
|
|
73
356
|
|
|
74
|
-
|
|
75
|
-
|
|
357
|
+
| Platform | Command |
|
|
358
|
+
|----------|---------|
|
|
359
|
+
| Cloudflare Pages | `npx wrangler pages deploy dist/` |
|
|
360
|
+
| Vercel | `npx vercel --prod` |
|
|
361
|
+
| Netlify | `npx netlify deploy --prod` |
|
|
362
|
+
|
|
363
|
+
**Post-deploy verification:**
|
|
364
|
+
```bash
|
|
365
|
+
# Smoke test the deployed URL — must return 200
|
|
366
|
+
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://your-app.pages.dev)
|
|
367
|
+
if [ "$STATUS" != "200" ]; then
|
|
368
|
+
echo "❌ POST-DEPLOY SMOKE TEST FAILED! Status: $STATUS"
|
|
369
|
+
echo "⚠ Consider immediate rollback."
|
|
370
|
+
exit 1
|
|
371
|
+
fi
|
|
372
|
+
echo "✅ Smoke test passed (HTTP $STATUS)"
|
|
373
|
+
```
|
|
76
374
|
|
|
77
375
|
---
|
|
78
376
|
|
|
79
377
|
## Composing the Deploy Script
|
|
80
378
|
|
|
379
|
+
### `package.json` (Recommended)
|
|
81
380
|
```json
|
|
82
381
|
{
|
|
83
382
|
"scripts": {
|
|
84
|
-
"
|
|
383
|
+
"predeploy:syntax": "node -c public/static/app.js",
|
|
384
|
+
"predeploy:i18n": "node scripts/check-i18n-parity.js",
|
|
385
|
+
"predeploy:dist": "node scripts/verify-dist.js",
|
|
386
|
+
"deploy": "npm run predeploy:syntax && npm run test:gate && npm run predeploy:i18n && npm run build && npm run predeploy:dist && YOUR_DEPLOY_COMMAND"
|
|
85
387
|
}
|
|
86
388
|
}
|
|
87
389
|
```
|
|
88
390
|
|
|
89
|
-
Chain with
|
|
391
|
+
**Key insight:** Chain gates with `&&`. If any gate fails, the chain stops immediately.
|
|
392
|
+
|
|
393
|
+
---
|
|
90
394
|
|
|
91
395
|
## Rollback Protocol
|
|
92
396
|
|
|
93
|
-
|
|
94
|
-
|----------|--------|
|
|
95
|
-
| White screen | `git revert HEAD && npm run deploy` |
|
|
96
|
-
| Broken translations | `git checkout HEAD~1 -- i18n/*.json && npm run deploy` |
|
|
97
|
-
| API error | `git revert HEAD && npm run deploy` |
|
|
98
|
-
| Cloudflare | `wrangler pages deployment rollback <id>` |
|
|
397
|
+
When a deployment causes issues:
|
|
99
398
|
|
|
100
|
-
|
|
399
|
+
| Severity | Action | Command |
|
|
400
|
+
|----------|--------|---------|
|
|
401
|
+
| **White screen** (syntax) | Revert last commit, redeploy | `git revert HEAD && npm run deploy` |
|
|
402
|
+
| **Broken translations** | Revert JSON files, redeploy | `git checkout HEAD~1 -- public/static/i18n/*.json && npm run deploy` |
|
|
403
|
+
| **API error** | Revert server code, redeploy | `git revert HEAD && npm run deploy` |
|
|
404
|
+
| **Partial breakage** | Cherry-pick fix, deploy | Fix → test → deploy |
|
|
101
405
|
|
|
102
|
-
**
|
|
103
|
-
|
|
406
|
+
**Cloudflare Pages specific:**
|
|
407
|
+
```bash
|
|
408
|
+
# Rollback to previous deployment
|
|
409
|
+
wrangler pages deployments list --project-name prms
|
|
410
|
+
wrangler pages deployment rollback <deployment-id> --project-name prms
|
|
411
|
+
```
|
|
104
412
|
|
|
105
|
-
|
|
413
|
+
---
|
|
106
414
|
|
|
107
|
-
|
|
108
|
-
|----------|----------|
|
|
109
|
-
| `templates/deploy.sh` | Setting up the full 9-gate deploy script |
|
|
415
|
+
## Setting Up for a New Project
|
|
110
416
|
|
|
111
|
-
|
|
417
|
+
### Step 1: Create test infrastructure
|
|
418
|
+
```bash
|
|
419
|
+
npm install -D vitest acorn
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Step 2: Create package.json scripts
|
|
423
|
+
```json
|
|
424
|
+
{
|
|
425
|
+
"scripts": {
|
|
426
|
+
"test:gate": "vitest run --reporter=verbose",
|
|
427
|
+
"build": "YOUR_BUILD_COMMAND",
|
|
428
|
+
"deploy": "node -c public/static/app.js && npm run test:gate && npm run build && YOUR_DEPLOY_COMMAND"
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Step 3: Add frontend safety tests
|
|
434
|
+
**REQUIRED SUB-SKILL:** Follow `cm-quality-gate` to create test file with all layers.
|
|
435
|
+
|
|
436
|
+
### Step 4: Create deploy workflow
|
|
437
|
+
Create `.agents/workflows/deploy.md`.
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Red Flags — STOP
|
|
442
|
+
|
|
443
|
+
- ❌ Deploying without running test:gate
|
|
444
|
+
- ❌ Skipping syntax check ("tests will catch it")
|
|
445
|
+
- ❌ Skipping build step ("tests passed so it'll build")
|
|
446
|
+
- ❌ Running tests and deploy in parallel
|
|
447
|
+
- ❌ "Tests passed last time" (run them NOW)
|
|
448
|
+
- ❌ "Only changed one file" (test everything)
|
|
449
|
+
- ❌ No frontend safety tests for JS projects
|
|
450
|
+
- ❌ No dist/ verification after build
|
|
451
|
+
- ❌ No post-deploy smoke test
|
|
452
|
+
- ❌ No i18n parity check for multi-language apps
|
|
453
|
+
|
|
454
|
+
## Rationalization Table
|
|
455
|
+
|
|
456
|
+
| Excuse | Reality |
|
|
457
|
+
|--------|---------|
|
|
458
|
+
| "Tests passed earlier" | Code changed since then. Run fresh. |
|
|
459
|
+
| "Build always works" | Until it doesn't. 30 seconds to verify. |
|
|
460
|
+
| "It's a one-line change" | One line broke 600 lines of app.js. Test it. |
|
|
461
|
+
| "CI will catch it" | CI runs AFTER push. Catch BEFORE push. |
|
|
462
|
+
| "Just a hotfix" | Hotfixes need MORE testing, not less. |
|
|
463
|
+
| "Syntax check is redundant" | `node -c` takes 0.5s and prevented the March 2026 disaster. |
|
|
464
|
+
| "i18n parity is overkill" | Missing keys → blank strings in production. |
|
|
465
|
+
| "dist/ is always complete" | Build tools can silently skip assets. Check. |
|
|
466
|
+
|
|
467
|
+
## Integration with Other Skills
|
|
112
468
|
|
|
113
469
|
| Skill | When |
|
|
114
470
|
|-------|------|
|
|
115
|
-
| `cm-quality-gate` | Gate 2 frontend tests |
|
|
116
|
-
| `cm-secret-shield` | Gate 0 deep scanning |
|
|
117
|
-
| `cm-safe-i18n` | i18n-specific gates |
|
|
471
|
+
| `cm-quality-gate` | Setting up Gate 2 frontend tests and Test Gate |
|
|
472
|
+
| `cm-secret-shield` | Gate 0 calls Secret Shield Layer 4 for deep scanning |
|
|
473
|
+
| `cm-safe-i18n` | Adding i18n-specific gates |
|
|
474
|
+
| `cm-terminal` | Monitoring gate commands |
|
|
118
475
|
| `cm-identity-guard` | Gate 0 verifies deploy identity |
|
|
119
|
-
|
|
120
|
-
|
|
476
|
+
|
|
477
|
+
## The Bottom Line
|
|
478
|
+
|
|
479
|
+
**6 gates. Sequential. Each must pass. No exceptions.**
|
|
480
|
+
|
|
481
|
+
Syntax → Tests → i18n → Build → Dist Verify → Deploy + Smoke.
|
|
482
|
+
|
|
483
|
+
This is non-negotiable.
|
|
@@ -21,7 +21,6 @@ NO LANGUAGE FILE WITHOUT KEY PARITY.
|
|
|
21
21
|
NO DEPLOY WITHOUT FULL SYNTAX VALIDATION.
|
|
22
22
|
NO HTML TAG MODIFICATION — TEXT CONTENT ONLY.
|
|
23
23
|
NO REGEX TO FIX REGEX ERRORS — USE LEXICAL SCANNER.
|
|
24
|
-
NO HTML MARKUP IN TRANSLATION JSON VALUES — ICONS AND STRUCTURAL HTML BELONG IN HTML TEMPLATES.
|
|
25
24
|
```
|
|
26
25
|
|
|
27
26
|
## When to Use
|
|
@@ -75,16 +74,6 @@ digraph i18n_flow {
|
|
|
75
74
|
|
|
76
75
|
### Phase 0: Pre-Flight Checks (NEW)
|
|
77
76
|
|
|
78
|
-
#### 0a. Load i18n Learnings (cm-continuity)
|
|
79
|
-
|
|
80
|
-
Before ANY i18n work, read `.cm/memory/learnings.json` filtered by `scope: "module:i18n"`.
|
|
81
|
-
Apply all active prevention patterns. Known high-value learnings:
|
|
82
|
-
- **L001**: Always run i18n-sync test after each batch extraction
|
|
83
|
-
- **L004**: Use namespace-split architecture (not monolithic JSON)
|
|
84
|
-
- **L005**: Add exclusion list to extraction scripts to prevent junk keys
|
|
85
|
-
|
|
86
|
-
> If learnings.json has relevant entries, reference them before starting. If no `.cm/` directory exists, proceed but create learnings after this workflow.
|
|
87
|
-
|
|
88
77
|
Before ANY i18n work:
|
|
89
78
|
|
|
90
79
|
```bash
|
|
@@ -401,13 +390,6 @@ git checkout main
|
|
|
401
390
|
git merge i18n/...
|
|
402
391
|
```
|
|
403
392
|
|
|
404
|
-
#### Post-completion: Update Memory (cm-continuity)
|
|
405
|
-
|
|
406
|
-
After final validation passes:
|
|
407
|
-
1. Update `.cm/CONTINUITY.md` → Just Completed: "i18n: [N] strings across [M] languages"
|
|
408
|
-
2. Record any NEW bug patterns to `.cm/memory/learnings.json` with `scope: "module:i18n"`
|
|
409
|
-
3. **Anti-duplicate**: If same pattern as existing learning → reinforce (count++), don't create new entry
|
|
410
|
-
|
|
411
393
|
---
|
|
412
394
|
|
|
413
395
|
## Quick Reference: Key Naming Convention
|
|
@@ -421,7 +403,7 @@ After final validation passes:
|
|
|
421
403
|
|
|
422
404
|
---
|
|
423
405
|
|
|
424
|
-
## The
|
|
406
|
+
## The 13 Bug Categories — Quick Reference
|
|
425
407
|
|
|
426
408
|
| # | Bug | Pattern | Detection Gate |
|
|
427
409
|
|---|-----|---------|---------------|
|
|
@@ -438,7 +420,6 @@ After final validation passes:
|
|
|
438
420
|
| 11 | Missed files | Only scanned app.js | Phase 1 scan ALL |
|
|
439
421
|
| 12 | Line number drift | Stale line refs across batches | Target by function name |
|
|
440
422
|
| 13 | **Flat vs nested key count mismatch** | Test vs Gate metrics | i18n-sync test design |
|
|
441
|
-
| 14 | **HTML markup in translation values** | `<i data-lucide>`, `<a href>` in JSON | `grep '<[a-z]' *.json` |
|
|
442
423
|
|
|
443
424
|
---
|
|
444
425
|
|
|
@@ -449,7 +430,6 @@ After final validation passes:
|
|
|
449
430
|
- ❌ Committing all translations in a single commit
|
|
450
431
|
- ❌ Skipping key parity check across language files
|
|
451
432
|
- ❌ "It's just a string replacement, it'll be fine"
|
|
452
|
-
- ❌ Putting HTML tags (`<i>`, `<a>`, `<svg>`) inside translation JSON values — icons and structural markup belong in HTML/JSX templates, not in i18n strings. Only `<strong>`, `<em>`, `<br>` are acceptable.
|
|
453
433
|
|
|
454
434
|
## Rationalization Table
|
|
455
435
|
|
|
@@ -467,7 +447,6 @@ After final validation passes:
|
|
|
467
447
|
| `cm-quality-gate` | Final test gate before deploy |
|
|
468
448
|
| `cm-execution` | Phase 4: Parallel language translation |
|
|
469
449
|
| `cm-terminal` | While running audit commands |
|
|
470
|
-
| `cm-continuity` | Phase 0: load i18n learnings; Post-completion: record new patterns |
|
|
471
450
|
|
|
472
451
|
## The Bottom Line
|
|
473
452
|
|
|
@@ -113,14 +113,14 @@ gitleaks version
|
|
|
113
113
|
#### Step 2: Create `.gitleaks.toml` (Project Root)
|
|
114
114
|
|
|
115
115
|
```toml
|
|
116
|
-
# .gitleaks.toml —
|
|
116
|
+
# .gitleaks.toml — Cody Master Secret Shield Configuration
|
|
117
117
|
title = "CM Secret Shield — Gitleaks Config"
|
|
118
118
|
|
|
119
119
|
# Extend default rules (catches 100+ known patterns)
|
|
120
120
|
[extend]
|
|
121
121
|
useDefault = true
|
|
122
122
|
|
|
123
|
-
# Custom rules for
|
|
123
|
+
# Custom rules for Cody Master projects
|
|
124
124
|
[[rules]]
|
|
125
125
|
id = "supabase-service-key"
|
|
126
126
|
description = "Supabase Service Role Key"
|