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
|
@@ -3,165 +3,1373 @@ name: cm-project-bootstrap
|
|
|
3
3
|
description: Use when starting any new project from scratch. Asks for project identity (name, GitHub org, Cloudflare account), detects project type, sets up design system, staging+production, i18n from day 1, SEO foundation, AGENTS.md manifest, test infrastructure, 8-gate deploy pipeline, and disciplined development workflows. Prevents wrong deploys, redundant repos, and technical debt from day 0.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# 🏗️ Cody Master Project Bootstrap v2.0
|
|
7
7
|
|
|
8
8
|
> **Every project starts here. No exceptions.**
|
|
9
|
+
> Inspired by best practices from Amp, Claude Code, Cursor, Lovable, and Manus agents.
|
|
9
10
|
|
|
10
11
|
## Core Principles
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
```
|
|
14
|
+
ASK FIRST. BUILD SECOND. NEVER ASSUME IDENTITY.
|
|
15
|
+
STAGING IS MANDATORY. PRODUCTION IS EARNED.
|
|
16
|
+
I18N FROM DAY 1. NOT "LATER."
|
|
17
|
+
DESIGN SYSTEM BEFORE COMPONENTS. TOKENS BEFORE PIXELS.
|
|
18
|
+
SEO IS NOT AN AFTERTHOUGHT. IT'S INFRASTRUCTURE.
|
|
19
|
+
EVERY PROJECT GETS AN AGENTS.MD. NO EXCEPTIONS.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
16
23
|
|
|
17
24
|
## 11-Phase Bootstrap Process
|
|
18
25
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
```
|
|
27
|
+
Phase 0: Identity Lock — WHO are you deploying as?
|
|
28
|
+
Phase 0.5: Security Foundation — HOW do we prevent secret leaks?
|
|
29
|
+
Phase 1: Project Type Detection — WHAT kind of project?
|
|
30
|
+
Phase 2: Repository & Environments — WHERE does code live?
|
|
31
|
+
Phase 3: Design System Foundation — HOW does it look?
|
|
32
|
+
Phase 4: i18n From Day 1 — WHICH languages?
|
|
33
|
+
Phase 5: SEO Foundation — HOW will people find it?
|
|
34
|
+
Phase 6: AGENTS.md + Git Safety — HOW do agents collaborate?
|
|
35
|
+
Phase 7: Test Infrastructure — HOW do we catch bugs?
|
|
36
|
+
Phase 8: Deploy Pipeline (8 Gates) — HOW does code ship?
|
|
37
|
+
Phase 9: Development Workflow — HOW do we work daily?
|
|
38
|
+
```
|
|
32
39
|
|
|
33
40
|
---
|
|
34
41
|
|
|
35
42
|
## Phase 0: Identity Lock 🔐
|
|
36
43
|
|
|
37
44
|
> **MANDATORY. Cannot proceed without this.**
|
|
45
|
+
> **Values are NOT hardcoded — check history, suggest, let user confirm.**
|
|
46
|
+
|
|
47
|
+
### Step 1: Check Identity History
|
|
48
|
+
|
|
49
|
+
Before asking anything, check if `~/.cm-identity-history.json` exists.
|
|
50
|
+
If it does, load previous identities and **suggest** the most recently used values.
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
// ~/.cm-identity-history.json — Auto-maintained across projects
|
|
54
|
+
{
|
|
55
|
+
"lastUsed": "2026-03-17",
|
|
56
|
+
"identities": [
|
|
57
|
+
{
|
|
58
|
+
"github": { "org": "my-work-org" },
|
|
59
|
+
"cloudflare": { "accountId": "abc123def456ghi789jkl012mno345pqr" },
|
|
60
|
+
"i18n": { "primary": "en", "targets": ["es", "fr", "de"] },
|
|
61
|
+
"usedCount": 5,
|
|
62
|
+
"lastProject": "my-awesome-project",
|
|
63
|
+
"lastUsed": "2026-03-17"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Step 2: Ask with Suggestions
|
|
70
|
+
|
|
71
|
+
Present the 6 questions, pre-filling from history where available.
|
|
72
|
+
User only needs to **confirm or change**:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
📋 NEW PROJECT — Identity Setup
|
|
76
|
+
(Values from your last project shown as suggestions)
|
|
77
|
+
|
|
78
|
+
1. Project name (kebab-case): ___________
|
|
79
|
+
2. GitHub org [my-work-org]: → Enter to keep, or type new
|
|
80
|
+
3. Cloudflare ID [abc12...5pqr]: → Enter to keep, or type new
|
|
81
|
+
4. Domain: ___________
|
|
82
|
+
5. Primary language [en]: → Enter to keep, or type new
|
|
83
|
+
6. Target languages [es, fr, de]: → Enter to keep, or type new
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> **RULE:** Never assume. Always show. Let user confirm.
|
|
87
|
+
> If no history exists, ask all 6 from scratch.
|
|
88
|
+
|
|
89
|
+
### Step 3: Verify Identity
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
⚠️ BEFORE PROCEEDING — CONFIRM:
|
|
93
|
+
🔐 GitHub Org: {org}
|
|
94
|
+
☁️ Cloudflare: {accountId}
|
|
95
|
+
🌐 Domain: {domain}
|
|
96
|
+
🗣️ Languages: {primary} (primary), {targets}
|
|
97
|
+
✅ Correct? → proceed
|
|
98
|
+
❌ Wrong? → fix before continuing
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Step 4: Create `.project-identity.json`
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"projectName": "{name}",
|
|
106
|
+
"github": {
|
|
107
|
+
"org": "{org}",
|
|
108
|
+
"repo": "{name}"
|
|
109
|
+
},
|
|
110
|
+
"cloudflare": {
|
|
111
|
+
"accountId": "{accountId}",
|
|
112
|
+
"projectName": "{name}",
|
|
113
|
+
"productionBranch": "production"
|
|
114
|
+
},
|
|
115
|
+
"domain": {
|
|
116
|
+
"production": "{domain}",
|
|
117
|
+
"staging": "staging.{domain}"
|
|
118
|
+
},
|
|
119
|
+
"i18n": {
|
|
120
|
+
"primary": "{primary}",
|
|
121
|
+
"targets": ["{targets}"]
|
|
122
|
+
},
|
|
123
|
+
"createdAt": "{date}",
|
|
124
|
+
"bootstrapVersion": "2.0"
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 5: Save to History
|
|
129
|
+
|
|
130
|
+
After creating `.project-identity.json`, update `~/.cm-identity-history.json`:
|
|
131
|
+
- Add or update the identity entry
|
|
132
|
+
- Increment `usedCount`
|
|
133
|
+
- Update `lastProject` and `lastUsed`
|
|
134
|
+
- This ensures **next project** gets pre-filled suggestions automatically
|
|
38
135
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
3. Verify identity with user confirmation
|
|
43
|
-
4. Create `.project-identity.json` with all config
|
|
44
|
-
5. Save to `~/.cm-identity-history.json` for future projects
|
|
45
|
-
6. Call `cm-identity-guard` to verify git config matches
|
|
136
|
+
> Call `cm-identity-guard` to verify git config matches the GitHub org BEFORE any git push.
|
|
137
|
+
|
|
138
|
+
---
|
|
46
139
|
|
|
47
140
|
## Phase 0.5: Security Foundation 🛡️
|
|
48
141
|
|
|
49
|
-
>
|
|
142
|
+
> **NEW — Defense-in-depth from day 0. Secrets leak at project start when security is "later."**
|
|
143
|
+
> **Calls `cm-secret-shield` for setup.**
|
|
144
|
+
|
|
145
|
+
### Step 1: Create `.gitleaks.toml`
|
|
146
|
+
|
|
147
|
+
Create project-level Gitleaks configuration:
|
|
148
|
+
|
|
149
|
+
```toml
|
|
150
|
+
# .gitleaks.toml — Secret Shield Config
|
|
151
|
+
title = "CM Secret Shield"
|
|
152
|
+
|
|
153
|
+
[extend]
|
|
154
|
+
useDefault = true
|
|
155
|
+
|
|
156
|
+
[[rules]]
|
|
157
|
+
id = "supabase-service-key"
|
|
158
|
+
description = "Supabase Service Role Key"
|
|
159
|
+
regex = '''eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+'''
|
|
160
|
+
tags = ["supabase", "jwt"]
|
|
161
|
+
|
|
162
|
+
[[rules]]
|
|
163
|
+
id = "generic-high-entropy"
|
|
164
|
+
description = "High entropy string that may be a secret"
|
|
165
|
+
regex = '''(?i)(api[_-]?key|secret[_-]?key|access[_-]?token|private[_-]?key|auth[_-]?token)\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}['"]'''
|
|
166
|
+
tags = ["generic"]
|
|
167
|
+
|
|
168
|
+
[allowlist]
|
|
169
|
+
paths = ['''\.gitleaks\.toml$''', '''\.dev\.vars\.example$''', '''node_modules/''', '''dist/''']
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Step 2: Setup Pre-Commit Hook
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Install git pre-commit hook for secret scanning
|
|
176
|
+
mkdir -p .git/hooks
|
|
177
|
+
cat > .git/hooks/pre-commit << 'EOF'
|
|
178
|
+
#!/bin/sh
|
|
179
|
+
echo "🛡️ Secret Shield: scanning staged files..."
|
|
180
|
+
if command -v gitleaks &> /dev/null; then
|
|
181
|
+
gitleaks git --pre-commit --staged --verbose
|
|
182
|
+
if [ $? -ne 0 ]; then
|
|
183
|
+
echo "❌ SECRET DETECTED! Commit blocked."
|
|
184
|
+
exit 1
|
|
185
|
+
fi
|
|
186
|
+
echo "✅ No secrets detected"
|
|
187
|
+
else
|
|
188
|
+
echo "⚠️ Gitleaks not installed. Running basic checks..."
|
|
189
|
+
STAGED=$(git diff --cached --name-only --diff-filter=ACM)
|
|
190
|
+
PATTERNS="SERVICE_KEY|ANON_KEY|PRIVATE_KEY|DB_PASSWORD|SECRET_KEY|sk-[a-zA-Z0-9]{20,}"
|
|
191
|
+
for file in $STAGED; do
|
|
192
|
+
if echo "$file" | grep -qE '\.(js|ts|json|toml|yaml|env)$'; then
|
|
193
|
+
if git diff --cached "$file" | grep -qE "$PATTERNS"; then
|
|
194
|
+
echo "❌ Potential secret in: $file"
|
|
195
|
+
exit 1
|
|
196
|
+
fi
|
|
197
|
+
fi
|
|
198
|
+
done
|
|
199
|
+
echo "✅ Basic check passed"
|
|
200
|
+
fi
|
|
201
|
+
EOF
|
|
202
|
+
chmod +x .git/hooks/pre-commit
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Step 3: Add Security Script
|
|
206
|
+
|
|
207
|
+
Add to `package.json`:
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"scripts": {
|
|
211
|
+
"security:scan": "node scripts/security-scan.js || echo 'Create scripts/security-scan.js from cm-secret-shield'"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Step 4: Create `.dev.vars.example`
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# .dev.vars.example — Template for local secrets (committed to repo)
|
|
220
|
+
# Copy to .dev.vars and fill in real values
|
|
221
|
+
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
|
|
222
|
+
SUPABASE_SERVICE_KEY=your_service_key_here
|
|
223
|
+
SUPABASE_ANON_KEY=your_anon_key_here
|
|
224
|
+
```
|
|
50
225
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
4. Create `.dev.vars.example` template (committed). `.dev.vars` = real secrets (gitignored)
|
|
55
|
-
5. **[NEW] Security Utilities (Learned: March 2026):**
|
|
56
|
-
- **Python projects:** Copy `safe_path.py` to `scripts/` — provides `safe_resolve()`, `safe_join()`, `safe_open()` for path traversal prevention
|
|
57
|
-
- **JS/TS frontend:** Add `esc()` function to sanitize HTML — prevent DOM XSS
|
|
58
|
-
- **Express apps:** Add `app.disable('x-powered-by')` + `express.json({ limit: '1mb' })`
|
|
59
|
-
- **Create `.snyk`** policy file for managing false positives
|
|
60
|
-
- **Rule:** ALL paths from CLI/config/API → `safe_resolve()`. ALL innerHTML → `esc()`. No exceptions.
|
|
226
|
+
> **RULE:** `.dev.vars` = real secrets (gitignored). `.dev.vars.example` = template (committed).
|
|
227
|
+
|
|
228
|
+
---
|
|
61
229
|
|
|
62
230
|
## Phase 1: Project Type Detection 🔍
|
|
63
231
|
|
|
64
|
-
>
|
|
232
|
+
> **Detect project type → auto-select the right stack.**
|
|
233
|
+
> **Default UI: shadcn/ui + Tailwind. Default layout: Mobile-first.**
|
|
234
|
+
> **Unless user explicitly requests otherwise.**
|
|
235
|
+
|
|
236
|
+
### Step 1: Ask Project Type
|
|
237
|
+
|
|
238
|
+
Present these options to the user:
|
|
239
|
+
|
|
240
|
+
| Type | When to use | Stack |
|
|
241
|
+
|------|------------|-------|
|
|
242
|
+
| **A. Static Website** | Docs, landing pages, portfolios | HTML + vanilla JS + CSS |
|
|
243
|
+
| **B. SPA (Vite)** | Dashboards, apps with client routing | Vite + React + TypeScript + **shadcn/ui** |
|
|
244
|
+
| **C. Cloudflare Workers** | APIs, backends, serverless functions | Hono + wrangler + TypeScript |
|
|
245
|
+
| **D. Fullstack (Workers + SPA)** | Complete apps with API + frontend | Hono + Vite + React + **shadcn/ui** |
|
|
246
|
+
| **E. Content Site (Astro)** | Blogs, docs, content-heavy sites | Astro + MDX |
|
|
247
|
+
|
|
248
|
+
### UI Library Default Rules
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
🎨 DEFAULT UI LIBRARY: shadcn/ui + Tailwind CSS
|
|
252
|
+
📱 DEFAULT LAYOUT: Mobile-first responsive
|
|
253
|
+
|
|
254
|
+
These defaults apply UNLESS user explicitly says otherwise.
|
|
255
|
+
Examples of overrides:
|
|
256
|
+
- "Use Ant Design" → switch to Ant Design
|
|
257
|
+
- "No mobile needed" → skip mobile optimization
|
|
258
|
+
- "Desktop only" → desktop-first layout
|
|
259
|
+
|
|
260
|
+
If user says nothing about UI → use shadcn/ui + mobile-first.
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Step 2: Scaffold Based on Type
|
|
264
|
+
|
|
265
|
+
#### Type A: Static Website
|
|
266
|
+
```bash
|
|
267
|
+
mkdir -p public/static/{css,js,img} src tests/unit docs
|
|
268
|
+
touch public/index.html public/static/css/design-tokens.css public/static/css/style.css public/static/js/app.js
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
#### Type B: SPA (Vite) — with shadcn/ui
|
|
272
|
+
```bash
|
|
273
|
+
# Check available options first
|
|
274
|
+
npx -y create-vite@latest --help
|
|
275
|
+
# Scaffold React + TypeScript
|
|
276
|
+
npx -y create-vite@latest ./ --template react-ts
|
|
277
|
+
# Install Tailwind CSS
|
|
278
|
+
npm install -D tailwindcss @tailwindcss/vite
|
|
279
|
+
# Install and init shadcn/ui
|
|
280
|
+
npx -y shadcn@latest init
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
#### Type C: Cloudflare Workers
|
|
284
|
+
```bash
|
|
285
|
+
npm init -y
|
|
286
|
+
npm install hono wrangler --save-dev
|
|
287
|
+
mkdir -p src tests/unit
|
|
288
|
+
touch src/index.ts wrangler.jsonc
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
#### Type D: Fullstack — with shadcn/ui
|
|
292
|
+
```bash
|
|
293
|
+
# Workers backend + Vite frontend in one repo
|
|
294
|
+
mkdir -p api/src frontend/src tests/{unit,integration}
|
|
295
|
+
npm init -y
|
|
296
|
+
npm install hono wrangler --save-dev
|
|
297
|
+
cd frontend && npx -y create-vite@latest ./ --template react-ts
|
|
298
|
+
npm install -D tailwindcss @tailwindcss/vite
|
|
299
|
+
npx -y shadcn@latest init
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### Type E: Astro
|
|
303
|
+
```bash
|
|
304
|
+
npx -y create-astro@latest --help
|
|
305
|
+
npx -y create-astro@latest ./ --template blog --typescript strict
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Step 3: Install Common Dependencies
|
|
65
309
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
| C. Cloudflare Workers | Hono + wrangler + TS |
|
|
71
|
-
| D. Fullstack | Hono + Vite + React + shadcn/ui |
|
|
72
|
-
| E. Content Site | Astro + MDX |
|
|
310
|
+
For ALL project types:
|
|
311
|
+
```bash
|
|
312
|
+
npm install --save-dev vitest
|
|
313
|
+
```
|
|
73
314
|
|
|
74
|
-
|
|
315
|
+
### Step 4: Mobile-First Setup
|
|
316
|
+
|
|
317
|
+
For ALL projects with UI, enforce mobile-first from scaffold:
|
|
318
|
+
|
|
319
|
+
```css
|
|
320
|
+
/* Mobile-first media queries — ALWAYS start from mobile */
|
|
321
|
+
/* Default styles = mobile (< 640px) */
|
|
322
|
+
|
|
323
|
+
/* sm: 640px+ */
|
|
324
|
+
@media (min-width: 640px) { }
|
|
325
|
+
/* md: 768px+ */
|
|
326
|
+
@media (min-width: 768px) { }
|
|
327
|
+
/* lg: 1024px+ */
|
|
328
|
+
@media (min-width: 1024px) { }
|
|
329
|
+
/* xl: 1280px+ */
|
|
330
|
+
@media (min-width: 1280px) { }
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
📱 MOBILE-FIRST RULES:
|
|
335
|
+
1. Default CSS = mobile layout (no media query needed)
|
|
336
|
+
2. Add complexity with min-width media queries
|
|
337
|
+
3. Touch targets minimum 44x44px
|
|
338
|
+
4. Test on 375px width (iPhone SE) as baseline
|
|
339
|
+
5. Navigation: bottom nav or hamburger on mobile
|
|
340
|
+
6. Tables: horizontal scroll or card layout on mobile
|
|
341
|
+
7. Forms: single column, full width inputs on mobile
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
75
345
|
|
|
76
346
|
## Phase 2: Repository & Environments 🏠
|
|
77
347
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
348
|
+
### Step 1: Initialize Git
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
git init
|
|
352
|
+
git checkout -b main
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Step 2: Create Staging + Production Branches
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
# main = staging (default)
|
|
359
|
+
# production = production only
|
|
360
|
+
git checkout -b production
|
|
361
|
+
git checkout main
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Step 3: Configure Cloudflare Pages
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
npx wrangler pages project create PROJECT_NAME --production-branch production
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Step 4: Add Deploy Scripts to package.json
|
|
371
|
+
|
|
372
|
+
```json
|
|
373
|
+
{
|
|
374
|
+
"scripts": {
|
|
375
|
+
"deploy:staging": "npx wrangler pages deploy ./public --project-name=PROJECT_NAME --branch=main",
|
|
376
|
+
"deploy:production": "npx wrangler pages deploy ./public --project-name=PROJECT_NAME --branch=production",
|
|
377
|
+
"test": "vitest run",
|
|
378
|
+
"test:gate": "npm run test"
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
> Adjust `./public` to match your build output directory based on project type.
|
|
384
|
+
|
|
385
|
+
### Step 5: Create `.gitignore` (Hardened)
|
|
386
|
+
|
|
387
|
+
```gitignore
|
|
388
|
+
# === Secret Shield: Mandatory Ignores ===
|
|
389
|
+
# Environment & secret files
|
|
390
|
+
.env
|
|
391
|
+
.env.*
|
|
392
|
+
!.env.example
|
|
393
|
+
!.env.test
|
|
394
|
+
.dev.vars
|
|
395
|
+
!.dev.vars.example
|
|
396
|
+
.secret-lifecycle.json
|
|
397
|
+
|
|
398
|
+
# Platform-specific secrets
|
|
399
|
+
*.pem
|
|
400
|
+
*.key
|
|
401
|
+
*.p12
|
|
402
|
+
|
|
403
|
+
# Build & dependencies
|
|
404
|
+
node_modules/
|
|
405
|
+
dist/
|
|
406
|
+
.wrangler/
|
|
407
|
+
.next/
|
|
408
|
+
|
|
409
|
+
# OS & IDE
|
|
410
|
+
.DS_Store
|
|
411
|
+
*.log
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
---
|
|
82
415
|
|
|
83
416
|
## Phase 3: Design System Foundation 🎨
|
|
84
417
|
|
|
85
|
-
> Design tokens BEFORE components.
|
|
418
|
+
> **Design tokens BEFORE components. Semantic naming ALWAYS.**
|
|
419
|
+
> **Saved per brand — consistent across ALL projects of the same user/company.**
|
|
420
|
+
> **shadcn/ui components as default. Mobile-first always.**
|
|
421
|
+
|
|
422
|
+
### Step 0: Check for Existing Brand Profile
|
|
423
|
+
|
|
424
|
+
Before creating a new design system, check if `~/.cm-design-profiles/` exists.
|
|
425
|
+
If the user has a previous design profile, **reuse it** for brand consistency.
|
|
426
|
+
|
|
427
|
+
```json
|
|
428
|
+
// ~/.cm-design-profiles/{org-name}.json
|
|
429
|
+
// Auto-saved after first project. Reused for all future projects.
|
|
430
|
+
{
|
|
431
|
+
"orgName": "my-work-org",
|
|
432
|
+
"brand": {
|
|
433
|
+
"name": "Acme Corp",
|
|
434
|
+
"industry": "technology",
|
|
435
|
+
"style": "professional-modern"
|
|
436
|
+
},
|
|
437
|
+
"colors": {
|
|
438
|
+
"primary": { "50": "#eff6ff", "500": "#3b82f6", "600": "#2563eb", "700": "#1d4ed8" },
|
|
439
|
+
"accent": { "500": "#f59e0b" },
|
|
440
|
+
"success": "#22c55e",
|
|
441
|
+
"warning": "#f59e0b",
|
|
442
|
+
"error": "#ef4444"
|
|
443
|
+
},
|
|
444
|
+
"typography": {
|
|
445
|
+
"fontFamily": "Inter",
|
|
446
|
+
"monoFamily": "JetBrains Mono"
|
|
447
|
+
},
|
|
448
|
+
"ui": {
|
|
449
|
+
"library": "shadcn/ui",
|
|
450
|
+
"borderRadius": "0.5rem",
|
|
451
|
+
"darkMode": true
|
|
452
|
+
},
|
|
453
|
+
"lastUpdated": "2026-03-17",
|
|
454
|
+
"usedInProjects": ["my-awesome-project", "my-frontend-app"]
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**Rules:**
|
|
459
|
+
- If profile exists → load and apply. Ask user: "Found design profile for {orgName}. Reuse it?"
|
|
460
|
+
- If no profile → ask user about brand/industry → create new profile
|
|
461
|
+
- After bootstrap, **always save** the design profile to `~/.cm-design-profiles/`
|
|
462
|
+
- Profile is updated with each new project that uses it
|
|
463
|
+
|
|
464
|
+
### Step 1: Ask Brand Context (if no profile exists)
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
🎨 DESIGN SYSTEM SETUP
|
|
468
|
+
|
|
469
|
+
No existing design profile found. Tell me about your brand:
|
|
470
|
+
|
|
471
|
+
1. Company/Brand name: ___________
|
|
472
|
+
2. Industry: ___________
|
|
473
|
+
3. Style preference: (professional / playful / minimal / bold)
|
|
474
|
+
4. Primary brand color (hex): ___________ (or "auto" to suggest)
|
|
475
|
+
5. Dark mode needed? (yes / no) [default: yes]
|
|
476
|
+
6. UI Library: [shadcn/ui] (Enter to keep, or type alternative)
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Step 2: Create Design Tokens
|
|
480
|
+
|
|
481
|
+
**For shadcn/ui projects (default):**
|
|
482
|
+
|
|
483
|
+
Design tokens are managed through `tailwind.config.ts` and shadcn's CSS variables.
|
|
484
|
+
Customize `app/globals.css` (or `src/index.css`) with brand colors:
|
|
485
|
+
|
|
486
|
+
```css
|
|
487
|
+
@tailwind base;
|
|
488
|
+
@tailwind components;
|
|
489
|
+
@tailwind utilities;
|
|
490
|
+
|
|
491
|
+
@layer base {
|
|
492
|
+
:root {
|
|
493
|
+
/* === Brand Colors (from profile or user input) === */
|
|
494
|
+
--background: 0 0% 100%;
|
|
495
|
+
--foreground: 222.2 84% 4.9%;
|
|
496
|
+
--card: 0 0% 100%;
|
|
497
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
498
|
+
--popover: 0 0% 100%;
|
|
499
|
+
--popover-foreground: 222.2 84% 4.9%;
|
|
500
|
+
--primary: 221.2 83.2% 53.3%; /* ← Brand primary */
|
|
501
|
+
--primary-foreground: 210 40% 98%;
|
|
502
|
+
--secondary: 210 40% 96.1%;
|
|
503
|
+
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
504
|
+
--muted: 210 40% 96.1%;
|
|
505
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
506
|
+
--accent: 210 40% 96.1%;
|
|
507
|
+
--accent-foreground: 222.2 47.4% 11.2%;
|
|
508
|
+
--destructive: 0 84.2% 60.2%;
|
|
509
|
+
--destructive-foreground: 210 40% 98%;
|
|
510
|
+
--border: 214.3 31.8% 91.4%;
|
|
511
|
+
--input: 214.3 31.8% 91.4%;
|
|
512
|
+
--ring: 221.2 83.2% 53.3%; /* ← Brand primary */
|
|
513
|
+
--radius: 0.5rem;
|
|
514
|
+
|
|
515
|
+
/* === Additional Semantic Tokens === */
|
|
516
|
+
--success: 142.1 76.2% 36.3%;
|
|
517
|
+
--warning: 37.7 92.1% 50.2%;
|
|
518
|
+
--info: 221.2 83.2% 53.3%;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
.dark {
|
|
522
|
+
--background: 222.2 84% 4.9%;
|
|
523
|
+
--foreground: 210 40% 98%;
|
|
524
|
+
--card: 222.2 84% 4.9%;
|
|
525
|
+
--card-foreground: 210 40% 98%;
|
|
526
|
+
--popover: 222.2 84% 4.9%;
|
|
527
|
+
--popover-foreground: 210 40% 98%;
|
|
528
|
+
--primary: 217.2 91.2% 59.8%;
|
|
529
|
+
--primary-foreground: 222.2 47.4% 11.2%;
|
|
530
|
+
--secondary: 217.2 32.6% 17.5%;
|
|
531
|
+
--secondary-foreground: 210 40% 98%;
|
|
532
|
+
--muted: 217.2 32.6% 17.5%;
|
|
533
|
+
--muted-foreground: 215 20.2% 65.1%;
|
|
534
|
+
--accent: 217.2 32.6% 17.5%;
|
|
535
|
+
--accent-foreground: 210 40% 98%;
|
|
536
|
+
--destructive: 0 62.8% 30.6%;
|
|
537
|
+
--destructive-foreground: 210 40% 98%;
|
|
538
|
+
--border: 217.2 32.6% 17.5%;
|
|
539
|
+
--input: 217.2 32.6% 17.5%;
|
|
540
|
+
--ring: 224.3 76.3% 48%;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**For vanilla/static projects:**
|
|
546
|
+
|
|
547
|
+
Create `design-tokens.css` with CSS custom properties (see example in project scaffold).
|
|
548
|
+
Use the same brand colors from the profile.
|
|
549
|
+
|
|
550
|
+
### Step 3: Install shadcn/ui Components (SPA/Fullstack projects)
|
|
551
|
+
|
|
552
|
+
Install essential base components:
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
# Core layout components
|
|
556
|
+
npx shadcn@latest add button
|
|
557
|
+
npx shadcn@latest add input
|
|
558
|
+
npx shadcn@latest add label
|
|
559
|
+
npx shadcn@latest add card
|
|
560
|
+
npx shadcn@latest add dialog
|
|
561
|
+
npx shadcn@latest add dropdown-menu
|
|
562
|
+
npx shadcn@latest add toast
|
|
563
|
+
npx shadcn@latest add skeleton
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
> Only install what's needed. Add more components as features require them.
|
|
567
|
+
|
|
568
|
+
### Step 4: Mobile-First Base Styles
|
|
569
|
+
|
|
570
|
+
```css
|
|
571
|
+
/* Always include these mobile-first foundations */
|
|
572
|
+
|
|
573
|
+
/* Touch-friendly interactive elements */
|
|
574
|
+
button, a, [role="button"] {
|
|
575
|
+
min-height: 44px;
|
|
576
|
+
min-width: 44px;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/* Responsive container */
|
|
580
|
+
.container {
|
|
581
|
+
width: 100%;
|
|
582
|
+
padding-inline: 1rem;
|
|
583
|
+
}
|
|
86
584
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
585
|
+
@media (min-width: 640px) { .container { padding-inline: 1.5rem; } }
|
|
586
|
+
@media (min-width: 1024px) { .container { max-width: 1024px; margin-inline: auto; } }
|
|
587
|
+
@media (min-width: 1280px) { .container { max-width: 1280px; } }
|
|
588
|
+
|
|
589
|
+
/* Safe area for mobile devices */
|
|
590
|
+
body {
|
|
591
|
+
padding: env(safe-area-inset-top) env(safe-area-inset-right)
|
|
592
|
+
env(safe-area-inset-bottom) env(safe-area-inset-left);
|
|
593
|
+
}
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
### Step 5: Save Design Profile
|
|
597
|
+
|
|
598
|
+
After setting up the design system, **auto-save** to `~/.cm-design-profiles/{org}.json`:
|
|
599
|
+
- Brand colors, fonts, border radius, UI library preference
|
|
600
|
+
- Add current project to `usedInProjects` array
|
|
601
|
+
- Next project with same org → instant design system reuse
|
|
602
|
+
|
|
603
|
+
### Design System Rules
|
|
604
|
+
|
|
605
|
+
```
|
|
606
|
+
✅ DO:
|
|
607
|
+
- Use shadcn/ui components as building blocks (SPA/Fullstack)
|
|
608
|
+
- Use semantic color tokens: bg-primary, text-muted-foreground
|
|
609
|
+
- Design mobile layout FIRST, then enhance for larger screens
|
|
610
|
+
- Reuse brand profile from ~/.cm-design-profiles/
|
|
611
|
+
- Touch targets: minimum 44x44px
|
|
612
|
+
- Test at 375px (iPhone SE) as baseline
|
|
613
|
+
|
|
614
|
+
❌ DON'T:
|
|
615
|
+
- Use raw hex colors: color: #333 → use token
|
|
616
|
+
- Design desktop-first then "fix" mobile
|
|
617
|
+
- Create new color palette when brand profile exists
|
|
618
|
+
- Skip dark mode (enabled by default)
|
|
619
|
+
- Use fixed widths on mobile: width: 500px
|
|
620
|
+
- Ignore safe-area-inset on mobile
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
---
|
|
93
624
|
|
|
94
625
|
## Phase 4: i18n From Day 1 🌍
|
|
95
626
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
627
|
+
> **Keep from v1 — enhanced to be framework-agnostic.**
|
|
628
|
+
|
|
629
|
+
### Step 1: Create i18n Engine
|
|
630
|
+
|
|
631
|
+
For **static/vanilla** projects, create `i18n.js`:
|
|
632
|
+
|
|
633
|
+
```javascript
|
|
634
|
+
const i18n = {
|
|
635
|
+
currentLang: 'vi',
|
|
636
|
+
translations: {},
|
|
637
|
+
|
|
638
|
+
async init(lang) {
|
|
639
|
+
this.currentLang = lang || localStorage.getItem('lang') || 'vi';
|
|
640
|
+
try {
|
|
641
|
+
const res = await fetch(`/static/i18n/${this.currentLang}.json`);
|
|
642
|
+
this.translations = await res.json();
|
|
643
|
+
} catch {
|
|
644
|
+
const fallback = await fetch('/static/i18n/vi.json');
|
|
645
|
+
this.translations = await fallback.json();
|
|
646
|
+
}
|
|
647
|
+
this.apply();
|
|
648
|
+
},
|
|
649
|
+
|
|
650
|
+
t(key) {
|
|
651
|
+
return key.split('.').reduce((obj, k) => obj?.[k], this.translations) || `[${key}]`;
|
|
652
|
+
},
|
|
653
|
+
|
|
654
|
+
apply() {
|
|
655
|
+
document.querySelectorAll('[data-i18n]').forEach(el => {
|
|
656
|
+
el.textContent = this.t(el.dataset.i18n);
|
|
657
|
+
});
|
|
658
|
+
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
|
659
|
+
el.placeholder = this.t(el.dataset.i18nPlaceholder);
|
|
660
|
+
});
|
|
661
|
+
document.documentElement.lang = this.currentLang;
|
|
662
|
+
},
|
|
663
|
+
|
|
664
|
+
async switchTo(lang) {
|
|
665
|
+
localStorage.setItem('lang', lang);
|
|
666
|
+
await this.init(lang);
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
For **React/Vite** projects, use `react-i18next`:
|
|
672
|
+
```bash
|
|
673
|
+
npm install i18next react-i18next i18next-browser-languagedetector
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
For **Astro** projects, use `astro-i18n` or manual routing.
|
|
677
|
+
|
|
678
|
+
### Step 2: Create Language Files
|
|
679
|
+
|
|
680
|
+
```
|
|
681
|
+
i18n/
|
|
682
|
+
├── vi.json ← Source of truth (primary language)
|
|
683
|
+
├── en.json
|
|
684
|
+
├── th.json
|
|
685
|
+
└── ph.json
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
### Step 3: i18n Rules
|
|
689
|
+
|
|
690
|
+
```
|
|
691
|
+
✅ DO:
|
|
692
|
+
- Write ALL user-facing strings with t() or data-i18n
|
|
693
|
+
- Primary language file is source of truth
|
|
694
|
+
- MAX 30 strings per batch when extracting
|
|
695
|
+
- Run i18n-sync test after every batch
|
|
696
|
+
|
|
697
|
+
❌ DON'T:
|
|
698
|
+
- Hardcode strings: "Save" → use t('common.save')
|
|
699
|
+
- Add 600 strings in one shot → app crashes
|
|
700
|
+
- Translate before primary language is complete
|
|
701
|
+
- Skip audit gates between batches
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
---
|
|
99
705
|
|
|
100
706
|
## Phase 5: SEO Foundation 🔍
|
|
101
707
|
|
|
102
|
-
|
|
708
|
+
> **NEW — Learn from Lovable & Cursor: SEO is infrastructure, not afterthought.**
|
|
709
|
+
|
|
710
|
+
### Step 1: HTML Head Template
|
|
711
|
+
|
|
712
|
+
Every page must include:
|
|
713
|
+
|
|
714
|
+
```html
|
|
715
|
+
<!DOCTYPE html>
|
|
716
|
+
<html lang="vi">
|
|
717
|
+
<head>
|
|
718
|
+
<meta charset="UTF-8">
|
|
719
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
720
|
+
|
|
721
|
+
<!-- SEO: Title and Description -->
|
|
722
|
+
<title data-i18n="meta.title">Project Name — Short description</title>
|
|
723
|
+
<meta name="description" data-i18n-content="meta.description" content="Page description 150-160 characters">
|
|
724
|
+
|
|
725
|
+
<!-- SEO: Open Graph -->
|
|
726
|
+
<meta property="og:title" content="Project Name">
|
|
727
|
+
<meta property="og:description" content="Page description">
|
|
728
|
+
<meta property="og:type" content="website">
|
|
729
|
+
<meta property="og:url" content="https://yourdomain.com">
|
|
730
|
+
<meta property="og:image" content="https://yourdomain.com/og-image.png">
|
|
731
|
+
|
|
732
|
+
<!-- SEO: Twitter Card -->
|
|
733
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
734
|
+
<meta name="twitter:title" content="Project Name">
|
|
735
|
+
<meta name="twitter:description" content="Page description">
|
|
736
|
+
|
|
737
|
+
<!-- SEO: Canonical URL -->
|
|
738
|
+
<link rel="canonical" href="https://yourdomain.com">
|
|
739
|
+
|
|
740
|
+
<!-- Performance: Preconnect to fonts -->
|
|
741
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
742
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
743
|
+
|
|
744
|
+
<!-- Favicon -->
|
|
745
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
746
|
+
|
|
747
|
+
<!-- Styles -->
|
|
748
|
+
<link rel="stylesheet" href="/static/css/design-tokens.css">
|
|
749
|
+
<link rel="stylesheet" href="/static/css/style.css">
|
|
750
|
+
</head>
|
|
751
|
+
<body>
|
|
752
|
+
<!-- Content with semantic HTML -->
|
|
753
|
+
<header role="banner">...</header>
|
|
754
|
+
<nav role="navigation" aria-label="Main">...</nav>
|
|
755
|
+
<main role="main">
|
|
756
|
+
<h1>One H1 per page</h1>
|
|
757
|
+
...
|
|
758
|
+
</main>
|
|
759
|
+
<footer role="contentinfo">...</footer>
|
|
760
|
+
|
|
761
|
+
<script src="/static/js/i18n.js"></script>
|
|
762
|
+
<script src="/static/js/app.js" defer></script>
|
|
763
|
+
</body>
|
|
764
|
+
</html>
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### Step 2: SEO Checklist
|
|
768
|
+
|
|
769
|
+
Every page must pass:
|
|
770
|
+
|
|
771
|
+
| # | Check | Rule |
|
|
772
|
+
|---|-------|------|
|
|
773
|
+
| 1 | Title tag | Descriptive, unique per page, < 60 chars |
|
|
774
|
+
| 2 | Meta description | Compelling, 150-160 chars |
|
|
775
|
+
| 3 | H1 tag | Exactly ONE per page |
|
|
776
|
+
| 4 | Heading hierarchy | h1 → h2 → h3 (no skipping) |
|
|
777
|
+
| 5 | Semantic HTML | `<header>`, `<nav>`, `<main>`, `<footer>`, `<article>`, `<section>` |
|
|
778
|
+
| 6 | Alt attributes | Every `<img>` has descriptive alt text |
|
|
779
|
+
| 7 | Canonical URL | Prevents duplicate content |
|
|
780
|
+
| 8 | Open Graph | Social sharing preview |
|
|
781
|
+
| 9 | Lang attribute | `<html lang="vi">` matches current language |
|
|
782
|
+
| 10 | Unique IDs | All interactive elements have unique, descriptive IDs |
|
|
783
|
+
|
|
784
|
+
---
|
|
103
785
|
|
|
104
786
|
## Phase 6: AGENTS.md + Git Safety 🤖
|
|
105
787
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
788
|
+
> **NEW — Learn from Amp & Claude Code: Project manifest for AI collaboration.**
|
|
789
|
+
|
|
790
|
+
### Step 1: Create AGENTS.md
|
|
791
|
+
|
|
792
|
+
Every project MUST have this file at root:
|
|
793
|
+
|
|
794
|
+
```markdown
|
|
795
|
+
# AGENTS.md — Project Manifest
|
|
796
|
+
|
|
797
|
+
> This file helps AI agents understand and work with this project effectively.
|
|
798
|
+
|
|
799
|
+
## Project Overview
|
|
800
|
+
- **Name**: my-awesome-docs
|
|
801
|
+
- **Type**: Static Website (Cloudflare Pages)
|
|
802
|
+
- **Primary Language**: English (en)
|
|
803
|
+
- **Tech Stack**: HTML, vanilla JS, CSS, Cloudflare Pages
|
|
804
|
+
|
|
805
|
+
## Commands
|
|
806
|
+
- `npm run dev` — Start local dev server
|
|
807
|
+
- `npm run test` — Run all tests
|
|
808
|
+
- `npm run test:gate` — Run pre-deploy test gate
|
|
809
|
+
- `npm run deploy:staging` — Deploy to staging
|
|
810
|
+
- `npm run deploy:production` — Deploy to production
|
|
811
|
+
|
|
812
|
+
## Project Structure
|
|
813
|
+
```
|
|
814
|
+
public/ — Static files served directly
|
|
815
|
+
static/css/ — Stylesheets (design-tokens.css, style.css)
|
|
816
|
+
static/js/ — JavaScript (app.js, i18n.js)
|
|
817
|
+
static/i18n/ — Language files (vi.json, en.json, ...)
|
|
818
|
+
src/ — Backend source (if applicable)
|
|
819
|
+
tests/ — Test files
|
|
820
|
+
docs/plans/ — Implementation plans
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
## Code Conventions
|
|
824
|
+
- **i18n**: ALL user-facing strings must use t() or data-i18n. vi.json is source of truth.
|
|
825
|
+
- **CSS**: Use design tokens only. Never raw hex colors or arbitrary spacing.
|
|
826
|
+
- **Commits**: Conventional format — `feat:`, `fix:`, `docs:`, `test:`, `chore:`
|
|
827
|
+
- **Branches**: `main` = staging, `production` = production only
|
|
828
|
+
- **Deploy**: Always staging first. Production requires explicit request.
|
|
829
|
+
|
|
830
|
+
## Important Rules
|
|
831
|
+
1. Run `cm-identity-guard` before any git push
|
|
832
|
+
2. Never force push to main or production
|
|
833
|
+
3. i18n extraction: MAX 30 strings per batch
|
|
834
|
+
4. Run test:gate before every deploy
|
|
835
|
+
5. Check `.project-identity.json` for deploy targets
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
### Step 2: Git Safety Protocol
|
|
839
|
+
|
|
840
|
+
#### Conventional Commits
|
|
841
|
+
From the very first commit, enforce:
|
|
842
|
+
|
|
843
|
+
```
|
|
844
|
+
feat: add user login page
|
|
845
|
+
fix: correct i18n key for save button
|
|
846
|
+
docs: update README with deploy instructions
|
|
847
|
+
test: add frontend safety tests
|
|
848
|
+
chore: update dependencies
|
|
849
|
+
i18n: extract settings page strings (batch 3/5)
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
#### Branch Protection Rules
|
|
853
|
+
```
|
|
854
|
+
main branch:
|
|
855
|
+
✅ Direct push allowed (staging)
|
|
856
|
+
❌ Never force push
|
|
857
|
+
✅ Run test:gate before deploy
|
|
858
|
+
|
|
859
|
+
production branch:
|
|
860
|
+
❌ Never direct push
|
|
861
|
+
✅ Only via: git checkout production && git merge main && git push
|
|
862
|
+
✅ Requires staging verification first
|
|
863
|
+
❌ Never force push
|
|
864
|
+
```
|
|
865
|
+
|
|
866
|
+
#### First Commit
|
|
867
|
+
```bash
|
|
868
|
+
git add .
|
|
869
|
+
git commit -m "chore: bootstrap project with cm-project-bootstrap v2.0"
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
#### PR Template (`.github/pull_request_template.md`)
|
|
873
|
+
```markdown
|
|
874
|
+
## What Changed
|
|
875
|
+
<!-- Brief description -->
|
|
876
|
+
|
|
877
|
+
## Test Plan
|
|
878
|
+
- [ ] Tests pass (`npm run test:gate`)
|
|
879
|
+
- [ ] Staging verified
|
|
880
|
+
- [ ] i18n keys present in all languages
|
|
881
|
+
- [ ] No raw strings in UI
|
|
882
|
+
|
|
883
|
+
## Deploy
|
|
884
|
+
- [ ] Ready for staging
|
|
885
|
+
- [ ] Ready for production (requires staging verification)
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
---
|
|
110
889
|
|
|
111
890
|
## Phase 7: Test Infrastructure 🧪
|
|
112
891
|
|
|
113
|
-
1
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
892
|
+
### Step 1: Create Test Config
|
|
893
|
+
|
|
894
|
+
```javascript
|
|
895
|
+
// vitest.config.js (or vitest.config.ts)
|
|
896
|
+
import { defineConfig } from 'vitest/config';
|
|
897
|
+
|
|
898
|
+
export default defineConfig({
|
|
899
|
+
test: {
|
|
900
|
+
globals: true,
|
|
901
|
+
environment: 'node',
|
|
902
|
+
include: ['tests/**/*.test.{js,ts}'],
|
|
903
|
+
},
|
|
904
|
+
});
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
### Step 2: Frontend Safety Tests
|
|
908
|
+
|
|
909
|
+
Create `tests/unit/frontend-safety.test.js`:
|
|
910
|
+
|
|
911
|
+
```javascript
|
|
912
|
+
import { describe, it, expect } from 'vitest';
|
|
913
|
+
import { readFileSync, readdirSync, existsSync } from 'fs';
|
|
914
|
+
import { join } from 'path';
|
|
915
|
+
|
|
916
|
+
describe('Frontend Safety', () => {
|
|
917
|
+
// Test 1: HTML files have proper structure
|
|
918
|
+
it('index.html has required meta tags', () => {
|
|
919
|
+
const html = readFileSync('public/index.html', 'utf-8');
|
|
920
|
+
expect(html).toContain('<meta charset=');
|
|
921
|
+
expect(html).toContain('<meta name="viewport"');
|
|
922
|
+
expect(html).toContain('<title');
|
|
923
|
+
expect(html).toContain('lang=');
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
// Test 2: No syntax errors in JS files
|
|
927
|
+
it('JavaScript files parse without errors', () => {
|
|
928
|
+
const jsDir = 'public/static/js';
|
|
929
|
+
if (!existsSync(jsDir)) return;
|
|
930
|
+
const files = readdirSync(jsDir).filter(f => f.endsWith('.js'));
|
|
931
|
+
files.forEach(file => {
|
|
932
|
+
const content = readFileSync(join(jsDir, file), 'utf-8');
|
|
933
|
+
expect(() => new Function(content)).not.toThrow();
|
|
934
|
+
});
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
// Test 3: CSS files reference design tokens (not raw values)
|
|
938
|
+
it('stylesheets use design tokens', () => {
|
|
939
|
+
const cssFile = 'public/static/css/style.css';
|
|
940
|
+
if (!existsSync(cssFile)) return;
|
|
941
|
+
const css = readFileSync(cssFile, 'utf-8');
|
|
942
|
+
// Warn if raw hex colors found outside of design-tokens.css
|
|
943
|
+
const rawColors = css.match(/#[0-9a-fA-F]{3,8}(?!.*design-tokens)/g);
|
|
944
|
+
if (rawColors && rawColors.length > 0) {
|
|
945
|
+
console.warn(`⚠️ Found ${rawColors.length} raw color values. Use design tokens instead.`);
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
|
|
949
|
+
// Test 4: Design tokens file exists
|
|
950
|
+
it('design-tokens.css exists', () => {
|
|
951
|
+
expect(existsSync('public/static/css/design-tokens.css')).toBe(true);
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
// Test 5: AGENTS.md exists
|
|
955
|
+
it('AGENTS.md exists at project root', () => {
|
|
956
|
+
expect(existsSync('AGENTS.md')).toBe(true);
|
|
957
|
+
});
|
|
958
|
+
|
|
959
|
+
// Test 6: .project-identity.json exists
|
|
960
|
+
it('.project-identity.json exists', () => {
|
|
961
|
+
expect(existsSync('.project-identity.json')).toBe(true);
|
|
962
|
+
});
|
|
963
|
+
});
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
### Step 3: i18n Sync Tests
|
|
967
|
+
|
|
968
|
+
Create `tests/unit/i18n-sync.test.js`:
|
|
969
|
+
|
|
970
|
+
```javascript
|
|
971
|
+
import { describe, it, expect } from 'vitest';
|
|
972
|
+
import { readFileSync, readdirSync, existsSync } from 'fs';
|
|
973
|
+
import { join } from 'path';
|
|
974
|
+
|
|
975
|
+
describe('i18n Sync', () => {
|
|
976
|
+
const i18nDir = 'public/static/i18n';
|
|
977
|
+
|
|
978
|
+
it('primary language file exists', () => {
|
|
979
|
+
expect(existsSync(join(i18nDir, 'vi.json'))).toBe(true);
|
|
980
|
+
});
|
|
981
|
+
|
|
982
|
+
it('all language files have same keys as primary', () => {
|
|
983
|
+
if (!existsSync(i18nDir)) return;
|
|
984
|
+
const primaryKeys = getAllKeys(
|
|
985
|
+
JSON.parse(readFileSync(join(i18nDir, 'vi.json'), 'utf-8'))
|
|
986
|
+
);
|
|
987
|
+
|
|
988
|
+
const langFiles = readdirSync(i18nDir)
|
|
989
|
+
.filter(f => f.endsWith('.json') && f !== 'vi.json');
|
|
990
|
+
|
|
991
|
+
langFiles.forEach(file => {
|
|
992
|
+
const langKeys = getAllKeys(
|
|
993
|
+
JSON.parse(readFileSync(join(i18nDir, file), 'utf-8'))
|
|
994
|
+
);
|
|
995
|
+
const missing = primaryKeys.filter(k => !langKeys.includes(k));
|
|
996
|
+
expect(missing, `${file} missing keys: ${missing.join(', ')}`).toEqual([]);
|
|
997
|
+
});
|
|
998
|
+
});
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
function getAllKeys(obj, prefix = '') {
|
|
1002
|
+
return Object.entries(obj).flatMap(([key, val]) => {
|
|
1003
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
1004
|
+
return typeof val === 'object' && val !== null
|
|
1005
|
+
? getAllKeys(val, fullKey)
|
|
1006
|
+
: [fullKey];
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
```
|
|
1010
|
+
|
|
1011
|
+
### Step 4: Package Scripts
|
|
1012
|
+
|
|
1013
|
+
Ensure `package.json` has:
|
|
1014
|
+
|
|
1015
|
+
```json
|
|
1016
|
+
{
|
|
1017
|
+
"scripts": {
|
|
1018
|
+
"test": "vitest run",
|
|
1019
|
+
"test:watch": "vitest",
|
|
1020
|
+
"test:gate": "vitest run"
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
```
|
|
1024
|
+
|
|
1025
|
+
---
|
|
117
1026
|
|
|
118
1027
|
## Phase 8: Deploy Pipeline (8 Gates) 🚀
|
|
119
1028
|
|
|
120
|
-
|
|
121
|
-
|
|
1029
|
+
> **Enhanced from 6 to 8 gates — adding accessibility + performance.**
|
|
1030
|
+
|
|
1031
|
+
### The 8 Gates
|
|
1032
|
+
|
|
1033
|
+
```
|
|
1034
|
+
Gate 1: Identity Check — .project-identity.json matches deploy target
|
|
1035
|
+
Gate 2: Branch Check — On correct branch (main=staging, production=prod)
|
|
1036
|
+
Gate 3: Test Gate — npm run test:gate passes
|
|
1037
|
+
Gate 4: Build Gate — npm run build succeeds (if applicable)
|
|
1038
|
+
Gate 5: i18n Gate — All language files in sync
|
|
1039
|
+
Gate 6: Lint Gate — No lint errors (if linter configured)
|
|
1040
|
+
Gate 7: Accessibility Gate — Semantic HTML, alt tags, ARIA labels present
|
|
1041
|
+
Gate 8: Performance Gate — No obviously large bundles or unoptimized assets
|
|
1042
|
+
```
|
|
1043
|
+
|
|
1044
|
+
### Gate Implementation
|
|
1045
|
+
|
|
1046
|
+
#### Gate 1: Identity Check
|
|
1047
|
+
```bash
|
|
1048
|
+
# Read .project-identity.json → confirm Cloudflare account + project name
|
|
1049
|
+
cat .project-identity.json | jq '.cloudflare'
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
#### Gate 2: Branch Check
|
|
1053
|
+
```bash
|
|
1054
|
+
# Verify current branch
|
|
1055
|
+
BRANCH=$(git branch --show-current)
|
|
1056
|
+
if [ "$1" = "production" ] && [ "$BRANCH" != "production" ]; then
|
|
1057
|
+
echo "❌ Must be on production branch for production deploy"
|
|
1058
|
+
exit 1
|
|
1059
|
+
fi
|
|
1060
|
+
```
|
|
1061
|
+
|
|
1062
|
+
#### Gate 3: Test Gate
|
|
1063
|
+
```bash
|
|
1064
|
+
npm run test:gate
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
#### Gate 4: Build Gate
|
|
1068
|
+
```bash
|
|
1069
|
+
npm run build 2>&1 || { echo "❌ Build failed"; exit 1; }
|
|
1070
|
+
```
|
|
1071
|
+
|
|
1072
|
+
#### Gate 5: i18n Gate
|
|
1073
|
+
```bash
|
|
1074
|
+
# Verified by i18n-sync test in Gate 3
|
|
1075
|
+
echo "✅ i18n sync verified by test suite"
|
|
1076
|
+
```
|
|
1077
|
+
|
|
1078
|
+
#### Gate 6: Lint Gate
|
|
1079
|
+
```bash
|
|
1080
|
+
npm run lint 2>&1 || echo "⚠️ Lint warnings (non-blocking)"
|
|
1081
|
+
```
|
|
1082
|
+
|
|
1083
|
+
#### Gate 7: Accessibility Gate
|
|
1084
|
+
```bash
|
|
1085
|
+
# Check HTML for basic accessibility
|
|
1086
|
+
echo "Checking semantic HTML..."
|
|
1087
|
+
grep -r '<img' public/ | grep -v 'alt=' && echo "❌ Images missing alt attributes" || echo "✅ All images have alt"
|
|
1088
|
+
grep -r 'role=' public/index.html > /dev/null && echo "✅ ARIA roles present" || echo "⚠️ Consider adding ARIA roles"
|
|
1089
|
+
```
|
|
1090
|
+
|
|
1091
|
+
#### Gate 8: Performance Gate
|
|
1092
|
+
```bash
|
|
1093
|
+
# Check for obviously large files
|
|
1094
|
+
find public/ -type f -size +500k | head -5
|
|
1095
|
+
if [ $? -eq 0 ]; then
|
|
1096
|
+
echo "⚠️ Large files detected. Consider optimizing."
|
|
1097
|
+
fi
|
|
1098
|
+
echo "✅ Performance gate passed"
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
### Deploy Commands
|
|
1102
|
+
|
|
1103
|
+
```bash
|
|
1104
|
+
# Staging (default)
|
|
1105
|
+
npm run deploy:staging
|
|
1106
|
+
|
|
1107
|
+
# Production (explicit only)
|
|
1108
|
+
npm run deploy:production
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
---
|
|
122
1112
|
|
|
123
1113
|
## Phase 9: Development Workflow 🔄
|
|
124
1114
|
|
|
125
|
-
Daily
|
|
1115
|
+
### Daily Development Loop
|
|
126
1116
|
|
|
127
|
-
|
|
1117
|
+
```
|
|
1118
|
+
1. Plan → cm-brainstorm / cm-writing-plans
|
|
1119
|
+
2. Branch → cm-using-git-worktrees (optional for complex features)
|
|
1120
|
+
3. TDD → cm-test-driven-development
|
|
1121
|
+
4. Build → Implement the feature
|
|
1122
|
+
5. Test → npm run test:gate
|
|
1123
|
+
6. Review → cm-requesting-code-review
|
|
1124
|
+
7. Commit → Conventional commit format
|
|
1125
|
+
8. Deploy → deploy:staging (8-gate pipeline)
|
|
1126
|
+
9. Verify → Check staging URL
|
|
1127
|
+
10. Merge → production branch (when ready)
|
|
1128
|
+
```
|
|
128
1129
|
|
|
129
|
-
|
|
1130
|
+
### When to Call Which Skill
|
|
1131
|
+
|
|
1132
|
+
| Situation | Skill |
|
|
1133
|
+
|-----------|-------|
|
|
1134
|
+
| Starting a feature | `cm-brainstorm` |
|
|
1135
|
+
| Writing implementation plan | `cm-writing-plans` |
|
|
1136
|
+
| Need isolated workspace | `cm-using-git-worktrees` |
|
|
1137
|
+
| Writing tests first | `cm-test-driven-development` |
|
|
1138
|
+
| Running independent tasks | `cm-subagent-driven-development` |
|
|
1139
|
+
| Executing a plan | `cm-executing-plans` |
|
|
1140
|
+
| Before deploying | `cm-pre-deploy-testing` → `cm-identity-guard` |
|
|
1141
|
+
| After implementing | `cm-requesting-code-review` |
|
|
1142
|
+
| Receiving review | `cm-receiving-code-review` |
|
|
1143
|
+
| Bug found | `cm-systematic-debugging` |
|
|
1144
|
+
| Extracting i18n | `cm-safe-i18n-translation` |
|
|
1145
|
+
| Before git push | `cm-identity-guard` |
|
|
1146
|
+
| Finishing feature branch | `cm-finishing-a-development-branch` |
|
|
1147
|
+
| Before claiming done | `cm-verification-before-completion` |
|
|
1148
|
+
| **Need a skill you don't have** | **→ Adaptive Skills Discovery (below)** |
|
|
1149
|
+
|
|
1150
|
+
### Deploy Behavior Rules
|
|
130
1151
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
1152
|
+
```
|
|
1153
|
+
User says "deploy" → Deploy to STAGING
|
|
1154
|
+
User says "deploy staging" → Deploy to STAGING
|
|
1155
|
+
User says "deploy production"→ Deploy to PRODUCTION (requires staging verified)
|
|
1156
|
+
User says "deploy prod" → Deploy to PRODUCTION (requires staging verified)
|
|
1157
|
+
|
|
1158
|
+
After successful production deploy:
|
|
1159
|
+
→ Suggest updating CHANGELOG.md
|
|
1160
|
+
→ Suggest updating docs/ if applicable
|
|
1161
|
+
→ Suggest creating git tag: git tag v1.x.x
|
|
1162
|
+
```
|
|
1163
|
+
|
|
1164
|
+
---
|
|
134
1165
|
|
|
135
1166
|
## Adaptive Skills Discovery 🧠
|
|
136
1167
|
|
|
137
|
-
|
|
138
|
-
|
|
1168
|
+
> **The bootstrap doesn't just set up a project — it LEARNS what the project needs.**
|
|
1169
|
+
> **Like a framework that finds its own missing pieces.**
|
|
139
1170
|
|
|
140
|
-
|
|
1171
|
+
### Philosophy
|
|
141
1172
|
|
|
142
|
-
|
|
1173
|
+
```
|
|
1174
|
+
DON'T just fail when you hit something you've never done.
|
|
1175
|
+
DO search for a skill that can help.
|
|
1176
|
+
DON'T install blindly — review what the skill does first.
|
|
1177
|
+
DO remember what was useful for next time.
|
|
1178
|
+
```
|
|
1179
|
+
|
|
1180
|
+
### How It Works: The Discovery Loop
|
|
1181
|
+
|
|
1182
|
+
When the agent encounters a task it doesn't have a skill for:
|
|
1183
|
+
|
|
1184
|
+
```
|
|
1185
|
+
1. DETECT → "I need to do X but don't have a matching skill"
|
|
1186
|
+
2. SEARCH → npx skills find {keyword} — search skills.sh registry
|
|
1187
|
+
3. REVIEW → Read the SKILL.md of the found skill — is it safe & relevant?
|
|
1188
|
+
4. ASK → "Found skill '{name}': {description}. Install it?"
|
|
1189
|
+
5. INSTALL → npx skills add {source} --skill {name} -a antigravity -y
|
|
1190
|
+
6. USE → Apply the newly installed skill to the current task
|
|
1191
|
+
7. LOG → Record what was installed + why in .cm-skills-log.json
|
|
1192
|
+
```
|
|
1193
|
+
|
|
1194
|
+
### Step 1: Search for Skills
|
|
1195
|
+
|
|
1196
|
+
Use `npx skills find` to search the community registry at [skills.sh](https://skills.sh):
|
|
1197
|
+
|
|
1198
|
+
```bash
|
|
1199
|
+
# Interactive search (fuzzy finder)
|
|
1200
|
+
npx skills find
|
|
1201
|
+
|
|
1202
|
+
# Search by keyword
|
|
1203
|
+
npx skills find "nextjs"
|
|
1204
|
+
npx skills find "supabase"
|
|
1205
|
+
npx skills find "testing"
|
|
1206
|
+
npx skills find "deployment"
|
|
1207
|
+
|
|
1208
|
+
# Browse a known skills repository
|
|
1209
|
+
npx skills add vercel-labs/agent-skills --list
|
|
1210
|
+
```
|
|
1211
|
+
|
|
1212
|
+
### Step 2: Install Safely
|
|
1213
|
+
|
|
1214
|
+
```bash
|
|
1215
|
+
# Install to Antigravity agent (project-level)
|
|
1216
|
+
npx skills add vercel-labs/agent-skills --skill {skill-name} -a antigravity
|
|
1217
|
+
|
|
1218
|
+
# Install globally (available to all projects)
|
|
1219
|
+
npx skills add vercel-labs/agent-skills --skill {skill-name} -a antigravity -g
|
|
1220
|
+
|
|
1221
|
+
# From any GitHub repo
|
|
1222
|
+
npx skills add https://github.com/{owner}/{repo} --skill {skill-name} -a antigravity
|
|
1223
|
+
```
|
|
1224
|
+
|
|
1225
|
+
### Step 3: Log What Was Installed
|
|
1226
|
+
|
|
1227
|
+
Maintain `.cm-skills-log.json` at project root to track what was discovered:
|
|
1228
|
+
|
|
1229
|
+
```json
|
|
1230
|
+
{
|
|
1231
|
+
"discoveredSkills": [
|
|
1232
|
+
{
|
|
1233
|
+
"name": "supabase-rls",
|
|
1234
|
+
"source": "vercel-labs/agent-skills",
|
|
1235
|
+
"installedAt": "2026-03-17",
|
|
1236
|
+
"reason": "User needed Row Level Security setup",
|
|
1237
|
+
"scope": "project"
|
|
1238
|
+
}
|
|
1239
|
+
]
|
|
1240
|
+
}
|
|
1241
|
+
```
|
|
143
1242
|
|
|
144
|
-
|
|
1243
|
+
### When to Trigger Discovery
|
|
145
1244
|
|
|
146
|
-
|
|
1245
|
+
| Situation | Search Keywords |
|
|
1246
|
+
|-----------|----------------|
|
|
1247
|
+
| User asks for something you've never done | Search by the technology/concept name |
|
|
1248
|
+
| A framework you're unfamiliar with | `npx skills find "{framework}"` |
|
|
1249
|
+
| Complex DevOps / CI/CD setup | `npx skills find "deployment"`, `"ci"`, `"docker"` |
|
|
1250
|
+
| Database patterns | `npx skills find "prisma"`, `"supabase"`, `"drizzle"` |
|
|
1251
|
+
| Testing frameworks | `npx skills find "playwright"`, `"cypress"`, `"vitest"` |
|
|
1252
|
+
| UI component libraries | `npx skills find "shadcn"`, `"radix"`, `"design-system"` |
|
|
1253
|
+
| Auth / payment / external | `npx skills find "auth"`, `"stripe"`, `"clerk"` |
|
|
147
1254
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
1255
|
+
### Safety Rules
|
|
1256
|
+
|
|
1257
|
+
```
|
|
1258
|
+
✅ DO:
|
|
1259
|
+
- Always show the user what skill you found before installing
|
|
1260
|
+
- Prefer skills from known repos (vercel-labs/agent-skills, etc.)
|
|
1261
|
+
- Install project-level by default, global only if user agrees
|
|
1262
|
+
- Log every installed skill with reason
|
|
1263
|
+
- Check `npx skills list` to avoid duplicates
|
|
1264
|
+
|
|
1265
|
+
❌ DON'T:
|
|
1266
|
+
- Install skills without user confirmation
|
|
1267
|
+
- Install from untrusted/unknown sources without review
|
|
1268
|
+
- Override existing cm-* skills with external ones
|
|
1269
|
+
- Install more than needed — minimal is better
|
|
1270
|
+
```
|
|
1271
|
+
|
|
1272
|
+
### Self-Improvement Loop
|
|
1273
|
+
|
|
1274
|
+
After completing a project, the bootstrap gets smarter:
|
|
1275
|
+
|
|
1276
|
+
```
|
|
1277
|
+
1. Review .cm-skills-log.json — what new skills were needed?
|
|
1278
|
+
2. If a skill was useful → suggest making it a permanent cm-* skill
|
|
1279
|
+
3. If the same type of skill is needed across 3+ projects →
|
|
1280
|
+
auto-suggest: "This skill seems essential. Make it part of your default toolkit?"
|
|
1281
|
+
4. Update ~/.cm-identity-history.json with commonly needed skill patterns
|
|
1282
|
+
```
|
|
1283
|
+
|
|
1284
|
+
---
|
|
1285
|
+
|
|
1286
|
+
## Phase 9.5: Working Memory Init 🧠
|
|
1287
|
+
|
|
1288
|
+
> **MANDATORY. Every project gets a CONTINUITY.md.**
|
|
1289
|
+
> **This is what makes AI remember context across sessions.**
|
|
1290
|
+
|
|
1291
|
+
### Step 1: Create `.cm/` directory
|
|
1292
|
+
|
|
1293
|
+
```bash
|
|
1294
|
+
mkdir -p .cm
|
|
1295
|
+
```
|
|
1296
|
+
|
|
1297
|
+
### Step 2: Create CONTINUITY.md
|
|
1298
|
+
|
|
1299
|
+
Write `.cm/CONTINUITY.md` using the template from `cm-continuity` skill:
|
|
1300
|
+
- Set `Project:` to the project name from `.project-identity.json`
|
|
1301
|
+
- Set `Current Phase:` to `bootstrapping`
|
|
1302
|
+
- Set `Active Goal:` to the user's stated project purpose
|
|
1303
|
+
- Leave `Mistakes & Learnings` empty (will be populated during development)
|
|
1304
|
+
|
|
1305
|
+
### Step 3: Add to .gitignore
|
|
1306
|
+
|
|
1307
|
+
`.cm/CONTINUITY.md` is **LOCAL working memory** — do NOT commit:
|
|
1308
|
+
|
|
1309
|
+
```gitignore
|
|
1310
|
+
# Working memory (local only)
|
|
1311
|
+
.cm/
|
|
1312
|
+
```
|
|
1313
|
+
|
|
1314
|
+
### Step 4: Add to AGENTS.md
|
|
1315
|
+
|
|
1316
|
+
Add this line to the AGENTS.md "Important Rules" section:
|
|
1317
|
+
|
|
1318
|
+
```markdown
|
|
1319
|
+
- Read `.cm/CONTINUITY.md` at the start of every session for context
|
|
1320
|
+
```
|
|
1321
|
+
|
|
1322
|
+
### Why This Saves Tokens
|
|
1323
|
+
|
|
1324
|
+
Next session, AI reads ~200 tokens from CONTINUITY.md instead of
|
|
1325
|
+
re-scanning 50+ files (~15,000 tokens). **Savings: ~97% on context loading.**
|
|
1326
|
+
|
|
1327
|
+
---
|
|
156
1328
|
|
|
157
1329
|
## Anti-Patterns ❌
|
|
158
1330
|
|
|
159
|
-
| Anti-Pattern | Prevention |
|
|
160
|
-
|
|
161
|
-
| Skip identity lock | Phase 0 is MANDATORY |
|
|
162
|
-
| No staging branch | Always 2 branches |
|
|
163
|
-
| i18n "later" | Phase 4 from day 1 |
|
|
164
|
-
| Raw hex colors | Design tokens only |
|
|
165
|
-
| No AGENTS.md | Phase 6 creates it |
|
|
166
|
-
| deploy = production | deploy = staging default |
|
|
167
|
-
|
|
|
1331
|
+
| # | Anti-Pattern | Consequence | Prevention |
|
|
1332
|
+
|---|-------------|-------------|------------|
|
|
1333
|
+
| 1 | Skip identity lock | Deploy to wrong Cloudflare account | Phase 0 is MANDATORY |
|
|
1334
|
+
| 2 | No staging branch | Bugs hit production directly | Always 2 branches |
|
|
1335
|
+
| 3 | i18n "later" | Weeks of refactoring | Phase 4 from day 1 |
|
|
1336
|
+
| 4 | Raw hex colors | Inconsistent UI, broken dark mode | Design tokens only |
|
|
1337
|
+
| 5 | No AGENTS.md | AI agents make wrong assumptions | Phase 6 creates it |
|
|
1338
|
+
| 6 | deploy = production | Users see bugs | deploy = staging default |
|
|
1339
|
+
| 7 | Code before plan | Technical debt from start | cm-writing-plans first |
|
|
1340
|
+
| 8 | Skip test:gate | "Tests pass" but app broken | 8-gate pipeline |
|
|
1341
|
+
| 9 | 600 i18n strings at once | App crash | MAX 30 per batch |
|
|
1342
|
+
| 10 | No design tokens | Every component has different colors | Phase 3 foundation |
|
|
1343
|
+
| 11 | Force push to main | Lost commits, broken deploys | Never. Period. |
|
|
1344
|
+
| 12 | No PR template | Unverified code reaches production | Phase 6 creates it |
|
|
1345
|
+
|
|
1346
|
+
---
|
|
1347
|
+
|
|
1348
|
+
## Output Checklist ✅
|
|
1349
|
+
|
|
1350
|
+
After bootstrap, the project MUST have:
|
|
1351
|
+
|
|
1352
|
+
```
|
|
1353
|
+
✅ .project-identity.json — Identity locked
|
|
1354
|
+
✅ ~/.cm-identity-history.json — Identity saved for future suggestions
|
|
1355
|
+
✅ ~/.cm-design-profiles/{org}.json — Brand design system saved
|
|
1356
|
+
✅ .gitleaks.toml — Secret scanning config (Phase 0.5)
|
|
1357
|
+
✅ .git/hooks/pre-commit — Secret Shield pre-commit hook (Phase 0.5)
|
|
1358
|
+
✅ .dev.vars.example — Secret template (Phase 0.5)
|
|
1359
|
+
✅ AGENTS.md — AI collaboration manifest
|
|
1360
|
+
✅ .github/pull_request_template.md — PR template
|
|
1361
|
+
✅ .gitignore — Hardened ignores (secrets, keys, env files)
|
|
1362
|
+
✅ package.json — With deploy:staging, deploy:production, test:gate, security:scan
|
|
1363
|
+
✅ shadcn/ui initialized — (SPA/Fullstack) or design-tokens.css (Static)
|
|
1364
|
+
✅ globals.css / style.css — Brand tokens + mobile-first base styles
|
|
1365
|
+
✅ i18n/vi.json — Primary language file
|
|
1366
|
+
✅ i18n/[lang].json — Target language files (empty structure)
|
|
1367
|
+
✅ index.html — With SEO meta tags, semantic HTML
|
|
1368
|
+
✅ tests/frontend-safety — Safety checks
|
|
1369
|
+
✅ tests/i18n-sync — Key parity tests
|
|
1370
|
+
✅ vitest.config.js — Test configuration
|
|
1371
|
+
✅ main branch — Staging deploys
|
|
1372
|
+
✅ production branch — Production deploys
|
|
1373
|
+
✅ First commit — "chore: bootstrap with cm-project-bootstrap v2.0"
|
|
1374
|
+
✅ .cm/CONTINUITY.md — Working memory for AI context persistence
|
|
1375
|
+
```
|