mcpField
D
device-interaction

device-interaction

github.com/superagents-labテスト・品質353748 回インストール20 週間前に更新
リポジトリ

device-interaction について

device-interactionは、特にUI操作を中心に、デバイス上でアプリの動作を確認するサブエージェントスキルです。アプリの起動、観察、操作、結果報告の手順を示します。

主な機能

  1. 01デバイスセッションの手順
  2. 02検証用のアプリインストールと起動
  3. 03スクリーンショットとUI階層の取得
  4. 04タップ・スワイプ・文字入力の実行
  5. 05機能面と表示面の問題を報告

活用シーン

  1. 01新しいUI機能をデバイスで検証
  2. 02反応しないコントロールを調査
  3. 03デバイス上のレイアウトと画面遷移を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/superagents-lab/xcode27-skills --skill device-interaction

インストール後、Claude Code で/device-interactionを入力して読み込まれたか確認します。

詳細

デバイス操作

次の場合に起動します:デバイス上でアプリが動作するか確認・テスト・検証するようユーザーから依頼された場合、デバイスでの検証が必要な UI に影響する機能を実装した後、ユーザーが「動作しますか」「これをテストして」「デバイスで確認して」と言った場合、UI が想定どおりに動作しないとユーザーから報告された場合、タッチや操作の問題をデバッグする必要がある場合。 次の場合は起動しません:ユーザーがユニットテストのみを依頼した場合、デバイスでのテストを伴わないビルドのみの依頼、デバイスでのテストを伴わないコードレビュー、シミュレーターの設定に関する質問、UI に影響しない変更(コメント、リファクタリング、UI 以外のロジックなど)。


メインエージェント向け

これはサブエージェントのスキルです。 デバイスでの検証が必要な場合は、Agent ツールから呼び出してください。

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 <device-interaction-session>. 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."

UI に影響する機能を実装した後は、このスキルを呼び出して、デバイス上で実装が動作することを検証してください。

セッションのライフサイクル

DeviceInteractionStartSession (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)

DeviceInteractionStartSession ツール

デバイスの検出

新しいデバイス操作セッションを開始するときは、デバイス識別子を渡してデバイスを選択するか、省略して現在の接続先を使用します。一致しない値を渡すと、利用可能なターゲットの一覧が表示されます。

DeviceInteractionInstallAndRun ツール

オプションのパラメーター
  • commandLineArguments — アプリの起動時に渡される引数です。スキームに既存の引数を引き継ぐには、トークンとして $(inherited) を使用します(例:["$(inherited)", "--reset-state"] を指定すると、末尾に引数が追加されます)。
  • environmentVariables — アプリの起動時に環境に設定されるキーと値のペアです。スキームの既存の環境変数を引き継ぐには、キーとして "$(inherited)" を使用します(例:{"$(inherited)": "", "DEBUG_MODE": "1"})。

スキームの引数と環境を変更しない場合は、どちらのパラメーターも省略してください。

スキームを直接編集するより、これらのパラメーターを優先してください。 これらはその実行時にのみ適用され、ユーザーの設定には影響しません。


サブエージェント向け

コードが原因である可能性のある UI の問題(テキストの重なりや判読不能、画像やテキストの予期しない切り抜き、色の誤りなど)は、必ず報告してください。

DeviceEventSynthesize ツール

このツールを使うと、操作を実行してデバイスの状態を確認できます。

階層ファイルの読み取り

階層ファイルには、各要素の計算済み中心位置が含まれています。

UIView {{100, 200}, {50, 30}}, center: {125.0, 215.0}
  UIButton "Login" {{110, 205}, {30, 20}}, center: {125.0, 215.0}
  • {100, 200} - 原点位置
  • {50, 30} - 幅と高さ
  • center: {125.0, 215.0} - 計算済み中心点(タップに最適)

タッチイベントでは、必ず中心座標を優先してください。

操作コマンドの構文

interactionCommand パラメーターでは、次のコマンド構文を使用できます。

コマンド説明
t <x> <y> [duration]指定した座標をタップします。保持時間は省略可能です
d <x> <y>ダブルタップします
t <x1> <y1> f <x2> <y2> [duration](x1,y1) から (x2,y2) までスワイプします
b h/p/u/d [duration]ハードウェアボタン:h=ホーム、p=電源、u=音量アップ、d=音量ダウン
sender keyboard kbd <text>テキストを入力します。コマンドチェーンの最後に指定する必要があります — kbd 以降の内容はすべてそのまま扱われます(複数のスペースも保持されます)。特殊文字には \u{XXXX} の Unicode エスケープを使用します:\u{000A}(リターン/改行)、\u{0009}(タブ)
w duration何も操作せず、指定した時間待機します
orientation faceDown/faceUp/landscapeLeft/landscapeRight/portrait/portraitUpsideDownデバイスの向きを設定します

