Authoritative App Intents best practices from Apple: execution model, entities, queries, parameters, enums, dependencies, and donations.
日本語の概要は準備中です。原文の説明を表示しています。
Verify app behavior on device or simulator via screenshots, UI hierarchy, and touch interactions.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
TRIGGER when: user asks to verify/test/check if the app works on device, after implementing a UI-affecting feature that needs device verification, user says "does it work", "test this", "check on device", user reports UI doesn't work as expected, need to debug touch/interaction issues. DO NOT TRIGGER when: user asks about unit tests only, build-only requests without device testing, code review without device testing, simulator configuration questions, changes that don't affect UI (e.g. comments, refactors, non-UI logic).
This is a SUBAGENT skill. Invoke it via the Agent tool when device verification is needed. If there is an open session for that work, provide that session identifier to a subagent for exclusive use by that subagent.
Agent tool:
- subagent_type: "general-purpose"
- description: "Verify login feature works"
- prompt: "Using the device-interaction skill, verify that the login feature works correctly on session <session-identifier>. Launch the app, capture screenshot and UI hierarchy, check that the login button is visible and tappable, and report if the implementation is working correctly."
After implementing a UI-affecting feature, invoke this skill to verify the implementation works on a device.
DeviceInteractionStartWorkspaceSession (workspace-backed; do this early, runs in the background)
→ DeviceInteractionInstallAndRun (after each code change; includes building)
→ DeviceEventSynthesize (interact + observe, repeatable)
→ DeviceInteractionEndSession (when done — keeping sessions open is resource-heavy)
There are two ways to start a session:
When opening a new device interaction session, pass a device identifier to select a device, or omit it to use the current destination. Pass an empty string to get a list of available targets.
commandLineArguments — arguments passed to the app at launch. Use $(inherited) as a token to preserve the scheme's existing arguments (e.g. ["$(inherited)", "--reset-state"] to add an extra argument at the end).environmentVariables — key/value pairs set in the app's environment at launch. Use "$(inherited)" as a key to preserve the scheme's existing environment variables (e.g. {"$(inherited)": "", "DEBUG_MODE": "1"}).Omit both parameters to leave the scheme's arguments and environment unchanged.
Prefer these parameters over editing the scheme directly. They are applied only for that one run and have no lasting effect on the user's configuration.
ALWAYS report UI issues that might be caused by code: overlapping or unreadable text, unexpectedly cropped image/text, wrong colors etc.
This tool allows performing an interaction and observing the state of a device.
The hierarchy files include calculated hitPoint positions for each element:
UIView {{100, 200}, {60, 30}}, hitPoint: {130.0, 215.0}
UIButton "Login" {{110, 205}, {30, 20}}, hitPoint: {125.0, 215.0}
UIButton "Login2" {{140, 205}, {20, 20}}, hitPoint: {150.0, 215.0}, activationBundleId: com.your.app
{100, 200} - origin position{50, 30} - width and heighthitPoint: {125.0, 215.0} - calculated hitPoint point (best for tapping)Always prefer the hitPoint coordinates for touch events. Only after tapping a hitPoint and confirming (via recapture) it had no effect may you fall back to a raw screenshot-estimated position.
Warning: Elements marked isRemoteLeafPlaceholder do not report child elements — interacting with them requires falling back to screenshot-estimated coordinates.
When windows from more than one application overlap on screen, each element line is annotated with a activationBundleId: <bundle-identifier> suffix.
If an element line carries a activationBundleId, any interaction with it requires activating that application first by passing activationBundleId parameter to the DeviceEventSynthesize tool.
Tip: you can pass activationBundleId with no interactionCommand.
Application activation is expensive so use that only if necessary.
Device orientation: Landscape Right
------------------------
Application bundle identifier: com.some.app
Application UI orientation: Landscape Left
Application, pid: 123, label: ' '
Window, {{0.0, 0.0}, {1133.0, 744.0}}, hitPoint: {566.5, 372.0}
Other, {{0.0, 0.0}, {744.0, 1133.0}}, hitPoint: {372.0, 372.0}
...
------------------------
Application bundle identifier: com.some.other.app
Application UI orientation: Landscape Left
Application, pid: 333, label: ' '
Window, {{0.0, 0.0}, {1133.0, 744.0}}, hitPoint: {566.5, 372.0}
...
The interactionCommand parameter accepts a command syntax:
| Command | Description |
|---|---|
t <x> <y> [duration] | Tap at coordinates with optional hold duration |
d <x> <y> | Double tap |
t <x1> <y1> f <x2> <y2> [duration] | Swipe from (x1,y1) to (x2,y2) |
drag <x1> <y1> <x2> <y2> [holdDuration] [moveDuration] | Drag-and-drop: press-and-hold at (x1,y1) then slowly move to (x2,y2). Use for reordering lists or drag-and-drop targets |
mt [x1 y1, ...] dur [x1 y1, ...] dur ... | Multi-touch sequence. Each [...] keyframe lists touch positions (x y). The duration after each block is the travel time to the next keyframe; for the last block it is the hold time before lifting. A finger ends when its slot is an empty comma entry (e.g. [, x y]) or when the frame has fewer entries than the finger's index — both are equivalent. A finger that reappears in a later keyframe after lifting starts a new tap. |
b h/p/u/d [duration] | Hardware button: h=Home, p=Power, u=VolUp, d=VolDown |
b c/s/a [duration] | watchOS only. c=Digital Crown press, s=side button, a=Action button (some devices only) |
sender keyboard kbd <text> | Type text; must be the last command in the chain — all content after kbd is taken verbatim (multiple spaces preserved). For special characters use \u{XXXX} Unicode escapes: \u{000A} (return/newline), \u{0009} (tab) |
w duration | Wait for a duration without any work |
orientation faceDown/faceUp/landscapeLeft/landscapeRight/portrait/portraitUpsideDown | Set device orientation (iOS only) |
c <rotations> | watchOS only. Rotate the Digital Crown; sign sets direction, 1.0 = one full revolution |
Examples:
"t 100 200" - Tap at (100, 200)"d 200 300" - Double tap at (200, 300)"t 200 600 f 200 200 0.3" - Swipe up (scroll to the content below)"t 200 200 f 200 600 0.3" - Swipe down (scroll to the content above)"drag 100 300 100 100" - Drag-and-drop from (100,300) to (100,100) with default durations"drag 100 300 100 100 0.5 1.5" - Drag-and-drop with 0.5s hold, 1.5s move"mt [100 200] 0.5 [100 200] 1.0 [300 400] 0.2" - Drag: hold at (100,200) for 0.5s, move to (300,400) over 1.0s, hold 0.2s then lift"mt [100 300, 300 300] 0.5 [175 300, 225 300] 0.5" - Two-finger pinch: both fingers start 200px apart and move toward each other"b h" - Press home button"b h b h" - Press home button twice to go to the app switcher"b h w 0 b h" - Wake and unlock a device (non-passcode devices only)"b c" - watchOS: press the Digital Crown"b s" - watchOS: press the side button"b a" - watchOS: press the Action button (some devices only)"sender keyboard kbd hello world" - Type text with spaces"sender keyboard kbd hello world" - Type text preserving multiple spaces"sender keyboard kbd submit\u{000A}" - Type text then press Return/submit"w 0.3" - Wait for 0.3s"orientation landscapeLeft" - Rotate device to landscape"c 1.0" - watchOS: rotate the Digital Crown one full turn (e.g. scroll a list)"c -0.5" - watchOS: rotate the crown half a turn the other wayBefore any interaction, always capture and read the hierarchy (and screenshot). After any interaction, capture again and verify the result. For complex components (like toggles or switches), look at nested elements (like Switch or Slider) — nearby elements might correspond to the actual control. When done, report findings to the main agent.
When verifying, distinguish between these categories:
print statements in the relevant code may help diagnose the issue.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Authoritative App Intents best practices from Apple: execution model, entities, queries, parameters, enums, dependencies, and donations.
日本語の概要は準備中です。原文の説明を表示しています。
New App Intents APIs and behaviors for iOS 27 and macOS 27: SnippetIntent, LongRunningIntent, execution modes, and interactive snippets.
日本語の概要は準備中です。原文の説明を表示しています。
Apple Human Interface Guidelines as structured design values — system colors (incl. increased-contrast variants), the full Dynamic Type ramp, Liquid Glass rules and budgets, layout and hit-target metrics, SF Symbols, and HIG-to-SwiftUI component mappings. Use when styling or reviewing any Apple-platform UI: picking a color, size, spacing, corner radius, or hit target; writing .glassEffect / material code; choosing an SF Symbol; or answering 'what does the HIG say about X'.
日本語の概要は準備中です。原文の説明を表示しています。
Run an offline ASO audit on canonical App Store metadata under `./Store` and surface keyword gaps using Astro MCP. Use after pulling metadata with `asc metadata pull`.
日本語の概要は準備中です。原文の説明を表示しています。
Track build processing, find latest builds, and clean up old builds with asc. Use when managing build retention or waiting on processing.
日本語の概要は準備中です。原文の説明を表示しています。
Guidance for using asc cli in this repo (flags, output formats, pagination, auth, and discovery). Use when asked to run or design asc commands or interact with App Store Connect via the CLI.
日本語の概要は準備中です。原文の説明を表示しています。