cfsa-antigravity 1.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.
Files changed (378) hide show
  1. package/bin/cli.mjs +324 -0
  2. package/package.json +34 -0
  3. package/template/.agent/instructions/commands.md +48 -0
  4. package/template/.agent/instructions/patterns.md +61 -0
  5. package/template/.agent/instructions/structure.md +29 -0
  6. package/template/.agent/instructions/tech-stack.md +43 -0
  7. package/template/.agent/instructions/workflow.md +41 -0
  8. package/template/.agent/kit-sync.md +15 -0
  9. package/template/.agent/rules/boundary-not-placeholder.md +146 -0
  10. package/template/.agent/rules/completion-checklist.md +48 -0
  11. package/template/.agent/rules/decision-classification.md +103 -0
  12. package/template/.agent/rules/extensibility.md +47 -0
  13. package/template/.agent/rules/question-vs-command.md +81 -0
  14. package/template/.agent/rules/security-first.md +43 -0
  15. package/template/.agent/rules/specificity-standards.md +54 -0
  16. package/template/.agent/rules/tdd-contract-first.md +57 -0
  17. package/template/.agent/rules/vertical-slices.md +42 -0
  18. package/template/.agent/skill-library/MANIFEST.md +480 -0
  19. package/template/.agent/skill-library/README.md +38 -0
  20. package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
  21. package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
  22. package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
  23. package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
  24. package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
  25. package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
  26. package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
  27. package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
  28. package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
  29. package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
  30. package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
  31. package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
  32. package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
  33. package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
  34. package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
  35. package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
  36. package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
  37. package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
  38. package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
  39. package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
  40. package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
  41. package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
  42. package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
  43. package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
  44. package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
  45. package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
  46. package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
  47. package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
  48. package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
  49. package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
  50. package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
  51. package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
  52. package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
  53. package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
  54. package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
  55. package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
  56. package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
  57. package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
  58. package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
  59. package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
  60. package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
  61. package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
  62. package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
  63. package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
  64. package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
  65. package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
  66. package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
  67. package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
  68. package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
  69. package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
  70. package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
  71. package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
  72. package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
  73. package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
  74. package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
  75. package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
  76. package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
  77. package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
  78. package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
  79. package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
  80. package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
  81. package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
  82. package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
  83. package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
  84. package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
  85. package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
  86. package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
  87. package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
  88. package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
  89. package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
  90. package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
  91. package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
  92. package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
  93. package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
  94. package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
  95. package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
  96. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
  97. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
  98. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
  99. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
  100. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
  101. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
  102. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
  103. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
  104. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
  105. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
  106. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
  107. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
  108. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
  109. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
  110. package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
  111. package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
  112. package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
  113. package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
  114. package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
  115. package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
  116. package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
  117. package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
  118. package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
  119. package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
  120. package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
  121. package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
  122. package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
  123. package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
  124. package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
  125. package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
  126. package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
  127. package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
  128. package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
  129. package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
  130. package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
  131. package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
  132. package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
  133. package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
  134. package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
  135. package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
  136. package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
  137. package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
  138. package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
  139. package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
  140. package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
  141. package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
  142. package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
  143. package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
  144. package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
  145. package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
  146. package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
  147. package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
  148. package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
  149. package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
  150. package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
  151. package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
  152. package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
  153. package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
  154. package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
  155. package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
  156. package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
  157. package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
  158. package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
  159. package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
  160. package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
  161. package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
  162. package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
  163. package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
  164. package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
  165. package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
  166. package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
  167. package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
  168. package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
  169. package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
  170. package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
  171. package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
  172. package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
  173. package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
  174. package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
  175. package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
  176. package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
  177. package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
  178. package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
  179. package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
  180. package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
  181. package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
  182. package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
  183. package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
  184. package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
  185. package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
  186. package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
  187. package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
  188. package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
  189. package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
  190. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
  191. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
  192. package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
  193. package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
  194. package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
  195. package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
  196. package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
  197. package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
  198. package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
  199. package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
  200. package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
  201. package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
  202. package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
  203. package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
  204. package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
  205. package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
  206. package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
  207. package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
  208. package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
  209. package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
  210. package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
  211. package/template/.agent/skills/accessibility/SKILL.md +522 -0
  212. package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
  213. package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
  214. package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
  215. package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
  216. package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
  217. package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  218. package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
  219. package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  220. package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
  221. package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
  222. package/template/.agent/skills/api-versioning/SKILL.md +420 -0
  223. package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
  224. package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
  225. package/template/.agent/skills/brainstorming/SKILL.md +236 -0
  226. package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
  227. package/template/.agent/skills/clean-code/SKILL.md +94 -0
  228. package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
  229. package/template/.agent/skills/concise-planning/SKILL.md +68 -0
  230. package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
  231. package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
  232. package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
  233. package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
  234. package/template/.agent/skills/design-direction/SKILL.md +45 -0
  235. package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
  236. package/template/.agent/skills/find-skills/SKILL.md +145 -0
  237. package/template/.agent/skills/git-advanced/SKILL.md +972 -0
  238. package/template/.agent/skills/git-workflow/SKILL.md +420 -0
  239. package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
  240. package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
  241. package/template/.agent/skills/migration-management/SKILL.md +384 -0
  242. package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
  243. package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
  244. package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
  245. package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
  246. package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
  247. package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
  248. package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
  249. package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
  250. package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
  251. package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
  252. package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
  253. package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
  254. package/template/.agent/skills/prd-templates/SKILL.md +88 -0
  255. package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
  256. package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
  257. package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
  258. package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
  259. package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
  260. package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
  261. package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
  262. package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
  263. package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
  264. package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
  265. package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
  266. package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
  267. package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
  268. package/template/.agent/skills/prompt-engineer/README.md +659 -0
  269. package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
  270. package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
  271. package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
  272. package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
  273. package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
  274. package/template/.agent/skills/session-continuity/SKILL.md +730 -0
  275. package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
  276. package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
  277. package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
  278. package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
  279. package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
  280. package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
  281. package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
  282. package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
  283. package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
  284. package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
  285. package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
  286. package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
  287. package/template/.agent/skills/skill-creator/README.md +270 -0
  288. package/template/.agent/skills/skill-creator/SKILL.md +590 -0
  289. package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
  290. package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
  291. package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
  292. package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
  293. package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
  294. package/template/.agent/skills/spec-writing/SKILL.md +110 -0
  295. package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
  296. package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
  297. package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  298. package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
  299. package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
  300. package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
  301. package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
  302. package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
  303. package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
  304. package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
  305. package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
  306. package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
  307. package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
  308. package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
  309. package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
  310. package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
  311. package/template/.agent/skills/technical-writer/SKILL.md +242 -0
  312. package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
  313. package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
  314. package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
  315. package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
  316. package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
  317. package/template/.agent/workflows/audit-ambiguity.md +64 -0
  318. package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
  319. package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
  320. package/template/.agent/workflows/bootstrap-agents.md +66 -0
  321. package/template/.agent/workflows/create-prd-architecture.md +119 -0
  322. package/template/.agent/workflows/create-prd-compile.md +138 -0
  323. package/template/.agent/workflows/create-prd-design-system.md +135 -0
  324. package/template/.agent/workflows/create-prd-security.md +113 -0
  325. package/template/.agent/workflows/create-prd-stack.md +91 -0
  326. package/template/.agent/workflows/create-prd.md +168 -0
  327. package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
  328. package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
  329. package/template/.agent/workflows/decompose-architecture.md +111 -0
  330. package/template/.agent/workflows/evolve-contract.md +98 -0
  331. package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
  332. package/template/.agent/workflows/evolve-feature-classify.md +116 -0
  333. package/template/.agent/workflows/evolve-feature.md +56 -0
  334. package/template/.agent/workflows/ideate-discover.md +144 -0
  335. package/template/.agent/workflows/ideate-extract.md +129 -0
  336. package/template/.agent/workflows/ideate-validate.md +117 -0
  337. package/template/.agent/workflows/ideate.md +113 -0
  338. package/template/.agent/workflows/implement-slice-setup.md +113 -0
  339. package/template/.agent/workflows/implement-slice-tdd.md +198 -0
  340. package/template/.agent/workflows/implement-slice.md +50 -0
  341. package/template/.agent/workflows/plan-phase.md +202 -0
  342. package/template/.agent/workflows/propagate-decision-apply.md +135 -0
  343. package/template/.agent/workflows/propagate-decision-scan.md +147 -0
  344. package/template/.agent/workflows/propagate-decision.md +56 -0
  345. package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
  346. package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
  347. package/template/.agent/workflows/remediate-pipeline.md +55 -0
  348. package/template/.agent/workflows/resolve-ambiguity.md +82 -0
  349. package/template/.agent/workflows/sync-kit.md +209 -0
  350. package/template/.agent/workflows/update-architecture-map.md +74 -0
  351. package/template/.agent/workflows/validate-phase.md +219 -0
  352. package/template/.agent/workflows/verify-infrastructure.md +207 -0
  353. package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
  354. package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
  355. package/template/.agent/workflows/write-architecture-spec.md +63 -0
  356. package/template/.agent/workflows/write-be-spec-classify.md +165 -0
  357. package/template/.agent/workflows/write-be-spec-write.md +98 -0
  358. package/template/.agent/workflows/write-be-spec.md +76 -0
  359. package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
  360. package/template/.agent/workflows/write-fe-spec-write.md +94 -0
  361. package/template/.agent/workflows/write-fe-spec.md +71 -0
  362. package/template/AGENTS.md +176 -0
  363. package/template/GEMINI.md +177 -0
  364. package/template/docs/README.md +187 -0
  365. package/template/docs/audits/.gitkeep +0 -0
  366. package/template/docs/audits/README.md +10 -0
  367. package/template/docs/plans/.gitkeep +0 -0
  368. package/template/docs/plans/README.md +21 -0
  369. package/template/docs/plans/be/.gitkeep +0 -0
  370. package/template/docs/plans/be/README.md +11 -0
  371. package/template/docs/plans/fe/.gitkeep +0 -0
  372. package/template/docs/plans/fe/README.md +11 -0
  373. package/template/docs/plans/ia/.gitkeep +0 -0
  374. package/template/docs/plans/ia/README.md +17 -0
  375. package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
  376. package/template/docs/plans/ia/deep-dives/README.md +5 -0
  377. package/template/docs/plans/phases/.gitkeep +0 -0
  378. package/template/docs/plans/phases/README.md +11 -0
