reis-mobile 0.3.5 → 0.4.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 (465) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +33 -0
  4. package/README.md +186 -172
  5. package/THIRD_PARTY_NOTICES.md +224 -4
  6. package/agents/android-architect.md +89 -0
  7. package/agents/android-performance-engineer.md +92 -0
  8. package/agents/android-test-engineer.md +97 -0
  9. package/agents/flutter-test-engineer.md +2 -0
  10. package/agents/ios-architect.md +93 -0
  11. package/agents/ios-performance-engineer.md +92 -0
  12. package/agents/ios-test-engineer.md +95 -0
  13. package/agents/lead-mobile.md +10 -1
  14. package/agents/mobile-staff-engineer.md +1 -1
  15. package/agents/rn-architect.md +94 -0
  16. package/agents/rn-performance-engineer.md +92 -0
  17. package/agents/rn-test-engineer.md +98 -0
  18. package/bin/reis-mobile.mjs +83 -33
  19. package/commands/debate.md +10 -1
  20. package/commands/debug.md +60 -0
  21. package/commands/reis-mobile.md +7 -2
  22. package/core/config/project.mjs +59 -0
  23. package/core/install/codex-plugin.mjs +66 -0
  24. package/core/install/init.mjs +46 -0
  25. package/core/registry/frontmatter.mjs +15 -4
  26. package/core/registry/registry.mjs +21 -1
  27. package/core/router/intents.mjs +2 -0
  28. package/core/router/router.mjs +10 -5
  29. package/package.json +1 -1
  30. package/skills/android-adaptive/SKILL.md +304 -0
  31. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
  32. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
  33. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
  34. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
  35. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
  36. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
  37. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
  38. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
  39. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
  40. package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
  41. package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  42. package/skills/android-agp-9-upgrade/SKILL.md +106 -0
  43. package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
  44. package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
  45. package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
  46. package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
  47. package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
  48. package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
  49. package/skills/android-appfunctions/SKILL.md +74 -0
  50. package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
  51. package/skills/android-appfunctions/references/context.md +26 -0
  52. package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
  53. package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
  54. package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
  55. package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
  56. package/skills/android-camerax/SKILL.md +135 -0
  57. package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
  58. package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
  59. package/skills/android-camerax/references/expert-blueprints.md +58 -0
  60. package/skills/android-camerax/references/foldables.md +83 -0
  61. package/skills/android-camerax/references/immutability.md +60 -0
  62. package/skills/android-camerax/references/low-light.md +124 -0
  63. package/skills/android-camerax/references/mlkit-spatial.md +75 -0
  64. package/skills/android-camerax/references/modern-apis.md +42 -0
  65. package/skills/android-camerax/references/testing.md +69 -0
  66. package/skills/android-camerax/references/thermals.md +85 -0
  67. package/skills/android-camerax/references/wear-os.md +76 -0
  68. package/skills/android-camerax/references/xr.md +54 -0
  69. package/skills/android-cli/SKILL.md +474 -0
  70. package/skills/android-cli/references/interact.md +113 -0
  71. package/skills/android-cli/references/journeys.md +120 -0
  72. package/skills/android-code-review/SKILL.md +58 -0
  73. package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
  74. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
  75. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
  76. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
  77. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
  78. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
  79. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
  80. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
  81. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
  82. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
  83. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
  84. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
  85. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
  86. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
  87. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
  88. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
  89. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
  90. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
  91. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
  92. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
  93. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
  94. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
  95. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
  96. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
  97. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
  98. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
  99. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
  100. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
  101. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
  102. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
  103. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
  104. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
  105. package/skills/android-edge-to-edge/SKILL.md +429 -0
  106. package/skills/android-engage-sdk-integration/SKILL.md +130 -0
  107. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
  108. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
  109. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
  110. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
  111. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
  112. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
  113. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
  114. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
  115. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
  116. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
  117. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
  118. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
  119. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
  120. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
  121. package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
  122. package/skills/android-engage-sdk-integration/references/common.md +519 -0
  123. package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
  124. package/skills/android-engage-sdk-integration/references/requests.md +260 -0
  125. package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
  126. package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
  127. package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
  128. package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
  129. package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
  130. package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
  131. package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
  132. package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
  133. package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
  134. package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
  135. package/skills/android-gradle-build-debug/SKILL.md +71 -0
  136. package/skills/android-intent-security/SKILL.md +550 -0
  137. package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
  138. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
  139. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
  140. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
  141. package/skills/android-media3-cast-integration/SKILL.md +236 -0
  142. package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
  143. package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
  144. package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
  145. package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
  146. package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
  147. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
  148. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
  149. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
  150. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
  151. package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
  152. package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
  153. package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
  154. package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
  155. package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
  156. package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
  157. package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
  158. package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
  159. package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
  160. package/skills/android-navigation-3/SKILL.md +122 -0
  161. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
  162. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
  163. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
  164. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
  165. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
  166. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
  167. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
  168. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
  169. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
  170. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
  171. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
  172. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
  173. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
  174. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
  175. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
  176. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  177. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
  178. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
  179. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
  180. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
  181. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
  182. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
  183. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
  184. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
  185. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
  186. package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
  187. package/skills/android-navigation-event/SKILL.md +312 -0
  188. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
  189. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
  190. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
  191. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
  192. package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
  193. package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
  194. package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
  195. package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
  196. package/skills/android-play-policy-insights/SKILL.md +172 -0
  197. package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
  198. package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
  199. package/skills/android-play-policy-insights/resources/critic.md +86 -0
  200. package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
  201. package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
  202. package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
  203. package/skills/android-play-policy-insights/resources/policies.json +321 -0
  204. package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
  205. package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
  206. package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
  207. package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
  208. package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
  209. package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
  210. package/skills/android-profiler/SKILL.md +60 -0
  211. package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
  212. package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
  213. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
  214. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
  215. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
  216. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
  217. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
  218. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
  219. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
  220. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
  221. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
  222. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
  223. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
  224. package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
  225. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
  226. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
  227. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
  228. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
  229. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
  230. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
  231. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
  232. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
  233. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
  234. package/skills/android-profiler/references/env_setup.md +15 -0
  235. package/skills/android-profiler/references/perfetto/setup.md +29 -0
  236. package/skills/android-profiler/references/perfetto/sql.md +327 -0
  237. package/skills/android-r8-analyzer/SKILL.md +72 -0
  238. package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
  239. package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
  240. package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  241. package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  242. package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  243. package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
  244. package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
  245. package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  246. package/skills/android-restore-credentials/SKILL.md +359 -0
  247. package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
  248. package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
  249. package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
  250. package/skills/android-styles/SKILL.md +229 -0
  251. package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
  252. package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
  253. package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
  254. package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
  255. package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
  256. package/skills/android-verified-email/SKILL.md +432 -0
  257. package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
  258. package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
  259. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
  260. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
  261. package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
  262. package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
  263. package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
  264. package/skills/android-wear-compose-m3/SKILL.md +365 -0
  265. package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
  266. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
  267. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
  268. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
  269. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
  270. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
  271. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
  272. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
  273. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
  274. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
  275. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
  276. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
  277. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
  278. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
  279. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
  280. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
  281. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
  282. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
  283. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
  284. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
  285. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
  286. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
  287. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
  288. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
  289. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
  290. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
  291. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
  292. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
  293. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
  294. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
  295. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
  296. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
  297. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
  298. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
  299. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
  300. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
  301. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
  302. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
  303. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
  304. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
  305. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
  306. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
  307. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
  308. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
  309. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
  310. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
  311. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
  312. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
  313. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
  314. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
  315. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
  316. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
  317. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
  318. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
  319. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
  320. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
  321. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
  322. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
  323. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
  324. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
  325. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
  326. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
  327. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
  328. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
  329. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
  330. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
  331. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
  332. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
  333. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
  334. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
  335. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
  336. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
  337. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
  338. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
  339. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
  340. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
  341. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
  342. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
  343. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
  344. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
  345. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
  346. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
  347. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
  348. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
  349. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
  350. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
  351. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
  352. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
  353. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
  354. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
  355. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
  356. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
  357. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
  358. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
  359. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
  360. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
  361. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
  362. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
  363. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
  364. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
  365. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
  366. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
  367. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
  368. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
  369. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
  370. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
  371. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
  372. package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
  373. package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
  374. package/skills/flutter-build-debug/SKILL.md +66 -0
  375. package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
  376. package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
  377. package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
  378. package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
  379. package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
  380. package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
  381. package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
  382. package/skills/{provider → flutter-provider}/SKILL.md +1 -1
  383. package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
  384. package/skills/ios-cocoapods-debug/SKILL.md +65 -0
  385. package/skills/ios-code-review/SKILL.md +56 -0
  386. package/skills/ios-xcode-build-debug/SKILL.md +66 -0
  387. package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
  388. package/skills/mobile-firebase/SKILL.md +54 -0
  389. package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
  390. package/skills/mobile-firebase/references/android/analytics.md +33 -0
  391. package/skills/mobile-firebase/references/android/app-check.md +36 -0
  392. package/skills/mobile-firebase/references/android/auth.md +44 -0
  393. package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
  394. package/skills/mobile-firebase/references/android/firestore.md +44 -0
  395. package/skills/mobile-firebase/references/android/functions.md +33 -0
  396. package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
  397. package/skills/mobile-firebase/references/android/messaging.md +41 -0
  398. package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
  399. package/skills/mobile-firebase/references/android/remote-config.md +43 -0
  400. package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
  401. package/skills/mobile-firebase/references/android/storage.md +39 -0
  402. package/skills/mobile-firebase/references/android.md +30 -0
  403. package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
  404. package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
  405. package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
  406. package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
  407. package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
  408. package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
  409. package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
  410. package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
  411. package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
  412. package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
  413. package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
  414. package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
  415. package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
  416. package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
  417. package/skills/mobile-firebase/references/flutter.md +36 -0
  418. package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
  419. package/skills/mobile-firebase/references/ios/analytics.md +33 -0
  420. package/skills/mobile-firebase/references/ios/app-check.md +36 -0
  421. package/skills/mobile-firebase/references/ios/auth.md +48 -0
  422. package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
  423. package/skills/mobile-firebase/references/ios/firestore.md +53 -0
  424. package/skills/mobile-firebase/references/ios/functions.md +35 -0
  425. package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
  426. package/skills/mobile-firebase/references/ios/messaging.md +45 -0
  427. package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
  428. package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
  429. package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
  430. package/skills/mobile-firebase/references/ios/storage.md +36 -0
  431. package/skills/mobile-firebase/references/ios.md +28 -0
  432. package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
  433. package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
  434. package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
  435. package/skills/mobile-firebase/references/react-native/auth.md +50 -0
  436. package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
  437. package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
  438. package/skills/mobile-firebase/references/react-native/functions.md +28 -0
  439. package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
  440. package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
  441. package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
  442. package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
  443. package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
  444. package/skills/mobile-firebase/references/react-native/storage.md +30 -0
  445. package/skills/mobile-firebase/references/react-native.md +29 -0
  446. package/skills/mobile-test/SKILL.md +63 -0
  447. package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
  448. package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
  449. package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
  450. package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
  451. package/skills/mobile-test/references/android.md +83 -0
  452. package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
  453. package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
  454. package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
  455. package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
  456. package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
  457. package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
  458. package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
  459. package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
  460. package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
  461. package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
  462. package/skills/mobile-test/references/flutter.md +44 -0
  463. package/skills/mobile-test/references/ios.md +79 -0
  464. package/skills/mobile-test/references/react-native.md +62 -0
  465. /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
