# 策展 · X (Twitter) 🔥

> 作者：itshan (@itshanrw) · 平台：X (Twitter) · 日期：2026-05-05

> 原始來源：https://x.com/itshanrw/status/2051159256918085888

## 中文摘要

Baguette 0.1.63 推出無頭 iOS 模擬器管理，支援 60 fps 畫面串流與主機輸入注入。

**Baguette 核心介紹**
Baguette 是單一 Swift CLI 工具「baguette」，專為 iOS 26 設計，無需啟動 Simulator.app GUI，即可建立、啟動、關閉模擬器裝置，並以 60 fps 串流畫面，同時注入點擊、滑動、多指觸控等輸入。開發者 itshan 強調，這讓 2026 年使用 Claude 或 Codex 建置 iOS app 的流程極簡：告訴 AI 需求，它生成 SwiftUI/ReactJS/Expo 程式碼，再用 Baguette CLI 進行 Agent 測試，下一個瀏覽器分頁即可互動玩耍。開源位於 https://github.com/tddworks/baguette，僅限 Apple Silicon、macOS 15+ 與 Xcode 26，使用 Xcode 私有框架如 SimulatorKit 與 CoreSimulator。

**新功能亮點**
版本 0.1.63 引入 `/simulators/<udid>` 視圖，提供全邊框模擬畫面、浮動玻璃工具列，支援明暗模式，無需切換 Xcode 視窗。
- **畫面串流**：MJPEG 或 H.264/AVCC 透過 stdout 或 WebSocket，執行期可調位元率、fps、縮放比例。
- **主機 HID 輸入**：點擊、滑動、1-2 指手勢、主畫面與鎖定按鈕、滾輪，全用 Xcode 26 preview-kit 的 9 參數 `IndigoHIDMessageForMouseNSEvent`，無 dylib 注入、無 `DYLD_INSERT_LIBRARIES`、無需逐 app 初始化。
- **獨立 Web UI**：`baguette serve` 開啟 `localhost:8421/simulators`，列出裝置、即時串流、手勢輸入，來自 DeviceKit 的邊框資料適用所有模擬器家族。
- **裝置農場**：`localhost:8421/farm` 為多裝置互動儀表板，所有啟動模擬器以牆壁/網格/清單呈現，具篩選排序，點擊圖塊聚焦全品質串流與輸入。

**安裝與快速入門**
透過 `brew install tddworks/tap/baguette` 安裝，需 Xcode 26。啟動 Web UI 後，開啟 `http://localhost:8421/simulators` 見單裝置儀表板（列出運行/可用裝置、啟動/關閉按鈕、串流頁面帶 DeviceKit 邊框）；`http://localhost:8421/farm` 則為多裝置控制面。CLI 無頭操作如 `baguette list`、`baguette boot --udid <UDID>`、`baguette tap --udid <UDID> --x 219 --y 478 --width 438 --height 954`。從來源建置用 `make` 或 `swift test`，混合 SPM 依賴（如 ArgumentParser、Mockable、Hummingbird）與 swiftc 編譯，目標 arm64e-apple-macos26.0，連結 IOSurface、VideoToolbox 等私有框架。

**CLI 指令細節**
`baguette <command> [options]` 涵蓋完整功能：
- `list [--json]`：列出裝置，JSON 輸出 `{"running":[…],"available":[…]}`。
- `boot/shutdown --udid <UDID>`：無頭啟動/關閉。
- `stream --udid <UDID> [--fps 60] [--format mjpeg|avcc]`：stdout 串流畫面，可 pipe 至 ffplay。
- `screenshot --udid <UDID> [--output <path>] [--quality 0.85] [--scale 1]`：擷取單張 JPEG。
- `input --udid <UDID>`：從 stdin 讀 JSON 手勢。
- `serve [--port 8421] [--host 127.0.0.1]`：啟動 Web UI，無 `/api/` 前綴，單一資源樹。
- `chrome layout/composite --udid <UDID>` 或 `--device-name "iPhone 17 Pro"`：輸出邊框 JSON 或合成 PNG。
- 單次手勢：`tap`、`swipe`、`pinch`、`pan`、`press --button home|lock`，座標為裝置點數（device points），如 iPhone 17 Pro Max 中心為 x:219, y:478（438×954 的一半）。

**Web UI 路由與 WebSocket**
`baguette serve --port 8421` 監聽 `http://127.0.0.1:8421/simulators`。路由表無冗餘：
| 方法 | 路徑 | 功能 |
|------|------|------|
| GET | `/simulators` | 裝置清單 HTML |
| GET | `/simulators/:udid` | 串流 HTML |
| WS | `/simulators/:udid/stream?format=mjpeg|avcc` | 雙向串流 |
| GET | `/farm` | 多裝置儀表板 |

