Community编程与开发github.com

agent-desktop

通过操作系统原生无障碍树在 macOS、Windows 和 Linux 上操作桌面应用程序,使用 agent-desktop CLI。当 AI 代理需要查看或操作桌面 GUI 时使用:点击按钮、填写表单、读取 UI 状态、导航菜单、切换复选框、滚动、拖拽、输入文本、按快捷键、截图、管理窗口、使用剪贴板、启动或关闭应用、读取通知。触发条件:"click button"、"fill form"、"open app"、"read UI"、"computer use"、"operate desktop"、"accessib"

agent-desktop 是什么?

agent-desktop 是一个 CLI 工具,让 AI 代理能够通过操作系统原生无障碍树来观察和操作桌面应用程序。它本身是一个工具而非代理,所有命令输出均为 JSON 信封格式(`ok`、`data` 或 `error`),观察、操作和验证的循环由您自己控制。支持 macOS、Windows 和 Linux 三大平台,安装仅通过 npm,首次使用时需执行 `agent-desktop version` 和 `agent-desktop status` 进行预检查。核心工作流程包括使用 `snapshot` 命令获取 UI 快照并获取元素引用(ref),然后通过 `click`、`type`、`toggle` 等动作命令操作元素,最后再次快照验证结果。引用机制确保了元素定位的准确性,并提供了 `STALE_REF`、`AMBIGUOUS_TARGET` 等错误处理和重试策略。默认采用无头(headless)模式,仅在用户明确允许时使用 `--headed` 标志进行物理输入操作。

兼容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/mengzhongjie/agent-skills/tree/HEAD/skills/agent-desktop

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

agent-desktop 是做什么的?

agent-desktop 是一个 CLI,让 AI 代理能够通过操作系统无障碍树观察和操作桌面应用程序。它是一个工具,而非代理。每条命令输出一个 JSON 信封(ok、data 或 error)。观察、操作和验证的循环由您自己控制。

Shell 语法

示例使用 POSIX shell。在 PowerShell 中,每个引用都要加引号('@s8f3k2p9:e1'),因为裸的 @token 是展开运算符。使用 $env:NAME = 'value' 代替 export,使用 | ConvertFrom-Json 代替 $(...) 和 jq。Windows 技能包含 PowerShell 形式。

预检查

在任务的第一个命令之前运行此步骤。这是唯一安装工具的地方。

  1. 运行 agent-desktop version。退出码为 0 表示 CLI 已存在:跳至步骤 4。

  2. 如果缺失,通过 npm 安装。npm 是唯一支持的路径:

    npm install -g agent-desktop

    不要尝试 Homebrew、Scoop、下载的归档或旧版本。本技能是针对 npm 解析的任何版本编写的。如果 npm 不在 PATH 上,运行 node -v 和 where npm(Windows)或 which npm(macOS、Linux)并报告找到的结果。不要猜测其他包管理器。

  3. 再次运行 agent-desktop version。如果仍然失败,停止并告知用户:安装输出的最后 20 行、agent-desktop --help 是否能运行、以及您所在的 OS。不要自行回退到截图或鼠标自动化。

  4. 运行 agent-desktop status。它会报告平台、权限和 supported_surfaces。在 macOS 上,缺少辅助功能授权会在此处显示;告诉用户运行 agent-desktop permissions --guide,而不是自行尝试授权。

  5. 运行 agent-desktop skills get platform。它会加载运行二进制文件的 OS(macOS、Windows 或 Linux)的技能,并且在与本文件冲突时以它为准。

  6. 关于标志和语法,运行 agent-desktop <command> --help。本技能从不重复标志列表,因此 --help 始终与安装版本匹配。

如果 agent-desktop skills get desktop 输出与本文件不同的规则,则二进制文件是正确的:本文件是副本,真正驱动的是二进制文件。

循环

当您知道角色或确切名称时使用 find。否则先映射应用程序,然后深入一个区域。