@@ -0,0 +1,83 @@
1
+ # Testing native Android apps
2
+
3
+ For setting up a test stack from scratch (dependencies, UI tests, screenshot tests, Hilt), follow [android/setup/GUIDE.md](android/setup/GUIDE.md). This file covers writing tests in an existing setup.
4
+
5
+ ## Detect the setup
6
+
7
+ - Test dependencies in the module build files and `gradle/libs.versions.toml`: JUnit 4 or 5, `kotlinx-coroutines-test`, Turbine, MockK or Mockito-Kotlin, Truth or AssertJ, Robolectric, `androidx.compose.ui:ui-test-junit4`, Espresso, `hilt-android-testing`.
8
+ - Source sets: **local tests** in `src/test` run on the JVM; **instrumented tests** in `src/androidTest` need a device or emulator.
9
+ - Existing helpers: a `MainDispatcherRule`, fakes, a `:core:testing` module, custom test runners.
10
+
11
+ ## Local unit tests: ViewModels, coroutines and Flow
12
+
13
+ ```kotlin
14
+ class MainDispatcherRule(val dispatcher: TestDispatcher = UnconfinedTestDispatcher()) : TestWatcher() {
15
+ override fun starting(description: Description) = Dispatchers.setMain(dispatcher)
16
+ override fun finished(description: Description) = Dispatchers.resetMain()
17
+ }
18
+
19
+ class LoginViewModelTest {
20
+ @get:Rule val mainDispatcherRule = MainDispatcherRule()
21
+
22
+ private val repository = FakeAuthRepository()
23
+
24
+ @Test
25
+ fun `emits success when credentials are valid`() = runTest {
26
+ repository.nextResult = Result.success(fakeUser)
27
+ val viewModel = LoginViewModel(repository)
28
+
29
+ viewModel.uiState.test { // Turbine
30
+ assertEquals(LoginUiState.Idle, awaitItem())
31
+ viewModel.submit("user@example.com", "secret")
32
+ assertEquals(LoginUiState.Loading, awaitItem())
33
+ assertEquals(LoginUiState.Success(fakeUser), awaitItem())
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ - `runTest` skips `delay` with virtual time; `advanceUntilIdle()` and `advanceTimeBy()` control it with a `StandardTestDispatcher`.
40
+ - Inject dispatchers into repositories and use cases instead of hardcoding `Dispatchers.IO`; tests pass the test dispatcher.
41
+ - Code that uses `viewModelScope` needs `Dispatchers.Main` replaced (the rule above).
42
+ - The names above are illustrative; use the project's classes.
43
+
44
+ ## Compose UI tests
45
+
46
+ ```kotlin
47
+ class LoginScreenTest {
48
+ @get:Rule val composeRule = createComposeRule()
49
+
50
+ @Test
51
+ fun showsErrorWhenLoginFails() {
52
+ composeRule.setContent { LoginScreen(state = LoginUiState.Error("Invalid credentials"), onSubmit = {}) }
53
+
54
+ composeRule.onNodeWithText("Invalid credentials").assertIsDisplayed()
55
+ composeRule.onNodeWithText("Sign in").performClick()
56
+ }
57
+ }
58
+ ```
59
+
60
+ - Test stateless composables with state passed in; they need no ViewModel or DI.
61
+ - Prefer finding nodes by text or content description; add `Modifier.testTag` only where there is no user-visible handle.
62
+ - These tests are instrumented by default; with Robolectric configured, they can run as local tests.
63
+
64
+ ## Views, Espresso and Hilt
65
+
66
+ - Espresso: `onView(withId(R.id.submit)).perform(click())`, `check(matches(isDisplayed()))`. Disable animations on test devices, and use idling resources for background work instead of sleeps.
67
+ - Hilt: annotate the test with `@HiltAndroidTest`, add `HiltAndroidRule`, use a custom runner that sets `HiltTestApplication`, and replace modules with `@TestInstallIn`. Details in [android/setup/references/android/training/dependency-injection/hilt-testing.md](android/setup/references/android/training/dependency-injection/hilt-testing.md).
68
+
69
+ ## Other components
70
+
71
+ - **Room**: test DAOs against `Room.inMemoryDatabaseBuilder`; test migrations with `MigrationTestHelper` in instrumented tests.
72
+ - **WorkManager**: `work-testing` provides test drivers to run workers synchronously.
73
+ - **DataStore**: create it in a temporary folder per test.
74
+
75
+ ## Commands
76
+
77
+ ```bash
78
+ ./gradlew :app:testDebugUnitTest # local tests of one module
79
+ ./gradlew :app:testDebugUnitTest --tests '*LoginViewModelTest'
80
+ ./gradlew :app:connectedDebugAndroidTest # instrumented tests, needs a device or emulator
81
+ ```
82
+
83
+ For coverage, enable `enableUnitTestCoverage` / `enableAndroidTestCoverage` on the build type and run the coverage report task the Android Gradle plugin creates for it; check the task name for the project's AGP version.
@@ -1,14 +1,5 @@
1
- ---
2
- name: dart-collect-coverage
3
- description: Collect coverage using the coverage packge and create an LCOV report
4
- metadata:
5
- model: models/gemini-3.1-pro-preview
6
- last_modified: Fri, 24 Apr 2026 15:14:32 GMT
7
- intents: [test]
8
- stacks: [flutter]
9
- source: https://github.com/dart-lang/skills
10
- license: BSD-3-Clause
11
- ---
1
+ > Adapted from the `dart-collect-coverage` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
12
3
  # Implementing Dart and Flutter Test Coverage
13
4
 
14
5
  ## Contents
@@ -1,14 +1,5 @@
1
- ---
2
- name: dart-generate-test-mocks
3
- description: Define and generate mock objects for external dependencies using `package:mockito` and `build_runner`. Use when unit testing classes that depend on complex external services like APIs or databases.
4
- metadata:
5
- model: models/gemini-3.1-pro-preview
6
- last_modified: Fri, 24 Apr 2026 15:13:58 GMT
7
- intents: [test]
8
- stacks: [flutter]
9
- source: https://github.com/dart-lang/skills
10
- license: BSD-3-Clause
11
- ---
1
+ > Adapted from the `dart-generate-test-mocks` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
12
3
  # Testing and Mocking Dart Applications
13
4
 
14
5
  ## Contents
@@ -1,14 +1,5 @@
1
- ---
2
- name: flutter-add-integration-test
3
- description: Configures Flutter Driver for app interaction and converts MCP actions into permanent integration tests. Use when adding integration testing to a project, exploring UI components via MCP, or automating user flows with the integration_test package.
4
- metadata:
5
- model: models/gemini-3.1-pro-preview
6
- last_modified: Tue, 21 Apr 2026 18:29:20 GMT
7
- intents: [test]
8
- stacks: [flutter]
9
- source: https://github.com/flutter/skills
10
- license: BSD-3-Clause
11
- ---
1
+ > Adapted from the `flutter-add-integration-test` skill in [flutter/skills](https://github.com/flutter/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
12
3
  # Implementing Flutter Integration Tests
13
4
 
14
5
  ## Contents
@@ -1,16 +1,5 @@
1
- ---
2
- name: dart-migrate-to-checks-package
3
- description: |-
4
- Replace the usage of `expect` and similar functions from `package:matcher`
5
- to `package:checks` equivalents.
6
- metadata:
7
- model: models/gemini-3.1-pro-preview
8
- last_modified: Tue, 09 Jun 2026 19:30:00 GMT
9
- intents: [migration]
10
- stacks: [flutter]
11
- source: https://github.com/dart-lang/skills
12
- license: BSD-3-Clause
13
- ---
1
+ > Adapted from the `dart-migrate-to-checks-package` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
14
3
  # Migrating Dart Tests to Package Checks
15
4
 
16
5
  Use this skill when you need to migrate a Dart test suite from the legacy
@@ -1,11 +1,4 @@
1
- ---
2
- name: mockito
3
- description: Uses the Mockito package for mocking in Flutter/Dart tests. Use when generating mocks, stubbing methods, verifying interactions, capturing arguments, or deciding between mocks, fakes, and real objects.
4
- intents: [test]
5
- stacks: [flutter]
6
- source: https://github.com/evanca/flutter-ai-rules
7
- license: MIT
8
- ---
1
+ > Adapted from the `mockito` skill in [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) (MIT). See `THIRD_PARTY_NOTICES.md`.
9
2
 
10
3
  # Mockito Skill
11
4
 
@@ -1,11 +1,4 @@
1
- ---
2
- name: mocktail
3
- description: Uses the Mocktail package for mocking in Flutter/Dart tests. Use when creating mocks, stubbing methods, verifying interactions, registering fallback values, or deciding between mocks, fakes, and real objects.
4
- intents: [test]
5
- stacks: [flutter]
6
- source: https://github.com/evanca/flutter-ai-rules
7
- license: MIT
8
- ---
1
+ > Adapted from the `mocktail` skill in [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) (MIT). See `THIRD_PARTY_NOTICES.md`.
9
2
 
10
3
  # Mocktail Skill
11
4
 
@@ -1,11 +1,4 @@
1
- ---
2
- name: patrol-e2e-testing
3
- description: Generates and maintains end-to-end tests for Flutter apps using Patrol. Use when adding E2E coverage for new features, regression tests for UI bugs, or testing native interactions (permissions, system dialogs, deep links)
4
- intents: [test]
5
- stacks: [flutter]
6
- source: https://github.com/evanca/flutter-ai-rules
7
- license: MIT
8
- ---
1
+ > Adapted from the `patrol-e2e-testing` skill in [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) (MIT). See `THIRD_PARTY_NOTICES.md`.
9
2
 
10
3
  # Patrol E2E Testing Skill
11
4
 
@@ -1,11 +1,4 @@
1
- ---
2
- name: testing
3
- description: Writes and reviews Flutter/Dart tests. Use when writing unit tests, widget tests, or reviewing existing tests for correctness, structure, and naming conventions.
4
- intents: [test]
5
- stacks: [flutter]
6
- source: https://github.com/evanca/flutter-ai-rules
7
- license: MIT
8
- ---
1
+ > Adapted from the `testing` skill in [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) (MIT). See `THIRD_PARTY_NOTICES.md`.
9
2
 
10
3
  # Testing Skill
11
4
 
@@ -1,14 +1,5 @@
1
- ---
2
- name: dart-add-unit-test
3
- description: Write and organize unit tests for functions, methods, and classes using `package:test`. Use when creating new logic or fixing bugs to ensure code remains correct and regression-free.
4
- metadata:
5
- model: models/gemini-3.1-pro-preview
6
- last_modified: Mon, 03 Aug 2026 21:51:24 GMT
7
- intents: [test]
8
- stacks: [flutter]
9
- source: https://github.com/dart-lang/skills
10
- license: BSD-3-Clause
11
- ---
1
+ > Adapted from the `dart-add-unit-test` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
12
3
  # Testing Dart and Flutter Applications
13
4
 
14
5
  ## Contents
@@ -1,14 +1,5 @@
1
- ---
2
- name: flutter-add-widget-test
3
- description: Implement a component-level test using `WidgetTester` to verify UI rendering and user interactions (tapping, scrolling, entering text). Use when validating that a specific widget displays correct data and responds to events as expected.
4
- metadata:
5
- model: models/gemini-3.1-pro-preview
6
- last_modified: Tue, 21 Apr 2026 21:15:41 GMT
7
- intents: [test]
8
- stacks: [flutter]
9
- source: https://github.com/flutter/skills
10
- license: BSD-3-Clause
11
- ---
1
+ > Adapted from the `flutter-add-widget-test` skill in [flutter/skills](https://github.com/flutter/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
2
+
12
3
  # Writing Flutter Widget Tests
13
4
 
14
5
  ## Contents
@@ -0,0 +1,44 @@
1
+ # Testing Flutter and Dart apps
2
+
3
+ Start here for Flutter projects, then open the detailed guide for the task.
4
+
5
+ ## Detect the setup
6
+
7
+ - `dev_dependencies` in `pubspec.yaml`: `flutter_test`, `test`, `mocktail` or `mockito` (with `build_runner`), `bloc_test`, `integration_test`, `patrol`, `checks`.
8
+ - State management (BLoC/Cubit, Riverpod, Provider) and existing helpers under `test/`.
9
+ - The Dart SDK constraint: records, patterns and sealed classes need Dart 3.
10
+
11
+ When the project has no mocking library yet, prefer `mocktail`: it needs no code generation.
12
+
13
+ ## Guides
14
+
15
+ | Task | Guide |
16
+ |---|---|
17
+ | General guidelines for meaningful Flutter/Dart tests | [flutter/testing-guidelines.md](flutter/testing-guidelines.md) |
18
+ | Unit tests for functions and classes with `package:test` | [flutter/unit-tests.md](flutter/unit-tests.md) |
19
+ | Widget tests with `WidgetTester` | [flutter/widget-tests.md](flutter/widget-tests.md) |
20
+ | Integration tests (`integration_test`, Flutter Driver) | [flutter/integration-tests.md](flutter/integration-tests.md) |
21
+ | End-to-end tests with native interactions using Patrol | [flutter/patrol.md](flutter/patrol.md) |
22
+ | Mocks with mocktail | [flutter/mocktail.md](flutter/mocktail.md) |
23
+ | Mocks with mockito | [flutter/mockito.md](flutter/mockito.md) |
24
+ | Generating mocks with `build_runner` | [flutter/generate-mocks.md](flutter/generate-mocks.md) |
25
+ | Coverage and LCOV reports | [flutter/coverage.md](flutter/coverage.md) |
26
+ | Migrating assertions from `package:matcher` to `package:checks` | [flutter/migrate-to-checks.md](flutter/migrate-to-checks.md) |
27
+
28
+ ## Commands
29
+
30
+ ```bash
31
+ flutter test # unit and widget tests
32
+ flutter test test/features/login/login_cubit_test.dart
33
+ flutter test --coverage # writes coverage/lcov.info
34
+ flutter test integration_test # needs a device, emulator or simulator
35
+ dart test # pure Dart packages
36
+ ```
37
+
38
+ ## Flutter-specific pitfalls
39
+
40
+ - `pumpAndSettle` never returns while an infinite animation (a progress indicator) runs; pump a fixed duration instead.
41
+ - Real timers and `Future.delayed` make widget tests slow and flaky; use `tester.pump(duration)` or `fakeAsync`.
42
+ - Widgets that need `MediaQuery`, localization, theme or providers must be wrapped in the same ancestors the app uses; build a shared `pumpApp` helper.
43
+ - Platform channels (plugins) have no implementation in tests; mock them with `TestDefaultBinaryMessengerBinding` or inject an abstraction over the plugin.
44
+ - Golden tests differ between operating systems and font setups; run them on the same platform in CI that generated the goldens.
@@ -0,0 +1,79 @@
1
+ # Testing native iOS apps
2
+
3
+ ## Detect the setup
4
+
5
+ - Framework: **Swift Testing** (`import Testing`, `@Test`, `#expect`) or **XCTest** (`XCTestCase`). Swift Testing needs Xcode 16 or later; both can live in the same test target, so follow what the file or target already uses.
6
+ - Test targets, test plans and schemes in the Xcode project, or test targets in `Package.swift`.
7
+ - Whether unit tests run inside a host app (the app target launches) or as a logic test bundle.
8
+ - Existing doubles and fixtures; snapshot testing only if the project already has a library for it.
9
+
10
+ ## Unit tests with Swift Testing
11
+
12
+ ```swift
13
+ import Testing
14
+ @testable import App
15
+
16
+ @MainActor
17
+ struct LoginViewModelTests {
18
+ @Test func emitsSuccessWhenCredentialsAreValid() async {
19
+ let viewModel = LoginViewModel(authService: FakeAuthService(result: .success(.fixture)))
20
+
21
+ await viewModel.submit(email: "user@example.com", password: "secret")
22
+
23
+ #expect(viewModel.state == .success(.fixture))
24
+ }
25
+
26
+ @Test(arguments: ["", "no-at-sign", "a@"])
27
+ func rejectsInvalidEmails(_ email: String) {
28
+ #expect(EmailValidator.isValid(email) == false)
29
+ }
30
+ }
31
+ ```
32
+
33
+ - `#expect` records a failure and continues; `try #require(...)` stops the test (use it to unwrap optionals the rest of the test depends on).
34
+ - `#expect(throws: SomeError.self) { try parser.parse(data) }` checks thrown errors.
35
+ - Parameterized tests (`arguments:`) replace copy-pasted test methods.
36
+ - Suites are plain types; setup goes in `init`, teardown in `deinit`.
37
+
38
+ ## Unit tests with XCTest
39
+
40
+ ```swift
41
+ final class LoginViewModelTests: XCTestCase {
42
+ @MainActor
43
+ func testEmitsSuccessWhenCredentialsAreValid() async {
44
+ let viewModel = LoginViewModel(authService: FakeAuthService(result: .success(.fixture)))
45
+
46
+ await viewModel.submit(email: "user@example.com", password: "secret")
47
+
48
+ XCTAssertEqual(viewModel.state, .success(.fixture))
49
+ }
50
+ }
51
+ ```
52
+
53
+ - Use `async` test methods and `await` the work instead of `XCTestExpectation` with timeouts where possible.
54
+ - Methods must start with `test`; `setUp`/`tearDown` (or their `async throws` variants) reset state.
55
+
56
+ ## Test doubles and determinism
57
+
58
+ - Inject dependencies through protocols in initializers; fakes return canned results and record calls when the test needs them.
59
+ - No real network: fake the API client, or register a custom `URLProtocol` on the test `URLSessionConfiguration`.
60
+ - No shared `UserDefaults.standard` or real Keychain: inject a store, or use `UserDefaults(suiteName:)` removed after each test.
61
+ - Inject a clock or date provider instead of reading `Date()` in code under test.
62
+
63
+ ## UI tests (XCUITest)
64
+
65
+ - Find elements by accessibility identifier: set `.accessibilityIdentifier("loginButton")` in SwiftUI or `accessibilityIdentifier` in UIKit.
66
+ - Launch into a known state with `app.launchArguments` / `app.launchEnvironment` read by the app (for example to use fake services or skip onboarding).
67
+ - Wait with `waitForExistence(timeout:)` on the element, never with `sleep`.
68
+ - Keep UI tests to critical flows; they are slow and the first to go flaky.
69
+
70
+ ## Commands
71
+
72
+ ```bash
73
+ xcrun simctl list devices available # pick a simulator that exists on this machine
74
+ xcodebuild test -scheme App -destination 'platform=iOS Simulator,name=<Device>'
75
+ xcodebuild test -scheme App -destination 'platform=iOS Simulator,name=<Device>' -only-testing:AppTests/LoginViewModelTests
76
+ xcodebuild test -scheme App -destination '...' -enableCodeCoverage YES -resultBundlePath TestResults.xcresult
77
+ xcrun xccov view --report TestResults.xcresult
78
+ swift test # Swift packages
79
+ ```
@@ -0,0 +1,62 @@
1
+ # Testing React Native apps
2
+
3
+ ## Detect the setup
4
+
5
+ - `package.json` and `jest.config.*`: Jest with the `react-native` preset, or `jest-expo` in Expo projects; the `test` script.
6
+ - Libraries: `@testing-library/react-native` (React Native Testing Library), network mocking (MSW or mocked API modules), E2E with Detox or Maestro.
7
+ - Setup files (`jest.setup.*`) and existing mocks for native modules (`__mocks__/`, `jest.mock` calls).
8
+ - State and data libraries under test — TanStack Query, Redux Toolkit, Zustand — and their test helpers.
9
+
10
+ ## Logic, hooks and stores
11
+
12
+ - Pure TypeScript modules are tested with plain Jest.
13
+ - Hooks: `renderHook` from React Native Testing Library, with the providers the hook needs as `wrapper`.
14
+ - TanStack Query: create a new `QueryClient` per test with `retry: false`, so failures surface immediately.
15
+ - Redux Toolkit: build a real store with the reducers under test instead of mocking `useSelector`.
16
+
17
+ ## Component tests
18
+
19
+ ```tsx
20
+ import { render, screen, userEvent } from '@testing-library/react-native';
21
+
22
+ jest.mock('../api/auth', () => ({ login: jest.fn() }));
23
+ const { login } = jest.requireMock('../api/auth');
24
+
25
+ test('shows the home greeting after a valid login', async () => {
26
+ login.mockResolvedValue({ name: 'Ana' });
27
+ const user = userEvent.setup();
28
+ render(<LoginScreen />, { wrapper: AppProviders });
29
+
30
+ await user.type(screen.getByLabelText('Email'), 'ana@example.com');
31
+ await user.type(screen.getByLabelText('Password'), 'secret');
32
+ await user.press(screen.getByRole('button', { name: 'Sign in' }));
33
+
34
+ expect(await screen.findByText('Hello, Ana')).toBeOnTheScreen();
35
+ });
36
+ ```
37
+
38
+ - Query by role, label or text — what users and screen readers see. `testID` is the last resort.
39
+ - `findBy*` and `waitFor` for async results; no manual timeouts.
40
+ - `userEvent` simulates real interactions; `fireEvent` is the lower-level fallback.
41
+ - Avoid whole-screen snapshots as the main assertion: they break on harmless changes and get updated blindly.
42
+ - The names above are illustrative, and the matchers depend on the installed library version.
43
+
44
+ ## Native modules and navigation
45
+
46
+ - Native modules have no implementation under Jest. Use the mocks libraries ship (many document a `jest` mock, including React Native Firebase modules and AsyncStorage), or `jest.mock` them in the setup file.
47
+ - Screens that use React Navigation hooks need a `NavigationContainer` in the wrapper, or test the screen's content component with props instead.
48
+ - Transform errors (`SyntaxError: Cannot use import statement outside a module`) come from untranspiled `node_modules` packages; add them to `transformIgnorePatterns` as the preset documents.
49
+
50
+ ## End-to-end
51
+
52
+ - **Detox**: gray-box tests that sync with the app's idle state. It needs a build configuration per platform (`.detoxrc.js`), then `detox build` and `detox test` against a simulator or emulator.
53
+ - **Maestro**: black-box YAML flows (`appId`, `launchApp`, `tapOn`, `assertVisible`) run with `maestro test`, against a built app.
54
+ - Give elements stable accessibility labels or `testID`s for E2E selectors, and keep E2E suites to critical journeys.
55
+
56
+ ## Commands
57
+
58
+ ```bash
59
+ npm test # or the project's package manager and script
60
+ npx jest src/features/login # one folder or file
61
+ npx jest --coverage
62
+ ```