cfsa-antigravity 3.0.2 → 3.1.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 (565) hide show
  1. package/README.md +27 -10
  2. package/bin/cli.mjs +7 -6
  3. package/package.json +1 -1
  4. package/template/.agent/PRDS/codex-runtime-support.md +2 -2
  5. package/template/.agent/TASKS/codex-runtime-support.md +2 -2
  6. package/template/.agent/instructions/workflow.md +3 -3
  7. package/template/.agent/kit-sync.md +3 -3
  8. package/template/.agent/rules/completion-checklist.md +3 -3
  9. package/template/.agent/skills/parallel-agents/SKILL.md +1 -1
  10. package/template/.agent/skills/session-continuity/SKILL.md +6 -6
  11. package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +1 -1
  12. package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +3 -3
  13. package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +4 -4
  14. package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
  15. package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
  16. package/template/.agent/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
  17. package/template/.agent/workflows/create-prd-architecture.md +2 -2
  18. package/template/.agent/workflows/create-prd-design-system.md +2 -2
  19. package/template/.agent/workflows/create-prd-security.md +2 -2
  20. package/template/.agent/workflows/create-prd-stack.md +2 -2
  21. package/template/.agent/workflows/create-prd.md +2 -2
  22. package/template/.agent/workflows/decompose-architecture-validate.md +1 -1
  23. package/template/.agent/workflows/decompose-architecture.md +2 -2
  24. package/template/.agent/workflows/ideate.md +2 -2
  25. package/template/.agent/workflows/implement-slice-setup.md +1 -1
  26. package/template/.agent/workflows/implement-slice-tdd.md +3 -3
  27. package/template/.agent/workflows/implement-slice.md +2 -2
  28. package/template/.agent/workflows/plan-phase-preflight.md +2 -2
  29. package/template/.agent/workflows/plan-phase-write.md +2 -2
  30. package/template/.agent/workflows/plan-phase.md +2 -2
  31. package/template/.agent/workflows/setup-workspace.md +2 -2
  32. package/template/.agent/workflows/update-architecture-map.md +1 -1
  33. package/template/.agent/workflows/validate-phase-quality.md +1 -1
  34. package/template/.agent/workflows/validate-phase-readiness.md +2 -2
  35. package/template/.agent/workflows/validate-phase.md +2 -2
  36. package/template/.agent/workflows/verify-infrastructure.md +1 -1
  37. package/template/.agent/workflows/write-architecture-spec-deepen.md +3 -3
  38. package/template/.agent/workflows/write-architecture-spec-design.md +1 -1
  39. package/template/.agent/workflows/write-architecture-spec.md +3 -3
  40. package/template/.agent/workflows/write-be-spec-classify.md +1 -1
  41. package/template/.agent/workflows/write-be-spec-write.md +3 -3
  42. package/template/.agent/workflows/write-be-spec.md +3 -3
  43. package/template/.agent/workflows/write-fe-spec-classify.md +1 -1
  44. package/template/.agent/workflows/write-fe-spec-write.md +2 -2
  45. package/template/.agent/workflows/write-fe-spec.md +3 -3
  46. package/template/.claude/README.md +3 -1
  47. package/template/.claude/instructions/workflow.md +3 -3
  48. package/template/.claude/kit-sync.md +3 -3
  49. package/template/.claude/rules/completion-checklist.md +3 -3
  50. package/template/.claude/skills/parallel-agents/SKILL.md +1 -1
  51. package/template/.claude/skills/plan-phase/SKILL.md +2 -2
  52. package/template/.claude/skills/plan-phase-preflight/SKILL.md +2 -2
  53. package/template/.claude/skills/session-continuity/SKILL.md +6 -6
  54. package/template/.claude/skills/session-continuity/protocols/01-session-resumption.md +1 -1
  55. package/template/.claude/skills/session-continuity/protocols/02-progress-generation.md +3 -3
  56. package/template/.claude/skills/session-continuity/protocols/03-progress-update.md +4 -4
  57. package/template/.claude/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
  58. package/template/.claude/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
  59. package/template/.claude/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
  60. package/template/.claude/skills/setup/setup-cfsa.md +1 -1
  61. package/template/.claude/skills/write-architecture-spec/SKILL.md +2 -2
  62. package/template/.claude/skills/write-architecture-spec-deepen/SKILL.md +1 -1
  63. package/template/.claude/skills/write-architecture-spec-design/SKILL.md +1 -1
  64. package/template/.claude/skills/write-be-spec/SKILL.md +3 -3
  65. package/template/.claude/skills/write-be-spec-classify/SKILL.md +1 -1
  66. package/template/.claude/skills/write-be-spec-write/SKILL.md +1 -1
  67. package/template/.claude/skills/write-fe-spec/SKILL.md +3 -3
  68. package/template/.claude/skills/write-fe-spec-write/SKILL.md +1 -1
  69. package/template/.codex/README.md +99 -0
  70. package/template/.codex/instructions/commands.md +24 -0
  71. package/template/.codex/instructions/example.md +21 -0
  72. package/template/.codex/instructions/patterns.md +61 -0
  73. package/template/.codex/instructions/structure.md +29 -0
  74. package/template/.codex/instructions/tech-stack.md +93 -0
  75. package/template/.codex/instructions/workflow.md +64 -0
  76. package/template/.codex/kit-sync.md +6 -0
  77. package/template/.codex/rules/boundary-not-placeholder.md +146 -0
  78. package/template/.codex/rules/completion-checklist.md +60 -0
  79. package/template/.codex/rules/debug-by-test.md +49 -0
  80. package/template/.codex/rules/decision-classification.md +113 -0
  81. package/template/.codex/rules/extensibility.md +52 -0
  82. package/template/.codex/rules/memory-capture.md +84 -0
  83. package/template/.codex/rules/question-vs-command.md +91 -0
  84. package/template/.codex/rules/security-first.md +54 -0
  85. package/template/.codex/rules/single-question.md +59 -0
  86. package/template/.codex/rules/skill-mcp-first.md +45 -0
  87. package/template/.codex/rules/source-before-ask.md +93 -0
  88. package/template/.codex/rules/specificity-standards.md +64 -0
  89. package/template/.codex/rules/tdd-contract-first.md +67 -0
  90. package/template/.codex/rules/vertical-slices.md +83 -0
  91. package/template/.codex/skill-library/MANIFEST.md +498 -0
  92. package/template/.codex/skill-library/README.md +38 -0
  93. package/template/.codex/skill-library/meta/claude-code/README.md +9 -0
  94. package/template/.codex/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
  95. package/template/.codex/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
  96. package/template/.codex/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
  97. package/template/.codex/skill-library/meta/mcp-builder/SKILL.md +236 -0
  98. package/template/.codex/skill-library/meta/product-marketing-context/SKILL.md +241 -0
  99. package/template/.codex/skill-library/meta/tmux-processes/SKILL.md +210 -0
  100. package/template/.codex/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
  101. package/template/.codex/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
  102. package/template/.codex/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
  103. package/template/.codex/skill-library/stack/ai/langchain/SKILL.md +530 -0
  104. package/template/.codex/skill-library/stack/ai/ollama/SKILL.md +321 -0
  105. package/template/.codex/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
  106. package/template/.codex/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
  107. package/template/.codex/skill-library/stack/api/graphql/SKILL.md +1061 -0
  108. package/template/.codex/skill-library/stack/api/trpc/SKILL.md +576 -0
  109. package/template/.codex/skill-library/stack/auth/authjs/SKILL.md +569 -0
  110. package/template/.codex/skill-library/stack/auth/clerk/SKILL.md +590 -0
  111. package/template/.codex/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
  112. package/template/.codex/skill-library/stack/auth/lucia/SKILL.md +230 -0
  113. package/template/.codex/skill-library/stack/auth/supabase-auth/SKILL.md +293 -0
  114. package/template/.codex/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
  115. package/template/.codex/skill-library/stack/cms/shopify/SKILL.md +1193 -0
  116. package/template/.codex/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
  117. package/template/.codex/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
  118. package/template/.codex/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
  119. package/template/.codex/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
  120. package/template/.codex/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
  121. package/template/.codex/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
  122. package/template/.codex/skill-library/stack/databases/influxdb/SKILL.md +280 -0
  123. package/template/.codex/skill-library/stack/databases/lancedb/SKILL.md +415 -0
  124. package/template/.codex/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
  125. package/template/.codex/skill-library/stack/databases/neo4j/SKILL.md +839 -0
  126. package/template/.codex/skill-library/stack/databases/pgvector/SKILL.md +241 -0
  127. package/template/.codex/skill-library/stack/databases/pinecone/SKILL.md +212 -0
  128. package/template/.codex/skill-library/stack/databases/postgresql/SKILL.md +658 -0
  129. package/template/.codex/skill-library/stack/databases/qdrant/SKILL.md +312 -0
  130. package/template/.codex/skill-library/stack/databases/redis/SKILL.md +1079 -0
  131. package/template/.codex/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
  132. package/template/.codex/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
  133. package/template/.codex/skill-library/stack/databases/supabase/SKILL.md +640 -0
  134. package/template/.codex/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
  135. package/template/.codex/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
  136. package/template/.codex/skill-library/stack/databases/weaviate/SKILL.md +218 -0
  137. package/template/.codex/skill-library/stack/devops/git-advanced/SKILL.md +972 -0
  138. package/template/.codex/skill-library/stack/devops/git-workflow/SKILL.md +420 -0
  139. package/template/.codex/skill-library/stack/devops/github-actions/SKILL.md +554 -0
  140. package/template/.codex/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
  141. package/template/.codex/skill-library/stack/devops/nginx/SKILL.md +841 -0
  142. package/template/.codex/skill-library/stack/devops/terraform/SKILL.md +860 -0
  143. package/template/.codex/skill-library/stack/email/resend/SKILL.md +391 -0
  144. package/template/.codex/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
  145. package/template/.codex/skill-library/stack/extensions/plasmo/SKILL.md +195 -0
  146. package/template/.codex/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
  147. package/template/.codex/skill-library/stack/extensions/wxt/SKILL.md +216 -0
  148. package/template/.codex/skill-library/stack/feature-flags/flagsmith/SKILL.md +187 -0
  149. package/template/.codex/skill-library/stack/feature-flags/launchdarkly/SKILL.md +183 -0
  150. package/template/.codex/skill-library/stack/feature-flags/posthog-flags/SKILL.md +189 -0
  151. package/template/.codex/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
  152. package/template/.codex/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
  153. package/template/.codex/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
  154. package/template/.codex/skill-library/stack/frameworks/hono/SKILL.md +90 -0
  155. package/template/.codex/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
  156. package/template/.codex/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
  157. package/template/.codex/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
  158. package/template/.codex/skill-library/stack/frameworks/svelte5/SKILL.md +81 -0
  159. package/template/.codex/skill-library/stack/frameworks/svelte5/references/events.md +353 -0
  160. package/template/.codex/skill-library/stack/frameworks/svelte5/references/migration.md +339 -0
  161. package/template/.codex/skill-library/stack/frameworks/svelte5/references/performance.md +443 -0
  162. package/template/.codex/skill-library/stack/frameworks/svelte5/references/runes.md +394 -0
  163. package/template/.codex/skill-library/stack/frameworks/svelte5/references/snippets.md +291 -0
  164. package/template/.codex/skill-library/stack/frameworks/svelte5/references/sveltekit.md +401 -0
  165. package/template/.codex/skill-library/stack/frameworks/svelte5/references/typescript.md +305 -0
  166. package/template/.codex/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
  167. package/template/.codex/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
  168. package/template/.codex/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
  169. package/template/.codex/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
  170. package/template/.codex/skill-library/stack/hosting/aws/SKILL.md +467 -0
  171. package/template/.codex/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
  172. package/template/.codex/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
  173. package/template/.codex/skill-library/stack/hosting/vercel/SKILL.md +484 -0
  174. package/template/.codex/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
  175. package/template/.codex/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
  176. package/template/.codex/skill-library/stack/languages/gdscript/SKILL.md +789 -0
  177. package/template/.codex/skill-library/stack/languages/go/SKILL.md +664 -0
  178. package/template/.codex/skill-library/stack/languages/java/SKILL.md +778 -0
  179. package/template/.codex/skill-library/stack/languages/kotlin/SKILL.md +665 -0
  180. package/template/.codex/skill-library/stack/languages/python/SKILL.md +678 -0
  181. package/template/.codex/skill-library/stack/languages/rust/SKILL.md +673 -0
  182. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
  183. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
  184. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
  185. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
  186. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
  187. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
  188. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
  189. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
  190. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
  191. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
  192. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
  193. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
  194. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
  195. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
  196. package/template/.codex/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
  197. package/template/.codex/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
  198. package/template/.codex/skill-library/stack/messaging/kafka/SKILL.md +235 -0
  199. package/template/.codex/skill-library/stack/messaging/nats/SKILL.md +147 -0
  200. package/template/.codex/skill-library/stack/messaging/rabbitmq/SKILL.md +178 -0
  201. package/template/.codex/skill-library/stack/messaging/sqs/SKILL.md +187 -0
  202. package/template/.codex/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
  203. package/template/.codex/skill-library/stack/mobile/flutter/SKILL.md +316 -0
  204. package/template/.codex/skill-library/stack/mobile/kotlin-compose/SKILL.md +215 -0
  205. package/template/.codex/skill-library/stack/mobile/react-native/SKILL.md +337 -0
  206. package/template/.codex/skill-library/stack/mobile/swiftui/SKILL.md +261 -0
  207. package/template/.codex/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
  208. package/template/.codex/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
  209. package/template/.codex/skill-library/stack/notifications/fcm/SKILL.md +229 -0
  210. package/template/.codex/skill-library/stack/notifications/sendgrid/SKILL.md +220 -0
  211. package/template/.codex/skill-library/stack/notifications/twilio/SKILL.md +204 -0
  212. package/template/.codex/skill-library/stack/observability/datadog/SKILL.md +179 -0
  213. package/template/.codex/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
  214. package/template/.codex/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
  215. package/template/.codex/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
  216. package/template/.codex/skill-library/stack/observability/python-observability/SKILL.md +158 -0
  217. package/template/.codex/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
  218. package/template/.codex/skill-library/stack/orm/prisma/SKILL.md +744 -0
  219. package/template/.codex/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
  220. package/template/.codex/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
  221. package/template/.codex/skill-library/stack/queue/bullmq/SKILL.md +385 -0
  222. package/template/.codex/skill-library/stack/queue/inngest/SKILL.md +438 -0
  223. package/template/.codex/skill-library/stack/realtime/socketio/SKILL.md +595 -0
  224. package/template/.codex/skill-library/stack/search/algolia/SKILL.md +206 -0
  225. package/template/.codex/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
  226. package/template/.codex/skill-library/stack/search/meilisearch/SKILL.md +385 -0
  227. package/template/.codex/skill-library/stack/search/typesense/SKILL.md +189 -0
  228. package/template/.codex/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
  229. package/template/.codex/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
  230. package/template/.codex/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
  231. package/template/.codex/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
  232. package/template/.codex/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
  233. package/template/.codex/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
  234. package/template/.codex/skill-library/stack/state/zustand/SKILL.md +483 -0
  235. package/template/.codex/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
  236. package/template/.codex/skill-library/stack/storage/cloudflare-r2/SKILL.md +252 -0
  237. package/template/.codex/skill-library/stack/storage/gcs/SKILL.md +229 -0
  238. package/template/.codex/skill-library/stack/testing/playwright/SKILL.md +641 -0
  239. package/template/.codex/skill-library/stack/testing/storybook/SKILL.md +923 -0
  240. package/template/.codex/skill-library/stack/testing/testing-library/SKILL.md +872 -0
  241. package/template/.codex/skill-library/stack/testing/vitest/SKILL.md +714 -0
  242. package/template/.codex/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
  243. package/template/.codex/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
  244. package/template/.codex/skill-library/stack/ui/react-flow/SKILL.md +425 -0
  245. package/template/.codex/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
  246. package/template/.codex/skill-library/stack/ui/svelte-flow/SKILL.md +390 -0
  247. package/template/.codex/skill-library/surface/api/api-caching/SKILL.md +458 -0
  248. package/template/.codex/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
  249. package/template/.codex/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
  250. package/template/.codex/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
  251. package/template/.codex/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
  252. package/template/.codex/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
  253. package/template/.codex/skill-library/surface/api/webhook-design/SKILL.md +752 -0
  254. package/template/.codex/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
  255. package/template/.codex/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
  256. package/template/.codex/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
  257. package/template/.codex/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
  258. package/template/.codex/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
  259. package/template/.codex/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
  260. package/template/.codex/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
  261. package/template/.codex/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
  262. package/template/.codex/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
  263. package/template/.codex/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
  264. package/template/.codex/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
  265. package/template/.codex/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
  266. package/template/.codex/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
  267. package/template/.codex/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
  268. package/template/.codex/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
  269. package/template/.codex/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
  270. package/template/.codex/skill-library/surface/web/ai-seo/SKILL.md +398 -0
  271. package/template/.codex/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
  272. package/template/.codex/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
  273. package/template/.codex/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
  274. package/template/.codex/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
  275. package/template/.codex/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
  276. package/template/.codex/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
  277. package/template/.codex/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
  278. package/template/.codex/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
  279. package/template/.codex/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
  280. package/template/.codex/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
  281. package/template/.codex/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
  282. package/template/.codex/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
  283. package/template/.codex/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
  284. package/template/.codex/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
  285. package/template/.codex/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
  286. package/template/.codex/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
  287. package/template/.codex/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
  288. package/template/.codex/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
  289. package/template/.codex/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
  290. package/template/.codex/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
  291. package/template/.codex/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
  292. package/template/.codex/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
  293. package/template/.codex/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
  294. package/template/.codex/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
  295. package/template/.codex/skill-library/surface/web/i18n-localization/SKILL.md +332 -0
  296. package/template/.codex/skill-library/surface/web/i18n-localization/references/icu-message-format.md +223 -0
  297. package/template/.codex/skill-library/surface/web/i18n-localization/references/intl-api-patterns.md +326 -0
  298. package/template/.codex/skill-library/surface/web/i18n-localization/references/rtl-support.md +298 -0
  299. package/template/.codex/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
  300. package/template/.codex/skill-library/surface/web/page-cro/SKILL.md +182 -0
  301. package/template/.codex/skill-library/surface/web/page-cro/references/experiments.md +248 -0
  302. package/template/.codex/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
  303. package/template/.codex/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
  304. package/template/.codex/skill-library/surface/web/schema-markup/SKILL.md +179 -0
  305. package/template/.codex/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
  306. package/template/.codex/skill-library/surface/web/seo-audit/SKILL.md +394 -0
  307. package/template/.codex/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
  308. package/template/.codex/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
  309. package/template/.codex/skill-library/surface/web/web-scraping/SKILL.md +58 -0
  310. package/template/.codex/skills/README.md +78 -0
  311. package/template/.codex/skills/accessibility/SKILL.md +522 -0
  312. package/template/.codex/skills/accessibility/references/WCAG.md +162 -0
  313. package/template/.codex/skills/accessibility/references/ia-spec-checklist.md +35 -0
  314. package/template/.codex/skills/adversarial-review/SKILL.md +90 -0
  315. package/template/.codex/skills/antigravity-workflows/SKILL.md +81 -0
  316. package/template/.codex/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
  317. package/template/.codex/skills/api-design-principles/SKILL.md +169 -0
  318. package/template/.codex/skills/api-design-principles/assets/api-design-checklist.md +155 -0
  319. package/template/.codex/skills/api-design-principles/assets/rest-api-template.py +182 -0
  320. package/template/.codex/skills/api-design-principles/references/graphql-schema-design.md +583 -0
  321. package/template/.codex/skills/api-design-principles/references/rest-best-practices.md +408 -0
  322. package/template/.codex/skills/api-design-principles/resources/implementation-playbook.md +513 -0
  323. package/template/.codex/skills/api-versioning/SKILL.md +166 -0
  324. package/template/.codex/skills/api-versioning/references/typescript.md +157 -0
  325. package/template/.codex/skills/architecture-mapping/SKILL.md +219 -0
  326. package/template/.codex/skills/audit-ambiguity/SKILL.md +54 -0
  327. package/template/.codex/skills/audit-ambiguity-execute/SKILL.md +86 -0
  328. package/template/.codex/skills/audit-ambiguity-rubrics/SKILL.md +58 -0
  329. package/template/.codex/skills/bootstrap-agents/SKILL.md +258 -0
  330. package/template/.codex/skills/bootstrap-agents-fill/SKILL.md +25 -0
  331. package/template/.codex/skills/bootstrap-agents-provision/SKILL.md +22 -0
  332. package/template/.codex/skills/brainstorming/SKILL.md +177 -0
  333. package/template/.codex/skills/brand-guidelines/SKILL.md +44 -0
  334. package/template/.codex/skills/clean-code/SKILL.md +196 -0
  335. package/template/.codex/skills/clean-code/references/typescript.md +126 -0
  336. package/template/.codex/skills/code-review-pro/SKILL.md +152 -0
  337. package/template/.codex/skills/concise-planning/SKILL.md +107 -0
  338. package/template/.codex/skills/create-prd/SKILL.md +94 -0
  339. package/template/.codex/skills/create-prd-architecture/SKILL.md +72 -0
  340. package/template/.codex/skills/create-prd-compile/SKILL.md +85 -0
  341. package/template/.codex/skills/create-prd-design-system/SKILL.md +69 -0
  342. package/template/.codex/skills/create-prd-security/SKILL.md +66 -0
  343. package/template/.codex/skills/create-prd-stack/SKILL.md +84 -0
  344. package/template/.codex/skills/cross-layer-consistency/SKILL.md +117 -0
  345. package/template/.codex/skills/database-schema-design/SKILL.md +205 -0
  346. package/template/.codex/skills/database-schema-design/references/relational.md +228 -0
  347. package/template/.codex/skills/decompose-architecture/SKILL.md +72 -0
  348. package/template/.codex/skills/decompose-architecture-structure/SKILL.md +62 -0
  349. package/template/.codex/skills/decompose-architecture-validate/SKILL.md +72 -0
  350. package/template/.codex/skills/deployment-procedures/SKILL.md +241 -0
  351. package/template/.codex/skills/design-anti-cliche/SKILL.md +159 -0
  352. package/template/.codex/skills/design-direction/SKILL.md +45 -0
  353. package/template/.codex/skills/error-handling-patterns/SKILL.md +226 -0
  354. package/template/.codex/skills/error-handling-patterns/references/go.md +162 -0
  355. package/template/.codex/skills/error-handling-patterns/references/python.md +262 -0
  356. package/template/.codex/skills/error-handling-patterns/references/rust.md +112 -0
  357. package/template/.codex/skills/error-handling-patterns/references/typescript.md +178 -0
  358. package/template/.codex/skills/evolve-contract/SKILL.md +24 -0
  359. package/template/.codex/skills/evolve-feature/SKILL.md +18 -0
  360. package/template/.codex/skills/evolve-feature-cascade/SKILL.md +24 -0
  361. package/template/.codex/skills/evolve-feature-classify/SKILL.md +21 -0
  362. package/template/.codex/skills/find-skills/SKILL.md +145 -0
  363. package/template/.codex/skills/git-advanced/SKILL.md +972 -0
  364. package/template/.codex/skills/git-workflow/SKILL.md +420 -0
  365. package/template/.codex/skills/idea-extraction/SKILL.md +644 -0
  366. package/template/.codex/skills/ideate/SKILL.md +77 -0
  367. package/template/.codex/skills/ideate-discover/SKILL.md +89 -0
  368. package/template/.codex/skills/ideate-extract/SKILL.md +77 -0
  369. package/template/.codex/skills/ideate-validate/SKILL.md +75 -0
  370. package/template/.codex/skills/implement-slice/SKILL.md +64 -0
  371. package/template/.codex/skills/implement-slice-setup/SKILL.md +70 -0
  372. package/template/.codex/skills/implement-slice-tdd/SKILL.md +78 -0
  373. package/template/.codex/skills/logging-best-practices/SKILL.md +192 -0
  374. package/template/.codex/skills/logging-best-practices/references/go.md +49 -0
  375. package/template/.codex/skills/logging-best-practices/references/python.md +52 -0
  376. package/template/.codex/skills/logging-best-practices/references/typescript.md +215 -0
  377. package/template/.codex/skills/migration-management/SKILL.md +200 -0
  378. package/template/.codex/skills/migration-management/references/relational.md +214 -0
  379. package/template/.codex/skills/minimalist-surgical-development/SKILL.md +135 -0
  380. package/template/.codex/skills/parallel-agents/SKILL.md +165 -0
  381. package/template/.codex/skills/parallel-debugging/SKILL.md +135 -0
  382. package/template/.codex/skills/parallel-feature-development/SKILL.md +157 -0
  383. package/template/.codex/skills/performance-budgeting/SKILL.md +144 -0
  384. package/template/.codex/skills/pipeline-rubrics/SKILL.md +51 -0
  385. package/template/.codex/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
  386. package/template/.codex/skills/pipeline-rubrics/references/be-rubric.md +21 -0
  387. package/template/.codex/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
  388. package/template/.codex/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
  389. package/template/.codex/skills/pipeline-rubrics/references/scoring.md +32 -0
  390. package/template/.codex/skills/pipeline-rubrics/references/vision-rubric.md +12 -0
  391. package/template/.codex/skills/plan-phase/SKILL.md +62 -0
  392. package/template/.codex/skills/plan-phase-preflight/SKILL.md +75 -0
  393. package/template/.codex/skills/plan-phase-write/SKILL.md +85 -0
  394. package/template/.codex/skills/prd-templates/SKILL.md +107 -0
  395. package/template/.codex/skills/prd-templates/references/architecture-completeness-checklist.md +28 -0
  396. package/template/.codex/skills/prd-templates/references/architecture-design-template.md +88 -0
  397. package/template/.codex/skills/prd-templates/references/be-spec-classification.md +41 -0
  398. package/template/.codex/skills/prd-templates/references/be-spec-template.md +107 -0
  399. package/template/.codex/skills/prd-templates/references/bootstrap-verification-protocol.md +50 -0
  400. package/template/.codex/skills/prd-templates/references/constraint-exploration.md +41 -0
  401. package/template/.codex/skills/prd-templates/references/data-placement-template.md +74 -0
  402. package/template/.codex/skills/prd-templates/references/decision-confirmation-protocol.md +68 -0
  403. package/template/.codex/skills/prd-templates/references/decision-propagation.md +121 -0
  404. package/template/.codex/skills/prd-templates/references/decomposition-templates.md +226 -0
  405. package/template/.codex/skills/prd-templates/references/deep-ideation-loading-protocol.md +114 -0
  406. package/template/.codex/skills/prd-templates/references/design-system-decisions.md +198 -0
  407. package/template/.codex/skills/prd-templates/references/design-system-prerequisite-check.md +18 -0
  408. package/template/.codex/skills/prd-templates/references/domain-exhaustion-criteria.md +37 -0
  409. package/template/.codex/skills/prd-templates/references/engagement-tier-protocol.md +58 -0
  410. package/template/.codex/skills/prd-templates/references/engineering-standards-template.md +126 -0
  411. package/template/.codex/skills/prd-templates/references/evolution-layer-guidance.md +91 -0
  412. package/template/.codex/skills/prd-templates/references/expansion-modes.md +27 -0
  413. package/template/.codex/skills/prd-templates/references/fe-classification-procedures.md +47 -0
  414. package/template/.codex/skills/prd-templates/references/fe-spec-template.md +90 -0
  415. package/template/.codex/skills/prd-templates/references/feature-ledger-protocol.md +149 -0
  416. package/template/.codex/skills/prd-templates/references/folder-seeding-protocol.md +77 -0
  417. package/template/.codex/skills/prd-templates/references/fractal-cx-template.md +58 -0
  418. package/template/.codex/skills/prd-templates/references/fractal-feature-template.md +93 -0
  419. package/template/.codex/skills/prd-templates/references/fractal-node-index-template.md +55 -0
  420. package/template/.codex/skills/prd-templates/references/gate-applicability.md +92 -0
  421. package/template/.codex/skills/prd-templates/references/ideation-crosscut-template.md +36 -0
  422. package/template/.codex/skills/prd-templates/references/ideation-index-template.md +111 -0
  423. package/template/.codex/skills/prd-templates/references/ideation-meta-template.md +126 -0
  424. package/template/.codex/skills/prd-templates/references/infrastructure-report-template.md +71 -0
  425. package/template/.codex/skills/prd-templates/references/input-classification.md +23 -0
  426. package/template/.codex/skills/prd-templates/references/map-guard-protocol.md +65 -0
  427. package/template/.codex/skills/prd-templates/references/operational-templates.md +116 -0
  428. package/template/.codex/skills/prd-templates/references/persona-completeness-gate.md +20 -0
  429. package/template/.codex/skills/prd-templates/references/placeholder-guard-template.md +21 -0
  430. package/template/.codex/skills/prd-templates/references/placeholder-workflow-mapping.md +50 -0
  431. package/template/.codex/skills/prd-templates/references/shard-boundary-analysis.md +103 -0
  432. package/template/.codex/skills/prd-templates/references/shard-split-remediation.md +157 -0
  433. package/template/.codex/skills/prd-templates/references/skill-loading-protocol.md +36 -0
  434. package/template/.codex/skills/prd-templates/references/slice-completion-gates.md +29 -0
  435. package/template/.codex/skills/prd-templates/references/spec-coverage-sweep.md +44 -0
  436. package/template/.codex/skills/prd-templates/references/surface-model.md +61 -0
  437. package/template/.codex/skills/prd-templates/references/tdd-testing-policy.md +39 -0
  438. package/template/.codex/skills/prd-templates/references/vision-template.md +57 -0
  439. package/template/.codex/skills/prd-templates/references/workflow-checkpoint-protocol.md +112 -0
  440. package/template/.codex/skills/prd-templates/references/write-verification-protocol.md +57 -0
  441. package/template/.codex/skills/prompt-engineer/SKILL.md +203 -0
  442. package/template/.codex/skills/propagate-decision/SKILL.md +18 -0
  443. package/template/.codex/skills/propagate-decision-apply/SKILL.md +22 -0
  444. package/template/.codex/skills/propagate-decision-scan/SKILL.md +20 -0
  445. package/template/.codex/skills/regex-patterns/SKILL.md +333 -0
  446. package/template/.codex/skills/regex-patterns/references/go.md +44 -0
  447. package/template/.codex/skills/regex-patterns/references/javascript.md +63 -0
  448. package/template/.codex/skills/regex-patterns/references/python.md +77 -0
  449. package/template/.codex/skills/regex-patterns/references/rust.md +43 -0
  450. package/template/.codex/skills/remediate-pipeline/SKILL.md +18 -0
  451. package/template/.codex/skills/remediate-pipeline-assess/SKILL.md +21 -0
  452. package/template/.codex/skills/remediate-pipeline-execute/SKILL.md +23 -0
  453. package/template/.codex/skills/remediate-shard-split/SKILL.md +21 -0
  454. package/template/.codex/skills/resolve-ambiguity/SKILL.md +278 -0
  455. package/template/.codex/skills/security-scanning-security-hardening/SKILL.md +231 -0
  456. package/template/.codex/skills/session-continuity/SKILL.md +732 -0
  457. package/template/.codex/skills/session-continuity/protocols/01-session-resumption.md +38 -0
  458. package/template/.codex/skills/session-continuity/protocols/02-progress-generation.md +85 -0
  459. package/template/.codex/skills/session-continuity/protocols/03-progress-update.md +70 -0
  460. package/template/.codex/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
  461. package/template/.codex/skills/session-continuity/protocols/05-session-close.md +37 -0
  462. package/template/.codex/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
  463. package/template/.codex/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
  464. package/template/.codex/skills/session-continuity/protocols/08-spec-pipeline-update.md +65 -0
  465. package/template/.codex/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
  466. package/template/.codex/skills/session-continuity/protocols/10-placeholder-verification-gate.md +83 -0
  467. package/template/.codex/skills/session-continuity/protocols/11-parallel-synthesis.md +21 -0
  468. package/template/.codex/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
  469. package/template/.codex/skills/setup/README.md +24 -0
  470. package/template/.codex/skills/setup/setup-cfsa.md +200 -0
  471. package/template/.codex/skills/setup/setup-fill-placeholders.md +192 -0
  472. package/template/.codex/skills/setup/setup-provision-skills.md +82 -0
  473. package/template/.codex/skills/setup/setup-verify.md +89 -0
  474. package/template/.codex/skills/setup-workspace/SKILL.md +83 -0
  475. package/template/.codex/skills/setup-workspace-cicd/SKILL.md +56 -0
  476. package/template/.codex/skills/setup-workspace-data/SKILL.md +69 -0
  477. package/template/.codex/skills/setup-workspace-hosting/SKILL.md +59 -0
  478. package/template/.codex/skills/setup-workspace-scaffold/SKILL.md +72 -0
  479. package/template/.codex/skills/skill-creator/SKILL.md +203 -0
  480. package/template/.codex/skills/spec-writing/SKILL.md +110 -0
  481. package/template/.codex/skills/sync-kit/SKILL.md +23 -0
  482. package/template/.codex/skills/systematic-debugging/CREATION-LOG.md +119 -0
  483. package/template/.codex/skills/systematic-debugging/SKILL.md +297 -0
  484. package/template/.codex/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  485. package/template/.codex/skills/systematic-debugging/condition-based-waiting.md +115 -0
  486. package/template/.codex/skills/systematic-debugging/defense-in-depth.md +122 -0
  487. package/template/.codex/skills/systematic-debugging/find-polluter.sh +63 -0
  488. package/template/.codex/skills/systematic-debugging/root-cause-tracing.md +169 -0
  489. package/template/.codex/skills/systematic-debugging/test-academic.md +14 -0
  490. package/template/.codex/skills/systematic-debugging/test-pressure-1.md +58 -0
  491. package/template/.codex/skills/systematic-debugging/test-pressure-2.md +68 -0
  492. package/template/.codex/skills/systematic-debugging/test-pressure-3.md +69 -0
  493. package/template/.codex/skills/tdd-workflow/SKILL.md +186 -0
  494. package/template/.codex/skills/tdd-workflow/references/typescript.md +231 -0
  495. package/template/.codex/skills/tech-stack-catalog/SKILL.md +49 -0
  496. package/template/.codex/skills/tech-stack-catalog/references/constraint-questions.md +237 -0
  497. package/template/.codex/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
  498. package/template/.codex/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
  499. package/template/.codex/skills/technical-writer/SKILL.md +242 -0
  500. package/template/.codex/skills/testing-strategist/SKILL.md +319 -0
  501. package/template/.codex/skills/testing-strategist/references/typescript.md +328 -0
  502. package/template/.codex/skills/update-architecture-map/SKILL.md +21 -0
  503. package/template/.codex/skills/utilities/resolve-skill.md +195 -0
  504. package/template/.codex/skills/validate-phase/SKILL.md +62 -0
  505. package/template/.codex/skills/validate-phase-quality/SKILL.md +67 -0
  506. package/template/.codex/skills/validate-phase-readiness/SKILL.md +74 -0
  507. package/template/.codex/skills/verification-before-completion/SKILL.md +97 -0
  508. package/template/.codex/skills/verify-infrastructure/SKILL.md +25 -0
  509. package/template/.codex/skills/workflow-automation/SKILL.md +166 -0
  510. package/template/.codex/skills/workflow-automation/references/inngest.md +88 -0
  511. package/template/.codex/skills/workflow-automation/references/temporal.md +64 -0
  512. package/template/.codex/skills/write-architecture-spec/SKILL.md +78 -0
  513. package/template/.codex/skills/write-architecture-spec-deepen/SKILL.md +82 -0
  514. package/template/.codex/skills/write-architecture-spec-design/SKILL.md +80 -0
  515. package/template/.codex/skills/write-be-spec/SKILL.md +75 -0
  516. package/template/.codex/skills/write-be-spec-classify/SKILL.md +80 -0
  517. package/template/.codex/skills/write-be-spec-write/SKILL.md +99 -0
  518. package/template/.codex/skills/write-fe-spec/SKILL.md +79 -0
  519. package/template/.codex/skills/write-fe-spec-classify/SKILL.md +77 -0
  520. package/template/.codex/skills/write-fe-spec-write/SKILL.md +88 -0
  521. package/template/.factory/README.md +2 -3
  522. package/template/.factory/instructions/workflow.md +3 -3
  523. package/template/.factory/kit-sync.md +3 -3
  524. package/template/.factory/skills/completion-checklist/SKILL.md +3 -3
  525. package/template/.factory/skills/parallel-agents/SKILL.md +1 -1
  526. package/template/.factory/skills/plan-phase/SKILL.md +2 -2
  527. package/template/.factory/skills/plan-phase-preflight/SKILL.md +2 -2
  528. package/template/.factory/skills/session-continuity/SKILL.md +6 -6
  529. package/template/.factory/skills/session-continuity/protocols/01-session-resumption.md +1 -1
  530. package/template/.factory/skills/session-continuity/protocols/02-progress-generation.md +3 -3
  531. package/template/.factory/skills/session-continuity/protocols/03-progress-update.md +4 -4
  532. package/template/.factory/skills/session-continuity/protocols/07-spec-pipeline-generation.md +1 -1
  533. package/template/.factory/skills/session-continuity/protocols/08-spec-pipeline-update.md +2 -2
  534. package/template/.factory/skills/session-continuity/protocols/11-parallel-synthesis.md +1 -1
  535. package/template/.factory/skills/setup-cfsa/SKILL.md +1 -1
  536. package/template/.factory/skills/write-architecture-spec/SKILL.md +2 -2
  537. package/template/.factory/skills/write-architecture-spec-deepen/SKILL.md +1 -1
  538. package/template/.factory/skills/write-architecture-spec-design/SKILL.md +1 -1
  539. package/template/.factory/skills/write-be-spec/SKILL.md +3 -3
  540. package/template/.factory/skills/write-be-spec-classify/SKILL.md +1 -1
  541. package/template/.factory/skills/write-be-spec-write/SKILL.md +1 -1
  542. package/template/.factory/skills/write-fe-spec/SKILL.md +3 -3
  543. package/template/.factory/skills/write-fe-spec-write/SKILL.md +1 -1
  544. package/template/.memory/README.md +1 -0
  545. package/template/.memory/mcp-server/README.md +10 -2
  546. package/template/.memory/mcp-server/client.mjs +61 -18
  547. package/template/.memory/mcp-server/daemon.mjs +8 -3
  548. package/template/.memory/mcp-server/runtime.mjs +51 -14
  549. package/template/.memory/mcp-server/start.mjs +4 -2
  550. package/template/.memory/migrate/migrate-legacy.mjs +1 -0
  551. package/template/.memory/pipeline/README.md +1 -0
  552. package/template/CLAUDE.md +4 -4
  553. package/template/CODEX.md +6 -53
  554. package/template/GEMINI.md +2 -2
  555. package/template/docs/README.md +5 -2
  556. package/template/docs/kit-architecture.md +36 -19
  557. package/template/docs/progress-state-catalog.md +48 -0
  558. package/template/.factory/progress/memory/.gitkeep +0 -0
  559. /package/template/{.agent/progress → .codex/skills/skill-creator/references}/.gitkeep +0 -0
  560. /package/template/{.agent/progress/memory → .codex/skills/skill-creator/scripts}/.gitkeep +0 -0
  561. /package/template/{.agent/progress/sessions → .memory/pipeline/progress}/.gitkeep +0 -0
  562. /package/template/{.claude/progress → .memory/pipeline/progress/memory}/.gitkeep +0 -0
  563. /package/template/{.claude/progress/memory → .memory/pipeline/progress/phases}/.gitkeep +0 -0
  564. /package/template/{.claude → .memory/pipeline}/progress/sessions/.gitkeep +0 -0
  565. /package/template/{.factory/progress → .memory/pipeline/progress/slices}/.gitkeep +0 -0
