argent-tv-interact
GitHub控制并检查 Apple TV、Android TV 及 Fire TV 应用。通过 describe 和 tv-remote 进行焦点驱动导航,支持按键操作、输入、截图及应用管理。强调避免触控,需先描述界面再导航,适配各平台特性。
Trigger Scenarios
Install
npx skills add software-mansion/argent --skill argent-tv-interact -g -y
SKILL.md
Frontmatter
{
"name": "argent-tv-interact",
"description": "Control and inspect TV apps via argent — Apple TV (tvOS), Android TV (leanback), and Amazon Fire TV (Vega). Boot the target, read focus, navigate with the D-pad remote, type, screenshot, and on Vega debug the JS runtime (evaluate, console logs, network inspector). Use when a task targets a TV (runtimeKind \"tv\", or platform \"vega\"), or mentions Apple TV \/ tvOS \/ Android TV \/ leanback \/ Vega \/ Fire TV \/ VVD."
}
Argent TV (Apple TV + Android TV + Fire TV)
Critical
- A TV is focus-driven, not touch-driven. Drive every interaction with
describe+tv-remote+keyboard; never usegesture-*/ coordinate taps — they don't apply on any TV platform. - Always
describebefore navigating to find the live cursor and your target — never guess focus from a screenshot. The cursor is the focused element; on Vega the toolkit often leavesfocusedfalse and marks the highlighted item[selected], so treat[selected]as the cursor when nothing reports[focused]. - Pass the
udidfromlist-devices— an Apple TV simulator UDID or an Android TV / Vegaserial. Dispatch is automatic from the id; the same tools drive all three.
The navigation loop
describe— find the cursor and your target (returns the focused element + all focusable ones, not a tap tree).tv-remote— move focus toward the target. Prefer one call with a path ending inselect, e.g.{button:["down","right","select"]}; count rows/columns from the frames to build the path.describeagain to confirm. On a miss, repeat.
Tools
describe {udid}— focus view: the focused /[selected]element + focusable elements with labels and normalized frames. The discovery tool — call before and after navigating. Empty tree → see the per-platform notes.tv-remote {udid, button}— D-pad / remote.buttonis one key or a whole path (run in one call). Keys:up/down/left/right,select,back,menu,home,playPause, plus media keysrewind/fastForward/next/previous/volumeUp/volumeDown/mute. Single:{button:"down"}; repeat:{button:"down", repeat:3}; path:{button:["up","right","select"]}.keyboard {udid, text}— type into the focused field (focus it withtv-remotefirst). Namedkeypresses (e.g.{key:"enter"}) work on Vega; on Apple TV / Android TV move focus withtv-remoteinstead.launch-app/restart-app/reinstall-app {udid, bundleId}—bundleIdfrom the app manifest. Vegareinstall-apptakesappPath= a.vpkg.screenshot {udid, scale?}— Apple TV viaxcrun simctl io(downscaled); Android TV / Vega host-side viaadb/screencap.
Per-platform
Apple TV (tvOS simulator)
- Boot like any iOS sim (
boot-device); the AX + HID daemons auto-start on the firstdescribe/tv-remote(first call may take a few seconds). Give the RN bundle a few seconds to render before the firstdescribe. - Media-transport / volume keys are rejected — the sim's HID stack ignores them (they work on Android TV / Vega).
- Dev build:
open-url {udid, url:"<scheme>://expo-development-client/?url=http%3A%2F%2F<HOST_IP>%3A8081"}(<HOST_IP>= your Mac's LAN IP, shown on the launcher).
Android TV (leanback emulator)
- Boot the leanback AVD like any emulator — see
argent-android-emulator-setup. describemay report zero focusables on a screen with visible tiles: manyreact-native-tvosscreens use RN's own focus engine, invisible to the OS accessibility tree.describeauto-falls-back to the full UI tree (and says so in the hint);tv-remotestill moves focus, so drive blind +screenshotto confirm.- Dev build:
adb -s <serial> reverse tcp:8081 tcp:8081, deep-link<pkg>://expo-development-client/?url=http%3A%2F%2F10.0.2.2%3A8081, dismiss the first dev-menu withadb shell input keyevent KEYCODE_DPAD_CENTER(not Back — Back exits the app).
Fire TV (Vega / VVD)
list-devicesshows aserial(use asudid) and avvdImage.boot-device {vvdImage}(e.g."tv") starts the single SDK-managed VVD; skip if one already runs.- Stop the VVD with
vega virtual-device stopin your shell. The CLI only tracks VVDs it started in the foreground, so it may report "not running" for one started viaboot-device; to restart that one useboot-device {vvdImage, force:true}(stops then re-boots). - Empty
describetree →restart-app(the automation toolkit attaches at launch), then retry. Input ignored → enable developer mode in the VVD:vsm developer-mode enable. - Editing
node_moduleshas no effect on a Release build — only Debug.vpkgbuilds load patchable JS. - Profiling / crashes →
amazon-devices-buildertools-mcpserver (analyze_perfetto_traces,get_app_hot_functions,symbolicate_acr); docs via itssearch_documentationtool.
Common gotchas
- Empty focus right after
launch-app/restart-appis the splash / loading window —describeretries internally; wait ~2-3s and retry on a cold start. - Passing a phone/tablet (
runtimeKind: "mobile") udid totv-remotefails with a clear "tvOS-only" / "Android-TV-only" error — pick a TV target fromlist-devices.
Fast Refresh (dev builds)
Needs a Debug build + Metro running. argent only connects to Metro — start Metro and port-forward yourself (any platform). Metro is fixed on :8081.
- Apple TV / Android TV: use the dev-build deep-links above;
npm startfor Metro. - Vega: build/install a Debug
.vpkg(vega device install-app -p <path>),npm start,vega device start-port-forwarding --port 8081 --forward false, thenvega device launch-app -a <appId>. Confirmhttp://localhost:8081/json/listshows aHermes React Nativetarget;.tsxedits then hot-reload.
Debugging the JS runtime (Vega)
Once that same Debug build + Metro setup is in place, the JS-runtime tools work on a Vega VVD: debugger-connect, debugger-status, debugger-evaluate, debugger-log-registry (console logs), view-network-logs, and view-network-request-details. See the argent-metro-debugger skill.
Vega's React Native forks RN 0.72 and serves the legacy Hermes inspector, so three things differ from iOS / Android:
debugger-component-tree,debugger-inspect-element,debugger-reload-metroand thereact-profiler-*/profiler-*tools are not supported. Component-tree and inspect-element are hard-blocked: they needRuntime.addBinding, which this Hermes acknowledges but never installs. The rest are simply unverified on the legacy inspector. Usedescribefor on-screen structure; with both component tools gated off, componentfile:linetracing has no path on Vega.debugger-statusreportsisNewDebugger: false.projectRootis empty (RN 0.72's Metro sends no project-root header), so lookups that resolve paths against the project root return no location.
Version History
-
a0460ee
Current 2026-07-24 11:28
新增Vega平台JS运行时调试和网络检查器支持,解锁debugger-evaluate等工具,明确部分因RN版本限制仍不可用的功能。
- bc04c3b 2026-07-06 19:59


