Agent-Manager:一款用于运行Claude Code、Codex和OpenCode的Tmux TUI

Hacker News Top 工具

摘要

Agent-Manager 是一款基于 Tmux 的 TUI,可让您在单独的 tmux 会话中并排运行和监控多个 AI 编码代理(Claude Code、Codex、OpenCode 等),支持实时状态、快速提示和差异审查。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/30 13:49

YoanWai/agent-manager 来源:https://github.com/YoanWai/agent-manager # Agent Manager CI (https://github.com/YoanWai/agent-manager/actions/workflows/ci.yml) 发布 (https://github.com/YoanWai/agent-manager/releases/latest) 平台 Go 版本 许可证 agent-manager 演示版 从同一个终端运行所有 AI 编码 agent。Claude Code、Codex、OpenCode 和 Grok 可以并排运行,每个都在自己的 tmux 会话中,因此即使你退出管理器,它们也能继续工作。无需在终端标签中查找哪个 agent 已完成、哪个卡住,所有会话都会显示在一个列表中,带有实时状态,并按可折叠和可重新排序的项目树分组。你无需附加即可回答任何 agent:按 space 将提示直接发送到会话的窗格中,或在所选组中生成新的 agent。按 v 可以使死掉的会话从离开的位置恢复。按 ctrl+r 可以打开 agent 所做的全文件差异视图,支持语法高亮,你在某行留下的注释会直接发回到 agent 的窗格。 ## 支持的工具 状态检测目前原生支持 Claude Code、OpenCode、Codex 和 Grok Build。任何其他 CLI 工具都可以作为会话运行;你可以添加一个带有状态规则的 [tools.] 块来使其具有实时状态(参见 配置)。 ## 安装 ### Homebrew (macOS / Linux) bash brew install yoanwai/tap/agent-manager 如果缺少 tmux,会一并安装。 ### Go bash go install github.com/YoanWai/agent-manager@latest 需要 Go 1.26+ 和 tmux;安装到 $(go env GOPATH)/bin。 ### 预构建二进制文件 从 Releases (https://github.com/YoanWai/agent-manager/releases) 下载(macOS 和 Linux,amd64/arm64)。 ### Windows 在 WSL2 (https://learn.microsoft.com/windows/wsl/install) 中运行:agent-manager 依赖于 tmux,这是一个 Linux/macOS 工具。在 WSL shell 中,使用 Homebrew 安装,或从 Releases 获取 Linux 二进制文件。 ### 更新 管理器每天检查一次 GitHub Releases,当有新版本可用时,会在标题中显示 ↑ vX.Y.Z 可用 标记。按你安装的方式拉取更新: bash brew upgrade yoanwai/tap/agent-manager # Homebrew go install github.com/YoanWai/agent-manager@latest # Go ## 用法 bash agent-manager 会话在 tmux 内部运行(am_* 命名空间),因此它们会在管理器退出后继续存在。在会话中,按 Ctrl+Q 可以分离回管理器。 agent-manager --version 打印版本。 ### 按键 | 按键 | 动作 | |——|——| | n | 新建会话(名称、工具、目录、可选的起始提示、组选择器) | | g | 新建组(名称、父组、默认路径) | | enter | 附加会话 / 折叠组 | | ctrl+q | 在会话中:返回管理器 | | K / J (或 shift+↑ / shift+↓) | 在可见同级中重新排序会话或组 | | m | 将会话移动到另一个组 | | r | 重命名会话 / 编辑工具;编辑组名称和默认路径 | | v | 复活死掉的会话(revive_command,例如 claude --continue 恢复对话) | | a / u | 归档 / 恢复会话,或组及其整个子树 | | d | 删除会话,或组及其整个子树 | | space | 快速提示:回答选中的会话,或在选中的组中生成 agent | | ctrl+r | 查看选中的会话的更改:全屏全文件差异,行注释发送给 agent | | f | 折叠 / 展开组 | | s | 设置(快速生成工具、主题、查看布局) | | t | 切换归档视图 | | e | 隐藏 / 显示空组 | | / | 搜索 | | ? | 帮助 | | q | 退出(会话继续运行) | ### 快速提示 按 space 可以在侧边栏底部停靠一个提示栏。当该栏打开时,目标跟随光标(↑↓ 仍然可以导航): - 在会话行上,按 enter 将输入的文本直接发送到会话的窗格中,这样 agent 会将其作为用户消息接收,而你无需附加。该栏保持打开并清空,准备下一次回答。 - 在组行上,按 enter 会在该组中使用嵌入的提示生成一个新的 agent,并使用组的默认路径。生成工具从设置(s)默认值开始,按 tab 可以在其中循环(claude ↔ opencode ↔ 任何配置的工具);页脚显示当前选择。agent 会立即开始处理提示。 按 esc 关闭该栏。新建会话表单中的可选 prompt 字段也可以类似地启动一个 agent;其 CLI 通过标志接收提示的工具需要声明 prompt_flag(参见 配置)。 ### 自命名会话 未指定自定义名称生成的会话(每次快速生成以及名称留空的表单)会得到一个类似 claude-a1b2 的占位符,它们的第一个提示会要求 agent 运行 agent-manager rename "" 一次,为会话的主要功能(而不是单个子任务)提供一个简短名称。该指令还告诉 agent 除非你要求,否则不要再次重命名。当第一个提示无法携带指令(/slash 命令或没有提示)时,管理器会将该指令作为独立消息发送,一旦工具的输入框出现在窗格中。子命令会将名称写入每个会话的文件中;管理器在下一次轮询时获取并更新侧边栏行和 tmux 状态栏。 这适用于任何工具,因为它只需要 agent 读取其提示并运行一个 shell 命令。你自己命名的会话会保留该名称:第一个提示只会说明如果你要求,agent-manager rename 可用,而不会指示 agent 立即重命名。你仍然可以稍后要求 agent 重命名其会话,或者从会话内部的 shell 中自己运行 agent-manager rename。 ### 声明正在审查的仓库 会话的工作目录通常是一个包含许多仓库的顶层文件夹,因此审查只能猜测 agent 指的是哪个。知道自己在哪个仓库工作的 agent 可以通过从会话内部的 shell 运行 agent-manager review-repo <路径> 来声明。子命令会检查该路径是否(或位于)一个 git 仓库内,将其解析为仓库根目录,并写入每个会话的文件中;管理器在下一次轮询时获取,下次你打开审查时,审查会基于该仓库进行。如果路径不在 git 仓库内,则会被拒绝,因此声明始终是事实而非猜测。 Agent 还可以通过从工作目录内运行 agent-manager review-base <ref> 来声明其分支差异的目标:该引用会在该仓库中验证,按会话和仓库存储,之后“vs target”范围会使用它。agent-manager review-base --clear 可以恢复自动检测。如果存储的引用无法解析,审查中会显示为错误,按 B 可以打开目标选择器(仓库的分支加上 auto 条目)来手动设置或清除。 Agent 通常使用 git worktree 工作,每个 worktree 一个分支,这些 worktree 可以位于磁盘上的任何位置。如果声明的路径是 worktree 根目录,无论它在哪里都会被接受,因此一次 review-repo 调用同时命名了仓库和正在审查的分支。审查按固定顺序解析其目标:你手动用 r 或 b 选择的仓库在管理器运行期间一直有效,然后是 agent 声明的仓库,最后是排名(脏工作目录优先,然后是最新提交)。当选定或声明的路径不再是 git 仓库时,审查会在状态行中说明,r 可以用于选择正确的仓库。 ### MCP:agent 如何发现这些命令 管理器生成或复活的每个会话都携带 agent-manager MCP 服务器,因此支持 MCP 的 agent 会将 rename、review_repo 和 review_base 视为原生工具,并带有描述,告诉它们何时调用每个工具:无需提示注入,无需每个项目设置。 服务器位于同一个二进制文件中(agent-manager mcp,stdio),并通过环境识别调用会话。注册按工具进行。内置的 claude、codex、opencode 和 grok 工具会自动注册:claude 获得生成的 --mcp-config 文件,codex 获得 -c mcp_servers... 覆盖,opencode 获得 OPENCODE_CONFIG 合并文件,grok 在首次启动时获得一次性的 grok mcp add --scope user 条目。自定义工具通过在其配置块中设置 mcp = "" 选择加入,或通过设置 mcp = "none" 选择退出。CLI 子命令无论是否有 MCP 都可以正常工作。 ### 差异审查 按 ctrl+r 可以打开一个会话仓库的全屏审查:左侧是带有 +/− 计数的已更改文件,右侧是完整的文件,带有语法高亮和变更行着色,因此每个编辑都在完整上下文中显示。箭头键和 ctrl+d/ctrl+u 滚动文件,g/G 跳转到顶部和底部,J/K(或 tab/shift+tab)切换文件,n/N 在变更之间跳转,u 在统一和并排视图之间切换,s 循环范围(未提交、vs target、上次提交、暂存),space 将文件标记为已审查。 当工作目录包含多个仓库时,按 r 打开一个选择器,你可以输入进行过滤,按 b 列出当前仓库按分支名称排列的 worktree,因此你可以一键审查另一个分支。按 B 选择目标(合并到的分支),“vs target”范围与其比较。 标题中每个可更改的值都带有自己的按键,因此范围、布局、仓库和目标标签在外观上分别显示为 s、u、r、B 的图例。 差异会在 agent 继续编辑时刷新。 并排审查,在完整文件上下文中以着色显示变更行 按 c 可以在某行上写注释;按 C 会将所有注释合并成一个审查提示,直接发送到 agent 的窗格中,因此 agent 会开始处理你的注释,同时你可以观看差异更新。按 esc 关闭审查。 差异审查演示 ### 组 组是路径(backend/api/auth),形成无限深度的树。会话可以位于任何节点,包括根节点。使用 g 内联创建子组,使用 K / J(或 shift+↑↓;顺序会持久化)重新排序组和会话,使用 f 折叠子树,使用 e 在视觉上隐藏或恢复空组,使用 r 编辑组的名称和默认路径。在会话上,按 r 可以重命名它,按 tab 可以循环工具(状态规则和复活遵循新工具;当你在窗格中退出一个 agent 并启动另一个时很有用)。 ### 状态 每个会话的 tmux 窗格会被轮询(默认每 2 秒一次)以推导出状态: | 状态 | 含义 | |——|——| | working | Agent 正在忙于一次回合 | | waiting | 等待你:对话框、权限请求或纯文本问题 | | finished | 回合结束 — 一个警报,一旦你进入会话就会清除为 idle | | errored | 工具报告了错误 | | idle | 没有运行任何内容 | | dead | tmux 会话已消失 | 会话树,带有等待中的 agent 的权限提示预览 每行都带有其状态和工具内联,折叠的组会按状态保留计数,因此折叠的子树仍然能告诉你是否有需要你处理的事项。选中一个会话会在右侧显示其窗格的尾部,这允许 waiting agent 的实际问题无需附加就能到达你。 检测会按工具的正则表达式规则与可见窗格文本进行匹配,分析最新的一轮以区分 finished 和 waiting,并将流式输出(轮询之间内容变化)视为 working。即使一轮结束没有回合摘要行,也会解析:当 working 窗格变得安静时,该轮计为 finished,如果在问题处结束则计为 waiting。 轮询在你进入会话时也会继续运行,因此状态保持实时。选中会话的窗格尾部会在预览面板中渲染,移动光标会立即获取预览。 对于 Claude Code,状态来自 hook 事件 (https://docs.anthropic.com/en/docs/claude-code/hooks),而不是窗格猜测:会话启动时带有生成的 --settings 文件,其 hooks 将生命周期状态(working、waiting、finished、idle)写入每个会话的状态文件中,轮询器会首先读取该文件。窗格规则仍然会细化它——hooks 无法看到纯文本问题、Esc 中断或错误行,因此匹配的窗格判定会升级 hook 状态——并且在 hook 文件缺失或过期时作为完全后备。按工具启用,使用 status_source = "claude-hooks"。 ### 统计 标题显示一个 fleet 摘要:每个状态的会话计数,以及 agents total usage: cpu N% · ram M% · X GB,基于每个活跃 agent 的完整进程树(shell、agent 和子进程)。CPU 是该进程树在上一次轮询期间的 CPU 时间占机器总容量的份额(与计算机仪表相同的 0–100% 单位)。RAM 是驻留集占已安装内存的份额,并附带绝对值。选中会话的详细信息行使用相同比例,仅针对该会话。 会话面板中的计算机块显示机器仪表: - CPU:整机利用率 (0-100%) - Memory:已用/总计。在 macOS 上,这与 Activity Monitor 的 Memory Used 一致(驻留 RAM 减去空闲、推测和可回收的文件缓存)。在 Linux 上,它是 Total - MemAvailable,因此文件缓存不计为已用。 - Swap:当前交换分配的使用量(已用/总计 * 100)。在 macOS 上,交换文件会在压力下增长,因此分母是来自 vm.swapusage 的实时大小,而不是固定分区。 - Disk:根文件系统的填充率(已用 / (已用 + 可用)),可用空间来自内核的可用数据。 - Network:仅实际网卡的上行/下行速率(排除回环、utun、桥接等类似虚拟接口)。 ### 主题 按 s 打开设置,使用 ↑↓ 在字段之间移动,使用 ←→ 更改聚焦的字段。 设置界面,带有主题选择器和调色板样本 提供了九种调色板:classic、solarized dark、catppuccin mocha、tokyo night、gruvbox dark、nord、dracula、rosé pine 和 monochrome。名称旁边的色条预览调色板,主题在你浏览时即应用,因此选择器是整个 UI 的实时预览。管理器还会将终端本身的背景与调色板匹配,因此窗口与终端之间没有接缝,并在退出时恢复终端的背景。你的选择会与状态的其他部分一起保存,并在下次运行时恢复。 ## 配置 配置文件位于你的操作系统用户配置目录中(macOS 上为 ~/Library/Application Support/agent-manager/config.toml,Linux 上为 ~/.config/agent-manager/config.toml),并在首次运行时创建,包含适用于 Claude Code、OpenCode、Codex 和 Grok Build 的工作默认值。 顶层:poll_interval(默认 "2s")设置轮询窗格状态、预览和统计的频率。 以 [tools.<name>] 块添加任何 CLI 工具: toml [tools.mytool] command = "mytool" default_status = "idle" rules = [ { state = "working", pattern = "esc to interrupt" }, { state = "errored", pattern = "(?im)^\\s*error:" }, ] 规则从上到下与可见窗格文本匹配;第一个匹配获胜,当没有匹配时应用 default_status。 可选的逐工具字段可以细化检测:activity_cutoff(正则,定位工具的输入框,其上的所有内容都是回合内容),turn_end(标记回合结束的回合摘要行),chrome_line、blocked_line 和 trailing_note。生成的配置中的 claude 和 opencode 块展示了所有这些字段的实际使用。 其他逐工具字段:revive_command 是 v 运行时用于复活死会话的命令(例如 claude --continue 在原地恢复对话);status_source = "claude-hooks" 将状态切换为 Claude Code hook 事件(参见 状态)。prompt_flag 控制新会话表单中的可选提示如何嵌入到启动命令中。将提示作为位置参数的工具(Claude Code:claude 'the prompt')留空;位置参数有其他含义的工具需要声明该标志(OpenCode:prompt_flag = "--prompt",因为其位置参数是项目路径)。提示仅影响启动命令;复活(v)使用 revive_command 原样执行。 状态与配置文件相邻存储在 state.db(SQLite)中。 ## 开发 bash go test ./... # 包括针对真实 tmux 服务器的端到端测试 go run . ## 许可证 MIT

相似文章

AgentManager

Product Hunt

AgentManager 是一款工具,可帮助您管理 Claude Code 会话,让您再也不会因等待输入而错过任何会话。

Tmux 与 Claude Code:会话、send-keys 与能力边界

Hacker News Top

介绍如何在 tmux 中配合 Claude Code 运行持久化、可脚本化的 AI 编码代理,涵盖内置的 `claude --worktree --tmux` 标志、会话组织模式、send-keys/capture-pane 脚本编写,以及 tmux 能力的边界所在。