codymaster 4.8.0 → 7.0.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 +331 -7
- package/README.md +226 -296
- package/dist/advisory-handoff.js +89 -0
- package/dist/advisory-report.js +105 -0
- package/dist/agent/antigravity.js +152 -0
- package/dist/agent/backend.js +2 -0
- package/dist/agent/claude.js +196 -0
- package/dist/agent/codex.js +204 -0
- package/dist/agent/copilot.js +284 -0
- package/dist/agent/cursor.js +211 -0
- package/dist/agent/factory.js +30 -0
- package/dist/agent/gemini.js +142 -0
- package/dist/agent/opencode.js +205 -0
- package/dist/agent/spawn-helper.js +237 -0
- package/dist/agent/version.js +25 -0
- package/dist/browse/adapter-factory.js +69 -0
- package/dist/browse/adapters/agent-browser-adapter.js +305 -0
- package/dist/browse/adapters/playwright-adapter.js +309 -0
- package/dist/browse/adapters/types.js +6 -0
- package/dist/browse/error-collector.js +132 -0
- package/dist/browse/event-log.js +109 -0
- package/dist/browse/index.js +17 -0
- package/dist/browse-server.js +204 -120
- package/dist/cli/command-registry.js +20 -0
- package/dist/cli/commands/bench.js +69 -0
- package/dist/cli/commands/brain.js +108 -0
- package/dist/cli/commands/dashboard.js +76 -2
- package/dist/cli/commands/engineering.js +326 -4
- package/dist/cli/commands/evolve.js +123 -0
- package/dist/cli/commands/install.js +160 -0
- package/dist/cli/commands/learn.js +181 -0
- package/dist/cli/commands/mcp-serve.js +104 -0
- package/dist/cli/commands/parallel.js +138 -0
- package/dist/cli/commands/quality.js +105 -0
- package/dist/cli/commands/stack.js +49 -0
- package/dist/cli/commands/update.js +159 -0
- package/dist/cli/update-check.js +94 -10
- package/dist/cm-config.js +0 -18
- package/dist/codybench/judges/automated.js +31 -0
- package/dist/codybench/runners/claude-code.js +32 -0
- package/dist/codybench/suites/memory-retention.js +85 -0
- package/dist/codybench/suites/tdd-regression.js +35 -0
- package/dist/codybench/suites/token-efficiency.js +55 -0
- package/dist/codybench/types.js +2 -0
- package/dist/context-db.js +157 -0
- package/dist/continuity.js +5 -7
- package/dist/dashboard.js +47 -6
- package/dist/data.js +35 -0
- package/dist/execution/tdd-gate.js +113 -0
- package/dist/execution-analyzer.js +138 -0
- package/dist/executor/cancel.js +34 -0
- package/dist/executor/gc.js +74 -0
- package/dist/executor/index.js +14 -0
- package/dist/executor/runner.js +70 -0
- package/dist/executor/workdir.js +31 -0
- package/dist/handoff/contracts.js +22 -0
- package/dist/handoff/index.js +18 -0
- package/dist/handoff/io.js +121 -0
- package/dist/index.js +7 -3
- package/dist/indexer/skills-lib.js +533 -0
- package/dist/indexer/skills-map.js +1374 -0
- package/dist/indexer/skills.js +16 -0
- package/dist/indexer/stack-detect.js +219 -0
- package/dist/install/copy.js +98 -0
- package/dist/install/engine.js +42 -0
- package/dist/install/paths.js +70 -0
- package/dist/install/platforms/_simple.js +85 -0
- package/dist/install/platforms/antigravity.js +91 -0
- package/dist/install/platforms/claude-code.js +107 -0
- package/dist/install/platforms/cursor.js +77 -0
- package/dist/install/platforms/index.js +27 -0
- package/dist/install/platforms/simple.js +163 -0
- package/dist/install/profiles.js +75 -0
- package/dist/install/types.js +2 -0
- package/dist/learning-promoter.js +246 -0
- package/dist/learnings.js +208 -0
- package/dist/mcp-context-server.js +230 -1
- package/dist/middleware/metrics.js +30 -0
- package/dist/middleware/security-headers.js +14 -0
- package/dist/realtime/event-bus.js +29 -0
- package/dist/realtime/ws-hub.js +91 -0
- package/dist/schemas/task-schema.js +48 -0
- package/dist/schemas/validate.js +18 -0
- package/dist/skill-chain.js +63 -1
- package/dist/skill-evolver.js +456 -0
- package/dist/skill-execution-cache.js +254 -0
- package/dist/skills-lock.js +96 -0
- package/dist/smart-brain-router.js +184 -0
- package/dist/sprint-pipeline.js +26 -0
- package/dist/storage/index.js +21 -0
- package/dist/storage/repos/activity-repo.js +46 -0
- package/dist/storage/repos/message-repo.js +39 -0
- package/dist/storage/repos/project-repo.js +56 -0
- package/dist/storage/repos/task-repo.js +142 -0
- package/dist/storage/services/project-service.js +49 -0
- package/dist/storage/services/task-service.js +97 -0
- package/dist/storage/sqlite.js +113 -0
- package/dist/storage-backend.js +10 -8
- package/dist/tier-classify.js +131 -0
- package/dist/token-budget.js +88 -0
- package/dist/ui/onboarding.js +51 -15
- package/dist/utils/cli-utils.js +7 -2
- package/dist/utils/design-taste.js +108 -0
- package/dist/utils/output-compress.js +143 -0
- package/dist/vibecoding-index.js +126 -0
- package/package.json +20 -6
- package/public/dashboard/app.js +52 -1
- package/scripts/build-skills-lock.mjs +88 -0
- package/scripts/build-skills.mjs +187 -28
- package/scripts/compress-skill.mjs +73 -0
- package/scripts/deprecate-skill.mjs +72 -0
- package/scripts/install.sh +170 -0
- package/scripts/mcp-bridge.js +2 -2
- package/scripts/postinstall.js +53 -335
- package/scripts/update-changelog.sh +88 -0
- package/scripts/validate-skills.mjs +101 -4
- package/skills/CLAUDE.md +0 -5
- package/skills/_shared/SKILL_TEMPLATE.md +62 -0
- package/skills/_shared/helpers.md +2 -8
- package/skills/cm-autopilot/scripts/autopilot.py +19 -2
- package/skills/cm-brainstorm-idea/SKILL.md +9 -0
- package/skills/cm-browse/SKILL.md +6 -0
- package/skills/cm-clean-code/SKILL.md +20 -0
- package/skills/cm-code-review/SKILL.md +21 -0
- package/skills/cm-codeintell/SKILL.md +9 -0
- package/skills/cm-conductor-worktrees/SKILL.archive.md +28 -0
- package/skills/cm-conductor-worktrees/SKILL.md +20 -18
- package/skills/cm-continuity/SKILL.md +41 -33
- package/skills/cm-dashboard/SKILL.archive.md +15 -0
- package/skills/cm-dashboard/SKILL.md +20 -9
- package/skills/cm-dashboard/ui/app.js +9 -1
- package/skills/cm-debugging/SKILL.md +9 -0
- package/skills/cm-design-studio/SKILL.archive.md +34 -0
- package/skills/cm-design-studio/SKILL.md +20 -24
- package/skills/cm-design-system/SKILL.md +1 -0
- package/skills/cm-ecosystem-roadmap/SKILL.md +4 -0
- package/skills/cm-engineering-meta/SKILL.archive.md +73 -0
- package/skills/cm-engineering-meta/SKILL.md +19 -62
- package/skills/cm-execution/SKILL.md +98 -0
- package/skills/cm-git-worktrees/SKILL.archive.md +157 -0
- package/skills/cm-git-worktrees/SKILL.md +15 -146
- package/skills/cm-guardian-runtime/SKILL.md +5 -1
- package/skills/cm-identity-guard/SKILL.md +8 -0
- package/skills/cm-mcp-engineering/SKILL.md +4 -0
- package/skills/cm-planning/SKILL.md +63 -92
- package/skills/cm-post-deploy-canary/SKILL.archive.md +22 -0
- package/skills/cm-post-deploy-canary/SKILL.md +20 -12
- package/skills/cm-project-bootstrap/SKILL.md +11 -0
- package/skills/cm-qa-visual-cli/SKILL.archive.md +22 -0
- package/skills/cm-qa-visual-cli/SKILL.md +19 -11
- package/skills/cm-quality-gate/SKILL.md +38 -0
- package/skills/cm-retro-cli/SKILL.md +4 -0
- package/skills/cm-safe-deploy/SKILL.md +9 -0
- package/skills/cm-second-opinion-cli/SKILL.archive.md +23 -0
- package/skills/cm-second-opinion-cli/SKILL.md +20 -13
- package/skills/cm-secret-shield/SKILL.archive.md +580 -0
- package/skills/cm-secret-shield/SKILL.md +15 -569
- package/skills/cm-security-gate/SKILL.archive.md +239 -0
- package/skills/cm-security-gate/SKILL.md +16 -228
- package/skills/cm-skill-chain/SKILL.md +25 -4
- package/skills/cm-skill-evolution/SKILL.md +83 -0
- package/skills/cm-skill-health/SKILL.archive.md +83 -0
- package/skills/cm-skill-health/SKILL.md +26 -0
- package/skills/cm-skill-index/SKILL.md +19 -3
- package/skills/cm-skill-mastery/SKILL.archive.md +156 -0
- package/skills/cm-skill-mastery/SKILL.md +16 -146
- package/skills/cm-skill-search/SKILL.archive.md +49 -0
- package/skills/cm-skill-search/SKILL.md +26 -0
- package/skills/cm-skill-share/SKILL.archive.md +58 -0
- package/skills/cm-skill-share/SKILL.md +26 -0
- package/skills/cm-sprint-bus/SKILL.md +13 -0
- package/skills/cm-start/SKILL.md +17 -10
- package/skills/cm-tdd/SKILL.md +21 -2
- package/skills/cm-terminal/SKILL.md +15 -0
- package/skills/cm-test-gate/SKILL.archive.md +245 -0
- package/skills/cm-test-gate/SKILL.md +15 -234
- package/skills/cm-ui-preview/SKILL.archive.md +153 -0
- package/skills/cm-ui-preview/SKILL.md +16 -143
- package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +1 -1
- package/skills/cm-ux-master/mcp/mcp-config.json +1 -1
- package/skills/cm-ux-master/mcp/server.py +2 -2
- package/skills/profiles/design.txt +1 -1
- package/skills/profiles/full.txt +4 -10
- package/skills/profiles/growth.txt +8 -8
- package/skills/profiles/knowledge.txt +1 -1
- package/skills/profiles/top35.json +41 -0
- package/adapters/antigravity.js +0 -15
- package/adapters/claude-code.js +0 -17
- package/adapters/cursor.js +0 -16
- package/install.sh +0 -1125
- package/scripts/viking-demo.ts +0 -105
- package/skills/cm-ads-tracker/SKILL.md +0 -401
- package/skills/cm-ads-tracker/evals/evals.json +0 -55
- package/skills/cm-ads-tracker/references/gtm-architecture.md +0 -321
- package/skills/cm-ads-tracker/references/industry-events.md +0 -294
- package/skills/cm-ads-tracker/references/platforms-api.md +0 -238
- package/skills/cm-ads-tracker/templates/capi-payload.md +0 -79
- package/skills/cm-ads-tracker/templates/datalayer-push.js +0 -104
- package/skills/cm-ads-tracker/templates/gtm-variables.js +0 -56
- package/skills/cm-auto-publisher/SKILL.md +0 -81
- package/skills/cm-booking-calendar/SKILL.md +0 -521
- package/skills/cm-booking-calendar/references/industry-patterns.md +0 -527
- package/skills/cm-booking-calendar/templates/booking-form.css +0 -626
- package/skills/cm-booking-calendar/templates/booking-form.html +0 -477
- package/skills/cm-booking-calendar/templates/calendar-engine.js +0 -419
- package/skills/cm-booking-calendar/templates/calendar-export.js +0 -395
- package/skills/cm-booking-calendar/templates/reminder-config.js +0 -629
- package/skills/cm-content-factory/.content-factory-state.json +0 -132
- package/skills/cm-content-factory/.git 2/logs/refs/heads/main +0 -1
- package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +0 -1
- 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 +0 -5
- 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 +0 -1
- package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +0 -1
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +0 -76
- package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +0 -1
- package/skills/cm-content-factory/AGENTS.md +0 -61
- package/skills/cm-content-factory/CLAUDE.md +0 -63
- package/skills/cm-content-factory/CURSOR.md +0 -43
- package/skills/cm-content-factory/Content Factory.zip +0 -0
- package/skills/cm-content-factory/SKILL.md +0 -416
- package/skills/cm-content-factory/cf +0 -313
- package/skills/cm-content-factory/config.schema.json +0 -397
- package/skills/cm-content-factory/dashboard/app.js +0 -556
- package/skills/cm-content-factory/dashboard/index.html +0 -397
- package/skills/cm-content-factory/dashboard/style.css +0 -1211
- package/skills/cm-content-factory/examples/01-real-estate.config.json +0 -146
- package/skills/cm-content-factory/examples/02-personal-finance.config.json +0 -146
- package/skills/cm-content-factory/examples/03-health-wellness.config.json +0 -147
- package/skills/cm-content-factory/examples/04-saas-software.config.json +0 -147
- package/skills/cm-content-factory/examples/05-legal-services.config.json +0 -147
- package/skills/cm-content-factory/examples/06-insurance.config.json +0 -146
- package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +0 -146
- package/skills/cm-content-factory/examples/08-online-education.config.json +0 -147
- package/skills/cm-content-factory/examples/09-crypto-defi.config.json +0 -147
- package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +0 -147
- package/skills/cm-content-factory/examples/11-home-services.config.json +0 -146
- package/skills/cm-content-factory/examples/12-dental-clinic.config.json +0 -147
- package/skills/cm-content-factory/examples/13-pet-care.config.json +0 -147
- package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +0 -147
- package/skills/cm-content-factory/examples/15-ai-automation.config.json +0 -147
- package/skills/cm-content-factory/examples/16-wedding-events.config.json +0 -147
- package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +0 -148
- package/skills/cm-content-factory/examples/18-cybersecurity.config.json +0 -147
- package/skills/cm-content-factory/examples/19-food-restaurant.config.json +0 -148
- package/skills/cm-content-factory/examples/20-solar-energy.config.json +0 -147
- package/skills/cm-content-factory/examples/fitness-blog.config.json +0 -116
- package/skills/cm-content-factory/examples/tech-blog.config.json +0 -107
- package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +0 -72
- package/skills/cm-content-factory/extensions/hooks.py +0 -126
- package/skills/cm-content-factory/extensions/openclaw_adapter.py +0 -132
- package/skills/cm-content-factory/landing/docs/content/changelog.md +0 -36
- package/skills/cm-content-factory/landing/docs/content/deployment.md +0 -46
- package/skills/cm-content-factory/landing/docs/content/execution-flow.md +0 -67
- package/skills/cm-content-factory/landing/docs/content/openspace.md +0 -27
- package/skills/cm-content-factory/landing/docs/content/openviking.md +0 -33
- package/skills/cm-content-factory/landing/docs/content/use-cases.md +0 -26
- package/skills/cm-content-factory/landing/docs/content/v5-intro.md +0 -28
- package/skills/cm-content-factory/landing/docs/index.html +0 -240
- package/skills/cm-content-factory/landing/index.html +0 -680
- package/skills/cm-content-factory/landing/script.js +0 -143
- package/skills/cm-content-factory/landing/style.css +0 -1216
- package/skills/cm-content-factory/landing/translations.js +0 -508
- package/skills/cm-content-factory/logs/events.jsonl +0 -11
- package/skills/cm-content-factory/profiles/_template.profile.json +0 -231
- package/skills/cm-content-factory/profiles/finance.profile.json +0 -278
- package/skills/cm-content-factory/profiles/legal.profile.json +0 -263
- package/skills/cm-content-factory/profiles/medical-research.profile.json +0 -321
- package/skills/cm-content-factory/profiles/technology.profile.json +0 -275
- package/skills/cm-content-factory/scripts/agent_dispatcher.py +0 -266
- package/skills/cm-content-factory/scripts/audit.py +0 -106
- package/skills/cm-content-factory/scripts/dashboard_server.py +0 -225
- package/skills/cm-content-factory/scripts/deploy.py +0 -146
- package/skills/cm-content-factory/scripts/extract.py +0 -132
- package/skills/cm-content-factory/scripts/landing_generator.py +0 -459
- package/skills/cm-content-factory/scripts/memory.py +0 -521
- package/skills/cm-content-factory/scripts/monetize.py +0 -239
- package/skills/cm-content-factory/scripts/pipeline.py +0 -357
- package/skills/cm-content-factory/scripts/plan.py +0 -163
- package/skills/cm-content-factory/scripts/publish.py +0 -145
- package/skills/cm-content-factory/scripts/research.py +0 -337
- package/skills/cm-content-factory/scripts/scaffold.py +0 -464
- package/skills/cm-content-factory/scripts/scoreboard.py +0 -336
- package/skills/cm-content-factory/scripts/seo.py +0 -90
- package/skills/cm-content-factory/scripts/state_manager.py +0 -320
- package/skills/cm-content-factory/scripts/token_manager.py +0 -268
- package/skills/cm-content-factory/scripts/validate.py +0 -221
- package/skills/cm-content-factory/scripts/wizard.py +0 -329
- package/skills/cm-content-factory/scripts/write.py +0 -93
- 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 +0 -90
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +0 -54
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +0 -38
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +0 -65
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +0 -48
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +0 -39
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +0 -42
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +0 -51
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +0 -52
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +0 -86
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +0 -80
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +0 -58
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +0 -102
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +0 -29
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +0 -55
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +0 -29
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +0 -41
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +0 -40
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +0 -56
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +0 -46
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +0 -45
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +0 -108
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +0 -22
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +0 -52
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +0 -58
- package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +0 -92
- package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +0 -575
- package/skills/cm-content-factory/tests/conftest.py +0 -66
- package/skills/cm-content-factory/tests/test_agent_dispatcher.py +0 -125
- package/skills/cm-content-factory/tests/test_memory.py +0 -128
- package/skills/cm-content-factory/tests/test_pipeline.py +0 -107
- package/skills/cm-content-factory/tests/test_research.py +0 -56
- package/skills/cm-content-factory/tests/test_state_manager.py +0 -131
- package/skills/cm-content-factory/tests/test_token_manager.py +0 -110
- package/skills/cm-content-factory/tests/test_wizard.py +0 -121
- package/skills/cm-cro-methodology/SKILL.md +0 -290
- package/skills/cm-cro-methodology/references/COPYWRITING.md +0 -178
- package/skills/cm-cro-methodology/references/OBJECTIONS.md +0 -135
- package/skills/cm-cro-methodology/references/PERSUASION.md +0 -158
- package/skills/cm-cro-methodology/references/RESEARCH.md +0 -220
- package/skills/cm-cro-methodology/references/funnel-analysis.md +0 -365
- package/skills/cm-cro-methodology/references/testing-methodology.md +0 -330
- package/skills/cm-google-form/SKILL.md +0 -266
- package/skills/cm-google-form/templates/apps-script.js +0 -55
- package/skills/cm-google-form/templates/form-markup.html +0 -110
- package/skills/cm-google-form/templates/form-submit.js +0 -201
- package/skills/cm-google-form/templates/toast.css +0 -152
- package/skills/cm-growth-hacking/SKILL.md +0 -282
- package/skills/cm-growth-hacking/bottom-sheet-engine.md +0 -261
- package/skills/cm-growth-hacking/calendar-integration.md +0 -264
- package/skills/cm-growth-hacking/references/engagement-patterns.md +0 -346
- package/skills/cm-growth-hacking/templates/bottom-sheet.css +0 -528
- package/skills/cm-growth-hacking/templates/bottom-sheet.js +0 -269
- package/skills/cm-growth-hacking/templates/calendar-cta.js +0 -213
- package/skills/cm-growth-hacking/templates/tracking-events.js +0 -211
- package/skills/cm-growth-hacking/templates/trigger-manager.js +0 -254
- package/skills/cm-growth-hacking/tracking-events.md +0 -246
- package/skills/cm-growth-hacking/trigger-system.md +0 -342
- package/skills/cm-jtbd/SKILL.md +0 -98
- package/skills/cm-notebooklm/SKILL.md +0 -156
- package/skills/cm-notebooklm/references/command_reference.md +0 -94
- package/skills/cm-notebooklm/references/workflows.md +0 -60
- package/skills/cm-notebooklm/resources/knowledge_sources.md +0 -106
- package/skills/cm-notebooklm/scripts/brain-sync.sh +0 -453
- package/skills/cm-notebooklm/scripts/graduate_wisdom.py +0 -101
- package/skills/cm-readit/SKILL.md +0 -289
- package/skills/cm-readit/audio-player.md +0 -206
- package/skills/cm-readit/examples/blog-reader.js +0 -352
- package/skills/cm-readit/examples/voice-cro.js +0 -390
- package/skills/cm-readit/tts-engine.md +0 -262
- package/skills/cm-readit/ui-patterns.md +0 -362
- package/skills/cm-readit/voice-cro.md +0 -223
package/skills/cm-start/SKILL.md
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cm-start
|
|
3
3
|
description: Start the CM Workflow to execute your objective from idea to production code.
|
|
4
|
+
token_budget: 1000
|
|
5
|
+
compressed: true
|
|
6
|
+
deprecated: false
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# Command: `/cm-start [your objective]`
|
|
7
10
|
|
|
11
|
+
## TL;DR
|
|
12
|
+
- **Use to** kick off a CM session — entry point
|
|
13
|
+
- **Detects**: stack (Phase 2), suggests skills, reads continuity + learnings
|
|
14
|
+
- **Next**: cm-brainstorm-idea or cm-planning
|
|
15
|
+
|
|
8
16
|
> **Role: Workflow Orchestrator** — You assess complexity, select the right workflow depth, and drive execution from objective to production code.
|
|
9
17
|
|
|
10
18
|
When this workflow is called, the AI Assistant should execute the following action sequence in the spirit of the **CodyMaster Kit**:
|
|
@@ -13,16 +21,12 @@ When this workflow is called, the AI Assistant should execute the following acti
|
|
|
13
21
|
Per `_shared/helpers.md#Load-Working-Memory` — **use Smart Spine order:**
|
|
14
22
|
1. Check `.cm/context-bus.json` → any active pipeline? any prior skill output to reuse?
|
|
15
23
|
2. Load L0 indexes: `learnings-index.md` (~100 tok) + `skeleton-index.md` (~500 tok)
|
|
16
|
-
> **If OpenViking backend active:** Skip step 2 — engine auto-serves L0/L1 via `cm_resolve`.
|
|
17
24
|
3. Scope-filter learnings via `cm_query` — only load what matches current objective
|
|
18
|
-
> **If OpenViking:** `cm_query` uses vector semantic search — broader recall, fewer missed learnings.
|
|
19
25
|
4. Read `CONTINUITY.md` → set Active Goal to the new objective
|
|
20
26
|
5. Run token budget check: `cm continuity budget` → confirm no category is over soft limit
|
|
21
27
|
|
|
22
28
|
> ⚡ Total context load: ~700 tokens. Full load used to be ~3,200.
|
|
23
29
|
> Only escalate to L2 (full files) if L0 index explicitly flags a match.
|
|
24
|
-
> With OpenViking: L0 is auto-maintained — no stale index risk.
|
|
25
|
-
|
|
26
30
|
0.5. **Skill Coverage Check (Adaptive Discovery):**
|
|
27
31
|
- Scan the objective for technologies, frameworks, or patterns mentioned
|
|
28
32
|
- Cross-reference with `cm-skill-index` Layer 1 triggers
|
|
@@ -30,6 +34,15 @@ When this workflow is called, the AI Assistant should execute the following acti
|
|
|
30
34
|
`npx skills find "{keyword}"` → review → ask user → install if approved
|
|
31
35
|
- Log any discovered skills to `.cm-skills-log.json`
|
|
32
36
|
|
|
37
|
+
0.6. **Stack & Tier Detection (Phase 2):**
|
|
38
|
+
- `cm stack detect --write` → writes `.cm/project-skills.md` (frameworks + suggested skills)
|
|
39
|
+
- `cm tier classify --write` → writes `.cm/project-tier.md` (LITE/STANDARD/PROFESSIONAL/ENTERPRISE)
|
|
40
|
+
- The tier sets the default Vibecoding mode and **adaptive depth**:
|
|
41
|
+
- LITE/STANDARD → render skill TL;DR only
|
|
42
|
+
- PROFESSIONAL/ENTERPRISE → render full protocol
|
|
43
|
+
- Inject the suggested-skills list into the skill chain shortlist
|
|
44
|
+
- These reports are token-light (~300 tok combined) and skipped if files exist and are <24h old
|
|
45
|
+
|
|
33
46
|
0.7. **Code Intelligence Setup (cm-codeintell):**
|
|
34
47
|
- **ALWAYS:** Run skeleton indexer → `bash scripts/index-codebase.sh` → `.cm/skeleton.md`
|
|
35
48
|
- Read `.cm/skeleton.md` (~5K tokens) → instant codebase understanding
|
|
@@ -85,11 +98,5 @@ When this workflow is called, the AI Assistant should execute the following acti
|
|
|
85
98
|
- Record any new learnings or decisions made during this workflow
|
|
86
99
|
- If inside a skill chain: `cm continuity bus` → verify context bus reflects completed step
|
|
87
100
|
- Refresh L0 indexes: `cm continuity index` (auto-runs on `addLearning`, manual refresh here)
|
|
88
|
-
> **If OpenViking:** Skip manual index refresh — engine maintains L0/L1 automatically.
|
|
89
|
-
|
|
90
101
|
> **Note for AI:** If this is a brand new project, suggest running `cm-project-bootstrap` first.
|
|
91
102
|
> If the working environment has a risk of accidentally switching accounts/projects, remind about `cm-identity-guard` (Per `_shared/helpers.md#Identity-Check`).
|
|
92
|
-
>
|
|
93
|
-
> **OpenViking tip:** If the project uses many learnings/decisions (>100 entries) or needs semantic
|
|
94
|
-
> search beyond keyword matching, suggest switching to the Viking backend:
|
|
95
|
-
> `storage.backend: viking` in `.cm/config.yaml` + `pip install openviking && openviking start`
|
package/skills/cm-tdd/SKILL.md
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
## name: cm-tdd
|
|
2
|
+
name: cm-tdd
|
|
4
3
|
description: Use when implementing any feature or bugfix, before writing implementation code
|
|
4
|
+
token_budget: 1500
|
|
5
|
+
compressed: true
|
|
6
|
+
deprecated: false
|
|
7
|
+
---
|
|
5
8
|
|
|
6
9
|
# Test-Driven Development (TDD)
|
|
7
10
|
|
|
11
|
+
## TL;DR
|
|
12
|
+
- **Use when** writing or fixing any feature/bugfix
|
|
13
|
+
- **Cycle**: red (failing test) → green (minimal code) → refactor
|
|
14
|
+
- **No prod code** without a failing test first
|
|
15
|
+
- **Next**: cm-execution or cm-code-review
|
|
16
|
+
|
|
8
17
|
## Overview
|
|
9
18
|
|
|
10
19
|
Write the test first. Watch it fail. Write minimal code to pass.
|
|
@@ -352,6 +361,16 @@ Bug found? Write failing test reproducing it. Follow TDD cycle. Test proves fix
|
|
|
352
361
|
|
|
353
362
|
Never fix bugs without a test.
|
|
354
363
|
|
|
364
|
+
## Karpathy Discipline — Goal-Driven Execution
|
|
365
|
+
|
|
366
|
+
TDD is the canonical form of goal-driven execution. Reinforce it:
|
|
367
|
+
- **Translate vague tasks into verifiable goals before writing code.**
|
|
368
|
+
- "Add validation" → "Test invalid inputs fail; valid inputs pass."
|
|
369
|
+
- "Fix the bug" → "Test reproduces it red; fix turns it green."
|
|
370
|
+
- "Refactor X" → "Same tests green before and after."
|
|
371
|
+
- **Strong success criteria let you loop independently.** Weak criteria ("make it work") force the user to babysit.
|
|
372
|
+
- **Minimum code to pass.** Don't over-implement to "anticipate" the next test — write that test first.
|
|
373
|
+
|
|
355
374
|
## Final Rule
|
|
356
375
|
|
|
357
376
|
```
|
|
@@ -85,6 +85,21 @@ ERROR PATTERNS TO DETECT:
|
|
|
85
85
|
- Warning patterns that indicate real problems
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
+
### Step 4b: Compress Before Quoting
|
|
89
|
+
|
|
90
|
+
**Before pasting stdout into TaskSummary or model context:**
|
|
91
|
+
|
|
92
|
+
| Command pattern | Rule |
|
|
93
|
+
|-----------------|------|
|
|
94
|
+
| `git status` | Keep only changed entries + branch line + `(N changed)` count. Drop "use git add…" boilerplate. |
|
|
95
|
+
| `npm test` / `vitest` / `jest` | Keep failing tests + summary line. Drop `PASS` lines. |
|
|
96
|
+
| `npm run build` / `tsc` | Keep `error` / `warning` / final status. Drop incremental progress. |
|
|
97
|
+
| Any output | Collapse runs of ≥ 3 identical lines into `<line> … (× N)`. |
|
|
98
|
+
|
|
99
|
+
**Helper:** `src/utils/output-compress.ts` — `compressGitStatus`, `compressNpmTest`, `summarizeBuildLog`, `collapseRepeatedLines`, `compressFor(command, stdout)`.
|
|
100
|
+
|
|
101
|
+
**Anti-pattern:** Pasting full stdout (> 50 lines) into TaskSummary when only the failing portion matters. Compress first, then quote.
|
|
102
|
+
|
|
88
103
|
### Step 5: Stop on Error
|
|
89
104
|
|
|
90
105
|
**If ANY error is detected:**
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cm-test-gate
|
|
3
|
+
description: Complete guide to setting up a reliable test gate for any project — covers stack detection, 4 core test files, script wiring, secret hygiene, and Cloudflare Workers/Pages patterns. Use when starting a new project, adding CI to an existing one, or when "tests pass but production breaks." Companion to cm-safe-deploy and cm-project-bootstrap.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# cm-test-gate: Multi-Layer Test Gate Setup
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
A deployment process without a test gate is just shipping code and praying. The `test:gate` script is your first line of defense before deployment. A test gate MUST verify four things: frontend component safety, backend API behavior, core business logic, and i18n synchronization.
|
|
11
|
+
|
|
12
|
+
**Core assumption:** The most dangerous errors are syntax flaws, variable shadowing, or import failures that tests often skip if they only check logic.
|
|
13
|
+
|
|
14
|
+
**Violating the letter of this process is violating the spirit of quality engineering.**
|
|
15
|
+
|
|
16
|
+
## The Protocol
|
|
17
|
+
|
|
18
|
+
When setting up a test gate for a project, follow these 5 phases in order.
|
|
19
|
+
|
|
20
|
+
### Phase 1: Stack Detection and Environment Setup
|
|
21
|
+
|
|
22
|
+
**Goal:** Identify the framework and install the correct testing dependencies.
|
|
23
|
+
|
|
24
|
+
1. **Detect Stack:**
|
|
25
|
+
- Check `package.json` for framework (React, Vue, Svelte, static HTML) and build tool (Vite, Next.js).
|
|
26
|
+
- Check for `wrangler.json(c)` (Cloudflare Workers/Pages).
|
|
27
|
+
- Check for Tailwind, PostCSS, or specific UI libraries.
|
|
28
|
+
|
|
29
|
+
2. **Install Dependencies (Example: Vite/Vitest):**
|
|
30
|
+
```bash
|
|
31
|
+
# Install vitest and related tools
|
|
32
|
+
npm install -D vitest jsdom @testing-library/react @testing-library/jest-dom
|
|
33
|
+
# (Adjust based on framework: e.g., @testing-library/svelte)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **Configure File:**
|
|
37
|
+
- Create `vitest.config.ts` (or `.js`):
|
|
38
|
+
```typescript
|
|
39
|
+
import { defineConfig } from 'vitest/config'
|
|
40
|
+
// Import framework plugin (e.g., react(), svelte())
|
|
41
|
+
|
|
42
|
+
export default defineConfig({
|
|
43
|
+
test: {
|
|
44
|
+
environment: 'jsdom',
|
|
45
|
+
globals: true,
|
|
46
|
+
setupFiles: ['./test/setup.ts'], // Optional
|
|
47
|
+
},
|
|
48
|
+
})
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Phase 2: The 4 Core Test Files
|
|
52
|
+
|
|
53
|
+
A complete `test:gate` must cover four distinct layers. Do not combine these files.
|
|
54
|
+
|
|
55
|
+
#### Layer 1: Frontend Safety (`frontend-safety.test.ts`)
|
|
56
|
+
This layer prevents white screens and catastrophic syntax errors in the browser. Emphasize parsing and template rendering over logical assertions.
|
|
57
|
+
|
|
58
|
+
*Use the exact implementation from `cm-quality-gate` regarding the 4 corruption checks.*
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { test, expect } from 'vitest';
|
|
62
|
+
import fs from 'fs';
|
|
63
|
+
import path from 'path';
|
|
64
|
+
|
|
65
|
+
test('app.js does not contain catastrophic syntax corruption', () => {
|
|
66
|
+
// 1. Read the raw file
|
|
67
|
+
const content = fs.readFileSync(path.resolve(__dirname, '../public/static/app.js'), 'utf-8');
|
|
68
|
+
|
|
69
|
+
// 2. Syntax Validation (Check for broken template literals)
|
|
70
|
+
// ❌ Bug #1: Single-quote wrapping template string
|
|
71
|
+
expect(content).not.toMatch(/=\s*'[^']*\$\{t\(/);
|
|
72
|
+
|
|
73
|
+
// 3. Delimiter consistency
|
|
74
|
+
// ❌ Bug #4: Mismatched delimiters
|
|
75
|
+
expect(content).not.toMatch(/t\('[^']*\`/);
|
|
76
|
+
expect(content).not.toMatch(/t\(\`[^']*'\)/);
|
|
77
|
+
|
|
78
|
+
// 4. HTML structure integrity
|
|
79
|
+
// ❌ Bug #2: Spaces inside tags or broken closers
|
|
80
|
+
expect(content).not.toMatch(/<\s+[a-zA-Z]/); // e.g., "< div"
|
|
81
|
+
expect(content).not.toMatch(/<\/\s+[a-zA-Z]/); // e.g., "</ div"
|
|
82
|
+
expect(content).not.toMatch(/--\s+>/); // e.g., "text-- >"
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### Layer 2: API Routes (`api-routes.test.ts`)
|
|
87
|
+
This layer ensures backend endpoints respond correctly and handle JSON properly.
|
|
88
|
+
|
|
89
|
+
*Example for a generic fetch wrapper or specific Next.js/Worker handler:*
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { test, expect } from 'vitest';
|
|
93
|
+
|
|
94
|
+
test('API mock test', async () => {
|
|
95
|
+
// Test your server handlers directly
|
|
96
|
+
// Ensure 200 OK for valid inputs and 400 for errors
|
|
97
|
+
expect(true).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Layer 3: Business Logic (`business-logic.test.ts`)
|
|
102
|
+
This layer tests pure functions: calculations, validations, and data transformations.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { test, expect } from 'vitest';
|
|
106
|
+
|
|
107
|
+
test('Calculates score correctly', () => {
|
|
108
|
+
// const result = calculateScore(input);
|
|
109
|
+
// expect(result).toBe(expected);
|
|
110
|
+
expect(true).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### Layer 4: i18n Synchronization (`i18n-sync.test.ts`)
|
|
115
|
+
This layer guarantees that language files are complete and identical in structure.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { test, expect } from 'vitest';
|
|
119
|
+
import fs from 'fs';
|
|
120
|
+
import path from 'path';
|
|
121
|
+
|
|
122
|
+
test('i18n files have identical key counts', () => {
|
|
123
|
+
const langDir = path.resolve(__dirname, '../public/static/i18n');
|
|
124
|
+
const langs = ['vi.json', 'en.json', 'th.json', 'ph.json'];
|
|
125
|
+
|
|
126
|
+
const countKeys = (obj: any): number => {
|
|
127
|
+
let count = 0;
|
|
128
|
+
for (const k in obj) {
|
|
129
|
+
if (typeof obj[k] === 'object' && obj[k] !== null) {
|
|
130
|
+
count += countKeys(obj[k]);
|
|
131
|
+
} else {
|
|
132
|
+
count++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return count;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
let baseCount = -1;
|
|
139
|
+
for (const file of langs) {
|
|
140
|
+
if (!fs.existsSync(path.join(langDir, file))) continue;
|
|
141
|
+
|
|
142
|
+
const data = JSON.parse(fs.readFileSync(path.join(langDir, file), 'utf-8'));
|
|
143
|
+
const count = countKeys(data);
|
|
144
|
+
|
|
145
|
+
if (baseCount === -1) {
|
|
146
|
+
baseCount = count;
|
|
147
|
+
} else {
|
|
148
|
+
expect(count, `File ${file} has a different key count`).toBe(baseCount);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
#### Layer 5: Security Scan (`security-scan.test.ts`)
|
|
155
|
+
This layer prevents secrets from being committed to the repository. Powered by `cm-secret-shield` patterns.
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { test, expect } from 'vitest';
|
|
159
|
+
import fs from 'fs';
|
|
160
|
+
import { execSync } from 'child_process';
|
|
161
|
+
|
|
162
|
+
test('no secret files tracked by git', () => {
|
|
163
|
+
const tracked = execSync('git ls-files', { encoding: 'utf-8' });
|
|
164
|
+
const badFiles = ['.env', '.dev.vars', '.env.local', '.env.production'];
|
|
165
|
+
const found = badFiles.filter(f => tracked.split('\n').includes(f));
|
|
166
|
+
expect(found, `Secret files tracked: ${found.join(', ')}`).toEqual([]);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('.gitignore contains required security patterns', () => {
|
|
170
|
+
const gitignore = fs.readFileSync('.gitignore', 'utf-8');
|
|
171
|
+
expect(gitignore).toContain('.env');
|
|
172
|
+
expect(gitignore).toContain('.dev.vars');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('no hardcoded secrets in source files', () => {
|
|
176
|
+
const dangerousPatterns = [
|
|
177
|
+
/SERVICE_KEY\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}/g,
|
|
178
|
+
/PRIVATE_KEY\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}/g,
|
|
179
|
+
/-----BEGIN.*PRIVATE KEY-----/g,
|
|
180
|
+
];
|
|
181
|
+
const srcDir = 'src';
|
|
182
|
+
if (!fs.existsSync(srcDir)) return;
|
|
183
|
+
const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.ts') || f.endsWith('.js'));
|
|
184
|
+
for (const file of files) {
|
|
185
|
+
const content = fs.readFileSync(`${srcDir}/${file}`, 'utf-8');
|
|
186
|
+
for (const pattern of dangerousPatterns) {
|
|
187
|
+
expect(content, `${file} contains potential secret`).not.toMatch(pattern);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Phase 3: Script Wiring
|
|
194
|
+
|
|
195
|
+
Wire these tests into `package.json` to make them easily executable by CI or other skills.
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"scripts": {
|
|
200
|
+
"test": "vitest",
|
|
201
|
+
"test:gate": "vitest run --reporter=verbose",
|
|
202
|
+
"test:security": "snyk test && aikido-api-client scan-release $npm_package_name $(git rev-parse HEAD) --minimum-severity-level=HIGH",
|
|
203
|
+
"test:watch": "vitest watch"
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
> **Security Gate Check:** The `test:security` script runs the Snyk dependency check and the Aikido release scan in parallel. See `cm-security-gate` for advanced SAST/IaC flags.
|
|
209
|
+
|
|
210
|
+
### Phase 4: Secret Hygiene and Ignore Configuration
|
|
211
|
+
|
|
212
|
+
**NEVER commit `.env` or `.dev.vars`.** Ensure tests do not expose actual production secrets.
|
|
213
|
+
|
|
214
|
+
1. **Check `.gitignore`:**
|
|
215
|
+
```bash
|
|
216
|
+
grep -E "node_modules|\.env|\.dev\.vars" .gitignore
|
|
217
|
+
# Must exist, if not, add them.
|
|
218
|
+
```
|
|
219
|
+
2. **Define Mock Env:**
|
|
220
|
+
Create a `.env.test` file (this CAN be committed) with safe, mock values if needed by the test environment.
|
|
221
|
+
|
|
222
|
+
### Phase 5: Verification
|
|
223
|
+
|
|
224
|
+
Run the test gate to prove it works before declaring the task complete.
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
npm run test:gate
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Integration with Other Skills
|
|
231
|
+
|
|
232
|
+
| Skill | Relationship |
|
|
233
|
+
|---|---|
|
|
234
|
+
| `cm-safe-deploy` | `test:gate` is Gate 2 in the safe deploy pipeline. |
|
|
235
|
+
| `cm-project-bootstrap` | Should invoke `cm-test-gate` during Phase 7 (Infrastructure Setup). |
|
|
236
|
+
| `cm-safe-i18n` | Relies on the i18n tests set up in Phase 2, Layer 4. |
|
|
237
|
+
| `cm-secret-shield` | Layer 5 security scan uses Secret Shield patterns. |
|
|
238
|
+
|
|
239
|
+
## Red Flags - STOP and Fix
|
|
240
|
+
|
|
241
|
+
- Setting up tests but not creating the `test:gate` run script.
|
|
242
|
+
- Combining all tests into one massive `app.test.js` file.
|
|
243
|
+
- Skipping the `frontend-safety.test.ts` layer for SPA/monolith projects.
|
|
244
|
+
- Using real production database credentials in the test setup.
|
|
245
|
+
- Ignoring test failures and proceeding anyway.
|
|
@@ -1,245 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cm-test-gate
|
|
3
|
-
description:
|
|
3
|
+
description: "[Deprecated] quality gate now covers tests + canary. Use `cm-quality-gate` instead."
|
|
4
|
+
deprecated: true
|
|
5
|
+
merged_into: cm-quality-gate
|
|
4
6
|
---
|
|
5
7
|
|
|
6
|
-
# cm-test-gate
|
|
8
|
+
# cm-test-gate — Deprecated
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
> ⚠️ This skill is deprecated as of CodyMaster v6.0.0 and will be removed in v6.1.0.
|
|
11
|
+
>
|
|
12
|
+
> **Use `cm-quality-gate` instead.** quality gate now covers tests + canary.
|
|
13
|
+
>
|
|
14
|
+
> See [docs/migration-v2.md](../../docs/migration-v2.md) for the full mapping.
|
|
9
15
|
|
|
10
|
-
|
|
16
|
+
The original content is preserved at [SKILL.archive.md](SKILL.archive.md) for reference.
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
**Violating the letter of this process is violating the spirit of quality engineering.**
|
|
15
|
-
|
|
16
|
-
## The Protocol
|
|
17
|
-
|
|
18
|
-
When setting up a test gate for a project, follow these 5 phases in order.
|
|
19
|
-
|
|
20
|
-
### Phase 1: Stack Detection and Environment Setup
|
|
21
|
-
|
|
22
|
-
**Goal:** Identify the framework and install the correct testing dependencies.
|
|
23
|
-
|
|
24
|
-
1. **Detect Stack:**
|
|
25
|
-
- Check `package.json` for framework (React, Vue, Svelte, static HTML) and build tool (Vite, Next.js).
|
|
26
|
-
- Check for `wrangler.json(c)` (Cloudflare Workers/Pages).
|
|
27
|
-
- Check for Tailwind, PostCSS, or specific UI libraries.
|
|
28
|
-
|
|
29
|
-
2. **Install Dependencies (Example: Vite/Vitest):**
|
|
30
|
-
```bash
|
|
31
|
-
# Install vitest and related tools
|
|
32
|
-
npm install -D vitest jsdom @testing-library/react @testing-library/jest-dom
|
|
33
|
-
# (Adjust based on framework: e.g., @testing-library/svelte)
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
3. **Configure File:**
|
|
37
|
-
- Create `vitest.config.ts` (or `.js`):
|
|
38
|
-
```typescript
|
|
39
|
-
import { defineConfig } from 'vitest/config'
|
|
40
|
-
// Import framework plugin (e.g., react(), svelte())
|
|
41
|
-
|
|
42
|
-
export default defineConfig({
|
|
43
|
-
test: {
|
|
44
|
-
environment: 'jsdom',
|
|
45
|
-
globals: true,
|
|
46
|
-
setupFiles: ['./test/setup.ts'], // Optional
|
|
47
|
-
},
|
|
48
|
-
})
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Phase 2: The 4 Core Test Files
|
|
52
|
-
|
|
53
|
-
A complete `test:gate` must cover four distinct layers. Do not combine these files.
|
|
54
|
-
|
|
55
|
-
#### Layer 1: Frontend Safety (`frontend-safety.test.ts`)
|
|
56
|
-
This layer prevents white screens and catastrophic syntax errors in the browser. Emphasize parsing and template rendering over logical assertions.
|
|
57
|
-
|
|
58
|
-
*Use the exact implementation from `cm-quality-gate` regarding the 4 corruption checks.*
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
import { test, expect } from 'vitest';
|
|
62
|
-
import fs from 'fs';
|
|
63
|
-
import path from 'path';
|
|
64
|
-
|
|
65
|
-
test('app.js does not contain catastrophic syntax corruption', () => {
|
|
66
|
-
// 1. Read the raw file
|
|
67
|
-
const content = fs.readFileSync(path.resolve(__dirname, '../public/static/app.js'), 'utf-8');
|
|
68
|
-
|
|
69
|
-
// 2. Syntax Validation (Check for broken template literals)
|
|
70
|
-
// ❌ Bug #1: Single-quote wrapping template string
|
|
71
|
-
expect(content).not.toMatch(/=\s*'[^']*\$\{t\(/);
|
|
72
|
-
|
|
73
|
-
// 3. Delimiter consistency
|
|
74
|
-
// ❌ Bug #4: Mismatched delimiters
|
|
75
|
-
expect(content).not.toMatch(/t\('[^']*\`/);
|
|
76
|
-
expect(content).not.toMatch(/t\(\`[^']*'\)/);
|
|
77
|
-
|
|
78
|
-
// 4. HTML structure integrity
|
|
79
|
-
// ❌ Bug #2: Spaces inside tags or broken closers
|
|
80
|
-
expect(content).not.toMatch(/<\s+[a-zA-Z]/); // e.g., "< div"
|
|
81
|
-
expect(content).not.toMatch(/<\/\s+[a-zA-Z]/); // e.g., "</ div"
|
|
82
|
-
expect(content).not.toMatch(/--\s+>/); // e.g., "text-- >"
|
|
83
|
-
});
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
#### Layer 2: API Routes (`api-routes.test.ts`)
|
|
87
|
-
This layer ensures backend endpoints respond correctly and handle JSON properly.
|
|
88
|
-
|
|
89
|
-
*Example for a generic fetch wrapper or specific Next.js/Worker handler:*
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
import { test, expect } from 'vitest';
|
|
93
|
-
|
|
94
|
-
test('API mock test', async () => {
|
|
95
|
-
// Test your server handlers directly
|
|
96
|
-
// Ensure 200 OK for valid inputs and 400 for errors
|
|
97
|
-
expect(true).toBe(true);
|
|
98
|
-
});
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
#### Layer 3: Business Logic (`business-logic.test.ts`)
|
|
102
|
-
This layer tests pure functions: calculations, validations, and data transformations.
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
import { test, expect } from 'vitest';
|
|
106
|
-
|
|
107
|
-
test('Calculates score correctly', () => {
|
|
108
|
-
// const result = calculateScore(input);
|
|
109
|
-
// expect(result).toBe(expected);
|
|
110
|
-
expect(true).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
#### Layer 4: i18n Synchronization (`i18n-sync.test.ts`)
|
|
115
|
-
This layer guarantees that language files are complete and identical in structure.
|
|
116
|
-
|
|
117
|
-
```typescript
|
|
118
|
-
import { test, expect } from 'vitest';
|
|
119
|
-
import fs from 'fs';
|
|
120
|
-
import path from 'path';
|
|
121
|
-
|
|
122
|
-
test('i18n files have identical key counts', () => {
|
|
123
|
-
const langDir = path.resolve(__dirname, '../public/static/i18n');
|
|
124
|
-
const langs = ['vi.json', 'en.json', 'th.json', 'ph.json'];
|
|
125
|
-
|
|
126
|
-
const countKeys = (obj: any): number => {
|
|
127
|
-
let count = 0;
|
|
128
|
-
for (const k in obj) {
|
|
129
|
-
if (typeof obj[k] === 'object' && obj[k] !== null) {
|
|
130
|
-
count += countKeys(obj[k]);
|
|
131
|
-
} else {
|
|
132
|
-
count++;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return count;
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
let baseCount = -1;
|
|
139
|
-
for (const file of langs) {
|
|
140
|
-
if (!fs.existsSync(path.join(langDir, file))) continue;
|
|
141
|
-
|
|
142
|
-
const data = JSON.parse(fs.readFileSync(path.join(langDir, file), 'utf-8'));
|
|
143
|
-
const count = countKeys(data);
|
|
144
|
-
|
|
145
|
-
if (baseCount === -1) {
|
|
146
|
-
baseCount = count;
|
|
147
|
-
} else {
|
|
148
|
-
expect(count, `File ${file} has a different key count`).toBe(baseCount);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
#### Layer 5: Security Scan (`security-scan.test.ts`)
|
|
155
|
-
This layer prevents secrets from being committed to the repository. Powered by `cm-secret-shield` patterns.
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
import { test, expect } from 'vitest';
|
|
159
|
-
import fs from 'fs';
|
|
160
|
-
import { execSync } from 'child_process';
|
|
161
|
-
|
|
162
|
-
test('no secret files tracked by git', () => {
|
|
163
|
-
const tracked = execSync('git ls-files', { encoding: 'utf-8' });
|
|
164
|
-
const badFiles = ['.env', '.dev.vars', '.env.local', '.env.production'];
|
|
165
|
-
const found = badFiles.filter(f => tracked.split('\n').includes(f));
|
|
166
|
-
expect(found, `Secret files tracked: ${found.join(', ')}`).toEqual([]);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
test('.gitignore contains required security patterns', () => {
|
|
170
|
-
const gitignore = fs.readFileSync('.gitignore', 'utf-8');
|
|
171
|
-
expect(gitignore).toContain('.env');
|
|
172
|
-
expect(gitignore).toContain('.dev.vars');
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
test('no hardcoded secrets in source files', () => {
|
|
176
|
-
const dangerousPatterns = [
|
|
177
|
-
/SERVICE_KEY\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}/g,
|
|
178
|
-
/PRIVATE_KEY\s*[=:]\s*['"][a-zA-Z0-9/+=]{20,}/g,
|
|
179
|
-
/-----BEGIN.*PRIVATE KEY-----/g,
|
|
180
|
-
];
|
|
181
|
-
const srcDir = 'src';
|
|
182
|
-
if (!fs.existsSync(srcDir)) return;
|
|
183
|
-
const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.ts') || f.endsWith('.js'));
|
|
184
|
-
for (const file of files) {
|
|
185
|
-
const content = fs.readFileSync(`${srcDir}/${file}`, 'utf-8');
|
|
186
|
-
for (const pattern of dangerousPatterns) {
|
|
187
|
-
expect(content, `${file} contains potential secret`).not.toMatch(pattern);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Phase 3: Script Wiring
|
|
194
|
-
|
|
195
|
-
Wire these tests into `package.json` to make them easily executable by CI or other skills.
|
|
196
|
-
|
|
197
|
-
```json
|
|
198
|
-
{
|
|
199
|
-
"scripts": {
|
|
200
|
-
"test": "vitest",
|
|
201
|
-
"test:gate": "vitest run --reporter=verbose",
|
|
202
|
-
"test:security": "snyk test && aikido-api-client scan-release $npm_package_name $(git rev-parse HEAD) --minimum-severity-level=HIGH",
|
|
203
|
-
"test:watch": "vitest watch"
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
> **Security Gate Check:** The `test:security` script runs the Snyk dependency check and the Aikido release scan in parallel. See `cm-security-gate` for advanced SAST/IaC flags.
|
|
209
|
-
|
|
210
|
-
### Phase 4: Secret Hygiene and Ignore Configuration
|
|
211
|
-
|
|
212
|
-
**NEVER commit `.env` or `.dev.vars`.** Ensure tests do not expose actual production secrets.
|
|
213
|
-
|
|
214
|
-
1. **Check `.gitignore`:**
|
|
215
|
-
```bash
|
|
216
|
-
grep -E "node_modules|\.env|\.dev\.vars" .gitignore
|
|
217
|
-
# Must exist, if not, add them.
|
|
218
|
-
```
|
|
219
|
-
2. **Define Mock Env:**
|
|
220
|
-
Create a `.env.test` file (this CAN be committed) with safe, mock values if needed by the test environment.
|
|
221
|
-
|
|
222
|
-
### Phase 5: Verification
|
|
223
|
-
|
|
224
|
-
Run the test gate to prove it works before declaring the task complete.
|
|
18
|
+
## Migration
|
|
225
19
|
|
|
226
20
|
```bash
|
|
227
|
-
|
|
21
|
+
# Old: cm <use this skill>
|
|
22
|
+
# New (v6.0+): cm quality-gate <equivalent action>
|
|
228
23
|
```
|
|
229
24
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
| Skill | Relationship |
|
|
233
|
-
|---|---|
|
|
234
|
-
| `cm-safe-deploy` | `test:gate` is Gate 2 in the safe deploy pipeline. |
|
|
235
|
-
| `cm-project-bootstrap` | Should invoke `cm-test-gate` during Phase 7 (Infrastructure Setup). |
|
|
236
|
-
| `cm-safe-i18n` | Relies on the i18n tests set up in Phase 2, Layer 4. |
|
|
237
|
-
| `cm-secret-shield` | Layer 5 security scan uses Secret Shield patterns. |
|
|
238
|
-
|
|
239
|
-
## Red Flags - STOP and Fix
|
|
240
|
-
|
|
241
|
-
- Setting up tests but not creating the `test:gate` run script.
|
|
242
|
-
- Combining all tests into one massive `app.test.js` file.
|
|
243
|
-
- Skipping the `frontend-safety.test.ts` layer for SPA/monolith projects.
|
|
244
|
-
- Using real production database credentials in the test setup.
|
|
245
|
-
- Ignoring test failures and proceeding anyway.
|
|
25
|
+
If you depend on a capability that didn't carry over, please file an issue:
|
|
26
|
+
https://github.com/tody-agent/codymaster/issues
|