reis-mobile 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +30 -0
- package/README.md +47 -208
- package/THIRD_PARTY_NOTICES.md +10 -13
- package/agents/android-performance-engineer.md +2 -2
- package/agents/lead-mobile.md +5 -2
- package/agents/mobile-accessibility-auditor.md +63 -0
- package/agents/mobile-code-reviewer.md +2 -0
- package/agents/mobile-release-engineer.md +58 -0
- package/agents/mobile-staff-engineer.md +2 -2
- package/agents/rn-architect.md +1 -1
- package/commands/debug.md +1 -1
- package/core/registry/registry.mjs +18 -11
- package/package.json +24 -3
- package/skills/mobile-accessibility/SKILL.md +69 -0
- package/skills/mobile-accessibility/references/android.md +54 -0
- package/skills/mobile-accessibility/references/flutter.md +59 -0
- package/skills/mobile-accessibility/references/ios.md +50 -0
- package/skills/mobile-accessibility/references/react-native.md +38 -0
- package/skills/mobile-android/SKILL.md +29 -0
- package/skills/{android-agp-9-upgrade/SKILL.md → mobile-android/references/build-and-performance/agp-9-upgrade/GUIDE.md} +1 -20
- package/skills/{android-cli/SKILL.md → mobile-android/references/build-and-performance/android-cli/GUIDE.md} +1 -25
- package/skills/{android-profiler/SKILL.md → mobile-android/references/build-and-performance/android-profiler/GUIDE.md} +1 -27
- package/skills/{android-r8-analyzer/SKILL.md → mobile-android/references/build-and-performance/r8-analyzer/GUIDE.md} +1 -20
- package/skills/mobile-android/references/build-and-performance.md +12 -0
- package/skills/{android-display-glasses-with-jetpack-compose-glimmer/SKILL.md → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/GUIDE.md} +1 -24
- package/skills/{android-leanback-to-compose-tv-migration/SKILL.md → mobile-android/references/devices/leanback-to-compose-tv-migration/GUIDE.md} +1 -37
- package/skills/{android-wear-compose-m3/SKILL.md → mobile-android/references/devices/wear-compose-m3/GUIDE.md} +1 -25
- package/skills/mobile-android/references/devices.md +11 -0
- package/skills/{android-restore-credentials/SKILL.md → mobile-android/references/identity/restore-credentials/GUIDE.md} +1 -23
- package/skills/{android-verified-email/SKILL.md → mobile-android/references/identity/verified-email/GUIDE.md} +1 -28
- package/skills/mobile-android/references/identity.md +10 -0
- package/skills/{android-camerax/SKILL.md → mobile-android/references/media/camerax/GUIDE.md} +1 -30
- package/skills/{android-media3-cast-integration/SKILL.md → mobile-android/references/media/media3-cast-integration/GUIDE.md} +1 -24
- package/skills/mobile-android/references/media.md +10 -0
- package/skills/{android-appfunctions/SKILL.md → mobile-android/references/on-device-ai/appfunctions/GUIDE.md} +1 -24
- package/skills/{android-ml-kit-genai-prompt-api/SKILL.md → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/GUIDE.md} +1 -20
- package/skills/mobile-android/references/on-device-ai.md +10 -0
- package/skills/{android-engage-sdk-integration/SKILL.md → mobile-android/references/play/engage-sdk-integration/GUIDE.md} +1 -19
- package/skills/{android-play-billing-library-version-upgrade/SKILL.md → mobile-android/references/play/play-billing-library-version-upgrade/GUIDE.md} +1 -22
- package/skills/{android-play-policy-insights/SKILL.md → mobile-android/references/play/play-policy-insights/GUIDE.md} +1 -43
- package/skills/mobile-android/references/play.md +11 -0
- package/skills/{android-adaptive/SKILL.md → mobile-android/references/ui/adaptive/GUIDE.md} +1 -25
- package/skills/{android-edge-to-edge/SKILL.md → mobile-android/references/ui/edge-to-edge/GUIDE.md} +1 -21
- package/skills/{android-migrate-xml-views-to-jetpack-compose/SKILL.md → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/GUIDE.md} +1 -24
- package/skills/{android-navigation-3/SKILL.md → mobile-android/references/ui/navigation-3/GUIDE.md} +1 -37
- package/skills/{android-navigation-event/SKILL.md → mobile-android/references/ui/navigation-event/GUIDE.md} +1 -25
- package/skills/{android-styles/SKILL.md → mobile-android/references/ui/styles/GUIDE.md} +1 -21
- package/skills/mobile-android/references/ui.md +14 -0
- package/skills/mobile-architecture/SKILL.md +52 -0
- package/skills/mobile-architecture/references/android.md +54 -0
- package/skills/{flutter-app-architecture/SKILL.md → mobile-architecture/references/flutter/app-architecture.md} +1 -8
- package/skills/{flutter-bloc/SKILL.md → mobile-architecture/references/flutter/bloc.md} +1 -8
- package/skills/{flutter-change-notifier/SKILL.md → mobile-architecture/references/flutter/change-notifier.md} +1 -8
- package/skills/{flutter-architecture-feature-first/SKILL.md → mobile-architecture/references/flutter/feature-first.md} +1 -8
- package/skills/{flutter-login-usecase/SKILL.md → mobile-architecture/references/flutter/login-use-case.md} +0 -7
- package/skills/{flutter-managing-state/SKILL.md → mobile-architecture/references/flutter/managing-state.md} +2 -11
- package/skills/{flutter-provider/SKILL.md → mobile-architecture/references/flutter/provider.md} +1 -8
- package/skills/{flutter-apply-architecture-best-practices/SKILL.md → mobile-architecture/references/flutter/recommended-architecture.md} +2 -11
- package/skills/{flutter-riverpod/SKILL.md → mobile-architecture/references/flutter/riverpod.md} +1 -8
- package/skills/mobile-architecture/references/flutter.md +21 -0
- package/skills/mobile-architecture/references/ios.md +58 -0
- package/skills/mobile-architecture/references/react-native.md +61 -0
- package/skills/mobile-code-review/SKILL.md +70 -0
- package/skills/{android-code-review/SKILL.md → mobile-code-review/references/android.md} +1 -8
- package/skills/{flutter-code-review/SKILL.md → mobile-code-review/references/flutter/pr-review.md} +1 -8
- package/skills/{flutter-project-audit/SKILL.md → mobile-code-review/references/flutter/project-audit.md} +0 -7
- package/skills/{flutter-dart-run-static-analysis/SKILL.md → mobile-code-review/references/flutter/static-analysis.md} +2 -11
- package/skills/{flutter-widget-review/SKILL.md → mobile-code-review/references/flutter/widget-review.md} +0 -7
- package/skills/mobile-code-review/references/flutter.md +18 -0
- package/skills/{ios-code-review/SKILL.md → mobile-code-review/references/ios.md} +1 -8
- package/skills/mobile-code-review/references/react-native.md +58 -0
- package/skills/mobile-debug/SKILL.md +51 -0
- package/skills/mobile-debug/references/android/anr.md +59 -0
- package/skills/{android-gradle-build-debug/SKILL.md → mobile-debug/references/android/gradle-build.md} +0 -8
- package/skills/mobile-debug/references/android/memory-leaks.md +43 -0
- package/skills/mobile-debug/references/android.md +32 -0
- package/skills/mobile-debug/references/deep-links.md +60 -0
- package/skills/{flutter-build-debug/SKILL.md → mobile-debug/references/flutter/build.md} +5 -13
- package/skills/{flutter-errors/SKILL.md → mobile-debug/references/flutter/errors.md} +1 -8
- package/skills/{flutter-fix-layout-issues/SKILL.md → mobile-debug/references/flutter/layout-issues.md} +2 -11
- package/skills/{flutter-dart-resolve-package-conflicts/SKILL.md → mobile-debug/references/flutter/package-conflicts.md} +2 -11
- package/skills/{flutter-dart-fix-runtime-errors/SKILL.md → mobile-debug/references/flutter/runtime-errors.md} +2 -11
- package/skills/mobile-debug/references/flutter.md +23 -0
- package/skills/{ios-cocoapods-debug/SKILL.md → mobile-debug/references/ios/cocoapods.md} +1 -9
- package/skills/{ios-xcode-build-debug/SKILL.md → mobile-debug/references/ios/xcode-build.md} +0 -8
- package/skills/mobile-debug/references/ios.md +23 -0
- package/skills/mobile-debug/references/react-native.md +43 -0
- package/skills/mobile-flutter/SKILL.md +30 -0
- package/skills/{flutter-improving-accessibility/SKILL.md → mobile-flutter/references/accessibility-i18n/accessibility.md} +2 -11
- package/skills/{flutter-setup-localization/SKILL.md → mobile-flutter/references/accessibility-i18n/localization.md} +2 -11
- package/skills/mobile-flutter/references/accessibility-i18n.md +8 -0
- package/skills/{flutter-dart-3-updates/SKILL.md → mobile-flutter/references/dart/dart-3.md} +1 -8
- package/skills/{flutter-effective-dart/SKILL.md → mobile-flutter/references/dart/effective-dart.md} +1 -8
- package/skills/{flutter-dart-use-pattern-matching/SKILL.md → mobile-flutter/references/dart/pattern-matching/GUIDE.md} +2 -18
- package/skills/mobile-flutter/references/dart.md +9 -0
- package/skills/{flutter-caching-data/SKILL.md → mobile-flutter/references/data/caching.md} +2 -11
- package/skills/{flutter-working-with-databases/SKILL.md → mobile-flutter/references/data/databases.md} +2 -11
- package/skills/{flutter-use-http-package/SKILL.md → mobile-flutter/references/data/http.md} +2 -11
- package/skills/{flutter-implement-json-serialization/SKILL.md → mobile-flutter/references/data/json-serialization.md} +2 -11
- package/skills/mobile-flutter/references/data.md +10 -0
- package/skills/{flutter-interoperating-with-native-apis/SKILL.md → mobile-flutter/references/native/native-apis.md} +2 -11
- package/skills/{flutter-embedding-native-views/SKILL.md → mobile-flutter/references/native/native-views.md} +2 -11
- package/skills/{flutter-building-plugins/SKILL.md → mobile-flutter/references/native/plugins.md} +2 -11
- package/skills/mobile-flutter/references/native.md +9 -0
- package/skills/{flutter-reducing-app-size/SKILL.md → mobile-flutter/references/performance/app-size.md} +2 -11
- package/skills/{flutter-handling-concurrency/SKILL.md → mobile-flutter/references/performance/concurrency.md} +2 -11
- package/skills/mobile-flutter/references/performance.md +8 -0
- package/skills/{flutter-setting-up-on-macos/SKILL.md → mobile-flutter/references/setup/macos.md} +2 -11
- package/skills/mobile-flutter/references/setup.md +7 -0
- package/skills/{flutter-animating-apps/SKILL.md → mobile-flutter/references/ui/animations.md} +2 -11
- package/skills/{flutter-building-forms/SKILL.md → mobile-flutter/references/ui/forms.md} +2 -11
- package/skills/{flutter-adding-home-screen-widgets/SKILL.md → mobile-flutter/references/ui/home-screen-widgets.md} +2 -11
- package/skills/{flutter-building-layouts/SKILL.md → mobile-flutter/references/ui/layouts.md} +2 -11
- package/skills/{flutter-build-responsive-layout/SKILL.md → mobile-flutter/references/ui/responsive-layout.md} +2 -11
- package/skills/{flutter-setup-declarative-routing/SKILL.md → mobile-flutter/references/ui/routing.md} +2 -11
- package/skills/{flutter-theming-apps/SKILL.md → mobile-flutter/references/ui/theming.md} +2 -11
- package/skills/{flutter-add-widget-preview/SKILL.md → mobile-flutter/references/ui/widget-previews.md} +2 -11
- package/skills/mobile-flutter/references/ui.md +14 -0
- package/skills/mobile-ios/SKILL.md +25 -0
- package/skills/mobile-ios/references/data-networking.md +70 -0
- package/skills/mobile-ios/references/performance-release.md +37 -0
- package/skills/mobile-ios/references/platform-features.md +52 -0
- package/skills/mobile-ios/references/ui-navigation.md +64 -0
- package/skills/mobile-release/SKILL.md +70 -0
- package/skills/mobile-release/references/android.md +47 -0
- package/skills/mobile-release/references/ci-cd.md +94 -0
- package/skills/mobile-release/references/flutter.md +37 -0
- package/skills/mobile-release/references/ios.md +48 -0
- package/skills/mobile-release/references/react-native.md +36 -0
- package/skills/mobile-release/references/store-copy.md +52 -0
- package/skills/mobile-rn/SKILL.md +26 -0
- package/skills/mobile-rn/references/data-networking.md +59 -0
- package/skills/mobile-rn/references/performance-release.md +46 -0
- package/skills/mobile-rn/references/platform-features.md +40 -0
- package/skills/mobile-rn/references/ui-navigation.md +62 -0
- package/skills/mobile-security/SKILL.md +82 -0
- package/skills/{android-intent-security/SKILL.md → mobile-security/references/android/intent-security.md} +1 -28
- package/skills/mobile-security/references/android.md +37 -0
- package/skills/{flutter-secure-token-store/SKILL.md → mobile-security/references/flutter/secure-token-store.md} +1 -8
- package/skills/mobile-security/references/flutter.md +30 -0
- package/skills/mobile-security/references/ios.md +27 -0
- package/skills/mobile-security/references/react-native.md +29 -0
- package/skills/mobile-security-audit/SKILL.md +0 -101
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/android/build/migrate-to-built-in-kotlin.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/android/build/releases/agp-9-0-0-release-notes.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/buildconfig.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/ksp-kapt.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/paparazzi-gradle-9.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/recipes.md +0 -0
- /package/skills/{android-cli → mobile-android/references/build-and-performance/android-cli}/references/interact.md +0 -0
- /package/skills/{android-cli → mobile-android/references/build-and-performance/android-cli}/references/journeys.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/analysis_orchestrator.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-sql/perfetto_sql.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/triage.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/recording_orchestrator.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/env_setup.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/perfetto/setup.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/perfetto/sql.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/CONFIGURATION-ANALYZER.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/CONFIGURATION.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/KEEP-RULES-IMPACT-HIERARCHY.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REDUNDANT-RULES.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REFLECTION-GUIDE.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REPORT_FORMAT.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/android/topic/performance/app-optimization/enable-app-optimization.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/android/training/testing/other-components/ui-automator.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/button-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/button-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/card-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/card-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/deptheffect-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/deptheffectlevels-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/glimmersansflextypography-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/glimmertheme-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/icon-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/iconbutton-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/iconsizes-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/list-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/listitem-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/liststate-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/material-hct-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/projectedcontext-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stack-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stackitemscope-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stackstate-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/surface-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/titlechip-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/titlechip-source.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/get-started/navigation.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/playback/compose/browse.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/playback/compose/index.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/android/training/wearables/compose/migrate-to-material3.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/AmbientModeSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/AmbientModeSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/CurvedWorldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/CurvedWorldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ExpandableSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ExpandableSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/HierarchicalFocusSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/HierarchicalFocusSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/PagerSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/PagerSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/RotarySamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/RotarySamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ScalingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ScalingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToDismissBoxSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToDismissBoxSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToRevealSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToRevealSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/TransformingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/TransformingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AlertDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AlertDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AnimatedTextSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AnimatedTextSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonGroupSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonGroupSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CardSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CardSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CheckboxButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CheckboxButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ConfirmationDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ConfirmationDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CurvedTextSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CurvedTextSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DatePickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DatePickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DynamicColorSchemeSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DynamicColorSchemeSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/EdgeButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/EdgeButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/FadingExpandingLabelSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/FadingExpandingLabelSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconToggleButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconToggleButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LevelIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LevelIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LinearProgressIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LinearProgressIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ListHeaderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ListHeaderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OneHandedGestureSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OneHandedGestureSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OpenOnPhoneDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OpenOnPhoneDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PageIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PageIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PagerScaffoldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PagerScaffoldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerGroupSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerGroupSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PlaceholderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PlaceholderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ProgressIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ProgressIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/RadioButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/RadioButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScaffoldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScaffoldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollAwaySample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollAwaySample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SliderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SliderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/StepperSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/StepperSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SurfaceTransformationSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SurfaceTransformationSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToDismissBoxSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToDismissBoxSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToRevealSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToRevealSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwitchButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwitchButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextToggleButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextToggleButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimePickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimePickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimeTextSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimeTextSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformationSpecSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformationSpecSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnNotificationsSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/guide/topics/manifest/application-element.md +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/identity/passkeys/create-passkeys.md +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/identity/passkeys/sign-in-with-passkeys.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/credential-manager/index.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/credential-verifier.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/email-verification-implementation.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/email-verification.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/index.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/passkeys/create-passkeys.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/sign-in/credential-manager-webview.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/camera1-to-camerax.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/camera2-to-camerax.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/expert-blueprints.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/foldables.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/immutability.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/low-light.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/mlkit-spatial.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/modern-apis.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/testing.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/thermals.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/wear-os.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/xr.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/create-castplayer.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/customize-castoptions.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/index.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/adb-interaction-testing.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/context.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/feature-discovery-analysis.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/implementation-configuration.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/kdoc-refinement-optimization.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/migrate-to-service-entry-point.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/get-started.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prefix-caching.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prompt-design.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prompt-optimization.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/structured-output.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/system-instructions.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/faq.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/food.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/healthandfitness.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/listen.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/otherverticals.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/read.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/shopping.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/social.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/travel.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/continue-watching/index.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/entitlements.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/getting-started.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/recommendations.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/watch.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/clusters.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/common.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/patterns.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/requests.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/food.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/listen.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/other.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/read.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/shopping.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/social.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/travel.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/tv.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/watch.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/troubleshooting.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/android/google/play/billing/release-notes.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/migration-logic.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/version-checklist.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/common_mandates.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/compliance_report_template.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/critic.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_data_safety.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_permissions_and_apis.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_user_account.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/policies.json +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/scanner_config.json +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/generate_report.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/orchestrator.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/play_store_scraper.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/scanner.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/template_engine.py +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/tooling/debug.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/analysis-of-the-project-and-layout.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/identify-optimal-xml-candidate.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/xml-layout-migration.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/index.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/migration-guide.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/animations.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basic.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/common-ui.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/conditional.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/dialog.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/results-event.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/results-state.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/type-safe-destinations.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/dispatcher.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/handle-back.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/index.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/setup.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/designsystems/custom.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/fundamentals.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/state-animations.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/theming.md +0 -0
- /package/skills/{flutter-dart-use-pattern-matching → mobile-flutter/references/dart/pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ios-code-review
|
|
3
|
-
description: Reviews native iOS code in Swift and Objective-C for the bugs that reach production — retain cycles in closures, delegates, timers and observers, Swift concurrency mistakes such as UI updates off the main actor, uncancelled tasks and data races, SwiftUI ownership and identity bugs (@StateObject vs @ObservedObject, ForEach ids), force unwraps and try! in production paths, main-thread blocking, and privacy and permission handling. Use when reviewing Swift or Objective-C files in an iOS app, view controllers, SwiftUI views, view models, networking or persistence code, or when the user asks for an iOS code review or PR review.
|
|
4
|
-
intents: [review, performance]
|
|
5
|
-
stacks: [ios]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
1
|
# iOS Code Review
|
|
9
2
|
|
|
10
3
|
Apply to Swift and Objective-C sources of the app and its extensions. Items are ordered by impact: the first sections cause crashes, leaks or data races. Before flagging an API, check the deployment target (`IPHONEOS_DEPLOYMENT_TARGET`) — `@Observable`, for example, requires iOS 17.
|
|
@@ -39,7 +32,7 @@ Apply to Swift and Objective-C sources of the app and its extensions. Items are
|
|
|
39
32
|
|
|
40
33
|
## 5. Platform and privacy
|
|
41
34
|
|
|
42
|
-
- [ ] **Credentials and tokens** in `UserDefaults` or files instead of the Keychain. Details in `mobile-security
|
|
35
|
+
- [ ] **Credentials and tokens** in `UserDefaults` or files instead of the Keychain. Details in `mobile-security`.
|
|
43
36
|
- [ ] **Permissions.** Each protected API used needs its `NS...UsageDescription` in `Info.plist`, and the code must handle denied and restricted states, not only granted.
|
|
44
37
|
- [ ] **Background execution.** Work that must finish when the app goes to background without `beginBackgroundTask` or `BGTaskScheduler`.
|
|
45
38
|
- [ ] **Deployment target.** APIs used without `#available` checks when the deployment target is lower than the API's availability.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# React Native Code Review
|
|
2
|
+
|
|
3
|
+
Apply to TypeScript and JavaScript sources of a React Native or Expo app, and to its native modules with the native checklists. Items are ordered by impact: the first sections cause crashes, leaks or wrong data. Check the React Native or Expo SDK version and the library versions in `package.json` before recommending an API.
|
|
4
|
+
|
|
5
|
+
## 1. Hooks and effects (bug / leak)
|
|
6
|
+
|
|
7
|
+
- [ ] **Missing effect cleanup.** Listeners (`AppState`, `Keyboard`, `Linking`, `Dimensions`), subscriptions, intervals and timeouts added in `useEffect` without returning a cleanup function.
|
|
8
|
+
- [ ] **Stale closures.** Effects, callbacks or memoized values that read props or state not listed in the dependency array. `react-hooks/exhaustive-deps` warnings silenced without a reason are findings.
|
|
9
|
+
- [ ] **State updates after unmount.** Requests started in an effect and never cancelled (no `AbortController`, no ignore flag) updating state of a screen the user left.
|
|
10
|
+
- [ ] **Hooks called conditionally** or inside loops.
|
|
11
|
+
- [ ] **Effects used for derived data.** State computed from props in an effect instead of during render causes an extra render and flicker.
|
|
12
|
+
|
|
13
|
+
## 2. State and data
|
|
14
|
+
|
|
15
|
+
- [ ] **Server data copied into global state** (Redux, Zustand, context) and synchronized by hand, instead of a server-state cache such as TanStack Query or RTK Query.
|
|
16
|
+
- [ ] **Impossible states.** Separate `loading`, `error` and `data` flags that can contradict each other; missing error and empty states.
|
|
17
|
+
- [ ] **Unvalidated responses.** API data used with `as` casts and no runtime validation at the boundary, so a contract change crashes deep in the UI.
|
|
18
|
+
- [ ] **Navigation params** carrying large objects, functions or data that should be fetched by id; params not typed.
|
|
19
|
+
|
|
20
|
+
## 3. Rendering performance
|
|
21
|
+
|
|
22
|
+
- [ ] **Long lists in `ScrollView` + `.map()`** instead of `FlatList`/`SectionList` (or FlashList, if the project uses it); missing or index-based `keyExtractor` for lists that change.
|
|
23
|
+
- [ ] **Context values recreated every render**, re-rendering every consumer; one large context for unrelated state.
|
|
24
|
+
- [ ] **Inline objects and callbacks** passed to memoized components, defeating `React.memo`. Only report on hot paths.
|
|
25
|
+
- [ ] **Animations driven by JavaScript state** per frame instead of Reanimated or `useNativeDriver: true`.
|
|
26
|
+
- [ ] **Remote images** without caching or sized far larger than displayed.
|
|
27
|
+
|
|
28
|
+
## 4. Platform and native code
|
|
29
|
+
|
|
30
|
+
- [ ] **Platform branches** (`Platform.OS`) scattered through screens instead of `.ios.tsx`/`.android.tsx` files or a small platform module.
|
|
31
|
+
- [ ] **Permissions** requested without handling denial or "don't ask again"; Android 13+ notification permission missing when push is used.
|
|
32
|
+
- [ ] **Deep links** (`Linking`, navigation linking config) acting on parameters without validating them.
|
|
33
|
+
- [ ] **Native modules** called directly from many components instead of one typed wrapper; changes to native code without the matching iOS and Android updates.
|
|
34
|
+
- [ ] **Safe areas and keyboard:** screens without safe area handling; forms hidden by the keyboard.
|
|
35
|
+
|
|
36
|
+
## 5. Security
|
|
37
|
+
|
|
38
|
+
- [ ] Tokens or credentials in `AsyncStorage` instead of the Keychain/Keystore (`react-native-keychain`, `expo-secure-store`).
|
|
39
|
+
- [ ] Secrets in `.env` files read through `react-native-config` or `EXPO_PUBLIC_*` variables: they are bundled into the app and readable.
|
|
40
|
+
- [ ] `react-native-webview` with `originWhitelist={['*']}` and an `onMessage` handler that acts on messages.
|
|
41
|
+
- [ ] Sensitive data in `console.log`, which stays in release builds unless removed. Details in `mobile-security`.
|
|
42
|
+
|
|
43
|
+
## 6. Expo and release
|
|
44
|
+
|
|
45
|
+
- [ ] Config plugins or `app.json`/`app.config.*` changes that require a new native build, shipped as an over-the-air update. Check that `runtimeVersion` changes when native code or config changes.
|
|
46
|
+
- [ ] Secrets placed in `app.json` `extra` fields, which are bundled into the app.
|
|
47
|
+
- [ ] Hermes disabled, or debug-only code (`__DEV__` branches missing) reachable in production.
|
|
48
|
+
|
|
49
|
+
## 7. Maintainability, accessibility and tests
|
|
50
|
+
|
|
51
|
+
- [ ] `any` types and `@ts-ignore` added without a reason; `strict` mode relaxed.
|
|
52
|
+
- [ ] Touchable elements without `accessibilityRole` and `accessibilityLabel`; touch targets smaller than about 44–48 points; text that ignores font scaling.
|
|
53
|
+
- [ ] User-visible strings hardcoded when the project uses i18n.
|
|
54
|
+
- [ ] New logic, hooks or screens without tests when the project has a Jest suite.
|
|
55
|
+
|
|
56
|
+
## Output
|
|
57
|
+
|
|
58
|
+
Report in the matching section of the review (Bugs for sections 1–2, Performance for section 3, Security for section 5), always with `file:line` and the corrected snippet when the fix is short.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-debug
|
|
3
|
+
description: Finds the cause of failing builds and runtime errors in mobile apps on every stack — Flutter (pub version solving, Dart compilation, generated code, layout overflows, runtime exceptions), native Android (Gradle, AGP, JDK and Kotlin mismatches, dependency conflicts, manifest merger, R8, logcat crashes, ANRs and memory leaks), native iOS (Xcode signing and provisioning, deployment targets, CocoaPods, Swift Package Manager, crash logs) and React Native (Metro, native modules not found, Hermes, the Android and iOS builds underneath), plus deep links, App Links and Universal Links that do not open the app. Use whenever a build, `flutter run`, `pod install`, Gradle task, Xcode archive or app launch fails, when the user pastes a stack trace, "BUILD FAILED" or a red screen, or runs /reis-mobile:debug, even if they only paste the error.
|
|
4
|
+
intents: [debug, build, dependency, migration]
|
|
5
|
+
stacks: ["*"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mobile Debug
|
|
9
|
+
|
|
10
|
+
One debugging process for every mobile stack. This file holds how to find a cause; each platform's error signatures and fixes live in its reference.
|
|
11
|
+
|
|
12
|
+
## 1. Pick the reference
|
|
13
|
+
|
|
14
|
+
Choose by the stack **and** by the layer the error comes from — a Flutter or React Native build often fails inside Gradle or Xcode:
|
|
15
|
+
|
|
16
|
+
| The failure is in | Read |
|
|
17
|
+
|---|---|
|
|
18
|
+
| A Flutter app: pub, Dart compilation, generated code, widgets, runtime exceptions | [references/flutter.md](references/flutter.md) |
|
|
19
|
+
| Gradle, the Android build, logcat crashes or ANRs (native Android, or the `android/` folder of any app) | [references/android.md](references/android.md) |
|
|
20
|
+
| Xcode, signing, CocoaPods, Swift packages or iOS crash logs (native iOS, or the `ios/` folder of any app) | [references/ios.md](references/ios.md) |
|
|
21
|
+
| A React Native or Expo app: Metro, native modules, JavaScript errors | [references/react-native.md](references/react-native.md) |
|
|
22
|
+
| A deep link, App Link or Universal Link that opens the browser, the wrong screen or crashes (any stack) | [references/deep-links.md](references/deep-links.md) |
|
|
23
|
+
|
|
24
|
+
When `reis-mobile debug` (or `/reis-mobile:debug`) ran, its `area` line points at the layer: `gradle`, `manifest`, `proguard` → Android; `xcode`, `signing`, `cocoapods`, `spm` → iOS; `pub` → Flutter; `metro` → React Native.
|
|
25
|
+
|
|
26
|
+
## 2. Find the first real error
|
|
27
|
+
|
|
28
|
+
Build and crash logs bury the cause under cascading failures. Quote the line that starts the failure — the first `error:`, the `What went wrong` block, the top of the exception with its `Caused by` — not the final `BUILD FAILED` or the last frame. Ask for the full output when the user pasted only the end.
|
|
29
|
+
|
|
30
|
+
## 3. Collect versions before theorizing
|
|
31
|
+
|
|
32
|
+
Most build failures after an upgrade are toolchain mismatches. Read the versions that decide the behavior — the SDK and toolchain versions (the doctor report shows them), wrapper and lock files, build scripts, deployment targets — and quote them in the diagnosis. Check compatibility against the official tables named in the reference; do not state compatibility ranges from memory.
|
|
33
|
+
|
|
34
|
+
## 4. Reproduce safely
|
|
35
|
+
|
|
36
|
+
Read-only commands can run: version checks, dependency trees, `flutter doctor -v`, `./gradlew --version`, `pod --version`, `xcodebuild -version`. A build that only compiles can run when the user already ran it or agrees, since it takes time and writes build outputs.
|
|
37
|
+
|
|
38
|
+
## 5. Confirm the cause
|
|
39
|
+
|
|
40
|
+
Tie the cause to evidence: `file:line`, a version, a build setting or a log line. If two causes are plausible, say what evidence would separate them instead of picking one.
|
|
41
|
+
|
|
42
|
+
## 6. Propose, then wait
|
|
43
|
+
|
|
44
|
+
Answer with:
|
|
45
|
+
|
|
46
|
+
- **Cause** — one or two sentences, with the evidence.
|
|
47
|
+
- **Fix** — the minimal change, as a diff or exact commands, in order.
|
|
48
|
+
- **Side effects** — what else the fix changes: a higher minimum Android or iOS version, a Gradle or Kotlin upgrade that CI needs too, pods changing version.
|
|
49
|
+
- **Verify** — the command that failed, run again.
|
|
50
|
+
|
|
51
|
+
Do not edit files, upgrade dependencies or run commands that change the project, the caches or the machine — `flutter clean`, `pod install`, `pod repo update`, `npx expo prebuild --clean`, deleting `DerivedData`, `~/.gradle` caches or `node_modules` — until the user asks you to apply the fix. Then apply it, run the verification and report the result.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Investigating Android ANRs
|
|
2
|
+
|
|
3
|
+
An ANR (Application Not Responding) is reported when the main thread cannot process an input event for about five seconds, or when a broadcast receiver, service or job does not finish its callback in the time the system allows. The top frame of the main thread is often the victim, not the cause: find what the main thread was waiting for.
|
|
4
|
+
|
|
5
|
+
## 1. Get the evidence
|
|
6
|
+
|
|
7
|
+
| Source | What it gives |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Play Console → Android vitals → ANRs | Clusters with the main thread's stack, affected versions, devices and Android versions |
|
|
10
|
+
| Crashlytics or another reporter with ANR support | Main thread stack; other threads depend on the SDK |
|
|
11
|
+
| `ApplicationExitInfo` (Android 11+) | `REASON_ANR` exits of previous processes, with `getTraceInputStream()` returning the full thread dump — log or upload it on the next launch |
|
|
12
|
+
| `adb bugreport` | ANR traces of all threads when reproduced on a test device |
|
|
13
|
+
| Local reproduction | `adb logcat` shows `ANR in <package>` with the reason; `StrictMode` flags disk and network on the main thread before it becomes an ANR |
|
|
14
|
+
|
|
15
|
+
High confidence needs the **whole thread dump**, not only the main thread. With a single stack, say the conclusion is tentative and ask for the full trace.
|
|
16
|
+
|
|
17
|
+
## 2. Read the reason
|
|
18
|
+
|
|
19
|
+
- `Input dispatching timed out` → the main thread did not handle a touch or key event in time.
|
|
20
|
+
- `Broadcast of Intent { ... }` / `executing service` / `ContentProvider not responding` → a component callback ran too long on the main thread.
|
|
21
|
+
- `Context.startForegroundService() did not then call Service.startForeground()` → the service did not promote itself in time. On recent Android versions this is reported as a crash (`ForegroundServiceDidNotStartInTimeException`) as well.
|
|
22
|
+
|
|
23
|
+
## 3. Read the main thread's state
|
|
24
|
+
|
|
25
|
+
In the dump, find `"main" prio=5 tid=1 <State>`:
|
|
26
|
+
|
|
27
|
+
| State | Look for |
|
|
28
|
+
|---|---|
|
|
29
|
+
| **Runnable** | Work on the main thread: JSON parsing, database queries, `SharedPreferences.commit()`, file I/O, bitmap decoding, crypto, class loading of large SDKs, a loop in layout or composition |
|
|
30
|
+
| **Blocked** | `- waiting to lock <0x...> held by thread N`: open thread N and see what it does while holding the lock |
|
|
31
|
+
| **Waiting / TimedWaiting** | `Object.wait`, `Future.get`, `CountDownLatch.await`, `Thread.join`, `runBlocking`, a `Semaphore` or `Mutex`: find who should release it |
|
|
32
|
+
| **Native** | Binder calls into system services (`BinderProxy.transact`), `SharedPreferences` `apply()` flushing in `QueuedWork.waitToFinish` during `onPause`/`onStop`, file system or graphics calls |
|
|
33
|
+
|
|
34
|
+
For a deadlock, write down the cycle: thread A holds lock 1 and waits for lock 2; thread B holds lock 2 and waits for lock 1.
|
|
35
|
+
|
|
36
|
+
## 4. Match the code
|
|
37
|
+
|
|
38
|
+
- `runBlocking` anywhere reachable from the main thread, including inside interceptors, `ContentProvider`s and DI factories.
|
|
39
|
+
- `@Synchronized` or `synchronized` blocks that also do network or disk work: the lock is held for the whole I/O.
|
|
40
|
+
- Eager initialization in `Application.onCreate`, `ContentProvider.onCreate` (including library initializers) or the first Activity.
|
|
41
|
+
- Room queries without `suspend`/`Flow`, or with `allowMainThreadQueries()`.
|
|
42
|
+
- `BroadcastReceiver.onReceive` doing work beyond starting a `WorkManager` job; `goAsync()` without calling `finish()`.
|
|
43
|
+
- `SharedPreferences.apply()` writes piling up and flushed on lifecycle transitions: move hot data to DataStore.
|
|
44
|
+
- Third-party SDK calls that are synchronous on first use (ads, analytics, feature flags).
|
|
45
|
+
|
|
46
|
+
## 5. Fix
|
|
47
|
+
|
|
48
|
+
- Remove the blocking path that the evidence proves, not the top frame. Moving work to `Dispatchers.IO` fixes main-thread I/O; it does not fix a lock held across I/O — shorten the critical section instead.
|
|
49
|
+
- Replace `runBlocking` with a suspending call chain, or with an in-memory value that is refreshed asynchronously.
|
|
50
|
+
- Defer SDK initialization (App Startup with lazy initializers, or initialization after the first frame).
|
|
51
|
+
- Keep receivers, services and job callbacks short; hand long work to `WorkManager`.
|
|
52
|
+
- Do not trade an ANR for lost work or a race: if the result is needed, expose loading state instead of blocking.
|
|
53
|
+
|
|
54
|
+
## 6. Verify
|
|
55
|
+
|
|
56
|
+
- Reproduce with the slow dependency made slower (a delay in the network call or the lock owner) on a low-end device or emulator with a cold start.
|
|
57
|
+
- `StrictMode.ThreadPolicy` with `detectAll()` in debug builds shows no violations on the path.
|
|
58
|
+
- A system trace (Perfetto, Android Studio's CPU profiler) shows the main thread free during the flow. See `mobile-android` → the profiler guide.
|
|
59
|
+
- After release, watch the cluster and the user-perceived ANR rate in Android vitals for the new version.
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: android-gradle-build-debug
|
|
3
|
-
description: Diagnoses failing Android Gradle builds — JDK, Gradle, Android Gradle Plugin and Kotlin version mismatches, dependency resolution and duplicate classes, compileSdk and minSdk errors, manifest merger and namespace failures, kapt/KSP, R8 missing classes, signing and out-of-memory builds. Use whenever an Android, Kotlin Multiplatform, Flutter or React Native build fails in Gradle, when the log shows "What went wrong", "Execution failed for task" or "BUILD FAILED", or after upgrading AGP, Gradle, Kotlin or the JDK, even if the user only pastes the error.
|
|
4
|
-
intents: [debug, build, dependency, migration]
|
|
5
|
-
stacks: [android, kotlin-multiplatform]
|
|
6
|
-
areas: [gradle, manifest, proguard, signing]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
1
|
# Android Gradle Build Debug
|
|
10
2
|
|
|
11
3
|
A Gradle failure is usually one of a few causes wearing a long stack trace. Work in this order: find the first real error, check the toolchain versions, then match the error to a section below. Confirm every cause in the build files before proposing a fix.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Investigating Android memory leaks
|
|
2
|
+
|
|
3
|
+
A leak is an object that should have been garbage collected — usually an Activity, Fragment view, View or Context — kept alive by a reference from something that lives longer. Symptoms: memory growing each time a screen opens, `OutOfMemoryError` after long sessions, and slow GC pauses.
|
|
4
|
+
|
|
5
|
+
## 1. Get the evidence
|
|
6
|
+
|
|
7
|
+
- **LeakCanary** (`debugImplementation("com.squareup.leakcanary:leakcanary-android:<version>")`, no code needed) detects retained Activities, Fragments, Fragment views, ViewModels and Services in debug builds and prints the **leak trace**: the chain of references from a GC root to the leaked object. Check the version in the project before adding it.
|
|
8
|
+
- **Android Studio Memory Profiler:** capture a heap dump after opening and closing the screen a few times and forcing GC; filter by the Activity class and look for more instances than screens on the back stack. *Show activity/fragment leaks* highlights destroyed ones.
|
|
9
|
+
- **`OutOfMemoryError` reports** show where the last allocation failed, which is rarely the leak itself; use them to know which flow to profile.
|
|
10
|
+
|
|
11
|
+
## 2. Read the leak trace
|
|
12
|
+
|
|
13
|
+
LeakCanary marks each reference as leaking, not leaking or unknown. The bug is in the references between the last **not leaking** object and the first **leaking** one. Typical shape:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
GC Root: static field
|
|
17
|
+
↓ SessionManager.INSTANCE
|
|
18
|
+
↓ SessionManager.listeners ← likely cause: never unregistered
|
|
19
|
+
↓ ProfileActivity$1 (anonymous listener)
|
|
20
|
+
↓ ProfileActivity ← destroyed but retained
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 3. Common causes and fixes
|
|
24
|
+
|
|
25
|
+
| Cause | Fix |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Singleton, `object` or static field holding an Activity, View or Context | Hold `applicationContext`, or do not store it; pass it per call |
|
|
28
|
+
| Listener or callback registered in `onStart`/`onCreate` and never removed | Unregister in the symmetric callback, or use lifecycle-aware APIs (`repeatOnLifecycle`, `LifecycleObserver`) |
|
|
29
|
+
| Fragment keeping a binding or views after `onDestroyView` | Clear the binding in `onDestroyView`, or use `viewLifecycleOwner` for observers |
|
|
30
|
+
| Coroutine launched in `GlobalScope` or a custom scope that captures the Activity | Use `lifecycleScope`/`viewModelScope`; never capture views in long-running work |
|
|
31
|
+
| ViewModel holding an Activity, Fragment, View or its Context | Keep only data; use `AndroidViewModel` or an injected application context when a Context is needed |
|
|
32
|
+
| Inner or anonymous classes (Handler, Runnable, AsyncTask) outliving the Activity | Static nested class with a weak reference, or cancel pending work in `onDestroy` |
|
|
33
|
+
| `Handler.postDelayed` pending when the screen closes | `removeCallbacksAndMessages(null)` in the teardown |
|
|
34
|
+
| Third-party SDK holding the Activity passed at init | Pass the application context, or report it upstream and add it to LeakCanary's known library leaks |
|
|
35
|
+
| Compose: objects captured in `remember` that hold an Activity, or `DisposableEffect` without cleanup in `onDispose` | Use `LocalContext` at call time; release in `onDispose` |
|
|
36
|
+
|
|
37
|
+
Not every growth is a leak: image caches and pools are bounded by design. Check whether memory stabilizes after several repetitions before calling it a leak.
|
|
38
|
+
|
|
39
|
+
## 4. Verify
|
|
40
|
+
|
|
41
|
+
- Run the flow again with LeakCanary: no retained instance reported.
|
|
42
|
+
- Heap dump after repeating the flow and forcing GC: one or zero instances of the Activity.
|
|
43
|
+
- For large bitmaps and caches, compare the Java and native heap in the profiler before and after.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Debugging Android
|
|
2
|
+
|
|
3
|
+
## Build failures
|
|
4
|
+
|
|
5
|
+
Gradle, AGP, JDK and Kotlin mismatches, dependency resolution and duplicate classes, compileSdk and minSdk errors, manifest merger, namespace, kapt/KSP, R8 and signing: [android/gradle-build.md](android/gradle-build.md).
|
|
6
|
+
|
|
7
|
+
In Flutter and React Native apps, run Gradle from `android/` to see the full output.
|
|
8
|
+
|
|
9
|
+
## Crashes at runtime
|
|
10
|
+
|
|
11
|
+
1. **Get the stack trace.** `adb logcat -b crash` shows the crash buffer; `adb logcat *:E` all errors. Start from the first `FATAL EXCEPTION` and follow every `Caused by:` to the root.
|
|
12
|
+
2. **Deobfuscate release traces.** Stack traces from R8-minified builds show short names; retrace them with the `retrace` tool from the Android SDK command-line tools and the `mapping.txt` of that exact build (`app/build/outputs/mapping/<variant>/`). Crashlytics and Play Console do it automatically when the mapping file was uploaded.
|
|
13
|
+
3. **Match the signature:**
|
|
14
|
+
- `NullPointerException` / `lateinit property has not been initialized` → an object used before its lifecycle creates it, or after it is destroyed (a Fragment view after `onDestroyView`).
|
|
15
|
+
- `IllegalStateException: Fragment not attached to a context`, `Can not perform this action after onSaveInstanceState` → work finishing after the screen stopped; tie it to the lifecycle.
|
|
16
|
+
- `NetworkOnMainThreadException`, `Cannot access database on the main thread` → I/O on the main thread; move it to `Dispatchers.IO`.
|
|
17
|
+
- `ClassNotFoundException` / `NoSuchMethodError` only in release → R8 removed or renamed something used through reflection; add the library's keep rules.
|
|
18
|
+
- `SecurityException: Permission Denial` → a missing runtime permission, or an exported component contract mismatch.
|
|
19
|
+
- `ForegroundServiceStartNotAllowedException`, `SecurityException` for exact alarms → restrictions that depend on `targetSdk`; check the behavior changes for that API level.
|
|
20
|
+
4. **Native (C/C++) crashes** (`signal 11 (SIGSEGV)`, tombstones) need symbols: symbolize with `ndk-stack` and the unstripped libraries of that build.
|
|
21
|
+
|
|
22
|
+
## ANRs
|
|
23
|
+
|
|
24
|
+
- An ANR means the main thread was blocked for about five seconds (input) or a broadcast receiver or service ran too long.
|
|
25
|
+
- Get the main thread's stack from Play Console vitals, or from `adb bugreport` (the ANR traces are included), and look at what the main thread was waiting on: disk, network, a lock, `runBlocking`, a binder call.
|
|
26
|
+
- `StrictMode` in debug builds flags disk and network access on the main thread before it becomes an ANR.
|
|
27
|
+
|
|
28
|
+
Full investigation — evidence sources, reading thread states, locks and deadlocks, fixes and verification: [android/anr.md](android/anr.md).
|
|
29
|
+
|
|
30
|
+
## Memory leaks and OutOfMemoryError
|
|
31
|
+
|
|
32
|
+
Retained Activities, Fragments and Contexts, reading LeakCanary traces and heap dumps: [android/memory-leaks.md](android/memory-leaks.md).
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Debugging deep links
|
|
2
|
+
|
|
3
|
+
Deep links fail in three places: the **domain verification** (the link opens the browser), the **app's registration** (the system does not know the app handles the URL) and the **in-app routing** (the app opens on the wrong screen or crashes). Find which one before changing anything. Security checks for deep links (validating parameters, not acting without confirmation) are in `mobile-security`.
|
|
4
|
+
|
|
5
|
+
## 1. Classify the symptom
|
|
6
|
+
|
|
7
|
+
| Symptom | Layer to check first |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Opens the browser instead of the app | Verification: `assetlinks.json` / `apple-app-site-association`, entitlement, fingerprint |
|
|
10
|
+
| Works in debug, not from the store build | Verification with the release signing key (Android) or the distribution Team ID (iOS) |
|
|
11
|
+
| Shows a chooser dialog on Android | App Links not verified; the link is treated as a plain intent filter |
|
|
12
|
+
| Opens the app on the home screen | In-app routing: the URL reaches the app but no route matches, or it is lost during cold start |
|
|
13
|
+
| Crashes on open | In-app routing: navigation before the navigator or the auth state is ready |
|
|
14
|
+
| Custom scheme (`myapp://`) does nothing | The scheme is not registered, or the test tool is quoting the URL wrong |
|
|
15
|
+
|
|
16
|
+
## 2. Android App Links
|
|
17
|
+
|
|
18
|
+
**Checklist**
|
|
19
|
+
- [ ] `<intent-filter android:autoVerify="true">` with `ACTION_VIEW`, categories `DEFAULT` and `BROWSABLE`, `android:scheme="https"` and the exact `android:host`.
|
|
20
|
+
- [ ] `https://<host>/.well-known/assetlinks.json` returns 200 over HTTPS without redirects, with `Content-Type: application/json`, for **every host** in the filters (including `www` and subdomains).
|
|
21
|
+
- [ ] The file lists the package name and the SHA-256 fingerprint of the certificate that signs the installed build. For Play builds that is the **app signing key** from the Play Console (App integrity), not the upload key; debug builds use the debug keystore fingerprint (`keytool -list -v -keystore ~/.android/debug.keystore`).
|
|
22
|
+
|
|
23
|
+
**Commands**
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Verification state per domain (Android 12+)
|
|
27
|
+
adb shell pm get-app-links com.example.app
|
|
28
|
+
# Re-run verification after fixing the server file
|
|
29
|
+
adb shell pm verify-app-links --re-verify com.example.app
|
|
30
|
+
# Open a link as the system would
|
|
31
|
+
adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/product/42" com.example.app
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`verified` means the domain passed; `legacy_failure` or other states mean the server file or the fingerprint is wrong. Google's Statement List Generator and Tester checks a published `assetlinks.json`.
|
|
35
|
+
|
|
36
|
+
## 3. iOS Universal Links
|
|
37
|
+
|
|
38
|
+
**Checklist**
|
|
39
|
+
- [ ] The **Associated Domains** capability is on for the App ID and the target, with `applinks:example.com` (and each subdomain) in the entitlements of the build being tested.
|
|
40
|
+
- [ ] `https://<domain>/.well-known/apple-app-site-association` (no file extension) returns 200 over HTTPS without redirects, as JSON.
|
|
41
|
+
- [ ] The file's `applinks.details` contains `<TeamID>.<BundleID>` of that build and `components` (or legacy `paths`) that match the URL's path, query and fragment.
|
|
42
|
+
- [ ] Apple fetches the file through its CDN, not from the device: after changing it, check what the CDN serves at `https://app-site-association.cdn-apple.com/a/v1/<domain>`. To test against your server directly during development, use `applinks:example.com?mode=developer` with Developer Mode enabled on the device.
|
|
43
|
+
|
|
44
|
+
**Behavior that looks like a bug but is not**
|
|
45
|
+
- Typing or pasting a Universal Link in Safari's address bar opens the website. Test by tapping the link in Notes, Messages or a page on **another** domain.
|
|
46
|
+
- If the user chose to open the site in Safari from the banner, iOS remembers it for that domain; long-press the link and choose *Open in "App"* to reset.
|
|
47
|
+
|
|
48
|
+
**Tools:** Settings → Developer → Universal Links → Diagnostics on a device with Developer Mode checks a URL against the installed app. For custom schemes on the simulator: `xcrun simctl openurl booted "myapp://product/42"`.
|
|
49
|
+
|
|
50
|
+
## 4. In-app routing
|
|
51
|
+
|
|
52
|
+
- **Cold start vs warm start.** The URL arrives through different paths: Android `onCreate` intent vs `onNewIntent`; iOS `scene(_:willConnectTo:options:)` (`connectionOptions.userActivities`/`urlContexts`) vs `scene(_:continue:)`/`scene(_:openURLContexts:)`, or `.onOpenURL` in SwiftUI. A handler implemented only for the warm path loses links that launch the app.
|
|
53
|
+
- **Timing.** Links handled before the navigator, the auth state or remote config is ready either crash or are dropped. Store the pending link and route after initialization; send users to login first and resume the link afterward.
|
|
54
|
+
- **Route matching.** Log the received URL at the entry point and compare with the route patterns: trailing slashes, case, encoded characters and query parameters are frequent mismatches.
|
|
55
|
+
- **Flutter:** with `go_router`, the Flutter deep linking flag (`flutter_deeplinking_enabled` meta-data in `AndroidManifest.xml`, `FlutterDeepLinkingEnabled` in `Info.plist`) lets the router receive links; when a plugin such as `app_links` handles them instead, follow the plugin's instructions for that flag. Check the Flutter version's default before changing it.
|
|
56
|
+
- **React Native:** the `linking` config of React Navigation (`prefixes` and `config.screens`) or Expo Router's file routes decide the screen; test with `npx uri-scheme open "myapp://product/42" --android` (or `--ios`). Expo Go uses its own scheme; test real links in a development build.
|
|
57
|
+
|
|
58
|
+
## 5. Verify
|
|
59
|
+
|
|
60
|
+
Test on a device with the build type that will ship, for each link type and host, from cold start and from background, logged in and logged out.
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: flutter-build-debug
|
|
3
|
-
description: Diagnoses failing Flutter builds by locating the layer that broke — Dart compilation, pub version solving, generated code, the Android Gradle side or the iOS Xcode and CocoaPods side — and checking the Flutter SDK, JDK, Gradle, AGP, Kotlin and deployment target versions Flutter requires. Use whenever `flutter run`, `flutter build apk/appbundle/ios/ipa`, `flutter pub get` or a Flutter CI job fails, after upgrading Flutter, or when a plugin breaks the native build, even if the user only pastes the error.
|
|
4
|
-
intents: [debug, build, dependency, migration]
|
|
5
|
-
stacks: [flutter]
|
|
6
|
-
areas: [pub, gradle, cocoapods, xcode]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
1
|
# Flutter Build Debug
|
|
10
2
|
|
|
11
3
|
A Flutter build runs four toolchains in sequence: pub, the Dart compiler, Gradle for Android and Xcode with CocoaPods for iOS. The error message comes from one of them, and the fix belongs to that one. Identify the layer first.
|
|
@@ -16,8 +8,8 @@ A Flutter build runs four toolchains in sequence: pub, the Dart compiler, Gradle
|
|
|
16
8
|
|---|---|---|
|
|
17
9
|
| `version solving failed`, `Because X depends on Y` | pub | Section 3 |
|
|
18
10
|
| `lib/...dart:LINE:COL: Error:` | Dart compiler | Section 4 |
|
|
19
|
-
| `FAILURE: Build failed with an exception`, `Execution failed for task`, `Gradle task assembleDebug failed` | Android / Gradle | Section 5, then
|
|
20
|
-
| `Xcode build done` with errors, `Error (Xcode):`, `pod install` output | iOS / Xcode / CocoaPods | Section 6, then
|
|
11
|
+
| `FAILURE: Build failed with an exception`, `Execution failed for task`, `Gradle task assembleDebug failed` | Android / Gradle | Section 5, then [../android/gradle-build.md](../android/gradle-build.md) |
|
|
12
|
+
| `Xcode build done` with errors, `Error (Xcode):`, `pod install` output | iOS / Xcode / CocoaPods | Section 6, then [../ios/xcode-build.md](../ios/xcode-build.md) or [../ios/cocoapods.md](../ios/cocoapods.md) |
|
|
21
13
|
|
|
22
14
|
`flutter run -v` or `flutter build <target> -v` prints the underlying tool output when the summary is not enough.
|
|
23
15
|
|
|
@@ -48,14 +40,14 @@ Collect the versions in `android/`: Gradle in `gradle/wrapper/gradle-wrapper.pro
|
|
|
48
40
|
- [ ] `You are applying Flutter's main Gradle plugin imperatively using the apply script method` → the project uses the old `apply from: .../flutter.gradle` setup. Migrate to the declarative `plugins {}` block described in Flutter's "Deprecated imperative apply of Flutter's Gradle plugins" guide.
|
|
49
41
|
- [ ] Wrong JDK → `flutter config --jdk-dir <path>` points Flutter at a specific JDK; check `flutter doctor -v` again afterwards.
|
|
50
42
|
- [ ] A plugin requiring a higher `minSdk` or `compileSdk` → set it in `android/app/build.gradle(.kts)`. `flutter.minSdkVersion` is Flutter's default, which a plugin may exceed.
|
|
51
|
-
- For anything else in Gradle, apply
|
|
43
|
+
- For anything else in Gradle, apply [../android/gradle-build.md](../android/gradle-build.md).
|
|
52
44
|
|
|
53
45
|
## 6. iOS side
|
|
54
46
|
|
|
55
|
-
- [ ] `pod install` errors or `CocoaPods not installed` → apply
|
|
47
|
+
- [ ] `pod install` errors or `CocoaPods not installed` → apply [../ios/cocoapods.md](../ios/cocoapods.md). Run pod commands from `ios/`.
|
|
56
48
|
- [ ] `Module 'x' not found` in Xcode → open `ios/Runner.xcworkspace`, not `Runner.xcodeproj`.
|
|
57
49
|
- [ ] Deployment target conflicts → `platform :ios` in `ios/Podfile` and `IPHONEOS_DEPLOYMENT_TARGET` in the Runner project must be at least what the plugins require.
|
|
58
|
-
- [ ] Signing errors on `flutter build ipa` → apply
|
|
50
|
+
- [ ] Signing errors on `flutter build ipa` → apply [../ios/xcode-build.md](../ios/xcode-build.md).
|
|
59
51
|
|
|
60
52
|
## 7. Cleaning, with confirmation
|
|
61
53
|
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
name: flutter-errors
|
|
3
|
-
description: Diagnoses and fixes common Flutter errors. Use when encountering layout errors (RenderFlex overflow, unbounded constraints, RenderBox not laid out), scroll errors, or setState-during-build errors.
|
|
4
|
-
intents: [debug]
|
|
5
|
-
stacks: [flutter]
|
|
6
|
-
source: https://github.com/evanca/flutter-ai-rules
|
|
7
|
-
license: MIT
|
|
8
|
-
---
|
|
1
|
+
> Adapted from the `flutter-errors` skill in [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) (MIT). See `THIRD_PARTY_NOTICES.md`.
|
|
9
2
|
|
|
10
3
|
# Flutter Errors Skill
|
|
11
4
|
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
description: Fixes Flutter layout errors (overflows, unbounded constraints) using Dart and Flutter MCP tools. Use when addressing "RenderFlex overflowed", "Vertical viewport was given unbounded height", or similar layout issues.
|
|
4
|
-
metadata:
|
|
5
|
-
model: models/gemini-3.1-pro-preview
|
|
6
|
-
last_modified: Tue, 21 Apr 2026 19:45:59 GMT
|
|
7
|
-
intents: [debug]
|
|
8
|
-
stacks: [flutter]
|
|
9
|
-
source: https://github.com/flutter/skills
|
|
10
|
-
license: BSD-3-Clause
|
|
11
|
-
---
|
|
1
|
+
> Adapted from the `flutter-fix-layout-issues` skill in [flutter/skills](https://github.com/flutter/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
|
|
2
|
+
|
|
12
3
|
# Resolving Flutter Layout Errors
|
|
13
4
|
|
|
14
5
|
## Contents
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
description: Workflow for fixing package version conflicts. Use this when `pub get` fails due to incompatible package versions.
|
|
4
|
-
metadata:
|
|
5
|
-
model: models/gemini-3.1-pro-preview
|
|
6
|
-
last_modified: Fri, 24 Apr 2026 15:11:14 GMT
|
|
7
|
-
intents: [debug, dependency]
|
|
8
|
-
stacks: [flutter]
|
|
9
|
-
source: https://github.com/dart-lang/skills
|
|
10
|
-
license: BSD-3-Clause
|
|
11
|
-
---
|
|
1
|
+
> Adapted from the `dart-resolve-package-conflicts` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
|
|
2
|
+
|
|
12
3
|
# Managing Dart Dependencies
|
|
13
4
|
|
|
14
5
|
## Contents
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
description: Uses get_runtime_errors and lsp to fetch an active stack trace, locate the failing line, apply a fix, and verify resolution via hot_reload.
|
|
4
|
-
metadata:
|
|
5
|
-
model: models/gemini-3.1-pro-preview
|
|
6
|
-
last_modified: Fri, 24 Apr 2026 15:13:22 GMT
|
|
7
|
-
intents: [debug]
|
|
8
|
-
stacks: [flutter]
|
|
9
|
-
source: https://github.com/dart-lang/skills
|
|
10
|
-
license: BSD-3-Clause
|
|
11
|
-
---
|
|
1
|
+
> Adapted from the `dart-fix-runtime-errors` skill in [dart-lang/skills](https://github.com/dart-lang/skills) (BSD-3-Clause). See `THIRD_PARTY_NOTICES.md`.
|
|
2
|
+
|
|
12
3
|
# Resolving Dart Static Analysis Errors
|
|
13
4
|
|
|
14
5
|
## Contents
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Debugging Flutter apps
|
|
2
|
+
|
|
3
|
+
Identify whether the failure happens while **building** or while **running**, then open the matching guide.
|
|
4
|
+
|
|
5
|
+
| Symptom | Guide |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `flutter run` / `flutter build` fails: pub version solving, Dart compile errors, generated code, the Gradle or Xcode step | [flutter/build.md](flutter/build.md) — locates the failing layer and hands off to the native guides |
|
|
8
|
+
| `version solving failed`, incompatible package constraints | [flutter/package-conflicts.md](flutter/package-conflicts.md) |
|
|
9
|
+
| Exceptions at runtime: red screen, `Null check operator used on a null value`, `setState() called after dispose()`, assertion failures | [flutter/errors.md](flutter/errors.md) |
|
|
10
|
+
| An exception with a live app and the Dart/Flutter MCP tools available | [flutter/runtime-errors.md](flutter/runtime-errors.md) |
|
|
11
|
+
| `RenderFlex overflowed`, `unbounded height/width`, `Vertical viewport was given unbounded height` | [flutter/layout-issues.md](flutter/layout-issues.md) |
|
|
12
|
+
|
|
13
|
+
## First checks for any Flutter failure
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
flutter --version
|
|
17
|
+
flutter doctor -v # Flutter, Dart, Android toolchain and the JDK it uses, Xcode, CocoaPods
|
|
18
|
+
flutter run -v # or flutter build <target> -v, for the full underlying output
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- A project pinned with FVM (`.fvmrc`, `.fvm/`) or asdf must run with that Flutter version, not the global one.
|
|
22
|
+
- Native failures inside `android/` follow [android.md](android.md); inside `ios/`, [ios.md](ios.md).
|
|
23
|
+
- `flutter clean` removes `build/` and `.dart_tool/`: it fixes stale outputs, not version conflicts. Propose it only after the version checks, and run it only when the user agrees.
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ios-cocoapods-debug
|
|
3
|
-
description: Diagnoses CocoaPods failures in iOS, Flutter and React Native projects — "could not find compatible versions", outdated spec repos, "sandbox is not in sync with the Podfile.lock", deployment target conflicts, Ruby and CocoaPods installation problems on Apple Silicon, Bundler-managed CocoaPods, post_install hooks and private spec sources. Use whenever `pod install` or `pod update` fails, when an iOS build breaks inside the Pods project, when Podfile or Podfile.lock is involved, or when the user asks whether to delete Pods or run pod update, even if they only paste the error.
|
|
4
|
-
intents: [debug, dependency, build, migration]
|
|
5
|
-
stacks: [ios]
|
|
6
|
-
areas: [cocoapods]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
1
|
# iOS CocoaPods Debug
|
|
10
2
|
|
|
11
3
|
Most CocoaPods failures come from three places: the spec repository is out of date, the version constraints cannot be satisfied, or the Ruby installation running `pod` is broken. Identify which one before touching `Podfile.lock`.
|
|
@@ -44,7 +36,7 @@ In Flutter, run these from `ios/`; `flutter build ios` and `flutter run` already
|
|
|
44
36
|
## 4. Build errors inside Pods
|
|
45
37
|
|
|
46
38
|
- [ ] Pods compiled with a lower deployment target than Xcode supports (warnings like `The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 9.0, but the range of supported deployment target versions is ...`) → a `post_install` hook that sets the deployment target for the pod targets. Keep the existing hook content (Flutter's `flutter_additional_ios_build_settings` must stay).
|
|
47
|
-
- [ ] Script phases failing with sandbox `deny` errors after moving to Xcode 15 or later → see
|
|
39
|
+
- [ ] Script phases failing with sandbox `deny` errors after moving to Xcode 15 or later → see [xcode-build.md](xcode-build.md) (user script sandboxing); updating CocoaPods is the first step.
|
|
48
40
|
- [ ] `No such module` for a pod → the project was built as `.xcodeproj` instead of `.xcworkspace`, or the target is missing from the `Podfile`.
|
|
49
41
|
- [ ] `use_frameworks!` changes (static vs dynamic) → some pods require one mode; changing it affects every pod. Check each pod's installation notes before switching.
|
|
50
42
|
|
package/skills/{ios-xcode-build-debug/SKILL.md → mobile-debug/references/ios/xcode-build.md}
RENAMED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ios-xcode-build-debug
|
|
3
|
-
description: Diagnoses failing iOS builds in Xcode and xcodebuild — code signing and provisioning, deployment target mismatches, "No such module", Apple Silicon simulator architecture errors, script phases failing under user script sandboxing, Swift Package Manager resolution, duplicate build outputs and errors after upgrading Xcode or Swift. Use whenever an iOS, Flutter or React Native build fails in Xcode, when the log shows "Command PhaseScriptExecution failed", "Signing for ... requires a development team", "Undefined symbols" or "BUILD FAILED", or when an archive or TestFlight upload breaks, even if the user only pastes the error.
|
|
4
|
-
intents: [debug, build, release, migration]
|
|
5
|
-
stacks: [ios]
|
|
6
|
-
areas: [xcode, signing, spm]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
1
|
# iOS Xcode Build Debug
|
|
10
2
|
|
|
11
3
|
Xcode shows the last error loudly and the first one quietly. Work in this order: find the first real error, collect the versions, then match the error to a section below. Confirm every cause in the project files before proposing a fix.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Debugging iOS
|
|
2
|
+
|
|
3
|
+
## Build failures
|
|
4
|
+
|
|
5
|
+
| Symptom | Guide |
|
|
6
|
+
|---|---|
|
|
7
|
+
| Xcode or `xcodebuild` errors: signing and provisioning, deployment target, `No such module`, `Undefined symbols`, script phases and sandboxing, Swift Package Manager, errors after upgrading Xcode or Swift | [ios/xcode-build.md](ios/xcode-build.md) |
|
|
8
|
+
| `pod install` / `pod update` failures, `Podfile.lock` conflicts, Ruby and CocoaPods installation, build errors inside the Pods project | [ios/cocoapods.md](ios/cocoapods.md) |
|
|
9
|
+
|
|
10
|
+
In Flutter and React Native apps, run pod commands and open the workspace from `ios/`.
|
|
11
|
+
|
|
12
|
+
## Crashes at runtime
|
|
13
|
+
|
|
14
|
+
1. **Get the crash report.** While debugging, Xcode stops at the crash; for devices and TestFlight, use Xcode's Organizer (Crashes) or the device logs in *Devices and Simulators*. Crash reports (`.ips`) need the build's dSYM to be symbolicated; unsymbolicated frames show only addresses.
|
|
15
|
+
2. **Read the exception type and the crashed thread**, not the first frame of the main thread only.
|
|
16
|
+
3. **Match the signature:**
|
|
17
|
+
- `Fatal error: Unexpectedly found nil while unwrapping an Optional value` / `EXC_BREAKPOINT` in Swift code → a force unwrap, `try!`, `as!` or an out-of-range index on the crashed line.
|
|
18
|
+
- `EXC_BAD_ACCESS` → use of freed memory or a data race; reproduce with **Address Sanitizer** or **Thread Sanitizer** enabled in the scheme's diagnostics.
|
|
19
|
+
- `Main Thread Checker: UI API called on a background thread` → UI updated off the main actor; the Main Thread Checker diagnostic reports the exact call.
|
|
20
|
+
- `This app has crashed because it attempted to access privacy-sensitive data without a usage description` → a missing `NS...UsageDescription` key in `Info.plist`.
|
|
21
|
+
- `Terminating app due to uncaught exception 'NSInternalInconsistencyException'` in table or collection views → the data source changed without matching updates; use diffable data sources.
|
|
22
|
+
- Watchdog terminations (`0x8badf00d`) → the main thread blocked too long, often at launch.
|
|
23
|
+
4. **Crashes only in release or TestFlight** → optimization-dependent races, missing entitlements or capabilities in the distribution profile, or code under `#if DEBUG`. Reproduce with the Release configuration.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Debugging React Native apps
|
|
2
|
+
|
|
3
|
+
A React Native app fails in one of three layers: the JavaScript bundle (Metro), the native build (Gradle or Xcode), or at runtime. Find the layer before changing anything.
|
|
4
|
+
|
|
5
|
+
| Output contains | Layer | Next step |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `Unable to resolve module`, `SyntaxError` in the bundle, Metro red screen before the app renders | Metro / JavaScript bundle | Section 2 |
|
|
8
|
+
| `FAILURE: Build failed with an exception`, `Execution failed for task` | Android build | [android.md](android.md) — run Gradle from `android/` |
|
|
9
|
+
| `pod install` errors, Xcode `error:` lines | iOS build | [ios.md](ios.md) — run pods from `ios/` |
|
|
10
|
+
| `TurboModuleRegistry.getEnforcing(...): 'X' could not be found`, `requireNativeComponent: 'X' was not found in the UIManager`, `The package 'X' doesn't seem to be linked` | Native module missing from the running binary | Section 3 |
|
|
11
|
+
| A red screen or LogBox error after the app renders | JavaScript runtime | Section 4 |
|
|
12
|
+
|
|
13
|
+
## 1. Versions
|
|
14
|
+
|
|
15
|
+
- `npx react-native info` (or `npx expo-doctor` in Expo projects): React Native, Node, Java, Xcode, CocoaPods and package versions in one place.
|
|
16
|
+
- React Native, the Expo SDK and native libraries must be versions that support each other; check each library's compatibility notes. After a React Native upgrade, compare native file changes with the React Native Upgrade Helper for the two versions.
|
|
17
|
+
- Check whether the New Architecture is enabled (`newArchEnabled` in `android/gradle.properties`, the Podfile or `app.json`) before debugging a native module: older libraries may not support it.
|
|
18
|
+
|
|
19
|
+
## 2. Metro and the JavaScript bundle
|
|
20
|
+
|
|
21
|
+
- `Unable to resolve module X` → the package is not installed, the import path is wrong, or Metro's cache is stale after installing. Check `package.json` and the path first; then restart Metro with a clean cache (`npx react-native start --reset-cache`, or `npx expo start -c`).
|
|
22
|
+
- Monorepos and symlinked packages need `watchFolders` and resolver settings in `metro.config.js`.
|
|
23
|
+
- `Invariant Violation: "main" has not been registered` → the bundle failed to load earlier (read the first error in the Metro terminal), or the name in `AppRegistry.registerComponent` differs from the native side.
|
|
24
|
+
|
|
25
|
+
## 3. Native module not found
|
|
26
|
+
|
|
27
|
+
The JavaScript side expects a native module that the installed binary does not contain.
|
|
28
|
+
|
|
29
|
+
- The app was not rebuilt after installing a library with native code: rebuild (`npx react-native run-android` / `run-ios`, or a new development build with Expo).
|
|
30
|
+
- Expo Go only contains the Expo SDK's modules; libraries with other native code need a development build.
|
|
31
|
+
- iOS: `pod install` did not run after installing the library.
|
|
32
|
+
- The library does not support the architecture the app runs (New Architecture vs legacy); check its documentation.
|
|
33
|
+
|
|
34
|
+
## 4. JavaScript runtime errors
|
|
35
|
+
|
|
36
|
+
- Read the component stack in LogBox, not only the message. `undefined is not an object (evaluating 'x.y')` and `Cannot read property 'y' of undefined` point to data that has not loaded yet or a changed API response; handle loading and error states.
|
|
37
|
+
- `Rendered more hooks than during the previous render` → a hook called conditionally.
|
|
38
|
+
- `Maximum update depth exceeded` → a state update inside render or an effect whose dependencies change on every render.
|
|
39
|
+
- Release-only crashes: stack traces from Hermes release bundles need the source maps of that build to map back to source files; check that source maps are generated and uploaded to the crash reporter. Also check `__DEV__`-only code and environment variables missing from the release configuration.
|
|
40
|
+
|
|
41
|
+
## Cleaning, with confirmation
|
|
42
|
+
|
|
43
|
+
These fix stale caches, not version conflicts. Propose them with what they delete, and run them only when the user agrees: restarting Metro with `--reset-cache`, `watchman watch-del-all`, deleting `node_modules` and reinstalling, `./gradlew clean` in `android/`, removing `ios/Pods` and running `pod install`. In Expo projects with Continuous Native Generation, `npx expo prebuild --clean` regenerates `android/` and `ios/` and discards manual native changes; confirm that the project does not rely on them first.
|