@jakkrichm/create-nexus-devflow 2.0.0 → 2.0.2
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/README.md +96 -50
- package/package.json +1 -1
- package/template/.agents/skills/20-spec/SKILL.md +136 -136
- package/template/.agents/skills/30-plan/SKILL.md +206 -206
- package/template/.agents/skills/40-implement/SKILL.md +152 -152
- package/template/.agents/skills/50-verify/SKILL.md +174 -174
- package/template/.agents/skills/60-report/SKILL.md +168 -168
- package/template/.agents/skills/70-release/SKILL.md +141 -141
- package/template/.agents/skills/9arm-skills/README.md +51 -51
- package/template/.agents/skills/9arm-skills/debug-mantra/SKILL.md +86 -86
- package/template/.agents/skills/9arm-skills/management-talk/SKILL.md +79 -79
- package/template/.agents/skills/9arm-skills/post-mortem/SKILL.md +71 -71
- package/template/.agents/skills/9arm-skills/scrutinize/SKILL.md +72 -72
- package/template/.agents/skills/agent/SKILL.md +164 -164
- package/template/.agents/skills/api-and-interface-design/SKILL.md +294 -294
- package/template/.agents/skills/app-builder/SKILL.md +75 -75
- package/template/.agents/skills/app-builder/agent-coordination.md +71 -71
- package/template/.agents/skills/app-builder/feature-building.md +53 -53
- package/template/.agents/skills/app-builder/project-detection.md +34 -34
- package/template/.agents/skills/app-builder/scaffolding.md +118 -118
- package/template/.agents/skills/app-builder/tech-stack.md +40 -40
- package/template/.agents/skills/app-builder/templates/SKILL.md +39 -39
- package/template/.agents/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
- package/template/.agents/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
- package/template/.agents/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
- package/template/.agents/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
- package/template/.agents/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
- package/template/.agents/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
- package/template/.agents/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
- package/template/.agents/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -122
- package/template/.agents/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -122
- package/template/.agents/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -169
- package/template/.agents/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -134
- package/template/.agents/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
- package/template/.agents/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -119
- package/template/.agents/skills/architecture/SKILL.md +55 -55
- package/template/.agents/skills/architecture/context-discovery.md +43 -43
- package/template/.agents/skills/architecture/examples.md +94 -94
- package/template/.agents/skills/architecture/pattern-selection.md +68 -68
- package/template/.agents/skills/architecture/patterns-reference.md +50 -50
- package/template/.agents/skills/architecture/trade-off-analysis.md +77 -77
- package/template/.agents/skills/bash-linux/SKILL.md +199 -199
- package/template/.agents/skills/behavioral-modes/SKILL.md +242 -242
- package/template/.agents/skills/brainstorm/SKILL.md +157 -157
- package/template/.agents/skills/browser-testing-with-devtools/SKILL.md +302 -302
- package/template/.agents/skills/changelog/SKILL.md +108 -108
- package/template/.agents/skills/ci-cd-and-automation/SKILL.md +390 -390
- package/template/.agents/skills/code-review-and-quality/SKILL.md +392 -392
- package/template/.agents/skills/code-simplification/SKILL.md +331 -331
- package/template/.agents/skills/commit/SKILL.md +62 -62
- package/template/.agents/skills/competitor-analysis/SKILL.md +66 -66
- package/template/.agents/skills/context-engineering/SKILL.md +290 -290
- package/template/.agents/skills/database-design/SKILL.md +52 -52
- package/template/.agents/skills/database-design/database-selection.md +43 -43
- package/template/.agents/skills/database-design/indexing.md +39 -39
- package/template/.agents/skills/database-design/migrations.md +48 -48
- package/template/.agents/skills/database-design/optimization.md +36 -36
- package/template/.agents/skills/database-design/orm-selection.md +30 -30
- package/template/.agents/skills/database-design/schema-design.md +56 -56
- package/template/.agents/skills/database-design/scripts/schema_validator.py +172 -172
- package/template/.agents/skills/debug/SKILL.md +116 -116
- package/template/.agents/skills/debugging-and-error-recovery/SKILL.md +298 -298
- package/template/.agents/skills/deploy/SKILL.md +90 -90
- package/template/.agents/skills/deployment-procedures/SKILL.md +241 -241
- package/template/.agents/skills/deprecation-and-migration/SKILL.md +206 -206
- package/template/.agents/skills/documentation-and-adrs/SKILL.md +278 -278
- package/template/.agents/skills/followup/SKILL.md +78 -78
- package/template/.agents/skills/frontend-ui-engineering/SKILL.md +326 -326
- package/template/.agents/skills/frontend-ui-engineering/accessibility-checklist.md +159 -159
- package/template/.agents/skills/git-workflow-and-versioning/SKILL.md +300 -300
- package/template/.agents/skills/goal/SKILL.md +132 -132
- package/template/.agents/skills/help/SKILL.md +242 -242
- package/template/.agents/skills/human-review-decisions/SKILL.md +74 -74
- package/template/.agents/skills/i18n-localization/SKILL.md +154 -154
- package/template/.agents/skills/i18n-localization/scripts/i18n_checker.py +241 -241
- package/template/.agents/skills/idea-refine/SKILL.md +178 -178
- package/template/.agents/skills/idea-refine/examples.md +238 -238
- package/template/.agents/skills/idea-refine/frameworks.md +99 -99
- package/template/.agents/skills/idea-refine/refinement-criteria.md +113 -113
- package/template/.agents/skills/idea-refine/scripts/idea-refine.sh +15 -15
- package/template/.agents/skills/incremental-implementation/SKILL.md +248 -248
- package/template/.agents/skills/insight/SKILL.md +130 -130
- package/template/.agents/skills/insight-capture/SKILL.md +84 -84
- package/template/.agents/skills/intelligent-routing/SKILL.md +171 -171
- package/template/.agents/skills/issue-triage/SKILL.md +106 -106
- package/template/.agents/skills/lint-and-validate/SKILL.md +45 -45
- package/template/.agents/skills/lint-and-validate/scripts/lint_runner.py +184 -184
- package/template/.agents/skills/lint-and-validate/scripts/type_coverage.py +173 -173
- package/template/.agents/skills/mcp-builder/SKILL.md +176 -176
- package/template/.agents/skills/md2html/SKILL.md +154 -154
- package/template/.agents/skills/md2html/components.md +505 -505
- package/template/.agents/skills/md2html/template.html +1152 -1152
- package/template/.agents/skills/merge/SKILL.md +75 -75
- package/template/.agents/skills/mobile-design/SKILL.md +394 -394
- package/template/.agents/skills/mobile-design/decision-trees.md +516 -516
- package/template/.agents/skills/mobile-design/mobile-backend.md +491 -491
- package/template/.agents/skills/mobile-design/mobile-color-system.md +420 -420
- package/template/.agents/skills/mobile-design/mobile-debugging.md +122 -122
- package/template/.agents/skills/mobile-design/mobile-design-thinking.md +357 -357
- package/template/.agents/skills/mobile-design/mobile-navigation.md +458 -458
- package/template/.agents/skills/mobile-design/mobile-performance.md +767 -767
- package/template/.agents/skills/mobile-design/mobile-testing.md +356 -356
- package/template/.agents/skills/mobile-design/mobile-typography.md +433 -433
- package/template/.agents/skills/mobile-design/platform-android.md +666 -666
- package/template/.agents/skills/mobile-design/platform-ios.md +561 -561
- package/template/.agents/skills/mobile-design/scripts/mobile_audit.py +670 -670
- package/template/.agents/skills/mobile-design/touch-psychology.md +537 -537
- package/template/.agents/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -312
- package/template/.agents/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -240
- package/template/.agents/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -490
- package/template/.agents/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -264
- package/template/.agents/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -581
- package/template/.agents/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -432
- package/template/.agents/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -684
- package/template/.agents/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -150
- package/template/.agents/skills/nextjs-react-expert/SKILL.md +286 -286
- package/template/.agents/skills/nextjs-react-expert/scripts/convert_rules.py +222 -222
- package/template/.agents/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -252
- package/template/.agents/skills/nodejs-best-practices/SKILL.md +333 -333
- package/template/.agents/skills/package-json-generator/SKILL.md +60 -60
- package/template/.agents/skills/package-json-generator/scripts/generate.js +120 -120
- package/template/.agents/skills/package-json-generator/scripts/run.sh +19 -19
- package/template/.agents/skills/parallel-agents/SKILL.md +144 -144
- package/template/.agents/skills/performance-optimization/SKILL.md +299 -299
- package/template/.agents/skills/performance-optimization/performance-checklist.md +113 -113
- package/template/.agents/skills/planning-and-task-breakdown/SKILL.md +239 -239
- package/template/.agents/skills/powershell-windows/SKILL.md +167 -167
- package/template/.agents/skills/pr/SKILL.md +92 -92
- package/template/.agents/skills/pr-review/SKILL.md +142 -142
- package/template/.agents/skills/pr-review-analysis/SKILL.md +89 -89
- package/template/.agents/skills/prd/SKILL.md +112 -112
- package/template/.agents/skills/preview/SKILL.md +116 -116
- package/template/.agents/skills/preview-local-check/SKILL.md +59 -59
- package/template/.agents/skills/python-patterns/SKILL.md +441 -441
- package/template/.agents/skills/release-git-operations/SKILL.md +97 -97
- package/template/.agents/skills/research/SKILL.md +127 -127
- package/template/.agents/skills/review/SKILL.md +55 -55
- package/template/.agents/skills/review-followup-routing/SKILL.md +98 -98
- package/template/.agents/skills/roadmap-strategy/SKILL.md +97 -97
- package/template/.agents/skills/security-and-hardening/SKILL.md +349 -349
- package/template/.agents/skills/security-and-hardening/security-checklist.md +134 -134
- package/template/.agents/skills/security-review/SKILL.md +164 -164
- package/template/.agents/skills/seo-fundamentals/SKILL.md +129 -129
- package/template/.agents/skills/seo-fundamentals/scripts/seo_checker.py +219 -219
- package/template/.agents/skills/server-management/SKILL.md +161 -161
- package/template/.agents/skills/shipping-and-launch/SKILL.md +311 -311
- package/template/.agents/skills/silent-failure-audit/SKILL.md +73 -73
- package/template/.agents/skills/simplify/SKILL.md +74 -74
- package/template/.agents/skills/skill-development/SKILL.md +86 -86
- package/template/.agents/skills/spec-driven-development/SKILL.md +207 -207
- package/template/.agents/skills/spec-orchestration/SKILL.md +91 -91
- package/template/.agents/skills/specialist-agent-routing/SKILL.md +107 -107
- package/template/.agents/skills/tailwind-patterns/SKILL.md +269 -269
- package/template/.agents/skills/test/SKILL.md +77 -77
- package/template/.agents/skills/test-driven-development/SKILL.md +422 -422
- package/template/.agents/skills/test-driven-development/testing-patterns.md +236 -236
- package/template/.agents/skills/test-execution-and-coverage/SKILL.md +56 -56
- package/template/.agents/skills/type-design/SKILL.md +84 -84
- package/template/.agents/skills/ui-ux-pro-max/SKILL.md +75 -75
- package/template/.agents/skills/using-agent-skills/SKILL.md +171 -171
- package/template/.agents/skills/verification-orchestration/SKILL.md +68 -68
- package/template/.agents/skills/vulnerability-scanner/SKILL.md +276 -276
- package/template/.agents/skills/vulnerability-scanner/checklists.md +121 -121
- package/template/.agents/skills/vulnerability-scanner/scripts/security_scan.py +458 -458
- package/template/.agents/skills/wiki/SKILL.md +148 -148
- package/template/.agents/skills/workflow-documentation-sync/SKILL.md +87 -87
- package/template/.claude/skills/20-spec/SKILL.md +136 -136
- package/template/.claude/skills/30-plan/SKILL.md +206 -206
- package/template/.claude/skills/40-implement/SKILL.md +152 -152
- package/template/.claude/skills/50-verify/SKILL.md +174 -174
- package/template/.claude/skills/60-report/SKILL.md +168 -168
- package/template/.claude/skills/70-release/SKILL.md +141 -141
- package/template/.claude/skills/9arm-skills/README.md +51 -51
- package/template/.claude/skills/9arm-skills/debug-mantra/SKILL.md +86 -86
- package/template/.claude/skills/9arm-skills/management-talk/SKILL.md +79 -79
- package/template/.claude/skills/9arm-skills/post-mortem/SKILL.md +71 -71
- package/template/.claude/skills/9arm-skills/scrutinize/SKILL.md +72 -72
- package/template/.claude/skills/agent/SKILL.md +164 -164
- package/template/.claude/skills/api-and-interface-design/SKILL.md +294 -294
- package/template/.claude/skills/app-builder/SKILL.md +75 -75
- package/template/.claude/skills/app-builder/agent-coordination.md +71 -71
- package/template/.claude/skills/app-builder/feature-building.md +53 -53
- package/template/.claude/skills/app-builder/project-detection.md +34 -34
- package/template/.claude/skills/app-builder/scaffolding.md +118 -118
- package/template/.claude/skills/app-builder/tech-stack.md +40 -40
- package/template/.claude/skills/app-builder/templates/SKILL.md +39 -39
- package/template/.claude/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
- package/template/.claude/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
- package/template/.claude/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
- package/template/.claude/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
- package/template/.claude/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
- package/template/.claude/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
- package/template/.claude/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
- package/template/.claude/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -122
- package/template/.claude/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -122
- package/template/.claude/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -169
- package/template/.claude/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -134
- package/template/.claude/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
- package/template/.claude/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -119
- package/template/.claude/skills/architecture/SKILL.md +55 -55
- package/template/.claude/skills/architecture/context-discovery.md +43 -43
- package/template/.claude/skills/architecture/examples.md +94 -94
- package/template/.claude/skills/architecture/pattern-selection.md +68 -68
- package/template/.claude/skills/architecture/patterns-reference.md +50 -50
- package/template/.claude/skills/architecture/trade-off-analysis.md +77 -77
- package/template/.claude/skills/bash-linux/SKILL.md +199 -199
- package/template/.claude/skills/behavioral-modes/SKILL.md +242 -242
- package/template/.claude/skills/brainstorm/SKILL.md +157 -157
- package/template/.claude/skills/browser-testing-with-devtools/SKILL.md +302 -302
- package/template/.claude/skills/changelog/SKILL.md +108 -108
- package/template/.claude/skills/ci-cd-and-automation/SKILL.md +390 -390
- package/template/.claude/skills/code-review-and-quality/SKILL.md +392 -392
- package/template/.claude/skills/code-simplification/SKILL.md +331 -331
- package/template/.claude/skills/commit/SKILL.md +62 -62
- package/template/.claude/skills/competitor-analysis/SKILL.md +66 -66
- package/template/.claude/skills/context-engineering/SKILL.md +290 -290
- package/template/.claude/skills/database-design/SKILL.md +52 -52
- package/template/.claude/skills/database-design/database-selection.md +43 -43
- package/template/.claude/skills/database-design/indexing.md +39 -39
- package/template/.claude/skills/database-design/migrations.md +48 -48
- package/template/.claude/skills/database-design/optimization.md +36 -36
- package/template/.claude/skills/database-design/orm-selection.md +30 -30
- package/template/.claude/skills/database-design/schema-design.md +56 -56
- package/template/.claude/skills/database-design/scripts/schema_validator.py +172 -172
- package/template/.claude/skills/debug/SKILL.md +116 -116
- package/template/.claude/skills/debugging-and-error-recovery/SKILL.md +298 -298
- package/template/.claude/skills/deploy/SKILL.md +90 -90
- package/template/.claude/skills/deployment-procedures/SKILL.md +241 -241
- package/template/.claude/skills/deprecation-and-migration/SKILL.md +206 -206
- package/template/.claude/skills/documentation-and-adrs/SKILL.md +278 -278
- package/template/.claude/skills/followup/SKILL.md +78 -78
- package/template/.claude/skills/frontend-ui-engineering/SKILL.md +326 -326
- package/template/.claude/skills/frontend-ui-engineering/accessibility-checklist.md +159 -159
- package/template/.claude/skills/git-workflow-and-versioning/SKILL.md +300 -300
- package/template/.claude/skills/goal/SKILL.md +132 -132
- package/template/.claude/skills/help/SKILL.md +242 -242
- package/template/.claude/skills/human-review-decisions/SKILL.md +74 -74
- package/template/.claude/skills/i18n-localization/SKILL.md +154 -154
- package/template/.claude/skills/i18n-localization/scripts/i18n_checker.py +241 -241
- package/template/.claude/skills/idea-refine/SKILL.md +178 -178
- package/template/.claude/skills/idea-refine/examples.md +238 -238
- package/template/.claude/skills/idea-refine/frameworks.md +99 -99
- package/template/.claude/skills/idea-refine/refinement-criteria.md +113 -113
- package/template/.claude/skills/idea-refine/scripts/idea-refine.sh +15 -15
- package/template/.claude/skills/incremental-implementation/SKILL.md +248 -248
- package/template/.claude/skills/insight/SKILL.md +130 -130
- package/template/.claude/skills/insight-capture/SKILL.md +84 -84
- package/template/.claude/skills/intelligent-routing/SKILL.md +171 -171
- package/template/.claude/skills/issue-triage/SKILL.md +106 -106
- package/template/.claude/skills/lint-and-validate/SKILL.md +45 -45
- package/template/.claude/skills/lint-and-validate/scripts/lint_runner.py +184 -184
- package/template/.claude/skills/lint-and-validate/scripts/type_coverage.py +173 -173
- package/template/.claude/skills/mcp-builder/SKILL.md +176 -176
- package/template/.claude/skills/md2html/SKILL.md +154 -154
- package/template/.claude/skills/md2html/components.md +505 -505
- package/template/.claude/skills/md2html/template.html +1152 -1152
- package/template/.claude/skills/merge/SKILL.md +75 -75
- package/template/.claude/skills/mobile-design/SKILL.md +394 -394
- package/template/.claude/skills/mobile-design/decision-trees.md +516 -516
- package/template/.claude/skills/mobile-design/mobile-backend.md +491 -491
- package/template/.claude/skills/mobile-design/mobile-color-system.md +420 -420
- package/template/.claude/skills/mobile-design/mobile-debugging.md +122 -122
- package/template/.claude/skills/mobile-design/mobile-design-thinking.md +357 -357
- package/template/.claude/skills/mobile-design/mobile-navigation.md +458 -458
- package/template/.claude/skills/mobile-design/mobile-performance.md +767 -767
- package/template/.claude/skills/mobile-design/mobile-testing.md +356 -356
- package/template/.claude/skills/mobile-design/mobile-typography.md +433 -433
- package/template/.claude/skills/mobile-design/platform-android.md +666 -666
- package/template/.claude/skills/mobile-design/platform-ios.md +561 -561
- package/template/.claude/skills/mobile-design/scripts/mobile_audit.py +670 -670
- package/template/.claude/skills/mobile-design/touch-psychology.md +537 -537
- package/template/.claude/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -312
- package/template/.claude/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -240
- package/template/.claude/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -490
- package/template/.claude/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -264
- package/template/.claude/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -581
- package/template/.claude/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -432
- package/template/.claude/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -684
- package/template/.claude/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -150
- package/template/.claude/skills/nextjs-react-expert/SKILL.md +286 -286
- package/template/.claude/skills/nextjs-react-expert/scripts/convert_rules.py +222 -222
- package/template/.claude/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -252
- package/template/.claude/skills/nodejs-best-practices/SKILL.md +333 -333
- package/template/.claude/skills/package-json-generator/SKILL.md +60 -60
- package/template/.claude/skills/package-json-generator/scripts/generate.js +120 -120
- package/template/.claude/skills/package-json-generator/scripts/run.sh +19 -19
- package/template/.claude/skills/parallel-agents/SKILL.md +144 -144
- package/template/.claude/skills/performance-optimization/SKILL.md +299 -299
- package/template/.claude/skills/performance-optimization/performance-checklist.md +113 -113
- package/template/.claude/skills/planning-and-task-breakdown/SKILL.md +239 -239
- package/template/.claude/skills/powershell-windows/SKILL.md +167 -167
- package/template/.claude/skills/pr/SKILL.md +92 -92
- package/template/.claude/skills/pr-review/SKILL.md +142 -142
- package/template/.claude/skills/pr-review-analysis/SKILL.md +89 -89
- package/template/.claude/skills/prd/SKILL.md +112 -112
- package/template/.claude/skills/preview/SKILL.md +116 -116
- package/template/.claude/skills/preview-local-check/SKILL.md +59 -59
- package/template/.claude/skills/python-patterns/SKILL.md +441 -441
- package/template/.claude/skills/release-git-operations/SKILL.md +97 -97
- package/template/.claude/skills/research/SKILL.md +127 -127
- package/template/.claude/skills/review/SKILL.md +55 -55
- package/template/.claude/skills/review-followup-routing/SKILL.md +98 -98
- package/template/.claude/skills/roadmap-strategy/SKILL.md +97 -97
- package/template/.claude/skills/security-and-hardening/SKILL.md +349 -349
- package/template/.claude/skills/security-and-hardening/security-checklist.md +134 -134
- package/template/.claude/skills/security-review/SKILL.md +164 -164
- package/template/.claude/skills/seo-fundamentals/SKILL.md +129 -129
- package/template/.claude/skills/seo-fundamentals/scripts/seo_checker.py +219 -219
- package/template/.claude/skills/server-management/SKILL.md +161 -161
- package/template/.claude/skills/shipping-and-launch/SKILL.md +311 -311
- package/template/.claude/skills/silent-failure-audit/SKILL.md +73 -73
- package/template/.claude/skills/simplify/SKILL.md +74 -74
- package/template/.claude/skills/skill-development/SKILL.md +86 -86
- package/template/.claude/skills/spec-driven-development/SKILL.md +207 -207
- package/template/.claude/skills/spec-orchestration/SKILL.md +91 -91
- package/template/.claude/skills/specialist-agent-routing/SKILL.md +107 -107
- package/template/.claude/skills/tailwind-patterns/SKILL.md +269 -269
- package/template/.claude/skills/test/SKILL.md +77 -77
- package/template/.claude/skills/test-driven-development/SKILL.md +422 -422
- package/template/.claude/skills/test-driven-development/testing-patterns.md +236 -236
- package/template/.claude/skills/test-execution-and-coverage/SKILL.md +56 -56
- package/template/.claude/skills/type-design/SKILL.md +84 -84
- package/template/.claude/skills/ui-ux-pro-max/SKILL.md +75 -75
- package/template/.claude/skills/using-agent-skills/SKILL.md +171 -171
- package/template/.claude/skills/verification-orchestration/SKILL.md +68 -68
- package/template/.claude/skills/vulnerability-scanner/SKILL.md +276 -276
- package/template/.claude/skills/vulnerability-scanner/checklists.md +121 -121
- package/template/.claude/skills/vulnerability-scanner/scripts/security_scan.py +458 -458
- package/template/.claude/skills/wiki/SKILL.md +148 -148
- package/template/.claude/skills/workflow-documentation-sync/SKILL.md +87 -87
- package/template/.nexus/nexus-devflow.json +1 -1
- package/template/AGENTS.md +3 -3
- package/template/LICENSE +21 -21
- package/template/devflow/context/project_index.json +108 -0
- package/template/.agents/skills/check-for-updates/SKILL.md +0 -117
- package/template/.agents/skills/devflow-concept-intake/SKILL.md +0 -150
- package/template/.agents/skills/devflow-concept-intake/agents/openai.yaml +0 -4
- package/template/.agents/skills/devflow-concept-intake/references/adoption-proposal-template.md +0 -60
- package/template/.agents/skills/devflow-concept-intake/references/concept-report-template.md +0 -47
- package/template/.agents/skills/devflow-concept-intake/references/upstream-tracking-template.md +0 -51
- package/template/.agents/skills/devflow-wiki/SKILL.md +0 -75
- package/template/.agents/skills/english-to-thai-translator/SKILL.md +0 -125
- package/template/.agents/skills/obsidian-bases/SKILL.md +0 -506
- package/template/.agents/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -173
- package/template/.agents/skills/obsidian-cli/SKILL.md +0 -115
- package/template/.agents/skills/obsidian-clipper-template-creator/SKILL.md +0 -73
- package/template/.agents/skills/obsidian-clipper-template-creator/assets/clipping-template.json +0 -51
- package/template/.agents/skills/obsidian-clipper-template-creator/assets/recipe-template.json +0 -48
- package/template/.agents/skills/obsidian-clipper-template-creator/references/analysis-workflow.md +0 -79
- package/template/.agents/skills/obsidian-clipper-template-creator/references/bases-workflow.md +0 -44
- package/template/.agents/skills/obsidian-clipper-template-creator/references/filters.md +0 -51
- package/template/.agents/skills/obsidian-clipper-template-creator/references/json-schema.md +0 -77
- package/template/.agents/skills/obsidian-clipper-template-creator/references/logic.md +0 -67
- package/template/.agents/skills/obsidian-clipper-template-creator/references/variables.md +0 -64
- package/template/.agents/skills/obsidian-markdown/SKILL.md +0 -205
- package/template/.agents/skills/obsidian-markdown/references/CALLOUTS.md +0 -58
- package/template/.agents/skills/obsidian-markdown/references/EMBEDS.md +0 -63
- package/template/.agents/skills/obsidian-markdown/references/PROPERTIES.md +0 -61
- package/template/.agents/skills/prompt-addons/SKILL.md +0 -99
- package/template/.agents/skills/prp-dev-fastapi/SKILL.md +0 -114
- package/template/.agents/skills/prp-dev-multiplatform/SKILL.md +0 -36
- package/template/.agents/skills/prp-dev-odoo/SKILL.md +0 -71
- package/template/.agents/skills/prp-dev-php/SKILL.md +0 -63
- package/template/.agents/skills/prp-sa-ba/SKILL.md +0 -52
- package/template/.agents/skills/red-team-tactics/SKILL.md +0 -199
- package/template/.agents/skills/writing-great-skills/SKILL.md +0 -65
- package/template/.claude/skills/check-for-updates/SKILL.md +0 -117
- package/template/.claude/skills/devflow-concept-intake/SKILL.md +0 -150
- package/template/.claude/skills/devflow-concept-intake/agents/openai.yaml +0 -4
- package/template/.claude/skills/devflow-concept-intake/references/adoption-proposal-template.md +0 -60
- package/template/.claude/skills/devflow-concept-intake/references/concept-report-template.md +0 -47
- package/template/.claude/skills/devflow-concept-intake/references/upstream-tracking-template.md +0 -51
- package/template/.claude/skills/devflow-wiki/SKILL.md +0 -75
- package/template/.claude/skills/english-to-thai-translator/SKILL.md +0 -125
- package/template/.claude/skills/obsidian-bases/SKILL.md +0 -506
- package/template/.claude/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -173
- package/template/.claude/skills/obsidian-cli/SKILL.md +0 -115
- package/template/.claude/skills/obsidian-clipper-template-creator/SKILL.md +0 -73
- package/template/.claude/skills/obsidian-clipper-template-creator/assets/clipping-template.json +0 -51
- package/template/.claude/skills/obsidian-clipper-template-creator/assets/recipe-template.json +0 -48
- package/template/.claude/skills/obsidian-clipper-template-creator/references/analysis-workflow.md +0 -79
- package/template/.claude/skills/obsidian-clipper-template-creator/references/bases-workflow.md +0 -44
- package/template/.claude/skills/obsidian-clipper-template-creator/references/filters.md +0 -51
- package/template/.claude/skills/obsidian-clipper-template-creator/references/json-schema.md +0 -77
- package/template/.claude/skills/obsidian-clipper-template-creator/references/logic.md +0 -67
- package/template/.claude/skills/obsidian-clipper-template-creator/references/variables.md +0 -64
- package/template/.claude/skills/obsidian-markdown/SKILL.md +0 -205
- package/template/.claude/skills/obsidian-markdown/references/CALLOUTS.md +0 -58
- package/template/.claude/skills/obsidian-markdown/references/EMBEDS.md +0 -63
- package/template/.claude/skills/obsidian-markdown/references/PROPERTIES.md +0 -61
- package/template/.claude/skills/prompt-addons/SKILL.md +0 -99
- package/template/.claude/skills/prp-dev-fastapi/SKILL.md +0 -114
- package/template/.claude/skills/prp-dev-multiplatform/SKILL.md +0 -36
- package/template/.claude/skills/prp-dev-odoo/SKILL.md +0 -71
- package/template/.claude/skills/prp-dev-php/SKILL.md +0 -63
- package/template/.claude/skills/prp-sa-ba/SKILL.md +0 -52
- package/template/.claude/skills/red-team-tactics/SKILL.md +0 -199
- package/template/.claude/skills/writing-great-skills/SKILL.md +0 -65
|
@@ -1,236 +1,236 @@
|
|
|
1
|
-
# Testing Patterns Reference
|
|
2
|
-
|
|
3
|
-
Quick reference for common testing patterns across the stack. Use alongside the `test-driven-development` skill.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Test Structure (Arrange-Act-Assert)](#test-structure-arrange-act-assert)
|
|
8
|
-
- [Test Naming Conventions](#test-naming-conventions)
|
|
9
|
-
- [Common Assertions](#common-assertions)
|
|
10
|
-
- [Mocking Patterns](#mocking-patterns)
|
|
11
|
-
- [React/Component Testing](#reactcomponent-testing)
|
|
12
|
-
- [API / Integration Testing](#api--integration-testing)
|
|
13
|
-
- [E2E Testing (Playwright)](#e2e-testing-playwright)
|
|
14
|
-
- [Test Anti-Patterns](#test-anti-patterns)
|
|
15
|
-
|
|
16
|
-
## Test Structure (Arrange-Act-Assert)
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
it('describes expected behavior', () => {
|
|
20
|
-
// Arrange: Set up test data and preconditions
|
|
21
|
-
const input = { title: 'Test Task', priority: 'high' };
|
|
22
|
-
|
|
23
|
-
// Act: Perform the action being tested
|
|
24
|
-
const result = createTask(input);
|
|
25
|
-
|
|
26
|
-
// Assert: Verify the outcome
|
|
27
|
-
expect(result.title).toBe('Test Task');
|
|
28
|
-
expect(result.priority).toBe('high');
|
|
29
|
-
expect(result.status).toBe('pending');
|
|
30
|
-
});
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Test Naming Conventions
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
// Pattern: [unit] [expected behavior] [condition]
|
|
37
|
-
describe('TaskService.createTask', () => {
|
|
38
|
-
it('creates a task with default pending status', () => {});
|
|
39
|
-
it('throws ValidationError when title is empty', () => {});
|
|
40
|
-
it('trims whitespace from title', () => {});
|
|
41
|
-
it('generates a unique ID for each task', () => {});
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Common Assertions
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
// Equality
|
|
49
|
-
expect(result).toBe(expected); // Strict equality (===)
|
|
50
|
-
expect(result).toEqual(expected); // Deep equality (objects/arrays)
|
|
51
|
-
expect(result).toStrictEqual(expected); // Deep equality + type matching
|
|
52
|
-
|
|
53
|
-
// Truthiness
|
|
54
|
-
expect(result).toBeTruthy();
|
|
55
|
-
expect(result).toBeFalsy();
|
|
56
|
-
expect(result).toBeNull();
|
|
57
|
-
expect(result).toBeDefined();
|
|
58
|
-
expect(result).toBeUndefined();
|
|
59
|
-
|
|
60
|
-
// Numbers
|
|
61
|
-
expect(result).toBeGreaterThan(5);
|
|
62
|
-
expect(result).toBeLessThanOrEqual(10);
|
|
63
|
-
expect(result).toBeCloseTo(0.3, 5); // Floating point
|
|
64
|
-
|
|
65
|
-
// Strings
|
|
66
|
-
expect(result).toMatch(/pattern/);
|
|
67
|
-
expect(result).toContain('substring');
|
|
68
|
-
|
|
69
|
-
// Arrays / Objects
|
|
70
|
-
expect(array).toContain(item);
|
|
71
|
-
expect(array).toHaveLength(3);
|
|
72
|
-
expect(object).toHaveProperty('key', 'value');
|
|
73
|
-
|
|
74
|
-
// Errors
|
|
75
|
-
expect(() => fn()).toThrow();
|
|
76
|
-
expect(() => fn()).toThrow(ValidationError);
|
|
77
|
-
expect(() => fn()).toThrow('specific message');
|
|
78
|
-
|
|
79
|
-
// Async
|
|
80
|
-
await expect(asyncFn()).resolves.toBe(value);
|
|
81
|
-
await expect(asyncFn()).rejects.toThrow(Error);
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Mocking Patterns
|
|
85
|
-
|
|
86
|
-
### Mock Functions
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
const mockFn = jest.fn();
|
|
90
|
-
mockFn.mockReturnValue(42);
|
|
91
|
-
mockFn.mockResolvedValue({ data: 'test' });
|
|
92
|
-
mockFn.mockImplementation((x) => x * 2);
|
|
93
|
-
|
|
94
|
-
expect(mockFn).toHaveBeenCalled();
|
|
95
|
-
expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2');
|
|
96
|
-
expect(mockFn).toHaveBeenCalledTimes(3);
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Mock Modules
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
// Mock an entire module
|
|
103
|
-
jest.mock('./database', () => ({
|
|
104
|
-
query: jest.fn().mockResolvedValue([{ id: 1, title: 'Test' }]),
|
|
105
|
-
}));
|
|
106
|
-
|
|
107
|
-
// Mock specific exports
|
|
108
|
-
jest.mock('./utils', () => ({
|
|
109
|
-
...jest.requireActual('./utils'),
|
|
110
|
-
generateId: jest.fn().mockReturnValue('test-id'),
|
|
111
|
-
}));
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Mock at Boundaries Only
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
Mock these: Don't mock these:
|
|
118
|
-
├── Database calls ├── Internal utility functions
|
|
119
|
-
├── HTTP requests ├── Business logic
|
|
120
|
-
├── File system operations ├── Data transformations
|
|
121
|
-
├── External API calls ├── Validation functions
|
|
122
|
-
└── Time/Date (when needed) └── Pure functions
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## React/Component Testing
|
|
126
|
-
|
|
127
|
-
```tsx
|
|
128
|
-
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
129
|
-
|
|
130
|
-
describe('TaskForm', () => {
|
|
131
|
-
it('submits the form with entered data', async () => {
|
|
132
|
-
const onSubmit = jest.fn();
|
|
133
|
-
render(<TaskForm onSubmit={onSubmit} />);
|
|
134
|
-
|
|
135
|
-
// Find elements by accessible role/label (not test IDs)
|
|
136
|
-
await screen.findByRole('textbox', { name: /title/i });
|
|
137
|
-
fireEvent.change(screen.getByRole('textbox', { name: /title/i }), {
|
|
138
|
-
target: { value: 'New Task' },
|
|
139
|
-
});
|
|
140
|
-
fireEvent.click(screen.getByRole('button', { name: /create/i }));
|
|
141
|
-
|
|
142
|
-
await waitFor(() => {
|
|
143
|
-
expect(onSubmit).toHaveBeenCalledWith({ title: 'New Task' });
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it('shows validation error for empty title', async () => {
|
|
148
|
-
render(<TaskForm onSubmit={jest.fn()} />);
|
|
149
|
-
|
|
150
|
-
fireEvent.click(screen.getByRole('button', { name: /create/i }));
|
|
151
|
-
|
|
152
|
-
expect(await screen.findByText(/title is required/i)).toBeInTheDocument();
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## API / Integration Testing
|
|
158
|
-
|
|
159
|
-
```typescript
|
|
160
|
-
import request from 'supertest';
|
|
161
|
-
import { app } from '../src/app';
|
|
162
|
-
|
|
163
|
-
describe('POST /api/tasks', () => {
|
|
164
|
-
it('creates a task and returns 201', async () => {
|
|
165
|
-
const response = await request(app)
|
|
166
|
-
.post('/api/tasks')
|
|
167
|
-
.send({ title: 'Test Task' })
|
|
168
|
-
.set('Authorization', `Bearer ${testToken}`)
|
|
169
|
-
.expect(201);
|
|
170
|
-
|
|
171
|
-
expect(response.body).toMatchObject({
|
|
172
|
-
id: expect.any(String),
|
|
173
|
-
title: 'Test Task',
|
|
174
|
-
status: 'pending',
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it('returns 422 for invalid input', async () => {
|
|
179
|
-
const response = await request(app)
|
|
180
|
-
.post('/api/tasks')
|
|
181
|
-
.send({ title: '' })
|
|
182
|
-
.set('Authorization', `Bearer ${testToken}`)
|
|
183
|
-
.expect(422);
|
|
184
|
-
|
|
185
|
-
expect(response.body.error.code).toBe('VALIDATION_ERROR');
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('returns 401 without authentication', async () => {
|
|
189
|
-
await request(app)
|
|
190
|
-
.post('/api/tasks')
|
|
191
|
-
.send({ title: 'Test' })
|
|
192
|
-
.expect(401);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## E2E Testing (Playwright)
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
import { test, expect } from '@playwright/test';
|
|
201
|
-
|
|
202
|
-
test('user can create and complete a task', async ({ page }) => {
|
|
203
|
-
// Navigate and authenticate
|
|
204
|
-
await page.goto('/');
|
|
205
|
-
await page.fill('[name="email"]', 'test@example.com');
|
|
206
|
-
await page.fill('[name="password"]', 'testpass123');
|
|
207
|
-
await page.click('button:has-text("Log in")');
|
|
208
|
-
|
|
209
|
-
// Create a task
|
|
210
|
-
await page.click('button:has-text("New Task")');
|
|
211
|
-
await page.fill('[name="title"]', 'Buy groceries');
|
|
212
|
-
await page.click('button:has-text("Create")');
|
|
213
|
-
|
|
214
|
-
// Verify task appears
|
|
215
|
-
await expect(page.locator('text=Buy groceries')).toBeVisible();
|
|
216
|
-
|
|
217
|
-
// Complete the task
|
|
218
|
-
await page.click('[aria-label="Complete Buy groceries"]');
|
|
219
|
-
await expect(page.locator('text=Buy groceries')).toHaveCSS(
|
|
220
|
-
'text-decoration-line', 'line-through'
|
|
221
|
-
);
|
|
222
|
-
});
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
## Test Anti-Patterns
|
|
226
|
-
|
|
227
|
-
| Anti-Pattern | Problem | Better Approach |
|
|
228
|
-
|---|---|---|
|
|
229
|
-
| Testing implementation details | Breaks on refactor | Test inputs/outputs |
|
|
230
|
-
| Snapshot everything | No one reviews snapshot diffs | Assert specific values |
|
|
231
|
-
| Shared mutable state | Tests pollute each other | Setup/teardown per test |
|
|
232
|
-
| Testing third-party code | Wastes time, not your bug | Mock the boundary |
|
|
233
|
-
| Skipping tests to pass CI | Hides real bugs | Fix or delete the test |
|
|
234
|
-
| Using `test.skip` permanently | Dead code | Remove or fix it |
|
|
235
|
-
| Overly broad assertions | Doesn't catch regressions | Be specific |
|
|
236
|
-
| No async error handling | Swallowed errors, false passes | Always `await` async tests |
|
|
1
|
+
# Testing Patterns Reference
|
|
2
|
+
|
|
3
|
+
Quick reference for common testing patterns across the stack. Use alongside the `test-driven-development` skill.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Test Structure (Arrange-Act-Assert)](#test-structure-arrange-act-assert)
|
|
8
|
+
- [Test Naming Conventions](#test-naming-conventions)
|
|
9
|
+
- [Common Assertions](#common-assertions)
|
|
10
|
+
- [Mocking Patterns](#mocking-patterns)
|
|
11
|
+
- [React/Component Testing](#reactcomponent-testing)
|
|
12
|
+
- [API / Integration Testing](#api--integration-testing)
|
|
13
|
+
- [E2E Testing (Playwright)](#e2e-testing-playwright)
|
|
14
|
+
- [Test Anti-Patterns](#test-anti-patterns)
|
|
15
|
+
|
|
16
|
+
## Test Structure (Arrange-Act-Assert)
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
it('describes expected behavior', () => {
|
|
20
|
+
// Arrange: Set up test data and preconditions
|
|
21
|
+
const input = { title: 'Test Task', priority: 'high' };
|
|
22
|
+
|
|
23
|
+
// Act: Perform the action being tested
|
|
24
|
+
const result = createTask(input);
|
|
25
|
+
|
|
26
|
+
// Assert: Verify the outcome
|
|
27
|
+
expect(result.title).toBe('Test Task');
|
|
28
|
+
expect(result.priority).toBe('high');
|
|
29
|
+
expect(result.status).toBe('pending');
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Test Naming Conventions
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// Pattern: [unit] [expected behavior] [condition]
|
|
37
|
+
describe('TaskService.createTask', () => {
|
|
38
|
+
it('creates a task with default pending status', () => {});
|
|
39
|
+
it('throws ValidationError when title is empty', () => {});
|
|
40
|
+
it('trims whitespace from title', () => {});
|
|
41
|
+
it('generates a unique ID for each task', () => {});
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Common Assertions
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// Equality
|
|
49
|
+
expect(result).toBe(expected); // Strict equality (===)
|
|
50
|
+
expect(result).toEqual(expected); // Deep equality (objects/arrays)
|
|
51
|
+
expect(result).toStrictEqual(expected); // Deep equality + type matching
|
|
52
|
+
|
|
53
|
+
// Truthiness
|
|
54
|
+
expect(result).toBeTruthy();
|
|
55
|
+
expect(result).toBeFalsy();
|
|
56
|
+
expect(result).toBeNull();
|
|
57
|
+
expect(result).toBeDefined();
|
|
58
|
+
expect(result).toBeUndefined();
|
|
59
|
+
|
|
60
|
+
// Numbers
|
|
61
|
+
expect(result).toBeGreaterThan(5);
|
|
62
|
+
expect(result).toBeLessThanOrEqual(10);
|
|
63
|
+
expect(result).toBeCloseTo(0.3, 5); // Floating point
|
|
64
|
+
|
|
65
|
+
// Strings
|
|
66
|
+
expect(result).toMatch(/pattern/);
|
|
67
|
+
expect(result).toContain('substring');
|
|
68
|
+
|
|
69
|
+
// Arrays / Objects
|
|
70
|
+
expect(array).toContain(item);
|
|
71
|
+
expect(array).toHaveLength(3);
|
|
72
|
+
expect(object).toHaveProperty('key', 'value');
|
|
73
|
+
|
|
74
|
+
// Errors
|
|
75
|
+
expect(() => fn()).toThrow();
|
|
76
|
+
expect(() => fn()).toThrow(ValidationError);
|
|
77
|
+
expect(() => fn()).toThrow('specific message');
|
|
78
|
+
|
|
79
|
+
// Async
|
|
80
|
+
await expect(asyncFn()).resolves.toBe(value);
|
|
81
|
+
await expect(asyncFn()).rejects.toThrow(Error);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Mocking Patterns
|
|
85
|
+
|
|
86
|
+
### Mock Functions
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
const mockFn = jest.fn();
|
|
90
|
+
mockFn.mockReturnValue(42);
|
|
91
|
+
mockFn.mockResolvedValue({ data: 'test' });
|
|
92
|
+
mockFn.mockImplementation((x) => x * 2);
|
|
93
|
+
|
|
94
|
+
expect(mockFn).toHaveBeenCalled();
|
|
95
|
+
expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2');
|
|
96
|
+
expect(mockFn).toHaveBeenCalledTimes(3);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Mock Modules
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// Mock an entire module
|
|
103
|
+
jest.mock('./database', () => ({
|
|
104
|
+
query: jest.fn().mockResolvedValue([{ id: 1, title: 'Test' }]),
|
|
105
|
+
}));
|
|
106
|
+
|
|
107
|
+
// Mock specific exports
|
|
108
|
+
jest.mock('./utils', () => ({
|
|
109
|
+
...jest.requireActual('./utils'),
|
|
110
|
+
generateId: jest.fn().mockReturnValue('test-id'),
|
|
111
|
+
}));
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Mock at Boundaries Only
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
Mock these: Don't mock these:
|
|
118
|
+
├── Database calls ├── Internal utility functions
|
|
119
|
+
├── HTTP requests ├── Business logic
|
|
120
|
+
├── File system operations ├── Data transformations
|
|
121
|
+
├── External API calls ├── Validation functions
|
|
122
|
+
└── Time/Date (when needed) └── Pure functions
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## React/Component Testing
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
129
|
+
|
|
130
|
+
describe('TaskForm', () => {
|
|
131
|
+
it('submits the form with entered data', async () => {
|
|
132
|
+
const onSubmit = jest.fn();
|
|
133
|
+
render(<TaskForm onSubmit={onSubmit} />);
|
|
134
|
+
|
|
135
|
+
// Find elements by accessible role/label (not test IDs)
|
|
136
|
+
await screen.findByRole('textbox', { name: /title/i });
|
|
137
|
+
fireEvent.change(screen.getByRole('textbox', { name: /title/i }), {
|
|
138
|
+
target: { value: 'New Task' },
|
|
139
|
+
});
|
|
140
|
+
fireEvent.click(screen.getByRole('button', { name: /create/i }));
|
|
141
|
+
|
|
142
|
+
await waitFor(() => {
|
|
143
|
+
expect(onSubmit).toHaveBeenCalledWith({ title: 'New Task' });
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('shows validation error for empty title', async () => {
|
|
148
|
+
render(<TaskForm onSubmit={jest.fn()} />);
|
|
149
|
+
|
|
150
|
+
fireEvent.click(screen.getByRole('button', { name: /create/i }));
|
|
151
|
+
|
|
152
|
+
expect(await screen.findByText(/title is required/i)).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## API / Integration Testing
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
import request from 'supertest';
|
|
161
|
+
import { app } from '../src/app';
|
|
162
|
+
|
|
163
|
+
describe('POST /api/tasks', () => {
|
|
164
|
+
it('creates a task and returns 201', async () => {
|
|
165
|
+
const response = await request(app)
|
|
166
|
+
.post('/api/tasks')
|
|
167
|
+
.send({ title: 'Test Task' })
|
|
168
|
+
.set('Authorization', `Bearer ${testToken}`)
|
|
169
|
+
.expect(201);
|
|
170
|
+
|
|
171
|
+
expect(response.body).toMatchObject({
|
|
172
|
+
id: expect.any(String),
|
|
173
|
+
title: 'Test Task',
|
|
174
|
+
status: 'pending',
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('returns 422 for invalid input', async () => {
|
|
179
|
+
const response = await request(app)
|
|
180
|
+
.post('/api/tasks')
|
|
181
|
+
.send({ title: '' })
|
|
182
|
+
.set('Authorization', `Bearer ${testToken}`)
|
|
183
|
+
.expect(422);
|
|
184
|
+
|
|
185
|
+
expect(response.body.error.code).toBe('VALIDATION_ERROR');
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('returns 401 without authentication', async () => {
|
|
189
|
+
await request(app)
|
|
190
|
+
.post('/api/tasks')
|
|
191
|
+
.send({ title: 'Test' })
|
|
192
|
+
.expect(401);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## E2E Testing (Playwright)
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
import { test, expect } from '@playwright/test';
|
|
201
|
+
|
|
202
|
+
test('user can create and complete a task', async ({ page }) => {
|
|
203
|
+
// Navigate and authenticate
|
|
204
|
+
await page.goto('/');
|
|
205
|
+
await page.fill('[name="email"]', 'test@example.com');
|
|
206
|
+
await page.fill('[name="password"]', 'testpass123');
|
|
207
|
+
await page.click('button:has-text("Log in")');
|
|
208
|
+
|
|
209
|
+
// Create a task
|
|
210
|
+
await page.click('button:has-text("New Task")');
|
|
211
|
+
await page.fill('[name="title"]', 'Buy groceries');
|
|
212
|
+
await page.click('button:has-text("Create")');
|
|
213
|
+
|
|
214
|
+
// Verify task appears
|
|
215
|
+
await expect(page.locator('text=Buy groceries')).toBeVisible();
|
|
216
|
+
|
|
217
|
+
// Complete the task
|
|
218
|
+
await page.click('[aria-label="Complete Buy groceries"]');
|
|
219
|
+
await expect(page.locator('text=Buy groceries')).toHaveCSS(
|
|
220
|
+
'text-decoration-line', 'line-through'
|
|
221
|
+
);
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Test Anti-Patterns
|
|
226
|
+
|
|
227
|
+
| Anti-Pattern | Problem | Better Approach |
|
|
228
|
+
|---|---|---|
|
|
229
|
+
| Testing implementation details | Breaks on refactor | Test inputs/outputs |
|
|
230
|
+
| Snapshot everything | No one reviews snapshot diffs | Assert specific values |
|
|
231
|
+
| Shared mutable state | Tests pollute each other | Setup/teardown per test |
|
|
232
|
+
| Testing third-party code | Wastes time, not your bug | Mock the boundary |
|
|
233
|
+
| Skipping tests to pass CI | Hides real bugs | Fix or delete the test |
|
|
234
|
+
| Using `test.skip` permanently | Dead code | Remove or fix it |
|
|
235
|
+
| Overly broad assertions | Doesn't catch regressions | Be specific |
|
|
236
|
+
| No async error handling | Swallowed errors, false passes | Always `await` async tests |
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: test-execution-and-coverage
|
|
3
|
-
description: Generate missing tests, run existing tests, and summarize coverage and failures. Use when implementation or verification needs explicit testing evidence beyond a general TDD reminder.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Test Execution And Coverage
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
This skill complements TDD by handling test generation, execution, and persistent reporting.
|
|
11
|
-
|
|
12
|
-
## When to Use
|
|
13
|
-
|
|
14
|
-
- During `/40-Implement` when tests need to be added
|
|
15
|
-
- During `/50-Verify` when the test suite must be run and summarized
|
|
16
|
-
- During `Debug` when a bug needs a reproduction test
|
|
17
|
-
|
|
18
|
-
## Process
|
|
19
|
-
|
|
20
|
-
### 1. Decide Test Mode
|
|
21
|
-
|
|
22
|
-
- generate tests for a target
|
|
23
|
-
- run the existing test suite
|
|
24
|
-
- inspect coverage when the project supports it
|
|
25
|
-
|
|
26
|
-
### 2. Use Project-Native Test Commands
|
|
27
|
-
|
|
28
|
-
- prefer the project's real framework and real commands
|
|
29
|
-
- highlight failed assertions clearly
|
|
30
|
-
- distinguish test generation from test execution
|
|
31
|
-
|
|
32
|
-
### 3. Save Reusable Report
|
|
33
|
-
|
|
34
|
-
Write reusable output under:
|
|
35
|
-
|
|
36
|
-
```text
|
|
37
|
-
devflow/reports/{date}-test-report-{slug}.md
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Use `.agent/resources/schemas/test_report.template.md` when saving a reusable report.
|
|
41
|
-
|
|
42
|
-
### 4. Route Back
|
|
43
|
-
|
|
44
|
-
- `/50-Verify` when tests support formal verification
|
|
45
|
-
- `/40-Implement` when missing or failing tests require code changes
|
|
46
|
-
- `Debug` when failures need RCA
|
|
47
|
-
|
|
48
|
-
## Output
|
|
49
|
-
|
|
50
|
-
Return:
|
|
51
|
-
|
|
52
|
-
- what tests were generated or run
|
|
53
|
-
- command output summary
|
|
54
|
-
- pass/fail state
|
|
55
|
-
- gaps and risks
|
|
56
|
-
- recommended return stage
|
|
1
|
+
---
|
|
2
|
+
name: test-execution-and-coverage
|
|
3
|
+
description: Generate missing tests, run existing tests, and summarize coverage and failures. Use when implementation or verification needs explicit testing evidence beyond a general TDD reminder.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Test Execution And Coverage
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill complements TDD by handling test generation, execution, and persistent reporting.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- During `/40-Implement` when tests need to be added
|
|
15
|
+
- During `/50-Verify` when the test suite must be run and summarized
|
|
16
|
+
- During `Debug` when a bug needs a reproduction test
|
|
17
|
+
|
|
18
|
+
## Process
|
|
19
|
+
|
|
20
|
+
### 1. Decide Test Mode
|
|
21
|
+
|
|
22
|
+
- generate tests for a target
|
|
23
|
+
- run the existing test suite
|
|
24
|
+
- inspect coverage when the project supports it
|
|
25
|
+
|
|
26
|
+
### 2. Use Project-Native Test Commands
|
|
27
|
+
|
|
28
|
+
- prefer the project's real framework and real commands
|
|
29
|
+
- highlight failed assertions clearly
|
|
30
|
+
- distinguish test generation from test execution
|
|
31
|
+
|
|
32
|
+
### 3. Save Reusable Report
|
|
33
|
+
|
|
34
|
+
Write reusable output under:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
devflow/reports/{date}-test-report-{slug}.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Use `.agent/resources/schemas/test_report.template.md` when saving a reusable report.
|
|
41
|
+
|
|
42
|
+
### 4. Route Back
|
|
43
|
+
|
|
44
|
+
- `/50-Verify` when tests support formal verification
|
|
45
|
+
- `/40-Implement` when missing or failing tests require code changes
|
|
46
|
+
- `Debug` when failures need RCA
|
|
47
|
+
|
|
48
|
+
## Output
|
|
49
|
+
|
|
50
|
+
Return:
|
|
51
|
+
|
|
52
|
+
- what tests were generated or run
|
|
53
|
+
- command output summary
|
|
54
|
+
- pass/fail state
|
|
55
|
+
- gaps and risks
|
|
56
|
+
- recommended return stage
|