vybekiit 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/dist/bin.js +840 -296
  2. package/dist/global-skills/add-ai/SKILL.md +53 -0
  3. package/dist/global-skills/add-analytics/SKILL.md +65 -0
  4. package/dist/global-skills/add-app-clip/SKILL.md +280 -0
  5. package/dist/global-skills/add-app-clip/agents/openai.yaml +4 -0
  6. package/dist/global-skills/add-app-clip/references/native-module.md +96 -0
  7. package/dist/global-skills/add-blog/SKILL.md +49 -0
  8. package/dist/global-skills/add-crud/SKILL.md +28 -0
  9. package/dist/global-skills/add-files/SKILL.md +65 -0
  10. package/dist/global-skills/add-images/SKILL.md +64 -0
  11. package/dist/global-skills/add-language/SKILL.md +44 -0
  12. package/dist/global-skills/add-notifications/SKILL.md +61 -0
  13. package/dist/global-skills/add-realtime/SKILL.md +49 -0
  14. package/dist/global-skills/add-route/SKILL.md +28 -0
  15. package/dist/global-skills/add-search/SKILL.md +43 -0
  16. package/dist/global-skills/add-signin/SKILL.md +78 -0
  17. package/dist/global-skills/add-teams/SKILL.md +64 -0
  18. package/dist/global-skills/add-upload/SKILL.md +27 -0
  19. package/dist/global-skills/aws-cdk/SKILL.md +72 -0
  20. package/dist/global-skills/aws-cdk/references/bootstrap-and-project-setup.md +257 -0
  21. package/dist/global-skills/aws-cdk/references/compliance-and-drift.md +193 -0
  22. package/dist/global-skills/aws-cdk/references/construct-patterns.md +315 -0
  23. package/dist/global-skills/aws-cdk/references/import-and-migrate.md +184 -0
  24. package/dist/global-skills/aws-cdk/references/refactor-and-prevent-replacement.md +198 -0
  25. package/dist/global-skills/aws-cdk/references/troubleshooting-credentials.md +183 -0
  26. package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +293 -0
  27. package/dist/global-skills/aws-cdk/references/troubleshooting-synth.md +274 -0
  28. package/dist/global-skills/aws-cdk/references/v1-to-v2-migration.md +119 -0
  29. package/dist/global-skills/aws-cloudformation/SKILL.md +88 -0
  30. package/dist/global-skills/aws-cloudformation/references/author-cloudformation-best-practices.script.md +179 -0
  31. package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +159 -0
  32. package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +217 -0
  33. package/dist/global-skills/aws-cloudformation/references/deploy-with-express-mode.script.md +271 -0
  34. package/dist/global-skills/aws-cloudformation/references/lookup-resource-properties.script.md +130 -0
  35. package/dist/global-skills/aws-cloudformation/references/troubleshoot-deployment.script.md +200 -0
  36. package/dist/global-skills/aws-cloudformation/references/validate-cloudformation-template.script.md +135 -0
  37. package/dist/global-skills/aws-serverless/SKILL.md +51 -0
  38. package/dist/global-skills/aws-serverless/assets/powertools-handler.py +49 -0
  39. package/dist/global-skills/aws-serverless/references/api-gateway.md +553 -0
  40. package/dist/global-skills/aws-serverless/references/architecture.md +262 -0
  41. package/dist/global-skills/aws-serverless/references/concurrency.md +200 -0
  42. package/dist/global-skills/aws-serverless/references/deployment.md +94 -0
  43. package/dist/global-skills/aws-serverless/references/event-sources.md +484 -0
  44. package/dist/global-skills/aws-serverless/references/lambda.md +548 -0
  45. package/dist/global-skills/aws-serverless/references/orchestration.md +449 -0
  46. package/dist/global-skills/aws-serverless/references/production.md +493 -0
  47. package/dist/global-skills/aws-serverless/references/troubleshooting.md +711 -0
  48. package/dist/global-skills/back-up-my-code/SKILL.md +48 -0
  49. package/dist/global-skills/better-auth-best-practices/SKILL.md +182 -0
  50. package/dist/global-skills/better-auth-security-best-practices/SKILL.md +432 -0
  51. package/dist/global-skills/building-native-ui/SKILL.md +377 -0
  52. package/dist/global-skills/building-native-ui/agents/openai.yaml +4 -0
  53. package/dist/global-skills/building-native-ui/references/animations.md +220 -0
  54. package/dist/global-skills/building-native-ui/references/controls.md +270 -0
  55. package/dist/global-skills/building-native-ui/references/form-sheet.md +253 -0
  56. package/dist/global-skills/building-native-ui/references/gradients.md +106 -0
  57. package/dist/global-skills/building-native-ui/references/icons.md +213 -0
  58. package/dist/global-skills/building-native-ui/references/media.md +198 -0
  59. package/dist/global-skills/building-native-ui/references/route-structure.md +229 -0
  60. package/dist/global-skills/building-native-ui/references/search.md +248 -0
  61. package/dist/global-skills/building-native-ui/references/storage.md +121 -0
  62. package/dist/global-skills/building-native-ui/references/tabs.md +433 -0
  63. package/dist/global-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
  64. package/dist/global-skills/building-native-ui/references/visual-effects.md +197 -0
  65. package/dist/global-skills/building-native-ui/references/webgpu-three.md +605 -0
  66. package/dist/global-skills/building-native-ui/references/zoom-transitions.md +158 -0
  67. package/dist/global-skills/buy-domain/SKILL.md +64 -0
  68. package/dist/global-skills/check-safety/SKILL.md +94 -0
  69. package/dist/global-skills/claimable-postgres/SKILL.md +249 -0
  70. package/dist/global-skills/configure-capabilities/SKILL.md +38 -0
  71. package/dist/global-skills/connect-account/SKILL.md +64 -0
  72. package/dist/global-skills/connect-account-backend/SKILL.md +41 -0
  73. package/dist/global-skills/create-auth-skill/SKILL.md +321 -0
  74. package/dist/global-skills/design-my-data/SKILL.md +48 -0
  75. package/dist/global-skills/doctor/SKILL.md +84 -0
  76. package/dist/global-skills/eas-app-stores/SKILL.md +152 -0
  77. package/dist/global-skills/eas-app-stores/agents/openai.yaml +4 -0
  78. package/dist/global-skills/eas-app-stores/references/app-store-metadata.md +497 -0
  79. package/dist/global-skills/eas-app-stores/references/ios-app-store.md +371 -0
  80. package/dist/global-skills/eas-app-stores/references/play-store.md +246 -0
  81. package/dist/global-skills/eas-app-stores/references/testflight.md +58 -0
  82. package/dist/global-skills/eas-app-stores/references/workflows.md +120 -0
  83. package/dist/global-skills/eas-hosting/SKILL.md +423 -0
  84. package/dist/global-skills/eas-hosting/agents/openai.yaml +4 -0
  85. package/dist/global-skills/eas-observe/SKILL.md +32 -0
  86. package/dist/global-skills/eas-observe/agents/openai.yaml +4 -0
  87. package/dist/global-skills/eas-observe/references/metrics.md +47 -0
  88. package/dist/global-skills/eas-observe/references/queries.md +342 -0
  89. package/dist/global-skills/eas-observe/references/setup.md +317 -0
  90. package/dist/global-skills/eas-simulator/SKILL.md +156 -0
  91. package/dist/global-skills/eas-simulator/agents/openai.yaml +4 -0
  92. package/dist/global-skills/eas-simulator/references/controllers.md +67 -0
  93. package/dist/global-skills/eas-simulator/references/run-your-app.md +185 -0
  94. package/dist/global-skills/eas-simulator/references/troubleshooting.md +38 -0
  95. package/dist/global-skills/eas-update-insights/SKILL.md +230 -0
  96. package/dist/global-skills/eas-update-insights/agents/openai.yaml +4 -0
  97. package/dist/global-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  98. package/dist/global-skills/eas-update-insights/references/update-insights-schema.md +69 -0
  99. package/dist/global-skills/eas-workflows/SKILL.md +94 -0
  100. package/dist/global-skills/eas-workflows/agents/openai.yaml +4 -0
  101. package/dist/global-skills/eas-workflows/scripts/fetch.js +109 -0
  102. package/dist/global-skills/eas-workflows/scripts/package.json +11 -0
  103. package/dist/global-skills/eas-workflows/scripts/validate.js +84 -0
  104. package/dist/global-skills/email-best-practices/SKILL.md +73 -0
  105. package/dist/global-skills/expo-api-routes/SKILL.md +368 -0
  106. package/dist/global-skills/expo-api-routes/agents/openai.yaml +4 -0
  107. package/dist/global-skills/expo-app-clip/SKILL.md +282 -0
  108. package/dist/global-skills/expo-app-clip/agents/openai.yaml +4 -0
  109. package/dist/global-skills/expo-app-clip/references/native-module.md +96 -0
  110. package/dist/global-skills/expo-brownfield/SKILL.md +54 -0
  111. package/dist/global-skills/expo-brownfield/agents/openai.yaml +4 -0
  112. package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
  113. package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
  114. package/dist/global-skills/expo-brownfield/references/comparison.md +63 -0
  115. package/dist/global-skills/expo-brownfield/references/troubleshooting.md +88 -0
  116. package/dist/global-skills/expo-cicd-workflows/SKILL.md +92 -0
  117. package/dist/global-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
  118. package/dist/global-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
  119. package/dist/global-skills/expo-cicd-workflows/scripts/package.json +11 -0
  120. package/dist/global-skills/expo-cicd-workflows/scripts/validate.js +84 -0
  121. package/dist/global-skills/expo-data-fetching/SKILL.md +449 -0
  122. package/dist/global-skills/expo-data-fetching/agents/openai.yaml +4 -0
  123. package/dist/global-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  124. package/dist/global-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  125. package/dist/global-skills/expo-deployment/SKILL.md +167 -0
  126. package/dist/global-skills/expo-deployment/agents/openai.yaml +4 -0
  127. package/dist/global-skills/expo-deployment/references/app-store-metadata.md +497 -0
  128. package/dist/global-skills/expo-deployment/references/ios-app-store.md +371 -0
  129. package/dist/global-skills/expo-deployment/references/play-store.md +246 -0
  130. package/dist/global-skills/expo-deployment/references/testflight.md +58 -0
  131. package/dist/global-skills/expo-deployment/references/workflows.md +160 -0
  132. package/dist/global-skills/expo-dev-client/SKILL.md +174 -0
  133. package/dist/global-skills/expo-dev-client/agents/openai.yaml +4 -0
  134. package/dist/global-skills/expo-dom/SKILL.md +417 -0
  135. package/dist/global-skills/expo-dom/agents/openai.yaml +4 -0
  136. package/dist/global-skills/expo-examples/SKILL.md +99 -0
  137. package/dist/global-skills/expo-examples/agents/openai.yaml +4 -0
  138. package/dist/global-skills/expo-examples/references/catalog.md +105 -0
  139. package/dist/global-skills/expo-module/SKILL.md +141 -0
  140. package/dist/global-skills/expo-module/agents/openai.yaml +4 -0
  141. package/dist/global-skills/expo-module/references/config-plugin.md +90 -0
  142. package/dist/global-skills/expo-module/references/create-expo-module.md +206 -0
  143. package/dist/global-skills/expo-module/references/lifecycle.md +127 -0
  144. package/dist/global-skills/expo-module/references/module-config.md +48 -0
  145. package/dist/global-skills/expo-module/references/native-module.md +286 -0
  146. package/dist/global-skills/expo-module/references/native-view.md +171 -0
  147. package/dist/global-skills/expo-native-ui/SKILL.md +181 -0
  148. package/dist/global-skills/expo-native-ui/agents/openai.yaml +4 -0
  149. package/dist/global-skills/expo-native-ui/references/animations.md +220 -0
  150. package/dist/global-skills/expo-native-ui/references/controls.md +270 -0
  151. package/dist/global-skills/expo-native-ui/references/gradients.md +106 -0
  152. package/dist/global-skills/expo-native-ui/references/icons.md +213 -0
  153. package/dist/global-skills/expo-native-ui/references/media.md +198 -0
  154. package/dist/global-skills/expo-native-ui/references/storage.md +121 -0
  155. package/dist/global-skills/expo-native-ui/references/visual-effects.md +197 -0
  156. package/dist/global-skills/expo-native-ui/references/webgpu-three.md +605 -0
  157. package/dist/global-skills/expo-observe/SKILL.md +30 -0
  158. package/dist/global-skills/expo-observe/references/metrics.md +47 -0
  159. package/dist/global-skills/expo-observe/references/queries.md +342 -0
  160. package/dist/global-skills/expo-observe/references/setup.md +317 -0
  161. package/dist/global-skills/expo-router/SKILL.md +230 -0
  162. package/dist/global-skills/expo-router/agents/openai.yaml +4 -0
  163. package/dist/global-skills/expo-router/references/form-sheet.md +253 -0
  164. package/dist/global-skills/expo-router/references/route-structure.md +229 -0
  165. package/dist/global-skills/expo-router/references/search.md +248 -0
  166. package/dist/global-skills/expo-router/references/tabs.md +433 -0
  167. package/dist/global-skills/expo-router/references/toolbar-and-headers.md +284 -0
  168. package/dist/global-skills/expo-router/references/zoom-transitions.md +158 -0
  169. package/dist/global-skills/expo-skill-eval/SKILL.md +314 -0
  170. package/dist/global-skills/expo-skill-eval/agents/visual-grader.md +52 -0
  171. package/dist/global-skills/expo-skill-eval/references/design-rubric.md +45 -0
  172. package/dist/global-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  173. package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +64 -0
  174. package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  175. package/dist/global-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  176. package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  177. package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  178. package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  179. package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  180. package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  181. package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  182. package/dist/global-skills/expo-skill-feedback/SKILL.md +54 -0
  183. package/dist/global-skills/expo-skill-feedback/agents/openai.yaml +4 -0
  184. package/dist/global-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
  185. package/dist/global-skills/expo-skill-feedback/scripts/skill-feedback.cjs +118 -0
  186. package/dist/global-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
  187. package/dist/global-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
  188. package/dist/global-skills/expo-tailwind-setup/SKILL.md +480 -0
  189. package/dist/global-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
  190. package/dist/global-skills/expo-ui/SKILL.md +47 -0
  191. package/dist/global-skills/expo-ui/agents/openai.yaml +4 -0
  192. package/dist/global-skills/expo-ui/references/drop-in-replacements.md +27 -0
  193. package/dist/global-skills/expo-ui/references/jetpack-compose.md +73 -0
  194. package/dist/global-skills/expo-ui/references/swift-ui.md +73 -0
  195. package/dist/global-skills/expo-ui/references/universal.md +73 -0
  196. package/dist/global-skills/expo-ui/scripts/list-components.js +193 -0
  197. package/dist/global-skills/expo-upgrade/SKILL.md +134 -0
  198. package/dist/global-skills/expo-upgrade/agents/openai.yaml +4 -0
  199. package/dist/global-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  200. package/dist/global-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  201. package/dist/global-skills/expo-upgrade/references/native-tabs.md +124 -0
  202. package/dist/global-skills/expo-upgrade/references/new-architecture.md +79 -0
  203. package/dist/global-skills/expo-upgrade/references/react-19.md +79 -0
  204. package/dist/global-skills/expo-upgrade/references/react-compiler.md +59 -0
  205. package/dist/global-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  206. package/dist/global-skills/expo-web-to-native/SKILL.md +83 -0
  207. package/dist/global-skills/expo-web-to-native/agents/openai.yaml +4 -0
  208. package/dist/global-skills/expo-web-to-native/references/false-friends.md +119 -0
  209. package/dist/global-skills/expo-web-to-native/references/native-patterns.md +39 -0
  210. package/dist/global-skills/expo-web-to-native/references/run-as-goal.md +48 -0
  211. package/dist/global-skills/expo-web-to-native/references/verify-on-device.md +45 -0
  212. package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +165 -0
  213. package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +95 -0
  214. package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +156 -0
  215. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +157 -0
  216. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +186 -0
  217. package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +73 -0
  218. package/dist/global-skills/firebase-app-hosting-basics/references/cli_commands.md +85 -0
  219. package/dist/global-skills/firebase-app-hosting-basics/references/configuration.md +59 -0
  220. package/dist/global-skills/firebase-app-hosting-basics/references/emulation.md +59 -0
  221. package/dist/global-skills/firebase-auth-basics/SKILL.md +118 -0
  222. package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +160 -0
  223. package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +301 -0
  224. package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +149 -0
  225. package/dist/global-skills/firebase-auth-basics/references/ios_setup.md +87 -0
  226. package/dist/global-skills/firebase-auth-basics/references/security_rules.md +49 -0
  227. package/dist/global-skills/firebase-basics/SKILL.md +148 -0
  228. package/dist/global-skills/firebase-basics/references/android_setup.md +41 -0
  229. package/dist/global-skills/firebase-basics/references/firebase-cli-guide.md +18 -0
  230. package/dist/global-skills/firebase-basics/references/firebase-service-init.md +20 -0
  231. package/dist/global-skills/firebase-basics/references/flutter_setup.md +143 -0
  232. package/dist/global-skills/firebase-basics/references/ios_setup.md +113 -0
  233. package/dist/global-skills/firebase-basics/references/local-env-setup.md +80 -0
  234. package/dist/global-skills/firebase-basics/references/refresh/android_studio.md +41 -0
  235. package/dist/global-skills/firebase-basics/references/refresh/antigravity.md +64 -0
  236. package/dist/global-skills/firebase-basics/references/refresh/claude.md +12 -0
  237. package/dist/global-skills/firebase-basics/references/refresh/gemini-cli.md +13 -0
  238. package/dist/global-skills/firebase-basics/references/refresh/other-agents.md +67 -0
  239. package/dist/global-skills/firebase-basics/references/setup/android_studio.md +23 -0
  240. package/dist/global-skills/firebase-basics/references/setup/antigravity.md +98 -0
  241. package/dist/global-skills/firebase-basics/references/setup/claude_code.md +45 -0
  242. package/dist/global-skills/firebase-basics/references/setup/cursor.md +93 -0
  243. package/dist/global-skills/firebase-basics/references/setup/gemini_cli.md +53 -0
  244. package/dist/global-skills/firebase-basics/references/setup/github_copilot.md +104 -0
  245. package/dist/global-skills/firebase-basics/references/setup/other_agents.md +99 -0
  246. package/dist/global-skills/firebase-basics/references/web_setup.md +77 -0
  247. package/dist/global-skills/firebase-crashlytics/SKILL.md +42 -0
  248. package/dist/global-skills/firebase-crashlytics/references/android_setup.md +152 -0
  249. package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +115 -0
  250. package/dist/global-skills/firebase-data-connect/SKILL.md +191 -0
  251. package/dist/global-skills/firebase-data-connect/examples.md +638 -0
  252. package/dist/global-skills/firebase-data-connect/reference/cloud_functions.md +184 -0
  253. package/dist/global-skills/firebase-data-connect/reference/config.md +271 -0
  254. package/dist/global-skills/firebase-data-connect/reference/data_seeding.md +185 -0
  255. package/dist/global-skills/firebase-data-connect/reference/native_sql.md +170 -0
  256. package/dist/global-skills/firebase-data-connect/reference/operations.md +385 -0
  257. package/dist/global-skills/firebase-data-connect/reference/realtime.md +210 -0
  258. package/dist/global-skills/firebase-data-connect/reference/schema.md +290 -0
  259. package/dist/global-skills/firebase-data-connect/reference/sdk_admin_node.md +141 -0
  260. package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +126 -0
  261. package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +134 -0
  262. package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +157 -0
  263. package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +146 -0
  264. package/dist/global-skills/firebase-data-connect/reference/search.md +264 -0
  265. package/dist/global-skills/firebase-data-connect/reference/security.md +295 -0
  266. package/dist/global-skills/firebase-data-connect/templates.md +318 -0
  267. package/dist/global-skills/firebase-firestore/SKILL.md +89 -0
  268. package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +230 -0
  269. package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +66 -0
  270. package/dist/global-skills/firebase-firestore/references/enterprise/flutter_setup.md +180 -0
  271. package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +135 -0
  272. package/dist/global-skills/firebase-firestore/references/enterprise/ios_setup.md +189 -0
  273. package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +118 -0
  274. package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +138 -0
  275. package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +577 -0
  276. package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +127 -0
  277. package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +193 -0
  278. package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +176 -0
  279. package/dist/global-skills/firebase-firestore/references/standard/indexes.md +113 -0
  280. package/dist/global-skills/firebase-firestore/references/standard/ios_setup.md +174 -0
  281. package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +110 -0
  282. package/dist/global-skills/firebase-firestore/references/standard/security_rules.md +577 -0
  283. package/dist/global-skills/firebase-firestore/references/standard/web_sdk_usage.md +192 -0
  284. package/dist/global-skills/firebase-hosting-basics/SKILL.md +64 -0
  285. package/dist/global-skills/firebase-hosting-basics/references/configuration.md +115 -0
  286. package/dist/global-skills/firebase-hosting-basics/references/deploying.md +48 -0
  287. package/dist/global-skills/firebase-remote-config-basics/SKILL.md +124 -0
  288. package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +91 -0
  289. package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +89 -0
  290. package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +70 -0
  291. package/dist/global-skills/go-live/SKILL.md +90 -0
  292. package/dist/global-skills/harden/SKILL.md +101 -0
  293. package/dist/global-skills/instrument-feature-flags/SKILL.md +88 -0
  294. package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +3578 -0
  295. package/dist/global-skills/instrument-feature-flags/references/android.md +146 -0
  296. package/dist/global-skills/instrument-feature-flags/references/api.md +194 -0
  297. package/dist/global-skills/instrument-feature-flags/references/best-practices.md +231 -0
  298. package/dist/global-skills/instrument-feature-flags/references/django.md +263 -0
  299. package/dist/global-skills/instrument-feature-flags/references/dotnet.md +763 -0
  300. package/dist/global-skills/instrument-feature-flags/references/elixir.md +47 -0
  301. package/dist/global-skills/instrument-feature-flags/references/flask.md +131 -0
  302. package/dist/global-skills/instrument-feature-flags/references/flutter.md +212 -0
  303. package/dist/global-skills/instrument-feature-flags/references/go.md +208 -0
  304. package/dist/global-skills/instrument-feature-flags/references/ios.md +146 -0
  305. package/dist/global-skills/instrument-feature-flags/references/java.md +94 -0
  306. package/dist/global-skills/instrument-feature-flags/references/laravel.md +170 -0
  307. package/dist/global-skills/instrument-feature-flags/references/next-js.md +383 -0
  308. package/dist/global-skills/instrument-feature-flags/references/nodejs.md +216 -0
  309. package/dist/global-skills/instrument-feature-flags/references/php.md +187 -0
  310. package/dist/global-skills/instrument-feature-flags/references/python.md +191 -0
  311. package/dist/global-skills/instrument-feature-flags/references/react-native.md +166 -0
  312. package/dist/global-skills/instrument-feature-flags/references/react.md +302 -0
  313. package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +604 -0
  314. package/dist/global-skills/instrument-feature-flags/references/ruby.md +200 -0
  315. package/dist/global-skills/instrument-feature-flags/references/rust.md +222 -0
  316. package/dist/global-skills/instrument-feature-flags/references/usage.md +600 -0
  317. package/dist/global-skills/instrument-feature-flags/references/web.md +193 -0
  318. package/dist/global-skills/instrument-product-analytics/SKILL.md +139 -0
  319. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-android.md +1639 -0
  320. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-angular.md +944 -0
  321. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +1001 -0
  322. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +1004 -0
  323. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +720 -0
  324. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +810 -0
  325. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-django.md +1167 -0
  326. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-expo.md +1412 -0
  327. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-fastapi.md +1585 -0
  328. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-flask.md +1208 -0
  329. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-laravel.md +2267 -0
  330. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-app-router.md +712 -0
  331. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-pages-router.md +767 -0
  332. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-3-6.md +939 -0
  333. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-4.md +1078 -0
  334. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-php.md +527 -0
  335. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-python.md +481 -0
  336. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-native.md +1823 -0
  337. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-6.md +582 -0
  338. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-data.md +892 -0
  339. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-declarative.md +649 -0
  340. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-framework.md +1218 -0
  341. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-code-based.md +793 -0
  342. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-file-based.md +780 -0
  343. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +1320 -0
  344. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby.md +452 -0
  345. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-sveltekit.md +854 -0
  346. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-swift.md +665 -0
  347. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-tanstack-start.md +1199 -0
  348. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-vue-3.md +910 -0
  349. package/dist/global-skills/instrument-product-analytics/references/android.md +811 -0
  350. package/dist/global-skills/instrument-product-analytics/references/angular.md +376 -0
  351. package/dist/global-skills/instrument-product-analytics/references/astro.md +165 -0
  352. package/dist/global-skills/instrument-product-analytics/references/configuration.md +299 -0
  353. package/dist/global-skills/instrument-product-analytics/references/django.md +263 -0
  354. package/dist/global-skills/instrument-product-analytics/references/dotnet.md +763 -0
  355. package/dist/global-skills/instrument-product-analytics/references/elixir.md +414 -0
  356. package/dist/global-skills/instrument-product-analytics/references/flask.md +131 -0
  357. package/dist/global-skills/instrument-product-analytics/references/flutter.md +845 -0
  358. package/dist/global-skills/instrument-product-analytics/references/go.md +567 -0
  359. package/dist/global-skills/instrument-product-analytics/references/identify-users.md +272 -0
  360. package/dist/global-skills/instrument-product-analytics/references/ios.md +154 -0
  361. package/dist/global-skills/instrument-product-analytics/references/laravel.md +170 -0
  362. package/dist/global-skills/instrument-product-analytics/references/next-js.md +383 -0
  363. package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +244 -0
  364. package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +253 -0
  365. package/dist/global-skills/instrument-product-analytics/references/php.md +646 -0
  366. package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +1675 -0
  367. package/dist/global-skills/instrument-product-analytics/references/python.md +898 -0
  368. package/dist/global-skills/instrument-product-analytics/references/react-native.md +1338 -0
  369. package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +376 -0
  370. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +364 -0
  371. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +376 -0
  372. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +479 -0
  373. package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +604 -0
  374. package/dist/global-skills/instrument-product-analytics/references/ruby.md +759 -0
  375. package/dist/global-skills/instrument-product-analytics/references/svelte.md +234 -0
  376. package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +193 -0
  377. package/dist/global-skills/instrument-product-analytics/references/usage.md +600 -0
  378. package/dist/global-skills/instrument-product-analytics/references/vue-js.md +306 -0
  379. package/dist/global-skills/manifest.json +125 -0
  380. package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +284 -0
  381. package/dist/global-skills/mongodb-atlas-stream-processing/references/connection-configs.md +298 -0
  382. package/dist/global-skills/mongodb-atlas-stream-processing/references/development-workflow.md +304 -0
  383. package/dist/global-skills/mongodb-atlas-stream-processing/references/mcp-troubleshooting.md +55 -0
  384. package/dist/global-skills/mongodb-atlas-stream-processing/references/output-diagnostics.md +150 -0
  385. package/dist/global-skills/mongodb-atlas-stream-processing/references/pipeline-patterns.md +457 -0
  386. package/dist/global-skills/mongodb-atlas-stream-processing/references/sizing-and-parallelism.md +178 -0
  387. package/dist/global-skills/mongodb-connection/SKILL.md +201 -0
  388. package/dist/global-skills/mongodb-connection/references/monitoring-guide.md +191 -0
  389. package/dist/global-skills/mongodb-mcp-setup/SKILL.md +324 -0
  390. package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +195 -0
  391. package/dist/global-skills/mongodb-query-optimizer/SKILL.md +150 -0
  392. package/dist/global-skills/mongodb-query-optimizer/references/aggregation-optimization.md +210 -0
  393. package/dist/global-skills/mongodb-query-optimizer/references/antipattern-examples.md +74 -0
  394. package/dist/global-skills/mongodb-query-optimizer/references/core-indexing-principles.md +134 -0
  395. package/dist/global-skills/mongodb-query-optimizer/references/update-query-examples.md +39 -0
  396. package/dist/global-skills/mongodb-schema-design/SKILL.md +181 -0
  397. package/dist/global-skills/mongodb-schema-design/references/antipattern-excessive-lookups.md +84 -0
  398. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md +91 -0
  399. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md +95 -0
  400. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-model.md +91 -0
  401. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-size.md +226 -0
  402. package/dist/global-skills/mongodb-schema-design/references/fundamental-embed-vs-reference.md +418 -0
  403. package/dist/global-skills/mongodb-schema-design/references/fundamental-schema-validation.md +131 -0
  404. package/dist/global-skills/mongodb-schema-design/references/pattern-approximation.md +80 -0
  405. package/dist/global-skills/mongodb-schema-design/references/pattern-archive.md +143 -0
  406. package/dist/global-skills/mongodb-schema-design/references/pattern-attribute.md +77 -0
  407. package/dist/global-skills/mongodb-schema-design/references/pattern-bucket.md +102 -0
  408. package/dist/global-skills/mongodb-schema-design/references/pattern-computed.md +162 -0
  409. package/dist/global-skills/mongodb-schema-design/references/pattern-document-versioning.md +166 -0
  410. package/dist/global-skills/mongodb-schema-design/references/pattern-extended-reference.md +72 -0
  411. package/dist/global-skills/mongodb-schema-design/references/pattern-outlier.md +159 -0
  412. package/dist/global-skills/mongodb-schema-design/references/pattern-polymorphic.md +167 -0
  413. package/dist/global-skills/mongodb-schema-design/references/pattern-schema-versioning.md +273 -0
  414. package/dist/global-skills/mongodb-schema-design/references/pattern-time-series-collections.md +190 -0
  415. package/dist/global-skills/mongodb-schema-design/references/source-query-stats.md +123 -0
  416. package/dist/global-skills/mongodb-schema-design/references/source-slow-query-logs.md +63 -0
  417. package/dist/global-skills/mongodb-search-and-ai/SKILL.md +142 -0
  418. package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +697 -0
  419. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-indexing.md +584 -0
  420. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-querying.md +636 -0
  421. package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +746 -0
  422. package/dist/global-skills/native-data-fetching/SKILL.md +505 -0
  423. package/dist/global-skills/native-data-fetching/agents/openai.yaml +4 -0
  424. package/dist/global-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
  425. package/dist/global-skills/neon/SKILL.md +343 -0
  426. package/dist/global-skills/neon-ai-gateway/SKILL.md +236 -0
  427. package/dist/global-skills/neon-functions/SKILL.md +490 -0
  428. package/dist/global-skills/neon-functions/references/ai-sdk.md +139 -0
  429. package/dist/global-skills/neon-functions/references/hono-websockets.md +145 -0
  430. package/dist/global-skills/neon-functions/references/mastra-studio.md +127 -0
  431. package/dist/global-skills/neon-functions/references/mcp.md +137 -0
  432. package/dist/global-skills/neon-functions/references/sentry.md +131 -0
  433. package/dist/global-skills/neon-functions/references/sse.md +143 -0
  434. package/dist/global-skills/neon-object-storage/SKILL.md +197 -0
  435. package/dist/global-skills/neon-postgres/SKILL.md +376 -0
  436. package/dist/global-skills/neon-postgres-branches/SKILL.md +281 -0
  437. package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +247 -0
  438. package/dist/global-skills/onboarding/SKILL.md +101 -0
  439. package/dist/global-skills/plan-my-idea/SKILL.md +67 -0
  440. package/dist/global-skills/publish-app/SKILL.md +72 -0
  441. package/dist/global-skills/publish-extension/SKILL.md +47 -0
  442. package/dist/global-skills/resend/SKILL.md +294 -0
  443. package/dist/global-skills/resend/references/api-keys.md +98 -0
  444. package/dist/global-skills/resend/references/automations.md +228 -0
  445. package/dist/global-skills/resend/references/broadcasts.md +125 -0
  446. package/dist/global-skills/resend/references/contact-properties.md +111 -0
  447. package/dist/global-skills/resend/references/contacts.md +174 -0
  448. package/dist/global-skills/resend/references/domains.md +179 -0
  449. package/dist/global-skills/resend/references/events.md +119 -0
  450. package/dist/global-skills/resend/references/fetch-all-templates.mjs +37 -0
  451. package/dist/global-skills/resend/references/installation.md +142 -0
  452. package/dist/global-skills/resend/references/logs.md +161 -0
  453. package/dist/global-skills/resend/references/receiving.md +287 -0
  454. package/dist/global-skills/resend/references/segments.md +77 -0
  455. package/dist/global-skills/resend/references/sending/batch-email-examples.md +807 -0
  456. package/dist/global-skills/resend/references/sending/best-practices.md +453 -0
  457. package/dist/global-skills/resend/references/sending/email-management.md +135 -0
  458. package/dist/global-skills/resend/references/sending/overview.md +209 -0
  459. package/dist/global-skills/resend/references/sending/single-email-examples.md +470 -0
  460. package/dist/global-skills/resend/references/templates.md +202 -0
  461. package/dist/global-skills/resend/references/topics.md +104 -0
  462. package/dist/global-skills/resend/references/webhooks.md +317 -0
  463. package/dist/global-skills/reset-password/SKILL.md +59 -0
  464. package/dist/global-skills/save-data/SKILL.md +70 -0
  465. package/dist/global-skills/sentry-sdk-setup/SKILL.md +116 -0
  466. package/dist/global-skills/sentry-workflow/SKILL.md +32 -0
  467. package/dist/global-skills/setup-email/SKILL.md +69 -0
  468. package/dist/global-skills/setup-payments/SKILL.md +82 -0
  469. package/dist/global-skills/setup-sms/SKILL.md +51 -0
  470. package/dist/global-skills/sign-in-with-email-link/SKILL.md +53 -0
  471. package/dist/global-skills/sign-in-with-google/SKILL.md +68 -0
  472. package/dist/global-skills/sign-in-with-phone/SKILL.md +53 -0
  473. package/dist/global-skills/stripe-best-practices/SKILL.md +48 -0
  474. package/dist/global-skills/stripe-best-practices/references/billing.md +58 -0
  475. package/dist/global-skills/stripe-best-practices/references/connect.md +173 -0
  476. package/dist/global-skills/stripe-best-practices/references/payments.md +79 -0
  477. package/dist/global-skills/stripe-best-practices/references/security.md +109 -0
  478. package/dist/global-skills/stripe-best-practices/references/tax.md +37 -0
  479. package/dist/global-skills/stripe-best-practices/references/treasury.md +16 -0
  480. package/dist/global-skills/supabase/CHANGELOG.md +53 -0
  481. package/dist/global-skills/supabase/SKILL.md +145 -0
  482. package/dist/global-skills/supabase/assets/feedback-issue-template.md +17 -0
  483. package/dist/global-skills/supabase/references/skill-feedback.md +17 -0
  484. package/dist/global-skills/supabase-postgres-best-practices/CHANGELOG.md +43 -0
  485. package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +64 -0
  486. package/dist/global-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  487. package/dist/global-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  488. package/dist/global-skills/supabase-postgres-best-practices/references/_template.md +34 -0
  489. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  490. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  491. package/dist/global-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  492. package/dist/global-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  493. package/dist/global-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  494. package/dist/global-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  495. package/dist/global-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  496. package/dist/global-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  497. package/dist/global-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  498. package/dist/global-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  499. package/dist/global-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  500. package/dist/global-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  501. package/dist/global-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  502. package/dist/global-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  503. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  504. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  505. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  506. package/dist/global-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  507. package/dist/global-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  508. package/dist/global-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  509. package/dist/global-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  510. package/dist/global-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  511. package/dist/global-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  512. package/dist/global-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  513. package/dist/global-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  514. package/dist/global-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  515. package/dist/global-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  516. package/dist/global-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  517. package/dist/global-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  518. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  519. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  520. package/dist/global-skills/track-errors/SKILL.md +67 -0
  521. package/dist/global-skills/update-kit/SKILL.md +75 -0
  522. package/dist/global-skills/upgrading-expo/SKILL.md +134 -0
  523. package/dist/global-skills/upgrading-expo/agents/openai.yaml +4 -0
  524. package/dist/global-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
  525. package/dist/global-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
  526. package/dist/global-skills/upgrading-expo/references/native-tabs.md +124 -0
  527. package/dist/global-skills/upgrading-expo/references/new-architecture.md +79 -0
  528. package/dist/global-skills/upgrading-expo/references/react-19.md +79 -0
  529. package/dist/global-skills/upgrading-expo/references/react-compiler.md +59 -0
  530. package/dist/global-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
  531. package/dist/global-skills/use-dom/SKILL.md +417 -0
  532. package/dist/global-skills/use-dom/agents/openai.yaml +4 -0
  533. package/dist/global-skills/use-kit-mcp/SKILL.md +100 -0
  534. package/dist/global-skills/use-railway/SKILL.md +357 -0
  535. package/dist/global-skills/use-railway/references/analyze-db-mongo.md +84 -0
  536. package/dist/global-skills/use-railway/references/analyze-db-mysql.md +254 -0
  537. package/dist/global-skills/use-railway/references/analyze-db-postgres.md +479 -0
  538. package/dist/global-skills/use-railway/references/analyze-db-redis.md +208 -0
  539. package/dist/global-skills/use-railway/references/analyze-db.md +344 -0
  540. package/dist/global-skills/use-railway/references/configure.md +359 -0
  541. package/dist/global-skills/use-railway/references/deploy.md +225 -0
  542. package/dist/global-skills/use-railway/references/feature-flags.md +89 -0
  543. package/dist/global-skills/use-railway/references/iac.md +108 -0
  544. package/dist/global-skills/use-railway/references/operate.md +273 -0
  545. package/dist/global-skills/use-railway/references/request.md +262 -0
  546. package/dist/global-skills/use-railway/references/sandbox.md +167 -0
  547. package/dist/global-skills/use-railway/references/setup.md +364 -0
  548. package/dist/global-skills/use-railway/scripts/analyze-mongo.py +1549 -0
  549. package/dist/global-skills/use-railway/scripts/analyze-mysql.py +1195 -0
  550. package/dist/global-skills/use-railway/scripts/analyze-postgres.py +3058 -0
  551. package/dist/global-skills/use-railway/scripts/analyze-redis.py +1090 -0
  552. package/dist/global-skills/use-railway/scripts/dal.py +671 -0
  553. package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +170 -0
  554. package/dist/global-skills/use-railway/scripts/pg-extensions.py +370 -0
  555. package/dist/global-skills/use-railway/scripts/railway-api.sh +52 -0
  556. package/dist/global-skills/vercel-composition-patterns/AGENTS.md +946 -0
  557. package/dist/global-skills/vercel-composition-patterns/README.md +60 -0
  558. package/dist/global-skills/vercel-composition-patterns/SKILL.md +89 -0
  559. package/dist/global-skills/vercel-composition-patterns/metadata.json +11 -0
  560. package/dist/global-skills/vercel-composition-patterns/rules/_sections.md +29 -0
  561. package/dist/global-skills/vercel-composition-patterns/rules/_template.md +24 -0
  562. package/dist/global-skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  563. package/dist/global-skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  564. package/dist/global-skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  565. package/dist/global-skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  566. package/dist/global-skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  567. package/dist/global-skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  568. package/dist/global-skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  569. package/dist/global-skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  570. package/dist/global-skills/vercel-react-best-practices/AGENTS.md +3810 -0
  571. package/dist/global-skills/vercel-react-best-practices/README.md +123 -0
  572. package/dist/global-skills/vercel-react-best-practices/SKILL.md +149 -0
  573. package/dist/global-skills/vercel-react-best-practices/metadata.json +15 -0
  574. package/dist/global-skills/vercel-react-best-practices/rules/_sections.md +46 -0
  575. package/dist/global-skills/vercel-react-best-practices/rules/_template.md +28 -0
  576. package/dist/global-skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  577. package/dist/global-skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  578. package/dist/global-skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  579. package/dist/global-skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  580. package/dist/global-skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  581. package/dist/global-skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  582. package/dist/global-skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  583. package/dist/global-skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  584. package/dist/global-skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  585. package/dist/global-skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  586. package/dist/global-skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  587. package/dist/global-skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  588. package/dist/global-skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  589. package/dist/global-skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  590. package/dist/global-skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  591. package/dist/global-skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  592. package/dist/global-skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  593. package/dist/global-skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  594. package/dist/global-skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  595. package/dist/global-skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  596. package/dist/global-skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  597. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  598. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  599. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  600. package/dist/global-skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  601. package/dist/global-skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  602. package/dist/global-skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  603. package/dist/global-skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  604. package/dist/global-skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  605. package/dist/global-skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  606. package/dist/global-skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  607. package/dist/global-skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  608. package/dist/global-skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  609. package/dist/global-skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  610. package/dist/global-skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  611. package/dist/global-skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  612. package/dist/global-skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  613. package/dist/global-skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  614. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  615. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  616. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  617. package/dist/global-skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  618. package/dist/global-skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  619. package/dist/global-skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  620. package/dist/global-skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  621. package/dist/global-skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  622. package/dist/global-skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  623. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  624. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  625. package/dist/global-skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  626. package/dist/global-skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  627. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  628. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  629. package/dist/global-skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  630. package/dist/global-skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  631. package/dist/global-skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  632. package/dist/global-skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  633. package/dist/global-skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  634. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  635. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  636. package/dist/global-skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  637. package/dist/global-skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  638. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  639. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  640. package/dist/global-skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  641. package/dist/global-skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  642. package/dist/global-skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  643. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  644. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  645. package/dist/global-skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  646. package/dist/global-skills/web-to-native/SKILL.md +83 -0
  647. package/dist/global-skills/web-to-native/references/false-friends.md +119 -0
  648. package/dist/global-skills/web-to-native/references/native-patterns.md +39 -0
  649. package/dist/global-skills/web-to-native/references/run-as-goal.md +48 -0
  650. package/dist/global-skills/web-to-native/references/verify-on-device.md +45 -0
  651. package/dist/global-skills/wire-auth/SKILL.md +28 -0
  652. package/dist/global-skills/wire-database/SKILL.md +28 -0
  653. package/dist/global-skills/wire-email/SKILL.md +27 -0
  654. package/dist/global-skills/wire-payments/SKILL.md +27 -0
  655. package/dist/global-skills/workers-best-practices/SKILL.md +127 -0
  656. package/dist/global-skills/workers-best-practices/references/review.md +174 -0
  657. package/dist/global-skills/workers-best-practices/references/rules.md +463 -0
  658. package/dist/global-skills/wrangler/SKILL.md +922 -0
  659. package/dist/global-skills/xcode-project-setup/SKILL.md +140 -0
  660. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.resolved +41 -0
  661. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.swift +17 -0
  662. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +232 -0
  663. package/package.json +21 -20
  664. package/LICENSE.md +0 -47
  665. package/dist/index.js +0 -21593
