Skip to main content

computer-use

通过 cua-driver 控制本机 macOS 桌面:截图、鼠标点击/拖拽、键盘输入、滚动、打开 URL/应用等。cua-driver 未安装时自动帮用户装好。

Aller à l'installation

Informations de source

Dépôt
llm011/ethan-agent
Dernière activité de la source
2 août 2026 à 17:36
Langue détectée de SKILL.md
chinois
Étoiles
8
Forks
0

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
computer-use
trigger
截图|操作电脑|控制桌面|鼠标点击|键盘输入|打开应用|打开软件|GUI|桌面自动化|computer use|take screenshot|click|type on screen|open app|desktop|scroll screen|drag
description
通过 cua-driver 控制本机 macOS 桌面:截图、鼠标点击/拖拽、键盘输入、滚动、打开 URL/应用等。cua-driver 未安装时自动帮用户装好。
channels
["web","repl","lark"]
fast_path
false
# computer-use 技能 用 `computer_use` 工具控制本机 macOS 桌面。 ## 第一步:确认环境就绪 **Docker 容器环境(存在 /.dockerenv)跳过此步**——cua-driver 运行在宿主机上, 通过 cua-bridge 桥接访问,容器内没有也不需要 cua-driver 命令。直接调用 `computer_use` 即可。 **宿主机原生环境**,先检查 cua-driver 是否在运行: ```bash cua-driver status ``` - **正常输出**(含 running/active)→ 直接跳到操作部分 - **command not found** 或错误 → 执行以下安装命令(需要用户同意),完成后再继续: ```bash curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.sh | bash && cua-driver install ``` 安装完毕后验证:`cua-driver status` ## ⚠️ 关键限制:Electron 应用必须前台化 **这是最重要的规则,违反它会导致操作静默失败(返回 ok=True 但实际没生效)。** ### 根因 macOS 的 `CGEventPostToPid`(cua-driver 带 pid 的键盘事件投递机制)对 **Electron 后台窗口**无效: - 事件被 Electron 的多进程架构静默丢弃 - `hotkey`/`press_key`/`type` 都返回 `ok=True`,但界面没有任何变化 - 这是 macOS + Chromium 的固有限制,不是工具 bug ### 哪些是 Electron 应用 VS Code、TRAE、TRAE Work、Slack、Discord、飞书/Lark(部分)、Cursor、Obsidian、Notion 等。 **判断方法**:应用进程名含 "Helper" 或 `app_name` 在下列列表中,按 Electron 处理。 ### 正确做法(必读) 操作 Electron 应用时,**必须先 `activate_app` 前台化,再操作,最后切回原窗口**: ``` 1. activate_app(target="TRAE Work CN") # 前台化(必须) 2. sleep 1~1.5s # 等待窗口真正前台化 3. click(x, y) # 点击输入框定位光标 4. paste_text(text="...") # 粘贴(自动备份+恢复剪贴板) 5. press_key(key="return") # 发送 ``` **不要尝试用 `set_focus(pid)` + 后台 `hotkey` 的组合**——对 Electron 应用无效。 `set_focus` 只设置 CGEvent 投递目标 pid,不改变视觉前台,对 Electron 后台窗口的键盘事件无效。 ### 原生应用 vs Electron 应用对照 | 应用类型 | 示例 | 后台操作 | 前台化 | |---------|------|---------|--------| | 原生 | TextEdit, Notes, Safari | ✅ `set_focus` + `type` 可后台 | 不需要 | | Electron | TRAE, VS Code, Slack | ❌ 后台键盘事件被丢弃 | ✅ 必须 `activate_app` | ## 使用原则 1. **先截图,再行动**:每次操作前先调 `screenshot` 看当前屏幕,找准坐标 2. **操作后再截图验证**:点击/输入后截一张确认效果 3. **坐标以像素为单位**,原点左上角。先用 `get_screen_size` 了解屏幕尺寸 4. **Electron 应用必须前台化**:见上方"关键限制"章节 5. **输入文字优先用 paste_text**:`type` 用 CGEventPostToPid 对 Electron 无效;`paste_text`(pbcopy + cmd+v)更可靠 ## 操作速查 ### 基础操作 | 操作 | action | 必填参数 | 备注 | |------|--------|----------|------| | 截图 | `screenshot` | — | 操作前后都截一张 | | 获取屏幕尺寸 | `get_screen_size` | — | — | | 左键点击 | `click` | x, y | 可带 pid 定位后台窗口 | | 双击 | `double_click` | x, y | — | | 右键点击 | `right_click` | x, y | — | | 移动光标 | `move` | x, y | — | | 拖拽 | `drag` | x, y, end_x, end_y | — | | 滚动 | `scroll` | x, y, direction, clicks | direction: up/down | | 翻页 | `page` | direction | direction: up/down | | 缩放截图 | `zoom` | x, y, end_x, end_y | 截取区域并放大 | ### 键盘输入 | 操作 | action | 必填参数 | 备注 | |------|--------|----------|------| | 输入文字 | `type` | text | **原生应用用这个** | | 粘贴文字 | `paste_text` | text | **Electron 应用用这个**(pbcopy+cmd+v,自动备份并恢复原剪贴板,不污染) | | 按键 | `press` | key | 如 "return", "escape", "delete" | | 组合键 | `hotkey` | keys | 如 ["cmd", "c"] | **注意**:cua-driver 的按键方法名是 `press_key`(不是 `press`)。工具内部已做映射,调 `computer_use(action="press")` 即可。 ### 窗口管理 | 操作 | action | 必填参数 | 备注 | |------|--------|----------|------| | 列出窗口 | `list_windows` | — | 可用 title_filter 过滤 | | 列出应用 | `list_apps` | — | 可用 title_filter 过滤 | | 设置焦点 | `set_focus` | pid | 设置 CGEvent 投递目标(仅原生应用有效,Electron 必须用 activate_app) | | 激活应用 | `activate_app` | target | **osascript activate(macOS 专用),Electron 应用前台化必用** | | 隐藏应用 | `hide_app` | — | cmd+h | | 最小化窗口 | `minimize_window` | — | cmd+m | | 启动应用 | `launch` | target | — | | 打开 URL | `open` | target | 启动 Safari + 输入 URL | | 杀掉应用 | `kill_app` | pid | — | **注意**:macOS 下 cua-driver 的 `bring_to_front` 不可用,前台化窗口必须用 `activate_app`(走 osascript `tell application "X" to activate`)。 ### AX 辅助 | 操作 | action | 必填参数 | 备注 | |------|--------|----------|------| | 获取 AX 树 | `get_accessibility_tree` | — | Electron 应用通常只暴露菜单栏,内容区缺失 | | 设置元素值 | `set_value` | element_token, value | AX 方式赋值 | | 获取光标位置 | `get_cursor_position` | — | — | | 检查权限 | `check_permissions` | — | accessibility + screen_recording | ## 典型流程 ### 原生应用(TextEdit, Notes 等)——可后台操作 ``` computer_use(action="list_windows", title_filter="TextEdit") computer_use(action="set_focus", pid=12345) computer_use(action="click", x=500, y=500, pid=12345) computer_use(action="type", text="Hello World", pid=12345) ``` ### Electron 应用(TRAE, VS Code, Slack 等)——必须前台化 ``` # 1. 找到窗口 pid computer_use(action="list_windows", title_filter="TRAE Work") # 2. 前台化(必须!后台操作对 Electron 无效) computer_use(action="activate_app", target="TRAE Work CN") # 等待 1~1.5s 让窗口真正前台化 # 3. 点击输入框定位光标 computer_use(action="click", x=900, y=1000, pid=88851) # 4. 粘贴文字(自动备份+恢复剪贴板) computer_use(action="paste_text", text="Hello from AI") # 5. 发送 computer_use(action="press", key="return", pid=88851) # 6.(可选)切回原窗口 computer_use(action="activate_app", target="原应用名") ``` ### 打开浏览器访问网址 ``` computer_use(action="launch", target="Safari") computer_use(action="screenshot") computer_use(action="hotkey", keys=["cmd", "l"]) computer_use(action="type", text="https://example.com\n") ``` ## 常用快捷键 | 效果 | keys | |------|------| | 复制 | `["cmd", "c"]` | | 粘贴 | `["cmd", "v"]` | | 全选 | `["cmd", "a"]` | | 新标签页 | `["cmd", "t"]` | | 关闭窗口 | `["cmd", "w"]` | ## 注意 - **type vs paste_text**:`type` 用 CGEventPostToPid,对 Electron 后台窗口无效(返回 ok=True 但不输入)。Electron 应用必须用 `paste_text` + `activate_app`。 - **activate_app vs set_focus**:`set_focus` 只设置 CGEvent 投递目标 pid,不前台化,对 Electron 无效;`activate_app` 真正前台化窗口(osascript),Electron 必须用这个。 - **paste_text 不污染剪贴板**:内部自动 备份→写入→cmd+v→恢复。 - 截图需要视觉模型(如 claude-sonnet)才能解读图片内容 - 操作的是真实桌面,执行前告知用户可能影响当前窗口 - 坐标因分辨率/缩放不同而变化,每次操作前重新截图定位 - 截图失败时(`screenshot` 带 pid 返回空),尝试不带 pid 截全屏,或用 `get_window_state(pid, window_id)` 获取窗口截图 ## 踩坑记录 1. **cua-driver 按键方法名是 `press_key` 不是 `press`**:工具内部已映射,调 `computer_use(action="press")` 即可。直接调 bridge 时用 `press_key`。 2. **cua-driver 所有操作都要求带 pid**:不带 pid 会返回 "Missing required integer field: pid"。`list_windows`/`get_screen_size`/`activate_app`/`set_clipboard`/`get_clipboard`/`restore_clipboard` 等管理类方法除外。 3. **Electron 后台窗口键盘事件被静默丢弃**:`hotkey`/`press_key`/`type` 带 pid 时返回 ok=True 但事件不到达 Electron 后台窗口。必须 `activate_app` 前台化。 4. **macOS 下 cua-driver 的 bring_to_front 不可用**:前台化窗口必须用 `activate_app`(osascript)。 5. **activate_app 超时**:osascript 激活应用可能较慢,bridge 端超时设为 10s,调用后建议 sleep 1~1.5s。
Voir sur GitHub