Agent-Manager:统一管理多个 AI 编程助手的终端工具
开源 Tmux TUI 工具,可在一个终端界面同时运行和管理 Claude Code、Codex 和 OpenCode。
开源 Tmux TUI 工具,可在一个终端界面同时运行和管理 Claude Code、Codex 和 OpenCode。
从一个终端运行每个 AI 编码 Agent。Claude Code、Codex、OpenCode 和 Grok 并行运行,每个在自己的 tmux session 中,所以即使你退出管理器,它们也会继续工作。
你无需在终端标签页之间切换来查看哪个 Agent 完成了、哪个卡住了,每个 session 都会显示在一个列表中,带有实时状态,分组成可折叠和重新排序的项目树。你可以不附加到 session 直接与任何一个交互:按空格键直接向 session 的窗格发送 prompt,或在选定的分组中生成新 Agent。已停止的 session 可以用 v 从中断的地方恢复。按 ctrl+r 打开 Agent 修改内容的完整文件 diff,支持语法高亮,在某一行写的注释会直接返回到 Agent 的窗格。
状态检测开箱即用支持 Claude Code、OpenCode、Codex 和 Grok Build。任何其他 CLI 工具都可以作为 session 运行;添加 [tools.<name>] 块和状态规则可为其获得实时状态(见配置)。
brew install yoanwai/tap/agent-manager
如果缺少 tmux,会一起安装。该 tap 提供了一个 cask,所以从旧公式升级时,运行 brew uninstall agent-manager 后再执行上述命令。
curl -fsSL https://raw.githubusercontent.com/YoanWai/agent-manager/main/install.sh | sh
下载你的平台的最新版本,根据发布的校验和验证,并安装到 ~/.local/bin。设置 AGENT_MANAGER_INSTALL_DIR 来改变安装目录,设置 AGENT_MANAGER_VERSION 来固定版本。用自己的包管理器安装 tmux。
yay -S agent-manager-bin
AUR 中的 agent-manager-bin 安装发布版二进制,并拉入 tmux 和 git。
mise use -g ubi:YoanWai/agent-manager
直接读取 GitHub release,所以不需要注册表条目。用自己的包管理器安装 tmux。
go install github.com/YoanWai/agent-manager@latest
需要 Go 1.26+ 和 tmux 3.0+;安装到 $(go env GOPATH)/bin。
下载 macOS 和 Linux 的版本(amd64/arm64)。
agent-manager 运行在 tmux 上,tmux 是 Linux/macOS 工具。在 WSL shell 中,用上述 install script、Homebrew 安装,或从 Releases 获取 Linux 二进制。
管理器每天检查一次 GitHub Releases,当有新版本时在标头显示 ↑ vX.Y.Z available 徽章。用你安装时的方式拉入它:
brew upgrade yoanwai/tap/agent-manager # Homebrew
curl -fsSL https://raw.githubusercontent.com/YoanWai/agent-manager/main/install.sh | sh # Install script
mise upgrade --bump ubi:YoanWai/agent-manager # mise
go install github.com/YoanWai/agent-manager@latest # Go
agent-manager
Session 运行在 tmux 内(am_* 命名空间),所以即使管理器退出也能存活。在 session 内,Ctrl+Q 会脱离回到管理器。agent-manager --version 打印版本号。
按空格键在侧边栏底部停靠一个 prompt 栏。当栏打开时目标跟随光标(↑↓ 仍然导航):
在 session 行上,按 enter 直接将输入的文本发送到 session 的窗格,Agent 会将其作为用户消息接收,你无需附加。该栏保持打开并清空,准备好接收下一个回复。
在分组行上,按 enter 使用该分组的默认路径在该分组中生成新 Agent,并嵌入 prompt。生成工具从设置(s)的默认值开始,按 tab 可在工具间循环(claude ↔ opencode ↔ 任何已配置的工具);底部显示当前选择。Agent 立即开始处理 prompt。
按 esc 关闭栏。新 session 表单的可选 prompt 字段也以相同方式启动 Agent;CLI 接受 flag 形式的 prompt 的工具用 prompt_flag 声明(见配置)。
没有自定义名称的 session(每个快速生成的,以及名称留空的表单)会获得像 claude-a1b2 这样的占位符,其第一个 prompt 会要求 Agent 运行 agent-manager rename "<name>" 一次,用简短的名称命名该 session,说的是该功能的宽泛特性(不是单个子任务)。该指令还告诉 Agent 除非你要求,否则不要再次重命名。当第一个 prompt 无法承载该指令时(一个 /slash 命令,或根本没有 prompt),管理器会在该工具的输入框出现在窗格中后作为自己的消息发送它。该子命令将名称写入每个 session 的文件;管理器在下次轮询时读取它,更新侧边栏行和 tmux 状态栏。这适用于任何工具,因为只需要 Agent 读取其 prompt 并运行一个 shell 命令。
你自己命名的 session 会保留该名称:第一个 prompt 只是说明 agent-manager rename 稍后可用(如果你要求),不会指示 Agent 现在重命名。你也可以稍后要求一个 Agent 重命名其 session,或从 session 内的 shell 自己运行 agent-manager rename。
session 的工作目录常常是一个保存多个仓库的伞形文件夹,所以审查只能猜测 Agent 指的是哪一个。知道自己在哪个仓库工作的 Agent 可以通过在其 session 内的 shell 运行 agent-manager review-repo <path> 来说明。该子命令检查该路径是否是(或位于)一个 git 仓库,将其解析为仓库根,并将其写入每个 session 的文件;管理器在下次轮询时读取它,下次打开审查时在那个仓库上打开。不在 git 仓库内的路径被拒绝,所以声明总是事实而非猜测。
一个 Agent 也可以通过在其工作树内运行 agent-manager review-base <ref> 来声明其分支相对于什么进行比较:ref 在该仓库中验证,每个 session 和仓库存储,"vs target"范围之后会使用它。agent-manager review-base --clear 返回到自动检测。已存储但停止解析的 ref 在审查中显示为错误,按 B 打开目标选择器(仓库的分支加一个自动条目)来手动设置或清除它。
Agent 通常在 git worktree 中工作,每个分支一个 worktree,这些 worktree 可以位于磁盘上的任何地方。一个在 worktree 根的声明路径无论位于何处都会被接受,所以一个 review-repo 调用既命名了仓库又命名了待审查的分支。审查按固定顺序解析其目标:你用 r 或 b 手动选择的仓库优先(只要管理器在运行),然后是 Agent 声明的仓库,最后是排序(脏工作树优先,然后是最近提交)。当选择或声明的路径不再是 git 仓库时,审查在状态行中说明,r 在那里用来选择正确的。
管理器生成或恢复的每个 session 都携带 agent-manager MCP server,所以支持 MCP 的 Agent 将 rename、review_repo 和 review_base 视为本地工具,其描述告诉它们何时调用每一个:无 prompt injection,无每个项目的设置。该 server 位于同一二进制中(agent-manager mcp, stdio)并通过其环境识别调用的 session。
注册是按工具的。内置的 claude、codex、opencode 和 grok 工具自动注册:claude 获得一个生成的 --mcp-config 文件,codex 获得 -c mcp_servers... 覆盖,opencode 获得一个 OPENCODE_CONFIG 合并文件,grok 在其第一次启动时获得一个一次性的 grok mcp add --scope user 条目。自定义工具用其配置部分的 mcp = "<style>" 选入,或用 mcp = "none" 选出。CLI 子命令在任何地方都能工作,无论有无 MCP。
按 session 上的 ctrl+r 打开其仓库的全屏审查:左边是修改的文件和 +/− 计数,右边是完整的文件、语法高亮和带着色的修改行,所以每个编辑都能在完整的上下文中读取。方向键和 ctrl+d/ctrl+u 滚动文件,g/G 跳到顶部和底部,J/K(或 tab/shift+tab)切换文件,n/N 在修改之间跳转,u 切换统一视图和并排视图,s 循环范围(未提交、vs 目标、最后一次提交、已暂存),space 标记文件已审查。当工作目录有多个仓库时,r 打开一个你可以过滤的选择器,b 按分支名列出当前仓库的 worktree,所以你能用一个按键审查另一个分支。B 选择目标(merge-into 分支),"vs target"范围对其进行比较。标头中每个可改变的值都有自己的键,所以范围、布局、仓库和目标 pill 一目了然地读作 s、u、r、B 图例。当 Agent 继续编辑时,diff 会刷新。
在一行上按 c 来写注释;C 将每个注释展平为一个审查 prompt 并直接发送到 Agent 的窗格,所以 Agent 开始处理你的笔记,而你观看 diff 更新。esc 关闭审查。
分组是路径(backend/api/auth),形成无限深度的树。Session 可以位于任何节点,包括根。用 g 内联创建子分组,用 K / J(或 shift+↑↓;顺序保留)重新排序分组和 session,用 f 折叠子树,用 e 隐藏或视觉上恢复空分组,用 r 编辑分组的名称和默认路径。在 session 上,r 重命名它,按 tab 循环工具(状态规则和恢复遵循新工具;当你在窗格中退出一个 Agent 并启动另一个时很有用)。
轮询每个 session 的 tmux 窗格(默认每 2 秒)来推导状态:
每一行都内联显示其状态和工具,一个折叠的分组为每个状态保留计数,所以一个折叠的子树仍然告诉你是否有任何东西需要你。选择一个 session 在右侧显示其窗格的尾部,这是一个等待的 Agent 的实际问题如何到达你而无需附加。
检测按可见窗格匹配每个工具的正则规则,分析最新的转向以区分完成和等待,并将流式输出(轮询之间的内容变化)视为工作中。一个没有任何转向总结行的转向仍会解析:当一个工作窗格变安静时,转向算作完成,或当它在一个问题上结束时等待。当你在 session 内时轮询继续运行,所以状态保持实时。所选 session 的窗格尾部在预览面板中呈现,移动光标会立即获取预览。
对于 Claude Code,状态来自 hook 事件而不是窗格猜测:session 以生成的 --settings 文件启动,其 hook 将生命周期状态(working、waiting、finished、idle)写入管理器读取首先的每个 session 状态文件。窗格规则仍会细化它——hook 无法看到纯文本问题、Esc 中断或错误行,所以匹配的窗格判断会升级 hook 状态——当 hook 文件缺失或过时时它们完全接管。用 status_source = "claude-hooks" 按工具启用。
标头显示舰队总结:按状态的 session 计数,加 Agent 总使用量:cpu N% · ram M% · X GB,用于每个实时 Agent 的完整进程树(shell、Agent 和子进程)。CPU 是该树在最后一次轮询内的 CPU 时间,作为总机器容量的份额(与电脑仪表相同的 0–100% 单位)。RAM 是驻留集作为已安装内存的份额,旁边有绝对大小。所选 session 的详细行为该 session 单独使用相同的刻度。
会话面板中的 Computer 块显示机器仪表:
CPU: 整机利用率 (0-100%)
Memory: 已用/总量。在 macOS 上这与 Activity Monitor 的 Memory Used 匹配(驻留 RAM 减去空闲、推测和可回收文件缓存)。在 Linux 上它是 Total - MemAvailable,所以文件缓存不算作已用。
Swap: 当前 swap 分配的已用/总量(已用/总量 * 100)。在 macOS 上 swap 文件在压力下增长,所以分母是来自 vm.swapusage 的活大小,不是固定分区。
Disk: 根文件系统的填充率(已用 / (已用 + 可用)),可用空间来自内核的可用数字
Network: 实际 NIC 上的上/下速率(环回、utun、网桥和类似虚拟接口被排除)
按 s 打开设置,其中 ↑↓ 在字段间移动,←→ 改变聚焦的字段。
九个调色板附带:classic、solarized dark、catppuccin mocha、tokyo night、gruvbox dark、nord、dracula、rosé pine 和 monochrome。名称旁的色板条预览调色板,主题在你切换时应用,所以选择器是整个 UI 的实时预览。管理器也将终端的自己的背景与调色板匹配,所以窗口与其无接缝,并在退出时恢复终端的背景。你的选择与其他状态一起保存并在下次运行时恢复。
配置位于你的 OS 用户配置目录(macOS 上是 ~/Library/Application Support/agent-manager/config.toml,Linux 上是 ~/.config/agent-manager/config.toml)并在首次运行时创建,为 Claude Code、OpenCode、Codex 和 Grok Build 提供有效的默认值。
顶级:poll_interval(默认 "2s")设置窗格被轮询的频率,用于状态、预览和统计信息。
添加任何 CLI 工具作为 [tools.<name>] 块:
[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 运行来恢复已死 session 的东西(例如 claude --continue 在原地恢复对话);status_source = "claude-hooks" 将状态切换到 Claude Code hook 事件(见状态)。
prompt_flag 控制新 session 表单的可选 prompt 如何嵌入到启动命令中。接受 prompt 作为位置参数的工具(Claude Code: claude 'the prompt')将其留空;其位置参数意思别的工具声明该标志(OpenCode: prompt_flag = "--prompt",因为其位置参数是项目路径)。prompt 仅形成启动命令;revive (v) 使用 revive_command 不变。
状态存储在配置旁边的 state.db(SQLite)中。
go test ./... # includes end-to-end tests against a real tmux server
go run .
Bug 报告、特性想法和 pull request 欢迎。见 CONTRIBUTING.md 了解设置和 CI 运行的检查。值得分享的问题和设置去 Discussions。安全报告通过私密顾问进行;见 SECURITY.md。