@@ -0,0 +1,932 @@
1
+ ---
2
+ name: Testing Strategist
3
+ description: Design and implement comprehensive testing strategies. Use when setting up tests, choosing test types, implementing TDD, or improving code quality. Covers unit tests, integration tests, E2E tests, test-driven development, and testing best practices.
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # Testing Strategist
8
+
9
+ Test the right things at the right level - write tests that give you confidence to ship.
10
+
11
+ ## Core Principle
12
+
13
+ **The Testing Pyramid:** 70% unit tests, 20% integration tests, 10% E2E tests.
14
+
15
+ Tests should be:
16
+
17
+ - **Fast** - Run in milliseconds (unit) to seconds (integration) to minutes (E2E)
18
+ - **Isolated** - Test one thing at a time
19
+ - **Repeatable** - Same input = same output
20
+ - **Self-checking** - Pass/fail automatically, no manual verification
21
+ - **Timely** - Written alongside code (or before, with TDD)
22
+
23
+ ---
24
+
25
+ ## The Testing Pyramid
26
+
27
+ ```
28
+ /\
29
+ / \ E2E Tests (10%)
30
+ /----\ - Slow, brittle, expensive
31
+ / \ - Test critical user journeys
32
+ /--------\ - Example: "User can complete checkout"
33
+ / \
34
+ /------------\ Integration Tests (20%)
35
+ / \ - Medium speed, test components together
36
+ /----------------\ - Example: "API endpoint returns correct data"
37
+ / \
38
+ /--------------------\ Unit Tests (70%)
39
+ /______________________\ - Fast, isolated, test functions/components
40
+ - Example: "calculateTotal returns sum"
41
+ ```
42
+
43
+ ### Why This Ratio?
44
+
45
+ - **Unit tests:** Fast feedback, pinpoint bugs precisely, easy to maintain
46
+ - **Integration tests:** Ensure components work together, catch interface issues
47
+ - **E2E tests:** Verify actual user flows, catch UI bugs, but slow and brittle
48
+
49
+ ---
50
+
51
+ ## Level 1: Unit Tests (70%)
52
+
53
+ ### What to Test
54
+
55
+ Test individual functions, components, or classes in isolation.
56
+
57
+ **Good candidates:**
58
+
59
+ - ✅ Business logic functions (calculations, validation, transformations)
60
+ - ✅ Utility functions (formatDate, parseUrl, etc.)
61
+ - ✅ React components (rendering, props, state)
62
+ - ✅ Hooks (custom React hooks)
63
+ - ✅ Pure functions (same input = same output)
64
+
65
+ **Skip:**
66
+
67
+ - ❌ Third-party libraries (assume they work)
68
+ - ❌ Framework internals (React, Next.js)
69
+ - ❌ Simple getters/setters with no logic
70
+
71
+ ### Unit Test Examples
72
+
73
+ #### Testing Business Logic (Jest + TypeScript)
74
+
75
+ ```typescript
76
+ // src/lib/pricing.ts
77
+ export function calculateTotal(items: { price: number; quantity: number }[]) {
78
+ return items.reduce((sum, item) => sum + item.price * item.quantity, 0)
79
+ }
80
+
81
+ export function applyDiscount(total: number, discountPercent: number) {
82
+ if (discountPercent < 0 || discountPercent > 100) {
83
+ throw new Error('Invalid discount percentage')
84
+ }
85
+ return total * (1 - discountPercent / 100)
86
+ }
87
+
88
+ // src/lib/pricing.test.ts
89
+ import { calculateTotal, applyDiscount } from './pricing'
90
+
91
+ describe('calculateTotal', () => {
92
+ it('calculates total for single item', () => {
93
+ const items = [{ price: 10, quantity: 2 }]
94
+ expect(calculateTotal(items)).toBe(20)
95
+ })
96
+
97
+ it('calculates total for multiple items', () => {
98
+ const items = [
99
+ { price: 10, quantity: 2 },
100
+ { price: 5, quantity: 3 }
101
+ ]
102
+ expect(calculateTotal(items)).toBe(35)
103
+ })
104
+
105
+ it('returns 0 for empty array', () => {
106
+ expect(calculateTotal([])).toBe(0)
107
+ })
108
+ })
109
+
110
+ describe('applyDiscount', () => {
111
+ it('applies discount correctly', () => {
112
+ expect(applyDiscount(100, 20)).toBe(80)
113
+ })
114
+
115
+ it('throws error for invalid discount', () => {
116
+ expect(() => applyDiscount(100, -10)).toThrow('Invalid discount')
117
+ expect(() => applyDiscount(100, 150)).toThrow('Invalid discount')
118
+ })
119
+ })
120
+ ```
121
+
122
+ #### Testing React Components (Jest + React Testing Library)
123
+
124
+ ```typescript
125
+ // src/components/Button.tsx
126
+ export function Button({
127
+ children,
128
+ variant = 'primary',
129
+ onClick
130
+ }: {
131
+ children: React.ReactNode
132
+ variant?: 'primary' | 'secondary'
133
+ onClick?: () => void
134
+ }) {
135
+ return (
136
+ <button
137
+ className={`btn btn-${variant}`}
138
+ onClick={onClick}
139
+ >
140
+ {children}
141
+ </button>
142
+ )
143
+ }
144
+
145
+ // src/components/Button.test.tsx
146
+ import { render, screen, fireEvent } from '@testing-library/react'
147
+ import { Button } from './Button'
148
+
149
+ describe('Button', () => {
150
+ it('renders with correct text', () => {
151
+ render(<Button>Click me</Button>)
152
+ expect(screen.getByText('Click me')).toBeInTheDocument()
153
+ })
154
+
155
+ it('applies primary variant by default', () => {
156
+ render(<Button>Click me</Button>)
157
+ expect(screen.getByRole('button')).toHaveClass('btn-primary')
158
+ })
159
+
160
+ it('applies secondary variant when specified', () => {
161
+ render(<Button variant="secondary">Click me</Button>)
162
+ expect(screen.getByRole('button')).toHaveClass('btn-secondary')
163
+ })
164
+
165
+ it('calls onClick when clicked', () => {
166
+ const handleClick = jest.fn()
167
+ render(<Button onClick={handleClick}>Click me</Button>)
168
+
169
+ fireEvent.click(screen.getByRole('button'))
170
+ expect(handleClick).toHaveBeenCalledTimes(1)
171
+ })
172
+ })
173
+ ```
174
+
175
+ #### Testing Custom Hooks
176
+
177
+ ```typescript
178
+ // src/hooks/useCounter.ts
179
+ import { useState } from 'react'
180
+
181
+ export function useCounter(initialValue = 0) {
182
+ const [count, setCount] = useState(initialValue)
183
+
184
+ const increment = () => setCount(c => c + 1)
185
+ const decrement = () => setCount(c => c - 1)
186
+ const reset = () => setCount(initialValue)
187
+
188
+ return { count, increment, decrement, reset }
189
+ }
190
+
191
+ // src/hooks/useCounter.test.ts
192
+ import { renderHook, act } from '@testing-library/react'
193
+ import { useCounter } from './useCounter'
194
+
195
+ describe('useCounter', () => {
196
+ it('initializes with default value', () => {
197
+ const { result } = renderHook(() => useCounter())
198
+ expect(result.current.count).toBe(0)
199
+ })
200
+
201
+ it('initializes with custom value', () => {
202
+ const { result } = renderHook(() => useCounter(10))
203
+ expect(result.current.count).toBe(10)
204
+ })
205
+
206
+ it('increments count', () => {
207
+ const { result } = renderHook(() => useCounter())
208
+
209
+ act(() => {
210
+ result.current.increment()
211
+ })
212
+
213
+ expect(result.current.count).toBe(1)
214
+ })
215
+
216
+ it('decrements count', () => {
217
+ const { result } = renderHook(() => useCounter(5))
218
+
219
+ act(() => {
220
+ result.current.decrement()
221
+ })
222
+
223
+ expect(result.current.count).toBe(4)
224
+ })
225
+
226
+ it('resets to initial value', () => {
227
+ const { result } = renderHook(() => useCounter(10))
228
+
229
+ act(() => {
230
+ result.current.increment()
231
+ result.current.increment()
232
+ result.current.reset()
233
+ })
234
+
235
+ expect(result.current.count).toBe(10)
236
+ })
237
+ })
238
+ ```
239
+
240
+ ### Unit Test Best Practices
241
+
242
+ ✅ **Do:**
243
+
244
+ - Test behavior, not implementation
245
+ - Use descriptive test names (it should...)
246
+ - Follow AAA pattern: Arrange, Act, Assert
247
+ - Test edge cases (empty arrays, null, negative numbers)
248
+ - Keep tests simple and readable
249
+
250
+ ❌ **Don't:**
251
+
252
+ - Test private methods directly
253
+ - Over-mock (makes tests brittle)
254
+ - Test framework internals
255
+ - Write tests that depend on other tests
256
+
257
+ ---
258
+
259
+ ## Level 2: Integration Tests (20%)
260
+
261
+ ### What to Test
262
+
263
+ Test multiple units working together - typically API routes, database operations, or service integrations.
264
+
265
+ **Good candidates:**
266
+
267
+ - ✅ API endpoints (request → controller → database → response)
268
+ - ✅ Database operations (queries, transactions)
269
+ - ✅ Third-party integrations (Stripe, SendGrid)
270
+ - ✅ Authentication flows
271
+ - ✅ File upload/download
272
+
273
+ ### Integration Test Examples
274
+
275
+ #### Testing API Routes (Next.js + Supertest)
276
+
277
+ ```typescript
278
+ // app/api/posts/route.ts
279
+ export async function GET() {
280
+ const posts = await db.post.findMany({
281
+ include: { author: true },
282
+ orderBy: { createdAt: 'desc' }
283
+ })
284
+ return Response.json(posts)
285
+ }
286
+
287
+ export async function POST(request: Request) {
288
+ const body = await request.json()
289
+
290
+ // Validate
291
+ const result = PostSchema.safeParse(body)
292
+ if (!result.success) {
293
+ return Response.json({ errors: result.error.issues }, { status: 400 })
294
+ }
295
+
296
+ // Create post
297
+ const post = await db.post.create({
298
+ data: {
299
+ title: result.data.title,
300
+ content: result.data.content,
301
+ authorId: request.user.id
302
+ }
303
+ })
304
+
305
+ return Response.json(post, { status: 201 })
306
+ }
307
+
308
+ // app/api/posts/route.test.ts
309
+ import { testClient } from '@/lib/test-utils'
310
+
311
+ describe('POST /api/posts', () => {
312
+ beforeEach(async () => {
313
+ // Clean database before each test
314
+ await db.post.deleteMany()
315
+ })
316
+
317
+ it('creates a new post', async () => {
318
+ const response = await testClient
319
+ .post('/api/posts')
320
+ .set('Authorization', `Bearer ${authToken}`)
321
+ .send({
322
+ title: 'Test Post',
323
+ content: 'This is a test post'
324
+ })
325
+
326
+ expect(response.status).toBe(201)
327
+ expect(response.body).toMatchObject({
328
+ title: 'Test Post',
329
+ content: 'This is a test post'
330
+ })
331
+
332
+ // Verify in database
333
+ const posts = await db.post.findMany()
334
+ expect(posts).toHaveLength(1)
335
+ expect(posts[0].title).toBe('Test Post')
336
+ })
337
+
338
+ it('returns 400 for invalid data', async () => {
339
+ const response = await testClient
340
+ .post('/api/posts')
341
+ .set('Authorization', `Bearer ${authToken}`)
342
+ .send({
343
+ title: '' // Invalid: empty title
344
+ })
345
+
346
+ expect(response.status).toBe(400)
347
+ expect(response.body.errors).toBeDefined()
348
+ })
349
+
350
+ it('returns 401 for unauthenticated request', async () => {
351
+ const response = await testClient.post('/api/posts').send({
352
+ title: 'Test',
353
+ content: 'Test'
354
+ })
355
+
356
+ expect(response.status).toBe(401)
357
+ })
358
+ })
359
+
360
+ describe('GET /api/posts', () => {
361
+ beforeEach(async () => {
362
+ await db.post.deleteMany()
363
+
364
+ // Seed test data
365
+ await db.post.createMany({
366
+ data: [
367
+ { title: 'Post 1', content: 'Content 1', authorId: user.id },
368
+ { title: 'Post 2', content: 'Content 2', authorId: user.id }
369
+ ]
370
+ })
371
+ })
372
+
373
+ it('returns all posts', async () => {
374
+ const response = await testClient.get('/api/posts')
375
+
376
+ expect(response.status).toBe(200)
377
+ expect(response.body).toHaveLength(2)
378
+ expect(response.body[0].author).toBeDefined()
379
+ })
380
+ })
381
+ ```
382
+
383
+ #### Testing Database Operations
384
+
385
+ ```typescript
386
+ // src/lib/repositories/userRepository.test.ts
387
+ import { db } from '@/lib/db'
388
+ import { createUser, findUserByEmail, updateUser } from './userRepository'
389
+
390
+ describe('userRepository', () => {
391
+ beforeEach(async () => {
392
+ await db.user.deleteMany()
393
+ })
394
+
395
+ afterAll(async () => {
396
+ await db.$disconnect()
397
+ })
398
+
399
+ describe('createUser', () => {
400
+ it('creates user with hashed password', async () => {
401
+ const user = await createUser({
402
+ email: 'test@example.com',
403
+ password: 'password123'
404
+ })
405
+
406
+ expect(user.email).toBe('test@example.com')
407
+ expect(user.password).not.toBe('password123') // Should be hashed
408
+ expect(user.password).toMatch(/^\$2[aby]/) // bcrypt hash format
409
+ })
410
+
411
+ it('throws error for duplicate email', async () => {
412
+ await createUser({ email: 'test@example.com', password: 'pass' })
413
+
414
+ await expect(createUser({ email: 'test@example.com', password: 'pass' })).rejects.toThrow()
415
+ })
416
+ })
417
+
418
+ describe('findUserByEmail', () => {
419
+ it('finds existing user', async () => {
420
+ await createUser({ email: 'test@example.com', password: 'pass' })
421
+
422
+ const user = await findUserByEmail('test@example.com')
423
+ expect(user).toBeDefined()
424
+ expect(user?.email).toBe('test@example.com')
425
+ })
426
+
427
+ it('returns null for non-existent user', async () => {
428
+ const user = await findUserByEmail('nonexistent@example.com')
429
+ expect(user).toBeNull()
430
+ })
431
+ })
432
+ })
433
+ ```
434
+
435
+ ### Integration Test Best Practices
436
+
437
+ ✅ **Do:**
438
+
439
+ - Use test database (separate from development/production)
440
+ - Clean up test data (beforeEach/afterEach)
441
+ - Test happy path + error cases
442
+ - Test authentication/authorization
443
+ - Use factories/fixtures for test data
444
+
445
+ ❌ **Don't:**
446
+
447
+ - Test against production database
448
+ - Leave test data behind
449
+ - Mock database (defeats purpose of integration test)
450
+ - Depend on external services (mock external APIs)
451
+
452
+ ---
453
+
454
+ ## Level 3: E2E Tests (10%)
455
+
456
+ ### What to Test
457
+
458
+ Test complete user journeys through the actual UI.
459
+
460
+ **Good candidates:**
461
+
462
+ - ✅ Critical user flows (signup, login, checkout)
463
+ - ✅ Core business processes
464
+ - ✅ Multi-step workflows
465
+
466
+ **Skip:**
467
+
468
+ - ❌ Every possible UI interaction (too slow/brittle)
469
+ - ❌ Edge cases (cover with unit/integration tests)
470
+
471
+ ### E2E Test Examples (Playwright)
472
+
473
+ ```typescript
474
+ // tests/e2e/auth.spec.ts
475
+ import { test, expect } from '@playwright/test'
476
+
477
+ test.describe('Authentication', () => {
478
+ test('user can sign up and log in', async ({ page }) => {
479
+ // Navigate to signup
480
+ await page.goto('/signup')
481
+
482
+ // Fill signup form
483
+ await page.fill('input[name="email"]', 'test@example.com')
484
+ await page.fill('input[name="password"]', 'SecurePass123!')
485
+ await page.fill('input[name="confirmPassword"]', 'SecurePass123!')
486
+
487
+ // Submit form
488
+ await page.click('button[type="submit"]')
489
+
490
+ // Should redirect to dashboard
491
+ await expect(page).toHaveURL('/dashboard')
492
+ await expect(page.locator('h1')).toContainText('Welcome')
493
+
494
+ // Logout
495
+ await page.click('[data-testid="logout-button"]')
496
+
497
+ // Should redirect to login
498
+ await expect(page).toHaveURL('/login')
499
+
500
+ // Login again
501
+ await page.fill('input[name="email"]', 'test@example.com')
502
+ await page.fill('input[name="password"]', 'SecurePass123!')
503
+ await page.click('button[type="submit"]')
504
+
505
+ // Should be back at dashboard
506
+ await expect(page).toHaveURL('/dashboard')
507
+ })
508
+
509
+ test('shows error for invalid credentials', async ({ page }) => {
510
+ await page.goto('/login')
511
+
512
+ await page.fill('input[name="email"]', 'wrong@example.com')
513
+ await page.fill('input[name="password"]', 'wrongpassword')
514
+ await page.click('button[type="submit"]')
515
+
516
+ // Should show error message
517
+ await expect(page.locator('[role="alert"]')).toContainText('Invalid credentials')
518
+
519
+ // Should stay on login page
520
+ await expect(page).toHaveURL('/login')
521
+ })
522
+ })
523
+
524
+ // tests/e2e/checkout.spec.ts
525
+ test.describe('Checkout Flow', () => {
526
+ test('user can complete purchase', async ({ page }) => {
527
+ // Login first
528
+ await page.goto('/login')
529
+ await page.fill('input[name="email"]', 'test@example.com')
530
+ await page.fill('input[name="password"]', 'password')
531
+ await page.click('button[type="submit"]')
532
+
533
+ // Add product to cart
534
+ await page.goto('/products')
535
+ await page.click('[data-testid="product-1"] button:text("Add to Cart")')
536
+
537
+ // Verify cart badge
538
+ await expect(page.locator('[data-testid="cart-badge"]')).toContainText('1')
539
+
540
+ // Go to checkout
541
+ await page.click('[data-testid="cart-button"]')
542
+ await page.click('button:text("Checkout")')
543
+
544
+ // Fill shipping info
545
+ await page.fill('input[name="address"]', '123 Main St')
546
+ await page.fill('input[name="city"]', 'San Francisco')
547
+ await page.fill('input[name="zip"]', '94103')
548
+
549
+ // Fill payment info (test mode)
550
+ await page.fill('input[name="cardNumber"]', '4242424242424242')
551
+ await page.fill('input[name="expiry"]', '12/25')
552
+ await page.fill('input[name="cvc"]', '123')
553
+
554
+ // Submit order
555
+ await page.click('button:text("Place Order")')
556
+
557
+ // Should see confirmation
558
+ await expect(page).toHaveURL(/\/orders\/\d+/)
559
+ await expect(page.locator('h1')).toContainText('Order Confirmed')
560
+ })
561
+ })
562
+ ```
563
+
564
+ ### E2E Test Best Practices
565
+
566
+ ✅ **Do:**
567
+
568
+ - Test critical paths only (< 20 tests)
569
+ - Use data-testid attributes (stable selectors)
570
+ - Run in CI/CD pipeline
571
+ - Test across browsers (Chrome, Firefox, Safari)
572
+ - Take screenshots on failure
573
+
574
+ ❌ **Don't:**
575
+
576
+ - Test every UI variation
577
+ - Use fragile selectors (text content, nth-child)
578
+ - Run E2E tests on every commit (too slow)
579
+ - Ignore flaky tests (fix or remove them)
580
+
581
+ ---
582
+
583
+ ## Test-Driven Development (TDD)
584
+
585
+ ### The Red-Green-Refactor Cycle
586
+
587
+ 1. **Red:** Write a failing test
588
+ 2. **Green:** Write minimal code to make it pass
589
+ 3. **Refactor:** Improve code while keeping tests green
590
+
591
+ ### TDD Example
592
+
593
+ ```typescript
594
+ // 1. RED: Write failing test first
595
+ describe('formatCurrency', () => {
596
+ it('formats number as USD currency', () => {
597
+ expect(formatCurrency(1234.56)).toBe('$1,234.56')
598
+ })
599
+ })
600
+
601
+ // Run test: FAILS (formatCurrency doesn't exist)
602
+
603
+ // 2. GREEN: Write minimal implementation
604
+ export function formatCurrency(amount: number): string {
605
+ return `$${amount.toLocaleString('en-US', { minimumFractionDigits: 2 })}`
606
+ }
607
+
608
+ // Run test: PASSES
609
+
610
+ // 3. REFACTOR: Improve implementation
611
+ export function formatCurrency(
612
+ amount: number,
613
+ currency: string = 'USD',
614
+ locale: string = 'en-US'
615
+ ): string {
616
+ return new Intl.NumberFormat(locale, {
617
+ style: 'currency',
618
+ currency
619
+ }).format(amount)
620
+ }
621
+
622
+ // Add more tests
623
+ it('formats EUR currency', () => {
624
+ expect(formatCurrency(1234.56, 'EUR', 'de-DE')).toBe('1.234,56 €')
625
+ })
626
+
627
+ it('handles negative amounts', () => {
628
+ expect(formatCurrency(-100)).toBe('-$100.00')
629
+ })
630
+ ```
631
+
632
+ ### When to Use TDD
633
+
634
+ **Good for:**
635
+
636
+ - ✅ Complex business logic
637
+ - ✅ Bug fixes (write test that reproduces bug first)
638
+ - ✅ Well-defined requirements
639
+ - ✅ Critical algorithms
640
+
641
+ **Skip for:**
642
+
643
+ - ❌ Exploratory coding (don't know requirements yet)
644
+ - ❌ Throwaway prototypes
645
+ - ❌ Simple CRUD operations
646
+
647
+ ---
648
+
649
+ ## Mocking Strategies
650
+
651
+ ### When to Mock
652
+
653
+ - ✅ External APIs (slow, unreliable, cost money)
654
+ - ✅ Time/randomness (make tests deterministic)
655
+ - ✅ File system operations
656
+ - ✅ Database (in unit tests only)
657
+
658
+ ### Mock Examples (Jest)
659
+
660
+ ```typescript
661
+ // Mock external API
662
+ import { fetchUserData } from '@/lib/api'
663
+
664
+ jest.mock('@/lib/api')
665
+ const mockFetchUserData = fetchUserData as jest.MockedFunction<typeof fetchUserData>
666
+
667
+ it('displays user data', async () => {
668
+ mockFetchUserData.mockResolvedValue({
669
+ id: '1',
670
+ name: 'John Doe',
671
+ email: 'john@example.com'
672
+ })
673
+
674
+ render(<UserProfile userId="1" />)
675
+
676
+ await waitFor(() => {
677
+ expect(screen.getByText('John Doe')).toBeInTheDocument()
678
+ })
679
+ })
680
+
681
+ // Mock Date
682
+ beforeAll(() => {
683
+ jest.useFakeTimers()
684
+ jest.setSystemTime(new Date('2024-01-01'))
685
+ })
686
+
687
+ afterAll(() => {
688
+ jest.useRealTimers()
689
+ })
690
+
691
+ it('shows correct date', () => {
692
+ expect(getCurrentDate()).toBe('2024-01-01')
693
+ })
694
+
695
+ // Mock Math.random
696
+ const mockRandom = jest.spyOn(Math, 'random')
697
+ mockRandom.mockReturnValue(0.5)
698
+
699
+ expect(generateRandomId()).toBe('expected-id-with-0.5-random')
700
+
701
+ mockRandom.mockRestore()
702
+ ```
703
+
704
+ ### Mocking Best Practices
705
+
706
+ ✅ **Do:**
707
+
708
+ - Mock at boundaries (APIs, file system)
709
+ - Restore mocks after tests
710
+ - Make mocks realistic (same shape as real data)
711
+
712
+ ❌ **Don't:**
713
+
714
+ - Over-mock (makes tests brittle)
715
+ - Mock your own code (test real behavior)
716
+ - Mock what you don't own (unless external)
717
+
718
+ ---
719
+
720
+ ## Code Coverage
721
+
722
+ ### Coverage Targets
723
+
724
+ - **70% minimum** - Below this, you're missing important tests
725
+ - **80% good** - Solid coverage of critical paths
726
+ - **90%+ diminishing returns** - Chasing 100% often not worth it
727
+
728
+ ### What to Focus On
729
+
730
+ **High priority (must have 90%+ coverage):**
731
+
732
+ - Business logic
733
+ - Authentication/authorization
734
+ - Payment processing
735
+ - Data validation
736
+
737
+ **Medium priority (aim for 70%+):**
738
+
739
+ - API routes
740
+ - Database queries
741
+ - Utility functions
742
+
743
+ **Low priority (okay to skip):**
744
+
745
+ - UI components (test behavior, not implementation)
746
+ - Configuration files
747
+ - Type definitions
748
+ - Third-party integrations (integration tests better)
749
+
750
+ ### Checking Coverage
751
+
752
+ ```bash
753
+ # Jest
754
+ npm test -- --coverage
755
+
756
+ # View HTML report
757
+ open coverage/lcov-report/index.html
758
+ ```
759
+
760
+ ### Coverage Configuration (jest.config.js)
761
+
762
+ ```javascript
763
+ module.exports = {
764
+ collectCoverageFrom: [
765
+ 'src/**/*.{ts,tsx}',
766
+ '!src/**/*.d.ts',
767
+ '!src/**/*.stories.tsx',
768
+ '!src/types/**'
769
+ ],
770
+ coverageThresholds: {
771
+ global: {
772
+ branches: 70,
773
+ functions: 70,
774
+ lines: 70,
775
+ statements: 70
776
+ },
777
+ // Critical paths need higher coverage
778
+ './src/lib/auth/**': {
779
+ branches: 90,
780
+ functions: 90,
781
+ lines: 90
782
+ }
783
+ }
784
+ }
785
+ ```
786
+
787
+ ---
788
+
789
+ ## Testing Strategies by Framework
790
+
791
+ ### Next.js (React)
792
+
793
+ - Unit: Jest + React Testing Library
794
+ - Integration: Supertest (API routes)
795
+ - E2E: Playwright
796
+
797
+ ### Express API
798
+
799
+ - Unit: Jest
800
+ - Integration: Supertest
801
+ - E2E: Playwright (if has UI)
802
+
803
+ ### FastAPI (Python)
804
+
805
+ - Unit: pytest
806
+ - Integration: pytest + TestClient
807
+ - E2E: Playwright
808
+
809
+ ---
810
+
811
+ ## Common Testing Patterns
812
+
813
+ ### Testing Async Code
814
+
815
+ ```typescript
816
+ // Using async/await
817
+ it('fetches user data', async () => {
818
+ const user = await fetchUser('123')
819
+ expect(user.name).toBe('John')
820
+ })
821
+
822
+ // Using waitFor (React Testing Library)
823
+ it('shows loading then data', async () => {
824
+ render(<UserProfile userId="123" />)
825
+
826
+ expect(screen.getByText('Loading...')).toBeInTheDocument()
827
+
828
+ await waitFor(() => {
829
+ expect(screen.getByText('John Doe')).toBeInTheDocument()
830
+ })
831
+ })
832
+ ```
833
+
834
+ ### Testing Error Handling
835
+
836
+ ```typescript
837
+ it('handles errors gracefully', async () => {
838
+ mockFetchUser.mockRejectedValue(new Error('Network error'))
839
+
840
+ render(<UserProfile userId="123" />)
841
+
842
+ await waitFor(() => {
843
+ expect(screen.getByText(/error/i)).toBeInTheDocument()
844
+ })
845
+ })
846
+ ```
847
+
848
+ ### Testing Forms
849
+
850
+ ```typescript
851
+ it('submits form with valid data', async () => {
852
+ const handleSubmit = jest.fn()
853
+ render(<LoginForm onSubmit={handleSubmit} />)
854
+
855
+ await userEvent.type(screen.getByLabelText('Email'), 'test@example.com')
856
+ await userEvent.type(screen.getByLabelText('Password'), 'password123')
857
+ await userEvent.click(screen.getByRole('button', { name: 'Login' }))
858
+
859
+ await waitFor(() => {
860
+ expect(handleSubmit).toHaveBeenCalledWith({
861
+ email: 'test@example.com',
862
+ password: 'password123'
863
+ })
864
+ })
865
+ })
866
+ ```
867
+
868
+ ---
869
+
870
+ ## Test Organization
871
+
872
+ ### File Structure
873
+
874
+ ```
875
+ src/
876
+ ├── components/
877
+ │ ├── Button.tsx
878
+ │ └── Button.test.tsx # Co-located with component
879
+ ├── lib/
880
+ │ ├── utils.ts
881
+ │ └── utils.test.ts # Co-located with module
882
+ └── __tests__/
883
+ ├── integration/ # Integration tests
884
+ │ └── api.test.ts
885
+ └── e2e/ # E2E tests
886
+ └── checkout.spec.ts
887
+ ```
888
+
889
+ ### Naming Conventions
890
+
891
+ - Unit/Integration: `*.test.ts` or `*.spec.ts`
892
+ - E2E: `*.e2e.ts` or `*.spec.ts` (in tests/e2e/)
893
+ - Test names: `it('should do X when Y')` or `it('does X')`
894
+
895
+ ---
896
+
897
+ ## When to Use This Skill
898
+
899
+ Use testing-strategist skill when:
900
+
901
+ - ✅ Setting up testing for new project
902
+ - ✅ Choosing test frameworks
903
+ - ✅ Deciding what to test and at what level
904
+ - ✅ Implementing TDD
905
+ - ✅ Improving code coverage
906
+ - ✅ Fixing flaky tests
907
+
908
+ ---
909
+
910
+ ## Related Resources
911
+
912
+ **Skills:**
913
+
914
+ - `security-engineer` - Security testing
915
+ - `api-designer` - API testing strategies
916
+ - `frontend-builder` - React testing patterns
917
+
918
+ **Patterns:**
919
+
920
+ - `/STANDARDS/best-practices/testing-best-practices.md`
921
+ - `/TEMPLATES/testing/jest-nextjs-setup.md`
922
+ - `/TEMPLATES/testing/playwright-e2e-setup.md`
923
+
924
+ **External:**
925
+
926
+ - [Jest Documentation](https://jestjs.io/)
927
+ - [React Testing Library](https://testing-library.com/react)
928
+ - [Playwright](https://playwright.dev/)
929
+
930
+ ---
931
+
932
+ **Good tests give you confidence to ship.** ✅