vybekiit 0.7.26 → 0.7.27

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 (232) hide show
  1. package/dist/bin.js +3891 -1301
  2. package/dist/global-skills/aws-cdk/SKILL.md +19 -5
  3. package/dist/global-skills/aws-cdk/references/fast-deployments.md +191 -0
  4. package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +16 -0
  5. package/dist/global-skills/aws-cloudformation/SKILL.md +16 -26
  6. package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +7 -3
  7. package/dist/global-skills/aws-cloudformation/references/cloudformation-language-server.md +177 -0
  8. package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +8 -2
  9. package/dist/global-skills/aws-cloudformation/references/persist-template-context.script.md +5 -8
  10. package/dist/global-skills/aws-cloudformation/references/retrieve-template-context.script.md +1 -1
  11. package/dist/global-skills/aws-cloudformation/references/security-considerations.md +51 -0
  12. package/dist/global-skills/aws-cloudformation/references/troubleshoot-failed-stack.script.md +138 -0
  13. package/dist/global-skills/aws-cloudformation/references/{validate-cloudformation-template.script.md → validate-with-cfn-lint.script.md} +15 -27
  14. package/dist/global-skills/aws-cloudformation/references/validate-with-cloudformation-validate.script.md +181 -0
  15. package/dist/global-skills/aws-cloudformation/references/validation-tool-selection.md +44 -0
  16. package/dist/global-skills/aws-serverless/SKILL.md +9 -1
  17. package/dist/global-skills/aws-serverless/references/architecture.md +3 -1
  18. package/dist/global-skills/aws-serverless/references/lambda.md +3 -1
  19. package/dist/global-skills/aws-serverless/references/orchestration.md +1 -0
  20. package/dist/global-skills/better-auth-best-practices/SKILL.md +18 -8
  21. package/dist/global-skills/eas-app-stores/SKILL.md +31 -15
  22. package/dist/global-skills/eas-app-stores/agents/openai.yaml +2 -2
  23. package/dist/global-skills/eas-app-stores/references/ios-app-store.md +37 -32
  24. package/dist/global-skills/eas-app-stores/references/native-ios.md +167 -0
  25. package/dist/global-skills/eas-app-stores/references/play-store.md +3 -7
  26. package/dist/global-skills/eas-app-stores/references/testflight.md +39 -35
  27. package/dist/global-skills/eas-simulator/SKILL.md +48 -26
  28. package/dist/global-skills/eas-simulator/references/controllers.md +32 -3
  29. package/dist/global-skills/eas-simulator/references/run-your-app.md +34 -4
  30. package/dist/global-skills/eas-simulator/references/troubleshooting.md +8 -4
  31. package/dist/global-skills/eas-update/SKILL.md +146 -0
  32. package/dist/global-skills/eas-update/agents/openai.yaml +4 -0
  33. package/dist/global-skills/expo-animation/RECIPES.md +2 -2
  34. package/dist/global-skills/expo-animation/SKILL.md +9 -2
  35. package/dist/global-skills/expo-brownfield/SKILL.md +18 -11
  36. package/dist/global-skills/expo-brownfield/agents/openai.yaml +2 -2
  37. package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +94 -69
  38. package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +40 -42
  39. package/dist/global-skills/expo-brownfield/references/comparison.md +5 -5
  40. package/dist/global-skills/expo-brownfield/references/feature-integration.md +163 -0
  41. package/dist/global-skills/expo-brownfield/references/troubleshooting.md +17 -17
  42. package/dist/global-skills/expo-brownfield/references/version-compatibility.md +40 -0
  43. package/dist/global-skills/expo-data-fetching/SKILL.md +27 -6
  44. package/dist/global-skills/expo-design-system/SKILL.md +27 -7
  45. package/dist/global-skills/expo-design-system/references/audit.md +7 -2
  46. package/dist/global-skills/expo-design-system/references/native-slop.md +74 -0
  47. package/dist/global-skills/expo-examples/SKILL.md +0 -1
  48. package/dist/global-skills/expo-examples/references/catalog.md +1 -1
  49. package/dist/global-skills/expo-migrate-module/SKILL.md +21 -10
  50. package/dist/global-skills/expo-migrate-module/references/compatibility.md +80 -23
  51. package/dist/global-skills/expo-migrate-module/references/migration-map.md +162 -11
  52. package/dist/global-skills/expo-native-ui/SKILL.md +25 -16
  53. package/dist/global-skills/expo-native-ui/agents/openai.yaml +2 -2
  54. package/dist/global-skills/expo-native-ui/references/controls.md +5 -46
  55. package/dist/global-skills/expo-native-ui/references/icons.md +21 -2
  56. package/dist/global-skills/expo-native-ui/references/media.md +15 -20
  57. package/dist/global-skills/expo-native-ui/references/visual-effects.md +12 -11
  58. package/dist/global-skills/expo-overview/SKILL.md +17 -12
  59. package/dist/global-skills/expo-router/SKILL.md +5 -3
  60. package/dist/global-skills/expo-router/references/tabs.md +5 -5
  61. package/dist/global-skills/expo-upgrade/SKILL.md +3 -1
  62. package/dist/global-skills/expo-web-to-native/references/false-friends.md +2 -2
  63. package/dist/global-skills/expo-web-to-native/references/native-patterns.md +1 -1
  64. package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +13 -16
  65. package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +4 -5
  66. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +4 -4
  67. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +3 -3
  68. package/dist/global-skills/firebase-auth-basics/SKILL.md +11 -6
  69. package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +4 -5
  70. package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +3 -3
  71. package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +24 -25
  72. package/dist/global-skills/firebase-auth-basics/references/security_rules.md +4 -2
  73. package/dist/global-skills/firebase-crashlytics/references/android_setup.md +7 -4
  74. package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +2 -3
  75. package/dist/global-skills/firebase-data-connect/SKILL.md +2 -1
  76. package/dist/global-skills/firebase-data-connect/examples.md +4 -4
  77. package/dist/global-skills/firebase-data-connect/reference/config.md +5 -4
  78. package/dist/global-skills/firebase-data-connect/reference/realtime.md +1 -2
  79. package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +2 -2
  80. package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +2 -2
  81. package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +17 -6
  82. package/dist/global-skills/firebase-data-connect/reference/security.md +5 -5
  83. package/dist/global-skills/firebase-data-connect/templates.md +2 -1
  84. package/dist/global-skills/firebase-firestore/SKILL.md +20 -8
  85. package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +5 -4
  86. package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +12 -3
  87. package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +16 -18
  88. package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +1 -1
  89. package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +5 -1
  90. package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +7 -7
  91. package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +5 -5
  92. package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +4 -4
  93. package/dist/global-skills/firebase-firestore/references/standard/indexes.md +16 -18
  94. package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +1 -1
  95. package/dist/global-skills/firebase-remote-config-basics/SKILL.md +0 -5
  96. package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +36 -8
  97. package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +1 -7
  98. package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +17 -6
  99. package/dist/global-skills/{firebase-firestore/references/standard/security_rules.md → firestore-rules-creation/SKILL.md} +24 -13
  100. package/dist/global-skills/grow-my-customers/SKILL.md +23 -0
  101. package/dist/global-skills/instrument-feature-flags/SKILL.md +25 -25
  102. package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +141 -285
  103. package/dist/global-skills/instrument-feature-flags/references/android.md +6 -15
  104. package/dist/global-skills/instrument-feature-flags/references/api.md +4 -11
  105. package/dist/global-skills/instrument-feature-flags/references/best-practices.md +1 -13
  106. package/dist/global-skills/instrument-feature-flags/references/django.md +14 -27
  107. package/dist/global-skills/instrument-feature-flags/references/dotnet.md +20 -79
  108. package/dist/global-skills/instrument-feature-flags/references/elixir.md +1 -9
  109. package/dist/global-skills/instrument-feature-flags/references/flask.md +13 -13
  110. package/dist/global-skills/instrument-feature-flags/references/flutter.md +3 -24
  111. package/dist/global-skills/instrument-feature-flags/references/go.md +3 -15
  112. package/dist/global-skills/instrument-feature-flags/references/ios.md +4 -17
  113. package/dist/global-skills/instrument-feature-flags/references/java.md +5 -13
  114. package/dist/global-skills/instrument-feature-flags/references/laravel.md +13 -17
  115. package/dist/global-skills/instrument-feature-flags/references/next-js.md +25 -32
  116. package/dist/global-skills/instrument-feature-flags/references/nodejs.md +8 -15
  117. package/dist/global-skills/instrument-feature-flags/references/php.md +1 -15
  118. package/dist/global-skills/instrument-feature-flags/references/python.md +2 -15
  119. package/dist/global-skills/instrument-feature-flags/references/react-native.md +13 -15
  120. package/dist/global-skills/instrument-feature-flags/references/react.md +17 -21
  121. package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +37 -83
  122. package/dist/global-skills/instrument-feature-flags/references/ruby.md +2 -15
  123. package/dist/global-skills/instrument-feature-flags/references/rust.md +13 -25
  124. package/dist/global-skills/instrument-feature-flags/references/usage.md +14 -63
  125. package/dist/global-skills/instrument-feature-flags/references/web.md +9 -14
  126. package/dist/global-skills/instrument-product-analytics/SKILL.md +29 -29
  127. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +3 -1
  128. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +3 -1
  129. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +3 -1
  130. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +3 -1
  131. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +3 -1
  132. package/dist/global-skills/instrument-product-analytics/references/android.md +72 -107
  133. package/dist/global-skills/instrument-product-analytics/references/angular.md +26 -28
  134. package/dist/global-skills/instrument-product-analytics/references/astro.md +13 -24
  135. package/dist/global-skills/instrument-product-analytics/references/configuration.md +45 -63
  136. package/dist/global-skills/instrument-product-analytics/references/django.md +14 -27
  137. package/dist/global-skills/instrument-product-analytics/references/dotnet.md +20 -79
  138. package/dist/global-skills/instrument-product-analytics/references/elixir.md +47 -49
  139. package/dist/global-skills/instrument-product-analytics/references/flask.md +13 -13
  140. package/dist/global-skills/instrument-product-analytics/references/flutter.md +60 -90
  141. package/dist/global-skills/instrument-product-analytics/references/go.md +17 -56
  142. package/dist/global-skills/instrument-product-analytics/references/identify-users.md +15 -15
  143. package/dist/global-skills/instrument-product-analytics/references/ios.md +11 -15
  144. package/dist/global-skills/instrument-product-analytics/references/laravel.md +13 -17
  145. package/dist/global-skills/instrument-product-analytics/references/next-js.md +25 -32
  146. package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +13 -27
  147. package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +14 -28
  148. package/dist/global-skills/instrument-product-analytics/references/php.md +33 -84
  149. package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +229 -9
  150. package/dist/global-skills/instrument-product-analytics/references/python.md +415 -106
  151. package/dist/global-skills/instrument-product-analytics/references/react-native.md +161 -155
  152. package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +12 -33
  153. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +15 -33
  154. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +12 -33
  155. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +26 -41
  156. package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +37 -83
  157. package/dist/global-skills/instrument-product-analytics/references/ruby.md +48 -108
  158. package/dist/global-skills/instrument-product-analytics/references/svelte.md +18 -24
  159. package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +17 -19
  160. package/dist/global-skills/instrument-product-analytics/references/usage.md +14 -63
  161. package/dist/global-skills/instrument-product-analytics/references/vue-js.md +29 -28
  162. package/dist/global-skills/manifest.json +8 -2
  163. package/dist/global-skills/mongodb-search-and-ai/SKILL.md +28 -37
  164. package/dist/global-skills/mongodb-search-and-ai/references/automated-embedding.md +438 -0
  165. package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +60 -4
  166. package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +46 -108
  167. package/dist/global-skills/neon/SKILL.md +207 -213
  168. package/dist/global-skills/neon/references/auth.md +12 -0
  169. package/dist/global-skills/neon/references/claimable-neon.md +10 -14
  170. package/dist/global-skills/neon/references/function-triggers.md +53 -0
  171. package/dist/global-skills/neon/references/logs-loki.md +61 -0
  172. package/dist/global-skills/neon/references/parse-env.md +32 -0
  173. package/dist/global-skills/neon/references/sdk.md +7 -0
  174. package/dist/global-skills/neon-ai-gateway/SKILL.md +14 -16
  175. package/dist/global-skills/neon-auth/SKILL.md +155 -0
  176. package/dist/global-skills/neon-auth/references/managed-auth.md +173 -0
  177. package/dist/global-skills/neon-auth/references/self-managed.md +25 -0
  178. package/dist/global-skills/neon-functions/SKILL.md +159 -84
  179. package/dist/global-skills/neon-functions/references/ai-sdk.md +4 -6
  180. package/dist/global-skills/neon-functions/references/function-triggers.md +249 -0
  181. package/dist/global-skills/neon-functions/references/mastra-studio.md +3 -3
  182. package/dist/global-skills/neon-functions/references/mcp.md +1 -1
  183. package/dist/global-skills/neon-functions/references/production-hardening.md +340 -0
  184. package/dist/global-skills/neon-functions/references/sse.md +8 -5
  185. package/dist/global-skills/neon-object-storage/SKILL.md +10 -11
  186. package/dist/global-skills/neon-postgres/SKILL.md +120 -17
  187. package/dist/global-skills/neon-postgres/references/full-text-search.md +99 -0
  188. package/dist/global-skills/neon-postgres/references/hybrid-search.md +90 -0
  189. package/dist/global-skills/neon-postgres/references/lakebase-search-drizzle.md +172 -0
  190. package/dist/global-skills/neon-postgres/references/vector-search.md +137 -0
  191. package/dist/global-skills/neon-postgres-branches/SKILL.md +3 -3
  192. package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +1 -1
  193. package/dist/global-skills/onboarding/SKILL.md +8 -6
  194. package/dist/global-skills/resend/SKILL.md +4 -2
  195. package/dist/global-skills/resend/references/broadcasts.md +6 -1
  196. package/dist/global-skills/resend/references/receiving.md +29 -10
  197. package/dist/global-skills/resend/references/sending/email-management.md +14 -4
  198. package/dist/global-skills/resend/references/topics.md +9 -6
  199. package/dist/global-skills/resend/references/usage.md +117 -0
  200. package/dist/global-skills/resend/references/webhooks.md +59 -2
  201. package/dist/global-skills/stripe-best-practices/SKILL.md +35 -29
  202. package/dist/global-skills/stripe-best-practices/references/billing.md +9 -2
  203. package/dist/global-skills/stripe-best-practices/references/payments.md +4 -2
  204. package/dist/global-skills/stripe-best-practices/references/security.md +3 -1
  205. package/dist/global-skills/stripe-best-practices/references/tax.md +39 -20
  206. package/dist/global-skills/supabase/SKILL.md +6 -0
  207. package/dist/global-skills/use-railway/SKILL.md +42 -22
  208. package/dist/global-skills/use-railway/references/analyze-db.md +7 -6
  209. package/dist/global-skills/use-railway/references/cloud-agents.md +70 -0
  210. package/dist/global-skills/use-railway/references/configure.md +17 -2
  211. package/dist/global-skills/use-railway/references/databases.md +107 -0
  212. package/dist/global-skills/use-railway/references/deploy.md +5 -5
  213. package/dist/global-skills/use-railway/references/feature-flags.md +25 -13
  214. package/dist/global-skills/use-railway/references/iac.md +66 -77
  215. package/dist/global-skills/use-railway/references/operate.md +26 -3
  216. package/dist/global-skills/use-railway/references/request.md +31 -23
  217. package/dist/global-skills/use-railway/references/setup.md +16 -5
  218. package/dist/global-skills/use-railway/references/tracing.md +261 -0
  219. package/dist/global-skills/use-railway/references/usage.md +52 -0
  220. package/dist/global-skills/validate-my-idea/SKILL.md +54 -0
  221. package/dist/global-skills/{feedback → vybekiit-feedback}/SKILL.md +16 -12
  222. package/dist/global-skills/watch-my-app/SKILL.md +53 -0
  223. package/dist/global-skills/workers-best-practices/SKILL.md +36 -103
  224. package/dist/global-skills/workers-best-practices/references/configuration.md +139 -0
  225. package/dist/global-skills/workers-best-practices/references/platform-apis.md +51 -0
  226. package/dist/global-skills/workers-best-practices/references/{rules.md → runtime-patterns.md} +13 -137
  227. package/dist/global-skills/wrangler/SKILL.md +48 -901
  228. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +19 -15
  229. package/package.json +9 -8
  230. package/dist/global-skills/expo-native-ui/references/animations.md +0 -220
  231. package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +0 -577
  232. package/dist/global-skills/workers-best-practices/references/review.md +0 -174
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: expo-overview
3
3
  description: "Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules."
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  license: MIT
6
6
  ---
