agent-desktop-linux について
agent-desktop-linuxは、Linuxのグラフィカルデスクトップを扱うエージェント向けUI自動化スキルです。アクセシビリティインターフェースでアプリを確認・操作し、X11、Wayland、GNOMEごとの違いも説明します。
主な機能
- 01AT-SPIによる画面の確認
- 02参照を使ったコントロール操作
- 03アプリ起動とウィンドウ管理
- 04画面キャプチャとクリップボード管理
- 05UI変化の待機と通知の処理
活用シーン
- 01アプリのウィンドウや画面内容の確認
- 02コントロールの操作やテキスト入力
- 03アプリウィンドウの表示・終了待ち
- 04GNOME通知の確認
MCP 対応
READMEではMCPとの関係について説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vercel-labs/ agent-desktop --skill agent-desktop-linuxインストール後、Claude Code で/agent-desktop-linuxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/bus-and-permissions.mdcapture-and-clipboard.mddisplay-servers-and-input.mdshell-tray-and-notifications.mdtroubleshooting.mdwindows-and-lifecycle.md詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
agent-desktop-linux
観察と操作のループ、参照、JSON エンベロープ、セッション、トレースは、どのプラットフォームでも同じです。このファイルでは、Linux 固有の差分のみを説明します。
Ubuntu 24.04 以降(x86_64 または aarch64)、サインイン中のユーザーのグラフィカルセッション、実行中の AT-SPI バスが必要です。その他のディストリビューションでは、at-spi2-core ブリッジの修正 dc0dc33 が必要です。Ubuntu 22.04 のブリッジは Action.GetActions で異常終了します。アーカイブローダーの最低要件は glibc 2.35 です。CLI は対象アプリのデスクトップセッション内で実行してください。セッションバス、ディスプレイ、ランタイムディレクトリは、その環境から取得されます。TTY でのログイン、セッション変数のない SSH シェル、バスのないコンテナ、または別ユーザーのセッションでは、アプリは検出されません。動作確認済みのデスクトップ環境は GNOME です。X11 セッションと Wayland セッションの両方が動作しますが、入力、キャプチャ、ウィンドウ制御の動作は異なります。観察とセマンティックアクションにはヘルパーツールは不要です。
機能一覧
| グループ | コマンド | Linux でのステータス |
|---|---|---|
| 観察 | snapshot, find, get, is | AT-SPI を通じて X11 と Wayland で動作します。window、sheet、alert、menu に対応し、GNOME ではシェルのサーフェスも追加されます。仮想トレイの getter には制限があります。シェルのリファレンスを参照し、status を確認してください |
| サーフェス | list-surfaces | アプリのウィンドウ、シート、開いているメニューを一覧表示します。シェルの読み取りには snapshot --surface を使用します |
| ref 操作 | click, right-click, type, set-value, clear, select, toggle, check, uncheck, expand, collapse, scroll-to | 読み取り可能なライブ ID と、必要な AT-SPI 機能が必要です。メニューの ref 解決に関する制限はシェルのリファレンスを参照してください。X11 の headed フォールバックには使用可能なジオメトリも必要で、ID チェックを回避することはできません |
| ホイールスクロール | scroll, mouse-wheel | 物理ホイール入力です。X11 と --headed のみ |
| ポインタージェスチャー | double-click, triple-click, hover, drag | --headed、X11 のみです。Wayland ではポインターの位置を指定できないため、ACTION_NOT_SUPPORTED で拒否されます |
| フォーカス | focus | フォーカス権限には --headed が必要です。まだ focused ではないフォーカス可能なノードに対して AT-SPI の Component.GrabFocus を呼び出します。ポインターは使用せず、状態を検証します。GTK4 アプリではこの呼び出しが拒否されるため、そこで focus は ACTION_FAILED grab_focus_rejected で終了します。そのウィンドウにフォーカスするには focus-window を使用します |
| キーボードとマウス | press, mouse-click, mouse-move, mouse-wheel | press とテキストキーは X11 および機能検出された Mutter Wayland セッションで動作します。ポインターコマンドは X11 と --headed のみです。references/display-servers-and-input.md を参照してください |
| 入力の長押し | key-down, key-up, mouse-down, mouse-up | すべてのプラットフォームでフェイルクローズします。Linux では、key-down と key-up は ACTION_NOT_SUPPORTED、mouse-down と mouse-up はヘッドレス時に POLICY_DENIED、--headed 使用時に ACTION_NOT_SUPPORTED となります |
| アプリとウィンドウ | launch, close-app, list-windows, list-apps, focus-window, move-window, resize-window, minimize, maximize, restore | 起動と一覧表示は X11 と Wayland で動作します。focus-window には X11 が必要です。その他のウィンドウ制御と正常終了には X11 クライアントが必要です。references/windows-and-lifecycle.md を参照してください |
| ディスプレイ | list-displays | 動作します |
| キャプチャ | screenshot | X11:ウィンドウは権限なしでキャプチャできます。ディスプレイは非コンポジティングマネージャーの場合にのみキャプチャできます。Wayland:ポータルの同意が必要で、ディスプレイの切り抜きが適用されます。セレクターを指定しない場合はプライマリディスプレイが選択されます。references/capture-and-clipboard.md を参照してください |
| クリップボード | clipboard-get, clipboard-set, clipboard-clear | 動作します。テキスト、画像、ファイルリストに対応します。Wayland では wl-clipboard が必要です |
| 待機 | wait | ms、--element、--window、--text、--menu、--menu-closed、--event に対応します。メニューの待機にはメニューサーフェス検出機能が使用されます。--notification は GNOME で新しい通知を待ちます |
| 通知 | list-notifications, dismiss-notification, dismiss-all-notifications, notification-action | GNOME Shell のみです。一覧表示はヘッドレスで可能です。変更操作には X11 で --headed が必要です。また、dismiss-notification と notification-action には --expected-app または --expected-title も必要です。フィールドはシェルのウィジェットレイアウトから読み取られ、GNOME Shell 46.0 でのみ検証されています。各変更操作は、その効果によって実証されます。Wayland では入力前にシェルポインターが拒否されます。通知の所有者がシェルまたはシェル自身のヘルパーでない場合は、PLATFORM_NOT_SUPPORTED が返されます。シェルのリファレンスを参照してください |
| シェルサーフェス | open-system-surface | system-tray と action-center のみ動作する可能性があります。system-tray には StatusNotifierWatcher が必要です(存在しない場合は watcher: absent で拒否されます)。action-center には実証済みのロールの祖先関係が必要です。quick-settings は shell_container_unproven で拒否され、taskbar は常に拒否されます。start-menu と system-tray-overflow はサポートされていませんが、--help には表示されます。シェルのリファレンスを参照してください |
| カーソルオーバーレイ | cursor-overlay | アクティブなセッションが必要です。下記の「カーソルオーバーレイ」を参照してください。X11 では有効化時に data.rendered: true が返されます。Wayland では設定が保存され、data.rendered: false が返されます |
| システム | status, permissions, version, batch, skills, session, trace | 動作します |
First Contact
- 最初に
agent-desktop statusを実行してください。supported_surfacesが空の場合、アクセシビリティバスから応答がなかったのであり、デスクトップが空という意味ではありません。references/bus-and-permissions.mdを読み、自分で起動していないバスを再起動しないでください。 --appには、list-appsが出力する名前(gnome-calculator、nautilus)、または実行ファイルと引数の識別情報が検証済みのデスクトップエントリー名か ID を指定します。ウィンドウタイトルや任意のレジストリラベルは指定できません。Filesなどのデスクトップエントリー名は、そのエントリーが存在すれば使用できます。list-windows --appは完全一致で検索します(エイリアスを含む)。list-apps --appは、大文字と小文字を区別せず、一覧に表示された名前の部分一致とアダプターのエイリアスの完全一致を組み合わせて検索します。- ウィンドウ ID は不透明なアドレスで、34~70 文字です。ウィンドウのプロセスが存続している間だけ有効です。再起動後は
list-windowsを再実行してください。list-appsの各行には、bundle_id(判明している場合はデスクトップ ID)とprocess_instanceが含まれます。 - GTK4 アプリは深くネストします。
--max-depthと--skeletonはセマンティックな階層を数えるため、空のレイアウト用ラッパーも出力上の階層に加わります。-i --compactを指定しても、名前のないネストされたgroupノードは表示されます。読み飛ばさないでください。 - ファイルビューが空でも、フォルダーが空とは限りません。 アイコンビューにファイル項目が表示されない場合は、利用可能なリストビューまたは詳細ビューを試し、新しいスナップショットを取得して、アプリケーションがどの項目を表示するか確認してください。
- ウィンドウが表示されても、コンテンツはまだ表示されていないことがあります。 まず
wait --window "Text Editor" --app gnome-text-editorを実行し、続いてノード自身の名前、値、または説明に一致するwait --textを実行してください。ウェブエンジンを使用するアプリ(AT-SPI ツールキットメタデータから判定されます)では、ウィンドウの観察は、完全な読み取り結果が 3 回連続で一致し、ウェブドキュメントのロールまたは要求された深度制限が確認されるまで待機します。まだドキュメントがないシェルは、予算の上限に達しても未完了のままです。最初の読み取りより短い--timeoutを指定すると、部分的なツリーではなくTIMEOUTが返されます。 - ジオメトリのみを使う参照には、ジオメトリが変わっていないことが必要です。 参照に記録された座標系で、位置とサイズの両方が一致している必要があります。1 ピクセルでも変化すると識別できなくなります。レイアウトの変更後やウィンドウの移動後は、古い参照を再試行せず、新しいスナップショットを取得してください。区別できない兄弟ノードは
AMBIGUOUS_TARGETのままです。たとえば、3 つのタブがある Text Editor ウィンドウでは、テキストビューの矩形と状態が同じため、どのビューへの参照も、余分なタブを閉じるまではcandidate_countが 3 のAMBIGUOUS_TARGETを返します。参照は取得元のウィンドウに属するため、同じタイトルのウィンドウが 2 つあっても、それぞれの参照は対応するウィンドウで解決されます。 - Chromium アプリと Qt アプリがバスに表示されるには、起動フラグまたは変数が必要です。 Electron アプリでは不要ですが、
chrome-sandboxに setuid が設定されていない場合は--no-sandboxが必要です。references/troubleshooting.mdを参照してください。 - ヘッド付きの参照操作には、フォーカスを受け取れるウィンドウが必要です。 ウィンドウマネージャーが一度もアクティブ化していないウィンドウは
activation_not_grantedになります。references/windows-and-lifecycle.mdを参照してください。 - GTK4 のシークレットフィールドにはテキストが表示されることがあります。 非表示になるのはパスワードロールだけです。文字が隠されている GTK4 の入力欄も、すべての観察コマンドで読み取り可能なものとして扱ってください。
- ブロックされたキーの組み合わせは、
--forceがないと拒否されます。references/display-servers-and-input.mdを参照してください。 - メニューロールのポップアップを開いた後は、
data.surfacesを確認してください。menuエントリーがあれば、snapshot --surface menu --app <name> -iで開けます。エントリーがない場合は、開く操作が失敗したと判断する前にwait --menuとlist-surfacesを使用してください。リストベースのドロップダウンはウィンドウの一部であり、メニューサーフェスではありません。シェルのリファレンスを参照してください。 - シェルへのポインター入力には、受信先の証明が必要です。 X11 では、ヘッド付きシェルのクリックはシェル自身のツリーで証明されます。受信先が対象と一致し、位置が変わらない場合に限り、ポインターイベントが発生する前にクリックが拒否されることはありません。Wayland ではシェルのクリックは拒否されます。通知には GNOME 通知サービスが必要です。トレイのスナップショットには StatusNotifierWatcher も必要です。
- 状態ルートはプライベートでなければなりません。 グループ書き込み可能または全ユーザーがアクセス可能な
AGENT_DESKTOP_HOMEまたは~/.agent-desktopがあると、snapshotはINTERNALで失敗します。対象にchmod 700を実行するか、ツールに作成させてください。
ウィンドウを待つ
アプリのウィンドウが表示されるまで待機します(--window にはタイトルまたはタイトルの一部が必要です):
agent-desktop wait --window "Text Editor" --app gnome-text-editor --timeout 10000
自分でウィンドウを閉じるのを待つには、閉じる前にベースラインが取得されるよう、バッチ処理してください(Calculator には未保存のドキュメントを保存するか確認するダイアログがないため、処理が中断されません):
agent-desktop batch '[{"command":"close-app","args":{"app":"gnome-calculator"}},{"command":"wait","args":{"event":"window-closed","app":"gnome-calculator","timeout":10000}}]' --stop-on-error
誰かがウィンドウを閉じるのを監視するには、相手がウィンドウを閉じる前に
agent-desktop wait --event window-closed --app gnome-text-editor --timeout 10000
を実行します。--window-closed フラグはありません。
カーソルオーバーレイ
セッションを開始し、返された ID をすべてのオーバーレイコマンドに渡します:
session_id=$(agent-desktop session start --name docs-example | jq -r '.data.session_id')
agent-desktop cursor-overlay enable --session "$session_id"
agent-desktop cursor-overlay disable --session "$session_id"
agent-desktop session end "$session_id"
セッションがない場合、cursor-overlay enable と disable は INVALID_ARGS を返します。
X11 では enable が data.rendered: true を返します。Wayland では設定を保存し、オーバーレイを描画せずに data.rendered: false を返します。
session start --cursor --multi-agent は data.rendered: false を返します。これは、エージェントが動作するまで何も描画されないためです。X11 では各エージェント ID にそれぞれ独自のカーソルが割り当てられますが、Wayland では何も描画されません。
Linux で異なる点
- Firefox/Gecko の
selectは、changeまたはinputイベントを発生させずに選択値を変更することがあるため、依存するページハンドラーが実行されません。値の読み戻しが一致していても、結果はdelivered_unverifiedのままです。続行する前に、依存するアプリケーションの動作を確認してください。値の読み戻しだけでは、確定の証明になりません。 - 同じ GTK4 ボタンに対する 2 回の
click呼び出しが約 250 ms 未満の間隔で行われると、1 回しか動作しません。どちらもdelivered_unverifiedを伴うok: trueを返します。1 つのボタンを複数回クリックするには、クリックの間に効果が現れるのを待ってください。結果を表示する要素に対してwait --element <ref> --predicate value --value <expected>を使うか、wait 300を使います。 - Ref アクションは、ポインターを動かしたりアクティブなウィンドウを変更したりしない、セマンティックな AT-SPI 呼び出しです。
--headedの場合、ref のclick、right-click、typeはまず物理入力を試し、not_deliveredの拒否があった場合にのみセマンティックアクションにフォールバックします(Windows では逆です)。Wayland では、headed のポインターコマンドと headed のselectは、wayland_sessionが原因のACTION_NOT_SUPPORTEDですぐに拒否されます。headed のtypeには Mutter RemoteDesktop の機能が必要です。すべてのルールについてはreferences/display-servers-and-input.mdを参照してください。 selectはまずセマンティックな方法を試し、次にポインターを使う方法を試します。ポインターを使う方法には、X11 で明示的な--headedリクエストが必要です。Qt コンボボックスのセマンティックな選択ではポップアップの行がハイライトされるだけなので、ヘッドレスでの選択は、そのハイライトを変更する前にPOLICY_DENIED、種別pointer_requiredで拒否されます。headed の場合、ツールキットのインデックスを行に対応付けられないリスト(GTK4 リスト)では、行をクリックしてselected状態を確認します。セマンティックなオープナーがないコンボボックス(libadwaita のコンボ行)では、コンボボックスをクリックして開き、ポップアップ自身のリストから選択肢を選び、コンボボックスに表示される値を確認します。ヘッドレスの場合、リストはselection_index_unprovenで拒否され、セマンティックなオープナーがないコンボボックスは、すでに選択肢が表示されている場合を除き、POLICY_DENIED、種別pointer_requiredで拒否されます。独自のトグルで開く GTK4 ドロップダウンでは、--headedを指定せずにselectを実行でき、表示される値が確認されます。- Ref には、安全なセマンティック変更方法がない場合があります。その場合、ヘッドレスのリクエストは
hiddenやdisabledの状態を推測したり、物理入力に切り替えたりせず、未サポートアクションのエラーを返します。GTK4 のエントリーとパスワードのActivateアクションはその一例です。フィールドを編集するにはtypeを使うか、ポインターでクリックする意図がある場合は明示的に--headedをリクエストしてください。 - ネイティブ Wayland の Qt コンボボックスを開くと、そのアクションを呼び出す前に
ACTION_NOT_SUPPORTED、種別native_popup_requires_inputが返されます。Qt でこのポップアップを表示するには、ユーザー入力シリアルが必要です。すでに開いているコンボボックスは閉じることができます。Xwayland を使用していることが確認された Qt ウィンドウでは、セマンティックなオープナーが引き続き利用できます。 - ヘッドレスの
typeはEditableTextを介して書き込みます。ターミナルのテキストノードはTerminalという名前のtextfieldで、唯一のアクションはRightClickです。これに対するヘッドレスのtypeは、チェックsupported_actionとともにPOLICY_DENIEDとなり、値は null です。キー入力を受け付けるのは--headedの場合のみです。 - キーコンボでは、
cmdとmetaは Super キーを表します。キー名は、macOS と Windows のキー名に X keysym 名を加えたものです。pressで指定できるのはマッピング済みのキーのみです。レイアウトで入力できない文字はtypeで扱います。 - ウィンドウ操作は X11 クライアントに対して動作します。
focus-windowと headed のスコープ付きpressには X11 セッションが必要です。ヘッドレスのスコープ付きpressには、どちらのディスプレイサーバーでも対象が実際にフォーカスされている必要があります。別のワークスペースにあるウィンドウにフォーカスすると、ユーザーの現在のデスクトップが切り替わることがあります。 - Linux の境界情報または境界ハッシュを持つ正確な FFI ref には、ref が名前または識別子も持っている場合でも、ウィンドウ相対のジオメトリーが必要です。ジオメトリーを含まない ID ref はサポートされています。
参考資料
references/bus-and-permissions.md:バスのブートストラップ、バスの3つの状態、statusとpermissionsの出力、状態ルートのルール。references/display-servers-and-input.md:X11 と Wayland の比較表、press、type、ポインター、ホイール、ドラッグ、ブロックされるキーの組み合わせ、キー名。references/windows-and-lifecycle.md:launch、close-app、ウィンドウ操作、フォーカス、ワークスペース、停止中のアプリ、バックグラウンドでのpress。references/capture-and-clipboard.md:X11 と Wayland でのscreenshot、Wayland の同意ダイアログ、クリップボードの所有者とヘルパー。references/shell-tray-and-notifications.md:メニューと GTK4 のポップオーバー、GNOME の概要/トップバー、シェルの読み取りと入力、通知の識別情報ガード、SNI と AppIndicator の要件と拒否事項、サンドボックスのガイダンス。references/troubleshooting.md:症状と原因の対応表、Chromium、Electron、Qt のフラグ、ツールキットの制限、platform_detailを含むエラーコード。
バイナリから任意のファイルを読み取れます:
agent-desktop skills get agent-desktop-linux references/troubleshooting.md