You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
cdp_status "Already connecting to Metro" race against Expo dev-client picker — on dev-client builds, after launchApp/relaunch, cdp_status returned "Already connecting to Metro... Dev Client picker detected but could not find a server entry to tap. Select the Metro server manually." Two consecutive cdp_status calls hung 60s and 35s respectively (see telemetry below). The plugin sees the picker but doesn't auto-tap the single configured server, leaving the session blocked until manual intervention.
No automatic dev-launcher handling in launchApp — the same picker issue surfaces for Maestro actions: every launchApp: { stopApp: true } on a dev-client build lands on the Expo "DEVELOPMENT SERVERS" picker instead of the welcome screen. Users have to write their own runFlow when: visible: "DEVELOPMENT SERVERS" block (which itself races the picker auto-advance — fails ~30% of the time).
Environment
Field
Value
Plugin version
0.44.26
CDP Bridge
0.38.20
Tool count
74
OS
Darwin 25.3.0
Node.js
v24.14.0
npm
11.9.0
Metro
running on 8081
iOS Simulators
1 booted
Android Emulators
0 connected (at collection time — Pixel 9 Pro was driven during session, emulator OOM-died mid-run)
agent-device
0.8.0
maestro-runner
1.0.9
Recent Tool Activity (telemetry excerpts)
ts
tool
result
latency
12:49:58
maestro_run
PASS
92422 ms
13:03:35
device_screenshot
PASS
775 ms
13:07:23
device_screenshot
PASS
904 ms
13:29:34
device_list
PASS
1085 ms
13:37:49
cdp_status
FAIL
60009 ms
13:38:39
cdp_status
FAIL
34676 ms
13:38:44
device_screenshot
PASS
1329 ms
The two cdp_status FAIL rows are the Metro-connection hangs.
Steps to Reproduce
Issue 1 — device_screenshot wrong platform
Boot iOS simulator AND Android emulator simultaneously.
Load the same app on both (e.g. pnpm android while iOS sim is also running).
Call device_screenshot platform: "android".
Actual: returns 1179×2556 image (iPhone 15 Pro resolution).
Expected: returns 1280×2856 image (Pixel 9 Pro resolution).
Issue 2 — cdp_status hangs on dev-client picker
Have a dev-client (Expo Dev Client) build installed.
Run a Maestro action with launchApp: { stopApp: true, clearKeychain: true }.
After action ends, app sits on the "DEVELOPMENT SERVERS" picker.
Call cdp_status platform: "android" (or iOS).
Actual: returns {"ok":false,"error":"Already connecting to Metro... Dev Client picker detected but could not find a server entry to tap. Select the Metro server manually."} after 30–60s timeout.
Expected: plugin auto-taps the (single) configured server entry, then returns connected status.
Issue 3 — No auto-handler for dev-launcher in launchApp
The runFlow when: evaluates true, but the tapOn races against the picker's auto-advance — fails with "context deadline exceeded: WDA error: unable to find an element using 'predicate string', value '(label CONTAINS[c] 'http://' OR name CONTAINS[c] 'http://' OR value CONTAINS[c] 'http://')'".
Workaround
Issue 1: raw adb -s <emu-id> exec-out screencap -p > out.png (Android) or xcrun simctl io <UDID> screenshot out.png (iOS).
Issue 2: call cdp_status only after manually tapping the picker (defeats the auto-connect purpose).
Issue 3: retry the action; works ~70% of the time. The picker race is unavoidable on dev-client builds.
Issue 2: in cdp_status Metro-connect path, detect "DEVELOPMENT SERVERS" via accessibility tree and auto-tap the single visible server entry before returning. Today the plugin already detects the picker (the error message proves it) — just needs to take action.
Issue 3:launchApp (or a new dev_client_unblock MCP tool) should bake in the picker-tap when the dev launcher is detected after launch, with a deterministic wait-and-retry instead of the runFlow race.
rn-collect-feedback reported android_emulators: 0 connected even though Pixel 9 Pro was used during the session. Collector takes a single-moment snapshot, so emulator restarts/crashes within the session aren't reflected. Could note "see telemetry for actual device usage" or include device-events log.
Maestro action authoring lessons learned (point-based taps, OTP digit-race on CodeInput, MarketSelect handling) are user-side learnings — not plugin defects — but might be worth a "writing reliable .rn-agent/actions" docs page.
Submitted via /rn-dev-agent:send-feedback — data sanitized automatically
Description
Long testing session on a React Native app surfaced three rn-dev-agent friction points worth reporting together:
Multi-device routing of
device_screenshot— with both iOS sim and Android emulator booted,device_screenshot platform: "android"captured the iOS screen every time. Forced fallback to rawadb exec-out screencap -pfor every Android screenshot in the session. (Re-evidence on existing IX-2950 session feedback: multi-device routing bugs + missing primitives (record/storage/reset) #60.)cdp_status"Already connecting to Metro" race against Expo dev-client picker — on dev-client builds, afterlaunchApp/relaunch,cdp_statusreturned"Already connecting to Metro... Dev Client picker detected but could not find a server entry to tap. Select the Metro server manually."Two consecutivecdp_statuscalls hung 60s and 35s respectively (see telemetry below). The plugin sees the picker but doesn't auto-tap the single configured server, leaving the session blocked until manual intervention.No automatic dev-launcher handling in
launchApp— the same picker issue surfaces for Maestro actions: everylaunchApp: { stopApp: true }on a dev-client build lands on the Expo "DEVELOPMENT SERVERS" picker instead of the welcome screen. Users have to write their ownrunFlow when: visible: "DEVELOPMENT SERVERS"block (which itself races the picker auto-advance — fails ~30% of the time).Environment
Recent Tool Activity (telemetry excerpts)
The two
cdp_status FAILrows are the Metro-connection hangs.Steps to Reproduce
Issue 1 —
device_screenshotwrong platformpnpm androidwhile iOS sim is also running).device_screenshot platform: "android".Issue 2 —
cdp_statushangs on dev-client pickerlaunchApp: { stopApp: true, clearKeychain: true }.cdp_status platform: "android"(or iOS).{"ok":false,"error":"Already connecting to Metro... Dev Client picker detected but could not find a server entry to tap. Select the Metro server manually."}after 30–60s timeout.Issue 3 — No auto-handler for dev-launcher in
launchApprunFlow when:evaluates true, but the tapOn races against the picker's auto-advance — fails with"context deadline exceeded: WDA error: unable to find an element using 'predicate string', value '(label CONTAINS[c] 'http://' OR name CONTAINS[c] 'http://' OR value CONTAINS[c] 'http://')'".Workaround
adb -s <emu-id> exec-out screencap -p > out.png(Android) orxcrun simctl io <UDID> screenshot out.png(iOS).cdp_statusonly after manually tapping the picker (defeats the auto-connect purpose).Suggested Fix
platform:is passed, routedevice_screenshotthrough the platform-specific raw command (adb exec-out screencapfor Android,xcrun simctl iofor iOS) — bypass the WDA/UIAutomator2 ambiguity entirely.cdp_statusMetro-connect path, detect "DEVELOPMENT SERVERS" via accessibility tree and auto-tap the single visible server entry before returning. Today the plugin already detects the picker (the error message proves it) — just needs to take action.launchApp(or a newdev_client_unblockMCP tool) should bake in the picker-tap when the dev launcher is detected after launch, with a deterministic wait-and-retry instead of the runFlow race.Related Issues
Side Observations (Not Blocking, FYI)
rn-collect-feedbackreportedandroid_emulators: 0 connectedeven though Pixel 9 Pro was used during the session. Collector takes a single-moment snapshot, so emulator restarts/crashes within the session aren't reflected. Could note "see telemetry for actual device usage" or include device-events log.CodeInput, MarketSelect handling) are user-side learnings — not plugin defects — but might be worth a "writing reliable .rn-agent/actions" docs page.Submitted via
/rn-dev-agent:send-feedback— data sanitized automatically