7
7
 
@@ -12,9 +12,9 @@ license: MIT
12
12
  **Do not guess the skill from project files alone.** Many Expo goals look similar from
13
13
  the filesystem but need different skills.
14
14
 
15
- 1. **Confirm this is Expo work** — the request mentions Expo, or `package.json` has an
16
- `expo` dependency. If neither holds, stop: this skill does not apply. A bare React
17
- Native project with no `expo` dependency is not Expo work.
15
+ 1. **Confirm this is Expo or EAS work** — the request mentions Expo or EAS, or
16
+ `package.json` has an `expo` dependency. Otherwise this skill does not apply.
17
+ A native app using EAS for delivery qualifies without an Expo runtime.
18
18
  2. **Read the user's goal** — what outcome do they want, in plain terms?
19
19
  3. **Classify it** using the Skill Map below, translating casual phrasing to a goal.
20
20
  4. **Confirm intent** if ambiguous ("Sounds like you want to ship to the stores — that's
@@ -27,7 +27,7 @@ Match the goal to a category, then the skill, then load that leaf's `SKILL.md`.
27
27
 
28
28
  **Build the app**
29
29
  - `expo-project-structure` — folder layout for a **new** Expo Router project: where screens, components, and config live (never restructure an existing app to match)
30
- - `expo-native-ui` — screens, styling, semantic colors, native controls, SF Symbols, media, animations, layout
30
+ - `expo-native-ui` — screens, styling, semantic colors, native controls, SF Symbols, media, layout
31
31
  - `expo-router` — navigation: file-based routes, tabs / stacks / modals / sheets, links, headers
32
32
  - `expo-animation` — motion and gestures: Reanimated worklets, Gesture Handler, screen transitions, sheet and press feedback, haptics, and fixing animation that stutters on device
33
33
  - `expo-ui` — native UI components via `@expo/ui`: BottomSheet, Picker, Slider, Switch, Menu, Button, FieldGroup (grouped form sections), List / ListItem, and more — real SwiftUI on iOS, Jetpack Compose on Android. The universal layer needs SDK 56+ and runs in Expo Go; the drop-in replacements (`@gorhom/bottom-sheet`, `datetimepicker`, …) and platform-specific layers also exist on SDK 55.
@@ -40,17 +40,18 @@ Match the goal to a category, then the skill, then load that leaf's `SKILL.md`.
40
40
  > **Component selection rule:** whenever you need a UI component (list rows, bottom sheets, pickers, sliders, menus, buttons, segmented controls, toggles), **consult `expo-ui` first** to check whether `@expo/ui` has a native equivalent before reaching for a React Native built-in or a community library. Native `@expo/ui` components give the best platform fit, and on SDK 56+ the universal ones run in Expo Go with no custom build. Load `expo-ui` alongside `expo-native-ui` for any app that renders lists, detail sheets, or form controls. One exception: `@expo/ui` `List` renders native grouped rows (an iOS Settings screen), **not** a virtualized list — use `FlatList` / `FlashList` for large datasets.
41
41
 
42
42
  **Ship & operate**
43
- - `eas-app-stores` — build and submit to the App Store / Play Store / TestFlight, versions, and store metadata
43
+ - `eas-app-stores` — build and submit iOS/Android apps (Expo and other React Native projects, plus existing native apps), TestFlight, versions, and store metadata
44
44
  - `eas-hosting` — deploy the web bundle to EAS Hosting; also author Expo Router API routes (`+api.ts` handlers) and their environments / domains
45
45
  - `eas-workflows` — EAS Workflow YAML and CI/CD pipelines
46
46
  - `eas-simulator` — run and drive the app on a remote iOS / Android simulator on EAS cloud
47
47
  - `expo-dev-client` — custom development builds
48
+ - `eas-update` — configure, publish, test, and debug compatible over-the-air updates
48
49
  - `eas-update-insights` — OTA update health: crash rate, adoption, payload size
49
50
  - `eas-observe` — startup / launch / TTI performance with EAS Observe
50
51
 
51
52
  **Extend natively**
52
53
  - `expo-module` — native modules and views (Swift / Kotlin) with the Expo Modules API
53
- - `expo-brownfield` — embed Expo / React Native in an existing native app
54
+ - `expo-brownfield` — embed Expo / React Native screens in native SwiftUI/UIKit or Android apps; isolated artifacts and integrated builds
54
55
  - `expo-app-clip` — iOS App Clip target (AASA, smart app banner)
55
56
 
56
57
  **Maintain & learn**
@@ -62,17 +63,21 @@ Match the goal to a category, then the skill, then load that leaf's `SKILL.md`.
62
63
 
63
64
  Some everyday phrasings don't obviously map to a skill name — translate before routing:
64
65
 
65
- - "Make it look native" → grouped controls / settings forms = `expo-ui`; screens, styling, animations = `expo-native-ui`; navigation = `expo-router`.
66
+ - "Make it look native" → grouped controls / settings forms = `expo-ui`; screens, styling = `expo-native-ui`; motion = `expo-animation`; navigation = `expo-router`.
66
67
  - "Make the screens consistent" / "clean up the styling" / "set up a theme or design tokens" → `expo-design-system`.
67
- - "Ship it" / "get an .ipa or .apk" / "release to the stores" → `eas-app-stores` (build + submit, TestFlight, versions, store metadata).
68
+ - "It looks AI-generated" / "too generic, not native" → `expo-design-system` (named native-slop tells + audit), with `expo-native-ui` for the platform idioms.
69
+ - "Ship it" / "get an .ipa or .apk" / "release to the stores" / "put my Swift app on TestFlight" → `eas-app-stores` (build + submit, TestFlight, versions, store metadata).
68
70
  - "I'm new / where do I start" → scaffold first (see Shared setup rules), then route by goal.
69
71
 
70
72
  ## Shared setup rules
71
73
 
72
- These apply across every Expo skill, so handle them here once instead of repeating them
73
- in each leaf.
74
+ Apply the rules that match the project and the requested task.
74
75
 
75
- - **No Expo project yet?** Start one the standard way before routing to a feature skill:
76
+ - **Native app using EAS for delivery?** Route to `eas-app-stores`; its
77
+ `references/native-ios.md` covers SwiftUI/UIKit on iOS. Keep the existing native
78
+ project. Apply EAS auth/linking below; Expo scaffolding, SDK, and package-install
79
+ rules do not apply to this path.
80
+ - **Starting a new Expo app?** Start one the standard way before routing to a feature skill:
76
81
  `npx create-expo-app@latest`, laying out folders per `expo-project-structure`. Then
77
82
  classify the user's goal and route.
78
83
  - **Detect the SDK version** before giving version-specific advice: read the `expo`
@@ -7,7 +7,7 @@ license: MIT
7
7
 
8
8
  # Expo Router Navigation
9
9
 
10
- Navigation and routing for Expo Router apps. For screen styling, colors, controls, animations, media, and visual effects, use the `expo-native-ui` skill.
10
+ Navigation and routing for Expo Router apps. For screen styling, colors, controls, media, and visual effects, use the `expo-native-ui` skill; for motion and gestures, use `expo-animation`.
11
11
 
12
12
  ## References
13
13
 
@@ -217,18 +217,20 @@ export default function Layout({ segment }) {
217
217
  headerLargeTitleShadowVisible: false,
218
218
  headerLargeStyle: { backgroundColor: "transparent" },
219
219
  headerTitleStyle: { color: colors.label },
220
- headerLargeTitle: true,
220
+ headerLargeTitleEnabled: true,
221
221
  headerBlurEffect: "none",
222
222
  headerBackButtonDisplayMode: "minimal",
223
223
  }}