agent-desktop snapshot --skeleton --app "Notes" -i --compact   # 浅层映射,截断分支上的子节点数量
agent-desktop snapshot --root @s8f3k2p9:e3 -i --compact        # 深入一个区域
agent-desktop click @s8f3k2p9:e12                              # 对合格引用执行操作
agent-desktop snapshot --root @s8f3k2p9:e3 -i --compact        # 验证:重新读取同一区域
  • 小型应用程序不需要骨架。直接获取完整的 snapshot -i。
  • -i 仅保留交互节点,因此行的静态文本标签会被丢弃。要判断重复按钮属于哪一行,使用 --root 深入该行的容器并省略 -i。在 Windows 和 Linux 上,这会读取该行但不会使其按钮变得可操作:在其他行重复的按钮在窗口中是一个孪生体,其引用会被拒绝(参见“引用”)。
  • --root 深入会将引用添加到同一快照 ID。已深入子树外部的引用以及已深入根本身的引用保持有效;已存在于内部的引用会被替换,因此那里的旧引用会返回 STALE_REF。
  • 绝不对表面进行骨架化(--surface menu、sheet、alert)。表面已经聚焦。
  • 打开菜单、表单或警报的操作会将其列在 data.surfaces 中。下一步针对该覆盖层。
  • 在异步步骤之后,使用 wait(参见 references/commands-system.md)。固定的 sleep 是竞态条件。

引用

  • 输出引用是限定的:@<snapshot_id>:e<N>,例如 @s8f3k2p9:e1。按原样传递给后续命令。
  • 引用仅对一个快照有效。任何 UI 更改后,重新深入受影响的区域或获取新的快照。
  • 只有可寻址的元素才能获得引用。静态文本和惰性容器不会。
  • 命令在执行操作前会重新识别元素。在 macOS 上,引用携带元素自身的地址,因此相同的孪生体各自保留其引用。在 Windows 和 Linux 上,只有当引用被快照捕获时,其角色、原生 ID、名称和描述在窗口中唯一,并且在快照深度截断或骨架下计数后,仍然恰好有一个活跃元素匹配时,引用才会被解析。那里的相同孪生体没有引用路径:只有 --headed mouse-click --xy X,Y 可以选择一个,它会获取前景,而 Linux Wayland 会话会拒绝它。
  • STALE_REF:元素已消失或不再匹配。details.kind 是 saved_ref_absent,在 macOS 上是 retained_object_stale。获取新的快照并使用新引用。
  • AMBIGUOUS_TARGET:出现了相同的元素(saved_ref_ambiguous),或者引用在捕获时未被证明唯一(identity_not_unique)。重复引用或重新快照相同的孪生体会得到同样的拒绝;对窗口中唯一的控件进行操作。identity_not_unique 也发生在快照未能在时间内读取整个窗口时:使用更大的 --timeout-ms 重新获取。
  • TIMEOUT 且 details.kind: resolution_identity_unknown:实时读取未响应,因此身份未证明。未发送任何内容;重试。
  • SNAPSHOT_NOT_FOUND:快照 ID 已过期。重新快照。

交付与重试

操作结果携带 data.disposition,错误携带 error.disposition,每个都有 delivery 和 retry。观察命令(如 snapshot)成功时没有处置;它们的错误以及每个 INVALID_ARGS 拒绝携带 not_delivered 和 retry: safe。

  • 仅当 disposition.retry 为 safe 时重试或替换操作。只有 not_delivered 是安全的。
  • 任何其他交付值意味着操作可能已生效。重复操作可能会点击、输入或提交两次,而 toggle 可能撤销自身。
  • 对于不安全的结果,读取实时状态(get、is 或新的快照)并据此判断。details.post_state 在可用时很有帮助。
  • 根据 error.code 和 error.disposition 进行分支。消息和建议文本可能更改。
  • details.retryable: false 意味着等待无法改变结果。尝试不同的方法。

无头模式与有头模式

默认情况下,引用操作是无头的。它们使用语义化的辅助功能调用,不会获取焦点、移动光标、合成按键或使用剪贴板。如果不存在语义路径,操作会以失败告终。仅在用户明确允许物理输入(如双击、悬停、拖拽或聚焦)时使用全局 --headed 标志。绝不要切换到有头模式来从无头失败中恢复。原始坐标(--xy)绝不意味着获取焦点。哪些操作需要 --headed 因 OS 而异:请阅读平台技能。

参考

仅在需要时加载一个:agent-desktop skills get desktop <reference>。

参考何时打开
commands-observation您需要 snapshot、find、get、is、screenshot、list-surfaces 的语义、部分树或 --root 规则时
commands-interaction您在 click、type、set-value、select、toggle、scroll、press 和 mouse 命令之间选择,或调试操作错误时
commands-system您启动或关闭应用程序、管理窗口、使用剪贴板、wait、batch、会话、多代理光标、追踪或加载技能时
workflows您想要已整理的模式(表单、菜单、对话框、等待新窗口、滚动查找、拖拽)和反模式列表时

相关技能