codymaster 7.0.2 → 7.0.3
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 +64 -0
- package/README.md +38 -1
- package/dist/agent/codex.js +73 -21
- package/dist/agent-dispatch.js +63 -48
- package/dist/cli/commands/brain.js +18 -0
- package/dist/cli/commands/design-studio.js +1 -1
- package/dist/cm-suggest.js +3 -3
- package/dist/dashboard-project-summary.js +9 -0
- package/dist/dashboard.js +11 -5
- package/dist/execution-analyzer.js +9 -1
- package/dist/judge.js +16 -15
- package/dist/mcp-context-server.js +45 -23
- package/dist/mcp-skills-tools.js +2 -2
- package/dist/skill-chain.js +26 -3
- package/dist/skill-token-report.js +105 -0
- package/dist/sprint-pipeline.js +3 -3
- package/dist/ui/onboarding.js +3 -4
- package/dist/utils/design-taste.js +1 -1
- package/dist/utils/output-compress.js +8 -0
- package/package.json +2 -1
- package/public/dashboard/app.js +40 -13
- package/public/dashboard/index.html +190 -5
- package/public/dashboard/style.css +1 -1
- package/scripts/build-skills.mjs +36 -2
- package/scripts/mcp-bridge.js +41 -24
- package/scripts/pack-plugin.mjs +206 -0
- package/skills/cm-ads-tracker/SKILL.md +401 -0
- package/skills/cm-ads-tracker/evals/evals.json +55 -0
- package/skills/cm-ads-tracker/references/gtm-architecture.md +321 -0
- package/skills/cm-ads-tracker/references/industry-events.md +294 -0
- package/skills/cm-ads-tracker/references/platforms-api.md +238 -0
- package/skills/cm-ads-tracker/templates/capi-payload.md +79 -0
- package/skills/cm-ads-tracker/templates/datalayer-push.js +104 -0
- package/skills/cm-ads-tracker/templates/gtm-variables.js +56 -0
- 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 +5 -5
- package/skills/cm-code-review/SKILL.md +2 -2
- package/skills/cm-codeintell/SKILL.md +47 -580
- package/skills/cm-codeintell/references/integration-workflows.md +23 -0
- package/skills/cm-codeintell/references/layer-0-skeleton.md +54 -0
- package/skills/cm-codeintell/references/layer-1-codegraph.md +58 -0
- package/skills/cm-codeintell/references/layer-2-architecture.md +31 -0
- package/skills/cm-codeintell/references/layer-3-context-builder.md +32 -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/SKILL.md +416 -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/docs/content/changelog.md +36 -0
- package/skills/cm-content-factory/landing/docs/content/deployment.md +46 -0
- package/skills/cm-content-factory/landing/docs/content/execution-flow.md +67 -0
- package/skills/cm-content-factory/landing/docs/content/openspace.md +27 -0
- package/skills/cm-content-factory/landing/docs/content/openviking.md +33 -0
- package/skills/cm-content-factory/landing/docs/content/use-cases.md +26 -0
- package/skills/cm-content-factory/landing/docs/content/v5-intro.md +28 -0
- package/skills/cm-content-factory/landing/docs/index.html +240 -0
- package/skills/cm-content-factory/landing/index.html +680 -0
- package/skills/cm-content-factory/landing/script.js +143 -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 +49 -480
- package/skills/cm-continuity/references/cm-uri-scheme.md +23 -0
- package/skills/cm-continuity/references/continuity-template.md +48 -0
- package/skills/cm-continuity/references/mcp-context-server.md +27 -0
- package/skills/cm-continuity/references/memory-architecture.md +26 -0
- package/skills/cm-continuity/references/memory-audit.md +18 -0
- package/skills/cm-continuity/references/session-protocol.md +31 -0
- package/skills/cm-continuity/references/storage-formats.md +20 -0
- package/skills/cm-cro-methodology/SKILL.md +290 -0
- package/skills/cm-cro-methodology/references/COPYWRITING.md +178 -0
- package/skills/cm-cro-methodology/references/OBJECTIONS.md +135 -0
- package/skills/cm-cro-methodology/references/PERSUASION.md +158 -0
- package/skills/cm-cro-methodology/references/RESEARCH.md +220 -0
- package/skills/cm-cro-methodology/references/funnel-analysis.md +365 -0
- package/skills/cm-cro-methodology/references/testing-methodology.md +330 -0
- package/skills/cm-design-system/SKILL.md +5 -6
- package/skills/cm-execution/SKILL.md +61 -379
- package/skills/cm-execution/references/mode-a-batch.md +28 -0
- package/skills/cm-execution/references/mode-b-subagent.md +46 -0
- package/skills/cm-execution/references/mode-c-parallel.md +39 -0
- package/skills/cm-execution/references/mode-d-rarv.md +62 -0
- package/skills/cm-execution/references/mode-e-triz-parallel.md +53 -0
- package/skills/cm-execution/references/mode-f-party.md +61 -0
- package/skills/cm-execution/references/persona-dispatch.md +22 -0
- package/skills/cm-execution/references/security-rules.md +47 -0
- 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 +282 -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 +8 -9
- package/skills/cm-identity-guard/SKILL.md +4 -4
- package/skills/cm-jtbd/SKILL.md +98 -0
- package/skills/cm-notebooklm/SKILL.md +156 -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 +3 -3
- package/skills/cm-project-bootstrap/SKILL.md +2 -2
- package/skills/cm-quality-gate/SKILL.md +1 -1
- package/skills/cm-readit/SKILL.md +289 -0
- package/skills/cm-readit/audio-player.md +206 -0
- package/skills/cm-readit/examples/blog-reader.js +352 -0
- package/skills/cm-readit/examples/voice-cro.js +390 -0
- package/skills/cm-readit/tts-engine.md +262 -0
- package/skills/cm-readit/ui-patterns.md +362 -0
- package/skills/cm-readit/voice-cro.md +223 -0
- package/skills/cm-safe-deploy/SKILL.md +80 -510
- package/skills/cm-safe-deploy/references/gate-0-5-security-scan.md +31 -0
- package/skills/cm-safe-deploy/references/gate-0-secret-hygiene.md +68 -0
- package/skills/cm-safe-deploy/references/gate-1-syntax.md +23 -0
- package/skills/cm-safe-deploy/references/gate-2-test-suite.md +28 -0
- package/skills/cm-safe-deploy/references/gate-3-i18n.md +19 -0
- package/skills/cm-safe-deploy/references/gate-4-5-build-dist.md +16 -0
- package/skills/cm-safe-deploy/references/gate-6-deploy-smoke.md +18 -0
- package/skills/cm-safe-deploy/references/rollback.md +17 -0
- package/skills/cm-safe-deploy/references/setup-new-project.md +20 -0
- package/skills/cm-skill-index/SKILL.md +15 -15
- package/skills/cm-start/SKILL.md +1 -1
- package/skills/cm-tdd/SKILL.md +51 -356
- package/skills/cm-tdd/references/bugfix-example.md +15 -0
- package/skills/cm-tdd/references/rationalizations.md +20 -0
- package/skills/cm-tdd/references/red-green-refactor.md +33 -0
- package/skills/cm-tdd/references/stuck-debugging.md +18 -0
- package/skills/cm-tdd/references/test-quality.md +19 -0
- package/skills/cm-ux-master/SKILL.md +368 -115
- package/skills/profiles/core.txt +1 -4
- package/skills/profiles/design.txt +1 -2
- package/skills/profiles/full.txt +10 -16
- package/skills/profiles/growth.txt +9 -9
- package/skills/profiles/top35.json +13 -13
- package/skills/cm-conductor-worktrees/SKILL.archive.md +0 -28
- package/skills/cm-conductor-worktrees/SKILL.md +0 -26
- package/skills/cm-dashboard/SKILL.archive.md +0 -15
- package/skills/cm-dashboard/SKILL.md +0 -26
- package/skills/cm-dashboard/ui/app.js +0 -1278
- package/skills/cm-dashboard/ui/index.html +0 -206
- package/skills/cm-dashboard/ui/style.css +0 -440
- package/skills/cm-design-studio/SKILL.archive.md +0 -34
- package/skills/cm-design-studio/SKILL.md +0 -26
- package/skills/cm-engineering-meta/SKILL.archive.md +0 -73
- package/skills/cm-engineering-meta/SKILL.md +0 -26
- package/skills/cm-git-worktrees/SKILL.archive.md +0 -157
- package/skills/cm-git-worktrees/SKILL.md +0 -26
- package/skills/cm-post-deploy-canary/SKILL.archive.md +0 -22
- package/skills/cm-post-deploy-canary/SKILL.md +0 -26
- package/skills/cm-qa-visual-cli/SKILL.archive.md +0 -22
- package/skills/cm-qa-visual-cli/SKILL.md +0 -26
- package/skills/cm-second-opinion-cli/SKILL.archive.md +0 -23
- package/skills/cm-second-opinion-cli/SKILL.md +0 -26
- package/skills/cm-secret-shield/SKILL.archive.md +0 -580
- package/skills/cm-secret-shield/SKILL.md +0 -26
- package/skills/cm-security-gate/SKILL.archive.md +0 -239
- package/skills/cm-security-gate/SKILL.md +0 -26
- package/skills/cm-skill-health/SKILL.archive.md +0 -83
- package/skills/cm-skill-health/SKILL.md +0 -26
- package/skills/cm-skill-mastery/SKILL.archive.md +0 -156
- package/skills/cm-skill-mastery/SKILL.md +0 -26
- package/skills/cm-skill-search/SKILL.archive.md +0 -49
- package/skills/cm-skill-search/SKILL.md +0 -26
- package/skills/cm-skill-share/SKILL.archive.md +0 -58
- package/skills/cm-skill-share/SKILL.md +0 -26
- package/skills/cm-test-gate/SKILL.archive.md +0 -245
- package/skills/cm-test-gate/SKILL.md +0 -26
- package/skills/cm-ui-preview/SKILL.archive.md +0 -153
- package/skills/cm-ui-preview/SKILL.md +0 -26
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cm-safe-deploy
|
|
3
|
-
description: Use when setting up deployment infrastructure
|
|
3
|
+
description: Use when setting up deployment infrastructure or enforcing a gated release path. Routes to deploy gates, setup, or rollback based on the current deployment stage.
|
|
4
4
|
token_budget: 1500
|
|
5
|
+
token_core: 500
|
|
6
|
+
token_refs:
|
|
7
|
+
gate-0-secret-hygiene: 620
|
|
8
|
+
gate-0-5-security-scan: 300
|
|
9
|
+
gate-1-syntax: 280
|
|
10
|
+
gate-2-test-suite: 380
|
|
11
|
+
gate-3-i18n: 260
|
|
12
|
+
gate-4-5-build-dist: 340
|
|
13
|
+
gate-6-deploy-smoke: 320
|
|
14
|
+
setup-new-project: 360
|
|
15
|
+
rollback: 220
|
|
5
16
|
compressed: true
|
|
6
17
|
deprecated: false
|
|
7
18
|
---
|
|
@@ -9,520 +20,79 @@ deprecated: false
|
|
|
9
20
|
# Safe Deploy Pipeline v2
|
|
10
21
|
|
|
11
22
|
## TL;DR
|
|
12
|
-
- **Use before/during**
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **Next**: cm-quality-gate
|
|
16
|
-
|
|
17
|
-
## Overview
|
|
18
|
-
|
|
19
|
-
A deploy without gates is a deploy with hope. Hope is not a strategy.
|
|
20
|
-
|
|
21
|
-
**Core principle:** Every project needs a multi-gate deploy pipeline. Code passes through syntax → tests → i18n → build → verify → deploy, with hard stops at each gate. No gate skipping. No "it'll be fine."
|
|
22
|
-
|
|
23
|
-
> [!CAUTION]
|
|
24
|
-
> **March 2026 Incident:** 572 backend tests passed green while `app.js` had catastrophic syntax errors → white screen in production. This pipeline exists because `test:gate` alone was NOT enough.
|
|
23
|
+
- **Use before/during** staging or production deployment
|
|
24
|
+
- **Model**: gated deploy pipeline with hard stops
|
|
25
|
+
- **Decision**: choose setup, active gate execution, or rollback
|
|
26
|
+
- **Next**: `cm-quality-gate` for verification evidence
|
|
25
27
|
|
|
26
28
|
## The Iron Law
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
+
```text
|
|
29
30
|
NO DEPLOY WITHOUT PASSING ALL GATES.
|
|
30
|
-
GATES ARE SEQUENTIAL.
|
|
31
|
-
|
|
31
|
+
GATES ARE SEQUENTIAL.
|
|
32
|
+
IF A GATE FAILS, FIX FIRST.
|
|
32
33
|
```
|
|
33
34
|
|
|
34
35
|
## When to Use
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
> Calls `cm-secret-shield` Layer 4 for deep scanning. Below is the essential check:
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
node -e "
|
|
99
|
-
const fs = require('fs');
|
|
100
|
-
const { execSync } = require('child_process');
|
|
101
|
-
|
|
102
|
-
// 1. Check wrangler config for secrets
|
|
103
|
-
const wranglerFiles = ['wrangler.jsonc', 'wrangler.toml', 'wrangler.json'];
|
|
104
|
-
const dangerous = ['SERVICE_KEY', 'ANON_KEY', 'DB_PASSWORD', 'SECRET_KEY', 'PRIVATE_KEY', 'API_SECRET'];
|
|
105
|
-
let failed = false;
|
|
106
|
-
|
|
107
|
-
for (const wf of wranglerFiles) {
|
|
108
|
-
if (!fs.existsSync(wf)) continue;
|
|
109
|
-
const src = fs.readFileSync(wf, 'utf-8');
|
|
110
|
-
for (const key of dangerous) {
|
|
111
|
-
// Check for actual values, not just variable names
|
|
112
|
-
const valuePattern = new RegExp(key + '\\\\s*[=:]\\\\s*[\"\'][a-zA-Z0-9/+=]{20,}', 'g');
|
|
113
|
-
if (valuePattern.test(src)) {
|
|
114
|
-
console.error('❌ DANGEROUS: ' + wf + ' contains a ' + key + ' VALUE');
|
|
115
|
-
console.error(' Fix: wrangler secret put ' + key + ' (then remove from ' + wf + ')');
|
|
116
|
-
failed = true;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// 2. Check .gitignore has required patterns
|
|
122
|
-
if (fs.existsSync('.gitignore')) {
|
|
123
|
-
const gi = fs.readFileSync('.gitignore', 'utf-8');
|
|
124
|
-
const required = ['.env', '.dev.vars'];
|
|
125
|
-
const missing = required.filter(r => !gi.includes(r));
|
|
126
|
-
if (missing.length > 0) {
|
|
127
|
-
console.error('❌ .gitignore missing: ' + missing.join(', '));
|
|
128
|
-
failed = true;
|
|
129
|
-
}
|
|
130
|
-
} else {
|
|
131
|
-
console.error('❌ No .gitignore found!');
|
|
132
|
-
failed = true;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// 3. Check .env files aren't tracked by git
|
|
136
|
-
try {
|
|
137
|
-
const tracked = execSync('git ls-files', { encoding: 'utf-8' });
|
|
138
|
-
const badFiles = ['.env', '.dev.vars', '.env.local', '.env.production'];
|
|
139
|
-
const trackedBad = badFiles.filter(f => tracked.split('\\n').includes(f));
|
|
140
|
-
if (trackedBad.length > 0) {
|
|
141
|
-
console.error('❌ CRITICAL: Secret files tracked by git: ' + trackedBad.join(', '));
|
|
142
|
-
console.error(' Fix: git rm --cached ' + trackedBad.join(' '));
|
|
143
|
-
failed = true;
|
|
144
|
-
}
|
|
145
|
-
} catch (e) { /* not a git repo */ }
|
|
146
|
-
|
|
147
|
-
if (failed) {
|
|
148
|
-
console.error('\\n🛡️ Gate 0 FAILED. Fix issues above before deploying.');
|
|
149
|
-
process.exit(1);
|
|
150
|
-
}
|
|
151
|
-
console.log('✅ Gate 0 passed: repo-wide secret hygiene verified');
|
|
152
|
-
"
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**Setup `.dev.vars` for local development:**
|
|
156
|
-
```bash
|
|
157
|
-
# .dev.vars — local only, NEVER committed
|
|
158
|
-
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
|
|
159
|
-
SUPABASE_SERVICE_KEY=YOUR_SERVICE_KEY
|
|
160
|
-
|
|
161
|
-
# Add to .gitignore:
|
|
162
|
-
echo ".dev.vars" >> .gitignore
|
|
163
|
-
|
|
164
|
-
# Commit the template:
|
|
165
|
-
cp .dev.vars .dev.vars.example # Remove values first
|
|
166
|
-
git add .dev.vars.example
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
**If secrets were already committed:**
|
|
170
|
-
```bash
|
|
171
|
-
# Remove from git history (URGENT — do before pushing)
|
|
172
|
-
git filter-repo --path wrangler.jsonc --invert-paths # Nuclear option
|
|
173
|
-
# OR just remove the value from wrangler.jsonc and add as secret:
|
|
174
|
-
wrangler secret put SUPABASE_SERVICE_KEY
|
|
175
|
-
# Then rotate the key immediately in Supabase dashboard
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
### Gate 0.5: Security Scan (Snyk + Aikido — Parallel)
|
|
181
|
-
|
|
182
|
-
> [!IMPORTANT]
|
|
183
|
-
> **CodyMaster internal:** This gate is MANDATORY. Both Snyk and Aikido must pass.
|
|
184
|
-
> **User projects:** This gate is SUGGESTED by default. Becomes MANDATORY if CVEs or risk flags were detected during development.
|
|
185
|
-
|
|
186
|
-
**Run both scanners in parallel:**
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
# Snyk — dependency vulnerabilities
|
|
190
|
-
snyk test
|
|
191
|
-
|
|
192
|
-
# Aikido — SAST + dependencies + secrets + IaC
|
|
193
|
-
aikido-api-client scan-release <repo> $(git rev-parse HEAD) \
|
|
194
|
-
--minimum-severity-level="HIGH"
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**For CodyMaster (maximum strictness):**
|
|
198
|
-
```bash
|
|
199
|
-
aikido-api-client scan-release <repo> $(git rev-parse HEAD) \
|
|
200
|
-
--minimum-severity-level="HIGH" \
|
|
201
|
-
--fail-on-sast-scan \
|
|
202
|
-
--fail-on-secrets-scan
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
**Gate decision:**
|
|
206
|
-
- Both pass → proceed to Gate 1
|
|
207
|
-
- Either fails → **STOP. Fix before continuing.** Invoke `cm-security-gate` for remediation.
|
|
208
|
-
|
|
209
|
-
> See `cm-security-gate` for full setup, flag reference, and remediation workflow.
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
### Gate 1: Syntax Validation (FAST FAIL)
|
|
214
|
-
|
|
215
|
-
> [!IMPORTANT]
|
|
216
|
-
> This gate runs in < 1 second and catches the EXACT class of errors that caused the March 2026 incident. Run it BEFORE the test suite (which takes 10-30s).
|
|
217
|
-
|
|
218
|
-
| Stack | Command | What it checks |
|
|
219
|
-
|-------|---------|---------------|
|
|
220
|
-
| Vanilla JS | `node -c path/to/app.js` | JavaScript parse errors |
|
|
221
|
-
| TypeScript | `npx tsc --noEmit` | Type errors + syntax |
|
|
222
|
-
| Python | `python -m py_compile app.py` | Python syntax |
|
|
223
|
-
| Go | `go vet ./...` | Go static analysis |
|
|
224
|
-
|
|
225
|
-
**For frontend monoliths without TypeScript:**
|
|
226
|
-
```bash
|
|
227
|
-
# Ultra-fast syntax check — fails in < 1s if broken
|
|
228
|
-
node -c public/static/app.js
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**Why separate from Gate 2?**
|
|
232
|
-
- `node -c` takes < 1 second. Test suite takes 10-30 seconds.
|
|
233
|
-
- If syntax is broken, 100% of tests will fail anyway — but with confusing error messages.
|
|
234
|
-
- A fast syntax check gives you the EXACT line number of the error instantly.
|
|
235
|
-
|
|
236
|
-
**REQUIRED SUB-SKILL:** Use `cm-quality-gate` for parser-based validation inside the test suite (Layer 1).
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
### Gate 2: Test Suite
|
|
241
|
-
|
|
242
|
-
The test suite MUST include:
|
|
243
|
-
|
|
244
|
-
| Test Category | What it validates | Priority |
|
|
245
|
-
|--------------|-------------------|----------|
|
|
246
|
-
| **Frontend safety** | JS syntax, function integrity, corruption patterns | **CRITICAL** |
|
|
247
|
-
| **Backend API** | Routes return correct data | Required |
|
|
248
|
-
| **Business logic** | Calculations, rules, validation | Required |
|
|
249
|
-
| **i18n sync** | Translation key parity, orphaned keys | Required for multi-lang |
|
|
250
|
-
| **Integration** | End-to-end workflows | Recommended |
|
|
251
|
-
|
|
252
|
-
**Setup the test:gate script:**
|
|
253
|
-
```json
|
|
254
|
-
{
|
|
255
|
-
"scripts": {
|
|
256
|
-
"test:gate": "vitest run --reporter=verbose"
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
**Gate decision:**
|
|
262
|
-
```
|
|
263
|
-
IF 0 failures → proceed to Gate 3
|
|
264
|
-
IF any failures → STOP. Fix before continuing.
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
**REQUIRED SUB-SKILL:** Use `cm-quality-gate` for enforcement discipline.
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
### Gate 3: i18n Parity Check (for multi-language projects)
|
|
272
|
-
|
|
273
|
-
> [!NOTE]
|
|
274
|
-
> Skip this gate if the project does not have i18n. For projects with i18n, this gate catches what test suites can miss: key drift between languages that causes blank strings in production.
|
|
275
|
-
|
|
276
|
-
```bash
|
|
277
|
-
# All language files must have identical key counts
|
|
278
|
-
node -e "
|
|
279
|
-
const fs = require('fs');
|
|
280
|
-
const path = require('path');
|
|
281
|
-
const I18N_DIR = 'public/static/i18n';
|
|
282
|
-
const langs = ['vi','en','th','ph'];
|
|
283
|
-
const results = {};
|
|
284
|
-
let allMatch = true;
|
|
285
|
-
|
|
286
|
-
for (const lang of langs) {
|
|
287
|
-
const filePath = path.join(I18N_DIR, lang + '.json');
|
|
288
|
-
const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
289
|
-
const flatKeys = JSON.stringify(data).split('\":').length - 1;
|
|
290
|
-
results[lang] = flatKeys;
|
|
291
|
-
console.log(lang + ': ' + flatKeys + ' keys');
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const counts = Object.values(results);
|
|
295
|
-
if (new Set(counts).size !== 1) {
|
|
296
|
-
console.error('❌ KEY PARITY FAILURE! Counts differ across languages.');
|
|
297
|
-
console.error(JSON.stringify(results));
|
|
298
|
-
process.exit(1);
|
|
299
|
-
} else {
|
|
300
|
-
console.log('✅ Key parity: all languages have ' + counts[0] + ' keys');
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Check for null/empty values
|
|
304
|
-
let nullCount = 0;
|
|
305
|
-
for (const lang of langs) {
|
|
306
|
-
const data = JSON.parse(fs.readFileSync(path.join(I18N_DIR, lang + '.json'), 'utf-8'));
|
|
307
|
-
const check = (obj, prefix) => {
|
|
308
|
-
for (const [k, v] of Object.entries(obj)) {
|
|
309
|
-
if (k === '_meta') continue;
|
|
310
|
-
if (typeof v === 'object' && v !== null) { check(v, prefix + '.' + k); continue; }
|
|
311
|
-
if (v === null || v === undefined || v === '') {
|
|
312
|
-
console.error(' ⚠ ' + lang + '.' + prefix + '.' + k + ' is null/empty');
|
|
313
|
-
nullCount++;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
};
|
|
317
|
-
check(data, lang);
|
|
318
|
-
}
|
|
319
|
-
if (nullCount > 0) {
|
|
320
|
-
console.error('❌ Found ' + nullCount + ' null/empty translation values!');
|
|
321
|
-
process.exit(1);
|
|
322
|
-
}
|
|
323
|
-
console.log('✅ No null/empty values');
|
|
324
|
-
"
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
**What this catches:**
|
|
328
|
-
- Keys added to `vi.json` but forgotten in `en.json` → blank strings for English users
|
|
329
|
-
- Null values from bad translation scripts → `t()` returns key name instead of translation
|
|
330
|
-
- Key count drift between languages → inconsistent UX
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
### Gate 4: Build Verification
|
|
335
|
-
|
|
336
|
-
Production build must succeed without errors.
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
npm run build
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
**What this catches that tests don't:**
|
|
343
|
-
- Import resolution failures
|
|
344
|
-
- Tree-shaking errors
|
|
345
|
-
- Missing environment variables
|
|
346
|
-
- Asset compilation failures
|
|
347
|
-
- Bundle size explosions
|
|
348
|
-
|
|
349
|
-
**Optional: Bundle size guard:**
|
|
350
|
-
```json
|
|
351
|
-
{
|
|
352
|
-
"scripts": {
|
|
353
|
-
"build:verify": "npm run build && node -e \"const s=require('fs').statSync('dist/_worker.js').size; if(s>2e6) {console.error('Bundle too large: '+s); process.exit(1)}\""
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
### Gate 5: Dist Asset Verification (NEW)
|
|
361
|
-
|
|
362
|
-
> [!IMPORTANT]
|
|
363
|
-
> The build can "succeed" but produce an incomplete dist/ directory. This gate catches missing critical assets.
|
|
364
|
-
|
|
365
|
-
```bash
|
|
366
|
-
# Verify critical files exist in dist/
|
|
367
|
-
node -e "
|
|
368
|
-
const fs = require('fs');
|
|
369
|
-
const required = [
|
|
370
|
-
'dist/_worker.js',
|
|
371
|
-
'dist/static/app.js',
|
|
372
|
-
'dist/static/style.css',
|
|
373
|
-
'dist/static/i18n/vi.json',
|
|
374
|
-
'dist/static/i18n/en.json',
|
|
375
|
-
'dist/static/i18n/th.json',
|
|
376
|
-
'dist/static/i18n/ph.json',
|
|
377
|
-
];
|
|
378
|
-
const missing = required.filter(f => !fs.existsSync(f));
|
|
379
|
-
if (missing.length > 0) {
|
|
380
|
-
console.error('❌ Missing files in dist/:');
|
|
381
|
-
missing.forEach(f => console.error(' ' + f));
|
|
382
|
-
process.exit(1);
|
|
383
|
-
}
|
|
384
|
-
console.log('✅ All ' + required.length + ' critical files present in dist/');
|
|
385
|
-
"
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
**Adapt `required` array to your project.** At minimum, verify:
|
|
389
|
-
- Worker/server entry point exists
|
|
390
|
-
- Frontend JS/CSS files exist
|
|
391
|
-
- Translation files are copied
|
|
392
|
-
- Critical images/assets are present
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
### Gate 6: Deploy + Post-Deploy Smoke Test
|
|
397
|
-
|
|
398
|
-
Only after Gates 1-5 pass.
|
|
399
|
-
|
|
400
|
-
**Deploy command varies by platform:**
|
|
401
|
-
|
|
402
|
-
| Platform | Command |
|
|
403
|
-
|----------|---------|
|
|
404
|
-
| Cloudflare Pages | `npx wrangler pages deploy dist/` |
|
|
405
|
-
| Vercel | `npx vercel --prod` |
|
|
406
|
-
| Netlify | `npx netlify deploy --prod` |
|
|
407
|
-
|
|
408
|
-
**Post-deploy verification:**
|
|
409
|
-
```bash
|
|
410
|
-
# Smoke test the deployed URL — must return 200
|
|
411
|
-
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://your-app.pages.dev)
|
|
412
|
-
if [ "$STATUS" != "200" ]; then
|
|
413
|
-
echo "❌ POST-DEPLOY SMOKE TEST FAILED! Status: $STATUS"
|
|
414
|
-
echo "⚠ Consider immediate rollback."
|
|
415
|
-
exit 1
|
|
416
|
-
fi
|
|
417
|
-
echo "✅ Smoke test passed (HTTP $STATUS)"
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
## Composing the Deploy Script
|
|
423
|
-
|
|
424
|
-
### `package.json` (Recommended)
|
|
425
|
-
```json
|
|
426
|
-
{
|
|
427
|
-
"scripts": {
|
|
428
|
-
"predeploy:syntax": "node -c public/static/app.js",
|
|
429
|
-
"predeploy:i18n": "node scripts/check-i18n-parity.js",
|
|
430
|
-
"predeploy:dist": "node scripts/verify-dist.js",
|
|
431
|
-
"deploy": "npm run predeploy:syntax && npm run test:gate && npm run predeploy:i18n && npm run build && npm run predeploy:dist && YOUR_DEPLOY_COMMAND"
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
**Key insight:** Chain gates with `&&`. If any gate fails, the chain stops immediately.
|
|
437
|
-
|
|
438
|
-
---
|
|
439
|
-
|
|
440
|
-
## Rollback Protocol
|
|
441
|
-
|
|
442
|
-
When a deployment causes issues:
|
|
443
|
-
|
|
444
|
-
| Severity | Action | Command |
|
|
445
|
-
|----------|--------|---------|
|
|
446
|
-
| **White screen** (syntax) | Revert last commit, redeploy | `git revert HEAD && npm run deploy` |
|
|
447
|
-
| **Broken translations** | Revert JSON files, redeploy | `git checkout HEAD~1 -- public/static/i18n/*.json && npm run deploy` |
|
|
448
|
-
| **API error** | Revert server code, redeploy | `git revert HEAD && npm run deploy` |
|
|
449
|
-
| **Partial breakage** | Cherry-pick fix, deploy | Fix → test → deploy |
|
|
450
|
-
|
|
451
|
-
**Cloudflare Pages specific:**
|
|
452
|
-
```bash
|
|
453
|
-
# Rollback to previous deployment
|
|
454
|
-
wrangler pages deployments list --project-name prms
|
|
455
|
-
wrangler pages deployment rollback <deployment-id> --project-name prms
|
|
456
|
-
```
|
|
457
|
-
|
|
458
|
-
---
|
|
459
|
-
|
|
460
|
-
## Setting Up for a New Project
|
|
461
|
-
|
|
462
|
-
### Step 1: Create test infrastructure
|
|
463
|
-
```bash
|
|
464
|
-
npm install -D vitest acorn
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
### Step 2: Create package.json scripts
|
|
468
|
-
```json
|
|
469
|
-
{
|
|
470
|
-
"scripts": {
|
|
471
|
-
"test:gate": "vitest run --reporter=verbose",
|
|
472
|
-
"build": "YOUR_BUILD_COMMAND",
|
|
473
|
-
"deploy": "node -c public/static/app.js && npm run test:gate && npm run build && YOUR_DEPLOY_COMMAND"
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
### Step 3: Add frontend safety tests
|
|
479
|
-
**REQUIRED SUB-SKILL:** Follow `cm-quality-gate` to create test file with all layers.
|
|
480
|
-
|
|
481
|
-
### Step 4: Create deploy workflow
|
|
482
|
-
Create `.agents/workflows/deploy.md`.
|
|
483
|
-
|
|
484
|
-
---
|
|
485
|
-
|
|
486
|
-
## Red Flags — STOP
|
|
487
|
-
|
|
488
|
-
- ❌ Deploying without running test:gate
|
|
489
|
-
- ❌ Skipping syntax check ("tests will catch it")
|
|
490
|
-
- ❌ Skipping build step ("tests passed so it'll build")
|
|
491
|
-
- ❌ Running tests and deploy in parallel
|
|
492
|
-
- ❌ "Tests passed last time" (run them NOW)
|
|
493
|
-
- ❌ "Only changed one file" (test everything)
|
|
494
|
-
- ❌ No frontend safety tests for JS projects
|
|
495
|
-
- ❌ No dist/ verification after build
|
|
496
|
-
- ❌ No post-deploy smoke test
|
|
497
|
-
- ❌ No i18n parity check for multi-language apps
|
|
498
|
-
|
|
499
|
-
## Rationalization Table
|
|
500
|
-
|
|
501
|
-
| Excuse | Reality |
|
|
502
|
-
|--------|---------|
|
|
503
|
-
| "Tests passed earlier" | Code changed since then. Run fresh. |
|
|
504
|
-
| "Build always works" | Until it doesn't. 30 seconds to verify. |
|
|
505
|
-
| "It's a one-line change" | One line broke 600 lines of app.js. Test it. |
|
|
506
|
-
| "CI will catch it" | CI runs AFTER push. Catch BEFORE push. |
|
|
507
|
-
| "Just a hotfix" | Hotfixes need MORE testing, not less. |
|
|
508
|
-
| "Syntax check is redundant" | `node -c` takes 0.5s and prevented the March 2026 disaster. |
|
|
509
|
-
| "i18n parity is overkill" | Missing keys → blank strings in production. |
|
|
510
|
-
| "dist/ is always complete" | Build tools can silently skip assets. Check. |
|
|
511
|
-
|
|
512
|
-
## Integration with Other Skills
|
|
513
|
-
|
|
514
|
-
| Skill | When |
|
|
515
|
-
|-------|------|
|
|
516
|
-
| `cm-quality-gate` | Setting up Gate 2 frontend tests and Test Gate |
|
|
517
|
-
| `cm-secret-shield` | Gate 0 calls Secret Shield Layer 4 for deep scanning |
|
|
518
|
-
| `cm-safe-i18n` | Adding i18n-specific gates |
|
|
519
|
-
| `cm-terminal` | Monitoring gate commands |
|
|
520
|
-
| `cm-identity-guard` | Gate 0 verifies deploy identity |
|
|
36
|
+
- Establishing deploy infrastructure for a new project
|
|
37
|
+
- Hardening an existing project that deploys without gates
|
|
38
|
+
- Recovering after incidents caused by weak release validation
|
|
39
|
+
- Running or reviewing a release pipeline before production changes
|
|
40
|
+
|
|
41
|
+
## Choose Your Path
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Need to create deploy infrastructure for a project?
|
|
45
|
+
└─ YES → Setup path
|
|
46
|
+
|
|
47
|
+
Already have infrastructure and need to run or review gates?
|
|
48
|
+
└─ YES → Gate path
|
|
49
|
+
|
|
50
|
+
Did a deploy fail or need reversal?
|
|
51
|
+
└─ YES → Rollback path
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| Path | Summary | Load |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| Setup | Establish scripts, tests, and deploy workflow | `references/setup-new-project.md` |
|
|
57
|
+
| Gate 0 | Secret hygiene | `references/gate-0-secret-hygiene.md` |
|
|
58
|
+
| Gate 0.5 | Security scanning | `references/gate-0-5-security-scan.md` |
|
|
59
|
+
| Gate 1 | Syntax validation | `references/gate-1-syntax.md` |
|
|
60
|
+
| Gate 2 | Test suite | `references/gate-2-test-suite.md` |
|
|
61
|
+
| Gate 3 | i18n parity | `references/gate-3-i18n.md` |
|
|
62
|
+
| Gates 4-5 | Build + dist verification | `references/gate-4-5-build-dist.md` |
|
|
63
|
+
| Gate 6 | Deploy + smoke verification | `references/gate-6-deploy-smoke.md` |
|
|
64
|
+
| Rollback | Recovery and reversal | `references/rollback.md` |
|
|
65
|
+
|
|
66
|
+
## Gate Map
|
|
67
|
+
```text
|
|
68
|
+
0 Secret hygiene
|
|
69
|
+
0.5 Security scan
|
|
70
|
+
1 Syntax
|
|
71
|
+
2 Test suite
|
|
72
|
+
3 i18n parity
|
|
73
|
+
4 Build verification
|
|
74
|
+
5 Dist verification
|
|
75
|
+
6 Deploy + smoke test
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Load Rules
|
|
79
|
+
- Load only the gate reference for the current stage.
|
|
80
|
+
- Load `setup-new-project.md` only when establishing infrastructure.
|
|
81
|
+
- Load `rollback.md` only when deployment fails or rollback planning is required.
|
|
82
|
+
|
|
83
|
+
## Integration
|
|
84
|
+
| Skill | Why |
|
|
85
|
+
|---|---|
|
|
86
|
+
| `cm-quality-gate` | verification and evidence checks |
|
|
87
|
+
| `cm-identity-guard` | deploy identity verification |
|
|
88
|
+
| `cm-safe-i18n` | i18n-specific gate setup |
|
|
89
|
+
| `cm-terminal` | monitored execution of gate commands |
|
|
90
|
+
|
|
91
|
+
## Rules
|
|
92
|
+
- Gates are sequential and blocking.
|
|
93
|
+
- Do not skip to later gates when an earlier gate fails.
|
|
94
|
+
- Keep deploy setup and active deploy execution separate in your head and in your prompts.
|
|
95
|
+
- Security and secret hygiene remain part of this skill; do not rely on deprecated skills.
|
|
521
96
|
|
|
522
97
|
## The Bottom Line
|
|
523
|
-
|
|
524
|
-
**6 gates. Sequential. Each must pass. No exceptions.**
|
|
525
|
-
|
|
526
|
-
Syntax → Tests → i18n → Build → Dist Verify → Deploy + Smoke.
|
|
527
|
-
|
|
528
|
-
This is non-negotiable.
|
|
98
|
+
**Choose setup, the current gate, or rollback. Load only that path, and stop on failure.**
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Gate 0.5 — Security Scan
|
|
2
|
+
|
|
3
|
+
> Run vulnerability and security scanners before progressing deeper into the pipeline.
|
|
4
|
+
|
|
5
|
+
## Use When
|
|
6
|
+
- production or public release prep
|
|
7
|
+
- repo risk or CVE concerns exist
|
|
8
|
+
- internal CodyMaster release flow requires security evidence
|
|
9
|
+
|
|
10
|
+
## Commands
|
|
11
|
+
```bash
|
|
12
|
+
snyk test
|
|
13
|
+
|
|
14
|
+
aikido-api-client scan-release <repo> $(git rev-parse HEAD) \
|
|
15
|
+
--minimum-severity-level="HIGH"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Strict Internal Variant
|
|
19
|
+
```bash
|
|
20
|
+
aikido-api-client scan-release <repo> $(git rev-parse HEAD) \
|
|
21
|
+
--minimum-severity-level="HIGH" \
|
|
22
|
+
--fail-on-sast-scan \
|
|
23
|
+
--fail-on-secrets-scan
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Decision
|
|
27
|
+
- both pass → continue
|
|
28
|
+
- either fails → stop and remediate before Gate 1
|
|
29
|
+
|
|
30
|
+
## Rule
|
|
31
|
+
Treat security scan failure as a hard stop, not a warning.
|