@kensaurus/skills 0.0.0-stage → 2.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/.claude-plugin/marketplace.json +53 -0
- package/.claude-plugin/plugin.json +40 -0
- package/.cursor-plugin/plugin.json +38 -0
- package/.mcp.json +28 -0
- package/CHANGELOG.md +1761 -0
- package/LICENSE +21 -0
- package/NOTICE +13 -0
- package/README.md +820 -2
- package/SECURITY.md +55 -0
- package/agents/code-reviewer.md +60 -0
- package/agents/completion-judge.md +89 -0
- package/agents/db-migrator.md +125 -0
- package/agents/debugger.md +47 -0
- package/agents/deploy-checker.md +100 -0
- package/agents/perf-monitor.md +74 -0
- package/assets/favicon.png +0 -0
- package/assets/logo-light.png +0 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +6 -0
- package/assets/og.png +0 -0
- package/bin/install.mjs +1127 -0
- package/bin/kenji.js +2 -0
- package/commands/adr.md +17 -0
- package/commands/aeo-plan.md +18 -0
- package/commands/arch-boundaries.md +17 -0
- package/commands/aso-plan.md +18 -0
- package/commands/auth-flows.md +19 -0
- package/commands/backup-plan.md +17 -0
- package/commands/burndown-full.md +25 -0
- package/commands/capacitor-plan.md +18 -0
- package/commands/codemod-safety.md +22 -0
- package/commands/commit.md +18 -0
- package/commands/complete-everything.md +40 -0
- package/commands/cost-plan.md +19 -0
- package/commands/deadcode-plan.md +26 -0
- package/commands/deadcode.md +32 -0
- package/commands/debug-issue.md +17 -0
- package/commands/deps-plan.md +18 -0
- package/commands/docs-plan.md +17 -0
- package/commands/doctrine.md +19 -0
- package/commands/error-plan.md +19 -0
- package/commands/feedback-to-closure.md +36 -0
- package/commands/fix-issue.md +76 -0
- package/commands/gate-logic.md +26 -0
- package/commands/green-repo.md +36 -0
- package/commands/grill-me.md +19 -0
- package/commands/gtm-plan.md +21 -0
- package/commands/gtm-weekly.md +17 -0
- package/commands/gtm.md +22 -0
- package/commands/handoff.md +15 -0
- package/commands/housekeep-backlog.md +18 -0
- package/commands/housekeep-files.md +22 -0
- package/commands/housekeep-gates.md +18 -0
- package/commands/instant-nav.md +11 -0
- package/commands/integrity-plan.md +19 -0
- package/commands/launch-kit.md +16 -0
- package/commands/mcp-guide.md +40 -0
- package/commands/mobile-plan.md +19 -0
- package/commands/native-rn-monorepo/README.md +78 -0
- package/commands/native-rn-monorepo/android-build.md +26 -0
- package/commands/native-rn-monorepo/android-install.md +32 -0
- package/commands/native-rn-monorepo/android-logcat.md +37 -0
- package/commands/native-rn-monorepo/ios-ci-logs.md +56 -0
- package/commands/native-rn-monorepo/ios-ci-status.md +52 -0
- package/commands/native-rn-monorepo/ios-ci-trigger.md +59 -0
- package/commands/native-rn-monorepo/rn-reset.md +50 -0
- package/commands/native-rn-monorepo/rn-ship-ios.md +67 -0
- package/commands/native-rn-monorepo/rn-verify.md +53 -0
- package/commands/perf-plan.md +18 -0
- package/commands/plan-mode.md +74 -0
- package/commands/pr.md +16 -0
- package/commands/pricing-plan.md +20 -0
- package/commands/privacy-plan.md +18 -0
- package/commands/readability.md +12 -0
- package/commands/readme.md +15 -0
- package/commands/refactor.md +15 -0
- package/commands/release-prep.md +17 -0
- package/commands/research.md +25 -0
- package/commands/responsive-audit.md +21 -0
- package/commands/review-code.md +18 -0
- package/commands/rls-plan.md +18 -0
- package/commands/secrets-plan.md +18 -0
- package/commands/security-plan.md +19 -0
- package/commands/ship-and-observe.md +36 -0
- package/commands/skill-conflicts.md +19 -0
- package/commands/slop-plan.md +18 -0
- package/commands/stub-plan.md +18 -0
- package/commands/test-mutation.md +16 -0
- package/commands/test-plan.md +17 -0
- package/commands/test.md +29 -0
- package/commands/thirdparty-web-interface-guidelines.md +185 -0
- package/commands/uiux-plan.md +18 -0
- package/commands/uiux.md +45 -0
- package/commands/update-deps.md +21 -0
- package/commands/validation-plan.md +19 -0
- package/commands-portable/fix-issue.md +72 -0
- package/commands-portable/plan-mode.md +92 -0
- package/commands-portable/research.md +91 -0
- package/docs/screenshots/README.md +5 -0
- package/docs/screenshots/audit-dark.png +0 -0
- package/docs/screenshots/build-dark.png +0 -0
- package/docs/screenshots/grill-dark.png +0 -0
- package/docs/screenshots/hero-dark.png +0 -0
- package/docs/screenshots/hero-light.png +0 -0
- package/docs/screenshots/ship-dark.png +0 -0
- package/docs/screenshots/src/showcase.html +320 -0
- package/hooks/completion-gate.mjs +258 -0
- package/hooks/cursor-hooks.json +13 -0
- package/hooks/hooks.json +15 -0
- package/install.sh +21 -0
- package/llms.txt +40 -0
- package/mcp/README.md +266 -0
- package/mcp/VERSIONS.md +41 -0
- package/mcp/mcp-full.json.template +124 -0
- package/mcp/mcp.json.template +29 -0
- package/mcp/pinned-versions.json +27 -0
- package/package.json +93 -4
- package/rules/approved-plan-execution.mdc +65 -0
- package/rules/full-stack-ship-discipline.mdc +37 -0
- package/rules/native-rn-monorepo/README.md +63 -0
- package/rules/native-rn-monorepo/_project.mdc +69 -0
- package/rules/native-rn-monorepo/native-android.mdc +72 -0
- package/rules/native-rn-monorepo/native-ios.mdc +61 -0
- package/rules/native-rn-monorepo/react-native-js.mdc +78 -0
- package/rules/native-rn-monorepo/web.mdc +60 -0
- package/rules/project-starter/components.mdc +54 -0
- package/rules/project-starter/data-fetching.mdc +77 -0
- package/rules/project-starter/git.mdc +41 -0
- package/rules/project-starter/supabase.mdc +37 -0
- package/rules/project-starter/tailwind.mdc +48 -0
- package/rules/project-starter/typescript.mdc +36 -0
- package/rules/project-starter/web-performance.mdc +42 -0
- package/rules/senior-engineer.mdc +30 -0
- package/rules/shell-first-search.mdc +19 -0
- package/rules/skill-workflows.mdc +35 -0
- package/rules/verification-before-completion.mdc +57 -0
- package/skills/audit-accessibility/SKILL.md +441 -0
- package/skills/audit-agent-speed/SKILL.md +181 -0
- package/skills/audit-agent-speed/scripts/stop-typecheck.mjs +151 -0
- package/skills/audit-analytics/SKILL.md +138 -0
- package/skills/audit-auth-flows/SKILL.md +267 -0
- package/skills/audit-backend-architecture/SKILL.md +266 -0
- package/skills/audit-backend-architecture/references/patterns.md +386 -0
- package/skills/audit-bundle-size/SKILL.md +296 -0
- package/skills/audit-cicd/SKILL.md +218 -0
- package/skills/audit-code-quality/SKILL.md +314 -0
- package/skills/audit-code-review/SKILL.md +289 -0
- package/skills/audit-codemod-safety/SKILL.md +159 -0
- package/skills/audit-db-schema/SKILL.md +465 -0
- package/skills/audit-db-schema/references/details.md +110 -0
- package/skills/audit-doctrine/SKILL.md +189 -0
- package/skills/audit-env-parity/SKILL.md +133 -0
- package/skills/audit-fe-api/SKILL.md +458 -0
- package/skills/audit-gate-logic/SKILL.md +219 -0
- package/skills/audit-i18n/SKILL.md +339 -0
- package/skills/audit-infra-cost/SKILL.md +142 -0
- package/skills/audit-langfuse-llm/SKILL.md +468 -0
- package/skills/audit-langfuse-llm/references/details.md +226 -0
- package/skills/audit-llm-security/SKILL.md +147 -0
- package/skills/audit-monetization-iap/SKILL.md +137 -0
- package/skills/audit-payment-system/SKILL.md +268 -0
- package/skills/audit-payment-system/references/checklist.md +283 -0
- package/skills/audit-performance/SKILL.md +383 -0
- package/skills/audit-performance/references/loading-priority-2026.md +81 -0
- package/skills/audit-realworld/SKILL.md +287 -0
- package/skills/audit-registry-listing/SKILL.md +122 -0
- package/skills/audit-resilience/SKILL.md +154 -0
- package/skills/audit-responsive/SKILL.md +221 -0
- package/skills/audit-responsive/references/checklist.md +166 -0
- package/skills/audit-security/SKILL.md +289 -0
- package/skills/audit-skill-conflicts/SKILL.md +178 -0
- package/skills/audit-ui-states/SKILL.md +146 -0
- package/skills/audit-uiux-design-system/SKILL.md +475 -0
- package/skills/audit-uiux-design-system/references/details.md +71 -0
- package/skills/audit-ux/SKILL.md +379 -0
- package/skills/audit-ux/references/details.md +245 -0
- package/skills/audit-ux-journeys/SKILL.md +215 -0
- package/skills/audit-ux-journeys/references/checklist.md +179 -0
- package/skills/backend-db-performance/SKILL.md +441 -0
- package/skills/backend-error-handling/SKILL.md +489 -0
- package/skills/backend-error-handling/references/details.md +58 -0
- package/skills/backend-observability/SKILL.md +88 -0
- package/skills/backend-patterns/SKILL.md +499 -0
- package/skills/backend-patterns/references/architecture-patterns.md +298 -0
- package/skills/backend-realtime/SKILL.md +403 -0
- package/skills/backend-realtime/references/patterns.md +74 -0
- package/skills/burndown-full/SKILL.md +174 -0
- package/skills/complete-everything/SKILL.md +295 -0
- package/skills/data-pipeline/SKILL.md +109 -0
- package/skills/data-visualization/SKILL.md +488 -0
- package/skills/debug-error/SKILL.md +322 -0
- package/skills/debug-fe-be-integration/SKILL.md +459 -0
- package/skills/debug-sentry-monitor/SKILL.md +497 -0
- package/skills/debug-sentry-monitor/references/details.md +165 -0
- package/skills/deploy-npm/SKILL.md +394 -0
- package/skills/deploy-npm/references/example-mushi-mushi.md +52 -0
- package/skills/deploy-verify/SKILL.md +489 -0
- package/skills/design-api/SKILL.md +379 -0
- package/skills/design-canvas/SKILL.md +155 -0
- package/skills/design-email/SKILL.md +370 -0
- package/skills/design-frontend/SKILL.md +143 -0
- package/skills/design-generative-art/SKILL.md +474 -0
- package/skills/design-mobile-first/SKILL.md +506 -0
- package/skills/design-motion/SKILL.md +333 -0
- package/skills/design-motion/references/delight-interactions.md +191 -0
- package/skills/design-prd/SKILL.md +443 -0
- package/skills/design-system/SKILL.md +457 -0
- package/skills/design-theme/SKILL.md +226 -0
- package/skills/design-theme/themes/tsumagoi-ranch.md +150 -0
- package/skills/docs-adr/SKILL.md +168 -0
- package/skills/docs-coauthor/SKILL.md +368 -0
- package/skills/docs-comparison-pages/SKILL.md +117 -0
- package/skills/docs-domain-modeling/SKILL.md +97 -0
- package/skills/docs-launch-kit/SKILL.md +139 -0
- package/skills/docs-writer/SKILL.md +469 -0
- package/skills/enhance-agent-guardrails/SKILL.md +164 -0
- package/skills/enhance-arch-boundaries/SKILL.md +154 -0
- package/skills/enhance-capacitor-ui/SKILL.md +463 -0
- package/skills/enhance-capacitor-ui/references/details.md +750 -0
- package/skills/enhance-email-deliverability/SKILL.md +143 -0
- package/skills/enhance-growth-loops/SKILL.md +122 -0
- package/skills/enhance-lifecycle-email/SKILL.md +130 -0
- package/skills/enhance-motion/SKILL.md +193 -0
- package/skills/enhance-onboarding/SKILL.md +148 -0
- package/skills/enhance-pwa/SKILL.md +304 -0
- package/skills/enhance-readability/SKILL.md +146 -0
- package/skills/enhance-readme/SKILL.md +496 -0
- package/skills/enhance-readme/package-lock.json +187 -0
- package/skills/enhance-readme/package.json +17 -0
- package/skills/enhance-readme/scripts/generate-readme-blocks.mjs +199 -0
- package/skills/enhance-readme/scripts/record-readme-tour.mjs +442 -0
- package/skills/enhance-skill-prompts/SKILL.md +167 -0
- package/skills/enhance-skill-prompts/references/exemplar-audit-auth-flows.md +311 -0
- package/skills/enhance-web-conversion/SKILL.md +155 -0
- package/skills/enhance-web-forms/SKILL.md +154 -0
- package/skills/enhance-web-instant-nav/SKILL.md +138 -0
- package/skills/enhance-web-instant-nav/references/bfcache-blockers.md +23 -0
- package/skills/enhance-web-instant-nav/references/early-hints.md +33 -0
- package/skills/enhance-web-instant-nav/references/speculation-rules.md +44 -0
- package/skills/enhance-web-landing/SKILL.md +459 -0
- package/skills/enhance-web-landing/references/details.md +773 -0
- package/skills/enhance-web-redesign/SKILL.md +228 -0
- package/skills/enhance-web-seo/SKILL.md +276 -0
- package/skills/enhance-web-ui/SKILL.md +473 -0
- package/skills/enhance-web-ui/references/details.md +674 -0
- package/skills/enhance-web-ux/HEURISTICS.md +242 -0
- package/skills/enhance-web-ux/PATTERNS.md +375 -0
- package/skills/enhance-web-ux/SKILL.md +464 -0
- package/skills/enhance-web-ux/examples.md +222 -0
- package/skills/enhance-web-ux/references/details.md +406 -0
- package/skills/enhance-web-web3d/SKILL.md +397 -0
- package/skills/enhance-web-web3d/references/css-canvas-effects.md +180 -0
- package/skills/handoff/SKILL.md +66 -0
- package/skills/housekeep-backlog/SKILL.md +149 -0
- package/skills/housekeep-dead-code/SKILL.md +387 -0
- package/skills/housekeep-dead-code/references/ratchet-ci.md +205 -0
- package/skills/housekeep-dead-code/references/supabase-hygiene.md +152 -0
- package/skills/housekeep-design/SKILL.md +207 -0
- package/skills/housekeep-files/SKILL.md +220 -0
- package/skills/housekeep-files/references/naming-and-catalog.md +86 -0
- package/skills/housekeep-files/scripts/housekeep-files.ps1 +360 -0
- package/skills/housekeep-files/scripts/housekeep-files.sh +238 -0
- package/skills/housekeep-gates/SKILL.md +174 -0
- package/skills/iterate-agent-harness/SKILL.md +137 -0
- package/skills/iterate-gtm-weekly/SKILL.md +103 -0
- package/skills/iterate-post-launch/SKILL.md +292 -0
- package/skills/meta-mcp-builder/SKILL.md +313 -0
- package/skills/meta-skill-creator/SKILL.md +304 -0
- package/skills/mobile-capacitor-platform/SKILL.md +104 -0
- package/skills/mobile-emulator-start/SKILL.md +296 -0
- package/skills/mobile-emulator-test/SKILL.md +491 -0
- package/skills/mobile-emulator-test/references/details.md +478 -0
- package/skills/mobile-rn-performance/SKILL.md +107 -0
- package/skills/mobile-rn-screen/SKILL.md +476 -0
- package/skills/mobile-rn-screen/references/details.md +785 -0
- package/skills/mushi-health/SKILL.md +206 -0
- package/skills/mushi-integration/SKILL.md +257 -0
- package/skills/plan-aeo-readiness/SKILL.md +166 -0
- package/skills/plan-antislop/SKILL.md +281 -0
- package/skills/plan-aso/SKILL.md +149 -0
- package/skills/plan-backup-dr/SKILL.md +131 -0
- package/skills/plan-capacitor-hardening/SKILL.md +217 -0
- package/skills/plan-data-integrity/SKILL.md +187 -0
- package/skills/plan-dead-code/SKILL.md +386 -0
- package/skills/plan-dead-code/references/knip-config.md +214 -0
- package/skills/plan-dead-code/references/output-templates.md +133 -0
- package/skills/plan-dead-code/references/preservation-contract.md +50 -0
- package/skills/plan-dead-code/references/residue-greps.md +84 -0
- package/skills/plan-dependency-provenance/SKILL.md +200 -0
- package/skills/plan-docs-sync/SKILL.md +143 -0
- package/skills/plan-docs-sync/references/drift-taxonomy.md +43 -0
- package/skills/plan-docs-sync/references/output-templates.md +33 -0
- package/skills/plan-docs-sync/references/preservation-contract.md +17 -0
- package/skills/plan-error-handling/SKILL.md +205 -0
- package/skills/plan-gtm/SKILL.md +276 -0
- package/skills/plan-gtm/references/benchmarks-2026.md +183 -0
- package/skills/plan-input-validation/SKILL.md +179 -0
- package/skills/plan-llm-cost-guardrails/SKILL.md +176 -0
- package/skills/plan-mobile-readiness/SKILL.md +171 -0
- package/skills/plan-perf-audit/SKILL.md +145 -0
- package/skills/plan-perf-audit/references/audit-scope.md +51 -0
- package/skills/plan-perf-audit/references/output-templates.md +33 -0
- package/skills/plan-perf-audit/references/preservation-contract.md +13 -0
- package/skills/plan-pricing/SKILL.md +173 -0
- package/skills/plan-privacy-compliance/SKILL.md +148 -0
- package/skills/plan-rls-audit/SKILL.md +231 -0
- package/skills/plan-secrets-audit/SKILL.md +181 -0
- package/skills/plan-security-audit/SKILL.md +168 -0
- package/skills/plan-security-audit/references/output-templates.md +36 -0
- package/skills/plan-security-audit/references/owasp-supabase-scope.md +55 -0
- package/skills/plan-security-audit/references/preservation-contract.md +18 -0
- package/skills/plan-stub-checker/SKILL.md +216 -0
- package/skills/plan-stub-checker/references/detection-methodology.md +75 -0
- package/skills/plan-stub-checker/references/detection-taxonomy.md +34 -0
- package/skills/plan-stub-checker/references/output-templates.md +63 -0
- package/skills/plan-stub-checker/references/preservation-contract.md +24 -0
- package/skills/plan-test-coverage/SKILL.md +170 -0
- package/skills/plan-test-coverage/references/methodology.md +54 -0
- package/skills/plan-test-coverage/references/output-templates.md +34 -0
- package/skills/plan-test-coverage/references/preservation-contract.md +15 -0
- package/skills/plan-uiux-unification/SKILL.md +230 -0
- package/skills/plan-uiux-unification/references/output-templates.md +67 -0
- package/skills/plan-uiux-unification/references/phase-workbook.md +85 -0
- package/skills/plan-uiux-unification/references/preservation-contract.md +24 -0
- package/skills/protocol-browser-anti-stall/SKILL.md +211 -0
- package/skills/protocol-browser-anti-stall/references/mcp-to-cli-map.md +113 -0
- package/skills/protocol-browser-anti-stall/references/playwright-session-coordination.md +170 -0
- package/skills/research/SKILL.md +422 -0
- package/skills/test-exploratory/SKILL.md +165 -0
- package/skills/test-exploratory/references/charter-template.md +29 -0
- package/skills/test-load/SKILL.md +126 -0
- package/skills/test-mutation/SKILL.md +160 -0
- package/skills/test-playwright/SKILL.md +354 -0
- package/skills/test-qa/SKILL.md +364 -0
- package/skills/test-qa/references/details.md +268 -0
- package/skills/test-red-team/SKILL.md +387 -0
- package/skills/test-red-team/references/owasp-attack-checklist.md +193 -0
- package/skills/test-unit/SKILL.md +259 -0
- package/skills/test-unit/references/details.md +267 -0
- package/skills/test-visual-regression/SKILL.md +132 -0
- package/skills/thirdparty-emil-design-eng/ATTRIBUTION.md +20 -0
- package/skills/thirdparty-emil-design-eng/SKILL.md +21 -0
- package/skills/thirdparty-emil-design-eng/references/emil-design-eng.md +676 -0
- package/skills/thirdparty-ui-ux-pro-max/ATTRIBUTION.md +22 -0
- package/skills/thirdparty-ui-ux-pro-max/SKILL.md +304 -0
- package/skills/thirdparty-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/thirdparty-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/thirdparty-ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/thirdparty-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/thirdparty-ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/thirdparty-web-interface-guidelines/ATTRIBUTION.md +23 -0
- package/skills/thirdparty-web-interface-guidelines/SKILL.md +190 -0
- package/skills/workflow-build-feature/SKILL.md +118 -0
- package/skills/workflow-coding-discipline/SKILL.md +140 -0
- package/skills/workflow-environment-ready/SKILL.md +128 -0
- package/skills/workflow-feature-flag/SKILL.md +262 -0
- package/skills/workflow-feedback-to-closure/SKILL.md +165 -0
- package/skills/workflow-fix-and-ship/SKILL.md +136 -0
- package/skills/workflow-git-commit/SKILL.md +200 -0
- package/skills/workflow-green-repo/SKILL.md +166 -0
- package/skills/workflow-grilling/SKILL.md +73 -0
- package/skills/workflow-gtm/SKILL.md +153 -0
- package/skills/workflow-housekeep/SKILL.md +453 -0
- package/skills/workflow-housekeep/references/templates.md +109 -0
- package/skills/workflow-launch-ready/SKILL.md +145 -0
- package/skills/workflow-merge-conflicts/SKILL.md +62 -0
- package/skills/workflow-onboard/SKILL.md +99 -0
- package/skills/workflow-parallel-agents/SKILL.md +164 -0
- package/skills/workflow-pr/SKILL.md +197 -0
- package/skills/workflow-quality-gate/SKILL.md +147 -0
- package/skills/workflow-refactor/SKILL.md +274 -0
- package/skills/workflow-release-prep/SKILL.md +207 -0
- package/skills/workflow-ship-and-observe/SKILL.md +164 -0
- package/skills/workflow-spec-tdd/SKILL.md +141 -0
- package/skills/workflow-spec-tdd/references/spec-template.md +126 -0
- package/skills/workflow-spec-tdd/references/tdd-patterns.md +167 -0
- package/skills-cursor/babysit/SKILL.md +17 -0
- package/skills-cursor/canvas/SKILL.md +142 -0
- package/skills-cursor/canvas/sdk/canvas-tokens.d.ts +235 -0
- package/skills-cursor/canvas/sdk/chart-primitives.d.ts +200 -0
- package/skills-cursor/canvas/sdk/dag-layout.d.ts +102 -0
- package/skills-cursor/canvas/sdk/diff-view.d.ts +130 -0
- package/skills-cursor/canvas/sdk/form-primitives.d.ts +194 -0
- package/skills-cursor/canvas/sdk/hooks.d.ts +117 -0
- package/skills-cursor/canvas/sdk/index.d.ts +47 -0
- package/skills-cursor/canvas/sdk/theme.d.ts +61 -0
- package/skills-cursor/canvas/sdk/todo-list.d.ts +49 -0
- package/skills-cursor/canvas/sdk/ui-primitives.d.ts +549 -0
- package/skills-cursor/canvas/sdk/ui-primitives.test.d.ts +2 -0
- package/skills-cursor/create-hook/SKILL.md +238 -0
- package/skills-cursor/create-rule/SKILL.md +185 -0
- package/skills-cursor/create-skill/SKILL.md +269 -0
- package/skills-cursor/create-skill/references/authoring-guide.md +182 -0
- package/skills-cursor/create-subagent/SKILL.md +228 -0
- package/skills-cursor/migrate-to-skills/SKILL.md +121 -0
- package/skills-cursor/shell/SKILL.md +22 -0
- package/skills-cursor/split-to-prs/SKILL.md +47 -0
- package/skills-cursor/statusline/SKILL.md +193 -0
- package/skills-cursor/update-cli-config/SKILL.md +85 -0
- package/skills-cursor/update-cursor-settings/SKILL.md +137 -0
- package/skills.sh.json +296 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-spec-tdd
|
|
3
|
+
description: >
|
|
4
|
+
A spec → plan → TDD loop before writing a line. Use when "spec first",
|
|
5
|
+
"TDD", "do it properly", or LLM output keeps being wrong. Feature through PR
|
|
6
|
+
→ workflow-build-feature. One bug → workflow-fix-and-ship.
|
|
7
|
+
license: MIT
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Spec → Plan → TDD Workflow
|
|
11
|
+
|
|
12
|
+
**Degree of freedom: MIXED.** Approach choice and spec content `[HIGH freedom]`;
|
|
13
|
+
phase order, RED-before-GREEN, and Phase 5 checklist `[LOW freedom — run exactly]`.
|
|
14
|
+
|
|
15
|
+
> The antidote to vibe-coding. LLMs fail not because they can't write code, but because they skip the thinking: they guess requirements, write code before tests, and declare victory without verification. This skill forces the discipline. Stack-agnostic — works for web, React Native, and Capacitor.
|
|
16
|
+
>
|
|
17
|
+
> Adapted from [obra/superpowers](https://github.com/obra/superpowers) (MIT) and the Karpathy LLM-coding guardrails.
|
|
18
|
+
|
|
19
|
+
## How to reason
|
|
20
|
+
|
|
21
|
+
1. **Restate** — one-sentence ask + surface
|
|
22
|
+
2. **Contract** — behavior, edges, out-of-scope, verifiable Done when
|
|
23
|
+
3. **RED** — failing test at an agreed seam, watched fail
|
|
24
|
+
4. **Verify** — Phase 5 checklist; no unverified "should work"
|
|
25
|
+
|
|
26
|
+
## Worked example
|
|
27
|
+
|
|
28
|
+
> **Restate:** add coupon codes on checkout (web), not a new promotions engine.
|
|
29
|
+
> **Contract:** one optional code; invalid → inline error; valid → discounted total; out of scope: stacking, expiry admin UI.
|
|
30
|
+
> **RED:** test `applyCoupon('SAVE10')` on a $40 cart expects $36 — fails because helper is missing.
|
|
31
|
+
> **Verify:** GREEN is the helper only; Playwright later lives in `workflow-build-feature`, not here.
|
|
32
|
+
|
|
33
|
+
## Self-critique before reporting
|
|
34
|
+
|
|
35
|
+
- **RED was watched** — the test failed before implementation
|
|
36
|
+
- **Seam agreed** — tests hit the named public boundary, not internals
|
|
37
|
+
- **YAGNI** — no extra flags or layers beyond the spec
|
|
38
|
+
- **Right owner** — full feature through PR → `workflow-build-feature`; one production bug → `workflow-fix-and-ship`
|
|
39
|
+
|
|
40
|
+
## When this fires
|
|
41
|
+
|
|
42
|
+
Use for: a new feature, a multi-file refactor, a recurring bug, anything ambiguous, or any task where "looks done" has burned you before.
|
|
43
|
+
|
|
44
|
+
Skip for: one-line edits, pure formatting, a single obvious fix. Don't ceremony-tax trivial work.
|
|
45
|
+
|
|
46
|
+
## The loop (do not skip phases) [LOW freedom — run exactly]
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
0. Read the room → understand repo + exact ask
|
|
50
|
+
1. Brainstorm → surface assumptions, explore alternatives
|
|
51
|
+
2. Spec → write the contract: behavior, inputs, outputs, edge cases
|
|
52
|
+
3. Plan → ordered, file-mapped steps with a verification per step
|
|
53
|
+
4. TDD → RED (failing test) → GREEN (minimal code) → REFACTOR, per step
|
|
54
|
+
5. Self-review → spec coverage + quality gate before "done"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Phase 0 — Read the room (always first) [HIGH freedom]
|
|
58
|
+
- Read the dependency manifest for exact versions; read the files you'll touch in full.
|
|
59
|
+
- Restate the ask in one sentence and name the surface (web / RN / Capacitor). If the surface has a domain skill (`mobile-capacitor-platform`, `mobile-rn-performance`, `enhance-*`), note it.
|
|
60
|
+
- If the request is genuinely ambiguous, ask **exactly one** clarifying question. Otherwise state your reading and proceed.
|
|
61
|
+
|
|
62
|
+
### Phase 1 — Brainstorm (before any code) [HIGH freedom]
|
|
63
|
+
- List the **hidden assumptions** the naive implementation would make. Each is a future bug.
|
|
64
|
+
- Consider more than one approach before committing; pick one and say why. Prefer the existing repo pattern over a new abstraction.
|
|
65
|
+
- Apply **YAGNI**: build only what the spec needs. No speculative config, flags, or layers.
|
|
66
|
+
|
|
67
|
+
### Phase 2 — Spec (the contract) [HIGH freedom]
|
|
68
|
+
Write a short spec before coding. Template:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
## Spec: [feature]
|
|
72
|
+
- Behavior: [what it does, observable]
|
|
73
|
+
- Inputs: [shape, types, sources]
|
|
74
|
+
- Outputs / side effects: [returns, DB writes, navigation, events]
|
|
75
|
+
- Edge cases: [empty, error, offline, large, concurrent, unauthorized]
|
|
76
|
+
- Out of scope: [what this explicitly does NOT do]
|
|
77
|
+
- Done when: [the concrete, checkable success criteria]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
"Done when" must be **verifiable**, not "it works". Weak criteria produce weak code.
|
|
81
|
+
|
|
82
|
+
### Phase 3 — Plan (file-mapped, ordered) [HIGH freedom]
|
|
83
|
+
```markdown
|
|
84
|
+
## Plan
|
|
85
|
+
1. [file] — [change] — verify: [test/command]
|
|
86
|
+
2. [file] — [change] — verify: [test/command]
|
|
87
|
+
...
|
|
88
|
+
- New deps (if any): [pkg@version — why]
|
|
89
|
+
- Migrations / schema / RLS / edge fns touched: [list — deploy in same turn per full-stack-ship-discipline]
|
|
90
|
+
- Risk: [low/med/high per step]
|
|
91
|
+
```
|
|
92
|
+
When steps depend on each other, order them so each leaves the tree green and note the intermediate state and side effects a later step relies on.
|
|
93
|
+
|
|
94
|
+
### Phase 4 — TDD (RED → GREEN → REFACTOR) [LOW freedom — run exactly]
|
|
95
|
+
For each plan step:
|
|
96
|
+
1. **RED** — write the failing test first. Run it. **Watch it fail** (proves the test tests something).
|
|
97
|
+
2. **GREEN** — write the *minimal* code to pass. No extra. Run it. Watch it pass.
|
|
98
|
+
3. **REFACTOR** — clean up with tests green. Commit the step.
|
|
99
|
+
|
|
100
|
+
Rules:
|
|
101
|
+
- The first implementation task is always "write the failing test."
|
|
102
|
+
- Never write code with no test path unless the repo has zero test setup — then add the smallest harness first, or explicitly flag that you're skipping TDD and why.
|
|
103
|
+
- One concern per test. Test behavior, not implementation details.
|
|
104
|
+
- **Test only at pre-agreed seams.** A seam is the public boundary you test at — the interface where behavior is observable without reaching inside. Name the seams in the plan (Phase 3) and confirm them with the user; prefer existing seams, at the highest level possible. Agreed seams put test effort on critical paths instead of every internal.
|
|
105
|
+
- **Vertical slices, not horizontal.** One test → one implementation → repeat, each test a tracer bullet informed by the last cycle. Writing all tests up front verifies imagined behavior and locks in test structure before the implementation teaches you anything.
|
|
106
|
+
- **No tautological tests.** Expected values come from an independent source of truth (a known-good literal, a worked example, the spec) — never recomputed the same way the code computes them, or the test passes by construction.
|
|
107
|
+
- **The refactor-breaks-test tell.** If a test breaks when you refactor but behavior hasn't changed, it was implementation-coupled — fix the test's seam, don't patch the assertion.
|
|
108
|
+
- Surface-specific runners: web → vitest/jest/playwright; RN → jest + RNTL, `mobile-emulator-test` for device; Capacitor → vitest + `mobile-capacitor-platform` E2E.
|
|
109
|
+
- A pre-existing bug you hit while implementing goes into the spec's "Out of scope" list as a follow-up, not into this loop. Scratch scripts used to explore stay out of the repo; edit files surgically rather than rewriting them.
|
|
110
|
+
|
|
111
|
+
### Phase 5 — Self-review (gate before "done") [LOW freedom — do not skip]
|
|
112
|
+
Run this checklist. If any box fails, you are not done:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
- [ ] Every "Done when" criterion is met and verified (not assumed)
|
|
116
|
+
- [ ] Every spec edge case is handled or explicitly deferred in the spec
|
|
117
|
+
- [ ] Tests fail without the change and pass with it (RED was real)
|
|
118
|
+
- [ ] No placeholder / TODO / dead code / stubbed return left behind
|
|
119
|
+
- [ ] No unrequested scope crept in (YAGNI held)
|
|
120
|
+
- [ ] Backend deps deployed + verified on the remote, not just on disk
|
|
121
|
+
- [ ] Error path actually exercises the new code (logs/network confirm, not a stale 404)
|
|
122
|
+
- [ ] Narrowest verification command for the surface was run and is green
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Anti-patterns this kills
|
|
126
|
+
- "Here's the implementation" with no test and no spec → **vibe code**.
|
|
127
|
+
- Plausible code that compiles but mishandles empty/error/offline → **missing edge cases**.
|
|
128
|
+
- "It should work now" with nothing run → **unverified claim**.
|
|
129
|
+
- Drive-by refactors of unrelated code → **scope creep**.
|
|
130
|
+
- A migration file written but never deployed → see `full-stack-ship-discipline`.
|
|
131
|
+
|
|
132
|
+
## References
|
|
133
|
+
|
|
134
|
+
- [TDD patterns & test examples by type](references/tdd-patterns.md)
|
|
135
|
+
- [Spec template & writing principles](references/spec-template.md)
|
|
136
|
+
|
|
137
|
+
## Composes with
|
|
138
|
+
- `workflow-coding-discipline` — behavioral guardrails (this skill operationalizes them).
|
|
139
|
+
- `full-stack-ship-discipline` — Phase 5 backend-deploy gate.
|
|
140
|
+
- `mobile-capacitor-platform` / `mobile-rn-performance` / `enhance-*` — surface domain knowledge for the plan.
|
|
141
|
+
- `test-playwright` / `mobile-emulator-test` / `test-unit` — the verification runners for Phase 4–5.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Spec Writing Reference
|
|
2
|
+
|
|
3
|
+
## Why specs matter
|
|
4
|
+
|
|
5
|
+
Vague prompts produce vague code. A good spec gives the agent:
|
|
6
|
+
- **What** to build (requirements, not solutions)
|
|
7
|
+
- **Why** it exists (constraints, context, trade-offs)
|
|
8
|
+
- **How to verify** it's correct (acceptance criteria)
|
|
9
|
+
- **What not to do** (explicit constraints)
|
|
10
|
+
|
|
11
|
+
One well-written spec is worth 10 follow-up corrections.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Spec template
|
|
16
|
+
|
|
17
|
+
```markdown
|
|
18
|
+
## Goal
|
|
19
|
+
One sentence: what should exist after this is done that doesn't exist now?
|
|
20
|
+
|
|
21
|
+
## Background & context
|
|
22
|
+
- Why is this needed?
|
|
23
|
+
- What problem does it solve?
|
|
24
|
+
- Any prior art or existing code to build on?
|
|
25
|
+
- Constraints (time, performance, backwards compatibility)?
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
### Must have
|
|
30
|
+
- [ ] Requirement 1 (user-visible behaviour)
|
|
31
|
+
- [ ] Requirement 2
|
|
32
|
+
|
|
33
|
+
### Should have
|
|
34
|
+
- [ ] Nice-to-have 1
|
|
35
|
+
|
|
36
|
+
### Must NOT do
|
|
37
|
+
- Do not change X (existing users depend on it)
|
|
38
|
+
- Do not add a new DB table (use existing Y)
|
|
39
|
+
|
|
40
|
+
## Acceptance criteria
|
|
41
|
+
How will we know it's done?
|
|
42
|
+
- [ ] User can do X and sees Y
|
|
43
|
+
- [ ] Error case Z shows message W
|
|
44
|
+
- [ ] Performance: page loads in <200ms
|
|
45
|
+
- [ ] Tests pass, no console errors
|
|
46
|
+
|
|
47
|
+
## Technical notes
|
|
48
|
+
- Use existing `useAuth` hook for auth checks
|
|
49
|
+
- Matches pattern in `features/billing/`
|
|
50
|
+
- Schema change: add `status` column to `orders` table
|
|
51
|
+
- New Zod schema needed for form validation
|
|
52
|
+
|
|
53
|
+
## Out of scope
|
|
54
|
+
- Feature X (future iteration)
|
|
55
|
+
- Mobile optimisation (separate ticket)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Writing principles
|
|
61
|
+
|
|
62
|
+
### Behaviour, not implementation
|
|
63
|
+
```markdown
|
|
64
|
+
# Good — describes observable behaviour
|
|
65
|
+
"When the user submits an invalid email, show an inline error below the field."
|
|
66
|
+
|
|
67
|
+
# Bad — prescribes implementation
|
|
68
|
+
"Add a useState for emailError and set it in the onChange handler."
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Explicit constraints
|
|
72
|
+
```markdown
|
|
73
|
+
# Be explicit about what NOT to do
|
|
74
|
+
- Must work without JavaScript (no client-only state)
|
|
75
|
+
- Must not break existing /api/users endpoint
|
|
76
|
+
- Must use existing Button from @/components/ui
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Include examples
|
|
80
|
+
```markdown
|
|
81
|
+
## Example inputs/outputs
|
|
82
|
+
|
|
83
|
+
Input: User uploads a 2MB JPEG
|
|
84
|
+
Expected: Image compressed to <500KB, stored in Supabase storage, URL returned
|
|
85
|
+
|
|
86
|
+
Input: User uploads a 10MB PDF
|
|
87
|
+
Expected: Error toast "File too large. Maximum 5MB."
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Define edge cases
|
|
91
|
+
```markdown
|
|
92
|
+
## Edge cases
|
|
93
|
+
- What if the user is not authenticated?
|
|
94
|
+
- What if the network request times out?
|
|
95
|
+
- What if two users submit simultaneously?
|
|
96
|
+
- What if the data is empty/null?
|
|
97
|
+
- What happens on mobile vs desktop?
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Spec sizes
|
|
103
|
+
|
|
104
|
+
### Micro (1-2 files, <1 hour)
|
|
105
|
+
Just a few bullets:
|
|
106
|
+
```
|
|
107
|
+
Add a "Copy link" button to the share modal.
|
|
108
|
+
- Uses navigator.clipboard.writeText()
|
|
109
|
+
- Shows "Copied!" toast for 2s on success
|
|
110
|
+
- Falls back to prompt() if clipboard API unavailable
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Standard (1 feature, 1 day)
|
|
114
|
+
Use the full template above.
|
|
115
|
+
|
|
116
|
+
### Large (multi-feature, multi-day)
|
|
117
|
+
Break into multiple micro/standard specs. Each should be independently implementable.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Red flags in specs
|
|
122
|
+
- "Make it better" → Specify what "better" means
|
|
123
|
+
- "Add AI to it" → Specify what the AI should do and when
|
|
124
|
+
- "Like X app" → Describe the specific behaviour you want
|
|
125
|
+
- No acceptance criteria → Can't know when it's done
|
|
126
|
+
- Acceptance criteria that test implementation → Test behaviour instead
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# TDD Patterns Reference
|
|
2
|
+
|
|
3
|
+
## The RED → GREEN → REFACTOR cycle
|
|
4
|
+
|
|
5
|
+
### Phase RED — write a failing test first
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// RED: tests written from the input/output pairs; no implementation exists yet.
|
|
9
|
+
|
|
10
|
+
describe('calculateDiscount', () => {
|
|
11
|
+
it('applies 10% for orders over £100', () => {
|
|
12
|
+
expect(calculateDiscount(120, 'standard')).toBe(108)
|
|
13
|
+
})
|
|
14
|
+
it('returns full price for orders under £100', () => {
|
|
15
|
+
expect(calculateDiscount(80, 'standard')).toBe(80)
|
|
16
|
+
})
|
|
17
|
+
it('applies 20% for premium customers', () => {
|
|
18
|
+
expect(calculateDiscount(120, 'premium')).toBe(96)
|
|
19
|
+
})
|
|
20
|
+
it('throws for negative amounts', () => {
|
|
21
|
+
expect(() => calculateDiscount(-10, 'standard')).toThrow()
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Run and confirm failure before writing implementation:
|
|
27
|
+
```bash
|
|
28
|
+
npx vitest run src/utils/discount.test.ts
|
|
29
|
+
# Expected: all tests fail (function doesn't exist yet)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Phase GREEN — minimal code to pass
|
|
33
|
+
|
|
34
|
+
Write the minimal code that makes these tests pass without modifying the tests.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npx vitest run --watch src/utils/discount.test.ts
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Commit when all tests pass with minimal implementation.
|
|
41
|
+
|
|
42
|
+
### Phase REFACTOR — clean with tests green
|
|
43
|
+
|
|
44
|
+
With tests as a safety net, refactor confidently:
|
|
45
|
+
- Extract repeated logic
|
|
46
|
+
- Improve naming
|
|
47
|
+
- Add types / docs
|
|
48
|
+
- Optimise hot paths
|
|
49
|
+
|
|
50
|
+
Run tests after every change. They must stay green.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Test patterns by type
|
|
55
|
+
|
|
56
|
+
### Unit test (Vitest)
|
|
57
|
+
```typescript
|
|
58
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
59
|
+
|
|
60
|
+
describe('UserService', () => {
|
|
61
|
+
beforeEach(() => { vi.clearAllMocks() })
|
|
62
|
+
|
|
63
|
+
it('creates user with hashed password', async () => {
|
|
64
|
+
const mockDb = { user: { create: vi.fn().mockResolvedValue({ id: '1', email: 'a@b.com' }) } }
|
|
65
|
+
const service = new UserService(mockDb as any)
|
|
66
|
+
const result = await service.createUser({ email: 'a@b.com', password: 'plain' })
|
|
67
|
+
expect(mockDb.user.create).toHaveBeenCalledWith(
|
|
68
|
+
expect.objectContaining({ data: expect.objectContaining({ email: 'a@b.com' }) })
|
|
69
|
+
)
|
|
70
|
+
expect(result.id).toBe('1')
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Server Action (with validation)
|
|
76
|
+
```typescript
|
|
77
|
+
it('rejects invalid email', async () => {
|
|
78
|
+
const result = await createUserAction({ email: 'not-an-email', name: 'Test' })
|
|
79
|
+
expect(result.success).toBe(false)
|
|
80
|
+
expect(result.fieldErrors?.email).toBeDefined()
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### React component (Testing Library)
|
|
85
|
+
```typescript
|
|
86
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
87
|
+
|
|
88
|
+
it('shows error on invalid submit', async () => {
|
|
89
|
+
render(<LoginForm />)
|
|
90
|
+
fireEvent.click(screen.getByRole('button', { name: /sign in/i }))
|
|
91
|
+
await waitFor(() => {
|
|
92
|
+
expect(screen.getByText(/email is required/i)).toBeInTheDocument()
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### API route
|
|
98
|
+
```typescript
|
|
99
|
+
it('returns 401 without auth', async () => {
|
|
100
|
+
const req = new Request('http://localhost/api/users', { method: 'GET' })
|
|
101
|
+
const res = await GET(req)
|
|
102
|
+
expect(res.status).toBe(401)
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Writing good tests
|
|
109
|
+
|
|
110
|
+
### Name tests behaviourally
|
|
111
|
+
```typescript
|
|
112
|
+
// Good — observable behaviour
|
|
113
|
+
it('redirects to login when session expires')
|
|
114
|
+
it('shows toast on network error')
|
|
115
|
+
it('disables submit while loading')
|
|
116
|
+
|
|
117
|
+
// Bad — describes implementation
|
|
118
|
+
it('sets isLoading to true')
|
|
119
|
+
it('calls setError with message')
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Arrange-Act-Assert
|
|
123
|
+
```typescript
|
|
124
|
+
it('filters active users', () => {
|
|
125
|
+
// Arrange
|
|
126
|
+
const users = [
|
|
127
|
+
{ id: '1', active: true, name: 'Alice' },
|
|
128
|
+
{ id: '2', active: false, name: 'Bob' },
|
|
129
|
+
]
|
|
130
|
+
// Act
|
|
131
|
+
const result = filterActiveUsers(users)
|
|
132
|
+
// Assert
|
|
133
|
+
expect(result).toHaveLength(1)
|
|
134
|
+
expect(result[0].name).toBe('Alice')
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Mock at boundaries only
|
|
139
|
+
```typescript
|
|
140
|
+
// Mock external dependencies (DB, APIs, third-party services)
|
|
141
|
+
vi.mock('@/lib/db', () => ({ prisma: mockPrisma }))
|
|
142
|
+
vi.mock('resend', () => ({ Resend: vi.fn(() => ({ emails: { send: vi.fn() } })) }))
|
|
143
|
+
|
|
144
|
+
// Don't mock your own pure functions — test them directly
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Runner commands
|
|
150
|
+
```bash
|
|
151
|
+
npx vitest run # All tests once
|
|
152
|
+
npx vitest run --changed # Only changed files
|
|
153
|
+
npx vitest run src/features/auth # Specific folder
|
|
154
|
+
npx vitest --coverage # Coverage report
|
|
155
|
+
npx vitest watch # Watch mode
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Coverage targets
|
|
159
|
+
| Type | Target |
|
|
160
|
+
|------|--------|
|
|
161
|
+
| Statements | > 80% |
|
|
162
|
+
| Branches | > 75% |
|
|
163
|
+
| Functions | > 80% |
|
|
164
|
+
| Lines | > 80% |
|
|
165
|
+
|
|
166
|
+
Focus coverage on: business logic, server actions, validation, auth flows.
|
|
167
|
+
Test behaviour, not implementation details.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: babysit
|
|
3
|
+
description: >
|
|
4
|
+
Keep an already-open PR merge-ready: triage comments, resolve clear
|
|
5
|
+
conflicts, fix CI. Do not merge. Dirty tree → merge-ready PR →
|
|
6
|
+
workflow-release-prep. Create/merge PR lifecycle → workflow-pr.
|
|
7
|
+
---
|
|
8
|
+
# Babysit PR
|
|
9
|
+
Your job is to get this PR to a merge-ready state.
|
|
10
|
+
|
|
11
|
+
Check PR status, comments, and latest CI and resolve any issues until the PR is ready to merge.
|
|
12
|
+
|
|
13
|
+
1. Comments: Review every comment (including Bugbot) before acting. Fix only comments you agree with; explain when you disagree or are unsure.
|
|
14
|
+
2. Merge conflicts: When there are conflicts, sync with base branch. Resolve merge conflicts only when intent is clearly the same, otherwise stop and ask for clarification.
|
|
15
|
+
3. CI: Fix CI issues that come up with small scoped fixes. Push them and re-watch CI until mergeable + green + comments triaged.
|
|
16
|
+
|
|
17
|
+
Your turn ends when the PR is mergeable, CI is green, and every comment is triaged — or at a conflict whose intent is unclear or a comment you disagree with, where you stop and say so. "Pushed a fix, CI is running" is not an end state: watch the run to completion. Close with a recap: what you changed, what you pushed, what stays open.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: canvas
|
|
3
|
+
description: >
|
|
4
|
+
Create a live React canvas beside chat for standalone analytical
|
|
5
|
+
artifacts that benefit from visual layout: quantitative/security/
|
|
6
|
+
architecture analyses, data-heavy timelines/charts/tables, interactive
|
|
7
|
+
explorations, or repeatable tools. Do not use for simple prose or code
|
|
8
|
+
changes.
|
|
9
|
+
metadata:
|
|
10
|
+
surfaces:
|
|
11
|
+
- ide
|
|
12
|
+
disable-model-invocation: true
|
|
13
|
+
user-invocable: false
|
|
14
|
+
---
|
|
15
|
+
A canvas is a single `.canvas.tsx` file the IDE compiles so the user can open it beside the chat. Follow the workflow below in order.
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### 1. Decide whether to use a canvas
|
|
20
|
+
|
|
21
|
+
The trigger is **user intent**, not response shape. Ask: would the user benefit from viewing this output as its **own standalone artifact**, separate from the chat? If the output is a means to an end (a drafted message, a code fix, a dashboard in another tool), skip the canvas.
|
|
22
|
+
|
|
23
|
+
**Use a canvas when the agent produces new standalone analytical output:**
|
|
24
|
+
- Quantitative analyses and metrics breakdowns (e.g. "send 500 requests and tell me how many fail")
|
|
25
|
+
- Billing or account investigations that surface structured findings from database queries
|
|
26
|
+
- Security audits or architecture reviews with categorized findings
|
|
27
|
+
- Cross-system data analyses and overlap reports
|
|
28
|
+
- Structured data from MCP tools (Databricks, Datadog, etc.) where the data IS the deliverable
|
|
29
|
+
- Financial analyses, margin decompositions, usage trend reports
|
|
30
|
+
- Tables with more than a handful of rows that the user asked to see
|
|
31
|
+
|
|
32
|
+
**Do NOT use a canvas when:**
|
|
33
|
+
- The user asks for work in a **specific tool** — "create a Datadog dashboard" means give them a Datadog dashboard, not a canvas
|
|
34
|
+
- The user has a **specific deliverable** — "draft a support response", "fix this code", "make this PR"
|
|
35
|
+
- The user is **working within an existing artifact** — improving an HTML dashboard, editing an existing file
|
|
36
|
+
- The user is doing **targeted debugging** or active development, even if structured findings emerge along the way
|
|
37
|
+
- Short factual answers, one-off file edits, or quick clarifying questions
|
|
38
|
+
- MCP tools are queried as an **intermediate step** for a different deliverable (e.g. querying Stripe to draft a support reply)
|
|
39
|
+
|
|
40
|
+
### 2. Write the canvas
|
|
41
|
+
|
|
42
|
+
**Location.** Canvases live at `~/.cursor/projects/<workspace>/canvases/<name>.canvas.tsx`. The IDE only detects canvases written directly inside that exact directory — subfolders, alternate extensions, and other locations are not picked up. For a new canvas, always use the write file tool to create the `.canvas.tsx` file at that exact path; do not stop after telling the user the path or showing code in chat. Treat that managed `canvases/` directory as pre-provisioned by Cursor itself: write the canvas file directly there and do **not** spend turns creating the directory with `mkdir` or checking whether it exists before writing. Listing its contents for other purposes (e.g. checking for existing canvases) is fine. If you can't determine the workspace directory from absolute paths already in your environment (terminals, transcripts, recently-viewed files), list `~/.cursor/projects/` rather than guessing. Use a descriptive kebab-case filename ending in `.canvas.tsx`; preserve acronym capitalization and lowercase the rest.
|
|
43
|
+
|
|
44
|
+
**File rules:**
|
|
45
|
+
- Exactly one `.canvas.tsx` file per canvas. Never create helper files, style files, or supporting modules.
|
|
46
|
+
- Import **only** from `cursor/canvas`. No relative imports, no npm packages, no Node built-ins.
|
|
47
|
+
- Default-export the top-level component.
|
|
48
|
+
- Embed all data inline. **No `fetch()`, no network calls.**
|
|
49
|
+
|
|
50
|
+
**Component discovery:** prefer built-in `cursor/canvas` components over hand-rolled markup. The full public surface (components, hooks, prop types, tokens) is declared in `~/.cursor/skills-cursor/canvas/sdk/index.d.ts` and its sibling `.d.ts` files — read them when you need exact exports, prop shapes, or hook signatures rather than guessing. Referencing an export that does not exist is the most common runtime error.
|
|
51
|
+
|
|
52
|
+
Apply the design guidance below as you write, and complete its pre-delivery self-check before returning the canvas.
|
|
53
|
+
|
|
54
|
+
## Design guidance
|
|
55
|
+
|
|
56
|
+
Be creative. The SDK gives you expressive building blocks — use them in whatever combination best serves the content. But avoid slop: no gradients, no emojis, no box-shadows, no rainbow coloring. Cursor canvases are flat, minimal, and purposeful.
|
|
57
|
+
|
|
58
|
+
### Visual hierarchy
|
|
59
|
+
|
|
60
|
+
Not everything deserves equal treatment. Primary content gets more space, larger headings, and accent color. Supporting content stays compact. Squint test: blur your eyes — can you tell what matters?
|
|
61
|
+
|
|
62
|
+
**Color.** All colors from `useHostTheme()` tokens — read its JSDoc in the SDK declarations for the return shape and usage pattern. No hardcoded hex. Use accent color deliberately, not on everything.
|
|
63
|
+
|
|
64
|
+
### Slop patterns — forbidden
|
|
65
|
+
|
|
66
|
+
These specific patterns produce low-quality output. If 2+ are present, redesign.
|
|
67
|
+
|
|
68
|
+
- **Gradients** — no `linear-gradient`, `radial-gradient`, `background-clip: text`.
|
|
69
|
+
- **Emojis** — no emoji as icons, status indicators, bullets, or section markers.
|
|
70
|
+
- **Box shadows** — no `box-shadow`. Flat surfaces only.
|
|
71
|
+
- **Wall of identical cards** — every section wrapped in the same card style with no variation. Mix open sections with cards.
|
|
72
|
+
- **Rainbow coloring** — a different color on every element. Most elements are neutral; color is used sparingly with purpose.
|
|
73
|
+
- **Giant text** — font sizes above H1 (24px), or bold text stuffed in CardHeader.
|
|
74
|
+
- **Decorative borders** — colored borders on every element. Borders are structural (subtle stroke tokens), not decorative.
|
|
75
|
+
- **Borrowed defaults** — italic accent words in headings, "01/02/03" numbered section labels, monospace for non-code labels, pill-shaped buttons or chips. Stock patterns, not choices.
|
|
76
|
+
|
|
77
|
+
### Pre-delivery self-check
|
|
78
|
+
|
|
79
|
+
Before returning canvas code, verify:
|
|
80
|
+
1. Does the layout have visual hierarchy? One thing should stand out.
|
|
81
|
+
2. Is there variety in the composition? Not just a single column of uniform blocks.
|
|
82
|
+
3. Slop check: scan for the forbidden patterns above.
|
|
83
|
+
|
|
84
|
+
## Introducing the canvas
|
|
85
|
+
|
|
86
|
+
When you create a canvas, add a short note in your chat response telling the user you created a canvas they can open beside the chat:
|
|
87
|
+
|
|
88
|
+
- **First canvas** — if no other `.canvas.tsx` files exist in the workspace's `canvases/` directory, include one sentence explaining what a canvas is.
|
|
89
|
+
- **Unsolicited canvas** — if the user didn't ask for a canvas, include one sentence explaining why you chose it over plain text.
|
|
90
|
+
|
|
91
|
+
Both can apply at once; one or two sentences total is enough. Skip the intro for subsequent canvases.
|
|
92
|
+
|
|
93
|
+
## Troubleshooting
|
|
94
|
+
|
|
95
|
+
If a canvas appears blank or missing, the most common cause is that it was not written under `~/.cursor/projects/<workspace>/canvases/` exactly — re-save it to that path. Do not debug this by trying to create the managed directory manually; focus on correcting the file path instead. Users can click the canvas file path in the response to open it, just like any other file path in Cursor. When present, the canvas server writes a `<name>.canvas.status.json` sidecar after each build with `status`, `diagnostics`, or `error` fields you can read; the file is best-effort and may not exist, so don't block on it.
|
|
96
|
+
|
|
97
|
+
## Good example
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
import { Divider, Grid, H1, H2, Stack, Stat, Table, Text } from 'cursor/canvas';
|
|
101
|
+
|
|
102
|
+
export default function ServiceOverview() {
|
|
103
|
+
return (
|
|
104
|
+
<Stack gap={20}>
|
|
105
|
+
<H1>Service Overview</H1>
|
|
106
|
+
<Grid columns={3} gap={16}>
|
|
107
|
+
<Stat value="6" label="Total Services" />
|
|
108
|
+
<Stat value="5" label="Healthy" tone="success" />
|
|
109
|
+
<Stat value="1" label="Degraded" tone="warning" />
|
|
110
|
+
</Grid>
|
|
111
|
+
<Divider />
|
|
112
|
+
<H2>Service Status</H2>
|
|
113
|
+
<Table
|
|
114
|
+
headers={["Service", "Status", "Uptime", "Latency"]}
|
|
115
|
+
rows={[
|
|
116
|
+
["api-gateway", "Operational", "99.99%", "12ms"],
|
|
117
|
+
["auth-service", "Degraded", "99.2%", "340ms"],
|
|
118
|
+
["billing", "Operational", "99.8%", "45ms"],
|
|
119
|
+
]}
|
|
120
|
+
rowTone={[undefined, "warning", undefined]}
|
|
121
|
+
/>
|
|
122
|
+
<Divider />
|
|
123
|
+
<H2>Recent Changes</H2>
|
|
124
|
+
<Text>Auth service latency increased after the 14:30 deploy.</Text>
|
|
125
|
+
<Text tone="secondary" size="small">Last checked: Apr 7, 2026 14:52 UTC</Text>
|
|
126
|
+
</Stack>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Stats in a Grid, Table directly under H2, text sections without cards.
|
|
132
|
+
|
|
133
|
+
## Bad example — do not imitate
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
// BAD — every section wrapped in Card, no hierarchy, Table unnecessarily boxed
|
|
137
|
+
<Stack gap={12}>
|
|
138
|
+
<Card><CardHeader>Summary</CardHeader><CardBody><Text>6 services.</Text></CardBody></Card>
|
|
139
|
+
<Card><CardHeader>Status</CardHeader><CardBody><Table headers={[...]} rows={[...]} /></CardBody></Card>
|
|
140
|
+
<Card><CardHeader>Changes</CardHeader><CardBody><Text>Latency increased.</Text></CardBody></Card>
|
|
141
|
+
</Stack>
|
|
142
|
+
```
|