224
224
  >
225
225
  <Stack.Screen name={screen} options={{ title: titles[screen] }} />
226
- <Stack.Screen name="i/[id]" options={{ headerLargeTitle: false }} />
226
+ <Stack.Screen name="i/[id]" options={{ headerLargeTitleEnabled: false }} />
227
227
  </Stack>
228
228
  );
229
229
  }
230
230
  ```
231
231
 
232
+ `headerLargeTitleEnabled` is the SDK 56+ option name; older SDKs use `headerLargeTitle`, which is deprecated upstream.
233
+
232
234
  ## Submitting Feedback
233
235
  If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
234
236
  ```bash
@@ -302,7 +302,7 @@ export default function HomeStack() {
302
302
  <Stack>
303
303
  <Stack.Screen
304
304
  name="index"
305
- options={{ title: "Home", headerLargeTitle: true }}
305
+ options={{ title: "Home", headerLargeTitleEnabled: true }}
306
306
  />
307
307
  <Stack.Screen name="details" options={{ title: "Details" }} />
308
308
  </Stack>
@@ -403,14 +403,14 @@ import {
403
403
  ThemeProvider,
404
404
  DarkTheme,
405
405
  DefaultTheme,
406
- } from "@react-navigation/native";
406
+ } from "expo-router/react-navigation";
407
407
  import { useColorScheme } from "react-native";
