vybekiit 0.7.29 → 0.7.33

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 (262) hide show
  1. package/dist/bin.js +3407 -2769
  2. package/dist/global-guidance/language.md +7 -102
  3. package/dist/global-skills/add-ai/SKILL.md +7 -8
  4. package/dist/global-skills/add-analytics/SKILL.md +4 -7
  5. package/dist/global-skills/add-app-clip/SKILL.md +1 -0
  6. package/dist/global-skills/add-blog/SKILL.md +4 -7
  7. package/dist/global-skills/add-files/SKILL.md +4 -7
  8. package/dist/global-skills/add-images/SKILL.md +4 -7
  9. package/dist/global-skills/add-language/SKILL.md +5 -8
  10. package/dist/global-skills/add-notifications/SKILL.md +4 -7
  11. package/dist/global-skills/add-realtime/SKILL.md +4 -7
  12. package/dist/global-skills/add-search/SKILL.md +4 -7
  13. package/dist/global-skills/add-signin/SKILL.md +4 -8
  14. package/dist/global-skills/add-teams/SKILL.md +4 -7
  15. package/dist/global-skills/aws-cdk/SKILL.md +1 -0
  16. package/dist/global-skills/aws-cloudformation/SKILL.md +1 -0
  17. package/dist/global-skills/aws-serverless/SKILL.md +169 -32
  18. package/dist/global-skills/aws-serverless/references/api-gateway.md +17 -0
  19. package/dist/global-skills/aws-serverless/references/architecture.md +9 -13
  20. package/dist/global-skills/aws-serverless/references/compute-decision-edge-cases.md +77 -0
  21. package/dist/global-skills/aws-serverless/references/lambda.md +3 -3
  22. package/dist/global-skills/aws-serverless/references/orchestration.md +46 -20
  23. package/dist/global-skills/aws-serverless/references/production.md +1 -1
  24. package/dist/global-skills/better-auth-best-practices/SKILL.md +1 -0
  25. package/dist/global-skills/better-auth-security-best-practices/SKILL.md +1 -0
  26. package/dist/global-skills/building-native-ui/SKILL.md +1 -0
  27. package/dist/global-skills/buy-domain/SKILL.md +4 -7
  28. package/dist/global-skills/check-safety/SKILL.md +5 -8
  29. package/dist/global-skills/claimable-postgres/SKILL.md +1 -0
  30. package/dist/global-skills/configure-capabilities/SKILL.md +1 -1
  31. package/dist/global-skills/connect-account/SKILL.md +1 -1
  32. package/dist/global-skills/create-auth-skill/SKILL.md +1 -0
  33. package/dist/global-skills/doctor/SKILL.md +1 -1
  34. package/dist/global-skills/eas-app-stores/SKILL.md +2 -1
  35. package/dist/global-skills/eas-app-stores/agents/openai.yaml +1 -1
  36. package/dist/global-skills/eas-hosting/SKILL.md +2 -1
  37. package/dist/global-skills/eas-hosting/agents/openai.yaml +1 -1
  38. package/dist/global-skills/eas-observe/SKILL.md +2 -1
  39. package/dist/global-skills/eas-observe/agents/openai.yaml +1 -1
  40. package/dist/global-skills/eas-simulator/SKILL.md +24 -16
  41. package/dist/global-skills/eas-simulator/agents/openai.yaml +1 -1
  42. package/dist/global-skills/eas-simulator/references/controllers.md +11 -7
  43. package/dist/global-skills/eas-simulator/references/logs-and-crashes.md +101 -0
  44. package/dist/global-skills/eas-simulator/references/run-your-app.md +8 -8
  45. package/dist/global-skills/eas-simulator/references/troubleshooting.md +14 -6
  46. package/dist/global-skills/eas-update/SKILL.md +2 -1
  47. package/dist/global-skills/eas-update/agents/openai.yaml +1 -1
  48. package/dist/global-skills/eas-update-insights/SKILL.md +2 -1
  49. package/dist/global-skills/eas-update-insights/agents/openai.yaml +1 -1
  50. package/dist/global-skills/eas-workflows/SKILL.md +2 -1
  51. package/dist/global-skills/eas-workflows/agents/openai.yaml +1 -1
  52. package/dist/global-skills/email-best-practices/SKILL.md +1 -0
  53. package/dist/global-skills/email-best-practices/references/sending-reliability.md +17 -22
  54. package/dist/global-skills/expo-animation/SKILL.md +2 -1
  55. package/dist/global-skills/expo-api-routes/SKILL.md +1 -0
  56. package/dist/global-skills/expo-app-clip/SKILL.md +2 -1
  57. package/dist/global-skills/expo-brownfield/SKILL.md +2 -1
  58. package/dist/global-skills/expo-cicd-workflows/SKILL.md +1 -0
  59. package/dist/global-skills/expo-data-fetching/SKILL.md +2 -1
  60. package/dist/global-skills/expo-deployment/SKILL.md +1 -0
  61. package/dist/global-skills/expo-design-system/SKILL.md +2 -1
  62. package/dist/global-skills/expo-dev-client/SKILL.md +2 -1
  63. package/dist/global-skills/expo-dom/SKILL.md +2 -1
  64. package/dist/global-skills/expo-examples/SKILL.md +2 -1
  65. package/dist/global-skills/expo-migrate-module/SKILL.md +2 -1
  66. package/dist/global-skills/expo-module/SKILL.md +2 -1
  67. package/dist/global-skills/expo-native-ui/SKILL.md +2 -1
  68. package/dist/global-skills/expo-observe/SKILL.md +1 -0
  69. package/dist/global-skills/expo-overview/SKILL.md +2 -1
  70. package/dist/global-skills/expo-project-structure/SKILL.md +2 -1
  71. package/dist/global-skills/expo-router/SKILL.md +2 -1
  72. package/dist/global-skills/expo-skill-eval/SKILL.md +1 -0
  73. package/dist/global-skills/expo-skill-feedback/SKILL.md +1 -0
  74. package/dist/global-skills/expo-tailwind-setup/SKILL.md +1 -0
  75. package/dist/global-skills/expo-ui/SKILL.md +2 -1
  76. package/dist/global-skills/expo-upgrade/SKILL.md +2 -1
  77. package/dist/global-skills/expo-web-to-native/SKILL.md +2 -1
  78. package/dist/global-skills/extension-to-functions-codebase/SKILL.md +2 -0
  79. package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +162 -76
  80. package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +37 -0
  81. package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +97 -3
  82. package/dist/global-skills/firebase-ai-logic-basics/references/tts_generation.md +676 -0
  83. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +88 -3
  84. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +91 -3
  85. package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +6 -1
  86. package/dist/global-skills/firebase-auth-basics/SKILL.md +12 -6
  87. package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +61 -23
  88. package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +3 -3
  89. package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +22 -19
  90. package/dist/global-skills/firebase-auth-basics/references/security_rules.md +2 -2
  91. package/dist/global-skills/firebase-basics/SKILL.md +8 -2
  92. package/dist/global-skills/firebase-basics/references/android_setup.md +229 -23
  93. package/dist/global-skills/firebase-basics/references/ios_setup.md +57 -0
  94. package/dist/global-skills/firebase-basics/references/web_setup.md +52 -0
  95. package/dist/global-skills/firebase-crashlytics/SKILL.md +2 -0
  96. package/dist/global-skills/firebase-crashlytics/references/android_setup.md +99 -71
  97. package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +1 -0
  98. package/dist/global-skills/firebase-data-connect/SKILL.md +2 -0
  99. package/dist/global-skills/firebase-data-connect/reference/config.md +8 -8
  100. package/dist/global-skills/firebase-data-connect/reference/realtime.md +4 -1
  101. package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +84 -29
  102. package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +8 -3
  103. package/dist/global-skills/firebase-data-connect/reference/security.md +13 -13
  104. package/dist/global-skills/firebase-firestore/SKILL.md +18 -7
  105. package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +47 -21
  106. package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +2 -1
  107. package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +63 -27
  108. package/dist/global-skills/firebase-firestore/references/standard/indexes.md +2 -1
  109. package/dist/global-skills/firebase-hosting-basics/SKILL.md +2 -0
  110. package/dist/global-skills/firebase-remote-config-basics/SKILL.md +3 -1
  111. package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +83 -92
  112. package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +8 -6
  113. package/dist/global-skills/firestore-rules-creation/SKILL.md +23 -10
  114. package/dist/global-skills/go-live/SKILL.md +7 -7
  115. package/dist/global-skills/harden/SKILL.md +7 -10
  116. package/dist/global-skills/instrument-feature-flags/SKILL.md +1 -0
  117. package/dist/global-skills/instrument-product-analytics/SKILL.md +1 -0
  118. package/dist/global-skills/manifest.json +2 -1
  119. package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +1 -0
  120. package/dist/global-skills/mongodb-connection/SKILL.md +1 -0
  121. package/dist/global-skills/mongodb-mcp-setup/SKILL.md +1 -0
  122. package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +1 -0
  123. package/dist/global-skills/mongodb-qe-size-estimation/SKILL.md +224 -0
  124. package/dist/global-skills/mongodb-query-optimizer/SKILL.md +1 -0
  125. package/dist/global-skills/mongodb-schema-design/SKILL.md +1 -0
  126. package/dist/global-skills/mongodb-search-and-ai/SKILL.md +1 -0
  127. package/dist/global-skills/native-data-fetching/SKILL.md +1 -0
  128. package/dist/global-skills/neon/SKILL.md +34 -5
  129. package/dist/global-skills/neon-ai-gateway/SKILL.md +44 -14
  130. package/dist/global-skills/neon-auth/SKILL.md +1 -0
  131. package/dist/global-skills/neon-functions/SKILL.md +12 -0
  132. package/dist/global-skills/neon-functions/references/native-binaries.md +188 -0
  133. package/dist/global-skills/neon-object-storage/SKILL.md +1 -0
  134. package/dist/global-skills/neon-postgres/SKILL.md +2 -1
  135. package/dist/global-skills/neon-postgres/references/full-text-search.md +27 -17
  136. package/dist/global-skills/neon-postgres/references/hybrid-search.md +19 -15
  137. package/dist/global-skills/neon-postgres/references/lakebase-search-drizzle.md +99 -14
  138. package/dist/global-skills/neon-postgres/references/vector-search.md +93 -10
  139. package/dist/global-skills/neon-postgres-branches/SKILL.md +1 -0
  140. package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +1 -0
  141. package/dist/global-skills/onboarding/SKILL.md +14 -13
  142. package/dist/global-skills/plan-my-idea/SKILL.md +1 -1
  143. package/dist/global-skills/publish-app/SKILL.md +1 -1
  144. package/dist/global-skills/publish-extension/SKILL.md +1 -1
  145. package/dist/global-skills/resend/SKILL.md +5 -15
  146. package/dist/global-skills/resend/references/domains.md +1 -1
  147. package/dist/global-skills/resend/references/installation.md +3 -3
  148. package/dist/global-skills/resend/references/sending/best-practices.md +3 -3
  149. package/dist/global-skills/resend/references/sending/single-email-examples.md +3 -3
  150. package/dist/global-skills/resend/references/webhooks.md +2 -0
  151. package/dist/global-skills/reset-password/SKILL.md +4 -6
  152. package/dist/global-skills/save-data/SKILL.md +3 -0
  153. package/dist/global-skills/sentry-sdk-setup/SKILL.md +1 -0
  154. package/dist/global-skills/sentry-workflow/SKILL.md +1 -0
  155. package/dist/global-skills/setup-email/SKILL.md +7 -8
  156. package/dist/global-skills/setup-payments/SKILL.md +10 -12
  157. package/dist/global-skills/setup-sms/SKILL.md +1 -1
  158. package/dist/global-skills/sign-in-with-email-link/SKILL.md +4 -6
  159. package/dist/global-skills/sign-in-with-google/SKILL.md +14 -13
  160. package/dist/global-skills/sign-in-with-phone/SKILL.md +5 -7
  161. package/dist/global-skills/stripe-best-practices/SKILL.md +20 -19
  162. package/dist/global-skills/stripe-best-practices/references/billing.md +2 -0
  163. package/dist/global-skills/stripe-best-practices/references/payments.md +1 -1
  164. package/dist/global-skills/stripe-best-practices/references/tax.md +27 -15
  165. package/dist/global-skills/supabase/CHANGELOG.md +19 -0
  166. package/dist/global-skills/supabase/SKILL.md +1 -0
  167. package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +1 -0
  168. package/dist/global-skills/track-errors/SKILL.md +12 -13
  169. package/dist/global-skills/update-kit/SKILL.md +1 -1
  170. package/dist/global-skills/upgrading-expo/SKILL.md +1 -0
  171. package/dist/global-skills/use-dom/SKILL.md +1 -0
  172. package/dist/global-skills/use-railway/SKILL.md +9 -8
  173. package/dist/global-skills/use-railway/references/configure.md +34 -1
  174. package/dist/global-skills/use-railway/references/iac.md +3 -0
  175. package/dist/global-skills/use-railway/references/tracing.md +97 -44
  176. package/dist/global-skills/vercel-composition-patterns/SKILL.md +1 -0
  177. package/dist/global-skills/vercel-react-best-practices/SKILL.md +1 -0
  178. package/dist/global-skills/vybekiitReferences/backend/AGENTS.md +11 -3
  179. package/dist/global-skills/vybekiitReferences/backend/agent/goal-index.md +1 -1
  180. package/dist/global-skills/vybekiitReferences/backend/agent/goal-routes.json +229 -0
  181. package/dist/global-skills/vybekiitReferences/backend/agent/mcp-setup.md +11 -2
  182. package/dist/global-skills/vybekiitReferences/backend/agent/session-bootstrap.md +1 -1
  183. package/dist/global-skills/vybekiitReferences/backend/agent/tech-references.md +1 -1
  184. package/dist/global-skills/vybekiitReferences/backend/language.md +7 -102
  185. package/dist/global-skills/vybekiitReferences/backend/platform-skills/deploy-railway-vybekiit.md +2 -2
  186. package/dist/global-skills/vybekiitReferences/backend/platform-skills/extend-capabilities-vybekiit.md +1 -1
  187. package/dist/global-skills/vybekiitReferences/backend/platform-skills/mongodb-vybekiit.md +1 -1
  188. package/dist/global-skills/vybekiitReferences/extension/AGENTS.md +11 -3
  189. package/dist/global-skills/vybekiitReferences/extension/agent/goal-index.md +1 -1
  190. package/dist/global-skills/vybekiitReferences/extension/agent/goal-routes.json +239 -0
  191. package/dist/global-skills/vybekiitReferences/extension/agent/mcp-setup.md +10 -1
  192. package/dist/global-skills/vybekiitReferences/extension/agent/session-bootstrap.md +1 -1
  193. package/dist/global-skills/vybekiitReferences/extension/agent/tech-references.md +1 -1
  194. package/dist/global-skills/vybekiitReferences/extension/agent/ui-sources.md +11 -8
  195. package/dist/global-skills/vybekiitReferences/extension/language.md +7 -92
  196. package/dist/global-skills/vybekiitReferences/extension/platform-skills/browser-automation-vybekiit.md +9 -1
  197. package/dist/global-skills/vybekiitReferences/extension/platform-skills/env-secrets-vybekiit.md +1 -0
  198. package/dist/global-skills/vybekiitReferences/extension/platform-skills/extend-capabilities-vybekiit.md +1 -1
  199. package/dist/global-skills/vybekiitReferences/extension/platform-skills/observability-vybekiit.md +1 -1
  200. package/dist/global-skills/vybekiitReferences/extension/platform-skills/sentry-vybekiit.md +1 -1
  201. package/dist/global-skills/vybekiitReferences/mobile/AGENTS.md +27 -12
  202. package/dist/global-skills/vybekiitReferences/mobile/agent/goal-index.md +1 -1
  203. package/dist/global-skills/vybekiitReferences/mobile/agent/goal-routes.json +279 -0
  204. package/dist/global-skills/vybekiitReferences/mobile/agent/mcp-setup.md +10 -1
  205. package/dist/global-skills/vybekiitReferences/mobile/agent/session-bootstrap.md +1 -1
  206. package/dist/global-skills/vybekiitReferences/mobile/agent/tech-references.md +1 -1
  207. package/dist/global-skills/vybekiitReferences/mobile/agent/ui-sources.mobile.md +1 -1
  208. package/dist/global-skills/vybekiitReferences/mobile/language.md +7 -93
  209. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/env-secrets-vybekiit.md +1 -0
  210. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/extend-capabilities-vybekiit.md +1 -1
  211. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/i18n-vybekiit.md +1 -1
  212. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/observability-vybekiit.md +1 -1
  213. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/sentry-vybekiit.md +1 -1
  214. package/dist/global-skills/vybekiitReferences/mobile/platform-skills/ui-port-from-web-vybekiit.md +2 -2
  215. package/dist/global-skills/vybekiitReferences/spa/AGENTS.md +11 -3
  216. package/dist/global-skills/vybekiitReferences/spa/agent/goal-index.md +1 -1
  217. package/dist/global-skills/vybekiitReferences/spa/agent/goal-routes.json +267 -0
  218. package/dist/global-skills/vybekiitReferences/spa/agent/mcp-setup.md +10 -1
  219. package/dist/global-skills/vybekiitReferences/spa/agent/session-bootstrap.md +1 -1
  220. package/dist/global-skills/vybekiitReferences/spa/agent/ui-sources.md +11 -8
  221. package/dist/global-skills/vybekiitReferences/spa/language.md +7 -11
  222. package/dist/global-skills/vybekiitReferences/web/AGENTS.md +15 -30
  223. package/dist/global-skills/vybekiitReferences/web/agent/goal-index.md +1 -1
  224. package/dist/global-skills/vybekiitReferences/web/agent/goal-routes.json +366 -0
  225. package/dist/global-skills/vybekiitReferences/web/agent/mcp-setup.md +11 -2
  226. package/dist/global-skills/vybekiitReferences/web/agent/session-bootstrap.md +1 -1
  227. package/dist/global-skills/vybekiitReferences/web/language.md +7 -102
  228. package/dist/global-skills/vybekiitReferences/web/platform-skills/ai-vybekiit.md +1 -1
  229. package/dist/global-skills/vybekiitReferences/web/platform-skills/analytics-vybekiit.md +1 -1
  230. package/dist/global-skills/vybekiitReferences/web/platform-skills/assets-vybekiit.md +1 -1
  231. package/dist/global-skills/vybekiitReferences/web/platform-skills/better-auth-vybekiit.md +1 -1
  232. package/dist/global-skills/vybekiitReferences/web/platform-skills/browser-automation-vybekiit.md +9 -1
  233. package/dist/global-skills/vybekiitReferences/web/platform-skills/cms-vybekiit.md +1 -1
  234. package/dist/global-skills/vybekiitReferences/web/platform-skills/compliance-vybekiit.md +1 -1
  235. package/dist/global-skills/vybekiitReferences/web/platform-skills/deploy-github-pages-vybekiit.md +2 -2
  236. package/dist/global-skills/vybekiitReferences/web/platform-skills/deploy-railway-vybekiit.md +2 -2
  237. package/dist/global-skills/vybekiitReferences/web/platform-skills/deploy-vercel-vybekiit.md +2 -2
  238. package/dist/global-skills/vybekiitReferences/web/platform-skills/env-secrets-vybekiit.md +1 -0
  239. package/dist/global-skills/vybekiitReferences/web/platform-skills/extend-capabilities-vybekiit.md +1 -1
  240. package/dist/global-skills/vybekiitReferences/web/platform-skills/i18n-vybekiit.md +1 -1
  241. package/dist/global-skills/vybekiitReferences/web/platform-skills/jobs-vybekiit.md +1 -1
  242. package/dist/global-skills/vybekiitReferences/web/platform-skills/kv-vybekiit.md +1 -1
  243. package/dist/global-skills/vybekiitReferences/web/platform-skills/lemon-squeezy-vybekiit.md +1 -1
  244. package/dist/global-skills/vybekiitReferences/web/platform-skills/mongodb-vybekiit.md +1 -1
  245. package/dist/global-skills/vybekiitReferences/web/platform-skills/notifications-vybekiit.md +1 -1
  246. package/dist/global-skills/vybekiitReferences/web/platform-skills/observability-vybekiit.md +1 -1
  247. package/dist/global-skills/vybekiitReferences/web/platform-skills/paypal-vybekiit.md +1 -1
  248. package/dist/global-skills/vybekiitReferences/web/platform-skills/realtime-vybekiit.md +1 -1
  249. package/dist/global-skills/vybekiitReferences/web/platform-skills/registrar-vybekiit.md +1 -1
  250. package/dist/global-skills/vybekiitReferences/web/platform-skills/search-vybekiit.md +1 -1
  251. package/dist/global-skills/vybekiitReferences/web/platform-skills/sentry-vybekiit.md +1 -1
  252. package/dist/global-skills/vybekiitReferences/web/platform-skills/seo-vybekiit.md +1 -3
  253. package/dist/global-skills/vybekiitReferences/web/platform-skills/supabase-vybekiit.md +1 -1
  254. package/dist/global-skills/vybekiitReferences/web/platform-skills/tenancy-vybekiit.md +1 -1
  255. package/dist/global-skills/web-to-native/SKILL.md +1 -0
  256. package/dist/global-skills/workers-best-practices/SKILL.md +5 -4
  257. package/dist/global-skills/workers-best-practices/references/configuration.md +1 -1
  258. package/dist/global-skills/workers-best-practices/references/platform-apis.md +5 -5
  259. package/dist/global-skills/workers-best-practices/references/runtime-patterns.md +1 -1
  260. package/dist/global-skills/wrangler/SKILL.md +28 -25
  261. package/dist/global-skills/xcode-project-setup/SKILL.md +2 -0
  262. package/package.json +10 -8