單一 WebSocket 承載一切：伺服器推二進位畫面（MJPEG 為 raw JPEG；AVCC 標頭 0x01 avcC、0x02 關鍵幀、0x03 差分、0x04 JPEG 種子）；瀏覽器回 JSON（如 `{"type":"set_bitrate","bps":N}`、`{"type":"set_fps","fps":N}`、`{"type":"tap","x":219,"y":478,...}`）。無事件 POST、無 UDID 註冊，WS 處理器獨佔串流與模擬器控制。

**裝置農場特色**
`/farm` 為單頁多裝置儀表板，每裝置用相同 WS 管道驅動 `FarmTile`。
- **三種視圖**：Grid（縮圖）、Wall（大圖塊帶邊框）、List（單行元資料），標頭切換。
- **篩選排序**：依裝置家族、OS 版本、運行狀態，左側軌道維持過濾。
- **聚焦互動**：點擊圖塊將 `<canvas>` 移至右側全品質窗格，低 bitrate 縮圖持續；輸入（手勢、home/lock 按鈕、捏合）經 `SimInputBridge` → `GestureDispatcher` → `IndigoHIDInput`。
- **邊框處理**：預設 DeviceKit 邊框，無 asset 時用 9-slice 合成，可切無邊框模式。
UI 由 `farm.html` 載入五個 IIFE JS（如 `farm-views.js` 渲染視圖、`farm-tile.js` 每裝置縮圖），`BAGUETTE_WEB_DIR` 允許無重建迭代。

**輸入通訊協定細節**
`baguette input` 用 stdin newline-delimited JSON，stdout 回 `{"ok":true}` 或錯誤，每行獨立 ack。範例：
- 點擊：`{"type":"tap","x":219,"y":478,"width":438,"height":954,"duration":0.05}`。
- 滑動：`{"type":"swipe","startX":219,"startY":760,"endX":219,"endY":190,"width":438,"height":954,"duration":0.3}`。
- 1 指串流：`touch1-down/move/up`。
- 2 指串流（捏合/平移主路徑）：`touch2-down/move/up`。
- 按鈕：`{"type":"button","button":"home"}`（iOS 26.4 僅 home/lock 有效）。
- 滾輪：`{"type":"scroll","deltaX":0,"deltaY":-50}`。
- 捏合：伺服器內插 10 步。座標統一 device points，瀏覽器 UI 乘以 width/height 規範化。尚未接通：鍵盤（preview-kit WIP）、Siri 按鈕（引發 backboardd 崩潰）。

**串流與邊框工具**
`baguette stream --udid <UDID> --format avcc --fps 60` 輸出長度前綴二進位，AVCC 每塊 1 位元組標頭。執行期 stdin JSON 控制：`{"type":"set_bitrate","bps":4000000}`、`{"type":"force_idr"}` 等。`baguette chrome` 讀 `/Library/Developer/DeviceKit/Chrome/`，輸出 JSON 或 PNG，無需手動維護邊框表，如 `baguette chrome composite --device-name "iPhone 17 Pro" > iphone17pro.png`。

**架構與測試設計**
分層有界上下文：Domain（純 Swift，無私有 API，如 Gesture/Tap/Swipe/Pinch/Pan）、Infrastructure（@Mockable 埠實作，如 IndigoHIDInput、SimulatorKitScreen）、App（CLI 調度、GestureDispatcher）。來源布局鏡像 Domain/Infrastructure，Web 資源在 `Sources/Baguette/Resources/Web/`（`sim.html`、`farm-*.js`）。測試用 Swift Testing（110+ 測試，@Suite/@Test/#expect），每外部邊界 Mockable，無需模擬器運行 `swift test`。發行建置無 mock 程式碼。

**iOS 26 相容關鍵**
Baguette 採用 Xcode 26 preview-kit 的 9 參數簽名，路由至 digitizer target 0x32（iOS 26 仍支援）。詳細註解在 `IndigoHIDInput.swift`，架構文件見 `docs/ARCHITECTURE.md`。

**未來開發願景**
itshan 預見 2026 iOS app 開發無痛：AI 生成程式碼，Baguette Agent 測試，瀏覽器即玩。專案採用 MIT 授權（依據 GitHub 儲存庫 LICENSE 檔案），demo 影片在 assets/demo.mp4，CI 徽章顯示高覆蓋率，持續迭代 Web UI 與 HID 路徑。

## 標籤

CLI, iOS, SwiftUI, 新產品, 開源專案, Baguette, Apple, Claude, Codex
