关于 baguette
baguette 是通过 Apple 的 SimulatorHID 控制 iOS 模拟器的 macOS 命令行技能,适用于 Agent 和开发者执行交互、查看屏幕并验证应用行为;不支持控制实体设备。
主要功能
- 01启动并列出模拟器
- 02执行触摸、滑动和文本输入
- 03截取屏幕并查看界面信息
- 04设置应用运行环境
- 05通过 JSON 连续发送手势
适用场景
- 01测试修改后的 SwiftUI 界面
- 02自动执行模拟器交互
- 03检查手势后的应用行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tddworks/ baguette --skill baguette安装后在 Claude Code 中输入/baguette确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/apps.mdcommands.mddevices.mdenvironment.mdinteract.mdobserve.mdwire.md详细介绍
baguette — 以编程方式控制 iOS 模拟器
baguette 是一款 macOS 命令行工具,通过 Apple 的私有
SimulatorHID(Xcode 内部使用的路径)驱动 iOS 模拟器:对于输入操作,它比
idb / AXe / simctl io 更快、更可靠。Agent 使用命令行工具;想要观看或一起操作的用户,应使用 baguette serve 和
http://localhost:8421/simulators/<udid>。
操作循环
几乎所有任务都是:获取设备、操作、查看、重复。
baguette list --json # 1. a booted UDID
baguette boot --udid <UDID> # (if none is running)
baguette describe-ui --udid <UDID> | jq .screen # 2. its size in points
baguette tap --udid <UDID> --x 219 --y 478 --width 438 --height 954 # 3. act
baguette screenshot --udid <UDID> --output /tmp/frame.jpg # 4. look
然后读取 /tmp/frame.jpg。如果轻点返回 {"ok":true},但没有任何反应,请运行 baguette heal --udid <UDID>(Xcode 27 的 Device Hub 接管了输入界面;请参阅
references/devices.md)。
坐标单位是设备点(请务必阅读)
每个 x / y / startX / endX / x1 / cx … 都以设备点为单位,
与传入的 width / height 使用相同单位。438×954 屏幕的中心是
x:219, y:478:不是 0.5, 0.5(归一化坐标),也不是
1206, 2622(像素)。从每台设备的 describe-ui 外层
screen 获取 width / height,旋转或折叠后重新读取;返回的帧也使用相同单位,因此元素中心坐标可以直接用于轻点。不要使用 chrome layout:它的 screen 是边框图片的尺寸,不是设备点坐标。
你需要做什么?
只阅读当前任务所需的参考文档。
| 你想要…… | 阅读 | 命令 |
|---|---|---|
| 启动设备、调整尺寸、旋转、折叠;修复输入无处生效的问题 | references/devices.md | list boot shutdown heal orientation hinge |
| 像用户一样操作:触摸、拖动、按按钮、输入文字、粘贴 | references/interact.md | tap double-tap swipe pinch pan input press type key paste clipboard |
| 检查发生了什么:查看画面、查找元素、读取日志、录制 | references/observe.md | screenshot describe-ui logs record stream render-3d |
| 设置应用运行时的条件 | references/environment.md | location motion network interface status-bar notify shake,相机(仅限 WebSocket) |
| 安装应用及其数据并启动应用 | references/apps.md | install add-media openurl schemes defaults,simctl launch |
还有两个文档,由 make docs 从二进制文件生成(不要在此处编辑)。
references/commands.md 包含所有子命令、标志和退出代码;文件很长,
因此只阅读某个命令对应的章节,而不是整个文件:
grep -A25 '^## baguette swipe' references/commands.md(子命令使用
### baguette location set 的格式)。references/wire.md 包含 input 和 WebSocket 的所有 JSON 手势。
单次调用或流式输入
只需少量步骤时,每个手势使用一条命令即可;每条命令都要支付 HID
初始化开销(约 50–100 毫秒)。如果要拖动、编排操作或执行许多步骤,请打开
baguette input --udid <UDID> 一次,并逐行写入 JSON 手势(references/interact.md)。无论哪种方式,ok:true 都只表示已发送,并不代表屏幕已响应:请用屏幕截图确认。
应明确说明的限制,而不是等到发现后再说
type/key使用美国英语 ASCII 击键。其他内容(重音符号、CJK、表情符号) 应通过baguette paste --text "…"输入。press --button siri会被拒绝:所有已知路径都会导致 backboardd 崩溃。motion、network和相机仅对启用后启动的应用生效;请重新启动应用一次(之后执行network set或clear则不需要)。- 闲置屏幕可能不会产生任何帧,因此
screenshot会超时;先轻点一下唤醒屏幕。 - 仅支持模拟器:尚未接入实体设备控制。
冒烟测试
#!/usr/bin/env bash
set -euo pipefail
UDID="$1"
read W H < <(baguette describe-ui --udid "$UDID" | jq -r '.screen | "\(.width) \(.height)"')
baguette press --udid "$UDID" --button home
sleep 0.4
baguette tap --udid "$UDID" --x $((W * 75 / 100)) --y $((H * 55 / 100)) --width "$W" --height "$H"
sleep 0.5
baguette screenshot --udid "$UDID" --output /tmp/settings.jpg
确定一次尺寸,并将其传给每个手势。与其猜测位置,不如使用 baguette describe-ui 查找元素,然后轻点其中心。
与 Claude Code 配合
编辑 SwiftUI 应用时:构建并运行 → press --button home,然后轻点进入更改后的屏幕 → screenshot 并 Read 截图 → 确认像素效果符合预期。为便于用户跟进,启动 baguette serve,并将 http://localhost:8421/simulators/<udid> 提供给他们;它还支持键盘输入、拖放安装和功能卡片。baguette plugin 和 baguette bakery 可扩展该页面(参见 commands.md)。
各功能指南:https://github.com/tddworks/baguette/blob/main/docs/features/<feature>/README.md。
安装(仅在缺少时)
brew install baguette
baguette --version
需要在 Apple Silicon 上运行 Xcode 26 或更高版本。如果 baguette 已能正常运行,请跳过此步骤;不要每次调用都重新安装。