@@ -0,0 +1,1412 @@
1
+ # PostHog expo Example Project
2
+
3
+ Repository: https://github.com/PostHog/context-mill
4
+ Path: example-apps/expo
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Burrito Consideration App (Expo)
11
+
12
+ A React Native Expo app demonstrating PostHog product analytics integration with modern React Native best practices.
13
+
14
+ ## Features
15
+
16
+ - **Product Analytics**: Full PostHog integration with event tracking
17
+ - **Autocapture**: Touch events and screen tracking
18
+ - **Error Tracking**: Manual exception capture with `captureException`
19
+ - **User Authentication**: Demo login with PostHog user identification
20
+ - **Session Persistence**: AsyncStorage for session management
21
+ - **Modern React**: React 19 with React Compiler for automatic memoization
22
+ - **File-based Routing**: Expo Router for navigation
23
+ - **New Architecture**: Enabled by default for better performance
24
+
25
+ ## Project Structure
26
+
27
+ ```
28
+ basics/expo/
29
+ ├── app/ # Expo Router screens (file-based routing)
30
+ │ ├── _layout.tsx # Root layout with PostHogProvider + AuthProvider
31
+ │ ├── index.tsx # Home screen (login/welcome)
32
+ │ ├── burrito.tsx # Burrito consideration screen
33
+ │ └── profile.tsx # User profile screen
34
+ ├── src/
35
+ │ ├── config/
36
+ │ │ └── posthog.ts # PostHog client configuration
37
+ │ ├── contexts/
38
+ │ │ └── AuthContext.tsx # Authentication context with PostHog
39
+ │ ├── services/
40
+ │ │ └── storage.ts # AsyncStorage wrapper
41
+ │ └── styles/
42
+ │ └── theme.ts # Shared style constants
43
+ ├── app.json # Expo configuration
44
+ ├── babel.config.js # Babel config with React Compiler
45
+ ├── eslint.config.js # ESLint flat config
46
+ ├── package.json # Dependencies
47
+ ├── tsconfig.json # TypeScript strict configuration
48
+ └── .env.example # Environment variables template
49
+ ```
50
+
51
+ ## Getting Started
52
+
53
+ ### Prerequisites
54
+
55
+ - Node.js 18+
56
+ - iOS: Xcode (for iOS Simulator)
57
+ - Android: Android Studio with emulator
58
+
59
+ **For Android builds:** Set environment variables (required):
60
+
61
+ Add to `~/.zshrc` or `~/.bashrc`:
62
+ ```bash
63
+ # Java from Android Studio (required for Gradle)
64
+ export JAVA_HOME="<path-to-android-studio-jdk>"
65
+
66
+ # Android SDK location
67
+ export ANDROID_HOME="$HOME/Library/Android/sdk"
68
+ ```
69
+
70
+ Examples:
71
+ - `export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"`
72
+ - `export ANDROID_HOME="$HOME/Library/Android/sdk"`
73
+
74
+ Then run `source ~/.zshrc` to apply.
75
+
76
+ ### Installation
77
+
78
+ 1. Install dependencies:
79
+ ```bash
80
+ cd basics/expo
81
+ npm install
82
+ ```
83
+
84
+ 2. Configure PostHog (optional):
85
+ ```bash
86
+ cp .env.example .env
87
+ # Edit .env with your PostHog project token
88
+ ```
89
+
90
+ 3. Start the development server:
91
+ ```bash
92
+ npx expo start
93
+ ```
94
+
95
+ ### Running the App
96
+
97
+ ```bash
98
+ # Start development server
99
+ npx expo start
100
+
101
+ # Run on iOS Simulator
102
+ npx expo run:ios
103
+
104
+ # Run on Android Emulator
105
+ npx expo run:android
106
+ ```
107
+
108
+ ## PostHog Integration
109
+
110
+ ### Configuration
111
+
112
+ PostHog is configured in `src/config/posthog.ts` using environment variables from `app.json`:
113
+
114
+ ```typescript
115
+ import Constants from 'expo-constants'
116
+
117
+ const projectToken = Constants.expoConfig?.extra?.posthogProjectToken
118
+ ```
119
+
120
+ ### Event Tracking
121
+
122
+ Events are captured with properties:
123
+
124
+ ```typescript
125
+ posthog.capture('burrito_considered', {
126
+ total_considerations: count,
127
+ username: user.username,
128
+ })
129
+ ```
130
+
131
+ ### User Identification
132
+
133
+ Users are identified on login:
134
+
135
+ ```typescript
136
+ posthog.identify(username, {
137
+ $set: { username },
138
+ $set_once: { first_login_date: new Date().toISOString() },
139
+ })
140
+ ```
141
+
142
+ ### Screen Tracking
143
+
144
+ Manual screen tracking with Expo Router:
145
+
146
+ ```typescript
147
+ useEffect(() => {
148
+ posthog.screen(pathname, {
149
+ previous_screen: previousPathname.current,
150
+ })
151
+ }, [pathname])
152
+ ```
153
+
154
+ ### Error Tracking
155
+
156
+ Manual exception capture:
157
+
158
+ ```typescript
159
+ posthog.captureException(error)
160
+ ```
161
+
162
+ ## Modern React Features
163
+
164
+ ### React Compiler
165
+
166
+ Automatic memoization is enabled via `babel-plugin-react-compiler`. No need for manual `useMemo`, `useCallback`, or `React.memo`.
167
+
168
+ ### React 19 `use` API
169
+
170
+ The `useAuth` hook uses the new `use` API for context:
171
+
172
+ ```typescript
173
+ export function useAuth() {
174
+ const context = use(AuthContext)
175
+ if (context === undefined) {
176
+ throw new Error('useAuth must be used within an AuthProvider')
177
+ }
178
+ return context
179
+ }
180
+ ```
181
+
182
+ ### New Architecture
183
+
184
+ Enabled in `app.json` for better performance:
185
+
186
+ ```json
187
+ {
188
+ "expo": {
189
+ "newArchEnabled": true
190
+ }
191
+ }
192
+ ```
193
+
194
+ ## Building for Production
195
+
196
+ Use EAS Build for production builds:
197
+
198
+ ```bash
199
+ # Install EAS CLI
200
+ npm install -g eas-cli
201
+
202
+ # Configure EAS
203
+ eas build:configure
204
+
205
+ # Build for iOS
206
+ eas build --platform ios
207
+
208
+ # Build for Android
209
+ eas build --platform android
210
+ ```
211
+
212
+ ## Performance Debugging
213
+
214
+ 1. Press `J` in Expo CLI to open Chrome DevTools
215
+ 2. Go to: **Profiler > [Gear icon] > "Highlight updates when components render"**
216
+ 3. Interact with your app to see which components re-render
217
+
218
+ ## Tech Stack
219
+
220
+ - **Expo SDK 54** - Managed workflow
221
+ - **React 19** - Latest React with Compiler support
222
+ - **React Native 0.81** - Latest stable
223
+ - **Expo Router 6** - File-based navigation
224
+ - **PostHog** - Product analytics
225
+ - **TypeScript** - Strict mode enabled
226
+ - **React Native Reanimated** - Smooth animations
227
+ - **React Native Gesture Handler** - Native gestures
228
+
229
+ ## License
230
+
231
+ MIT
232
+
233
+ ---
234
+
235
+ ## .env.example
236
+
237
+ ```example
238
+ POSTHOG_PROJECT_TOKEN=phc_your_project_token_here
239
+ POSTHOG_HOST=https://us.i.posthog.com
240
+
241
+ ```
242
+
243
+ ---
244
+
245
+ ## .npmrc
246
+
247
+ ```
248
+ legacy-peer-deps=true
249
+ min-release-age=7
250
+
251
+ ```
252
+
253
+ ---
254
+
255
+ ## app.config.js
256
+
257
+ ```js
258
+ export default {
259
+ expo: {
260
+ name: 'BurritoApp',
261
+ slug: 'burrito-app',
262
+ version: '1.0.0',
263
+ orientation: 'portrait',
264
+ icon: './assets/icon.png',
265
+ userInterfaceStyle: 'light',
266
+ newArchEnabled: true,
267
+ experiments: {
268
+ reactCompiler: true,
269
+ },
270
+ splash: {
271
+ image: './assets/splash-icon.png',
272
+ resizeMode: 'contain',
273
+ backgroundColor: '#333333',
274
+ },
275
+ ios: {
276
+ supportsTablet: true,
277
+ bundleIdentifier: 'com.posthog.burritoapp',
278
+ },
279
+ android: {
280
+ adaptiveIcon: {
281
+ foregroundImage: './assets/adaptive-icon.png',
282
+ backgroundColor: '#333333',
283
+ },
284
+ package: 'com.posthog.burritoapp',
285
+ edgeToEdgeEnabled: true,
286
+ },
287
+ web: {
288
+ favicon: './assets/favicon.png',
289
+ },
290
+ scheme: 'burritoapp',
291
+ extra: {
292
+ posthogProjectToken: process.env.POSTHOG_PROJECT_TOKEN,
293
+ posthogHost: process.env.POSTHOG_HOST || 'https://us.i.posthog.com',
294
+ },
295
+ plugins: ['expo-router', 'expo-localization'],
296
+ },
297
+ }
298
+
299
+ ```
300
+
301
+ ---
302
+
303
+ ## app/_layout.tsx
304
+
305
+ ```tsx
306
+ import { Stack, usePathname, useGlobalSearchParams } from 'expo-router'
307
+ import { useEffect, useRef } from 'react'
308
+ import { StatusBar } from 'expo-status-bar'
309
+ import { PostHogProvider } from 'posthog-react-native'
310
+ import { SafeAreaProvider } from 'react-native-safe-area-context'
311
+ import { GestureHandlerRootView } from 'react-native-gesture-handler'
312
+
313
+ import { AuthProvider } from '../src/contexts/AuthContext'
314
+ import { posthog } from '../src/config/posthog'
315
+ import { colors } from '../src/styles/theme'
316
+
317
+ export default function RootLayout() {
318
+ const pathname = usePathname()
319
+ const params = useGlobalSearchParams()
320
+ const previousPathname = useRef<string | undefined>(undefined)
321
+
322
+ // Manual screen tracking for Expo Router
323
+ // @see https://docs.expo.dev/router/reference/screen-tracking/
324
+ // React Compiler will auto-optimize this effect
325
+ useEffect(() => {
326
+ if (previousPathname.current !== pathname) {
327
+ posthog.screen(pathname, {
328
+ previous_screen: previousPathname.current ?? null,
329
+ // Include route params for analytics (filter sensitive data if needed)
330
+ ...params,
331
+ })
332
+ previousPathname.current = pathname
333
+ }
334
+ }, [pathname, params])
335
+
336
+ return (
337
+ <GestureHandlerRootView style={{ flex: 1 }}>
338
+ <SafeAreaProvider>
339
+ <StatusBar style="light" backgroundColor={colors.headerBackground} />
340
+ <PostHogProvider
341
+ client={posthog}
342
+ autocapture={{
343
+ captureScreens: false, // Manual tracking with Expo Router
344
+ captureTouches: true,
345
+ propsToCapture: ['testID'],
346
+ maxElementsCaptured: 20,
347
+ }}
348
+ >
349
+ <AuthProvider>
350
+ <Stack
351
+ screenOptions={{
352
+ headerStyle: { backgroundColor: colors.headerBackground },
353
+ headerTintColor: colors.headerText,
354
+ headerTitleStyle: { fontWeight: 'bold' },
355
+ animation: 'slide_from_right',
356
+ }}
357
+ >
358
+ <Stack.Screen name="index" options={{ title: 'Burrito App' }} />
359
+ <Stack.Screen name="burrito" options={{ title: 'Burrito Consideration' }} />
360
+ <Stack.Screen name="profile" options={{ title: 'Profile' }} />
361
+ </Stack>
362
+ </AuthProvider>
363
+ </PostHogProvider>
364
+ </SafeAreaProvider>
365
+ </GestureHandlerRootView>
366
+ )
367
+ }
368
+
369
+ ```
370
+
371
+ ---
372
+
373
+ ## app/burrito.tsx
374
+
375
+ ```tsx
376
+ import { useState, useEffect } from 'react'
377
+ import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
378
+ import { useRouter } from 'expo-router'
379
+ import { usePostHog } from 'posthog-react-native'
380
+ import { useAuth } from '../src/contexts/AuthContext'
381
+ import { colors, spacing, typography, borderRadius, shadows } from '../src/styles/theme'
382
+
383
+ /**
384
+ * Burrito Consideration Screen
385
+ *
386
+ * Demonstrates PostHog event tracking with custom properties.
387
+ * Each time the user considers a burrito, an event is captured.
388
+ *
389
+ * @see https://posthog.com/docs/libraries/react-native#capturing-events
390
+ */
391
+ export default function BurritoScreen() {
392
+ const { user, incrementBurritoConsiderations } = useAuth()
393
+ const router = useRouter()
394
+ const posthog = usePostHog()
395
+ const [hasConsidered, setHasConsidered] = useState(false)
396
+
397
+ // Redirect to home if not logged in
398
+ useEffect(() => {
399
+ if (!user) {
400
+ router.replace('/')
401
+ }
402
+ }, [user, router])
403
+
404
+ if (!user) {
405
+ return null
406
+ }
407
+
408
+ const handleConsideration = async () => {
409
+ const newCount = user.burritoConsiderations + 1
410
+
411
+ // Update state first for immediate feedback
412
+ await incrementBurritoConsiderations()
413
+ setHasConsidered(true)
414
+
415
+ // Hide success message after 2 seconds
416
+ setTimeout(() => setHasConsidered(false), 2000)
417
+
418
+ // Capture custom event in PostHog with properties
419
+ // We recommend using a [object] [verb] format for event names
420
+ // @see https://posthog.com/docs/libraries/react-native#capturing-events
421
+ posthog.capture('burrito_considered', {
422
+ total_considerations: newCount,
423
+ username: user.username,
424
+ })
425
+ }
426
+
427
+ return (
428
+ <View style={styles.container}>
429
+ <View style={styles.card}>
430
+ <Text style={styles.title}>Burrito Consideration Zone</Text>
431
+ <Text style={styles.text}>
432
+ Take a moment to truly consider the potential of burritos.
433
+ </Text>
434
+
435
+ {/*
436
+ testID is captured by PostHog autocapture for touch events
437
+ This helps identify the button in analytics
438
+ @see https://posthog.com/docs/libraries/react-native#autocapture
439
+ */}
440
+ <TouchableOpacity
441
+ style={styles.burritoButton}
442
+ onPress={handleConsideration}
443
+ activeOpacity={0.8}
444
+ testID="consider-burrito-button"
445
+ >
446
+ <Text style={styles.burritoButtonText}>Consider Burrito</Text>
447
+ </TouchableOpacity>
448
+
449
+ {hasConsidered && (
450
+ <View style={styles.successContainer}>
451
+ <Text style={styles.success}>Thank you for your consideration!</Text>
452
+ <Text style={styles.successCount}>Count: {user.burritoConsiderations}</Text>
453
+ </View>
454
+ )}
455
+
456
+ <View style={styles.stats}>
457
+ <Text style={styles.statsTitle}>Consideration Stats</Text>
458
+ <Text style={styles.statsText}>Total considerations: {user.burritoConsiderations}</Text>
459
+ </View>
460
+ </View>
461
+ </View>
462
+ )
463
+ }
464
+
465
+ const styles = StyleSheet.create({
466
+ container: {
467
+ flex: 1,
468
+ backgroundColor: colors.background,
469
+ padding: spacing.md,
470
+ },
471
+ card: {
472
+ backgroundColor: colors.cardBackground,
473
+ borderRadius: borderRadius.md,
474
+ padding: spacing.lg,
475
+ ...shadows.md,
476
+ },
477
+ title: {
478
+ fontSize: typography.sizes.xl,
479
+ fontWeight: typography.weights.bold,
480
+ color: colors.text,
481
+ marginBottom: spacing.sm,
482
+ },
483
+ text: {
484
+ fontSize: typography.sizes.md,
485
+ color: colors.text,
486
+ marginBottom: spacing.lg,
487
+ lineHeight: 24,
488
+ },
489
+ burritoButton: {
490
+ backgroundColor: colors.burrito,
491
+ borderRadius: borderRadius.sm,
492
+ padding: spacing.lg,
493
+ alignItems: 'center',
494
+ marginVertical: spacing.md,
495
+ ...shadows.sm,
496
+ },
497
+ burritoButtonText: {
498
+ color: colors.white,
499
+ fontSize: typography.sizes.lg,
500
+ fontWeight: typography.weights.bold,
501
+ },
502
+ successContainer: {
503
+ alignItems: 'center',
504
+ marginVertical: spacing.sm,
505
+ },
506
+ success: {
507
+ color: colors.success,
508
+ fontSize: typography.sizes.md,
509
+ fontWeight: typography.weights.medium,
510
+ },
511
+ successCount: {
512
+ color: colors.success,
513
+ fontSize: typography.sizes.lg,
514
+ fontWeight: typography.weights.bold,
515
+ marginTop: spacing.xs,
516
+ },
517
+ stats: {
518
+ backgroundColor: colors.statsBackground,
519
+ padding: spacing.md,
520
+ borderRadius: borderRadius.sm,
521
+ marginTop: spacing.lg,
522
+ },
523
+ statsTitle: {
524
+ fontSize: typography.sizes.lg,
525
+ fontWeight: typography.weights.semibold,
526
+ color: colors.text,
527
+ marginBottom: spacing.xs,
528
+ },
529
+ statsText: {
530
+ fontSize: typography.sizes.md,
531
+ color: colors.text,
532
+ },
533
+ })
534
+
535
+ ```
536
+
537
+ ---
538
+
539
+ ## app/index.tsx
540
+
541
+ ```tsx
542
+ import { useState } from 'react'
543
+ import {
544
+ View,
545
+ Text,
546
+ TextInput,
547
+ TouchableOpacity,
548
+ StyleSheet,
549
+ ScrollView,
550
+ KeyboardAvoidingView,
551
+ Platform,
552
+ } from 'react-native'
553
+ import { useRouter } from 'expo-router'
554
+ import { useAuth } from '../src/contexts/AuthContext'
555
+ import { colors, spacing, typography, borderRadius, shadows } from '../src/styles/theme'
556
+
557
+ export default function HomeScreen() {
558
+ const { user, login, logout } = useAuth()
559
+ const router = useRouter()
560
+ const [username, setUsername] = useState('')
561
+ const [password, setPassword] = useState('')
562
+ const [error, setError] = useState('')
563
+ const [isSubmitting, setIsSubmitting] = useState(false)
564
+
565
+ const handleSubmit = async () => {
566
+ setError('')
567
+
568
+ if (!username.trim() || !password.trim()) {
569
+ setError('Please provide both username and password')
570
+ return
571
+ }
572
+
573
+ setIsSubmitting(true)
574
+ try {
575
+ const success = await login(username, password)
576
+ if (success) {
577
+ setUsername('')
578
+ setPassword('')
579
+ } else {
580
+ setError('An error occurred during login')
581
+ }
582
+ } catch {
583
+ setError('An error occurred during login')
584
+ } finally {
585
+ setIsSubmitting(false)
586
+ }
587
+ }
588
+
589
+ // Logged in view
590
+ if (user) {
591
+ return (
592
+ <ScrollView style={styles.scrollView} contentContainerStyle={styles.scrollContent}>
593
+ <View style={styles.card}>
594
+ <Text style={styles.title}>Welcome back, {user.username}!</Text>
595
+ <Text style={styles.text}>You are logged in. Feel free to explore:</Text>
596
+
597
+ <View style={styles.buttonGroup}>
598
+ <TouchableOpacity
599
+ style={[styles.button, styles.burritoButton]}
600
+ onPress={() => router.push('/burrito')}
601
+ activeOpacity={0.8}
602
+ >
603
+ <Text style={styles.buttonText}>Consider Burritos</Text>
604
+ </TouchableOpacity>
605
+
606
+ <TouchableOpacity
607
+ style={[styles.button, styles.primaryButton]}
608
+ onPress={() => router.push('/profile')}
609
+ activeOpacity={0.8}
610
+ >
611
+ <Text style={styles.buttonText}>View Profile</Text>
612
+ </TouchableOpacity>
613
+
614
+ <TouchableOpacity
615
+ style={[styles.button, styles.logoutButton]}
616
+ onPress={logout}
617
+ activeOpacity={0.8}
618
+ >
619
+ <Text style={styles.buttonText}>Logout</Text>
620
+ </TouchableOpacity>
621
+ </View>
622
+ </View>
623
+ </ScrollView>
624
+ )
625
+ }
626
+
627
+ // Login view
628
+ return (
629
+ <KeyboardAvoidingView
630
+ style={styles.container}
631
+ behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
632
+ >
633
+ <ScrollView
634
+ style={styles.scrollView}
635
+ contentContainerStyle={styles.scrollContent}
636
+ keyboardShouldPersistTaps="handled"
637
+ >
638
+ <View style={styles.card}>
639
+ <Text style={styles.title}>Welcome to Burrito Consideration App</Text>
640
+ <Text style={styles.text}>Please sign in to begin your burrito journey</Text>
641
+
642
+ <View style={styles.form}>
643
+ <Text style={styles.label}>Username:</Text>
644
+ <TextInput
645
+ style={styles.input}
646
+ value={username}
647
+ onChangeText={setUsername}
648
+ placeholder="Enter any username"
649
+ placeholderTextColor={colors.textLight}
650
+ autoCapitalize="none"
651
+ autoCorrect={false}
652
+ autoComplete="username"
653
+ editable={!isSubmitting}
654
+ />
655
+
656
+ <Text style={styles.label}>Password:</Text>
657
+ <TextInput
658
+ style={styles.input}
659
+ value={password}
660
+ onChangeText={setPassword}
661
+ placeholder="Enter any password"
662
+ placeholderTextColor={colors.textLight}
663
+ secureTextEntry
664
+ autoComplete="password"
665
+ editable={!isSubmitting}
666
+ />
667
+
668
+ {error ? <Text style={styles.error}>{error}</Text> : null}
669
+
670
+ <TouchableOpacity
671
+ style={[styles.button, styles.primaryButton, isSubmitting && styles.buttonDisabled]}
672
+ onPress={handleSubmit}
673
+ disabled={isSubmitting}
674
+ activeOpacity={0.8}
675
+ >
676
+ <Text style={styles.buttonText}>{isSubmitting ? 'Signing In...' : 'Sign In'}</Text>
677
+ </TouchableOpacity>
678
+ </View>
679
+
680
+ <Text style={styles.note}>
681
+ Note: This is a demo app. Use any username and password to sign in.
682
+ </Text>
683
+ </View>
684
+ </ScrollView>
685
+ </KeyboardAvoidingView>
686
+ )
687
+ }
688
+
689
+ const styles = StyleSheet.create({
690
+ container: {
691
+ flex: 1,
692
+ backgroundColor: colors.background,
693
+ },
694
+ scrollView: {
695
+ flex: 1,
696
+ backgroundColor: colors.background,
697
+ },
698
+ scrollContent: {
699
+ flexGrow: 1,
700
+ padding: spacing.md,
701
+ justifyContent: 'center',
702
+ },
703
+ card: {
704
+ backgroundColor: colors.cardBackground,
705
+ borderRadius: borderRadius.md,
706
+ padding: spacing.lg,
707
+ ...shadows.md,
708
+ },
709
+ title: {
710
+ fontSize: typography.sizes.xl,
711
+ fontWeight: typography.weights.bold,
712
+ color: colors.text,
713
+ marginBottom: spacing.sm,
714
+ },
715
+ text: {
716
+ fontSize: typography.sizes.md,
717
+ color: colors.text,
718
+ marginBottom: spacing.md,
719
+ lineHeight: 24,
720
+ },
721
+ form: {
722
+ marginTop: spacing.md,
723
+ },
724
+ label: {
725
+ fontSize: typography.sizes.md,
726
+ fontWeight: typography.weights.medium,
727
+ color: colors.text,
728
+ marginBottom: spacing.xs,
729
+ },
730
+ input: {
731
+ backgroundColor: colors.inputBackground,
732
+ borderWidth: 1,
733
+ borderColor: colors.border,
734
+ borderRadius: borderRadius.sm,
735
+ padding: spacing.sm,
736
+ fontSize: typography.sizes.md,
737
+ color: colors.text,
738
+ marginBottom: spacing.md,
739
+ },
740
+ buttonGroup: {
741
+ marginTop: spacing.md,
742
+ gap: spacing.sm,
743
+ },
744
+ button: {
745
+ borderRadius: borderRadius.sm,
746
+ padding: spacing.md,
747
+ alignItems: 'center',
748
+ marginTop: spacing.sm,
749
+ },
750
+ primaryButton: {
751
+ backgroundColor: colors.primary,
752
+ },
753
+ burritoButton: {
754
+ backgroundColor: colors.burrito,
755
+ },
756
+ logoutButton: {
757
+ backgroundColor: colors.danger,
758
+ },
759
+ buttonDisabled: {
760
+ opacity: 0.6,
761
+ },
762
+ buttonText: {
763
+ color: colors.white,
764
+ fontSize: typography.sizes.md,
765
+ fontWeight: typography.weights.semibold,
766
+ },
767
+ error: {
768
+ color: colors.danger,
769
+ marginBottom: spacing.sm,
770
+ fontSize: typography.sizes.sm,
771
+ },
772
+ note: {
773
+ marginTop: spacing.lg,
774
+ color: colors.textSecondary,
775
+ fontSize: typography.sizes.sm,
776
+ textAlign: 'center',
777
+ lineHeight: 20,
778
+ },
779
+ })
780
+
781
+ ```
782
+
783
+ ---
784
+
785
+ ## app/profile.tsx
786
+
787
+ ```tsx
788
+ import { useEffect } from 'react'
789
+ import { View, Text, TouchableOpacity, StyleSheet, Alert } from 'react-native'
790
+ import { useRouter } from 'expo-router'
791
+ import { usePostHog } from 'posthog-react-native'
792
+ import { useAuth } from '../src/contexts/AuthContext'
793
+ import { colors, spacing, typography, borderRadius, shadows } from '../src/styles/theme'
794
+
795
+ /**
796
+ * Profile Screen
797
+ *
798
+ * Displays user information and demonstrates PostHog error tracking.
799
+ * The test error button shows how to capture exceptions manually.
800
+ *
801
+ * @see https://posthog.com/docs/libraries/react-native#error-tracking
802
+ */
803
+ export default function ProfileScreen() {
804
+ const { user } = useAuth()
805
+ const router = useRouter()
806
+ const posthog = usePostHog()
807
+
808
+ // Redirect to home if not logged in
809
+ useEffect(() => {
810
+ if (!user) {
811
+ router.replace('/')
812
+ }
813
+ }, [user, router])
814
+
815
+ if (!user) {
816
+ return null
817
+ }
818
+
819
+ /**
820
+ * Triggers a test error and captures it in PostHog
821
+ *
822
+ * This demonstrates manual exception capture via captureException.
823
+ * In production, you would typically set up automatic exception capture
824
+ * or use the before_send callback for customization.
825
+ *
826
+ * @see https://posthog.com/docs/libraries/react-native#error-tracking
827
+ */
828
+ const triggerTestError = () => {
829
+ try {
830
+ throw new Error('Test error for PostHog error tracking')
831
+ } catch (err) {
832
+ const error = err as Error
833
+
834
+ // @see https://posthog.com/docs/error-tracking
835
+ posthog.captureException(error, {
836
+ username: user.username,
837
+ screen: 'Profile',
838
+ })
839
+
840
+ console.error('Captured error:', error)
841
+ Alert.alert('Error Captured', 'The test error has been sent to PostHog!', [{ text: 'OK' }])
842
+ }
843
+ }
844
+
845
+ const getJourneyMessage = () => {
846
+ const count = user.burritoConsiderations
847
+ if (count === 0) {
848
+ return "You haven't considered any burritos yet. Visit the Burrito Consideration page to start!"
849
+ } else if (count === 1) {
850
+ return "You've considered the burrito potential once. Keep going!"
851
+ } else if (count < 5) {
852
+ return "You're getting the hang of burrito consideration!"
853
+ } else if (count < 10) {
854
+ return "You're becoming a burrito consideration expert!"
855
+ } else {
856
+ return 'You are a true burrito consideration master!'
857
+ }
858
+ }
859
+
860
+ return (
861
+ <View style={styles.container}>
862
+ <View style={styles.card}>
863
+ <Text style={styles.title}>User Profile</Text>
864
+
865
+ <View style={styles.stats}>
866
+ <Text style={styles.statsTitle}>Your Information</Text>
867
+ <View style={styles.infoRow}>
868
+ <Text style={styles.infoLabel}>Username:</Text>
869
+ <Text style={styles.infoValue}>{user.username}</Text>
870
+ </View>
871
+ <View style={styles.infoRow}>
872
+ <Text style={styles.infoLabel}>Burrito Considerations:</Text>
873
+ <Text style={styles.infoValue}>{user.burritoConsiderations}</Text>
874
+ </View>
875
+ </View>
876
+
877
+ {/*
878
+ testID is captured by PostHog autocapture for touch events
879
+ @see https://posthog.com/docs/libraries/react-native#autocapture
880
+ */}
881
+ <TouchableOpacity
882
+ style={styles.errorButton}
883
+ onPress={triggerTestError}
884
+ activeOpacity={0.8}
885
+ testID="trigger-error-button"
886
+ >
887
+ <Text style={styles.buttonText}>Trigger Test Error (for PostHog)</Text>
888
+ </TouchableOpacity>
889
+
890
+ <View style={styles.journey}>
891
+ <Text style={styles.journeyTitle}>Your Burrito Journey</Text>
892
+ <Text style={styles.journeyText}>{getJourneyMessage()}</Text>
893
+ </View>
894
+ </View>
895
+ </View>
896
+ )
897
+ }
898
+
899
+ const styles = StyleSheet.create({
900
+ container: {
901
+ flex: 1,
902
+ backgroundColor: colors.background,
903
+ padding: spacing.md,
904
+ },
905
+ card: {
906
+ backgroundColor: colors.cardBackground,
907
+ borderRadius: borderRadius.md,
908
+ padding: spacing.lg,
909
+ ...shadows.md,
910
+ },
911
+ title: {
912
+ fontSize: typography.sizes.xl,
913
+ fontWeight: typography.weights.bold,
914
+ color: colors.text,
915
+ marginBottom: spacing.md,
916
+ },
917
+ stats: {
918
+ backgroundColor: colors.statsBackground,
919
+ padding: spacing.md,
920
+ borderRadius: borderRadius.sm,
921
+ },
922
+ statsTitle: {
923
+ fontSize: typography.sizes.lg,
924
+ fontWeight: typography.weights.semibold,
925
+ color: colors.text,
926
+ marginBottom: spacing.sm,
927
+ },
928
+ infoRow: {
929
+ flexDirection: 'row',
930
+ marginBottom: spacing.xs,
931
+ },
932
+ infoLabel: {
933
+ fontSize: typography.sizes.md,
934
+ fontWeight: typography.weights.bold,
935
+ color: colors.text,
936
+ marginRight: spacing.xs,
937
+ },
938
+ infoValue: {
939
+ fontSize: typography.sizes.md,
940
+ color: colors.text,
941
+ },
942
+ errorButton: {
943
+ backgroundColor: colors.danger,
944
+ borderRadius: borderRadius.sm,
945
+ padding: spacing.md,
946
+ alignItems: 'center',
947
+ marginTop: spacing.lg,
948
+ },
949
+ buttonText: {
950
+ color: colors.white,
951
+ fontSize: typography.sizes.md,
952
+ fontWeight: typography.weights.semibold,
953
+ },
954
+ journey: {
955
+ marginTop: spacing.lg,
956
+ },
957
+ journeyTitle: {
958
+ fontSize: typography.sizes.lg,
959
+ fontWeight: typography.weights.semibold,
960
+ color: colors.text,
961
+ marginBottom: spacing.sm,
962
+ },
963
+ journeyText: {
964
+ fontSize: typography.sizes.md,
965
+ color: colors.text,
966
+ lineHeight: 24,
967
+ },
968
+ })
969
+
970
+ ```
971
+
972
+ ---
973
+
974
+ ## babel.config.js
975
+
976
+ ```js
977
+ module.exports = function (api) {
978
+ api.cache(true)
979
+ return {
980
+ presets: ['babel-preset-expo'],
981
+ plugins: [
982
+ ['babel-plugin-react-compiler'],
983
+ 'react-native-reanimated/plugin', // Must be last
984
+ ],
985
+ }
986
+ }
987
+
988
+ ```
989
+
990
+ ---
991
+
992
+ ## src/config/posthog.ts
993
+
994
+ ```ts
995
+ import PostHog from 'posthog-react-native'
996
+ import Constants from 'expo-constants'
997
+
998
+ // Configuration loaded from app.config.js extras via expo-constants
999
+ // Environment variables are read at build time in app.config.js
1000
+ const projectToken = Constants.expoConfig?.extra?.posthogProjectToken as string | undefined
1001
+ const host = (Constants.expoConfig?.extra?.posthogHost as string) || 'https://us.i.posthog.com'
1002
+ const isPostHogConfigured = projectToken && projectToken !== 'phc_your_project_token_here'
1003
+
1004
+ if (__DEV__) {
1005
+ console.log('PostHog config:', {
1006
+ projectToken: projectToken ? `SET` : 'NOT SET',
1007
+ host,
1008
+ isConfigured: isPostHogConfigured,
1009
+ })
1010
+ }
1011
+
1012
+ if (!isPostHogConfigured) {
1013
+ console.warn(
1014
+ 'PostHog project token not configured. Analytics will be disabled. ' +
1015
+ 'Set POSTHOG_PROJECT_TOKEN in your .env file to enable analytics.'
1016
+ )
1017
+ }
1018
+
1019
+ /**
1020
+ * PostHog client instance for Expo
1021
+ *
1022
+ * Configuration loaded from app.config.js extras via expo-constants.
1023
+ * Required peer dependencies: expo-file-system, expo-application,
1024
+ * expo-device, expo-localization
1025
+ *
1026
+ * For React Native Web targets, use @react-native-async-storage/async-storage
1027
+ * instead of expo-file-system (Web and macOS targets not supported by expo-file-system).
1028
+ *
1029
+ * @see https://posthog.com/docs/libraries/react-native
1030
+ */
1031
+ export const posthog = new PostHog(projectToken || 'placeholder_key', {
1032
+ // PostHog API host
1033
+ host,
1034
+
1035
+ // Enable PostHog only when a project token is configured
1036
+ disabled: !isPostHogConfigured,
1037
+
1038
+ // Capture app lifecycle events:
1039
+ // - Application Installed, Application Updated
1040
+ // - Application Opened, Application Became Active, Application Backgrounded
1041
+ captureAppLifecycleEvents: true,
1042
+
1043
+ // Enable debug mode in development for verbose logging
1044
+ debug: __DEV__,
1045
+
1046
+ // Batching: queue events and flush periodically to optimize battery usage
1047
+ flushAt: 20, // Number of events to queue before sending
1048
+ flushInterval: 10000, // Interval in ms between periodic flushes
1049
+ maxBatchSize: 100, // Maximum events per batch
1050
+ maxQueueSize: 1000, // Maximum queued events (oldest dropped when full)
1051
+
1052
+ // Feature flags
1053
+ preloadFeatureFlags: true, // Load flags on initialization
1054
+ sendFeatureFlagEvent: true, // Track getFeatureFlag calls for experiments
1055
+ featureFlagsRequestTimeoutMs: 10000, // Timeout for flag requests (prevents blocking)
1056
+
1057
+ // Network settings
1058
+ requestTimeout: 10000, // General request timeout in ms
1059
+ fetchRetryCount: 3, // Number of retry attempts for failed requests
1060
+ fetchRetryDelay: 3000, // Delay between retries in ms
1061
+ })
1062
+
1063
+ export const isPostHogEnabled = isPostHogConfigured
1064
+
1065
+ ```
1066
+
1067
+ ---
1068
+
1069
+ ## src/contexts/AuthContext.tsx
1070
+
1071
+ ```tsx
1072
+ import React, { createContext, useState, useEffect, use } from 'react'
1073
+ import type { ReactNode } from 'react'
1074
+ import { usePostHog } from 'posthog-react-native'
1075
+ import { storage } from '../services/storage'
1076
+ import type { User } from '../services/storage'
1077
+
1078
+ interface AuthContextType {
1079
+ user: User | null
1080
+ isLoading: boolean
1081
+ login: (username: string, password: string) => Promise<boolean>
1082
+ logout: () => Promise<void>
1083
+ incrementBurritoConsiderations: () => Promise<void>
1084
+ }
1085
+
1086
+ const AuthContext = createContext<AuthContextType | undefined>(undefined)
1087
+
1088
+ interface AuthProviderProps {
1089
+ children: ReactNode
1090
+ }
1091
+
1092
+ export function AuthProvider({ children }: AuthProviderProps) {
1093
+ const posthog = usePostHog()
1094
+ const [user, setUser] = useState<User | null>(null)
1095
+ const [isLoading, setIsLoading] = useState(true)
1096
+
1097
+ useEffect(() => {
1098
+ const restoreSession = async () => {
1099
+ try {
1100
+ const storedUsername = await storage.getCurrentUser()
1101
+ if (storedUsername) {
1102
+ const existingUser = await storage.getUser(storedUsername)
1103
+ if (existingUser) {
1104
+ setUser(existingUser)
1105
+ posthog.identify(storedUsername, {
1106
+ $set: { username: storedUsername },
1107
+ })
1108
+ }
1109
+ }
1110
+ } catch (error) {
1111
+ console.error('Failed to restore session:', error)
1112
+ } finally {
1113
+ setIsLoading(false)
1114
+ }
1115
+ }
1116
+ restoreSession()
1117
+ }, [posthog])
1118
+
1119
+ // React Compiler auto-memoizes these callbacks - no useCallback needed!
1120
+ const login = async (username: string, password: string): Promise<boolean> => {
1121
+ if (!username.trim() || !password.trim()) {
1122
+ return false
1123
+ }
1124
+
1125
+ try {
1126
+ const existingUser = await storage.getUser(username)
1127
+ const isNewUser = !existingUser
1128
+
1129
+ const userData: User = existingUser || {
1130
+ username,
1131
+ burritoConsiderations: 0,
1132
+ }
1133
+
1134
+ await storage.saveUser(userData)
1135
+ await storage.setCurrentUser(username)
1136
+ setUser(userData)
1137
+
1138
+ posthog.identify(username, {
1139
+ $set: { username },
1140
+ $set_once: { first_login_date: new Date().toISOString() },
1141
+ })
1142
+
1143
+ posthog.capture('user_logged_in', {
1144
+ username,
1145
+ is_new_user: isNewUser,
1146
+ })
1147
+
1148
+ return true
1149
+ } catch (error) {
1150
+ console.error('Login error:', error)
1151
+ return false
1152
+ }
1153
+ }
1154
+
1155
+ const logout = async () => {
1156
+ posthog.capture('user_logged_out')
1157
+ posthog.reset()
1158
+ await storage.removeCurrentUser()
1159
+ setUser(null)
1160
+ }
1161
+
1162
+ const incrementBurritoConsiderations = async () => {
1163
+ if (user) {
1164
+ const updatedUser: User = {
1165
+ ...user,
1166
+ burritoConsiderations: user.burritoConsiderations + 1,
1167
+ }
1168
+ setUser(updatedUser)
1169
+ await storage.saveUser(updatedUser)
1170
+ }
1171
+ }
1172
+
1173
+ return (
1174
+ <AuthContext
1175
+ value={{
1176
+ user,
1177
+ isLoading,
1178
+ login,
1179
+ logout,
1180
+ incrementBurritoConsiderations,
1181
+ }}
1182
+ >
1183
+ {children}
1184
+ </AuthContext>
1185
+ )
1186
+ }
1187
+
1188
+ /**
1189
+ * React 19: Use the `use` API instead of useContext
1190
+ * - Can be called conditionally (unlike useContext)
1191
+ * - Enables more flexible component composition
1192
+ */
1193
+ export function useAuth() {
1194
+ const context = use(AuthContext)
1195
+ if (context === undefined) {
1196
+ throw new Error('useAuth must be used within an AuthProvider')
1197
+ }
1198
+ return context
1199
+ }
1200
+
1201
+ ```
1202
+
1203
+ ---
1204
+
1205
+ ## src/services/storage.ts
1206
+
1207
+ ```ts
1208
+ import AsyncStorage from '@react-native-async-storage/async-storage'
1209
+
1210
+ const CURRENT_USER_KEY = 'currentUser'
1211
+ const USERS_KEY = 'users'
1212
+
1213
+ export interface User {
1214
+ username: string
1215
+ burritoConsiderations: number
1216
+ }
1217
+
1218
+ /**
1219
+ * Storage service for persisting user data
1220
+ * Uses AsyncStorage (React Native's async key-value storage)
1221
+ */
1222
+ export const storage = {
1223
+ /**
1224
+ * Get the currently logged in user's username
1225
+ */
1226
+ getCurrentUser: async (): Promise<string | null> => {
1227
+ try {
1228
+ return await AsyncStorage.getItem(CURRENT_USER_KEY)
1229
+ } catch (error) {
1230
+ console.error('Error getting current user:', error)
1231
+ return null
1232
+ }
1233
+ },
1234
+
1235
+ /**
1236
+ * Set the currently logged in user's username
1237
+ */
1238
+ setCurrentUser: async (username: string): Promise<void> => {
1239
+ try {
1240
+ await AsyncStorage.setItem(CURRENT_USER_KEY, username)
1241
+ } catch (error) {
1242
+ console.error('Error setting current user:', error)
1243
+ }
1244
+ },
1245
+
1246
+ /**
1247
+ * Remove the current user (logout)
1248
+ */
1249
+ removeCurrentUser: async (): Promise<void> => {
1250
+ try {
1251
+ await AsyncStorage.removeItem(CURRENT_USER_KEY)
1252
+ } catch (error) {
1253
+ console.error('Error removing current user:', error)
1254
+ }
1255
+ },
1256
+
1257
+ /**
1258
+ * Get all stored users
1259
+ */
1260
+ getUsers: async (): Promise<Record<string, User>> => {
1261
+ try {
1262
+ const data = await AsyncStorage.getItem(USERS_KEY)
1263
+ return data ? JSON.parse(data) : {}
1264
+ } catch (error) {
1265
+ console.error('Error getting users:', error)
1266
+ return {}
1267
+ }
1268
+ },
1269
+
1270
+ /**
1271
+ * Get a specific user by username
1272
+ */
1273
+ getUser: async (username: string): Promise<User | null> => {
1274
+ try {
1275
+ const users = await storage.getUsers()
1276
+ return users[username] || null
1277
+ } catch (error) {
1278
+ console.error('Error getting user:', error)
1279
+ return null
1280
+ }
1281
+ },
1282
+
1283
+ /**
1284
+ * Save a user to storage
1285
+ */
1286
+ saveUser: async (user: User): Promise<void> => {
1287
+ try {
1288
+ const users = await storage.getUsers()
1289
+ users[user.username] = user
1290
+ await AsyncStorage.setItem(USERS_KEY, JSON.stringify(users))
1291
+ } catch (error) {
1292
+ console.error('Error saving user:', error)
1293
+ }
1294
+ },
1295
+
1296
+ /**
1297
+ * Clear all stored data (for testing/debugging)
1298
+ */
1299
+ clearAll: async (): Promise<void> => {
1300
+ try {
1301
+ await AsyncStorage.multiRemove([CURRENT_USER_KEY, USERS_KEY])
1302
+ } catch (error) {
1303
+ console.error('Error clearing storage:', error)
1304
+ }
1305
+ },
1306
+ }
1307
+
1308
+ ```
1309
+
1310
+ ---
1311
+
1312
+ ## src/styles/theme.ts
1313
+
1314
+ ```ts
1315
+ /**
1316
+ * Theme constants for consistent styling across the app
1317
+ * Matches the color scheme from the TanStack Start web version
1318
+ */
1319
+
1320
+ export const colors = {
1321
+ // Primary colors
1322
+ primary: '#0070f3',
1323
+ primaryDark: '#0051cc',
1324
+
1325
+ // Status colors
1326
+ success: '#28a745',
1327
+ successDark: '#218838',
1328
+ danger: '#dc3545',
1329
+ dangerDark: '#c82333',
1330
+
1331
+ // Feature colors
1332
+ burrito: '#e07c24',
1333
+ burritoDark: '#c96a1a',
1334
+
1335
+ // Neutral colors
1336
+ background: '#f5f5f5',
1337
+ white: '#ffffff',
1338
+ text: '#333333',
1339
+ textSecondary: '#666666',
1340
+ textLight: '#999999',
1341
+ border: '#dddddd',
1342
+ borderLight: '#eeeeee',
1343
+
1344
+ // Component-specific
1345
+ statsBackground: '#f8f9fa',
1346
+ headerBackground: '#333333',
1347
+ headerText: '#ffffff',
1348
+ inputBackground: '#ffffff',
1349
+ cardBackground: '#ffffff',
1350
+ }
1351
+
1352
+ export const spacing = {
1353
+ xs: 4,
1354
+ sm: 8,
1355
+ md: 16,
1356
+ lg: 24,
1357
+ xl: 32,
1358
+ xxl: 48,
1359
+ }
1360
+
1361
+ export const typography = {
1362
+ sizes: {
1363
+ xs: 12,
1364
+ sm: 14,
1365
+ md: 16,
1366
+ lg: 18,
1367
+ xl: 24,
1368
+ xxl: 32,
1369
+ },
1370
+ weights: {
1371
+ normal: '400' as const,
1372
+ medium: '500' as const,
1373
+ semibold: '600' as const,
1374
+ bold: '700' as const,
1375
+ },
1376
+ }
1377
+
1378
+ export const borderRadius = {
1379
+ sm: 4,
1380
+ md: 8,
1381
+ lg: 12,
1382
+ full: 9999,
1383
+ }
1384
+
1385
+ export const shadows = {
1386
+ sm: {
1387
+ shadowColor: '#000',
1388
+ shadowOffset: { width: 0, height: 1 },
1389
+ shadowOpacity: 0.05,
1390
+ shadowRadius: 2,
1391
+ elevation: 1,
1392
+ },
1393
+ md: {
1394
+ shadowColor: '#000',
1395
+ shadowOffset: { width: 0, height: 2 },
1396
+ shadowOpacity: 0.1,
1397
+ shadowRadius: 4,
1398
+ elevation: 3,
1399
+ },
1400
+ lg: {
1401
+ shadowColor: '#000',
1402
+ shadowOffset: { width: 0, height: 4 },
1403
+ shadowOpacity: 0.15,
1404
+ shadowRadius: 8,
1405
+ elevation: 5,
1406
+ },
1407
+ }
1408
+
1409
+ ```
1410
+
1411
+ ---
1412
+