desktop

Installation
SKILL.md

Desktop — CC 桌面操控

核心理念:触觉反馈

不截全屏传 AI(慢、贵),而是用 macOS 原生 OCR 当"触觉"。 鼠标移到哪 → OCR 哪 → Agent 知道手在哪、摸到什么。

CLI 工具栈

所有操作通过 Bash 调 CLI 工具完成:

# ===== 眼(感知) =====

# OCR 工具路径(ocr.py 在本 skill 目录下,venv 在 ~/tools/ocr-env/)
SKILL_DIR=".claude/skills/desktop"
OCR="$HOME/tools/ocr-env/bin/python3 $SKILL_DIR/ocr.py"

# 全屏 OCR(快速模式,~240ms,注意:中文必须用精确模式)
$OCR --screen --fast

# 全屏 OCR + JSON 包围盒(精确模式,~870ms)
$OCR --screen --bbox

# 鼠标附近 OCR(触觉,~250ms,默认 300x200)
$OCR --cursor

# 鼠标附近 OCR + JSON(带可点击坐标)
$OCR --cursor --bbox

# 鼠标附近 OCR(自定义区域大小)
$OCR --cursor --size 200x100

# 指定图片 OCR
$OCR /path/to/image.png

# ===== 手(操控) =====

# 获取鼠标位置
cliclick p:.

# 移动鼠标
cliclick m:500,300

# 点击
cliclick c:500,300

# 双击
cliclick dc:500,300

# 右键
cliclick rc:500,300

# 输入文字
cliclick t:"Hello World"

# 按键(回车、Tab 等)
# 注意:cliclick kp:return 在微信等部分应用中无效,优先用 osascript
osascript -e 'tell application "System Events" to key code 36'   # Return(推荐)
cliclick kp:return                                                # Return(备选)
cliclick kp:tab
cliclick kp:escape

# 键盘快捷键
osascript -e 'tell application "System Events" to keystroke "c" using command down'
osascript -e 'tell application "System Events" to keystroke "v" using command down'
osascript -e 'tell application "System Events" to keystroke "s" using command down'
osascript -e 'tell application "System Events" to keystroke "a" using command down'

# ===== 感知(窗口/应用状态) =====

# 当前可见应用列表
osascript -e 'tell application "System Events" to get name of every process whose visible is true'

# 当前前台窗口信息
osascript -e 'tell application "System Events" to get {name, position, size} of every window of (first process whose frontmost is true)'

# 切换到指定应用
osascript -e 'tell application "APP_NAME" to activate'

# 点击菜单
osascript -e 'tell application "System Events" to click menu item "ITEM" of menu "MENU" of menu bar 1 of process "APP"'

# 全屏截图(传 Claude 视觉兜底时用)
screencapture -x /tmp/desktop-screenshot.png

# 局部截图
screencapture -x -R "x,y,w,h" /tmp/desktop-region.png

操作流程

标准流程:点击按钮

1. 全屏 OCR 找目标
   $OCR --screen --fast
   → 找到 "保存" @ (550, 300)

2. 移动鼠标 + 触觉确认
   cliclick m:550,300
   $OCR --cursor --size 200x100
   → 确认 "保存" 在鼠标下方 ✓

3. 点击
   cliclick c:550,300

4. 触觉验证结果
   $OCR --cursor
   → 确认操作成功

快捷流程:已知坐标直接点

cliclick c:550,300

文字输入

1. 点击输入框
   cliclick c:400,200

2. 清空(全选+删除)
   osascript -e 'tell application "System Events" to keystroke "a" using command down'
   cliclick kp:delete

3. 输入文字
   cliclick t:"要输入的内容"

OCR 找不到时的兜底

1. 全屏截图
   screencapture -x /tmp/desktop-screenshot.png

2. 用 Read 工具读取截图(Claude 视觉)
   → Claude 自动分析截图内容

3. 根据 Claude 的分析结果决定操作

安全规则

级别 操作 策略
绿色 截图、OCR、读剪贴板、列窗口、移动鼠标 自动执行
黄色 点击、输入文字、切换窗口 执行并告知用户
红色 涉及密码、支付、删除、发消息 先问用户

禁区

  • 不操控 Terminal/iTerm(防 GUI 绕过权限控制)
  • 不输入密码
  • 不操作支付页面
  • 不修改系统安全设置

OCR 输出格式

简洁模式(默认)

cursor: (516,703)  ocr: 277ms
  [0.50] 上线的时候记得把密码改强一点  @ (665,678)
  [0.50] 己置那个上游的api 呢?  @ (508,744)

JSON 模式(--bbox)

{
  "cursor": [516, 703],
  "elapsed_ms": 243,
  "items": [
    {
      "text": "保存",
      "confidence": 0.98,
      "bbox": [540, 290, 60, 30],
      "center": [570, 305]
    }
  ]
}

center 是文字中心坐标,可直接传给 cliclick c: 点击。

性能参考

操作 耗时
鼠标移动/点击 < 10ms
局部 OCR(300x200) ~250ms
全屏 OCR(快速) ~240ms
全屏 OCR(精确) ~870ms
获取窗口列表 < 50ms

微信操控脚本

本 skill 目录下有三个微信操控脚本,封装了完整的读/发/验证流程:

SKILL_DIR=".claude/skills/desktop"

# 读取当前聊天内容(OCR 聊天区域,排除标题栏和输入框)
$SKILL_DIR/wechat-read.sh              # 简洁文字
$SKILL_DIR/wechat-read.sh --bbox       # JSON 包围盒

# 发送文字消息(自动验证:OCR 输入框 count==0 = 成功)
$SKILL_DIR/wechat-send.sh "消息内容"

# 发送文件/图片(剪贴板 POSIX file → 粘贴 → 回车 → OCR 验证)
$SKILL_DIR/wechat-send-file.sh /path/to/file

使用前提

  • 微信已打开并停留在目标聊天窗口
  • 需要 cliclick(brew install cliclick
  • 需要 OCR 环境(~/tools/ocr-env/,pyobjc + Vision Framework)

关键参数(脚本内固定)

  • SIDEBAR=310:微信侧边栏固定宽度(图标60 + 列表250)
  • TITLE_H=50:顶部标题栏高度
  • INPUT_H=110:底部输入框+工具栏高度

注意事项

  • 中文 OCR 不用 --fast:fast 模式中文乱码,脚本默认用精确模式
  • 坐标动态获取:每次操作前 osascript get {position, size},不硬编码
  • 焦点防抢:activate + delay 写在同一个 osascript block 里
Related skills
Installs
2
Repository
aster110/mycc
GitHub Stars
165
First Seen
Mar 28, 2026