408
408
  import { Stack } from "expo-router";
409
409
 
410
410
  export default function Layout() {
411
411
  const colorScheme = useColorScheme();
412
412
  return (
413
- <ThemeProvider theme={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
413
+ <ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
414
414
  <Stack />
415
415
  </ThemeProvider>
416
416
  );
@@ -420,12 +420,12 @@ export default function Layout() {
420
420
  If the app only uses a light or dark theme, you can directly pass `DarkTheme` or `DefaultTheme` to `ThemeProvider` without checking the color scheme.
421
421
 
422
422
  ```tsx
423
- import { ThemeProvider, DarkTheme } from "@react-navigation/native";
423
+ import { ThemeProvider, DarkTheme } from "expo-router/react-navigation";
424
424
  import { Stack } from "expo-router";
425
425
 
426
426
  export default function Layout() {
427
427
  return (
428
- <ThemeProvider theme={DarkTheme}>
428
+ <ThemeProvider value={DarkTheme}>
429
429
  <Stack />
430
430
  </ThemeProvider>
431
431
  );
@@ -81,7 +81,9 @@ These steps only apply when `ios/` and/or `android/` directories exist in the pr
81
81
  - If using Expo SDK 54 or later, ensure react-native-worklets is installed — this is required for react-native-reanimated to work.
82
82
  - Enable React Compiler in SDK 54+ by adding `"experiments": { "reactCompiler": true }` to app.json — it's stable and recommended
83
83
  - Delete sdkVersion from `app.json` to let Expo manage it automatically
84
- - Remove implicit packages from `package.json`: `@babel/core`, `babel-preset-expo`, `expo-constants`.
84
+ - Review formerly implicit packages such as `@babel/core`, `babel-preset-expo`, and `expo-constants` individually instead of removing them wholesale. Keep any package that an installed dependency declares as a required peer.
85
+ - Keep `expo-constants` as a direct dependency whenever `expo-router` is installed. Expo Router imports it and declares it as a required peer; relying on a transitive copy can break native autolinking outside Expo Go.
86
+ - After removing any dependency, immediately run `npx expo-doctor` and restore anything it reports as a missing required peer.
85
87
  - If the babel.config.js only contains 'babel-preset-expo', delete the file
86
88
  - If the metro.config.js only contains expo defaults, delete the file
87
89
 
@@ -11,7 +11,7 @@ This is the single source of truth for the mapping; the SKILL.md steps name a fe
11
11
  | `<div>`, `<section>`, `<span>` | `<View>` | `View` is the only generic container; no semantic element variants. |
12
12
  | `<p>`, `<h1>`, raw text in JSX | `<Text>` | **All** text must sit inside `<Text>`. Bare strings in a `View` throw. |
13
13
  | `<img src>` | `<Image>` / `expo-image` | `expo-image` adds caching, blurhash, transitions. Remote images need an explicit `width`/`height` or a flex parent. |
14
- | `<button>`, `<a>` | `<Pressable>` (or `TouchableOpacity`) | No default styling, no hover. Wrap label text in `<Text>`. |
14
+ | `<button>`, `<a>` | `<Pressable>` | No default styling, no hover. Wrap label text in `<Text>`. |
15
15
  | `<input>` | `<TextInput>` | Controlled via `value` + `onChangeText` (not `onChange`/`e.target.value`). |
16
16
  | `<ul>/<li>` rendered with `.map()` | `<FlatList>` / `<FlashList>` | `.map()` over a long list mounts every row at once → jank. Use a virtualized list with `data` + `renderItem`. |
17
17
 
@@ -29,7 +29,7 @@ This is the single source of truth for the mapping; the SKILL.md steps name a fe
29
29
 
30
30
  | Web | Native | Gotcha |
31
31
  |---|---|---|
32
- | `className` / CSS files | `StyleSheet.create` or NativeWind | Plain RN has no className. For Tailwind muscle memory use NativeWind (`expo-tailwind-setup`). |
32
+ | `className` / CSS files | `StyleSheet.create` or NativeWind | Plain RN has no className. For Tailwind muscle memory use NativeWind. |
33
33
  | CSS cascade & inheritance | none | Styles don't inherit (except a few `Text` props like `color`/`fontSize` to nested `Text`). Style each node. |
34
34
  | `display: flex` opt-in, default `row` | flex always on, default **`column`** | Biggest layout surprise: flex is the only layout model and the main axis is vertical by default. |
35
35
  | `px`, `rem`, `%` | unitless numbers (dp) | `padding: 16` = density-independent pixels. `%` works in some props; no `rem`/`em`/`vh`. |
@@ -31,7 +31,7 @@ Disclosed reference for [`expo-web-to-native`](../SKILL.md), step 4. `false-frie
31
31
  The table gets the right *components*; "native" also lives in *motion and touch* - and a web port arrives with almost none, so you must add it. The tooling is in `expo-router` (navigation/transitions) and `expo-native-ui` (motion/effects); reach for it, don't hand-roll:
32
32
 
33
33
  - **Transitions for free** - use Expo Router's native-stack so push/pop, modals, and sheets animate with real platform physics; shared-element zoom via `expo-router` `zoom-transitions.md`.
34
- - **Motion** - Reanimated (`withSpring`/`withTiming`; `entering`/`exiting` for list items) + `react-native-gesture-handler` for swipes/drags → `expo-native-ui` `animations.md`.
34
+ - **Motion** - Reanimated (`withSpring`/`withTiming`) + `react-native-gesture-handler` for swipes/drags → load the `expo-animation` skill (purpose gate, timing values, interruption).
35
35
  - **Touch** — `expo-haptics` on commits, selection changes, and pull-to-refresh — choreography, not just a toast buzz.
36
36
  - **Native rhythm** — large-title collapse on scroll, momentum / inverted scroll, a keyboard that pushes content (`KeyboardAvoidingView`).
37
37
  - **Respect reduced motion** — gate non-essential animation on Reanimated's `useReducedMotion()`.
@@ -42,7 +42,7 @@ Use the Gemini Developer API as a default, and only Agent Platform Gemini API
42
42
 
43
43
  The library is part of the standard Firebase Web SDK.
44
44
 
45
- `npm install -g firebase@latest`
45
+ `npm install firebase@latest`
46
46
 
47
47
  If you're in a firebase directory (with a firebase.json) the currently selected
48
48
  project will be marked with "current" using this command:
@@ -177,21 +177,18 @@ without deploying new client code. See
177
177
 
178
178
  ## Initialization Code References
179
179
 
180
- | Language, | Gemini API | Context URL |
181
- : Framework, : provider : :
182
- : Platform : : :
183
- | :---------- | :--------- | :---------------------------------------------- |
184
- | Web Modular | Gemini | firebase://docs/ai-logic/get-started |
185
- : API : Developer : :
186
- : : API : :
187
- : : (Developer : :
188
- : : API) : :
189
- | iOS (Swift) | Gemini | [ios_setup.md](references/ios_setup.md) |
190
- : : Developer : :
191
- : : API : :
192
- | Flutter | Gemini | [flutter_setup.md](references/flutter_setup.md) |
193
- : (Dart) : Developer : :
194
- : : API : :
180
+ - **Web Modular API**
181
+ - Provider: Gemini Developer API
182
+ - Reference: [usage_patterns_web.md](references/usage_patterns_web.md)
183
+ - **Android (Kotlin)**
184
+ - Provider: Gemini Developer API
185
+ - Reference: [usage_patterns_android.md](references/usage_patterns_android.md)
186
+ - **iOS (Swift)**
187
+ - Provider: Gemini Developer API
188
+ - Reference: [ios_setup.md](references/ios_setup.md)
189
+ - **Flutter (Dart)**
190
+ - Provider: Gemini Developer API
191
+ - Reference: [flutter_setup.md](references/flutter_setup.md)
195
192
 
196
193
  > [!WARNING] **CRITICAL: Use current model names:** Always check the
197
194
  > [Firebase AI Logic Models documentation](https://firebase.google.com/docs/ai-logic/models.md.txt)
@@ -88,8 +88,8 @@ content.
88
88
 
89
89
  ```swift
90
90
  let safetySettings = [
91
- SafetySetting(category: .harassment, threshold: .blockLowAndAbove),
92
- SafetySetting(category: .hateSpeech, threshold: .blockMediumAndAbove)
91
+ SafetySetting(harmCategory: .harassment, threshold: .blockLowAndAbove),
92
+ SafetySetting(harmCategory: .hateSpeech, threshold: .blockMediumAndAbove)
93
93
  ]
94
94
 
95
95
  let model = FirebaseAI.firebaseAI().generativeModel(
@@ -128,13 +128,12 @@ systems. *Note: Advanced workflows like function calling generally require a
128
128
  multi-turn Chat Session to handle the back-and-forth execution.*
129
129
 
130
130
  ```swift
131
- let getStockPriceTool = Tool(functionDeclarations: [
131
+ let getStockPriceTool = Tool.functionDeclarations([
132
132
  FunctionDeclaration(
133
133
  name: "getStockPrice",
134
134
  description: "Get the current stock price for a given symbol.",
135
135
  parameters: [
136
- "symbol": Schema(
137
- type: .string,
136
+ "symbol": .string(
138
137
  description: "The stock symbol, e.g. AAPL"
139
138
  )
140
139
  ]
@@ -39,8 +39,8 @@ content using a Gemini model:
39
39
 
40
40
  ```kotlin
41
41
  import com.google.firebase.ai.FirebaseAI
42
- import com.google.firebase.ai.ktx.ai
43
- import com.google.firebase.ktx.Firebase
42
+ import com.google.firebase.Firebase
43
+ import com.google.firebase.ai.ai
44
44
 
45
45
  class MainActivity : AppCompatActivity() {
46
46
 
@@ -112,10 +112,10 @@ val image1: Bitmap = ... // Load your bitmap
112
112
  val image2: Bitmap = ...
113
113
 
114
114
  val response = model.generateContent(
115
- content("Analyze these images for me") {
115
+ content {
116
116
  image(image1)
117
117
  image(image2)
118
- text("Compare these two items.")
118
+ text("Analyze these images for me. Compare these two items.")
119
119
  }
120
120
  )
121
121
  Log.d(TAG, response.text)
@@ -23,7 +23,7 @@ const app = initializeApp(firebaseConfig);
23
23
  const ai = getAI(app, { backend: new GoogleAIBackend() });
24
24
 
25
25
  const generationConfig = {
26
- candidate_count: 1,
26
+ candidateCount: 1,
27
27
  maxOutputTokens: 2048,
28
28
  stopSequences: [],
29
29
  temperature: 0.7, // Balanced: creative but focused
@@ -141,7 +141,7 @@ const model = getGenerativeModel(ai, {
141
141
  const prompt = 'Generate an image of the Eiffel Tower with fireworks in the background.';
142
142
 
143
143
  // To generate an image, call `generateContent` with the text input
144
- const result = model.generateContent(prompt);
144
+ const result = await model.generateContent(prompt);
145
145
 
146
146
  // Handle the generated image
147
147
  try {
@@ -166,7 +166,7 @@ const jsonModel = getGenerativeModel(ai, {
166
166
  generationConfig: {
167
167
  responseMimeType: "application/json",
168
168
  // Optional: Define a schema
169
- schema = Schema.object({ ... });
169
+ responseSchema: Schema.object({ ... })
170
170
  }
171
171
  });
172
172
 
@@ -66,13 +66,16 @@ Configure Firebase Authentication in `firebase.json` by adding an 'auth' block:
66
66
  ```
67
67
  {
68
68
  "auth": {
69
- "authorizedDomains": ["localhost"],
70
69
  "providers": {
71
70
  "anonymous": true,
72
71
  "emailPassword": true,
73
72
  "googleSignIn": {
74
73
  "oAuthBrandDisplayName": "Your Brand Name",
75
- "supportEmail": "support@example.com"
74
+ "supportEmail": "support@example.com",
75
+ "authorizedRedirectUris": [
76
+ "https://my-project-id.firebaseapp.com/__/auth/handler",
77
+ "http://localhost:4000"
78
+ ]
76
79
  }
77
80
  }
78
81
  }
@@ -82,10 +85,10 @@ Configure Firebase Authentication in `firebase.json` by adding an 'auth' block:
82
85
  > [!NOTE] If the Google Sign-In popup opens and immediately closes with the
83
86
  > error `[firebase_auth/unauthorized-domain]`, it means the domain is not
84
87
  > authorized. For local development, ensure `localhost` is included in the
85
- > **Authorized Domains** list in the Firebase Console or via the
86
- > `authorizedDomains` field in `firebase.json`. **CRITICAL**: Do NOT include the
87
- > protocol or port number in the Authorized Domains list (e.g., use `localhost`,
88
- > NOT `http://localhost:9090`).
88
+ > **Authorized Domains** list in the Firebase Console (Authentication >
89
+ > Settings > Authorized domains). **CRITICAL**: Do NOT include the protocol or
90
+ > port number in the Authorized Domains list (e.g., use `localhost`, NOT
91
+ > `http://localhost:9090`).
89
92
 
90
93
  **CRITICAL**: After configuring `firebase.json`, you MUST deploy the auth
91
94
  configuration to the Firebase backend for the changes to take effect. This is
@@ -113,6 +116,8 @@ Enable other providers in the Firebase Console.
113
116
  **Android (Kotlin)** See
114
117
  [references/client_sdk_android.md](references/client_sdk_android.md).
115
118
 
119
+ **iOS (Swift)** See [references/ios_setup.md](references/ios_setup.md).
120
+
116
121
  ### 3. Security Rules
117
122
 
118
123
  Secure your data using `request.auth` in Firestore/Storage rules.
@@ -37,9 +37,9 @@ ______________________________________________________________________
37
37
  In your Activity or Fragment, initialize the `FirebaseAuth` instance:
38
38
 
39
39
  ```kotlin
40
+ import com.google.firebase.Firebase
40
41
  import com.google.firebase.auth.FirebaseAuth
41
- import com.google.firebase.auth.ktx.auth
42
- import com.google.firebase.ktx.Firebase
42
+ import com.google.firebase.auth.auth
43
43
 
44
44
  class MainActivity : AppCompatActivity() {
45
45
 
@@ -47,8 +47,7 @@ class MainActivity : AppCompatActivity() {
47
47
 
48
48
  override fun onCreate(savedInstanceState: Bundle?) {
49
49
  super.onCreate(savedInstanceState)
50
- val auth = Firebase.auth
51
-
50
+ auth = Firebase.auth
52
51
  setContent {
53
52
  MaterialTheme {
54
53
  Text("Auth initialized!")
@@ -75,7 +74,7 @@ class MainActivity : ComponentActivity() {
75
74
  override fun onCreate(savedInstanceState: Bundle?) {
76
75
  super.onCreate(savedInstanceState)
77
76
  val auth = Firebase.auth
78
-
77
+
79
78
  setContent {
80
79
  MaterialTheme {
81
80
  Text("Auth initialized!")
@@ -76,9 +76,9 @@ signInWithPopup(auth, provider)
76
76
  > it means the domain hosting your app is not authorized for OAuth operations in
77
77
  > your Firebase project.
78
78
  >
79
- > - **Fix**: Add your domain (e.g., `localhost` for local testing) to the
80
- > Authorized Domains list in the Firebase Console (Authentication > Settings >
81
- > Authorized domains) or in your `firebase.json` auth config.
79
+ > - **Fix**: Add your domain (e.g., `localhost` for local testing) to the
80
+ > Authorized Domains list in the Firebase Console (Authentication >
81
+ > Settings > Authorized domains).
82
82
  > - **CRITICAL**: Do NOT include the protocol or port number when adding the
83
83
  > domain (e.g., use `localhost`, NOT `http://localhost:9090`).
84
84
 
@@ -24,16 +24,17 @@ platform-specific quirks.
24
24
  `<meta name="google-signin-client_id" ... />` tag in `web/index.html`, the
25
25
  Dart Web Debug Service (DWDS) and the app will throw an assertion error and
26
26
  **hang infinitely**, resulting in a blank screen.
27
- - **Common Workaround**: If you intend to use Firebase Auth's
28
- `signInWithPopup(GoogleAuthProvider())` for the web, you can conditionally
29
- skip the local `GoogleSignIn` package initialization entirely:
30
- ```dart
31
- import 'package:flutter/foundation.dart' show kIsWeb;
27
+ - **Common Workaround**: If you intend to use Firebase Auth's
28
+ `signInWithPopup(GoogleAuthProvider())` for the web, you can conditionally
29
+ skip the local `GoogleSignIn` package initialization entirely:
32
30
 
33
- if (!kIsWeb) {
31
+ ```dart
32
+ import 'package:flutter/foundation.dart' show kIsWeb;
33
+
34
+ if (!kIsWeb) {
34
35
  await GoogleSignIn.instance.initialize();
35
- }
36
- ```
36
+ }
37
+ ```
37
38
 
38
39
  ## 3. Web Logout Crashes
39
40
 
@@ -42,14 +43,15 @@ platform-specific quirks.
42
43
  `await GoogleSignIn.instance.signOut();` during the user's logout flow on the
43
44
  Web platform evaluates against an uninitialized context or unsupported
44
45
  environment, crashing the app.
45
- - **Solution**: Conditionally separate the logout logic for Web to rely entirely
46
- on `FirebaseAuth`:
47
- ```dart
48
- if (!kIsWeb) {
46
+ - **Solution**: Conditionally separate the logout logic for Web to rely
47
+ entirely on `FirebaseAuth`:
48
+
49
+ ```dart
50
+ if (!kIsWeb) {
49
51
  await GoogleSignIn.instance.signOut();
50
- }
51
- await FirebaseAuth.instance.signOut();
52
- ```
52
+ }
53
+ await FirebaseAuth.instance.signOut();
54
+ ```
53
55
 
54
56
  ## 4. Prototyping Workaround: Bypassing Firestore Composite Indices
55
57
 
@@ -99,19 +101,17 @@ class AuthService {
99
101
  return await _auth.signInWithPopup(authProvider);
100
102
  } else {
101
103
  // Mobile uses standard flow
102
- final GoogleSignInAccount? googleUser = await GoogleSignIn.instance.authenticate();
103
- if (googleUser == null) return null; // Cancelled
104
+ final GoogleSignInAccount googleUser = await GoogleSignIn.instance.authenticate();
105
+ final GoogleSignInAuthentication googleAuth = googleUser.authentication;
104
106
 
105
- final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
106
-
107
107
  final AuthCredential credential = GoogleAuthProvider.credential(
108
108
  idToken: googleAuth.idToken,
109
109
  );
110
-
110
+
111
111
  return await _auth.signInWithCredential(credential);
112
112
  }
113
113
  } catch (e) {
114
- print("Error during Google Sign-In: \$e");
114
+ print("Error during Google Sign-In: $e");
115
115
  return null;
116
116
  }
117
117
  }
@@ -124,7 +124,7 @@ class AuthService {
124
124
  }
125
125
  await _auth.signOut();
126
126
  } catch (e) {
127
- print("Error signing out: \$e");
127
+ print("Error signing out: $e");
128
128
  }
129
129
  }
130
130
  }
@@ -140,9 +140,8 @@ closes.
140
140
  `Sign-in failed: [firebase_auth/unauthorized-domain] This domain is not authorized for OAuth operation for your Firebase project.`
141
141
  - **Cause**: The domain (usually `localhost` during local testing) is not listed
142
142
  in the Authorized Domains in the Firebase Console.
143
- - **Solution**: Add `localhost` to the Authorized Domains list in the Firebase
144
- Console (Authentication > Settings > Authorized domains) or in your
145
- `firebase.json` auth config.
143
+ - **Solution**: Add `localhost` to the Authorized Domains list in the Firebase
144
+ Console (Authentication > Settings > Authorized domains).
146
145
  - **CRITICAL**: Do NOT include the protocol or port number when adding the
147
146
  domain (e.g., use `localhost`, NOT `http://localhost:9090`). Flutter Web often
148
147
  runs on random ports or specific ports, but Firebase Auth only cares about the
@@ -1,8 +1,10 @@
1
1
  # Authentication in Security Rules
2
2
 
3
3
  Firebase Security Rules work with Firebase Authentication to provide rule-based
4
- access control. For better advice on writing safe security rules, enable the
5
- `firebase-firestore-basics` or `firebase-storage-basics` skills.
4
+ access control. For Firestore Security Rules (`firestore.rules`), delegate to the
5
+ `firestore-rules-author` subagent if subagent delegation is available, or
6
+ see the `firestore-rules-creation` skill otherwise. For Cloud Storage rules,
7
+ enable the `firebase-storage-basics` skill.
6
8
 
7
9
  The `request.auth` variable contains authentication information for the user
8
10
  requesting data.
@@ -15,7 +15,7 @@ to create them.
15
15
  - **Firebase Project**: Created via
16
16
  `npx -y firebase-tools@latest projects:create` (see `firebase-basics`).
17
17
  - **Firebase App**: Created via
18
- `npx -y firebase-tools@latest apps:create <IOS|ANDROID|WEB> <package-name-or-bundle-id>`
18
+ `npx -y firebase-tools@latest apps:create ANDROID <display-name> --package-name=<package-name>`
19
19
 
20
20
  The `google-services.json` file must be present in the Android app's module
21
21
  directory. If missing, get the config using the Firebase CLI:
@@ -64,7 +64,8 @@ plugins {
64
64
  implementation(platform("com.google.firebase:firebase-bom:<latest_bom_version>"))
65
65
 
66
66
  // Add the dependencies for the Crashlytics and Analytics
67
- implementation("com.google.firebase:firebase-crashlytics-ktx")
67
+ implementation("com.google.firebase:firebase-crashlytics")
68
+ implementation("com.google.firebase:firebase-analytics")
68
69
  }
69
70
  ```
70
71
 
@@ -82,7 +83,7 @@ App-level `build.gradle.kts` (`<project>/<app-module>/build.gradle.kts`)
82
83
  ```kotlin
83
84
  dependencies {
84
85
  // ... other dependencies
85
- implementation("com.google.firebase:firebase-crashlytics-ndk:18.6.2")
86
+ implementation("com.google.firebase:firebase-crashlytics-ndk")
86
87
  }
87
88
  ```
88
89
 
@@ -91,12 +92,14 @@ App-level `build.gradle.kts` (`<project>/<app-module>/build.gradle.kts`)
91
92
  required to symbolicate native crash reports.
92
93
 
93
94
  ```kotlin
95
+ import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
96
+
94
97
  android {
95
98
  // ... other config
96
99
  buildTypes {
97
100
  getByName("release") {
98
101
  // ...
99
- firebaseCrashlytics {
102
+ configure<CrashlyticsExtension> {
100
103
  nativeSymbolUploadEnabled = true
101
104
  }
102
105
  }
@@ -16,7 +16,7 @@ Use the `firebase-tools` CLI to set up the project if necessary.
16
16
  1. **Create Firebase Project:** If no project exists, create one:
17
17
  `npx -y firebase-tools@latest projects:create <project-id> --display-name="My Awesome App"`
18
18
  1. **Create Firebase App:** Register the iOS app with the discovered bundle ID:
19
- `npx -y firebase-tools@latest apps:create IOS <bundle-id>`
19
+ `npx -y firebase-tools@latest apps:create IOS <display-name> --bundle-id=<bundle-id>`
20
20
  1. **Link the GoogleService-Info.plist file:** Use the script in the
21
21
  `xcode-project-setup` skill to obtain the config and link.
22
22
 
@@ -65,9 +65,9 @@ two options to be done manually.
65
65
 
66
66
  **For SwiftUI Apps (in `AppDelegate.swift`):**
67
67
 
68
- ````
69
68
  *File: `AppDelegate.swift`*
70
69
  ```swift
70
+ import UIKit
71
71
  import FirebaseCore
72
72
  import Dispatch // For DispatchQueue
73
73
 
@@ -85,7 +85,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
85
85
  }
86
86
  }
87
87
  ```
88
- ````
89
88
 
90
89
  2. Run your app on a device or simulator. If running in the iOS simulator, make
91
90
  sure that the Xcode debugger is disconnected, otherwise the crash will not
@@ -117,6 +117,7 @@ generate:
117
117
  package: "com.example.dataconnect"
118
118
  swiftSdk:
119
119
  outputDir: "../ios-app/DataConnect"
120
+ package: "DataConnectGenerated"
120
121
  ```
121
122
 
122
123
  Generate SDKs:
@@ -175,7 +176,7 @@ Follow these patterns based on your current task:
175
176
  `npx -y firebase-tools@latest emulators:start --only dataconnect`.
176
177
  1. Write schema and operations.
177
178
  1. Seed local test data into `seed_data.gql`. Read
178
- [reference/data_seeding.md](reference/data_seeding.md#local-prototyping-data-seeding).
179
+ [reference/data_seeding.md](reference/data_seeding.md#1-local-prototyping-data-seeding).
179
180
  1. Run `npx -y firebase-tools@latest dataconnect:compile` or
180
181
  `npx -y firebase-tools@latest dataconnect:sdk:generate` to validate them.
181
182
  1. Use the operations in your app and build it.
@@ -196,12 +196,12 @@ query MyProfile @auth(level: USER)
196
196
  operation: "UpdateProfile",
197
197
  condition: "mutation.auth.uid == request.auth.uid"
198
198
  }) {
199
- user(uid_expr: "auth.uid") { id name }
199
+ user(uid_expr: "auth.uid") { uid displayName }
200
200
  }
201
201
 
202
202
  # Counterpart mutation for MyProfile
203
203
  mutation UpdateProfile($name: String!) @auth(level: USER) {
204
- user_update(id_expr: "auth.uid", data: { name: $name })
204
+ user_update(key: { uid_expr: "auth.uid" }, data: { displayName: $name })
205
205
  }
206
206
 
207
207
  # Time-based: live leaderboard refreshing every 30 seconds
@@ -221,13 +221,13 @@ import { subscribe } from 'firebase/data-connect';
221
221
  // Subscribe to movie list — refreshes when AddReview mutation runs
222
222
  const unsubMovies = subscribe(listMoviesRef({ genre: 'Action' }), {
223
223
  onNext: (result) => updateMovieList(result.data.movies),
224
- onError: (error) => console.error(error)
224
+ onErr: (error) => console.error(error) // Observer object property is `onErr` (positional overload parameter is `onError`)
225
225
  });
226
226
 
227
227
  // Subscribe to leaderboard — refreshes every 30 seconds
228
228
  const unsubLeaderboard = subscribe(movieLeaderboardRef(), {
229
229
  onNext: (result) => updateLeaderboard(result.data.movies),
230
- onError: (error) => console.error(error)
230
+ onErr: (error) => console.error(error)
231
231
  });
232
232
 
233
233
  // Cleanup