@@ -0,0 +1,101 @@
1
+ # Device logs and crash reports (iOS)
2
+
3
+ When the user's app crashes, closes on launch, or misbehaves on an iOS session, read what the device recorded instead of guessing from screenshots. The session's preview server (serve-sim) keeps a shared buffer of the simulator's device log and collects the crash reports macOS writes for simulator apps, each with the app's own log lines from just before the crash.
4
+
5
+ This covers iOS sessions. Call `sim_api /crashes` first. If it returns `404 Not found`, the session's preview server predates these routes: fall back to `agent-device logs` (see [controllers.md](./controllers.md)) and tell the user crash reports aren't available on that session. Don't call `/logs` there, because older servers stream it without end.
6
+
7
+ ## Reach the preview API
8
+
9
+ `simulator:get --json` returns `remoteConfig.previewApiUrl`, the preview server's API URL with the session token already in its query. Keep it in a shell variable and don't print it: the token grants control of the session. As with `simulator:exec`, run this from the Expo project directory. Pass `--id` with the session you are driving, because another agent can replace the dotenv session between your commands.
10
+
11
+ ```bash
12
+ API=$(npx --yes eas-cli@latest simulator:get --json --id <session-id> | node -e '
13
+ let s = ""; process.stdin.on("data", (d) => (s += d)).on("end", () => {
14
+ let j;
15
+ try { j = JSON.parse(s); } catch { console.error("simulator:get did not print JSON"); process.exit(1); }
16
+ const url = j.remoteConfig?.previewApiUrl;
17
+ if (j.status !== "IN_PROGRESS" || j.platform !== "IOS" || !url) {
18
+ console.error(`no preview API (status ${j.status}, platform ${j.platform})`);
19
+ process.exit(1);
20
+ }
21
+ process.stdout.write(url);
22
+ });')
23
+
24
+ API_BASE="${API%%\?*}"; API_BASE="${API_BASE%/}"
25
+ case "$API" in *\?*) API_QUERY="${API#*\?}" ;; *) API_QUERY="" ;; esac
26
+ EVENTS="${TMPDIR:-/tmp}/eas-sim-crashes-${API_BASE##*//}" # files for the log hold below
27
+
28
+ # sim_api <path> [extra query]: call a preview route, keeping the token query.
29
+ # printf is a shell builtin, so the URL goes to curl on stdin and stays out of `ps`.
30
+ sim_api() {
31
+ : "${API_BASE:?no preview API}"
32
+ printf 'url = "%s"\n' "$API_BASE$1?$API_QUERY${2:+&$2}" | curl -sS --fail-with-body --max-time 20 -K -
33
+ }
34
+ ```
35
+
36
+ If your shell does not keep variables between commands, repeat these lines at the start of each command. Each repeat runs `simulator:get` again, which takes a few seconds, so put related reads in one command. Only call `/crashes`, `/crashes/<id>`, and `/logs`. Don't call `/api`: its response includes the exec token. Calls to the preview server do not reset the session's idle timer.
37
+
38
+ ## Catch a crash with its log tail
39
+
40
+ The device log only runs while something holds it, so **start holding it before you reproduce the crash.** A crash that happens while nothing holds the log still gets a report, but its tail is empty. Hold it with a `/crashes` stream opened with `?tail=1`, which also writes each crash event to `$EVENTS.log`:
41
+
42
+ ```bash
43
+ printf 'url = "%s"\n' "$API_BASE/crashes?$API_QUERY&tail=1" |
44
+ curl -sSN --fail-with-body --max-time 300 -H 'Accept: text/event-stream' -K - > "$EVENTS.log" 2> "$EVENTS.err" &
45
+ echo $! > "$EVENTS.pid"
46
+ for i in $(seq 1 20); do
47
+ grep -q '^data:' "$EVENTS.log" && break
48
+ kill -0 "$(cat "$EVENTS.pid")" 2>/dev/null || break
49
+ sleep 0.5
50
+ done
51
+ grep -q '^data:' "$EVENTS.log" && echo "log held" || cat "$EVENTS.err" "$EVENTS.log"
52
+
53
+ # ... reproduce the crash with agent-device (open the app, press through the flow) ...
54
+
55
+ grep -E '"type":"(crash|recurred)"' "$EVENTS.log" # a crash event arrives a few seconds after the process dies
56
+ sim_api /crashes # {meta, crashes}: one record per distinct crash
57
+ kill "$(cat "$EVENTS.pid")" 2>/dev/null; rm -f "$EVENTS.log" "$EVENTS.err" "$EVENTS.pid"
58
+ ```
59
+
60
+ Reproduce only after `log held`. Otherwise the command prints the error: `401` means the session ended or its token changed, and `404` means the server predates these routes. `--max-time 300` ends the hold after 5 minutes even if nothing kills it; start it again for a longer run. Without the stream, call `sim_api /logs "snapshot=1&follow=1&limit=1"` more often than every 8 seconds: the log stops 8 seconds after its last reader.
61
+
62
+ Right after a session boots, the simulator writes many log lines for a minute or two, and a crash in that window can come back without its tail (`logTailSource` of `buffer-rolled-past` or `no-app-lines`, no lines). If that happens, reproduce again once logging settles; the new occurrence gets its tail.
63
+
64
+ An empty `crashes` array right after a crash means "not yet", not "nothing happened". `meta.reportDelaySeconds` estimates the delay, and `meta.status` says whether collection is running (`watching`) at all.
65
+
66
+ ## Read a crash
67
+
68
+ ```bash
69
+ sim_api "/crashes/<id>" # newest occurrence of that crash
70
+ sim_api "/crashes/<id>" "key=<key>" # an occurrence, by a key from occurrenceTimes
71
+ ```
72
+
73
+ The list gives one record per crash signature, with `signal`, `exceptionType`, `culpritFrame`, `bundleId`, `pid`, `count`, and `occurrenceTimes` (each retained occurrence's `key`, oldest first). Repeats of the same crash collapse into one record with a higher `count`.
74
+
75
+ The detail returns `{record, occurrence, report, reportError}`:
76
+
77
+ - `occurrence.frames` is that occurrence's stack. The first frame with `appOwned: true` is usually where to look in the user's code.
78
+ - `occurrence.logTail` holds the app's own device-log lines (NDJSON) from at or before the crash. `occurrence.logTailSource` says how it was chosen:
79
+ - `app-windowed`: lines found.
80
+ - `buffer-rolled-past`: the buffer no longer reached back that far, or nothing held the log when the crash happened.
81
+ - `no-app-lines`: the window was there, but the app logged nothing.
82
+ - `none`: nothing was buffered for the device, usually because nothing held the log. It is also `none` when the report has no timestamp or process name.
83
+ - `occurrence.appVersion`, `buildVersion`, and `faultingQueue` are per occurrence.
84
+ - `report` is the full `.ips` text. When it is `null`, `reportError` says why. The detail can be large, so print only the fields you need.
85
+
86
+ ## Read the device log
87
+
88
+ ```bash
89
+ sim_api /logs "snapshot=1&follow=1&limit=500" # newest 500 lines, keep the log running
90
+ sim_api /logs "snapshot=1&follow=1&since=<latestSeq>" # only lines after a previous read
91
+ ```
92
+
93
+ The JSON has `lines` (`{seq, at, raw}`, where `raw` is one NDJSON log entry with `processImagePath`, `processID`, `eventMessage`, and `messageType`), `latestSeq`, `oldestSeq`, and `status` (`streaming`, `restarting`, or `stopped`). `streamError` keeps the last stream error, so it can be set while `status` is `streaming`. Keep `snapshot=1`: without it, `/logs` is an event stream that does not end. Without `follow=1`, `/logs` only reads what is already buffered, and `stopped` means nothing is holding the log. The first `follow=1` read after the log was idle can return no lines, so read again after a second or two.
94
+
95
+ To keep only the user's app, match `processImagePath` ending in the app's executable name (its `CFBundleExecutable`; app paths contain `/Containers/Bundle/Application/`), or `processID` for one launch.
96
+
97
+ A busy simulator can log hundreds of lines a second, and the buffer is capped at about 4 MB, so it may hold only seconds to minutes of history. Read right after the event you care about; if `since` is older than `oldestSeq`, those lines are gone.
98
+
99
+ ## What the user sees
100
+
101
+ The same data is in the browser preview the user opens from `webPreviewUrl`: the device log in the Logs drawer (toolbar icon), and crashes in the Crashes section of the Tools panel, where each crash opens its stack, log tail, and `.ips`. Point the user there when they want to look for themselves.
@@ -4,7 +4,7 @@ The remote sim boots blank. You install a **simulator-targeted** build onto the
4
4
 
5
5
  In all modes, the session is started the same way and driven through `npx --yes eas-cli@latest simulator:exec`. Replace `dev.example.app` with the app's iOS `bundleIdentifier` (from `app.json` → `ios.bundleIdentifier`), and run from the project directory.
6
6
 
7
- > These sequences are **iOS**. For **Android**: build via `npx --yes eas-cli@latest build --platform android` (or local Gradle), `install` the `.apk` instead of an `.app`, and skip `pod install`. Current simulator session types include a web preview, though Android support is still in development and may lack iOS parity.
7
+ > These sequences are **iOS**. For **Android**: build via `npx --yes eas-cli@latest build --platform android` (or local Gradle), `install` the `.apk` instead of an `.app` (`.aab` fails), and skip `pod install`. Android sessions include a browser preview (`webPreviewUrl`), which the expo.dev session page opens in a new tab with **Open preview**. Android support is still in development, so some iOS features may not work.
8
8
 
9
9
  ## Starting a session (shared by all modes)
10
10
 
@@ -35,7 +35,7 @@ for i in $(seq 1 64); do
35
35
  done
36
36
  ```
37
37
 
38
- If you need the id explicitly, it's `EAS_SIMULATOR_SESSION_ID` in `.env.eas-simulator`. `start` also prints a `webPreviewUrl` (iOS-only browser preview — surface it per the SKILL.md "watch it live" rules) and a job-run URL. Once live, the session env is in `.env.eas-simulator`, so `simulator:exec` works.
38
+ If you need the id explicitly, it's `EAS_SIMULATOR_SESSION_ID` in `.env.eas-simulator`. `start` also prints a `webPreviewUrl` (browser preview on iOS and Android; `remoteConfig.previewUrl` for `web-preview-only` sessions — surface it per the SKILL.md "watch it live" rules) and a job-run URL. Once live, the session env is in `.env.eas-simulator`, so `simulator:exec` works.
39
39
 
40
40
  ## Targeting a device — iPad, or several at once
41
41
 
@@ -53,16 +53,16 @@ The value must be a device the **remote runner** offers (NOT your local Xcode se
53
53
  npx --yes eas-cli@latest simulator:exec npx agent-device@latest devices --json
54
54
  ```
55
55
 
56
- Available iOS devices today: iPhone 17 / 17 Pro / 17 Pro Max / 17e / Air, and iPad (A16), iPad Air 11"/13" (M4), iPad mini (A17 Pro), iPad Pro 11"/13" (M5).
56
+ Available iOS devices today: iPhone 17 (the default) / 17 Pro / 17 Pro Max / 17e / Air; iPad (A16), iPad Air 11-inch (M4), iPad Air 13-inch (M4), iPad mini (A17 Pro), iPad Pro 11-inch (M5), iPad Pro 13-inch (M5); plus Vision Pro and Apple TV. On Android, `--device` takes an AVD hardware profile id (e.g. `pixel_7`); all profiles render at 720x1600, density 300.
57
57
 
58
- **Switch devices mid-session:** a session exposes ~16 sims but boots only one at start. Pass the **controller's** global `--device "<name>"` on `open` (and other verbs) to boot + target another; it stays booted alongside the first, so pass `--device` on each verb to say which it hits.
58
+ **Add a second simulator mid-session:** a session boots only one simulator at start. Use a separate agent-device session for the second one: pass `--session <name> --device "<name>"` (boot takes about 46 seconds), and pass `--session <name>` on each later verb for that device. Passing `--device` in the default session fails with `INVALID_ARGS` "already bound".
59
59
 
60
60
  ```bash
61
61
  npx --yes eas-cli@latest simulator:exec npx agent-device@latest open <bundleId> "<devClientURL>" \
62
- --platform ios --device "iPad Pro 13-inch (M5)" --relaunch
62
+ --platform ios --session ipad --device "iPad Pro 13-inch (M5)" --relaunch
63
63
  ```
64
64
 
65
- - ⚠️ The **controller** `--device` resolves by **NAME only** — a udid returns `DEVICE_NOT_FOUND`. (The start-time CLI `--device` above takes either.)
65
+ - ⚠️ The **controller** `--device` takes a **name only** — a UDID returns `DEVICE_NOT_FOUND`; use `--udid` for a UDID. (The start-time CLI `--device` above takes either.)
66
66
  - `devices` reports each device's name, kind, and booted state, but **not** its iOS version.
67
67
 
68
68
  ---
@@ -139,7 +139,7 @@ npx --yes eas-cli@latest simulator:stop # omit --id → stops the doten
139
139
 
140
140
  The agentic edit-and-see loop: a **dev (Debug) build** loads JS from your **Metro** over a tunnel, so edits appear on the remote sim via Fast Refresh. Two ways to connect the dev client to Metro:
141
141
 
142
- - **Method 1 (recommended, eas-cli ≥ 22.4.0):** launch at session start — `simulator:start` installs the build, applies launch-args, and opens the Metro URL in one command, and the "Open in?" dialog is auto-handled. Needs a **remote** build source (`--build-id`, `--application-archive-url`, or `--expo-go`); a local `.app` can't be passed here.
142
+ - **Method 1 (recommended, eas-cli ≥ 22.4.0):** launch at session start — `simulator:start` installs the build, applies launch-args, and opens the Metro URL in one command, and the "Open in?" dialog is auto-handled. Needs a **remote** build source (`--build-id`, `--build-fingerprint`, `--application-archive-url`, or `--expo-go`); a local `.app` can't be passed here. `--build-fingerprint` selects the most recent finished, non-expired build with that hash (iOS: it must be a simulator build; Android: any distribution type can match, so use an APK profile). An iOS `--application-archive-url` must be a `.tar.gz` or `.tgz` that contains a `.app` (`.zip`, `.app.zip`, and `.ipa` fail); Android needs an `.apk`.
143
143
  - **Method 2 (fallback):** drive the connect with the controller — for a **local `.app`** build, or eas-cli < 22.4.0.
144
144
 
145
145
  ⚠️ **Don't install a release build as a "quick interim" and screenshot it** — it shows stale, build-time code. Use a dev build + Metro; screenshot only after the dev client is connected.
@@ -181,7 +181,7 @@ npx --yes eas-cli@latest simulator:exec npx agent-device@latest screenshot ./liv
181
181
  # VERIFY it's the REMOTE sim, not a silent local-sim fallback (agent-device falls back to a LOCAL sim with no
182
182
  # error when the dotenv lacks remote config → believable but WRONG screenshots). Decisive tells: `simulator:get
183
183
  # --json` returns the id `start` printed, AND the attach's "Session state:" path is under /Users/expo/ (remote
184
- # VM), not /Users/gabe/ (your Mac). The `sessions/` vs `remote-diagnostics/` directory name is NOT reliable.
184
+ # VM), not /Users/<you>/ (your Mac). The `sessions/` vs `remote-diagnostics/` directory name is NOT reliable.
185
185
 
186
186
  # 4. Fast Refresh: edit a source file → it hits the remote sim with no reload. Screenshot again to confirm.
187
187
  # 5. Stop: npx --yes eas-cli@latest simulator:stop # then kill the Metro process
@@ -11,21 +11,25 @@ Concrete errors seen while validating this flow, and the fix.
11
11
  | `An Expo user account is required` / `whoami` shows logged-out | No browser login on a cloud/CI/headless box, or `EXPO_TOKEN` unset/invalid | Set **`EXPO_TOKEN`** (expo.dev → Account → Access Tokens) in the env; verify `npx --yes eas-cli@latest whoami`. (Interactive machines can `eas login`.) |
12
12
  | `simulator:start`/`build`: no linked project / missing `projectId` | A fresh `create-expo-app` isn't linked to EAS | `npx --yes eas-cli@latest init` to create/link it (writes `extra.eas.projectId`). |
13
13
  | `prebuild`/`eas build` prompts for or fails on a missing **iOS bundle identifier** | A fresh app often has no `ios.bundleIdentifier` | Set it in app config (e.g. `dev.<owner>.<slug>`); confirm via `npx expo config --json` (may live in `app.config.js`). |
14
- | `--max-duration-minutes` rejected | The requested duration may not be supported by the account; inspect the CLI error | Use the default session limit when the custom duration is unavailable. |
15
- | Appium or browser-preview session stops despite ongoing interaction | Only activity reported through `agent-device` and `argent` resets `--max-idle-time-minutes`; Appium commands and browser-preview activity do not | Use the maximum duration as the lifetime bound for Appium and user-driven previews. Customize it with `--max-duration-minutes` when supported by the account, and omit `--max-idle-time-minutes` unless inactivity from a supported controller is the intended stop condition. |
14
+ | `--max-duration-minutes` rejected | The value is above the plan limit (40 minutes on Free, 115 on paid plans); inspect the CLI error | Pass a value within the plan limit, or omit the flag to use the default. |
15
+ | Browser-preview session stops despite ongoing interaction | Browser-preview activity does not reset `--max-idle-time-minutes`; only controller activity (`agent-device`, `argent`, Appium) does | Use the maximum duration as the lifetime bound for user-driven previews. Set it with `--max-duration-minutes`, and omit `--max-idle-time-minutes` unless controller inactivity is the intended stop condition. |
16
16
  | `simulator:start` fails with `not enabled for this account` / not-allowlisted | EAS Simulator is limited-access and isn't enabled for this account | Don't retry. Confirm with `simulator:availability`, then hand off gracefully — tell the user and fall back to a local sim / EAS Build (see SKILL.md *Check availability first*). |
17
17
  | `start` keeps "Waiting for … session to be ready" but it never returns | `start`'s readiness poll can miss a session that's actually live | Don't rely on it — poll `npx --yes eas-cli@latest simulator:get --id <id> --json` for `status: IN_PROGRESS` + a populated `remoteConfig`. |
18
18
  | `ERR_NGROK_3200` / endpoint offline; `Remote daemon is unavailable` | The session's tunnel/daemon dropped — left idle and timed out, or the VM was torn down | A drop invalidates the **whole** session (installed app, `@e` refs, Metro). **Don't retry the failed verb** — start a fresh session, reset the dotenv, and re-run install→open→drive from the top, acting immediately. |
19
19
  | Two sessions running / orphaned session | A second `start` (e.g. to "retry" a slow boot) creates another session and overwrites the dotenv id, orphaning the first | Poll the existing session instead. Find orphans with `simulator:list --status in-progress` and stop those you created with `simulator:stop --id <id>`. |
20
20
  | A device verb hangs (no return for a minute+) | Slow daemon; `press`/`screenshot` can block ~90s | Bound it with agent-device's own `--timeout <ms>` (e.g. `--timeout 120000`) — **not** a shell `timeout` wrapper (macOS has no `timeout` binary, so `timeout 120 …` fails with `command not found` and skips the verb). On timeout `snapshot -i` to see if the action landed before retrying (taps can double-fire). Don't blind-retry. |
21
21
  | `install requires an active session or an explicit device selector` | `install` can't infer the device | Pass `--platform ios` (or `open` something first to establish a session). |
22
- | `DEVICE_NOT_FOUND: No device named <udid>` when targeting a non-default device (iPad, second sim) | In a remote session agent-device's `--device` resolves by **name**, not udid (despite the CLI docs) | Pass the device **name** from `agent-device devices` (e.g. `--device "iPad Pro 13-inch (M5)"`), not the udid. |
23
- | `Unknown command: tap` | The tap verb is `press` | Use `press <ref\|selector>` (e.g. `press @e2` or `press 'label="Open"'`). |
22
+ | `DEVICE_NOT_FOUND: No device named <udid>` when targeting a non-default device (iPad, second sim) | agent-device's `--device` takes a **name** only | Pass the device **name** from `agent-device devices` (e.g. `--device "iPad Pro 13-inch (M5)"`), or pass a UDID with `--udid`. |
23
+ | `INVALID_ARGS` "already bound" when passing `--device` | The default agent-device session is already bound to the first simulator | Use a separate agent-device session for the second simulator: `--session <name> --device "<name>"` (see run-your-app.md). |
24
+ | `Unknown command: tap` | An older agent-device version; `tap` is now a hidden alias of `press` | Use `press <ref\|selector>` (e.g. `press @e2` or `press 'label="Open"'`) or `click <target>`. |
25
+ | `record stop` times out | The remote device is still exporting the clip | Run `record stop` again; add `--platform ios` if it cannot find the recording. The clip also uploads as a session artifact (see [controllers.md](./controllers.md#recording-download-recovery)). |
26
+ | `--application-archive-url` install fails | Unsupported archive type | iOS needs a `.tar.gz` or `.tgz` that contains a `.app` (`.zip`, `.app.zip`, and `.ipa` fail). Android needs an `.apk` (`.aab` fails). |
27
+ | `agent-device@latest --help` through `simulator:exec` shows the EAS CLI help | oclif catches `--help` | Use `... agent-device@latest help [topic]`. |
24
28
  | `SESSION_NOT_FOUND: No active session. Run open first.` | A verb (e.g. `screenshot`) ran before any app/session was opened — **or** you used Method 1 (`simulator:start --open-url`), which launches the app but creates NO agent-device session | `open <app\|url>` first (or pass `--platform ios`). After a Method-1 launch, attach without relaunching: `agent-device open <bundleId> --foreground --platform ios` (pass the bundle id — `--foreground` alone fails `AMBIGUOUS_MATCH`), then screenshot. |
25
- | Screenshot looks plausible but the session/UI is wrong (e.g. Safari, an iPhone shot when you booted an iPad, or "incompatible Expo Go SDK") | agent-device **silently falls back to a LOCAL simulator** when `.env.eas-simulator` has no remote config — no error, believable-but-wrong output. Common cause: a **concurrent `simulator:start`** on the same account/machine overwrote the shared dotenv with its own id (the dotenv is a single file, NOT concurrency-safe). | Confirm you're on the REMOTE VM: `simulator:get --json` returns the id `start` printed, AND the verb's "Session state:" path is under **`/Users/expo/`** (remote), not `/Users/<you>/` (local); `devices --json` host is a `turtle-worker-*`. The `sessions/` vs `remote-diagnostics/` directory name is NOT a reliable tell. If concurrency is possible, drive by explicit id — load the daemon vars from `simulator:get --id <id> --json` — instead of trusting the dotenv. |
29
+ | Screenshot looks plausible but the session/UI is wrong (e.g. Safari, an iPhone shot when you booted an iPad, or "incompatible Expo Go SDK") | agent-device **silently falls back to a LOCAL simulator** when `.env.eas-simulator` has no remote config — no error, believable-but-wrong output. Common cause: a **concurrent `simulator:start`** on the same account/machine overwrote the shared dotenv with its own id (the dotenv is a single file, NOT concurrency-safe). | Confirm you're on the REMOTE VM: `simulator:get --json` returns the id `start` printed, AND the verb's "Session state:" path is under **`/Users/expo/`** (iOS) or **`/home/expo/`** (Android) on the remote device, not `/Users/<you>/` (local). `session state-dir` prints the local path, so it is not proof; `devices --json` host is a `turtle-worker-*`. The `sessions/` vs `remote-diagnostics/` directory name is NOT a reliable tell. If concurrency is possible, drive by explicit id — load the daemon vars from `simulator:get --id <id> --json` — instead of trusting the dotenv. |
26
30
  | `simulator:exec` / `build` / `simulator:stop`: "Run this command inside a project directory." | Run from the wrong cwd | Run from the Expo project directory (where `app.json`/`eas.json` live). |
27
31
  | New session's id shows as the *previous* one; "Overwriting previous simulator session (id: …)" | `.env.eas-simulator` names an earlier session | Inspect it with `simulator:get --json`. Reuse it when it belongs to this run; stop it only when it is in scope and no longer needed. An `IN_PROGRESS` session may be intentionally concurrent, so preserve its id/config before resetting the dotenv and drive sessions by explicit id/config. Replacing the file does not stop the remote session. |
28
- | No `.env.eas-simulator` written after `start` | `--out-config-type env` was selected, or the CLI reported a file-write failure | Use the default `--out-config-type dotenv` for the `exec` flow. `--json` changes output and implies non-interactive mode, but does not by itself suppress the completed dotenv write. |
32
+ | No `.env.eas-simulator` written after `start` | `--out-config-type env` was selected, or the CLI reported a file-write failure | Use the default `--out-config-type dotenv` for the `exec` flow. `--json` changes output and implies non-interactive mode, but does not by itself suppress the completed dotenv write. `--out-config-type env` prints only the controller `export` lines and no `EAS_SIMULATOR_SESSION_ID`, so pass `--id` to `get`, `stop`, and `events`. |
29
33
  | `pod install` fails: `Unicode Normalization not appropriate for ASCII-8BIT` | Ruby 4 + CocoaPods with a non-UTF-8 locale | Re-run with `LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 pod install`. |
30
34
  | (Mode C) Deep-link `open` lands on the dev-client launcher, not the app | The "Open in '<app>'?" system dialog wasn't accepted, so the deep link didn't take | Accept the dialog with `agent-device alert accept 2500 --platform ios` (not a UI tap). If it still lands on the launcher, fall back to "Enter URL manually" → `fill` the `https://<host>.on.expo.app` manifest URL → "Connect" (see run-your-app.md Mode C). |
31
35
  | (Mode C) App shows expo-router "Unmatched Route" | The connect URL was parsed as a route path | `press 'label="Go back"'` (or navigate to `/`). |
@@ -39,6 +43,10 @@ Concrete errors seen while validating this flow, and the fix.
39
43
  | Screenshot shows **old content** / my recent edits don't appear | Running a **release build (Mode A/B)** whose JS was baked in *before* your edits — typically a reused/stale build | A/B reflect code at build time, not now. **Rebuild** (ensure the build's fingerprint matches current source), or use **Mode C** (dev + Metro) so live edits show via Fast Refresh. The screenshot itself is fresh — it's the build that's stale. (`9:41` in the status bar is the sim default, not staleness.) |
40
44
  | (Android) The emulator stopped, and `agent-device boot` times out (`Daemon request timed out`) while the device stays `booted=false` | Without `--headless`, agent-device starts the emulator with a window. The EAS Linux image cannot run the windowed emulator, so it exits at once | Boot headless. Set `AGENT_DEVICE_HEADLESS=1` for the whole run, or pass `--headless` on each `boot`: `AGENT_DEVICE_HEADLESS=1 npx --yes eas-cli@latest simulator:exec npx agent-device@latest boot --platform android --device <avd-name>`. Get the AVD name from `agent-device devices --platform android`. The variable is read by the local client, so set it where you run the command. |
41
45
  | (argent) Every `argent run`/`tools` call returns `401 Unauthorized` right after linking | `argent link` without `--yes` no-ops on an already-linked URL ("Already linked. No changes."), keeping a stale token from a previous session | Re-link with `--yes` so the new token is written — see the link command in [controllers.md](./controllers.md). |
46
+ | `/crashes` returns `404 Not found` on the preview API | The session's preview server predates the crash and log routes | Use `agent-device logs` for the device log, and tell the user crash reports aren't available on that session. Don't call `/logs` there. See [logs-and-crashes.md](./logs-and-crashes.md). |
47
+ | `sim_api` stops with `API_BASE: no preview API` | The `API=` lookup failed: the session is not `IN_PROGRESS`, is not iOS, or has no preview API | Read the lookup's own error line above it. Check the `--id`, or start a new session. See [logs-and-crashes.md](./logs-and-crashes.md). |
48
+ | `sim_api` fails with `401` | The session ended or its token changed, so the preview server rejects the old one | Run the `API=` lookup again. It prints the session's status when the session is no longer `IN_PROGRESS`. See [logs-and-crashes.md](./logs-and-crashes.md). |
49
+ | A crash shows up but its `logTailSource` is `none`, `buffer-rolled-past`, or `no-app-lines` with no lines | Nothing held the device log when the crash happened, or a busy device rolled the buffer past it (common in the first minutes after boot) | Start the `/crashes?tail=1` hold (or call `sim_api /logs "snapshot=1&follow=1&limit=1"` more often than every 8 seconds) **before** reproducing. After a boot, reproduce again once logging settles, a minute or two later. |
42
50
 
43
51
  ## Performance expectations
44
52
 
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: eas-update
3
- description: "EAS service (paid). Configure and use EAS Update for over-the-air JavaScript and asset updates with expo-updates and EAS CLI. Use when setting up OTA updates, running eas update:configure or eas update, publishing to preview/staging/production channels, explaining branches/channels/runtime versions, testing updates, or debugging why an installed build still shows old code. Load for TestFlight, preview, or production updates that do not appear, including questions about cold launches or reopening the app. Not for update health metrics; use eas-update-insights for adoption, crashes, and rollout monitoring."
3
+ description: "Configure and use EAS Update for over-the-air JavaScript and asset updates with expo-updates and EAS CLI. Use when setting up OTA updates, running eas update:configure or eas update, publishing to preview/staging/production channels, explaining branches/channels/runtime versions, testing updates, or debugging why an installed build still shows old code. Load for TestFlight, preview, or production updates that do not appear, including questions about cold launches or reopening the app. Not for update health metrics; use eas-update-insights for adoption, crashes, and rollout monitoring."
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  allowed-tools: "Bash(npx expo *), Bash(npx *eas-cli@*), Bash(eas *)"
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # EAS Update
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "EAS Update"
3
- short_description: "Paid EAS service. Configure, publish, test, and debug over-the-air updates with expo-updates and EAS CLI"
3
+ short_description: "Configure, publish, test, and debug over-the-air updates with expo-updates and EAS CLI"
4
4
  default_prompt: "Use $eas-update to configure EAS Update, publish a compatible OTA update to the intended channel, test it in development or release builds, and debug channel or runtime-version mismatches."
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: eas-update-insights
3
- description: "EAS service (paid). Check the health of published EAS Update: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health."
3
+ description: "Check the health of published EAS Update: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health."
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  allowed-tools: "Bash(eas *)"
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # EAS Update Insights
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "EAS Update Insights"
3
- short_description: "Paid EAS service. Check EAS Update health, adoption, crash rates, launch counts, payload size, and OTA vs embedded usage"
3
+ short_description: "Check EAS Update health, adoption, crash rates, launch counts, payload size, and OTA vs embedded usage"
4
4
  default_prompt: "Use $eas-update-insights to inspect published EAS Update with eas-cli, compare rollout health, gather update or channel metrics, parse JSON output, and gate releases on aggregate update performance."
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: eas-workflows
3
- description: EAS service (paid). Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.
3
+ description: Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.
4
4
  allowed-tools: "Read,Write,Bash(node:*),Bash(npx *eas-cli@*)"
5
5
  version: 1.0.0
6
6
  license: MIT License
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # EAS Workflows Skill
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "EAS Workflows"
3
- short_description: "Paid EAS service. Write and validate EAS workflow YAML files for Expo projects"
3
+ short_description: "Write and validate EAS workflow YAML files for Expo projects"
4
4
  default_prompt: "Use $eas-workflows when creating or editing .eas/workflows YAML, validating EAS workflow configuration, or answering questions about workflow triggers, jobs, runners, and expressions."
@@ -11,6 +11,7 @@ metadata:
11
11
  links:
12
12
  repository: https://github.com/resend/email-best-practices
13
13
  documentation: https://resend.com/docs/email-best-practices-skill
14
+ disable-model-invocation: true
14
15
  ---
15
16
 
16
17
  # Email Best Practices
@@ -59,24 +59,23 @@ Handle transient failures with exponential backoff.
59
59
  ### Exponential Backoff
60
60
 
61
61
  ```typescript
62
- async function sendWithRetry(emailData, maxRetries = 3) {
62
+ async function sendWithRetry(emailData, maxRetries = 5) {
63
63
  for (let attempt = 0; attempt < maxRetries; attempt++) {
64
- try {
65
- return await resend.emails.send(emailData);
66
- } catch (error) {
67
- if (!isRetryable(error) || attempt === maxRetries - 1) {
68
- throw error;
69
- }
70
- const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
71
- await sleep(delay + Math.random() * 1000); // Add jitter
64
+ const { data, error } = await resend.emails.send(emailData);
65
+ if (!error) {
66
+ return data;
72
67
  }
68
+ if (!isRetryable(error) || attempt === maxRetries - 1) {
69
+ throw error;
70
+ }
71
+ const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
72
+ await sleep(delay + Math.random() * 1000); // Add jitter
73
73
  }
74
74
  }
75
75
 
76
76
  function isRetryable(error) {
77
77
  return error.statusCode >= 500 ||
78
- error.statusCode === 429 ||
79
- error.code === 'ETIMEDOUT';
78
+ error.statusCode === 429;
80
79
  }
81
80
  ```
82
81
 
@@ -100,10 +99,9 @@ function isRetryable(error) {
100
99
  ### Error Handling Pattern
101
100
 
102
101
  ```typescript
103
- try {
104
- const result = await resend.emails.send(emailData);
105
- await logSuccess(result.id, emailData);
106
- } catch (error) {
102
+ const { data, error } = await resend.emails.send(emailData);
103
+
104
+ if (error) {
107
105
  if (error.statusCode === 429) {
108
106
  await queueForRetry(emailData, error.retryAfter);
109
107
  } else if (error.statusCode >= 500) {
@@ -112,6 +110,8 @@ try {
112
110
  await logFailure(error, emailData);
113
111
  await alertOnCriticalEmail(emailData); // For password resets, etc.
114
112
  }
113
+ } else {
114
+ await logSuccess(data.id, emailData);
115
115
  }
116
116
  ```
117
117
 
@@ -137,14 +137,9 @@ For critical emails, use a queue to ensure delivery even if the initial send fai
137
137
  Set appropriate timeouts to avoid hanging requests.
138
138
 
139
139
  ```typescript
140
- const controller = new AbortController();
141
- const timeout = setTimeout(() => controller.abort(), 10000);
140
+ const signal = new AbortSignal.timeout(10000);
142
141
 
143
- try {
144
- await resend.emails.send(emailData, { signal: controller.signal });
145
- } finally {
146
- clearTimeout(timeout);
147
- }
142
+ await resend.emails.send(emailData, { signal });
148
143
  ```
149
144
 
150
145
  **Recommended:** 10-30 seconds for email API calls.
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-animation
3
- description: Framework (OSS). Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use `animate`.
3
+ description: Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use `animate`.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Building Animations in Expo
@@ -3,6 +3,7 @@ name: expo-api-routes
3
3
  description: Guidelines for creating API routes in Expo Router with EAS Hosting
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  ## When to Use API Routes
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: expo-app-clip
3
- description: Framework (OSS). Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
3
+ description: Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
4
+ disable-model-invocation: true
4
5
  ---
5
6
 
6
7
  # Add an App Clip to an Expo App
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: expo-brownfield
3
- description: Framework (OSS). Integrate Expo and React Native into an existing native iOS or Android app. Use for brownfield, embedding a React Native screen in SwiftUI/UIKit or Kotlin, or AAR/XCFramework packaging. Covers isolated and integrated approaches. For building or distributing a purely native app with EAS, use eas-app-stores.
3
+ description: Integrate Expo and React Native into an existing native iOS or Android app. Use for brownfield, embedding a React Native screen in SwiftUI/UIKit or Kotlin, or AAR/XCFramework packaging. Covers isolated and integrated approaches. For building or distributing a purely native app with EAS, use eas-app-stores.
4
+ disable-model-invocation: true
4
5
  ---
5
6
 
6
7
  # Expo Brownfield
@@ -4,6 +4,7 @@ description: Helps understand and write EAS workflow YAML files for Expo project
4
4
  allowed-tools: "Read,Write,Bash(node:*)"
5
5
  version: 1.0.0
6
6
  license: MIT License
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # EAS Workflows Skill
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-data-fetching
3
- description: Framework (OSS). Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, loading/empty/error screen states, and Expo Router data loaders (`useLoaderData`).
3
+ description: Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, loading/empty/error screen states, and Expo Router data loaders (`useLoaderData`).
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Expo Networking
@@ -3,6 +3,7 @@ name: expo-deployment
3
3
  description: Deploy Expo apps to production with EAS — build and submit to the iOS App Store, Google Play Store, and TestFlight, configure eas.json build and submit profiles, manage app versions and build numbers, publish App Store metadata and ASO, and deploy web bundles and API routes via EAS Hosting. Use whenever the user is preparing a production build, running eas build or eas submit, shipping to TestFlight, releasing or rolling out to the app stores, bumping version or build numbers, or setting up store listing metadata for an Expo app.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Deployment
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-design-system
3
- description: Framework (OSS). Build and maintain a design system inside an Expo app - a reusable theme of design tokens (color, spacing, typography, radius, shadow, motion), reusable component structure with variant/size/state prop conventions, and rules for when to extract a repeated view into a shared component. Use when creating or organizing theme files and design tokens (theme.ts / theme/), extending an existing theme or styling library (NativeWind, Tamagui, Restyle, Unistyles) in its own idiom, standardizing styles so screens (including AI-generated ones) look consistent and polished, fixing an app that looks AI-generated or generic instead of native (the named native-slop tells), building an in-app component library, or auditing an app for design-system drift (hardcoded colors, spacing, fonts). For platform styling specifics (semantic colors, HIG rules, native controls) use expo-native-ui; for folder layout of a new app use expo-project-structure.
3
+ description: Build and maintain a design system inside an Expo app - a reusable theme of design tokens (color, spacing, typography, radius, shadow, motion), reusable component structure with variant/size/state prop conventions, and rules for when to extract a repeated view into a shared component. Use when creating or organizing theme files and design tokens (theme.ts / theme/), extending an existing theme or styling library (NativeWind, Tamagui, Restyle, Unistyles) in its own idiom, standardizing styles so screens (including AI-generated ones) look consistent and polished, fixing an app that looks AI-generated or generic instead of native (the named native-slop tells), building an in-app component library, or auditing an app for design-system drift (hardcoded colors, spacing, fonts). For platform styling specifics (semantic colors, HIG rules, native controls) use expo-native-ui; for folder layout of a new app use expo-project-structure.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Expo Design Systems
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-dev-client
3
- description: Framework (OSS). Build and distribute Expo development clients locally or via TestFlight for internal testing. For production TestFlight releases and store submission, use the eas-app-stores skill.
3
+ description: Build and distribute Expo development clients locally or via TestFlight for internal testing. For production TestFlight releases and store submission, use the eas-app-stores skill.
4
4
  version: 1.1.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  Use EAS Build to create development clients for testing native code changes on physical devices. Use this for creating custom Expo Go clients for testing branches of your app.
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-dom
3
- description: Framework (OSS). Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally. For the end-to-end migration of a whole web app, use the expo-web-to-native skill.
3
+ description: Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally. For the end-to-end migration of a whole web app, use the expo-web-to-native skill.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  ## What are DOM Components?
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: expo-examples
3
- description: Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.
3
+ description: Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.
4
4
  allowed-tools: "Read,Bash(gh api:*),Bash(git clone:*),Bash(npx create-expo:*),Bash(npx degit:*),Bash(bun create:*)"
5
5
  version: 1.0.0
6
6
  license: MIT
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # Expo Examples
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-migrate-module
3
- description: Framework (OSS). Migrate an existing Apple/Swift Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API (sometimes called v2) while preserving its JavaScript and TypeScript contract. Use when converting or incrementally adopting @ExpoModule, @JS, @Event, @SharedObject, or @Record in an existing module. Do not use for creating a new module, general Expo SDK upgrades, or Android/Kotlin migrations.
3
+ description: Migrate an existing Apple/Swift Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API (sometimes called v2) while preserving its JavaScript and TypeScript contract. Use when converting or incrementally adopting @ExpoModule, @JS, @Event, @SharedObject, or @Record in an existing module. Do not use for creating a new module, general Expo SDK upgrades, or Android/Kotlin migrations.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Migrate an Expo Module
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-module
3
- description: Framework (OSS). Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo. Not for migrating an existing Swift module from the definition DSL to the Expo Modules API 2.0 macros; use expo-migrate-module (from the expo-experiments plugin) for that.
3
+ description: Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo. Not for migrating an existing Swift module from the definition DSL to the Expo Modules API 2.0 macros; use expo-migrate-module (from the expo-experiments plugin) for that.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Writing Expo Modules
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-native-ui
3
- description: Framework (OSS). Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill; for motion and animation, use the expo-animation skill.
3
+ description: Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill; for motion and animation, use the expo-animation skill.
4
4
  version: 1.1.1
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Expo Native UI Guidelines
@@ -3,6 +3,7 @@ name: expo-observe
3
3
  description: Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, the Expo Router / React Navigation integrations for per-route metrics, and user-defined events via `Observe.logEvent`), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # EAS Observe
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-overview
3
- description: "Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules."
3
+ description: "Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules."
4
4
  version: 1.1.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # `expo-overview` — router & shared rules for Expo / EAS
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-project-structure
3
- description: Framework (OSS). Folder structure for a new Expo app. Use when scaffolding or laying out a new Expo project with Expo Router, or deciding where a file should live in one. For new projects only — never restructure an existing app to match.
3
+ description: Folder structure for a new Expo app. Use when scaffolding or laying out a new Expo project with Expo Router, or deciding where a file should live in one. For new projects only — never restructure an existing app to match.
4
4
  version: 1.0.0
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Expo Project Structure
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: expo-router
3
- description: Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.
3
+ description: Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.
4
4
  version: 1.0.1
5
5
  license: MIT
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # Expo Router Navigation
@@ -4,6 +4,7 @@ description: Evaluate Expo skills in this repo end-to-end - trigger accuracy, ge
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  allowed-tools: "Read(~/.cache/expo-skill-eval/**), Read(/tmp/expo-skill-eval-*/**), Read(/private/tmp/expo-skill-eval-*/**), Write(/tmp/expo-skill-eval-*/**), Write(/private/tmp/expo-skill-eval-*/**), Edit(/tmp/expo-skill-eval-*/**), Edit(/private/tmp/expo-skill-eval-*/**), Bash(python3 /tmp/expo-skill-eval-*), Bash(python3 /private/tmp/expo-skill-eval-*), Bash(python3 *expo-skill-eval/scripts/*), Bash(tee /tmp/expo-skill-eval-*), Bash(tee /private/tmp/expo-skill-eval-*), Bash(bash *expo-skill-eval/scripts/*)"
7
+ disable-model-invocation: true
7
8
  ---
8
9
 
9
10
  # Expo Skill Eval