Skip to content

feat: expose structured MCP command tools #2179

feat: expose structured MCP command tools

feat: expose structured MCP command tools #2179

Triggered via pull request May 27, 2026 14:03
Status Failure
Total duration 2m 28s
Artifacts

ci.yml

on: pull_request
iOS Runner Swift Compatibility
4s
iOS Runner Swift Compatibility
No test-only DI seams
6s
No test-only DI seams
Fallow Code Quality
22s
Fallow Code Quality
Unit Tests
57s
Unit Tests
Coverage
2m 14s
Coverage
Typecheck
29s
Typecheck
Android Helper Packages
33s
Android Helper Packages
Integration Tests
2m 21s
Integration Tests
Fit to window
Zoom out
Zoom in

Annotations

7 errors and 6 warnings
Unit Tests
Process completed with exit code 1.
[unit] src/__tests__/cli-help.test.ts > help workflow preserves known device workaround guidance: src/__tests__/cli-help.test.ts#L81
AssertionError: The input did not match the regular expression /Never use args/. Input: 'agent-device help workflow\n' + '\n' + 'Version-matched operating guide for normal agent-device work.\n' + '\n' + 'Core loop:\n' + ' devices/apps -> open -> snapshot or snapshot -i -> get/is/find/wait or press/fill/scroll/back -> verify -> close\n' + '\n' + 'Command shape:\n' + ' Plans should use agent-device commands, not raw platform tools, pseudo commands, package-manager aliases, or helper prose.\n' + ' Put subcommand first, then positionals, then flags:\n' + ' agent-device open com.example.app --session checkout --platform android --relaunch\n' + ' agent-device record start ./checkout.mp4 --session checkout\n' + ' Snapshot refs look like @E12. After snapshot -i, use the exact @en ref from that output.\n' + ' If the exact ref is not known yet, first output snapshot -i, then use a concrete example shape like press @E12 in the next command; do not write @<ref>, @ref, @Label_Name, or @en placeholders.\n' + ' Close means agent-device close. App-owned back means back; system back means back --system.\n' + ' Taps are press or click. Gestures use swipe, longpress, or gesture <pan|fling|pinch|rotate|transform>. Android pinch, rotate, and transform use provider-native touch injection when available, then the bundled multi-touch helper. iOS simulator transform uses private XCTest synthesis for a continuous two-finger pan/scale/rotation path; otherwise it reports UNSUPPORTED_OPERATION.\n' + '\n' + 'Bootstrap:\n' + ' agent-device devices --platform ios\n' + ' agent-device apps --platform android\n' + ' agent-device open MyApp --platform ios --device "iPhone 17 Pro"\n' + ' agent-device open <discovered-app-id> --session checkout --platform android\n' + ' agent-device install com.example.app ./dist/app.apk --platform android\n' + ' agent-device reinstall com.example.app ./build/MyApp.app --platform ios\n' + ' agent-device install-from-source --github-actions-artifact org/repo:app-debug --platform android\n' + ' agent-device open com.example.app --platform android --relaunch\n' + ' If app id is unknown, plan devices, apps, then open <discovered-app-id>. Discovery is not enough when the task asks to open/start the app.\n' + ' Install arguments are app/package id then artifact path. If the task says install, use install; use reinstall only when explicitly requested. Fresh runtime state is open --relaunch after install.\n' + ' Do not open artifact paths or invent package ids. If apps lookup misses the target and no URL/artifact is provided, ask or stop.\n' + '\n' + 'Snapshots and refs:\n' + ' snapshot reads visible state. snapshot -i gets current interactive refs only; it is the fast path when the next step is an interaction.\n' + ' Default snapshot text is an agent-facing, token-efficient view for planning and targeting actions; use --raw or --json only when you need the full provider tree.\n' + ' Snapshot legend:\n' + ` @E12 [button] label="Add to cart" id="add-cart" enabled hittable -> press @E12 or press 'id="add-cart"'.\n` + ' @E13 [textinput] label="Notes" preview="Leave at side..." truncated -> snapshot -s @E13 before reading.\n' + ' @E14 [cell] label="Profiles" focused -> tvOS focus is currently on this row.\n' + ' [off-screen below] 4 items: "Privacy", "About" -> scroll down, then snapshot -i; those are hints, not refs.\n' + ' Re-snapshot after navigation, submit, typing/fill, modal/list/reload/dynamic changes when you need new refs.\n' + ' Anti-pattern: snapshot -i followed by snapshot -i | grep ...\n' + ' Refs from the first snapshot remain valid until you press, fill, type, scroll, go back, wait for async UI, or otherwise change app state.\n' + ` After a mutation, prefer a known selector/label directly (for example press 'label="Send"') because interaction commands refresh interactive state internally. If you need to discover the new control, use snapshot -i, or snapshot -i -s "Composer" when a stable container
Coverage
Process completed with exit code 1.
[unit] src/__tests__/cli-help.test.ts > help workflow preserves known device workaround guidance: src/__tests__/cli-help.test.ts#L81
AssertionError: The input did not match the regular expression /Never use args/. Input: 'agent-device help workflow\n' + '\n' + 'Version-matched operating guide for normal agent-device work.\n' + '\n' + 'Core loop:\n' + ' devices/apps -> open -> snapshot or snapshot -i -> get/is/find/wait or press/fill/scroll/back -> verify -> close\n' + '\n' + 'Command shape:\n' + ' Plans should use agent-device commands, not raw platform tools, pseudo commands, package-manager aliases, or helper prose.\n' + ' Put subcommand first, then positionals, then flags:\n' + ' agent-device open com.example.app --session checkout --platform android --relaunch\n' + ' agent-device record start ./checkout.mp4 --session checkout\n' + ' Snapshot refs look like @E12. After snapshot -i, use the exact @en ref from that output.\n' + ' If the exact ref is not known yet, first output snapshot -i, then use a concrete example shape like press @E12 in the next command; do not write @<ref>, @ref, @Label_Name, or @en placeholders.\n' + ' Close means agent-device close. App-owned back means back; system back means back --system.\n' + ' Taps are press or click. Gestures use swipe, longpress, or gesture <pan|fling|pinch|rotate|transform>. Android pinch, rotate, and transform use provider-native touch injection when available, then the bundled multi-touch helper. iOS simulator transform uses private XCTest synthesis for a continuous two-finger pan/scale/rotation path; otherwise it reports UNSUPPORTED_OPERATION.\n' + '\n' + 'Bootstrap:\n' + ' agent-device devices --platform ios\n' + ' agent-device apps --platform android\n' + ' agent-device open MyApp --platform ios --device "iPhone 17 Pro"\n' + ' agent-device open <discovered-app-id> --session checkout --platform android\n' + ' agent-device install com.example.app ./dist/app.apk --platform android\n' + ' agent-device reinstall com.example.app ./build/MyApp.app --platform ios\n' + ' agent-device install-from-source --github-actions-artifact org/repo:app-debug --platform android\n' + ' agent-device open com.example.app --platform android --relaunch\n' + ' If app id is unknown, plan devices, apps, then open <discovered-app-id>. Discovery is not enough when the task asks to open/start the app.\n' + ' Install arguments are app/package id then artifact path. If the task says install, use install; use reinstall only when explicitly requested. Fresh runtime state is open --relaunch after install.\n' + ' Do not open artifact paths or invent package ids. If apps lookup misses the target and no URL/artifact is provided, ask or stop.\n' + '\n' + 'Snapshots and refs:\n' + ' snapshot reads visible state. snapshot -i gets current interactive refs only; it is the fast path when the next step is an interaction.\n' + ' Default snapshot text is an agent-facing, token-efficient view for planning and targeting actions; use --raw or --json only when you need the full provider tree.\n' + ' Snapshot legend:\n' + ` @E12 [button] label="Add to cart" id="add-cart" enabled hittable -> press @E12 or press 'id="add-cart"'.\n` + ' @E13 [textinput] label="Notes" preview="Leave at side..." truncated -> snapshot -s @E13 before reading.\n' + ' @E14 [cell] label="Profiles" focused -> tvOS focus is currently on this row.\n' + ' [off-screen below] 4 items: "Privacy", "About" -> scroll down, then snapshot -i; those are hints, not refs.\n' + ' Re-snapshot after navigation, submit, typing/fill, modal/list/reload/dynamic changes when you need new refs.\n' + ' Anti-pattern: snapshot -i followed by snapshot -i | grep ...\n' + ' Refs from the first snapshot remain valid until you press, fill, type, scroll, go back, wait for async UI, or otherwise change app state.\n' + ` After a mutation, prefer a known selector/label directly (for example press 'label="Send"') because interaction commands refresh interactive state internally. If you need to discover the new control, use snapshot -i, or snapshot -i -s "Composer" when a stable container
[provider-integration] test/integration/provider-scenarios/android-lifecycle.test.ts > Provider-backed integration Android Settings flow uses scripted ADB provider: src/daemon-error.ts#L5
Error: Batch failed at step 1 (press): Session "default" is bound to android device "Pixel 8" (emulator-5554) and cannot be used with --target=[object Object]. Use a different --session name or close this session first. ❯ throwDaemonError src/daemon-error.ts:5:9 ❯ execute src/client.ts:65:7 ❯ executeCommand src/client.ts:81:13 ❯ Object.run src/client.ts:289:31 ❯ runAndroidCaptureInteractionAndReplayWorkflow test/integration/provider-scenarios/android-lifecycle.test.ts:1009:17 ❯ test/integration/provider-scenarios/android-lifecycle.test.ts:24:5 ❯ withProviderScenarioResource test/integration/provider-scenarios/harness.ts:85:12 ❯ test/integration/provider-scenarios/android-lifecycle.test.ts:20:3 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { code: 'INVALID_ARGS', details: { step: 1, command: 'press', positionals: [ 'undefined', 'undefined' ], executed: +0, total: 1, partialResults: [], hint: 'Check command arguments and run --help for usage examples.', diagnosticId: 'mpo4x3x3-052ba8f4', logPath: '/Users/runner/.agent-device/logs/default/2026-05-27/2026-05-27T14-03-39-928Z-mpo4x3x3-052ba8f4.ndjson' } }
Integration Tests
Process completed with exit code 1.
[provider-integration] test/integration/provider-scenarios/android-lifecycle.test.ts > Provider-backed integration Android Settings flow uses scripted ADB provider: src/daemon-error.ts#L5
Error: Batch failed at step 1 (press): Session "default" is bound to android device "Pixel 8" (emulator-5554) and cannot be used with --target=[object Object]. Use a different --session name or close this session first. ❯ throwDaemonError src/daemon-error.ts:5:9 ❯ execute src/client.ts:65:7 ❯ executeCommand src/client.ts:81:13 ❯ Object.run src/client.ts:289:31 ❯ runAndroidCaptureInteractionAndReplayWorkflow test/integration/provider-scenarios/android-lifecycle.test.ts:1009:17 ❯ test/integration/provider-scenarios/android-lifecycle.test.ts:24:5 ❯ withProviderScenarioResource test/integration/provider-scenarios/harness.ts:85:12 ❯ test/integration/provider-scenarios/android-lifecycle.test.ts:20:3 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { code: 'INVALID_ARGS', details: { step: 1, command: 'press', positionals: [ 'undefined', 'undefined' ], executed: +0, total: 1, partialResults: [], hint: 'Check command arguments and run --help for usage examples.', diagnosticId: 'mpo4z575-74b2b046', logPath: '/Users/runner/.agent-device/logs/default/2026-05-27/2026-05-27T14-05-14-899Z-mpo4z575-74b2b046.ndjson' } }
Fallow Code Quality
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Typecheck
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Android Helper Packages
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Unit Tests
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Coverage
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
Integration Tests
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/