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,734 @@
1
+ ---
2
+ name: firebase-auth
3
+ description: |
4
+ Build with Firebase Authentication - email/password, OAuth providers, phone auth, and custom tokens. Use when: setting up auth flows, implementing sign-in/sign-up, managing user sessions, protecting routes, or troubleshooting auth/invalid-credential, auth/popup-closed, auth/user-not-found, or token refresh errors. Prevents 12 documented errors.
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Firebase Authentication
9
+
10
+ **Status**: Production Ready
11
+ **Last Updated**: 2026-01-25
12
+ **Dependencies**: None (standalone skill)
13
+ **Latest Versions**: firebase@12.8.0, firebase-admin@13.6.0
14
+
15
+ ---
16
+
17
+ ## Quick Start (5 Minutes)
18
+
19
+ ### 1. Enable Auth Providers in Firebase Console
20
+
21
+ 1. Go to Firebase Console > Authentication > Sign-in method
22
+ 2. Enable desired providers (Email/Password, Google, etc.)
23
+ 3. Configure OAuth providers with client ID/secret
24
+
25
+ ### 2. Initialize Firebase Auth (Client)
26
+
27
+ ```typescript
28
+ // src/lib/firebase.ts
29
+ import { initializeApp } from 'firebase/app';
30
+ import { getAuth } from 'firebase/auth';
31
+
32
+ const firebaseConfig = {
33
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
34
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
35
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
36
+ // ... other config
37
+ };
38
+
39
+ const app = initializeApp(firebaseConfig);
40
+ export const auth = getAuth(app);
41
+ ```
42
+
43
+ ### 3. Initialize Firebase Admin (Server)
44
+
45
+ ```typescript
46
+ // src/lib/firebase-admin.ts
47
+ import { initializeApp, cert, getApps } from 'firebase-admin/app';
48
+ import { getAuth } from 'firebase-admin/auth';
49
+
50
+ if (!getApps().length) {
51
+ initializeApp({
52
+ credential: cert({
53
+ projectId: process.env.FIREBASE_PROJECT_ID,
54
+ clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
55
+ privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
56
+ }),
57
+ });
58
+ }
59
+
60
+ export const adminAuth = getAuth();
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Email/Password Authentication
66
+
67
+ ### Sign Up
68
+
69
+ ```typescript
70
+ import { createUserWithEmailAndPassword, sendEmailVerification, updateProfile } from 'firebase/auth';
71
+ import { auth } from './firebase';
72
+
73
+ async function signUp(email: string, password: string, displayName: string) {
74
+ try {
75
+ const userCredential = await createUserWithEmailAndPassword(auth, email, password);
76
+ const user = userCredential.user;
77
+
78
+ // Update display name
79
+ await updateProfile(user, { displayName });
80
+
81
+ // Send verification email
82
+ await sendEmailVerification(user);
83
+
84
+ return user;
85
+ } catch (error: any) {
86
+ switch (error.code) {
87
+ case 'auth/email-already-in-use':
88
+ throw new Error('Email already registered');
89
+ case 'auth/invalid-email':
90
+ throw new Error('Invalid email address');
91
+ case 'auth/weak-password':
92
+ throw new Error('Password must be at least 6 characters');
93
+ default:
94
+ throw new Error('Sign up failed');
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ ### Sign In
101
+
102
+ ```typescript
103
+ import { signInWithEmailAndPassword } from 'firebase/auth';
104
+ import { auth } from './firebase';
105
+
106
+ async function signIn(email: string, password: string) {
107
+ try {
108
+ const userCredential = await signInWithEmailAndPassword(auth, email, password);
109
+ return userCredential.user;
110
+ } catch (error: any) {
111
+ switch (error.code) {
112
+ case 'auth/user-not-found':
113
+ case 'auth/wrong-password':
114
+ case 'auth/invalid-credential':
115
+ throw new Error('Invalid email or password');
116
+ case 'auth/user-disabled':
117
+ throw new Error('Account has been disabled');
118
+ case 'auth/too-many-requests':
119
+ throw new Error('Too many attempts. Try again later.');
120
+ default:
121
+ throw new Error('Sign in failed');
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ ### Sign Out
128
+
129
+ ```typescript
130
+ import { signOut } from 'firebase/auth';
131
+ import { auth } from './firebase';
132
+
133
+ async function handleSignOut() {
134
+ await signOut(auth);
135
+ // Redirect to login page
136
+ }
137
+ ```
138
+
139
+ ### Password Reset
140
+
141
+ ```typescript
142
+ import { sendPasswordResetEmail, confirmPasswordReset } from 'firebase/auth';
143
+ import { auth } from './firebase';
144
+
145
+ // Send reset email
146
+ async function resetPassword(email: string) {
147
+ await sendPasswordResetEmail(auth, email);
148
+ }
149
+
150
+ // Confirm reset (from email link)
151
+ async function confirmReset(oobCode: string, newPassword: string) {
152
+ await confirmPasswordReset(auth, oobCode, newPassword);
153
+ }
154
+ ```
155
+
156
+ ---
157
+
158
+ ## OAuth Providers (Google, GitHub, etc.)
159
+
160
+ ### Google Sign-In
161
+
162
+ ```typescript
163
+ import { signInWithPopup, signInWithRedirect, GoogleAuthProvider } from 'firebase/auth';
164
+ import { auth } from './firebase';
165
+
166
+ const googleProvider = new GoogleAuthProvider();
167
+ googleProvider.addScope('email');
168
+ googleProvider.addScope('profile');
169
+
170
+ // Popup method (recommended for desktop)
171
+ async function signInWithGoogle() {
172
+ try {
173
+ const result = await signInWithPopup(auth, googleProvider);
174
+ const credential = GoogleAuthProvider.credentialFromResult(result);
175
+ const token = credential?.accessToken;
176
+ return result.user;
177
+ } catch (error: any) {
178
+ if (error.code === 'auth/popup-closed-by-user') {
179
+ // User closed popup - not an error
180
+ return null;
181
+ }
182
+ if (error.code === 'auth/popup-blocked') {
183
+ // Fallback to redirect
184
+ await signInWithRedirect(auth, googleProvider);
185
+ return null;
186
+ }
187
+ throw error;
188
+ }
189
+ }
190
+
191
+ // Redirect method (for mobile or popup-blocked)
192
+ async function signInWithGoogleRedirect() {
193
+ await signInWithRedirect(auth, googleProvider);
194
+ }
195
+ ```
196
+
197
+ ### Handle Redirect Result
198
+
199
+ ```typescript
200
+ import { getRedirectResult, GoogleAuthProvider } from 'firebase/auth';
201
+ import { auth } from './firebase';
202
+
203
+ // Call on page load
204
+ async function handleRedirectResult() {
205
+ try {
206
+ const result = await getRedirectResult(auth);
207
+ if (result) {
208
+ const credential = GoogleAuthProvider.credentialFromResult(result);
209
+ return result.user;
210
+ }
211
+ } catch (error) {
212
+ console.error('Redirect sign-in error:', error);
213
+ }
214
+ return null;
215
+ }
216
+ ```
217
+
218
+ ### Other OAuth Providers
219
+
220
+ ```typescript
221
+ import {
222
+ GithubAuthProvider,
223
+ TwitterAuthProvider,
224
+ FacebookAuthProvider,
225
+ OAuthProvider,
226
+ } from 'firebase/auth';
227
+
228
+ // GitHub
229
+ const githubProvider = new GithubAuthProvider();
230
+ githubProvider.addScope('read:user');
231
+
232
+ // Microsoft
233
+ const microsoftProvider = new OAuthProvider('microsoft.com');
234
+ microsoftProvider.addScope('email');
235
+ microsoftProvider.addScope('profile');
236
+
237
+ // Apple
238
+ const appleProvider = new OAuthProvider('apple.com');
239
+ appleProvider.addScope('email');
240
+ appleProvider.addScope('name');
241
+ ```
242
+
243
+ ---
244
+
245
+ ## Auth State Management
246
+
247
+ ### Listen to Auth State Changes
248
+
249
+ ```typescript
250
+ import { onAuthStateChanged, User } from 'firebase/auth';
251
+ import { auth } from './firebase';
252
+
253
+ // React hook example
254
+ function useAuth() {
255
+ const [user, setUser] = useState<User | null>(null);
256
+ const [loading, setLoading] = useState(true);
257
+
258
+ useEffect(() => {
259
+ const unsubscribe = onAuthStateChanged(auth, (user) => {
260
+ setUser(user);
261
+ setLoading(false);
262
+ });
263
+
264
+ return () => unsubscribe();
265
+ }, []);
266
+
267
+ return { user, loading };
268
+ }
269
+ ```
270
+
271
+ ### Auth Context Provider (React)
272
+
273
+ ```typescript
274
+ // src/contexts/AuthContext.tsx
275
+ import { createContext, useContext, useEffect, useState, ReactNode } from 'react';
276
+ import { onAuthStateChanged, User } from 'firebase/auth';
277
+ import { auth } from '@/lib/firebase';
278
+
279
+ interface AuthContextType {
280
+ user: User | null;
281
+ loading: boolean;
282
+ }
283
+
284
+ const AuthContext = createContext<AuthContextType>({ user: null, loading: true });
285
+
286
+ export function AuthProvider({ children }: { children: ReactNode }) {
287
+ const [user, setUser] = useState<User | null>(null);
288
+ const [loading, setLoading] = useState(true);
289
+
290
+ useEffect(() => {
291
+ const unsubscribe = onAuthStateChanged(auth, (user) => {
292
+ setUser(user);
293
+ setLoading(false);
294
+ });
295
+
296
+ return () => unsubscribe();
297
+ }, []);
298
+
299
+ return (
300
+ <AuthContext.Provider value={{ user, loading }}>
301
+ {children}
302
+ </AuthContext.Provider>
303
+ );
304
+ }
305
+
306
+ export const useAuth = () => useContext(AuthContext);
307
+ ```
308
+
309
+ ---
310
+
311
+ ## Token Management
312
+
313
+ ### Get ID Token (for API calls)
314
+
315
+ ```typescript
316
+ import { auth } from './firebase';
317
+
318
+ async function getIdToken() {
319
+ const user = auth.currentUser;
320
+ if (!user) throw new Error('Not authenticated');
321
+
322
+ // Force refresh to get fresh token
323
+ const token = await user.getIdToken(/* forceRefresh */ true);
324
+ return token;
325
+ }
326
+
327
+ // Use in API calls
328
+ async function callProtectedAPI() {
329
+ const token = await getIdToken();
330
+
331
+ const response = await fetch('/api/protected', {
332
+ headers: {
333
+ Authorization: `Bearer ${token}`,
334
+ },
335
+ });
336
+
337
+ return response.json();
338
+ }
339
+ ```
340
+
341
+ ### Verify ID Token (Server-side)
342
+
343
+ ```typescript
344
+ // API route (Next.js example)
345
+ import { adminAuth } from '@/lib/firebase-admin';
346
+
347
+ export async function GET(request: Request) {
348
+ const authHeader = request.headers.get('authorization');
349
+ if (!authHeader?.startsWith('Bearer ')) {
350
+ return Response.json({ error: 'Unauthorized' }, { status: 401 });
351
+ }
352
+
353
+ const token = authHeader.split('Bearer ')[1];
354
+
355
+ try {
356
+ const decodedToken = await adminAuth.verifyIdToken(token);
357
+ const uid = decodedToken.uid;
358
+
359
+ // User is authenticated, proceed with request
360
+ return Response.json({ uid, message: 'Authenticated' });
361
+ } catch (error) {
362
+ return Response.json({ error: 'Invalid token' }, { status: 401 });
363
+ }
364
+ }
365
+ ```
366
+
367
+ ### Session Cookies (Server-Side Rendering)
368
+
369
+ ```typescript
370
+ import { adminAuth } from '@/lib/firebase-admin';
371
+
372
+ // Create session cookie
373
+ async function createSessionCookie(idToken: string) {
374
+ const expiresIn = 60 * 60 * 24 * 5 * 1000; // 5 days
375
+
376
+ const sessionCookie = await adminAuth.createSessionCookie(idToken, {
377
+ expiresIn,
378
+ });
379
+
380
+ return sessionCookie;
381
+ }
382
+
383
+ // Verify session cookie
384
+ async function verifySessionCookie(sessionCookie: string) {
385
+ try {
386
+ const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true);
387
+ return decodedClaims;
388
+ } catch (error) {
389
+ return null;
390
+ }
391
+ }
392
+
393
+ // Revoke session
394
+ async function revokeSession(uid: string) {
395
+ await adminAuth.revokeRefreshTokens(uid);
396
+ }
397
+ ```
398
+
399
+ ---
400
+
401
+ ## Custom Claims & Roles
402
+
403
+ ### Set Custom Claims (Admin SDK)
404
+
405
+ ```typescript
406
+ import { adminAuth } from '@/lib/firebase-admin';
407
+
408
+ // Set admin role
409
+ async function setAdminRole(uid: string) {
410
+ await adminAuth.setCustomUserClaims(uid, {
411
+ admin: true,
412
+ role: 'admin',
413
+ });
414
+ }
415
+
416
+ // Set custom permissions
417
+ async function setUserPermissions(uid: string, permissions: string[]) {
418
+ await adminAuth.setCustomUserClaims(uid, {
419
+ permissions,
420
+ });
421
+ }
422
+ ```
423
+
424
+ ### Check Custom Claims (Client)
425
+
426
+ ```typescript
427
+ import { auth } from './firebase';
428
+
429
+ async function checkAdminStatus() {
430
+ const user = auth.currentUser;
431
+ if (!user) return false;
432
+
433
+ // Force token refresh to get latest claims
434
+ const tokenResult = await user.getIdTokenResult(true);
435
+ return tokenResult.claims.admin === true;
436
+ }
437
+
438
+ // In component
439
+ const isAdmin = await checkAdminStatus();
440
+ ```
441
+
442
+ **CRITICAL:** Custom claims are cached in the ID token. After setting claims, the user must:
443
+ 1. Sign out and sign in again, OR
444
+ 2. Force refresh the token with `getIdTokenResult(true)`
445
+
446
+ ---
447
+
448
+ ## Phone Authentication
449
+
450
+ ```typescript
451
+ import {
452
+ signInWithPhoneNumber,
453
+ RecaptchaVerifier,
454
+ ConfirmationResult,
455
+ } from 'firebase/auth';
456
+ import { auth } from './firebase';
457
+
458
+ let confirmationResult: ConfirmationResult;
459
+
460
+ // Step 1: Setup reCAPTCHA (required)
461
+ function setupRecaptcha() {
462
+ window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {
463
+ size: 'normal',
464
+ callback: () => {
465
+ // reCAPTCHA solved
466
+ },
467
+ });
468
+ }
469
+
470
+ // Step 2: Send verification code
471
+ async function sendVerificationCode(phoneNumber: string) {
472
+ const appVerifier = window.recaptchaVerifier;
473
+ confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, appVerifier);
474
+ }
475
+
476
+ // Step 3: Verify code
477
+ async function verifyCode(code: string) {
478
+ const result = await confirmationResult.confirm(code);
479
+ return result.user;
480
+ }
481
+ ```
482
+
483
+ ---
484
+
485
+ ## Multi-Factor Authentication (MFA)
486
+
487
+ ```typescript
488
+ import {
489
+ multiFactor,
490
+ PhoneAuthProvider,
491
+ PhoneMultiFactorGenerator,
492
+ getMultiFactorResolver,
493
+ } from 'firebase/auth';
494
+ import { auth } from './firebase';
495
+
496
+ // Enroll phone as second factor
497
+ async function enrollPhoneMFA(phoneNumber: string) {
498
+ const user = auth.currentUser;
499
+ if (!user) throw new Error('Not authenticated');
500
+
501
+ const multiFactorSession = await multiFactor(user).getSession();
502
+
503
+ const phoneAuthProvider = new PhoneAuthProvider(auth);
504
+ const verificationId = await phoneAuthProvider.verifyPhoneNumber(
505
+ { phoneNumber, session: multiFactorSession },
506
+ window.recaptchaVerifier
507
+ );
508
+
509
+ // Return verificationId to complete enrollment after user enters code
510
+ return verificationId;
511
+ }
512
+
513
+ // Complete enrollment
514
+ async function completeEnrollment(verificationId: string, verificationCode: string) {
515
+ const user = auth.currentUser;
516
+ if (!user) throw new Error('Not authenticated');
517
+
518
+ const credential = PhoneAuthProvider.credential(verificationId, verificationCode);
519
+ const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(credential);
520
+
521
+ await multiFactor(user).enroll(multiFactorAssertion, 'Phone Number');
522
+ }
523
+
524
+ // Handle MFA during sign-in
525
+ async function handleMFASignIn(error: any) {
526
+ if (error.code !== 'auth/multi-factor-auth-required') {
527
+ throw error;
528
+ }
529
+
530
+ const resolver = getMultiFactorResolver(auth, error);
531
+ // Show UI to select MFA method and enter code
532
+ return resolver;
533
+ }
534
+ ```
535
+
536
+ ---
537
+
538
+ ## Protected Routes (Next.js)
539
+
540
+ ### Middleware Protection
541
+
542
+ ```typescript
543
+ // middleware.ts
544
+ import { NextResponse } from 'next/server';
545
+ import type { NextRequest } from 'next/server';
546
+
547
+ export function middleware(request: NextRequest) {
548
+ const sessionCookie = request.cookies.get('session')?.value;
549
+
550
+ // Protect /dashboard routes
551
+ if (request.nextUrl.pathname.startsWith('/dashboard')) {
552
+ if (!sessionCookie) {
553
+ return NextResponse.redirect(new URL('/login', request.url));
554
+ }
555
+ }
556
+
557
+ // Redirect authenticated users away from /login
558
+ if (request.nextUrl.pathname === '/login') {
559
+ if (sessionCookie) {
560
+ return NextResponse.redirect(new URL('/dashboard', request.url));
561
+ }
562
+ }
563
+
564
+ return NextResponse.next();
565
+ }
566
+
567
+ export const config = {
568
+ matcher: ['/dashboard/:path*', '/login'],
569
+ };
570
+ ```
571
+
572
+ ### Client-Side Route Guard
573
+
574
+ ```typescript
575
+ // components/ProtectedRoute.tsx
576
+ import { useAuth } from '@/contexts/AuthContext';
577
+ import { useRouter } from 'next/navigation';
578
+ import { useEffect } from 'react';
579
+
580
+ export function ProtectedRoute({ children }: { children: React.ReactNode }) {
581
+ const { user, loading } = useAuth();
582
+ const router = useRouter();
583
+
584
+ useEffect(() => {
585
+ if (!loading && !user) {
586
+ router.push('/login');
587
+ }
588
+ }, [user, loading, router]);
589
+
590
+ if (loading) {
591
+ return <div>Loading...</div>;
592
+ }
593
+
594
+ if (!user) {
595
+ return null;
596
+ }
597
+
598
+ return <>{children}</>;
599
+ }
600
+ ```
601
+
602
+ ---
603
+
604
+ ## Error Handling
605
+
606
+ ### Common Auth Errors
607
+
608
+ | Error Code | Description | User-Friendly Message |
609
+ |------------|-------------|----------------------|
610
+ | `auth/invalid-credential` | Wrong email/password | Invalid email or password |
611
+ | `auth/user-not-found` | Email not registered | Invalid email or password |
612
+ | `auth/wrong-password` | Incorrect password | Invalid email or password |
613
+ | `auth/email-already-in-use` | Email registered | This email is already registered |
614
+ | `auth/weak-password` | Password < 6 chars | Password must be at least 6 characters |
615
+ | `auth/invalid-email` | Malformed email | Please enter a valid email |
616
+ | `auth/user-disabled` | Account disabled | Your account has been disabled |
617
+ | `auth/too-many-requests` | Rate limited | Too many attempts. Try again later |
618
+ | `auth/popup-closed-by-user` | User closed popup | Sign-in cancelled |
619
+ | `auth/popup-blocked` | Browser blocked popup | Please allow popups |
620
+ | `auth/requires-recent-login` | Sensitive operation | Please sign in again |
621
+ | `auth/network-request-failed` | Network error | Please check your connection |
622
+
623
+ ### Error Handler Utility
624
+
625
+ ```typescript
626
+ export function getAuthErrorMessage(error: any): string {
627
+ const errorMessages: Record<string, string> = {
628
+ 'auth/invalid-credential': 'Invalid email or password',
629
+ 'auth/user-not-found': 'Invalid email or password',
630
+ 'auth/wrong-password': 'Invalid email or password',
631
+ 'auth/email-already-in-use': 'This email is already registered',
632
+ 'auth/weak-password': 'Password must be at least 6 characters',
633
+ 'auth/invalid-email': 'Please enter a valid email address',
634
+ 'auth/user-disabled': 'Your account has been disabled',
635
+ 'auth/too-many-requests': 'Too many attempts. Please try again later',
636
+ 'auth/popup-closed-by-user': 'Sign-in was cancelled',
637
+ 'auth/network-request-failed': 'Network error. Please check your connection',
638
+ };
639
+
640
+ return errorMessages[error.code] || 'An unexpected error occurred';
641
+ }
642
+ ```
643
+
644
+ ---
645
+
646
+ ## Known Issues Prevention
647
+
648
+ This skill prevents **12** documented Firebase Auth errors:
649
+
650
+ | Issue # | Error/Issue | Description | How to Avoid | Source |
651
+ |---------|-------------|-------------|--------------|--------|
652
+ | **#1** | `auth/invalid-credential` | Generic error for wrong email/password | Show generic "invalid email or password" message | Common |
653
+ | **#2** | `auth/popup-blocked` | Browser blocks OAuth popup | Implement redirect fallback | [Docs](https://firebase.google.com/docs/auth/web/google-signin#redirect-mode) |
654
+ | **#3** | `auth/requires-recent-login` | Sensitive operations need fresh login | Re-authenticate before password change, delete | [Docs](https://firebase.google.com/docs/auth/web/manage-users#re-authenticate_a_user) |
655
+ | **#4** | Custom claims not updating | Claims cached in ID token | Force token refresh after setting claims | [Docs](https://firebase.google.com/docs/auth/admin/custom-claims) |
656
+ | **#5** | Token expiration | ID tokens expire after 1 hour | Always call `getIdToken()` before API calls | Common |
657
+ | **#6** | Memory leak from auth listener | Not unsubscribing from `onAuthStateChanged` | Return cleanup function in useEffect | Common |
658
+ | **#7** | CORS errors on localhost | Auth domain mismatch | Add localhost to authorized domains in console | Common |
659
+ | **#8** | Private key newline issue | Escaped `\n` in env var | Use `.replace(/\\n/g, '\n')` | Common |
660
+ | **#9** | Session cookie not persisting | Cookie settings wrong | Set `secure: true`, `sameSite: 'lax'` in production | Common |
661
+ | **#10** | OAuth state mismatch | User navigates away during OAuth | Handle `auth/popup-closed-by-user` gracefully | Common |
662
+ | **#11** | Rate limiting | Too many auth attempts | Implement exponential backoff | [Docs](https://firebase.google.com/docs/auth/limits) |
663
+ | **#12** | Email enumeration | Different errors for existing/non-existing emails | Use same message for both | Security best practice |
664
+
665
+ ---
666
+
667
+ ## Security Best Practices
668
+
669
+ ### Always Do
670
+
671
+ 1. **Use HTTPS in production** - Required for secure cookies
672
+ 2. **Validate tokens server-side** - Never trust client claims alone
673
+ 3. **Handle token expiration** - Refresh before API calls
674
+ 4. **Implement rate limiting** - Prevent brute force attacks
675
+ 5. **Use same error message** for wrong email/password - Prevent enumeration
676
+ 6. **Enable email verification** - Verify user owns email
677
+ 7. **Use session cookies for SSR** - More secure than ID tokens in cookies
678
+ 8. **Revoke tokens on password change** - Invalidate old sessions
679
+
680
+ ### Never Do
681
+
682
+ 1. **Never expose private key** in client code
683
+ 2. **Never trust client-provided claims** - Always verify server-side
684
+ 3. **Never store ID tokens in localStorage** - Use httpOnly cookies
685
+ 4. **Never disable email enumeration protection** in production
686
+ 5. **Never skip CORS configuration** for your domains
687
+
688
+ ---
689
+
690
+ ## Firebase CLI Commands
691
+
692
+ ```bash
693
+ # Initialize Firebase project
694
+ firebase init
695
+
696
+ # Enable auth emulator
697
+ firebase emulators:start --only auth
698
+
699
+ # Export auth users
700
+ firebase auth:export users.json --format=json
701
+
702
+ # Import auth users
703
+ firebase auth:import users.json
704
+ ```
705
+
706
+ ---
707
+
708
+ ## Package Versions (Verified 2026-01-25)
709
+
710
+ ```json
711
+ {
712
+ "dependencies": {
713
+ "firebase": "^12.8.0"
714
+ },
715
+ "devDependencies": {
716
+ "firebase-admin": "^13.6.0"
717
+ }
718
+ }
719
+ ```
720
+
721
+ ---
722
+
723
+ ## Official Documentation
724
+
725
+ - **Firebase Auth Overview**: https://firebase.google.com/docs/auth
726
+ - **Web Get Started**: https://firebase.google.com/docs/auth/web/start
727
+ - **Admin Auth**: https://firebase.google.com/docs/auth/admin
728
+ - **Custom Claims**: https://firebase.google.com/docs/auth/admin/custom-claims
729
+ - **Session Cookies**: https://firebase.google.com/docs/auth/admin/manage-cookies
730
+ - **Security Rules**: https://firebase.google.com/docs/rules
731
+
732
+ ---
733
+
734
+ **Last verified**: 2026-01-25 | **Skill version**: 1.0.0