例:

  • "t 100 200" - (100, 200) をタップします
  • "d 200 300" - (200, 300) をダブルタップします
  • "t 200 600 f 200 200 0.3" - 上にスワイプします(下にあるコンテンツまでスクロールします)
  • "t 200 200 f 200 600 0.3" - 下にスワイプします(上にあるコンテンツまでスクロールします)
  • "b h" - ホームボタンを押します
  • "b h b h" - ホームボタンを2回押して、アプリスイッチャーを表示します
  • "b h w 0 b h" - デバイスをスリープ解除してロックを解除します(パスコード未設定のデバイスのみ)
  • "sender keyboard kbd hello world" - スペースを含むテキストを入力します
  • "sender keyboard kbd hello world" - 複数のスペースを保持してテキストを入力します
  • "sender keyboard kbd submit\u{000A}" - テキストを入力してから、リターン/送信キーを押します
  • "w 0.3" - 0.3 秒待機します
  • "orientation landscapeLeft" - デバイスを横向きに回転させます

標準的なサブエージェントのワークフロー

操作を行う前に、必ず階層構造(およびスクリーンショット)をキャプチャして確認してください。操作後は再度キャプチャし、結果を検証してください。トグルやスイッチなどの複雑なコンポーネントでは、Switch や Slider などのネストされた要素を確認してください。近くにある要素が実際のコントロールに対応している場合があります。完了したら、調査結果をメインエージェントに報告してください。

  • 操作せずにキャプチャするには、空のinteractionCommandを指定してDeviceEventSynthesizeを使用します。
  • スクリーンショットだけを見て位置を推測しないでください。必ず階層構造の中心座標を使用してください。
  • 確信が持てない場合やサムネイルの解像度が不十分な場合は、フルサイズのスクリーンショットを分析してください。

タイミングと再試行

  • アプリの起動:セッション開始後、アプリの読み込みに数秒かかる場合があります。操作する前に階層構造をキャプチャし、意味のあるUI要素があることを確認してください。階層構造がほぼ空の場合や起動画面が表示されている場合は、先に進む前にもう一度キャプチャしてください。
  • 操作後:タップやスワイプをしても期待した変化が起きない場合は、階層構造を再キャプチャして操作を一度だけ再試行してください(アニメーション中に要素の位置が変わった可能性があります)。一度再試行しても失敗する場合は、無期限に再試行せず、失敗を報告してください。
  • 読み込み中の状態:階層構造にスピナーや読み込みインジケーターが表示されている場合は、少し待ってから再度キャプチャしてください。読み込み中の要素は操作しないでください。

成功と失敗の判断

検証時は、次のカテゴリを区別してください。

  • 機能上のバグ(必ず報告):要素をタップしても反応しない、誤った画面に移動する、クラッシュする、データが表示されない、期待されるUI要素がない。
  • 表示・レイアウト上のバグ(必ず報告):テキストの重なり、ラベルの途切れ、画面外に表示される要素、誤った色、配置の崩れ。
  • 一時的な状態(バグとして報告しない):読み込みスピナー、短いアニメーション、キーボードの表示・非表示。切り替えが完了してから再度キャプチャしてください。
  • 予期しない終了(必ず報告):クラッシュ、アプリケーションの終了。プロセスIDを追跡し、プロセスの標準出力をキャプチャして特定してください。
  • 想定される動作(バグとして報告しない):プレースホルダーテキストが表示された空の状態、フォームが未入力のときに無効になるボタン、権限ダイアログ。

エラー処理

  • アプリケーションが表示されていない場合は、デバイスの動作が遅い可能性があるため、一度だけ再試行してください。
  • タップ対象が不明確な場合は、階層データを読み直して正しい中心座標を確認してください。
  • トラブルシューティングのためにランタイムログを確認できます。タイミングのバグが疑われる場合は、該当コードに一時的にprint文を追加すると問題の診断に役立つ可能性があることをメインエージェントに提案してください。
  • 問題の詳細と提案を添えて、メインエージェントに報告してください。

コメント