[控场AI]
· 5 分钟阅读· 2,654 字

在Mac上无人值守运行Claude Code与Codex:手机即可控制的自主任务队列

在Mac上无人值守运行Claude Code与Codex:手机即可控制的自主任务队列

Untether 用任务队列、git worktree 隔离和 tmux 持久会话,让 AI 编程代理无人值守地自主运行。

Untether 是开发者针对“必须守在终端前”这一痛点构建的无人值守 AI 编程代理系统。用户将任务一次性排入队列,代理依次在独立的 git worktree 中执行构建、测试和合并;失败任务会被自动打回,避免污染主干代码。所有会话运行在 Mac 上真实的 tmux 会话中,关闭浏览器或手机断网都不会中断工作。手机端可查看任务队列、实时终端和代码变更,并通过 Tailscale 私有网络连接 Mac,不暴露公网。项目基于 MIT 协议的 VibeTunnel 分支构建,服务端用 Node/TypeScript,含 Rust 终端捕获组件和 Swift Mac 应用,目前尚未公开。

为什么需要无人值守的AI编程代理

大多数AI编程代理在95%的工作时间里不需要人类介入,但开发者仍然不得不守在终端前,以防某个任务完成或卡住。Reddit上一位开发者(项目代号Untether)的困扰很有代表性:他全天在Mac上运行Claude Code和Codex,却始终被"是否需要看一眼终端"这件事束缚。他的解法是把任务队列、自动构建测试、自动合并和手机远程控制整合成一个系统,让代理在本地环境中自主运行。

Reddit原帖截图

这个方案的核心思路并不复杂:把任务一次性排入队列,让代理依次执行,每个任务在独立的git worktree中完成构建、测试和合并。如果某个任务破坏了构建,它会被自动打回,不会污染后续任务。检查通过后自动合并(也可以设置为等待人工确认)。所有会话都是Mac上真实的tmux会话,因此具有持久性——关闭浏览器、丢失信号或收起手机都不会中断工作,重新连接后状态完全保留。

任务队列如何自主运转

从排队到合并的闭环

根据原帖描述,用户只需提供任务列表,例如"为API添加限流"或"为结账流程编写测试",系统就会逐个执行。每个任务拥有自己的git worktree,这意味着任务之间不会互相干扰。构建和测试失败的任务会被送回,确保下一个任务不会落在已损坏的代码基础上。检查通过后系统自动合并,用户也可以配置为需要手动批准。

这种设计解决了一个关键痛点:代理并行工作时,代码冲突和构建破坏是常见问题。通过worktree隔离和"失败即打回"的机制,队列能够保持主干代码的稳定性。

git worktree 是 Git 提供的一项机制,允许在同一个仓库上同时检出多个工作目录,每个目录可以位于不同分支或提交。与 git clone 不同,worktree 共享同一份 .git 对象数据库,因此创建和切换的开销很小。在 AI 代理场景中,为每个任务分配独立 worktree 意味着代理可以并行修改代码而不互相覆盖,构建和测试也在隔离的环境中进行。即使某个任务失败或产生脏数据,也只需丢弃对应 worktree,主干分支和后续任务不受影响,这也是“失败即打回”能够成立的基础。

持久化与推送通知

每个会话运行在Mac上真实的tmux会话中,而不是临时性的云沙箱。关闭浏览器或手机断网都不会影响代理继续工作。任务完成时,用户会收到推送通知,因此只需在有进展时查看。这一点很重要——无人值守不等于完全放手,而是把"持续盯屏"变成"事件驱动"的检查。

tmux 是一个终端复用器,它把终端会话与用户当前的连接解耦:会话在后台持续运行,用户断开 SSH、关闭浏览器或切换设备后,重新 attach 即可恢复完整状态。文章强调“真实的 tmux 会话”而非云沙箱,关键在于 tmux 运行在开发者本机,代理进程可以直接访问本地数据库、环境变量和开发服务器,同时具备断线可恢复的持久性,这与临时性容器有本质区别。

手机作为控制面板

所有操作都能在手机上完成:查看任务队列、查看每个代理的实时终端、查看代码变更、启动新任务、在运行中途介入。系统与Claude Code和Codex都兼容,并且运行在开发者真实的本地环境中(包括数据库、环境变量和开发服务器),而非云端沙箱。

手机与Mac之间的连接通过Tailscale实现,两者处于私有网络,外加一层登录验证,没有任何内容暴露在公网上。这种设计在便利性和安全性之间取得了平衡——开发者不需要配置端口转发或公网IP,就能实现远程控制。

Tailscale 是基于 WireGuard 协议构建的网状 VPN,它让不同设备在无需端口转发或公网 IP 的情况下组成一个私有网络。每台设备获得一个稳定的私有 IP,流量端到端加密,只有同一 tailnet 内的设备可以互相访问。对于 Untether 这类远程控制场景,Tailscale 把 Mac 和手机放进同一个虚拟局域网,再叠加应用层登录验证,从而避免将终端服务直接暴露在公网上,显著缩小攻击面。

技术架构:站在VibeTunnel肩上

Untether是VibeTunnel(MIT协议)的一个分支。VibeTunnel解决了最难的部分:把终端输出送入浏览器。服务端使用Node/TypeScript,有一个小型Rust组件负责捕获终端输出,Mac端则有一个Swift应用。开发者在原有基础上增加了任务队列、合并流水线、移动端UI和面向代理的工作流。

这个架构选择值得注意:它没有从零构建终端流式传输,而是复用了一个成熟的开源项目。对于想要构建类似工具的开发者来说,这种"复用底层+自建工作流"的策略可以显著降低开发成本。目前Untether尚未公开,但作者计划很快开源。

VibeTunnel 是一个开源项目,目标是把本地终端会话通过浏览器呈现,使开发者可以在任意设备的浏览器中访问 Mac 上的 shell。其架构通常包括一个负责捕获 PTY(伪终端)输出的本地组件、一个负责转发和 WebSocket 通信的服务端,以及一个 macOS 原生外壳应用。终端输出流式传输涉及低延迟编码和会话管理,是这类工具技术难度最高的部分,因此 Untether 选择直接复用 VibeTunnel 而非重造轮子,把精力集中在任务队列和合并流水线等上层工作流上。

对AI编程工作流的启示

这个项目折射出一个趋势:AI编程代理的能力在增强,但围绕它们的"工作流基础设施"仍然原始。开发者目前大多在终端中手动管理代理,缺乏队列、隔离和自动合并的机制。Untether的尝试表明,当代理能够自主完成大量工作时,真正的瓶颈从"代理够不够聪明"转移到了"如何组织代理的工作"。

另一个值得关注的信号是移动端控制。当代理可以长时间自主运行,开发者就不需要被绑定在桌前。用手机查看进度、批准合并或介入异常,可能成为AI编程工具的标配交互方式。当然,这种模式也带来新的信任问题:自动合并意味着代码在无人审查的情况下进入主干,开发者需要根据项目风险决定是否启用自动批准。

作者在帖末向社区征集需求:你希望这个工具具备哪些目前没有的功能?这本身也说明,AI编程代理的周边工具仍处于早期探索阶段,最佳实践尚未形成。

#Claude Code#Codex#AI编程代理#任务队列#无人值守编程#VibeTunnel#Tailscale#自动合并
分享:

相关推荐