@@ -0,0 +1,714 @@
1
+ ---
2
+ name: vitest
3
+ description: "Comprehensive Vitest unit testing guide covering configuration, assertions, mocking, snapshots, coverage, async testing, timer mocking, component testing, type testing, and benchmarking. Use when writing unit tests, configuring test environments, mocking modules, or setting up coverage."
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # Vitest Unit Testing
8
+
9
+ ## 1. Configuration
10
+
11
+ ### vitest.config.ts
12
+
13
+ ```typescript
14
+ import { defineConfig } from 'vitest/config';
15
+ import react from '@vitejs/plugin-react';
16
+ import tsconfigPaths from 'vite-tsconfig-paths';
17
+
18
+ export default defineConfig({
19
+ plugins: [react(), tsconfigPaths()],
20
+ test: {
21
+ // Environment
22
+ environment: 'node', // 'node' | 'jsdom' | 'happy-dom'
23
+ globals: true, // Use describe/it/expect without imports
24
+
25
+ // File patterns
26
+ include: ['src/**/*.test.{ts,tsx}'],
27
+ exclude: ['node_modules', 'dist', 'tests/e2e'],
28
+
29
+ // Setup files (run before each test file)
30
+ setupFiles: ['./src/test/setup.ts'],
31
+
32
+ // Coverage
33
+ coverage: {
34
+ provider: 'v8', // 'v8' or 'istanbul'
35
+ reporter: ['text', 'html', 'lcov'],
36
+ include: ['src/**/*.{ts,tsx}'],
37
+ exclude: [
38
+ 'src/**/*.test.{ts,tsx}',
39
+ 'src/**/*.d.ts',
40
+ 'src/test/**',
41
+ 'src/**/index.ts', // barrel files
42
+ ],
43
+ thresholds: {
44
+ statements: 80,
45
+ branches: 80,
46
+ functions: 80,
47
+ lines: 80,
48
+ },
49
+ },
50
+
51
+ // Timeouts
52
+ testTimeout: 10_000,
53
+ hookTimeout: 10_000,
54
+
55
+ // Isolation
56
+ pool: 'forks', // 'threads' | 'forks' | 'vmThreads'
57
+ isolate: true, // Isolate test files
58
+ },
59
+ });
60
+ ```
61
+
62
+ ### Per-File Environment Override
63
+
64
+ ```typescript
65
+ // @vitest-environment jsdom
66
+ // This comment at the top of a test file overrides the global environment
67
+
68
+ import { render, screen } from '@testing-library/react';
69
+
70
+ test('renders component', () => {
71
+ render(<Button>Click me</Button>);
72
+ expect(screen.getByRole('button')).toHaveTextContent('Click me');
73
+ });
74
+ ```
75
+
76
+ ### Workspaces (Monorepo)
77
+
78
+ ```typescript
79
+ // vitest.workspace.ts
80
+ import { defineWorkspace } from 'vitest/config';
81
+
82
+ export default defineWorkspace([
83
+ {
84
+ extends: './vitest.config.ts',
85
+ test: {
86
+ name: 'unit',
87
+ include: ['src/**/*.test.ts'],
88
+ environment: 'node',
89
+ },
90
+ },
91
+ {
92
+ extends: './vitest.config.ts',
93
+ test: {
94
+ name: 'components',
95
+ include: ['src/**/*.test.tsx'],
96
+ environment: 'jsdom',
97
+ setupFiles: ['./src/test/setup-dom.ts'],
98
+ },
99
+ },
100
+ ]);
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 2. Test Structure
106
+
107
+ ```typescript
108
+ import { describe, it, test, expect, beforeAll, beforeEach, afterEach, afterAll } from 'vitest';
109
+
110
+ describe('UserService', () => {
111
+ let service: UserService;
112
+
113
+ // Runs once before all tests in this describe block
114
+ beforeAll(async () => {
115
+ await setupDatabase();
116
+ });
117
+
118
+ // Runs before each test
119
+ beforeEach(() => {
120
+ service = new UserService();
121
+ });
122
+
123
+ // Runs after each test
124
+ afterEach(() => {
125
+ service.dispose();
126
+ });
127
+
128
+ // Runs once after all tests
129
+ afterAll(async () => {
130
+ await teardownDatabase();
131
+ });
132
+
133
+ it('should create a user with valid data', async () => {
134
+ const user = await service.create({ email: 'test@example.com', name: 'Test' });
135
+ expect(user.id).toBeDefined();
136
+ expect(user.email).toBe('test@example.com');
137
+ });
138
+
139
+ it('should throw on duplicate email', async () => {
140
+ await service.create({ email: 'dup@example.com', name: 'First' });
141
+ await expect(service.create({ email: 'dup@example.com', name: 'Second' }))
142
+ .rejects.toThrow('Email already exists');
143
+ });
144
+
145
+ // Nested describe for grouping
146
+ describe('findByEmail', () => {
147
+ it('should return null for unknown email', async () => {
148
+ const user = await service.findByEmail('unknown@example.com');
149
+ expect(user).toBeNull();
150
+ });
151
+ });
152
+ });
153
+ ```
154
+
155
+ ### Test Filtering
156
+
157
+ ```typescript
158
+ // Run only this test (use during development, never commit)
159
+ it.only('focused test', () => { /* ... */ });
160
+
161
+ // Skip this test
162
+ it.skip('skipped test', () => { /* ... */ });
163
+
164
+ // Mark as to-do (shows in output but does not fail)
165
+ it.todo('test to write later');
166
+
167
+ // Run tests concurrently within a describe block
168
+ describe.concurrent('parallel tests', () => {
169
+ it('test A', async () => { /* ... */ });
170
+ it('test B', async () => { /* ... */ });
171
+ });
172
+
173
+ // Repeat a test multiple times (useful for flakiness detection)
174
+ it.repeats(100)('should be stable', () => { /* ... */ });
175
+ ```
176
+
177
+ ---
178
+
179
+ ## 3. Assertions
180
+
181
+ ### Core Matchers
182
+
183
+ ```typescript
184
+ // Equality
185
+ expect(value).toBe(2); // strict === (primitives, references)
186
+ expect(obj).toEqual({ a: 1, b: 2 }); // deep equality
187
+ expect(obj).toStrictEqual({ a: 1, b: 2 }); // deep equality + checks undefined properties
188
+
189
+ // Partial matching
190
+ expect(user).toMatchObject({ email: 'test@example.com' }); // subset match
191
+ expect(user).toEqual(expect.objectContaining({ email: 'test@example.com' }));
192
+
193
+ // Truthiness
194
+ expect(value).toBeTruthy();
195
+ expect(value).toBeFalsy();
196
+ expect(value).toBeNull();
197
+ expect(value).toBeUndefined();
198
+ expect(value).toBeDefined();
199
+
200
+ // Numbers
201
+ expect(count).toBeGreaterThan(0);
202
+ expect(count).toBeGreaterThanOrEqual(1);
203
+ expect(count).toBeLessThan(100);
204
+ expect(0.1 + 0.2).toBeCloseTo(0.3, 5); // floating point comparison
205
+
206
+ // Strings
207
+ expect(message).toContain('error');
208
+ expect(message).toMatch(/^Error: .+/);
209
+
210
+ // Arrays
211
+ expect(list).toContain('item');
212
+ expect(list).toHaveLength(3);
213
+ expect(list).toEqual(expect.arrayContaining(['a', 'b']));
214
+
215
+ // Exceptions
216
+ expect(() => riskyFunction()).toThrow();
217
+ expect(() => riskyFunction()).toThrow('specific message');
218
+ expect(() => riskyFunction()).toThrow(ValidationError);
219
+ expect(() => riskyFunction()).toThrowErrorMatchingInlineSnapshot(`"specific message"`);
220
+ ```
221
+
222
+ ### Async Assertions
223
+
224
+ ```typescript
225
+ // Resolved value
226
+ await expect(asyncFn()).resolves.toBe(42);
227
+ await expect(asyncFn()).resolves.toEqual({ status: 'ok' });
228
+
229
+ // Rejected value
230
+ await expect(asyncFn()).rejects.toThrow('Not found');
231
+ await expect(asyncFn()).rejects.toBeInstanceOf(NotFoundError);
232
+
233
+ // Multiple assertions on resolved value
234
+ const result = await asyncFn();
235
+ expect(result.status).toBe(200);
236
+ expect(result.data).toHaveLength(10);
237
+ ```
238
+
239
+ ---
240
+
241
+ ## 4. Mocking
242
+
243
+ ### Function Mocks (vi.fn)
244
+
245
+ ```typescript
246
+ import { vi } from 'vitest';
247
+
248
+ // Create a mock function
249
+ const mockFn = vi.fn();
250
+ mockFn('arg1', 'arg2');
251
+
252
+ expect(mockFn).toHaveBeenCalled();
253
+ expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2');
254
+ expect(mockFn).toHaveBeenCalledTimes(1);
255
+
256
+ // Mock with return value
257
+ const getId = vi.fn().mockReturnValue('abc-123');
258
+ const getUser = vi.fn().mockResolvedValue({ id: '1', name: 'Alice' });
259
+ const failingFn = vi.fn().mockRejectedValue(new Error('Failed'));
260
+
261
+ // Mock implementation
262
+ const calculate = vi.fn().mockImplementation((a: number, b: number) => a + b);
263
+
264
+ // Different returns on successive calls
265
+ const counter = vi.fn()
266
+ .mockReturnValueOnce(1)
267
+ .mockReturnValueOnce(2)
268
+ .mockReturnValueOnce(3);
269
+ ```
270
+
271
+ ### Spy on Methods (vi.spyOn)
272
+
273
+ ```typescript
274
+ // Spy on an object method (original implementation runs by default)
275
+ const spy = vi.spyOn(console, 'error');
276
+ doSomethingThatLogs();
277
+ expect(spy).toHaveBeenCalledWith('Expected error message');
278
+ spy.mockRestore(); // Restore original implementation
279
+
280
+ // Spy and replace implementation
281
+ const dateSpy = vi.spyOn(Date, 'now').mockReturnValue(1700000000000);
282
+ expect(Date.now()).toBe(1700000000000);
283
+ dateSpy.mockRestore();
284
+ ```
285
+
286
+ ### Module Mocking (vi.mock)
287
+
288
+ ```typescript
289
+ // Mock an entire module
290
+ vi.mock('./database', () => ({
291
+ db: {
292
+ query: vi.fn().mockResolvedValue([{ id: '1', name: 'Test' }]),
293
+ insert: vi.fn().mockResolvedValue({ id: '1' }),
294
+ },
295
+ }));
296
+
297
+ // The mock is hoisted to the top of the file automatically
298
+ import { db } from './database'; // This gets the mocked version
299
+
300
+ test('uses mocked database', async () => {
301
+ const result = await db.query('SELECT * FROM users');
302
+ expect(result).toEqual([{ id: '1', name: 'Test' }]);
303
+ });
304
+ ```
305
+
306
+ ### Factory Pattern for Module Mocks
307
+
308
+ ```typescript
309
+ // Mock with factory that has access to vi
310
+ vi.mock('./config', () => {
311
+ return {
312
+ getConfig: vi.fn(() => ({
313
+ apiUrl: 'http://test-api.local',
314
+ timeout: 1000,
315
+ })),
316
+ };
317
+ });
318
+
319
+ // Change mock behavior per test
320
+ import { getConfig } from './config';
321
+
322
+ test('handles missing config', () => {
323
+ vi.mocked(getConfig).mockReturnValueOnce({ apiUrl: '', timeout: 0 });
324
+ expect(() => initializeApp()).toThrow('API URL is required');
325
+ });
326
+ ```
327
+
328
+ ### Partial Module Mocking
329
+
330
+ ```typescript
331
+ // Mock only specific exports, keep the rest real
332
+ vi.mock('./utils', async (importOriginal) => {
333
+ const actual = await importOriginal<typeof import('./utils')>();
334
+ return {
335
+ ...actual,
336
+ fetchData: vi.fn().mockResolvedValue({ data: 'mocked' }),
337
+ // All other exports remain real
338
+ };
339
+ });
340
+ ```
341
+
342
+ ### Global Mocking
343
+
344
+ ```typescript
345
+ // Mock global objects
346
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
347
+ ok: true,
348
+ json: () => Promise.resolve({ data: 'test' }),
349
+ }));
350
+
351
+ // Mock environment variables
352
+ vi.stubEnv('API_KEY', 'test-key-123');
353
+
354
+ // Clean up in afterEach
355
+ afterEach(() => {
356
+ vi.unstubAllGlobals();
357
+ vi.unstubAllEnvs();
358
+ });
359
+ ```
360
+
361
+ ---
362
+
363
+ ## 5. Timer Mocking
364
+
365
+ ```typescript
366
+ import { vi, beforeEach, afterEach } from 'vitest';
367
+
368
+ beforeEach(() => {
369
+ vi.useFakeTimers();
370
+ });
371
+
372
+ afterEach(() => {
373
+ vi.useRealTimers();
374
+ });
375
+
376
+ test('debounce waits before calling', () => {
377
+ const callback = vi.fn();
378
+ const debounced = debounce(callback, 300);
379
+
380
+ debounced();
381
+ expect(callback).not.toHaveBeenCalled();
382
+
383
+ vi.advanceTimersByTime(299);
384
+ expect(callback).not.toHaveBeenCalled();
385
+
386
+ vi.advanceTimersByTime(1);
387
+ expect(callback).toHaveBeenCalledTimes(1);
388
+ });
389
+
390
+ test('setInterval fires repeatedly', () => {
391
+ const callback = vi.fn();
392
+ setInterval(callback, 1000);
393
+
394
+ vi.advanceTimersByTime(3500);
395
+ expect(callback).toHaveBeenCalledTimes(3);
396
+ });
397
+
398
+ // Run all pending timers
399
+ test('run all timers', () => {
400
+ const callback = vi.fn();
401
+ setTimeout(callback, 5000);
402
+
403
+ vi.runAllTimers();
404
+ expect(callback).toHaveBeenCalled();
405
+ });
406
+
407
+ // Set system time
408
+ test('date-dependent logic', () => {
409
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
410
+ expect(isWeekend()).toBe(true);
411
+ });
412
+ ```
413
+
414
+ ---
415
+
416
+ ## 6. Snapshot Testing
417
+
418
+ ```typescript
419
+ // Inline snapshot (stored in the test file itself)
420
+ test('serializes user correctly', () => {
421
+ const user = formatUser({ id: '1', email: 'test@example.com', name: 'Test User' });
422
+
423
+ expect(user).toMatchInlineSnapshot(`
424
+ {
425
+ "displayName": "Test User",
426
+ "email": "test@example.com",
427
+ "id": "1",
428
+ }
429
+ `);
430
+ });
431
+
432
+ // File snapshot (stored in __snapshots__/ directory)
433
+ test('config output', () => {
434
+ const config = generateConfig({ env: 'production' });
435
+ expect(config).toMatchSnapshot();
436
+ });
437
+
438
+ // Update snapshots: vitest --update (or press 'u' in watch mode)
439
+ ```
440
+
441
+ **When to use snapshots**: Use them for serializable output (JSON, HTML, config objects). Avoid them for assertions that should be explicit -- prefer `toEqual` for business logic.
442
+
443
+ ---
444
+
445
+ ## 7. Testing React Components
446
+
447
+ ### Setup
448
+
449
+ ```typescript
450
+ // src/test/setup.ts
451
+ import '@testing-library/jest-dom/vitest';
452
+ import { cleanup } from '@testing-library/react';
453
+ import { afterEach } from 'vitest';
454
+
455
+ // Cleanup after each test
456
+ afterEach(() => {
457
+ cleanup();
458
+ });
459
+ ```
460
+
461
+ ### Component Tests
462
+
463
+ ```typescript
464
+ import { render, screen, waitFor } from '@testing-library/react';
465
+ import userEvent from '@testing-library/user-event';
466
+ import { describe, it, expect, vi } from 'vitest';
467
+ import { LoginForm } from './LoginForm';
468
+
469
+ describe('LoginForm', () => {
470
+ it('should render email and password fields', () => {
471
+ render(<LoginForm onSubmit={vi.fn()} />);
472
+
473
+ expect(screen.getByLabelText('Email')).toBeInTheDocument();
474
+ expect(screen.getByLabelText('Password')).toBeInTheDocument();
475
+ expect(screen.getByRole('button', { name: 'Sign in' })).toBeInTheDocument();
476
+ });
477
+
478
+ it('should call onSubmit with form values', async () => {
479
+ const user = userEvent.setup();
480
+ const handleSubmit = vi.fn();
481
+ render(<LoginForm onSubmit={handleSubmit} />);
482
+
483
+ await user.type(screen.getByLabelText('Email'), 'test@example.com');
484
+ await user.type(screen.getByLabelText('Password'), 'password123');
485
+ await user.click(screen.getByRole('button', { name: 'Sign in' }));
486
+
487
+ expect(handleSubmit).toHaveBeenCalledWith({
488
+ email: 'test@example.com',
489
+ password: 'password123',
490
+ });
491
+ });
492
+
493
+ it('should show validation errors', async () => {
494
+ const user = userEvent.setup();
495
+ render(<LoginForm onSubmit={vi.fn()} />);
496
+
497
+ // Submit without filling fields
498
+ await user.click(screen.getByRole('button', { name: 'Sign in' }));
499
+
500
+ await waitFor(() => {
501
+ expect(screen.getByText('Email is required')).toBeInTheDocument();
502
+ });
503
+ });
504
+
505
+ it('should disable button while submitting', async () => {
506
+ const user = userEvent.setup();
507
+ const handleSubmit = vi.fn(() => new Promise((resolve) => setTimeout(resolve, 1000)));
508
+ render(<LoginForm onSubmit={handleSubmit} />);
509
+
510
+ await user.type(screen.getByLabelText('Email'), 'test@example.com');
511
+ await user.type(screen.getByLabelText('Password'), 'password123');
512
+ await user.click(screen.getByRole('button', { name: 'Sign in' }));
513
+
514
+ expect(screen.getByRole('button', { name: 'Signing in...' })).toBeDisabled();
515
+ });
516
+ });
517
+ ```
518
+
519
+ ### Testing Custom Hooks
520
+
521
+ ```typescript
522
+ import { renderHook, act } from '@testing-library/react';
523
+ import { useCounter } from './useCounter';
524
+
525
+ test('useCounter increments and decrements', () => {
526
+ const { result } = renderHook(() => useCounter(0));
527
+
528
+ expect(result.current.count).toBe(0);
529
+
530
+ act(() => { result.current.increment(); });
531
+ expect(result.current.count).toBe(1);
532
+
533
+ act(() => { result.current.decrement(); });
534
+ expect(result.current.count).toBe(0);
535
+ });
536
+ ```
537
+
538
+ ---
539
+
540
+ ## 8. Type Testing
541
+
542
+ ```typescript
543
+ import { expectTypeOf, test } from 'vitest';
544
+ import { getUser, type User } from './user';
545
+
546
+ test('getUser returns a User', () => {
547
+ expectTypeOf(getUser).returns.toEqualTypeOf<Promise<User>>();
548
+ });
549
+
550
+ test('User has expected shape', () => {
551
+ expectTypeOf<User>().toHaveProperty('id').toBeString();
552
+ expectTypeOf<User>().toHaveProperty('email').toBeString();
553
+ expectTypeOf<User>().toHaveProperty('active').toBeBoolean();
554
+ });
555
+
556
+ test('function parameter types', () => {
557
+ expectTypeOf(getUser).parameter(0).toBeString(); // first param is string
558
+ });
559
+
560
+ test('schema inference produces correct type', () => {
561
+ type Inferred = z.infer<typeof userSchema>;
562
+ expectTypeOf<Inferred>().toEqualTypeOf<{ name: string; email: string; age: number }>();
563
+ });
564
+ ```
565
+
566
+ ---
567
+
568
+ ## 9. Performance Benchmarking
569
+
570
+ ```typescript
571
+ import { bench, describe } from 'vitest';
572
+
573
+ describe('string concatenation', () => {
574
+ const items = Array.from({ length: 1000 }, (_, i) => `item-${i}`);
575
+
576
+ bench('Array.join', () => {
577
+ items.join(', ');
578
+ });
579
+
580
+ bench('template literal reduce', () => {
581
+ items.reduce((acc, item) => `${acc}, ${item}`);
582
+ });
583
+
584
+ bench('string concatenation', () => {
585
+ let result = '';
586
+ for (const item of items) {
587
+ result += result ? `, ${item}` : item;
588
+ }
589
+ });
590
+ });
591
+
592
+ // Run benchmarks: vitest bench
593
+ ```
594
+
595
+ ---
596
+
597
+ ## 10. In-Source Testing
598
+
599
+ Write tests alongside the code in the same file. Tests are removed from production builds by Vite.
600
+
601
+ ```typescript
602
+ // src/lib/math.ts
603
+ export function fibonacci(n: number): number {
604
+ if (n <= 1) return n;
605
+ return fibonacci(n - 1) + fibonacci(n - 2);
606
+ }
607
+
608
+ // In-source test block (stripped from production build)
609
+ if (import.meta.vitest) {
610
+ const { it, expect } = import.meta.vitest;
611
+
612
+ it('fibonacci(0) = 0', () => { expect(fibonacci(0)).toBe(0); });
613
+ it('fibonacci(1) = 1', () => { expect(fibonacci(1)).toBe(1); });
614
+ it('fibonacci(10) = 55', () => { expect(fibonacci(10)).toBe(55); });
615
+ }
616
+ ```
617
+
618
+ Requires config:
619
+ ```typescript
620
+ // vitest.config.ts
621
+ export default defineConfig({
622
+ test: { includeSource: ['src/**/*.ts'] },
623
+ define: { 'import.meta.vitest': 'undefined' }, // strip in production
624
+ });
625
+ ```
626
+
627
+ ---
628
+
629
+ ## 11. Common Patterns
630
+
631
+ ### Testing Zod Schemas
632
+
633
+ ```typescript
634
+ import { describe, it, expect } from 'vitest';
635
+ import { userSchema } from './user.schema';
636
+
637
+ describe('userSchema', () => {
638
+ it('should accept valid input', () => {
639
+ const result = userSchema.safeParse({
640
+ email: 'test@example.com',
641
+ name: 'Test User',
642
+ age: 25,
643
+ });
644
+ expect(result.success).toBe(true);
645
+ });
646
+
647
+ it('should reject invalid email', () => {
648
+ const result = userSchema.safeParse({
649
+ email: 'not-an-email',
650
+ name: 'Test',
651
+ age: 25,
652
+ });
653
+ expect(result.success).toBe(false);
654
+ if (!result.success) {
655
+ expect(result.error.issues[0].path).toEqual(['email']);
656
+ }
657
+ });
658
+
659
+ it('should reject missing required fields', () => {
660
+ const result = userSchema.safeParse({});
661
+ expect(result.success).toBe(false);
662
+ });
663
+
664
+ it('should apply defaults', () => {
665
+ const result = userSchema.parse({ email: 'a@b.com', name: 'A' });
666
+ expect(result.role).toBe('user'); // default value
667
+ });
668
+ });
669
+ ```
670
+
671
+ ### Testing Error Boundaries
672
+
673
+ ```typescript
674
+ import { vi } from 'vitest';
675
+
676
+ // Suppress console.error for expected errors
677
+ const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
678
+
679
+ afterEach(() => {
680
+ consoleSpy.mockRestore();
681
+ });
682
+
683
+ test('handles async errors', async () => {
684
+ const result = await safeAsync(() => { throw new Error('test'); });
685
+ expect(result.ok).toBe(false);
686
+ expect(result.error?.message).toBe('test');
687
+ });
688
+ ```
689
+
690
+ ---
691
+
692
+ ## 12. Critical Reminders
693
+
694
+ ### ALWAYS
695
+
696
+ - Clean up mocks with `vi.restoreAllMocks()` in `afterEach` (or use `mockReset: true` in config)
697
+ - Use `vi.mocked()` to get typed mock references
698
+ - Prefer `userEvent` over `fireEvent` for component interaction tests
699
+ - Use `vi.useFakeTimers()` and `vi.useRealTimers()` in matched pairs
700
+ - Test both success and error paths
701
+ - Use `waitFor` for async DOM updates, not `setTimeout`
702
+ - Run coverage to find untested code paths
703
+ - Match test file names to source files (`user.ts` -> `user.test.ts`)
704
+
705
+ ### NEVER
706
+
707
+ - Leave `test.only` or `describe.only` in committed code
708
+ - Mock what you own -- test your code, mock external dependencies
709
+ - Use `any` in test code -- tests should be type-safe too
710
+ - Ignore flaky tests -- fix the root cause (usually missing `await` or `waitFor`)
711
+ - Write tests that depend on execution order
712
+ - Mock `Date.now()` without restoring it
713
+ - Skip cleanup of spies and mocks (causes test pollution)
714
+ - Use `toBe` for object comparison (use `toEqual` or `toStrictEqual`)