shobhit99/claude-watch
GitHub: shobhit99/claude-watch
通过 Apple Watch 远程监控 Claude Code 终端输出、审批权限请求并发送语音指令的跨端控制工具。
Stars: 302 | Forks: 27
Agent Watch
通过 Apple Watch 控制 Claude Code。
查看终端输出、批准权限请求、发送语音指令——一切尽在腕间。
https://github.com/user-attachments/assets/5f478c28-2086-4696-9d76-e43dda853201
```
WCSession
Apple Watch <===============> iPhone <=======> Mac
(SwiftUI) sendMessage (Relay) HTTP Bridge Server
transferUserInfo SSE (Node.js)
|
HTTP Hooks | PTY stdin
v
Claude Code Session
```
## 功能特性
- **实时终端输出** 显示在您的 Apple Watch 上 —— 实时查看 Claude 的操作动态
- **权限提示** —— 直接在手腕上批准或拒绝 Claude 的操作(编辑文件?运行命令?)
- **动态问答** —— 回答包含所有选项的 `AskUserQuestion` 提示
- **语音指令** —— 通过 watchOS 听写功能向 Claude 口述指令
- **iPhone 伴侣应用** —— 配对界面、连接状态、终端预览、权限审批
- **桥接服务器** —— 运行在 Mac 上的 Node.js 服务器,通过 HTTP hooks + SSE 连接 Claude Code 与手表
## 系统架构
该系统包含三个组件:
### 1. 桥接服务器 (Mac)
一个 Node.js HTTP 服务器 (`skill/bridge/server.js`),其功能如下:
- 通过 [HTTP hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) 接收来自 Claude Code 的事件(`PostToolUse`、`PermissionRequest`、`Stop` 等)
- 通过 Server-Sent Events (SSE) 将事件流式传输给已连接的客户端
- 处理 6 位数字代码 + session token 的配对
- 通过 Bonjour/mDNS 在本地网络上广播自身
- 阻塞 `PermissionRequest` hooks —— 等待手表/手机批准,然后将决定返回给 Claude Code
### 2. iPhone App
一个 SwiftUI iOS 应用,其功能如下:
- 通过 Bonjour 发现桥接(或使用 localhost 回退)
- 使用 6 位数字代码进行配对
- 显示连接状态 + 终端输出
- 显示交互式权限提示(Yes / Yes all / No)
- 通过 WCSession 将事件中继到 Apple Watch
### 3. watchOS App
一个 SwiftUI watchOS 应用,其功能如下:
- 通过 Wi-Fi 直接连接到桥接(Bonjour 或手动输入 IP)
- 显示实时终端输出(Read, Edit, Bash, Grep 操作)
- 显示包含所有选项的权限提示,以可滚动按钮形式呈现
- 支持通过 watchOS 听写进行语音指令输入
- 针对任务完成、批准和错误提供触觉反馈
## 快速开始
### 前置条件
- 安装了 Node.js 18+ 的 macOS
- 安装了 watchOS SDK 的 Xcode 16+
- Apple Watch 需与您的 Mac 连接同一 Wi-Fi
- 已安装 Claude Code CLI
### Apple Watch Wi-Fi 设置
1. 确保您的 Apple Watch 连接到与运行 Claude Code 会话的 Mac **相同的 Wi-Fi 网络**
2. 在您的 Apple Watch 上,前往 **设置 > Wi-Fi > 您的网络** 并将 **私有 Wi-Fi 地址** 设置为 **关闭** —— 这是 Bonjour/mDNS 在本地网络上可靠工作的必要条件
### 1. 安装桥接
```
cd skill/bridge
npm install
```
### 2. 安装 Claude Code hooks
这将配置所有 Claude Code 会话以将事件流式传输到桥接:
```
./skill/setup-hooks.sh
```
稍后如需移除 hooks:`./skill/setup-hooks.sh --remove`
### 3. 启动桥接服务器
```
cd skill/bridge
node server.js
```
您将看到:
```
╔═══════════════════════════════════════╗
║ AGENT WATCH BRIDGE ║
╠═══════════════════════════════════════╣
║ Pairing Code: 648505 ║
║ IP Address: 192.168.1.4 ║
║ Port: 7860 ║
╚═══════════════════════════════════════╝
```
### 4. 构建 iOS + watchOS 应用
```
cd ios/ClaudeWatch
xcodegen generate # Generates the .xcodeproj
open ClaudeWatch.xcodeproj
```
在 Xcode 中:
1. 在两个目标(ClaudeWatch + ClaudeWatchWatch)上设置您的 **开发团队**
2. 选择 **ClaudeWatch** scheme 用于 iPhone,或选择 **ClaudeWatchWatch** 用于手表
3. 构建并运行 (Cmd+R)
### 5. 配对
**iPhone:** 输入桥接横幅中显示的 6 位配对代码。
**Apple Watch:** 应用会通过 Bonjour 自动发现桥接。如果失败,请手动输入桥接横幅中显示的 IP 地址。
### 6. 正常使用 Claude Code
在终端中启动任何 Claude Code 会话。每一次工具调用(Read, Edit, Bash, Grep)都会实时流式传输到手表和手机。权限提示将以交互式卡片形式出现。
## 项目结构
```
claude-watch/
├── skill/
│ ├── bridge/
│ │ ├── server.js # Bridge server (HTTP + SSE + Bonjour)
│ │ └── package.json # Node.js dependencies
│ ├── setup.sh # Install bridge dependencies
│ ├── setup-hooks.sh # Install/remove Claude Code hooks
│ └── SKILL.md # Claude Code skill definition
│
├── ios/ClaudeWatch/
│ ├── project.yml # XcodeGen project spec
│ │
│ ├── Shared/ # Shared between iOS + watchOS
│ │ ├── Models/
│ │ │ ├── SessionState.swift
│ │ │ ├── TerminalLine.swift
│ │ │ ├── ApprovalRequest.swift
│ │ │ ├── WatchMessage.swift
│ │ │ └── OutputRingBuffer.swift
│ │ ├── Connectivity/
│ │ │ └── WatchSessionManager.swift
│ │ └── Extensions/
│ │ ├── Color+Hex.swift
│ │ └── ClaudeMascot.swift # Official Claude logo as SwiftUI Shape
│ │
│ ├── ClaudeWatch iOS/ # iPhone app
│ │ ├── App/ClaudeWatchApp.swift
│ │ ├── Views/
│ │ │ ├── PairingView.swift # 6-digit code entry
│ │ │ ├── ConnectionStatusView.swift # Terminal + status
│ │ │ └── SettingsView.swift
│ │ ├── Networking/
│ │ │ ├── BonjourDiscovery.swift # LAN bridge discovery
│ │ │ ├── BridgeClient.swift # HTTP client
│ │ │ └── SSEClient.swift # Server-Sent Events
│ │ └── Services/
│ │ ├── RelayService.swift # Coordinates bridge <-> watch
│ │ └── NotificationService.swift
│ │
│ └── ClaudeWatch watchOS/ # Apple Watch app
│ ├── App/ClaudeWatchWatchApp.swift
│ ├── Views/
│ │ ├── OnboardingView.swift # Pairing (Bonjour + manual IP)
│ │ ├── SessionView.swift # Terminal output + mic FAB
│ │ ├── ApprovalView.swift # Dynamic permission prompts
│ │ ├── VoiceInputView.swift # Dictation input
│ │ └── StatusDashboard.swift
│ ├── Services/
│ │ ├── WatchViewState.swift # Watch-specific state + SSE
│ │ ├── WatchBridgeClient.swift # Direct HTTP to bridge
│ │ ├── HapticManager.swift
│ │ └── SpeechService.swift
│ └── Complications/
│ └── ComplicationProvider.swift
│
└── .claude/skills/claude-watch/
└── SKILL.md # /claude-watch skill for Claude Code
```
## 工作原理
### 事件流 (Mac -> Watch)
1. Claude Code 运行一个工具(例如,编辑文件)
2. `PostToolUse` HTTP hook 触发,POST 数据到桥接服务器
3. 桥接将事件推送给所有已连接的 SSE 客户端
4. 手表/手机接收 SSE 事件并将其渲染为终端行
### 权限流 (Mac -> Watch -> Mac)
1. Claude Code 遇到权限提示(例如,“您要编辑此文件吗?”)
2. `PermissionRequest` HTTP hook 触发 —— 桥接 **阻塞** 响应
3. 桥接推送包含问题 + 选项的 `permission-request` SSE 事件
4. Watch 显示批准表单,所有选项均显示为可点击按钮
5. 用户点击一个选项 —— 手表通过 HTTP 将决定发回桥接
6. 桥接将决定返回给 Claude Code 的 hook —— Claude 继续或停止
### AskUserQuestion 流程
与权限流程相同,但 hook 数据包含带有动态选项(label + description)的 `tool_input.questions`。手表将这些渲染为与终端编号选项相匹配的可滚动列表。
## Claude Code Hooks
`setup-hooks.sh` 脚本会在 `~/.claude/settings.json` 中全局安装这些 HTTP hooks:
| Hook 事件 | 用途 | 是否阻塞? |
|-----------|---------|-----------|
| `PostToolUse` | 捕获工具输出(文件读取、编辑、命令) | No (async) |
| `PreToolUse` | 捕获工具调用 | No (async) |
| `PermissionRequest` | 将权限提示转发到手表 | **Yes** (最长 10 分钟) |
| `Stop` | 检测 Claude 何时完成响应 | No (async) |
| `PostToolUseFailure` | 捕获错误 | No (async) |
| `StopFailure` | 捕获 API 错误 | No (async) |
| `Notification` | 空闲/权限通知 | No (async) |
## 配置
### 桥接服务器
| 环境变量 | 默认值 | 描述 |
|---------|---------|-------------|
| `PORT` | 7860 | 起始端口(尝试 7860-7869) |
### 移除 Hooks
```
./skill/setup-hooks.sh --remove
```
### 取消配对
- **iPhone:** 设置 > 忘记 Mac
- **Watch:** 重启应用(当桥接重启时凭据会清除)
## 系统要求
| 组件 | 最低版本 |
|-----------|----------------|
| macOS | 13.0+ |
| Node.js | 18+ |
| Xcode | 16+ |
| iOS | 17.0 |
| watchOS | 10.0 |
| Claude Code | 2.1+ |
## 故障排除
### 手表显示“未找到桥接”
- 确保您的 Mac 上正在运行 `node server.js`
- 检查您的手表是否连接到同一个 Wi-Fi 网络
- 使用“手动输入 IP”选项,输入桥接横幅中显示的 IP
### 手表显示“不支持的架构”
- 在 Xcode 中清理构建文件夹 (Cmd+Shift+Option+K)
- 选择正确的 scheme:**ClaudeWatchWatch**(而不是 ClaudeWatch)
- 如果直接部署到手表失败,请通过已配对的 iPhone 目标进行部署
### iPhone 显示“连接失败”
- 检查桥接是否正在运行 (`curl http://127.0.0.1:7860/status`)
- 桥接必须与 iPhone 处于同一局域网
### 权限提示未在手表上显示
- 验证 hooks 是否已安装:检查 `~/.claude/settings.json` 中的 hook 条目
- 检查桥接日志中是否有“Hook: PermissionRequest received”
- 确保手表已连接到桥接(绿色状态点)
### 桥接立即退出
- 桥接不再自动生成 Claude。它等待来自 hooks 的事件。
- 在单独的终端中启动 Claude Code —— hooks 将自动转发事件。
## 许可证
MIT
标签:AI编程助手, Apple Watch, bridged连接, Claude API, Claude Code, GNU通用公共许可证, HTTP Hooks, iOS开发, iPhone伴侣应用, LLM工具, Mac服务器, MITM代理, Node.js, Server-Sent Events, SSE, SwiftUI, watchOS, 人机交互, 可穿戴设备, 安全审批, 实时输出, 智能手表控制, 权限管理, 模型越狱, 移动开发, 终端监控, 蓝牙/WiFi通信, 语音命令, 远程控制