.agents/skills/mobile-e2e/SKILL.md
Run the mobile Maestro tests for apps/mobile.
apps/mobile/e2e/run-maestro.shapps/mobile/e2e/flows/ios/auth.yamlapps/mobile/e2e/flows/android/core.yamlapps/mobile/e2e/flows/shared/*.yamlapps/mobile/e2e/artifacts/From repo root:
cd apps/mobile
pnpm run e2e:doctor
pnpm run typecheck
Use a simulator .app build, not an Expo development client.
Prefer the latest installed iOS runtime and a latest-generation iPhone simulator.
When multiple simulators are available, bias toward the newest iPhone model on the newest installed iOS version.
xcrun simctl boot <IOS_UDID>
xcrun simctl bootstatus <IOS_UDID> -b
open -a Simulator --args -CurrentDeviceUDID <IOS_UDID>
run-maestro.sh can resolve the app bundle from one of these sources:
MAESTRO_IOS_APP_PATHbuild-*.tar.gz in apps/mobileDerivedData/.../Release-iphonesimulator/Folo.appIf none of those exist, build one first.
If Folo.app is not available yet:
cd apps/mobile/ios
pod install
xcodebuild -workspace Folo.xcworkspace \
-scheme Folo \
-configuration Release \
-sdk iphonesimulator \
-destination 'id=<IOS_UDID>' \
build
When running on an Apple Silicon Mac and building only for the simulator used in the current run, prefer compiling only the active arm64 simulator architecture:
xcodebuild ... \
ONLY_ACTIVE_ARCH=YES \
ARCHS=arm64
Use this optimization only for local self-test / e2e simulator builds tied to the current machine. Do not use it when you need a universal simulator app for other machines or when running on Intel Macs.
Expected output pattern:
~/Library/Developer/Xcode/DerivedData/.../Build/Products/Release-iphonesimulator/Folo.app
cd apps/mobile
MAESTRO_IOS_DEVICE_ID=<IOS_UDID> \
MAESTRO_IOS_APP_PATH=<PATH_TO_Folo.app> \
pnpm run e2e:ios
Use a release APK, not an Expo development build.
Use Android Studio bundled JBR:
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
export PATH="$JAVA_HOME/bin:$PATH"
export ANDROID_HOME="$HOME/Library/Android/sdk"
export ANDROID_SDK_ROOT="$HOME/Library/Android/sdk"
If apps/mobile/android/local.properties is missing, create it with:
echo "sdk.dir=$HOME/Library/Android/sdk" > apps/mobile/android/local.properties
If apps/mobile/android does not exist locally, generate it first with Expo prebuild / run-android tooling.
Then build the release APK:
cd apps/mobile/android
./gradlew app:assembleRelease --console=plain
Expected APK path:
apps/mobile/android/app/build/outputs/apk/release/app-release.apk
adb -s emulator-5554 install -r apps/mobile/android/app/build/outputs/apk/release/app-release.apk
Start a booted emulator first, then:
cd apps/mobile
pnpm run e2e:android
Successful auth validation means:
login-screenlogin-screen disappearInspect these folders after a run:
apps/mobile/e2e/artifacts/ios/
apps/mobile/e2e/artifacts/android/
For a one-off focused run, invoke Maestro directly against a single flow and a custom debug directory.