AgentBoard:AI辅助开发的macOS驾驶舱,整合任务、对话与监控
1. 项目概述:一个为AI辅助开发而生的“驾驶舱”
如果你和我一样,每天都在和AI编程助手(比如Claude、Cursor、GPT Engineer等)打交道,那你一定对那种“精神分裂”般的工作状态深有体会。左手边是终端,bd命令在滚动;右手边是Telegram或Discord,和AI的对话窗口闪烁不停;中间还得开着浏览器和IDE,随时准备审查AI生成的代码。信息被切割在不同的应用和窗口里,来回切换不仅打断心流,更糟糕的是,你很容易就忘了某个任务的具体上下文,或者错过了AI在另一个会话里完成的关键提交。
AgentBoard就是为了终结这种混乱而生的。它不是一个简单的聚合器,而是一个专为AI辅助开发工作流设计的原生macOS应用,一个真正的“驾驶舱”。它将任务看板(基于Beads)、与AI的实时对话(通过OpenClaw网关)、以及运行中的编码会话监控,无缝整合进一个统一的、高性能的SwiftUI界面。简单来说,它让你在一个窗口里,就能看到所有AI代理在干什么、跟它们对话、并管理它们的工作产出。这对于管理多个并行项目、依赖多个AI代理协作的复杂开发场景来说,效率提升是颠覆性的。
2. 核心设计理念与架构拆解
2.1 为什么是“驾驶舱”模式?
传统的IDE或项目管理工具,其交互模型是围绕“人类开发者”单点操作设计的。但在AI辅助开发中,工作主体变成了“人类+多个AI代理”的混合团队。这带来了几个根本性变化:
- 异步与并行:多个AI代理可能同时在处理不同任务。
- 状态分散:任务状态在git提交里,对话在聊天工具里,运行日志在终端里。
- 上下文依赖:AI需要精确的任务描述(Bead)和项目上下文才能有效工作。
AgentBoard的“驾驶舱”设计,正是为了应对这些变化。它将三个核心维度——任务(What)、沟通(How)、执行(Where)——并置呈现。
- 任务维度(看板):基于Beads这个git-backed的issue tracker,所有任务变更本身就是一次git提交,天然具备版本追溯能力。看板不是数据库的UI,而是文件系统(
.beads/issues.jsonl)的实时视图。 - 沟通维度(聊天):集成OpenClaw网关,让你可以直接在应用内与AI对话。关键优化在于“Bead链接”——AI回复中提及的Bead ID会被自动识别并高亮,点击即可在看板上定位该任务,实现了对话与任务的无缝跳转。
- 执行维度(监控):通过
tmux会话监控,实时展示每个AI编码代理的运行状态、输出终端内容。你可以看到它是正在运行、卡住了还是出错了,甚至可以直接从UI向卡住的会话发送一个“回车”指令进行干预。
这种三位一体的设计,确保了管理者(你)对整体工作流的全局感知和精细控制。
2.2 技术栈选型背后的考量
AgentBoard的技术选型充分体现了macOS原生应用的优势和对现代Swift生态的拥抱:
- SwiftUI + macOS 15+:这保证了应用能充分利用最新的系统API(如强化后的
WKWebView、更精细的快捷键API),并拥有顶级的性能和原生交互体验。使用@Observable宏而非旧的@ObservableObject,是紧跟Swift 6严格并发性(Strict Concurrency)的要求,从框架层面减少数据竞争的风险。 - 无状态架构(State-less):应用本身不维护核心数据库。Beads文件是唯一的事实来源。AgentBoard通过
DispatchSource文件监视器(BeadsWatcher)监听issues.jsonl的变化,实时更新UI。这种设计带来了巨大优势:你完全可以用任何其他工具(甚至是vim)修改Beads文件,AgentBoard的看板会立刻同步。它也避免了数据同步的复杂性,因为git本身就是同步机制。 - Actor模型处理并发:与OpenClaw网关的WebSocket通信、文件监视、会话轮询都是高并发的I/O操作。AgentBoard使用Swift的Actor(如
OpenClawService)来封装这些服务,确保了跨线程访问的状态安全,代码更清晰,更不容易出现难以调试的并发bug。 - 依赖最小化:核心依赖只有两个:
SwiftTerm用于终端渲染,swift-markdown用于解析。这降低了维护成本,也使得应用更轻量、启动更快。
实操心得:文件监视的坑使用
DispatchSource做文件系统监听时,一个常见的坑是监听符号链接(symlink)或临时文件。Beads的issues.jsonl是稳定路径,这没问题。但在实现类似功能时,如果监听目录,要特别注意FSEvents的回调可能会非常频繁,需要进行防抖(debounce)处理,否则UI会频繁刷新导致卡顿。AgentBoard这里因为监听的是单个明确文件,且变更频率不会极高,所以直接处理是可行的。
3. 核心功能深度解析与实操要点
3.1 看板(Kanban Board):不只是拖拽
看板是AgentBoard的信息中枢。其核心价值在于将Beads的纯文本issue,可视化为具有明确工作流(Open, In Progress, Blocked, Done)的卡片。
- 元数据驱动:每张卡片展示的标题、类型(Task/Bug/Feature/Epic/Chore)、优先级(P0-P4)、负责人、标签,都直接来自Beads的元数据。这意味着你可以通过编辑Beads文件来批量修改这些属性,看板会自动响应。
- Epic联动:这是项目管理的关键。一个Epic(史诗)卡片可以关联多个子任务。在Epic视图下,你能看到一个清晰的进度条(如“3/5”),点击展开即可看到所有子任务的状态。这对于用AI拆解和实现大型功能模块至关重要——你可以先创建一个Epic,然后让AI根据描述拆分成具体的子Beads。
- 实时同步的魔法:很多人会好奇UI是怎么实时更新的。关键在于
BeadsWatcher服务。它创建了一个DispatchSourceFileSystemObject,监听issues.jsonl文件的写入和重命名事件。一旦文件发生变化(比如AI代理完成了一个任务并提交了更改),监视器会收到事件,解析新的文件内容,并更新@Observable的AppState,SwiftUI视图随之刷新。整个过程在毫秒级完成。
操作技巧:
- 快速创建:使用
Cmd+N快捷键,在任何地方快速弹出新建Bead的窗口。养成给新任务立即分配类型和优先级的习惯。 - 上下文菜单:右键点击卡片,除了编辑删除,最关键的是“Assign to agent”。这会将Bead ID复制到剪贴板,方便你在聊天窗口中直接引用,为AI提供精确上下文。
- 从提交反查:看板卡片上显示的最近提交SHA和分支名是可点击的。点击后,右侧画布会直接加载这次提交的diff,让你快速Review AI的代码改动。
3.2 聊天(Agent Chat):有上下文的对话
集成聊天功能不是为了替代Telegram,而是为了绑定工作上下文。
- 会话管理:顶部下拉框可以切换不同的OpenClaw网关会话。这意味着你可以同时保持与Claude、GPT-4等不同模型的对话,并在同一个界面管理,无需切换应用。
- 流式响应与中断:AI回复是流式(streaming)输出的,伴有打字机效果。如果发现AI的回答方向错了,可以立即点击旁边的“停止”按钮中断,这比在聊天软件里刷屏“停下”要高效得多。
- Thinking Levels:这是一个高级功能。你可以选择“Low/Medium/High”的思考深度,这实质上是向网关发送不同的推理参数,对于复杂问题,要求AI进行更深度的链式思考(Chain-of-Thought)可能得到更优解。
- Bead自动链接:这是杀手级特性。当AI在回复中说“我已经完成了任务
[bead:abc123]”,这里的abc123会被自动识别并渲染成一个可点击的链接。点击后,主看板会立即滚动并高亮对应的Bead卡片。这彻底打通了沟通与任务管理。
配置要点:
- 网关连接:首次启动,AgentBoard会尝试读取
~/.openclaw/openclaw.json来自动配置。如果网关运行在其他机器上,你需要在设置中手动填入WebSocket URL(例如ws://192.168.1.100:18789)。 - 设备配对:首次连接一个新设备(即新的AgentBoard实例)时,需要在运行OpenClaw网关的机器上执行命令进行授权:
openclaw devices approve <device-id>。这个设备ID基于存储在~/.agentboard/device-identity.json中的Ed25519密钥对生成,确保了连接的安全性。
3.3 会话监控与终端视图:给AI装上“仪表盘”
这是让你感知AI“生命体征”的功能。它通过轮询tmux会话和进程列表,来监控所有由OpenClaw网关启动的编码代理(如Claude Code、Aider等)。
- 状态可视化:
- 绿色(运行中):代理正在积极输出或思考。
- 黄色(空闲):会话存在,但近期没有输出。可能卡在某个交互提示。
- 灰色(已停止):会话正常结束。
- 红色(错误):进程意外退出或发生错误。
- 终端视图:点击任意会话,右侧可以打开一个只读的终端视图,实时显示该会话的所有输出。这对于调试AI行为、查看它具体执行了哪些命令至关重要。
- “Nudge”按钮:当会话长时间处于“空闲”(黄色)状态时,很可能是AI在等待一个确认(比如
git diff后等待y/n)。这时你可以点击“Nudge”按钮,它本质上是通过tmux向该会话发送一个回车(Enter)键事件,推动流程继续。 - 从UI启动会话:你不仅可以监控,还可以直接配置并启动一个新的编码会话。指定项目、选择代理类型、关联一个Bead ID、并提供一个初始提示(Seed Prompt),然后点击启动。AI代理就会在后台的
tmux会话中开始工作,并自动出现在监控列表里。
注意事项:tmux是必须的会话监控重度依赖
tmux。确保你的OpenClaw网关配置的编码代理都是在tmux会话中运行的。同时,AgentBoard需要有权限访问这些tmux会话(通常意味着需要在同一个用户环境下运行)。如果监控不到会话,首先检查tmux ls命令是否能列出目标会话。
4. 详细配置与高级使用指南
4.1 项目发现与管理
AgentBoard默认扫描~/Projects目录下所有包含.beads/子目录的文件夹,并将其识别为一个项目。
自定义项目路径: 如果你项目不在~/Projects下,有两种方式添加:
- 通过UI设置:在应用的Settings中,可以手动添加项目路径。
- 通过配置文件:创建或编辑
~/.agentboard/config.json,按如下格式配置:
重启应用后即可生效。图标字段是可选的,但能帮助你在侧边栏快速识别。{ "projects": [ { "name": "我的iOS项目", "path": "/Users/username/Development/MyApp", "icon": "📱" }, { "name": "后端服务", "path": "/Volumes/Work/backend", "icon": "⚙️" } ] }
4.2 远程网关连接方案
你的开发机(运行AgentBoard)和运行AI模型/网关的机器(性能更强)可能是分开的。AgentBoard支持多种远程连接方式:
| 连接方式 | 适用场景 | 配置要点 |
|---|---|---|
| 局域网直连 | 网关和AgentBoard在同一局域网。 | 在网关配置中设置gateway.bind: "0.0.0.0",然后在AgentBoard中填入ws://<网关IP>:18789。 |
| Tailscale等VPN | 机器位于不同网络,但通过VPN组成虚拟局域网。 | 使用网关在VPN中的IP地址,如ws://100.xx.yy.zz:18789。确保VPN网络内端口可访问。 |
| SSH端口转发 | 最通用、安全的方式,尤其适合云服务器。 | 在本地执行:ssh -L 18789:localhost:18789 user@gateway-host。然后在AgentBoard中连接ws://127.0.0.1:18789。所有流量通过加密的SSH隧道传输。 |
安全建议:对于暴露在公网的网关,务必使用强令牌认证,并考虑通过SSH隧道或VPN访问,避免将WebSocket服务直接暴露。
4.3 画布(Canvas):多功能输出面板
右侧面板的画布是一个强大的内容渲染器,它不仅仅是聊天记录的展示区。
- 支持的内容类型:
- Markdown/HTML:AI回复的标准渲染。
- 图片:可以直接拖拽图片到聊天输入框或画布区域进行上传和显示。
- 代码Diff:点击Bead卡片上的提交SHA后,画布会通过
GitService获取并渲染diff,语法高亮清晰。 - Mermaid图表:如果AI生成了Mermaid代码块,画布会将其渲染成图表。这对于理解AI设计的架构图、流程图非常有用。
- 终端输出:从会话监控点击打开的终端内容也会在这里显示。
- 工具栏操作:画布顶部工具栏提供前进/后退历史导航、缩放控制,以及导出功能(可将当前内容导出为HTML或图片)。
- 三种布局模式:通过右上角按钮切换。
- 仅聊天:专注于对话。
- 仅画布:全屏查看代码Diff或图表。
- 分屏(默认):60%画布 + 40%聊天,中间分隔条可拖动。这是最高效的模式,一边看代码改动,一边给AI下一步指令。
5. 开发、构建与贡献指南
5.1 本地构建环境搭建
确保你的环境符合要求,这是成功构建的第一步:
- 系统与工具:
- macOS 15 (Sequoia) 或更高版本。
- Xcode 16.2+,并确保命令行工具已安装(
xcode-select --install)。 - 安装 XcodeGen :
brew install xcodegen。这个工具用于通过project.yml生成Xcode项目文件,避免手动修改容易冲突的pbxproj文件。
- 依赖服务:
- 安装 Beads :
brew install beads。 - 确保有一个正在运行的 OpenClaw 网关实例。
tmux通常系统已自带,确保可用。
- 安装 Beads :
- 获取代码并生成项目:
之后就可以在Xcode中正常编译运行了。git clone https://github.com/jbcrane13/AgentBoard.git cd AgentBoard xcodegen generate # 解析 project.yml,生成 AgentBoard.xcodeproj open AgentBoard.xcodeproj
5.2 项目结构与核心服务剖析
理解项目结构有助于你进行二次开发或排查问题:
AgentBoard/ ├── App/AppState.swift # 核心:全局可观察状态,所有视图的数据源 ├── Models/ # 数据模型定义 │ ├── Bead.swift # 任务模型,与Beads文件结构对应 │ ├── CodingSession.swift # 编码会话模型(状态、进程信息等) │ └── ... ├── Services/ # 后台服务,是应用的引擎 │ ├── OpenClawService.swift # Actor,管理WebSocket连接和RPC调用 │ ├── BeadsWatcher.swift # 文件系统监视器,驱动看板实时更新 │ ├── SessionMonitor.swift # 轮询tmux和进程,更新会话状态 │ ├── CanvasRenderer.swift # 利用WKWebView渲染复杂内容 │ └── GitService.swift # 封装git命令,获取提交和diff信息 └── Views/ # 所有SwiftUI视图 ├── Board/ # 看板相关视图 ├── Chat/ # 聊天界面 └── ...关键服务交互流程:
- 应用启动时,
BeadsWatcher开始监听项目目录下的issues.jsonl。 - 用户点击一个Bead卡片,
AppState中当前选中的Bead ID更新。 ChatView观察到选中ID变化,可能在输入框中预填充上下文。- 用户发送消息,
ChatView调用OpenClawService这个Actor的方法。 OpenClawService通过GatewayClient发送WebSocket消息,并处理流式返回,更新AppState中的消息列表。CanvasView观察到新消息,调用CanvasRenderer将其渲染到WKWebView。- 同时,
SessionMonitor每隔几秒检查一次tmux会话,更新AppState中的会话列表,驱动UI状态图标变化。
5.3 代码规范与质量保证
项目采用了较高的代码质量标准:
- 严格并发检查:在项目的Build Settings中,设置了
SWIFT_STRICT_CONCURRENCY=complete。这意味着编译器会强制检查所有并发代码的安全性,杜绝数据竞争。在编写任何新代码,特别是服务层代码时,必须正确使用actor、@MainActor、Sendable等关键字。 - SwiftLint:作为构建阶段(Build Phase)自动运行。提交代码前,最好手动运行
swiftlint lint检查是否有风格违规。规则定义在.swiftlint.yml中。 - SwiftFormat:项目也配置了SwiftFormat用于代码格式化。虽然构建时不强制,但建议在提交前运行
swiftformat .来统一代码风格。 - 强制代码风格:
- 使用SwiftUI新范式:
@Observable+@State。 - 禁止强制解包(
!),必须使用guard let、if let或提供默认值(??)。 - 模型遵循
Sendable协议,以安全地在并发上下文间传递。
- 使用SwiftUI新范式:
开发工作流提醒: 永远不要手动修改AgentBoard.xcodeproj/project.pbxproj文件。所有项目配置(添加文件、调整构建设置等)都应在project.yml中完成,然后运行xcodegen generate重新生成。这是团队协作中避免Xcode项目文件冲突的最佳实践。
5.4 如何贡献代码
如果你发现了Bug,或者有很棒的新功能想法,非常欢迎贡献代码:
- Fork仓库,并基于
main分支创建你的特性分支(feat/add-xxx)或修复分支(fix/yyy-bug)。 - 在编码前,先阅读设计文档:
DESIGN.md和docs/ADR.md(架构决策记录)。这能帮你理解项目的设计哲学和过往的技术决策,确保你的贡献与项目方向一致。 - 实现你的修改,并确保遵循上述代码规范。
- 充分测试:
# 运行所有测试 xcodebuild -project AgentBoard.xcodeproj -scheme AgentBoard build test # 也可以运行特定测试类 swift test --filter YourFeatureTests - 提交信息使用约定式提交:例如
feat: 添加多窗口支持、fix: 修复会话监控内存泄漏、docs: 更新快速开始指南。这有利于自动生成变更日志。 - 发起Pull Request,提供清晰的描述,说明变更内容、动机以及测试情况。
6. 常见问题排查与使用技巧
6.1 连接与网络问题
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 无法连接到OpenClaw网关 | 1. 网关未运行。 2. 地址或端口错误。 3. 防火墙阻止。 | 1. 在网关机器运行openclaw status确认。2. 在AgentBoard设置中检查URL(如 ws://127.0.0.1:18789)。3. 尝试 curl -v http://<网关IP>:18789/health测试连通性。 |
| 设备配对失败 | 首次连接新设备需要授权。 | 1. 在AgentBoard弹出的配对指南中复制设备ID。 2. 在网关机器上运行 openclaw devices approve <设备ID>。3. 返回AgentBoard点击“重试连接”。 |
| 聊天消息发送失败 | WebSocket连接已断开或令牌失效。 | 1. 检查顶部连接状态指示器。 2. 尝试重新启动AgentBoard应用。 3. 检查网关日志,查看是否有认证错误。 |
6.2 数据与显示问题
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 看板不更新 | 1. Beads文件监视器未启动。 2. 项目路径未正确配置。 | 1. 确认项目目录下有.beads/issues.jsonl文件。2. 尝试在终端手动修改该文件,看应用是否响应。 3. 检查 ~/.agentboard/config.json或UI设置中的项目路径是否正确。 |
| 会话监控为空 | 1.tmux不可用或会话名不匹配。2. OpenClaw网关未启动编码会话。 | 1. 在终端运行tmux ls,查看是否有OpenClaw创建的会话(名称通常含openclaw或coding)。2. 确认网关配置中编码代理的 session_runner配置为tmux。3. 检查AgentBoard是否有权限访问当前用户的 tmux会话。 |
| 画布无法渲染Diff/Mermaid | 1. Git命令执行失败。 2. 网络阻止加载Mermaid JS库。 | 1. 确认项目是一个有效的git仓库。 2. 对于Mermaid,画布需要联网加载CDN上的库,检查网络连接。 |
6.3 性能与使用技巧
- 快捷键是效率核心:尽快熟记核心快捷键(
Cmd+1~4切换标签页,Cmd+N新建Bead,Cmd+L聚焦聊天)。这能让你手不离键盘,保持流畅操作。 - 合理使用分屏模式:默认的60/40分屏模式是最佳工作布局。你可以将重要的代码Diff固定在画布左侧,同时在右侧聊天区持续给AI反馈。
- 利用Epic进行任务分解:面对一个复杂需求,不要直接扔给AI一个庞大的Bead。先在AgentBoard创建一个Epic,然后让AI(或你自己)将其分解为多个具体的子任务Bead。这样看板上的进度条能给你清晰的全局概览。
- “Nudge”功能的使用时机:当会话监控中某个会话长时间显示“空闲”(黄灯),且其终端视图停留在某个命令行提示符时,才使用“Nudge”。不要滥用,否则可能打断AI的正常思考过程。
- 历史视图用于复盘:在一天工作结束时,打开历史视图,按时间线回顾所有Bead状态变更、会话启动/完成和git提交记录。这是复盘AI工作效率、发现问题模式的宝贵工具。
这个工具彻底改变了我与AI协作的方式,从被动的、碎片化的响应,转变为主动的、全局化的 orchestration(编排)。它带来的不仅是窗口管理的便利,更是一种工作范式的转变——你不再是多个工具的使用者,而是整个AI开发团队的指挥中心。
