Conversation
…en't supported; they have been since v0.7.0 Studio's Go backend (studio/app.go) already wires the CLI's exact internal/device physical-device code — EnsureIProxy for iOS USB, EnsureADB/ForwardPort for Android, mDNS discovery + ConnectWiFi for WiFi — shipped in #85 and #86. The device picker already tags physical devices and the frontend already has a WiFi discovery overlay with token memory. None of that needed touching. What was actually stale: website/src/content/docs/tools/studio.md still said "Physical devices are not supported (no iproxy management in Studio yet)" in four places (Beta Preview banner, feature list, System Requirements, Frame Rate table, Known Limitations) — a real inconsistency between the shipped feature and its own docs. Rewrote those sections to match the actual behavior, added a "Physical devices" section covering USB and WiFi setup, and corrected Known Limitations to the one real gap: the WiFi overlay only connects to mDNS-discovered devices, no manual host/port entry field. Also added studio/app_test.go — the studio module had zero test coverage. Covers the pure/testable surface: isDeviceReady, extractLineCol, file-path guards (ReadFile/WriteFile extension + traversal checks), Lint, ListDir, and Connect/ConnectWiFi input validation (unknown device, empty ID, missing WiFi params). Hardware- dependent paths (real device listing/dialing) aren't unit tested — they need actual simulators/emulators/physical hardware. Verified: go build/vet/test clean at root and in studio/, full `wails build` succeeds end-to-end, `npm run build` clean for both studio/frontend and website.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
FP-7 asked me to wire the CLI's existing
internal/devicephysical-device management (iproxy for iOS, adb for Android, WiFi mode) into FlutterProbe Studio's Go backend and device picker, since Studio's own docs claimed physical iOS/Android weren't supported.Investigation finding: the wiring already exists.
studio/app.go'sConnect()/ConnectWiFi()already callinternal/device'sEnsureIProxy,EnsureADB/ForwardPort,IsPhysicalIOS/IsPhysicalAndroid— the exact same code the CLI uses — and the frontend (studio/frontend/src/main.ts+index.html) already has a device picker with aphysicaltag, a WiFi discovery overlay (mDNS_flutterprobe._tcp), and token-memory UX. This shipped in #85 (feat(studio): physical-device support over USB) and #86 (feat(studio,agent): mDNS auto-discovery for WiFi physical devices), both already onmainas of v0.7.0 — well before this ticket.git merge-base --is-ancestorconfirms both are ancestors of the currentmainHEAD.What was actually stale and inconsistent:
website/src/content/docs/tools/studio.md— the Beta Preview banner, feature list, System Requirements, Frame Rate table, and Known Limitations section all still said "Physical devices are not supported (no iproxy management in Studio yet)." That's the real inconsistency the ticket description was pointing at, just one layer removed from where I expected it.What changed
website/src/content/docs/tools/studio.md— rewrote every stale claim to match actual behavior:AGENTS.md)libimobiledevice/adbprerequisites--host/--tokenflow. I deliberately did not build that manual-entry UI in this PR — flagging it honestly rather than scope-creeping a UI feature into a docs-fix PR.studio/app_test.go(new) — thestudiomodule had zero test coverage before this. Added tests for the pure/testable surface:isDeviceReady,extractLineCol,ReadFile/WriteFilepath guards (extension + traversal),Lint(parse errors, empty-test warnings, valid scripts),ListDir,Status/activeClient/Disconnectwhen unconnected, andConnect/ConnectWiFiinput validation (unknown device ID, empty ID, missing WiFi params).CHANGELOG.md—[Unreleased]entry documenting the fix.What I found and corrected mid-investigation
While drafting the docs I initially wrote that physical-device connections in Studio use HTTP transport (mirroring the CLI's behavior per
AGENTS.md's Transport Modes table). Checkingapp.gomore carefully: Studio'sConnect()/ConnectWiFi()both always callprobelink.DialWithOptions, which is WebSocket-only (ws://) — there's no HTTP client path in Studio at all, unlike the CLI which auto-selects HTTP for physical devices. I corrected the docs to say WebSocket, not HTTP. This is a genuine (undocumented, but shipped and apparently intentional) difference in transport choice between the CLI and Studio; I did not change the code, only made sure the docs I wrote were accurate to what the code does.Test plan
go build ./...(root) — cleango test ./...(root) — all packages passcd studio && go build ./...— cleancd studio && go vet ./...— clean (staticcheck flags two pre-existing, unrelated issues inai_chat.go/wifi_discovery.go— not touched by this PR)cd studio && go test ./... -v— all 20 new tests inapp_test.gopasscd studio/frontend && npm install && npm run build— cleancd studio && wails build— full desktop build succeeds end-to-end (macOS arm64, self-signed.appproduced)cd website && npm ci && npm run build— clean; confirmed the new#physical-devicesanchor renders in the built HTML for the in-page link from Quick StartWhat still needs manual/hardware verification before merge
This PR is documentation + tests only — no application code changed, so the physical-device feature itself was not re-verified against real hardware by me:
_flutterprobe._tcpSince the underlying
Connect/ConnectWiFi/EnsureIProxy/EnsureADBcode is unchanged (already shipped and already used by the CLI's own physical-device flow, which — per project memory — has been live-verified with zero connection drops over WiFi), I'd expect this to work, but I have not personally confirmed it end-to-end against hardware in this session.