vybekiit 0.7.26 → 0.7.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +3910 -1300
- package/dist/global-guidance/language.md +443 -0
- package/dist/global-skills/add-ai/SKILL.md +1 -1
- package/dist/global-skills/add-analytics/SKILL.md +1 -1
- package/dist/global-skills/add-blog/SKILL.md +1 -1
- package/dist/global-skills/add-crud/SKILL.md +1 -1
- package/dist/global-skills/add-files/SKILL.md +1 -1
- package/dist/global-skills/add-images/SKILL.md +1 -1
- package/dist/global-skills/add-language/SKILL.md +1 -1
- package/dist/global-skills/add-notifications/SKILL.md +1 -1
- package/dist/global-skills/add-realtime/SKILL.md +1 -1
- package/dist/global-skills/add-route/SKILL.md +1 -1
- package/dist/global-skills/add-search/SKILL.md +1 -1
- package/dist/global-skills/add-signin/SKILL.md +1 -1
- package/dist/global-skills/add-teams/SKILL.md +1 -1
- package/dist/global-skills/add-upload/SKILL.md +1 -1
- package/dist/global-skills/aws-cdk/SKILL.md +19 -5
- package/dist/global-skills/aws-cdk/references/fast-deployments.md +191 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +16 -0
- package/dist/global-skills/aws-cloudformation/SKILL.md +16 -26
- package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +7 -3
- package/dist/global-skills/aws-cloudformation/references/cloudformation-language-server.md +177 -0
- package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +8 -2
- package/dist/global-skills/aws-cloudformation/references/persist-template-context.script.md +5 -8
- package/dist/global-skills/aws-cloudformation/references/retrieve-template-context.script.md +1 -1
- package/dist/global-skills/aws-cloudformation/references/security-considerations.md +51 -0
- package/dist/global-skills/aws-cloudformation/references/troubleshoot-failed-stack.script.md +138 -0
- package/dist/global-skills/aws-cloudformation/references/{validate-cloudformation-template.script.md → validate-with-cfn-lint.script.md} +15 -27
- package/dist/global-skills/aws-cloudformation/references/validate-with-cloudformation-validate.script.md +181 -0
- package/dist/global-skills/aws-cloudformation/references/validation-tool-selection.md +44 -0
- package/dist/global-skills/aws-serverless/SKILL.md +9 -1
- package/dist/global-skills/aws-serverless/references/architecture.md +3 -1
- package/dist/global-skills/aws-serverless/references/lambda.md +3 -1
- package/dist/global-skills/aws-serverless/references/orchestration.md +1 -0
- package/dist/global-skills/back-up-my-code/SKILL.md +1 -1
- package/dist/global-skills/better-auth-best-practices/SKILL.md +18 -8
- package/dist/global-skills/buy-domain/SKILL.md +1 -1
- package/dist/global-skills/check-safety/SKILL.md +1 -1
- package/dist/global-skills/configure-capabilities/SKILL.md +1 -1
- package/dist/global-skills/connect-account/SKILL.md +1 -1
- package/dist/global-skills/connect-account-backend/SKILL.md +1 -1
- package/dist/global-skills/design-my-data/SKILL.md +1 -1
- package/dist/global-skills/doctor/SKILL.md +1 -1
- package/dist/global-skills/eas-app-stores/SKILL.md +31 -15
- package/dist/global-skills/eas-app-stores/agents/openai.yaml +2 -2
- package/dist/global-skills/eas-app-stores/references/ios-app-store.md +37 -32
- package/dist/global-skills/eas-app-stores/references/native-ios.md +167 -0
- package/dist/global-skills/eas-app-stores/references/play-store.md +3 -7
- package/dist/global-skills/eas-app-stores/references/testflight.md +39 -35
- package/dist/global-skills/eas-simulator/SKILL.md +48 -26
- package/dist/global-skills/eas-simulator/references/controllers.md +32 -3
- package/dist/global-skills/eas-simulator/references/run-your-app.md +34 -4
- package/dist/global-skills/eas-simulator/references/troubleshooting.md +8 -4
- package/dist/global-skills/eas-update/SKILL.md +146 -0
- package/dist/global-skills/eas-update/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-animation/RECIPES.md +2 -2
- package/dist/global-skills/expo-animation/SKILL.md +9 -2
- package/dist/global-skills/expo-brownfield/SKILL.md +18 -11
- package/dist/global-skills/expo-brownfield/agents/openai.yaml +2 -2
- package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +94 -69
- package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +40 -42
- package/dist/global-skills/expo-brownfield/references/comparison.md +5 -5
- package/dist/global-skills/expo-brownfield/references/feature-integration.md +163 -0
- package/dist/global-skills/expo-brownfield/references/troubleshooting.md +17 -17
- package/dist/global-skills/expo-brownfield/references/version-compatibility.md +40 -0
- package/dist/global-skills/expo-data-fetching/SKILL.md +27 -6
- package/dist/global-skills/expo-design-system/SKILL.md +27 -7
- package/dist/global-skills/expo-design-system/references/audit.md +7 -2
- package/dist/global-skills/expo-design-system/references/native-slop.md +74 -0
- package/dist/global-skills/expo-examples/SKILL.md +0 -1
- package/dist/global-skills/expo-examples/references/catalog.md +1 -1
- package/dist/global-skills/expo-migrate-module/SKILL.md +21 -10
- package/dist/global-skills/expo-migrate-module/references/compatibility.md +80 -23
- package/dist/global-skills/expo-migrate-module/references/migration-map.md +162 -11
- package/dist/global-skills/expo-native-ui/SKILL.md +25 -16
- package/dist/global-skills/expo-native-ui/agents/openai.yaml +2 -2
- package/dist/global-skills/expo-native-ui/references/controls.md +5 -46
- package/dist/global-skills/expo-native-ui/references/icons.md +21 -2
- package/dist/global-skills/expo-native-ui/references/media.md +15 -20
- package/dist/global-skills/expo-native-ui/references/visual-effects.md +12 -11
- package/dist/global-skills/expo-overview/SKILL.md +17 -12
- package/dist/global-skills/expo-router/SKILL.md +5 -3
- package/dist/global-skills/expo-router/references/tabs.md +5 -5
- package/dist/global-skills/expo-upgrade/SKILL.md +3 -1
- package/dist/global-skills/expo-web-to-native/references/false-friends.md +2 -2
- package/dist/global-skills/expo-web-to-native/references/native-patterns.md +1 -1
- package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +13 -16
- package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +4 -5
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +4 -4
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +3 -3
- package/dist/global-skills/firebase-auth-basics/SKILL.md +11 -6
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +4 -5
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +3 -3
- package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +24 -25
- package/dist/global-skills/firebase-auth-basics/references/security_rules.md +4 -2
- package/dist/global-skills/firebase-crashlytics/references/android_setup.md +7 -4
- package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +2 -3
- package/dist/global-skills/firebase-data-connect/SKILL.md +2 -1
- package/dist/global-skills/firebase-data-connect/examples.md +4 -4
- package/dist/global-skills/firebase-data-connect/reference/config.md +5 -4
- package/dist/global-skills/firebase-data-connect/reference/realtime.md +1 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +2 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +2 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +17 -6
- package/dist/global-skills/firebase-data-connect/reference/security.md +5 -5
- package/dist/global-skills/firebase-data-connect/templates.md +2 -1
- package/dist/global-skills/firebase-firestore/SKILL.md +20 -8
- package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +5 -4
- package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +12 -3
- package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +16 -18
- package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +1 -1
- package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +5 -1
- package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +7 -7
- package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +5 -5
- package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +4 -4
- package/dist/global-skills/firebase-firestore/references/standard/indexes.md +16 -18
- package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +1 -1
- package/dist/global-skills/firebase-remote-config-basics/SKILL.md +0 -5
- package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +36 -8
- package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +1 -7
- package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +17 -6
- package/dist/global-skills/{firebase-firestore/references/standard/security_rules.md → firestore-rules-creation/SKILL.md} +24 -13
- package/dist/global-skills/go-live/SKILL.md +1 -1
- package/dist/global-skills/grow-my-customers/SKILL.md +23 -0
- package/dist/global-skills/harden/SKILL.md +1 -1
- package/dist/global-skills/instrument-feature-flags/SKILL.md +25 -25
- package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +141 -285
- package/dist/global-skills/instrument-feature-flags/references/android.md +6 -15
- package/dist/global-skills/instrument-feature-flags/references/api.md +4 -11
- package/dist/global-skills/instrument-feature-flags/references/best-practices.md +1 -13
- package/dist/global-skills/instrument-feature-flags/references/django.md +14 -27
- package/dist/global-skills/instrument-feature-flags/references/dotnet.md +20 -79
- package/dist/global-skills/instrument-feature-flags/references/elixir.md +1 -9
- package/dist/global-skills/instrument-feature-flags/references/flask.md +13 -13
- package/dist/global-skills/instrument-feature-flags/references/flutter.md +3 -24
- package/dist/global-skills/instrument-feature-flags/references/go.md +3 -15
- package/dist/global-skills/instrument-feature-flags/references/ios.md +4 -17
- package/dist/global-skills/instrument-feature-flags/references/java.md +5 -13
- package/dist/global-skills/instrument-feature-flags/references/laravel.md +13 -17
- package/dist/global-skills/instrument-feature-flags/references/next-js.md +25 -32
- package/dist/global-skills/instrument-feature-flags/references/nodejs.md +8 -15
- package/dist/global-skills/instrument-feature-flags/references/php.md +1 -15
- package/dist/global-skills/instrument-feature-flags/references/python.md +2 -15
- package/dist/global-skills/instrument-feature-flags/references/react-native.md +13 -15
- package/dist/global-skills/instrument-feature-flags/references/react.md +17 -21
- package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +37 -83
- package/dist/global-skills/instrument-feature-flags/references/ruby.md +2 -15
- package/dist/global-skills/instrument-feature-flags/references/rust.md +13 -25
- package/dist/global-skills/instrument-feature-flags/references/usage.md +14 -63
- package/dist/global-skills/instrument-feature-flags/references/web.md +9 -14
- package/dist/global-skills/instrument-product-analytics/SKILL.md +29 -29
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/android.md +72 -107
- package/dist/global-skills/instrument-product-analytics/references/angular.md +26 -28
- package/dist/global-skills/instrument-product-analytics/references/astro.md +13 -24
- package/dist/global-skills/instrument-product-analytics/references/configuration.md +45 -63
- package/dist/global-skills/instrument-product-analytics/references/django.md +14 -27
- package/dist/global-skills/instrument-product-analytics/references/dotnet.md +20 -79
- package/dist/global-skills/instrument-product-analytics/references/elixir.md +47 -49
- package/dist/global-skills/instrument-product-analytics/references/flask.md +13 -13
- package/dist/global-skills/instrument-product-analytics/references/flutter.md +60 -90
- package/dist/global-skills/instrument-product-analytics/references/go.md +17 -56
- package/dist/global-skills/instrument-product-analytics/references/identify-users.md +15 -15
- package/dist/global-skills/instrument-product-analytics/references/ios.md +11 -15
- package/dist/global-skills/instrument-product-analytics/references/laravel.md +13 -17
- package/dist/global-skills/instrument-product-analytics/references/next-js.md +25 -32
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +13 -27
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +14 -28
- package/dist/global-skills/instrument-product-analytics/references/php.md +33 -84
- package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +229 -9
- package/dist/global-skills/instrument-product-analytics/references/python.md +415 -106
- package/dist/global-skills/instrument-product-analytics/references/react-native.md +161 -155
- package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +12 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +15 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +12 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +26 -41
- package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +37 -83
- package/dist/global-skills/instrument-product-analytics/references/ruby.md +48 -108
- package/dist/global-skills/instrument-product-analytics/references/svelte.md +18 -24
- package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +17 -19
- package/dist/global-skills/instrument-product-analytics/references/usage.md +14 -63
- package/dist/global-skills/instrument-product-analytics/references/vue-js.md +29 -28
- package/dist/global-skills/manifest.json +8 -2
- package/dist/global-skills/mongodb-search-and-ai/SKILL.md +28 -37
- package/dist/global-skills/mongodb-search-and-ai/references/automated-embedding.md +438 -0
- package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +60 -4
- package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +46 -108
- package/dist/global-skills/neon/SKILL.md +207 -213
- package/dist/global-skills/neon/references/auth.md +12 -0
- package/dist/global-skills/neon/references/claimable-neon.md +10 -14
- package/dist/global-skills/neon/references/function-triggers.md +53 -0
- package/dist/global-skills/neon/references/logs-loki.md +61 -0
- package/dist/global-skills/neon/references/parse-env.md +32 -0
- package/dist/global-skills/neon/references/sdk.md +7 -0
- package/dist/global-skills/neon-ai-gateway/SKILL.md +14 -16
- package/dist/global-skills/neon-auth/SKILL.md +155 -0
- package/dist/global-skills/neon-auth/references/managed-auth.md +173 -0
- package/dist/global-skills/neon-auth/references/self-managed.md +25 -0
- package/dist/global-skills/neon-functions/SKILL.md +159 -84
- package/dist/global-skills/neon-functions/references/ai-sdk.md +4 -6
- package/dist/global-skills/neon-functions/references/function-triggers.md +249 -0
- package/dist/global-skills/neon-functions/references/mastra-studio.md +3 -3
- package/dist/global-skills/neon-functions/references/mcp.md +1 -1
- package/dist/global-skills/neon-functions/references/production-hardening.md +340 -0
- package/dist/global-skills/neon-functions/references/sse.md +8 -5
- package/dist/global-skills/neon-object-storage/SKILL.md +10 -11
- package/dist/global-skills/neon-postgres/SKILL.md +120 -17
- package/dist/global-skills/neon-postgres/references/full-text-search.md +99 -0
- package/dist/global-skills/neon-postgres/references/hybrid-search.md +90 -0
- package/dist/global-skills/neon-postgres/references/lakebase-search-drizzle.md +172 -0
- package/dist/global-skills/neon-postgres/references/vector-search.md +137 -0
- package/dist/global-skills/neon-postgres-branches/SKILL.md +3 -3
- package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +1 -1
- package/dist/global-skills/onboarding/SKILL.md +16 -14
- package/dist/global-skills/plan-my-idea/SKILL.md +1 -1
- package/dist/global-skills/publish-app/SKILL.md +1 -1
- package/dist/global-skills/publish-extension/SKILL.md +1 -1
- package/dist/global-skills/resend/SKILL.md +4 -2
- package/dist/global-skills/resend/references/broadcasts.md +6 -1
- package/dist/global-skills/resend/references/receiving.md +29 -10
- package/dist/global-skills/resend/references/sending/email-management.md +14 -4
- package/dist/global-skills/resend/references/topics.md +9 -6
- package/dist/global-skills/resend/references/usage.md +117 -0
- package/dist/global-skills/resend/references/webhooks.md +59 -2
- package/dist/global-skills/reset-password/SKILL.md +1 -1
- package/dist/global-skills/save-data/SKILL.md +1 -1
- package/dist/global-skills/setup-email/SKILL.md +1 -1
- package/dist/global-skills/setup-payments/SKILL.md +1 -1
- package/dist/global-skills/setup-sms/SKILL.md +1 -1
- package/dist/global-skills/sign-in-with-email-link/SKILL.md +1 -1
- package/dist/global-skills/sign-in-with-google/SKILL.md +1 -1
- package/dist/global-skills/sign-in-with-phone/SKILL.md +1 -1
- package/dist/global-skills/stripe-best-practices/SKILL.md +35 -29
- package/dist/global-skills/stripe-best-practices/references/billing.md +9 -2
- package/dist/global-skills/stripe-best-practices/references/payments.md +4 -2
- package/dist/global-skills/stripe-best-practices/references/security.md +3 -1
- package/dist/global-skills/stripe-best-practices/references/tax.md +39 -20
- package/dist/global-skills/supabase/SKILL.md +6 -0
- package/dist/global-skills/track-errors/SKILL.md +1 -1
- package/dist/global-skills/update-kit/SKILL.md +1 -1
- package/dist/global-skills/use-railway/SKILL.md +42 -22
- package/dist/global-skills/use-railway/references/analyze-db.md +7 -6
- package/dist/global-skills/use-railway/references/cloud-agents.md +70 -0
- package/dist/global-skills/use-railway/references/configure.md +17 -2
- package/dist/global-skills/use-railway/references/databases.md +107 -0
- package/dist/global-skills/use-railway/references/deploy.md +5 -5
- package/dist/global-skills/use-railway/references/feature-flags.md +25 -13
- package/dist/global-skills/use-railway/references/iac.md +66 -77
- package/dist/global-skills/use-railway/references/operate.md +26 -3
- package/dist/global-skills/use-railway/references/request.md +31 -23
- package/dist/global-skills/use-railway/references/setup.md +16 -5
- package/dist/global-skills/use-railway/references/tracing.md +261 -0
- package/dist/global-skills/use-railway/references/usage.md +52 -0
- package/dist/global-skills/validate-my-idea/SKILL.md +54 -0
- package/dist/global-skills/{feedback → vybekiit-feedback}/SKILL.md +17 -13
- package/dist/global-skills/watch-my-app/SKILL.md +53 -0
- package/dist/global-skills/wire-auth/SKILL.md +1 -1
- package/dist/global-skills/wire-database/SKILL.md +1 -1
- package/dist/global-skills/wire-email/SKILL.md +1 -1
- package/dist/global-skills/wire-payments/SKILL.md +1 -1
- package/dist/global-skills/workers-best-practices/SKILL.md +36 -103
- package/dist/global-skills/workers-best-practices/references/configuration.md +139 -0
- package/dist/global-skills/workers-best-practices/references/platform-apis.md +51 -0
- package/dist/global-skills/workers-best-practices/references/{rules.md → runtime-patterns.md} +13 -137
- package/dist/global-skills/wrangler/SKILL.md +48 -901
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +19 -15
- package/package.json +9 -8
- package/dist/global-skills/expo-native-ui/references/animations.md +0 -220
- package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +0 -577
- 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.
|
|
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
|
|
16
|
-
`expo` dependency.
|
|
17
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
- "
|
|
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
|
-
|
|
73
|
-
in each leaf.
|
|
74
|
+
Apply the rules that match the project and the requested task.
|
|
74
75
|
|
|
75
|
-
- **
|
|
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,
|
|
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
|
-
|
|
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={{
|
|
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",
|
|
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 "
|
|
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
|
|
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 "
|
|
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
|
|
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
|
-
-
|
|
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>`
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
181
|
-
:
|
|
182
|
-
:
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
:
|
|
186
|
-
|
|
187
|
-
:
|
|
188
|
-
:
|
|
189
|
-
|
|
190
|
-
:
|
|
191
|
-
:
|
|
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(
|
|
92
|
-
SafetySetting(
|
|
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(
|
|
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":
|
|
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.
|
|
43
|
-
import com.google.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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
86
|
-
>
|
|
87
|
-
>
|
|
88
|
-
>
|
|
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.
|
|
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
|
-
|
|
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
|
-
> -
|
|
80
|
-
>
|
|
81
|
-
>
|
|
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
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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
|
|
103
|
-
|
|
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:
|
|
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:
|
|
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
|
-
-
|
|
144
|
-
|
|
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
|
|
5
|
-
`
|
|
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 <
|
|
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
|
|
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
|
|
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
|
-
|
|
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") {
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
230
|
+
onErr: (error) => console.error(error)
|
|
231
231
|
});
|
|
232
232
|
|
|
233
233
|
// Cleanup
|