raine/workmux
GitHub: raine/workmux
将 git worktrees 和终端窗口整合为隔离开发环境的工作流编排工具,实现零摩擦的多任务并行开发和 AI agent 管理。
Stars: 957 | Forks: 64
使用 git worktrees 在 tmux* 中进行并行开发
📖 文档 ·
安装 ·
快速开始 ·
命令 ·
更新日志
超级有主见、零摩擦的工作流工具,用于管理
[git worktrees](https://git-scm.com/docs/git-worktree) 和 tmux 窗口作为
隔离的开发环境。非常适合并行运行多个 AI agent 而不发生冲突。
**理念**:构建在你已经使用的工具之上。tmux/zellij/kitty 等用于窗口管理,git 用于 worktree,你的 agent 用于编码 —— workmux 负责编排其余部分。
\* 也支持
kitty,
WezTerm, 和
Zellij 作为替代
后端。
📚 请参阅 [完整文档](https://workmux.raine.dev/guide/) 获取指南和
配置参考。
📖 **workmux 新手?** 阅读
[介绍博客文章](https://raine.dev/blog/introduction-to-workmux/) 获取
快速概览。

## 为什么选择 workmux?
**并行工作流。** 同时处理多个功能或热修复,
每个都有自己的 AI agent。无需 stash,无需切换分支,没有冲突。
**每个任务一个窗口。** 一种自然的心理模型。每个都有自己的终端
状态、编辑器会话、开发服务器和 AI agent。上下文切换就是切换
标签页。
**自动化设置。** 新的 worktree 初始状态是破损的(没有 `.env`,没有 `node_modules`,
没有开发服务器)。workmux 可以在创建时复制配置文件、符号链接依赖项并运行
安装命令。
**一条命令清理。** `workmux merge` 处理完整的生命周期:合并
分支、删除 worktree、关闭 tmux 窗口、移除本地分支。
**终端工作流。** 基于你的终端设置构建,而不是另一个
明年就不存在的 agentic GUI。如果你还没有,tmux 可能值得
一试。
worktree 新手?请参阅 [为什么使用 git worktrees?](#why-git-worktrees)
## 功能
- 单条命令创建带有匹配 tmux 窗口的 git worktree (`add`)
- 单条命令合并分支并清理所有内容(worktree、tmux 窗口、分支)(`merge`)
- [仪表板](#workmux-dashboard) 用于监控 agent、审查更改和
发送命令
- 使用 `/worktree` skill [将任务委托给 worktree agent](#delegating-tasks-with-worktree)
- [在 tmux 窗口名称中显示 Claude agent 状态](#agent-status-tracking)
- 自动设置你偏好的 tmux 窗格布局(编辑器、shell、watchers、
等)
- 运行创建后钩子(安装依赖项、设置数据库等)
- 将配置文件(`.env`、`node_modules`)复制或符号链接到新的
worktree 中
- 在容器或 VM 中 [沙箱化 agent](#sandbox) 以增强安全性
- 使用 LLM [自动生成分支名称](#automatic-branch-name-generation) 从
提示词
- Shell 补全
## Hype
## 安装
### Bash YOLO
```
curl -fsSL https://raw.githubusercontent.com/raine/workmux/main/scripts/install.sh | bash
```
### Homebrew (macOS/Linux)
```
brew install raine/workmux/workmux
```
### Cargo
需要 Rust。如果你没有,请通过 [rustup](https://rustup.rs/) 安装。
```
cargo install workmux
```
### Nix
```
nix profile install github:raine/workmux
# 或者尝试不安装直接运行
nix run github:raine/workmux -- --help
```
请参阅 [Nix 指南](https://workmux.raine.dev/guide/nix) 了解 flake 和 home-manager
设置。
对于手动安装,请参阅
[预构建二进制文件](https://github.com/raine/workmux/releases/latest)。
## 快速开始
1. **初始化配置(可选)**:
workmux init
这将创建一个 `.workmux.yaml` 文件来自定义你的工作流(窗格布局、
设置命令、文件操作等)。workmux 开箱即用,具有
合理的默认值,因此此步骤是可选的。
2. **创建一个新的 worktree 和 tmux 窗口**:
workmux add new-feature
这将:
- 在
`
/../__worktrees/new-feature` 创建一个 git worktree
- 复制配置文件并符号链接依赖项(如果
[已配置](#file-operations))
- 运行任何 [`post_create`](#lifecycle-hooks) 设置命令
- 创建一个名为 `wm-new-feature` 的 tmux 窗口(前缀可配置)
- 设置你配置的或默认的 tmux 窗格布局
- 自动将你的 tmux 客户端切换到新窗口
3. **做你的事**
4. **完成并清理**
**本地合并:** 运行 `workmux merge` 以合并到基础分支并在
一步中清理。
**PR 工作流:** 推送并打开一个 PR。合并后,运行 `workmux remove`
进行清理。
## 配置
workmux 使用双层配置系统:
- **Global** (`~/.config/workmux/config.yaml`): 所有项目的个人默认值
- **Project** (`.workmux.yaml`): 项目特定的覆盖
项目设置覆盖全局设置。当你从子目录运行 workmux 时,它会
向上查找最近的 `.workmux.yaml`,允许
monorepo 的嵌套配置。请参阅
[Monorepos 指南](https://workmux.raine.dev/guide/monorepos#nested-configuration)
了解详情。对于 `post_create` 和文件操作列表(`files.copy`、
`files.symlink`),你可以使用 `""` 在
项目特定的值旁边包含全局值。其他设置如 `panes` 在
项目配置中定义时会完全替换。
### 全局配置示例
`~/.config/workmux/config.yaml`:
```
nerdfont: true # Enable nerdfont icons (prompted on first run)
merge_strategy: rebase # Make workmux merge do rebase by default
agent: claude
panes:
- command: # Start the configured agent (e.g., claude)
focus: true
- split: horizontal # Second pane with default shell
```
### 项目配置示例
`.workmux.yaml`:
```
post_create:
- ''
- mise use
files:
symlink:
- '' # Include global symlinks (node_modules)
- .pnpm-store # Add project-specific symlink
panes:
- command: pnpm install
focus: true
- command:
split: horizontal
- command: pnpm run dev
split: vertical
```
有关真实示例,请参阅
[workmux 自己的 `.workmux.yaml`](https://github.com/raine/workmux/blob/main/.workmux.yaml)。
### 配置选项
大多数选项都有合理的默认值。你只需要配置你想要
自定义的内容。
#### 基本选项
| Option | Description | Default |
| ---------------- | ---------------------------------------------------- | ----------------------- |
| `main_branch` | 要合并到的分支 | Auto-detected |
| `base_branch` | 新 worktree 的默认基础分支 | Current branch |
| `worktree_dir` | worktree 目录(绝对或相对) | `__worktrees/` |
| `window_prefix` | tmux 窗口/会话名称的前缀 | `wm-` |
| `mode` | Tmux 模式(`window` 或 `session`) | `window` |
| `agent` | `` 占位符的默认 agent | `claude` |
| `merge_strategy` | 默认合并策略(`merge`、`rebase`、`squash`) | `merge` |
| `theme` | 仪表板颜色主题(`dark`、`light`) | `dark` |
#### 命名选项
| Option | Description | Default |
| ----------------- | ------------------------------------------- | ------- |
| `worktree_naming` | 如何从分支派生名称 | `full` |
| `worktree_prefix` | worktree 目录和窗口的前缀 | none |
`worktree_naming` 策略:
- `full`: 使用完整的分支名称(斜杠变为破折号)
- `basename`: 仅使用最后一个 `/` 之后的部分(例如,`prj-123/feature` →
`feature`)
#### 窗格
使用 `panes` 数组定义你的 tmux 窗格布局。对于会话模式下的多个窗口,请使用 [`windows`](#multiple-windows-per-session) 代替(它们是
互斥的)。
```
panes:
- command:
focus: true
- command: npm run dev
split: horizontal
size: 15
```
每个窗格支持:
| Option | Description | Default |
| ------------ | -------------------------------------------------------------- | ------- |
| `command` | 要运行的命令(请参阅 [agent 占位符](#agent-placeholders)) | Shell |
| `focus` | 此窗格是否获得焦点 | `false` |
| `split` | 分割方向(`horizontal` 或 `vertical`) | — |
| `size` | 以行/单元格为单位的绝对大小 | 50% |
| `percentage` | 以百分比为单位的大小 (1-100) | 50% |
##### Agent 占位符
- ``: 解析为配置的 agent(来自 `agent` 配置或 `--agent`
标志)
内置 agent(`claude`、`gemini`、`codex`、`opencode`、`kiro-cli`、`vibe`)
当作为字面命令使用时会自动检测,并自动接收 prompt 注入
,无需 `` 占位符或匹配的 `agent`
配置:
```
panes:
- command: 'claude --dangerously-skip-permissions'
focus: true
- command: 'codex --yolo'
split: vertical
```
每个 agent 使用该 agent 的正确格式接收 prompt(通过 `-p`/`-P`/`-e`)。自动检测匹配可执行文件名称,无论标志或
路径如何。
#### 文件操作
新的 worktree 是干净的检出,没有 gitignored 文件(`.env`、
`node_modules` 等)。使用 `files` 自动复制或符号链接每个
worktree 需要的内容:
```
files:
copy:
- .env
symlink:
- .next/cache # Share build cache across worktrees
```
`copy` 和 `symlink` 都接受 glob 模式。
#### 生命周期钩子
在 worktree 生命周期的特定点运行命令,例如安装
依赖项或运行数据库迁移。所有钩子都以 **worktree
目录** 作为工作目录(或嵌套配置目录用于
[嵌套配置](https://workmux.raine.dev/guide/monorepos#nested-configuration))
运行,并接收环境变量:`WM_HANDLE`、`WM_WORKTREE_PATH`、
`WM_PROJECT_ROOT`、`WM_CONFIG_DIR`。
`WM_CONFIG_DIR` 指向包含所使用的 `.workmux.yaml` 的目录,这在使用嵌套配置时可能不同于 `WM_WORKTREE_PATH`。
| Hook | When it runs | Additional env vars |
| ------------- | ------------------------------------------------- | ------------------------------------ |
| `post_create` | worktree 创建后,tmux 窗口打开前 | — |
| `pre_merge` | 合并前(失败时中止) | `WM_BRANCH_NAME`, `WM_TARGET_BRANCH` |
| `pre_remove` | worktree 移除前(失败时中止) | — |
示例:
```
post_create:
- direnv allow
pre_merge:
- just check
```
#### Agent 状态图标
自定义 tmux 窗口名称中显示的图标:
```
status_icons:
working: '🤖' # Agent is processing
waiting: '💬' # Agent needs input (auto-clears on focus)
done: '✅' # Agent finished (auto-clears on focus)
```
设置 `status_format: false` 以禁用自动 tmux 格式修改
#### 默认行为
- 默认情况下,worktree 在 `__worktrees` 中创建,作为你项目的同级目录
- 如果没有定义 `panes` 配置,workmux 提供有主见的默认值:
- 对于有 `CLAUDE.md` 文件的项目:在第一个窗格中打开配置的 agent(请参阅
`agent` 选项),如果没有设置则默认为 `claude`。
- 对于所有其他项目:打开你的默认 shell。
- 两种配置都包括水平分割的第二个窗格
- `post_create` 命令是可选的,仅在你配置它们时运行
### 使用窗格自动设置
使用 `panes` 配置自动化环境设置。与
必须在 tmux 窗口打开之前完成的 `post_create` 钩子不同,窗格
命令在新窗口内立即执行。
这可用于:
- **安装依赖项**:在聚焦的窗格中运行 `npm install` 或 `cargo build` 以监控进度。
- **启动服务**:自动启动开发服务器、数据库容器或文件
监视器。
- **运行 agent**:使用特定上下文初始化 AI agent。
由于这些在标准 tmux 窗格中运行,你可以与它们交互(检查日志、
重启服务器),就像正常的终端会话一样。
在窗格命令中而不是 `post_create` 中运行依赖项安装(如 `pnpm install`)有一个关键优势:你可以在安装于后台运行时立即访问 tmux 窗口。使用 `post_create`,你必须等待安装完成窗口才会打开。这也
意味着 AI agent 可以在依赖项并行安装时立即在其窗格中开始
工作。
```
panes:
# Pane 1: Install dependencies, then start dev server
- command: pnpm install && pnpm run dev
# Pane 2: AI agent
- command:
split: horizontal
focus: true
```
### 目录结构
以下是 workmux 默认组织你的 worktree 的方式:
```
~/projects/
├── my-project/ <-- Main project directory
│ ├── src/
│ ├── package.json
│ └── .workmux.yaml
│
└── my-project__worktrees/ <-- Worktrees created by workmux
├── feature-A/ <-- Isolated workspace for 'feature-A' branch
│ ├── src/
│ └── package.json
│
└── bugfix-B/ <-- Isolated workspace for 'bugfix-B' branch
├── src/
└── package.json
```
每个 worktree 是不同分支的单独工作目录,都
共享同一个 git 仓库。这允许你同时处理多个分支
而不会发生冲突。
你可以使用 `worktree_dir` 配置选项自定义 worktree 目录位置(请参阅 [配置选项](#configuration-options))。
### Shell 别名(推荐)
为了更快地输入,将 `workmux` 别名为 `wm`:
```
alias wm='workmux'
```
## 令
- [`add`](#workmux-add-branch-name) - 创建一个新的 worktree 和 tmux 窗口
- [`merge`](#workmux-merge-branch-name) - 合并分支并清理所有内容
- [`remove`](#workmux-remove-name-alias-rm) - 移除 worktree 而不合并
- [`list`](#workmux-list) - 列出所有带有状态的 worktree
- [`open`](#workmux-open-name) - 为现有 worktree 打开 tmux 窗口
- [`close`](#workmux-close-name) - 关闭 worktree 的 tmux 窗口(保留
worktree)
- [`path`](#workmux-path-name) - 获取 worktree 的文件系统路径
- [`dashboard`](#workmux-dashboard) - 显示所有活动 agent 的 TUI 仪表板
- [`config edit`](#workmux-config-edit) - 编辑全局配置文件
- [`init`](#workmux-init) - 生成配置文件
- [`sandbox`](#workmux-sandbox) - 管理 sandbox 后端(container/Lima)
- [`claude prune`](#workmux-claude-prune) - 清理过时的 Claude Code 条目
- [`completions`](#workmux-completions-shell) - 生成 shell 补全
- [`docs`](#workmux-docs) - 显示详细文档
### `workmux add `
创建一个新的 git worktree 和匹配的 tmux 窗口,并立即切换到它。如果分支不存在,它将自动创建。
- ``: 要创建或切换到的分支名称,远程分支
引用(例如,`origin/feature-branch`),或 GitHub fork 引用(例如,
`user:branch`)。远程和 fork 引用会自动获取并
创建具有派生名称的本地分支。Fork 引用将本地分支派生为 `user-branch`(例如,`someuser:feature` 创建本地分支
`someuser-feature`)。使用 `--pr` 时可选。
#### 选项
- `--base `: 指定创建新分支时要从其分支的基础分支、提交或标签。覆盖 `base_branch` 配置。默认为
配置中的 `base_branch`,然后是当前检出的分支。
- `--pr `: 通过编号将 GitHub pull request 检出到新的
worktree 中。
- 需要安装并验证 `gh` 命令行工具。
- 本地分支名称默认为 PR 的 head 分支名称,但可以
覆盖(例如,`workmux add custom-name --pr 123`)。
- `-A, --auto-name`: 使用 LLM 从提示词生成分支名称。请参阅
[自动生成分支名称](#automatic-branch-name-generation)。
- `--name `: 覆盖 worktree 目录和 tmux 窗口名称。默认情况下,这些是从分支名称派生的(slug 化)。不能与
多 worktree 生成(`--count`、`--foreach` 或多个 `--agent`)一起
使用。
- `-b, --background`: 在后台创建 tmux 窗口而不切换到它。与 `--prompt-editor` 一起使用很有用。
- `-w, --with-changes`: 将未提交的更改从当前 worktree 移动到新的 worktree,然后将原始 worktree 重置为干净状态。当你开始在 main 上工作并想将分支移动到新的
worktree 时很有用。
- `--patch`: 交互式选择要移动的更改(需要 `--with-changes`)。打开交互式提示以选择要 stash 的块。
- `-u, --include-untracked`: 同时移动未跟踪的文件(需要 `--with-changes`)。默认情况下,仅移动已暂存和已修改的跟踪文件。
- `-p, --prompt `: 提供一个将自动传递给 AI agent 窗格的内联提示词。
- `-P, --prompt-file `: 提供文件路径,其内容将用作提示词。
- `-e, --prompt-editor`: 打开你的 `$EDITOR`(或 `$VISUAL`)以交互式编写提示词。
- `-a, --agent `: 用于 worktree 的 agent。可以
多次指定以为每个 agent 生成一个 worktree。覆盖你的配置文件中的 `agent`。
- `-W, --wait`: 阻塞直到创建的 tmux 窗口关闭。用于脚本编写,当你想等待 agent 完成其工作时。agent 可以通过运行 `workmux remove --keep-branch` 发出完成信号。
- `-o, --open-if-exists`: 如果分支的 worktree 已经存在,则打开它而不是失败。类似于 `tmux new-session -A`。当你不知道或不在乎 worktree 是否已经存在时很有用。
- `-s, --session`: 创建 tmux 会话而不是窗口。请参阅 [会话模式](#session-mode) 了解详情。
#### 跳过选项
这些选项允许你在不需要时跳过昂贵的设置步骤(例如,对于仅文档更改):
- `-H, --no-hooks`: 跳过运行 `post_create` 命令
- `-F, --no-file-ops`: 跳过文件复制/符号链接操作(例如,跳过链接 `node_modules`)
- `-C, --no-pane-cmds`: 跳过执行窗格命令(窗格改为打开普通 shell)
#### 发生什么
1. 通过 slug 化分支名称确定 worktree 的 **handle**(例如,`feature/auth` 变为 `feature-auth`)。这可以用 `--name` 标志覆盖。
2. 在 `/` 创建一个 git worktree(`worktree_dir` 是可配置的,默认为你项目的同级目录)
3. 运行任何配置的文件操作(复制/符号链接)
4. 如果已定义则执行 `post_create` 命令(在 tmux 窗口打开之前运行,所以保持它们快速)
5. 创建一个名为 `` 的新 tmux 窗口(例如,`wm-feature-auth`,`window_prefix: wm-`)
6. 设置你配置的 tmux 窗格布局
7. 自动将你的 tmux 客户端切换到新窗口
#### 示例
##### 基本用法
```
# 创建新分支和 worktree
workmux add user-auth
# 使用现有分支
workmux add existing-work
# 从特定 base 创建新分支
workmux add hotfix --base production
# 从远程分支创建 worktree(创建本地分支 "user-auth-pr")
workmux add origin/user-auth-pr
# 带斜杠的远程分支也可以(创建本地分支 "feature/foo"")
workmux add origin/feature/foo
# 在后台创建 worktree 而不切换到它
workmux add feature/parallel-task --background
# 为 worktree 目录和 tmux 窗口使用自定义名称
workmux add feature/long-descriptive-branch-name --name short
# 如果存在则打开现有 worktree,不存在则创建(幂等)
workmux add my-feature -o
```
##### 检出 Pull Request 和 Fork 分支
```
# 检出 PR #123。本地分支将以 PR 的分支命名。
workmux add --pr 123
# 使用自定义本地分支名检出 PR #456
workmux add fix/api-bug --pr 456
# 使用 GitHub 的 owner:branch 格式检出 fork 分支(从 GitHub UI 复制)
# 创建跟踪 fork 的本地分支 "someuser-feature-branch"
workmux add someuser:feature-branch
```
##### 将更改移动到新的 worktree
```
# 将未提交的更改移动到新的 worktree(包括未跟踪文件)
workmux add feature/new-thing --with-changes -u
# 仅移动已暂存/修改的文件(不包括未跟踪文件)
workmux add fix/bug --with-changes
# 交互式选择要移动的更改
workmux add feature/partial --with-changes --patch
```
##### AI agent 提示词
```
# 使用内联提示为 AI agents 创建 worktree
workmux add feature/ai --prompt "Implement user authentication with OAuth"
# 为特定 worktree 覆盖默认 agent
workmux add feature/testing -a gemini
# 使用文件中的提示创建 worktree
workmux add feature/refactor --prompt-file task-description.md
# 打开编辑器以交互式编写提示
workmux add feature/new-api --prompt-editor
```
##### 跳过设置步骤
```
# 跳过仅文档更改的繁重设置
workmux add docs-update --no-hooks --no-file-ops --no-pane-cmds
# 仅跳过文件操作(例如,您不需要 node_modules)
workmux add quick-fix --no-file-ops
```
##### 使用 --wait 编写脚本
```
# 阻塞直到 agent 完成并关闭窗口
workmux add feature/api --wait -p "Implement the REST API, then run: workmux remove --keep-branch"
# 在脚本中用于运行连续的 agent 任务
for task in task1.md task2.md task3.md; do
workmux add "task-$(basename $task .md)" --wait -P "$task"
done
```
#### AI agent 集成
当你通过 `--prompt`、`--prompt-file` 或 `--prompt-editor` 提供提示词时,
workmux 自动将提示词注入到运行配置的 agent
命令的窗格中(例如,`claude`、`codex`、`opencode`、`gemini`、`kiro-cli`,或任何你通过 `agent` 配置或 `--agent` 标志设置的内容),无需任何 `.workmux.yaml` 更改:
- 命令与配置的 agent 匹配的窗格会自动以给定的提示词启动。
- 你可以保持你的 `.workmux.yaml` 窗格配置简单(例如,`panes: [{ command: "" }]`)并让 workmux 在运行时处理提示词注入。
这意味着你可以使用特定于任务的提示词启动 AI agent,而无需为每个任务修改你的项目配置。
#### 自动生成分支名称
`--auto-name` (`-A`) 标志使用 LLM 从你的提示词生成分支名称。使用的工具取决于你的配置:
1. `auto_name.command` 已设置:按原样使用该命令
2. `config.agent` 是已知的 agent(`claude`、`gemini`、`codex`、`opencode`、`kiro-cli`、`vibe`):使用 agent 的 CLI 和快速/廉价模型
3. 两者都不是:回退到 [`llm`](https://llm.datasette.io/) CLI 工具
##### 用法
```
# 打开编辑器编写提示,生成分支名
workmux add -A
# 使用内联提示
workmux add -A -p "Add OAuth authentication"
# 使用提示文件
workmux add -A -P task-spec.md
```
##### 要求
当配置了 `agent` 时(例如,`agent: claude`),workmux 自动使用该 agent 的 CLI 进行分支命名。除了安装 agent 外不需要额外的设置。
如果没有配置 agent 且没有设置 `auto_name.command`,workmux 使用 `llm` CLI 工具:
```
pipx install llm
```
配置模型(例如,OpenAI):
```
llm keys set openai
# 或使用本地模型
llm install llm-ollama
```
如果你设置 `auto_name.command`,则不需要 `llm`。
##### Agent 配置文件默认值
当配置了 agent 时,这些命令会自动使用:
| Agent | Auto-name command |
| ---------- | ------------------------------------------------------------------------ |
| `claude` | `claude --model haiku -p` |
| `gemini` | `gemini -m gemini-2.5-flash-lite -p` |
| `codex` | `codex exec --config model_reasoning_effort="low" -m gpt-5.1-codex-mini` |
| `opencode` | `opencode run` |
要在配置了 agent 时覆盖回 `llm`,请设置 `auto_name.command: "llm"`。
##### 配置
在 `.workmux.yaml` 中可选地配置自动命名行为:
```
auto_name:
model: 'gemini-2.5-flash-lite'
background: true # Always run in background when using --auto-name
system_prompt: |
Generate a concise git branch name based on the task description.
Rules:
- Use kebab-case (lowercase with hyphens)
- Keep it short: 1-3 words, max 4 if necessary
- Focus on the core task/feature, not implementation details
- No prefixes like feat/, fix/, chore/
Examples of good branch names:
- "Add dark mode toggle" → dark-mode
- "Fix the search results not showing" → fix-search
- "Refactor the authentication module" → auth-refactor
- "Add CSV export to reports" → export-csv
- "Shell completion is broken" → shell-completion
Output ONLY the branch name, nothing else.
```
要使用特定工具,请设置 `auto_name.command`。命令字符串被拆分为程序和参数,组合的提示词通过 stdin 管道传输。
```
auto_name:
command: 'claude -p'
# 即使配置了 agent 也强制使用 llm
auto_name:
command: 'llm'
```
| Option | Description | Default |
| --------------- | ---------------------------------------------------------------- | -------------------------- |
| `command` | 用于分支名称生成的命令(覆盖 agent 配置文件) | Agent 配置文件或 `llm` CLI |
| `model` | 与 `llm` CLI 一起使用的 LLM 模型(设置 `command` 时忽略) | `llm` 的默认值 |
| `background` | 使用 `--auto-name` 时总是在后台运行 | `false` |
| `system_prompt` | 用于分支名称生成的自定义系统提示词 | 内置提示词 |
推荐用于快速、廉价分支名称生成的模型(使用 `llm`):
- `gemini-2.5-flash-lite`(推荐)
- `gpt-5-nano`
#### 并行工作流和多 worktree 生成
workmux 可以从单个 `add` 命令生成多个 worktree,这非常
适合运行并行实验或将任务委托给多个 AI
agent。这由四个互斥模式控制:
- (`-a`, `--agent`): 为每个指定的 agent 创建一个 worktree。
- (`-n`, `--count`): 创建特定数量的 worktree。
- (`--foreach`): 基于变量矩阵创建 worktree。
- **stdin**: 通过管道输入行以创建带有模板化提示词的 worktree。
使用任何这些模式时,分支名称从模板生成,提示词可以用变量模板化。
##### 多 worktree 选项
- `-a, --agent `: 多次使用时,为每个 agent 创建一个 worktree。
- `-n, --count `: 创建 `` 个 worktree 实例。可以与单个 `--agent` 标志结合使用,将该 agent 应用于所有实例。
- `--foreach `: 从变量矩阵字符串创建 worktree。格式为 `"var1:valA,valB;var2:valX,valY"`。所有值列表必须具有相同的长度。值按索引位置配对(zip,而非笛卡尔积):每个变量的第一个值在一起,第二个与第二个在一起,等等。
- `--branch-template `: 用于生成分支名称的 [MiniJinja](https://docs.rs/minijinja/latest/minijinja/) (Jinja2 兼容) 模板。
- 可用变量:`{{ base_name }}`、`{{ agent }}`、`{{ num }}`、`{{ index }}`、`{{ input }}` (stdin) 以及来自 `--foreach` 的任何变量。
- 默认:`{{ base_name }}{% if agent %}-{{ agent | slugify }}{% endif %}{% for key, value in foreach_vars %}-{{ value | slugify }}{% endfor %}{% if num %}-{{ num }}{% endif %}`
- `--max-concurrent `: 限制同时运行的 worktree 数量。设置后,workmux 最多创建 `` 个 worktree,然后等待任何窗口关闭再启动下一个。要求 agent 在完成后关闭窗口(例如,通过提示词指令运行 `workmux remove --keep-branch`)。
##### 提示词模板化
生成多个 worktree 时,通过 `-p`、`-P` 或 `-e` 提供的任何提示词都被视为 MiniJinja 模板。你可以使用生成模式中的变量为每个 agent 或实例创建唯一的提示词。
##### 提示词文件中的变量矩阵
你可以直接在提示词文件中使用 YAML frontmatter 指定变量矩阵,而不是在命令行上传递 `--foreach`。这对于复杂的矩阵更方便,并使变量接近使用它们的提示词。
**格式:**
创建一个顶部带有 YAML frontmatter 的提示词文件,用 `---` 分隔:
**示例 1:** `mobile-task.md`
```
---
foreach:
platform: [iOS, Android]
lang: [swift, kotlin]
---
Build a {{ platform }} app using {{ lang }}. Implement user authentication and
data persistence.
```
```
workmux add mobile-app --prompt-file mobile-task.md
# 生成 worktrees:mobile-app-ios-swift, mobile-app-android-kotlin
```
**示例 2** `agent-task.md`(使用 `agent` 作为 foreach 变量)
```
---
foreach:
agent: [claude, gemini]
---
Implement the dashboard refactor using your preferred approach.
```
```
workmux add refactor --prompt-file agent-task.md
# 生成 worktrees:refactor-claude, refactor-gemini
```
**行为:**
- 来自 frontmatter 的变量在提示词模板和分支名称模板中都可用
- 所有值列表必须具有相同的长度,值按索引位置配对(与 `--foreach` 相同的 zip 行为)
- 如果两者都存在,CLI `--foreach` 会覆盖 frontmatter 并发出警告
- 同时适用于 `--prompt-file` 和 `--prompt-editor`
##### Stdin 输入
你可以通过管道将输入行传递给 `workmux add` 以创建多个 worktree。每行在提示词中作为 `{{ input }}` 模板变量可用。
这对于处理来自外部源的批处理任务很有用。
**纯文本:** 每行变为 `{{ input }}`
```
echo -e "api\nauth\ndatabase" | workmux add refactor -P task.md
# {{ input }} = "api", "auth", "database"
```
**JSON lines:** 每个 key 变为模板变量
```
gh repo list --json url,name --jq -c '.[]' | workmux add analyze \
--branch-template '{{ base_name }}-{{ name }}' \
-P prompt.md
# 行:{"url":"https://github.com/raine/workmux","name":"workmux"}
# 变量:{{ url }}, {{ name }}, {{ input }} (原始 JSON 行)
```
这让你可以用 `jq` 在上游构建数据并使用有意义的分支名称,同时在提示词中保留完整的 URL。
**行为:**
- 空行和仅包含空白的行被过滤掉
- Stdin 输入不能与 `--foreach` 结合使用(互斥)
- JSON 对象(以 `{` 开头的行)被解析,每个 key 变为变量
- `{{ input }}` 始终包含原始行
- 如果 JSON 包含 `input` key,它会覆盖原始行值
##### 示例
```
# 为 claude 和 gemini 各创建一个带有针对性提示的 worktree
workmux add my-feature -a claude -a gemini -p "Implement the new search API integration"
# 生成 worktrees:my-feature-claude, my-feature-gemini
# 创建 2 个默认 agent 实例
workmux add my-feature -n 2 -p "Implement task #{{ num }} in TASKS.md"
# 生成 worktrees:my-feature-1, my-feature-2
# 从变量矩阵创建 worktrees
workmux add my-feature --foreach "platform:iOS,Android" -p "Build for {{ platform }}"
# 生成 worktrees:my-feature-ios, my-feature-android
# 通过 --foreach 创建特定于 agent 的 worktrees
workmux add my-feature --foreach "agent:claude,gemini" -p "Implement the dashboard refactor"
# 生成 worktrees:my-feature-claude, my-feature-gemini
# 在提示文件中使用 frontmatter 以获得更简洁的语法
# task.md 包含:
# ---
# foreach:
# env: [staging, production]
# task: [smoke-tests, integration-tests]
# ---
# 针对 {{ env }} 环境运行 {{ task }}
workmux add testing --prompt-file task.md
# 生成 worktrees:testing-staging-smoke-tests, testing-production-integration-tests
# 通过 stdin 管道输入创建 worktrees
# review.md 包含:审查 {{ input }} 模块的安全问题。
echo -e "auth\npayments\napi" | workmux add review -A -P review.md
# 为每个模块生成带有 LLM 生成分支名的 worktrees
```
##### 配方:使用工作池进行批处理
结合 stdin 输入、提示词模板化和并发限制,创建一个处理来自外部命令的项的工作池。
**示例:为未测试的文件生成测试脚手架**
```
# generate-tests.md 包含:
# 读取 {{ input }} 处的文件并生成覆盖
# 导出函数的测试套件。关注快乐路径和边缘情况。
# 完成后,运行:workmux remove --keep-branch
find src/utils -name "*.ts" ! -name "*.test.ts" | \
workmux add add-tests \
--branch-template '{{ base_name }}-{{ index }}' \
--prompt-file generate-tests.md \
--max-concurrent 3 \
--background
```
- `find ...` 列出没有测试的文件(每行一个)通过管道传输到 stdin
- `--branch-template` 使用 `{{ index }}` 作为唯一的分支名称
- `--prompt-file` 使用 `{{ input }}` 将每个文件路径传递给 agent
- `--max-concurrent 3` 限制并行 agent 以避免速率限制
- `--background` 运行时不切换焦点
### `workmux merge [branch-name]`
将分支合并到目标分支(默认为 main)并自动清理所有关联的资源(worktree、tmux 窗口和本地分支)。
- `[branch-name]`: 要合并的分支的可选名称。如果省略,自动检测你所在的 worktree 的当前分支。
#### 选项
- `--into `: 合并到指定分支而不是主分支。对于 stacked PR、git-flow 工作流或将子任务合并到父功能分支很有用。如果目标分支有自己的 worktree,合并在那里发生;否则,使用主 worktree。
- `--ignore-uncommitted`: 在不打开编辑器的情况下提交任何暂存的更改
- `--keep`, `-k`: 合并后保留 worktree、窗口和分支(跳过清理)。当你想在清理之前验证合并时很有用。
- `--notification`: 成功合并时显示系统通知。对于将合并委托给 AI agent 并希望在完成时收到通知很有用。
#### 合并策略
默认情况下,`workmux merge` 执行标准的合并提交(可通过 `merge_strategy` 配置)。你可以使用这些互斥标志覆盖配置的行为:
- `--rebase`: 合并前将功能分支 rebase 到目标上(通过快进合并创建线性历史)。如果发生冲突,你需要手动解决它们并在 worktree 中运行 `git rebase --continue`。
- `--squash`: 将功能分支的所有提交压缩到目标上的单个提交中。你会被提示在编辑器中提供提交消息。
如果你不想在主分支中有合并提交,请使用 `rebase` 合并策略,它默认执行 `--rebase`。
```
# ~/.config/workmux/config.yaml
merge_strategy: rebase
```
#### 发生什么
1. 确定要合并的分支(指定的分支或如果省略则为当前分支)
2. 确定目标分支(`--into` 或配置中的主分支)
3. 检查未提交的更改(如果发现则报错,除非使用 `--ignore-uncommitted`)
4. 如果存在暂存的更改则提交(除非使用 `--ignore-uncommitted`)
5. 使用选定的策略将你的分支合并到目标(默认:合并提交)
6. 删除 tmux 窗口(如果你是从 worktree 运行此命令,包括你当前所在的窗口)—— 如果使用 `--keep` 则跳过
7. 移除 worktree —— 如果使用 `--keep` 则跳过
8. 删除本地分支 —— 如果使用 `--keep` 则跳过
#### 典型工作流
当你在 worktree 中完成工作时,只需从该 worktree 的 tmux 窗口中运行 `workmux merge`。该命令将自动检测你所在的分支,将其合并到 main,并关闭当前窗口作为清理的一部分。
#### 示例
```
# 将分支合并到 main(默认:merge commit)
workmux merge user-auth
# 合并您所在的当前 worktree
# (从 worktree 的 tmux 窗口内运行此命令)
workmux merge
# 合并前 rebase 到 main 以获得线性历史
workmux merge user-auth --rebase
# 将所有 commits 压缩为一个 commit
workmux merge user-auth --squash
# 合并但保留 worktree/window/branch 以便在清理前验证
workmux merge user-auth --keep
# ... 在 main 中验证合并 ...
workmux remove user-auth # clean up later when ready
# 合并到不同的分支(stacked PRs)
workmux merge feature/subtask --into feature/parent
```
### `workmux remove [name]...`(别名:`rm`)
移除 worktree、tmux 窗口和分支而不合并(除非你保留分支)。用于放弃工作或清理实验分支。支持在单个命令中移除多个 worktree。
- `[name]...`: 一个或多个 worktree 名称(目录名称)。如果省略,默认为当前目录名称。
#### 选项
- `--all`: 一次移除所有 worktree(主 worktree 除外)。除非使用 `--force`,否则提示确认。安全地跳过有未提交更改或未合并提交的 worktree。
- `--gone`: 移除上游远程分支已被删除的 worktree(例如,在 GitHub 上合并 PR 后)。自动先运行 `git fetch --prune`。
- `--force`, `-f`: 跳过确认提示并忽略未提交的更改
- `--keep-branch`, `-k`: 仅移除 worktree 和 tmux 窗口,同时保留本地分支
#### 示例
```
# 移除当前 worktree(从 worktree 内运行)
workmux remove
# 移除特定的 worktree,如果未合并则需确认
workmux remove experiment
# 一次移除多个 worktrees
workmux rm feature-a feature-b feature-c
# 强制移除多个 worktrees(无需确认)
workmux rm -f old-work stale-branch
# 使用别名
workmux rm old-work
# 移除 worktree/window 但保留分支
workmux remove --keep-branch experiment
# 强制移除无需提示
workmux rm -f experiment
# 移除远程分支已删除的 worktrees(例如,PR 合并后)
workmux rm --gone
# 强制移除所有已消失的 worktrees(无需确认)
workmux rm --gone -f
# 一次移除所有 worktrees
workmux rm --all
```
### `workmux list`(别名:`ls`)
列出所有 git worktree 及其 agent 状态、多路复用器窗口状态和合并状态。支持按 worktree handle 或分支名称过滤。
#### 参数
- `[worktree-or-branch...]`: 按 worktree handle(目录名称)或分支名称过滤。接受多个值。省略时,显示所有 worktree。
#### 选项
- `--pr`: 显示每个 worktree 的 GitHub PR 状态。需要安装并验证 `gh` CLI。请注意,它显示带有 [Nerd Font](https://www.nerdfonts.com/) 图标的 pull request 状态,这需要安装 Nerd Font 兼容字体。
#### 示例
```
# 列出所有 worktrees
workmux list
# 列出 PR 状态
workmux list --pr
# 筛选特定的 worktrees
workmux list my-feature
workmux list feature-auth feature-api
```
#### 示例输出
```
BRANCH AGENT MUX UNMERGED PATH
main - - - ~/project
user-auth 🤖 ✓ - ~/project__worktrees/user-auth
bug-fix ✅ ✓ ● ~/project__worktrees/bug-fix
api-work - ✓ - ~/project__worktrees/api-work
```
#### 关键
- AGENT 显示当前 agent 状态(请参阅 [状态跟踪](https://workmux.dev/guide/status-tracking/)):
- `🤖` = 工作中,`💬` = 等待输入,`✅` = 已完成
- 每个 worktree 的多个 agent 显示计数(例如,`2🤖 1✅`)
- MUX 列中的 `✓` = 此 worktree 存在多路复用器窗口
- UNMERGED 列中的 `●` = 分支有未合并到 main 的提交
- `-` = 不适用
### `workmux config edit`
在你喜欢的编辑器中打开全局配置文件(`~/.config/workmux/config.yaml`)。使用 `$VISUAL`、`$EDITOR` 或回退到 `vi`。如果文件尚不存在,则使用注释掉的默认值创建它。
### `workmux config path`
打印全局配置文件的路径。用于脚本编写。
### `workmux init`
生成带有示例配置和 `""` 占位符用法的 `.workmux.yaml`。
### `workmux open [name]`
为预先存在的 git worktree 打开或切换到 tmux 窗口。如果窗口已存在,则切换到它。如果不存在,则使用配置的窗格布局和环境创建新窗口。
- `[name]`: Worktree 名称(目录名称,也是不带前缀的 tmux 窗口名称)。从 worktree 内部使用 `--new` 时可选。
#### 选项
- `-n, --new`: 即使窗口已存在也强制在新窗口中打开。创建带有后缀的重复窗口(例如 `-2`、`-3`)。用于在同一 worktree 中有多个终端视图。
- `-s, --session`: 在会话模式下打开,覆盖存储的模式。为后续打开持久化模式更改。不能与 `--new` 结合使用。仅 tmux 支持。
- `--run-hooks`: 重新运行 `post_create` 命令(这些会阻塞窗口创建)。
- `--force-files`: 重新应用文件复制/符号链接操作。用于恢复删除的 `.env` 文件。
- `-p, --prompt `: 为 AI agent 窗格提供内联提示词。
- `-P, --prompt-file `: 提供包含提示词的文件路径。
- `-e, --prompt-editor`: 打开编辑器以交互式编写提示词。
#### 发生什么
1. 验证具有 `` 的 worktree 存在。
2. 如果 tmux 窗口存在且未设置 `--new`,则切换到它。
3. 否则,创建一个新的 tmux 窗口(如果重复则带有后缀)。
4. (如果指定)运行文件操作和 `post_create` 钩子。
5. 设置你配置的 tmux 窗格布局。
6. 自动将你的 tmux 客户端切换到新窗口。
#### 示例
```
# 打开或切换到现有 worktree 的窗口
workmux open user-auth
# 强制为同一 worktree 打开第二个窗口(创建 user-auth-2)
workmux open user-auth --new
# 为当前 worktree 打开新窗口(从 worktree 内运行)
workmux open --new
# 以 session 模式打开(如果需要,从 window 模式转换)
workmux open user-auth --session
# 带着给 AI agents 的提示打开
workmux open user-auth -p "Continue implementing the login flow"
# 打开并重新运行依赖安装
workmux open user-auth --run-hooks
# 打开并还原配置文件
workmux open user-auth --force-files
```
### `workmux close [name]`
关闭 worktree 的 tmux 窗口而不移除 worktree 或分支。当你想暂时关闭窗口以减少混乱或释放资源,但计划稍后返回工作时很有用。
- `[name]`: 可选的 worktree 名称(目录名称)。如果省略,默认为当前目录。
#### 示例
```
# 关闭特定 worktree 的窗口
workmux close user-auth
# 关闭当前 worktree 的窗口(从 worktree 内运行)
workmux close
```
要稍后重新打开窗口,请使用 [`workmux open`](#workmux-open-name)。
**提示**:你也可以使用 tmux 的原生 kill-window 命令(默认:`prefix + &`)关闭 worktree 的窗口,效果相同。
### `workmux path `
打印现有 worktree 的文件系统路径。用于脚本编写或快速导航到 worktree 目录。
- ``: Worktree 名称(目录名称)。
#### 示例
```
# 获取 worktree 的路径
workmux path user-auth
# 输出:/Users/you/project__worktrees/user-auth
# 在脚本中使用或与 cd 一起使用
cd "$(workmux path user-auth)"
# 将文件复制到 worktree
cp config.json "$(workmux path feature-branch)/"
```
### `workmux dashboard`
打开一个 TUI 仪表板,显示所有 tmux 会话中的所有活动 AI agent。用于监控多个并行 agent 并在它们之间快速跳转。
#### 选项
- `-d, --diff`: 直接打开当前 worktree的差异视图。用于当你想快速审查未提交的更改而无需浏览 agent 列表时。
- `-P, --preview-size <10-90>`: 将预览窗格大小设置为百分比(越大 = 预览越多,表格越少)。默认值:60。
- `-s, --session`: 过滤以仅显示当前会话中的 agent。用于每个会话映射到不同仓库的 session-per-project 工作流。

#### 键绑定
| Key | Action |
| --------- | --------------------------------------- |
| `1`-`9` | 快速跳转到 agent(关闭仪表板) |
| `Tab` | 在当前和最后一个 agent 之间切换 |
| `d` | 查看差异(打开 WIP 视图) |
| `p` | 查看 agent(仪表板保持打开) |
| `s` | 循环排序模式 |
| `F` | 切换会话过滤器 |
| `f` | 切换过时过滤器(显示/隐藏过时) |
| `i` | 进入输入模式(输入到 agent) |
| `Ctrl+u` | 向上滚动预览 |
| `Ctrl+d` | 向下滚动预览 |
| `+`/`-` | 调整预览窗格大小 |
| `Enter` | 转到选定的 agent(关闭仪表板) |
| `j`/`k` | 向上/向下导航 |
| `q`/`Esc` | 退出 |
#### 实时预览
下半部分显示选定 agent 终端输出的实时预览。
预览自动滚动以显示最新输出,但你可以使用 `Ctrl+u`/`Ctrl+d` 滚动浏览历史记录。按 `i` 进入输入模式并直接向 agent 输入而不离开仪表板。
#### 列
- **#**: 快速跳转键 (1-9)
- **Project**: 项目名称(来自 `__worktrees` 路径或目录名称)
- **Agent**: Worktree/窗口名称
- **Git**: 显示分支更改(暗淡)和未提交更改(明亮)的差异统计
- **Status**: Agent 状态图标(🤖 工作中,💬 等待,✅ 完成,或 "stale")
- **Time**: 自上次状态更改以来的时间
- **Title**: Claude Code 会话标题(自动摘要)
#### 排序模式
按 `s` 循环排序模式:
- **Priority**(默认):Waiting > Done > Working > Stale
- **Project**: 按项目名称分组,然后按每个项目内的优先级
- **Recency**: 最近更新的在前
- **Natural**: 原始 tmux 顺序(按窗格创建)
你的排序偏好保存在 tmux 会话中。
#### 会话过滤器
按 `F` 切换会话过滤器。激活时,仅显示当前会话中的 agent。这对于每个会话映射到一个仓库的 session-per-project 工作流很有用。你也可以使用 `--session` 启动仪表板以默认为会话过滤。偏好跨会话持久化。
#### 过时过滤器
按 `f` 在显示所有 agent 或隐藏过时的 agent 之间切换。过滤器状态在同一 tmux 服务器内的仪表板会话之间持久化。
#### 差异视图
按 `d` 查看选定 agent 的差异。差异视图有两种模式:
- **WIP** - 显示未提交的更改(`git diff HEAD`)
- **review** - 显示分支上相对于 main 的所有更改(`git diff main...HEAD`)
按 `Tab` 在模式之间切换。页脚显示哪个模式处于活动状态以及显示添加 (+) 和删除 (-) 行数的差异统计。
| Key | Action |
| --------- | -------------------------------- |
| `Tab` | 切换 WIP / review |
| `a` | 进入 patch 模式(仅 WIP) |
| `j`/`k` | 向下/向上滚动 |
| `Ctrl+d` | 向下翻页 |
| `Ctrl+u` | 向上翻页 |
| `c` | 向 agent 发送 commit 命令 |
| `m` | 触发合并并退出仪表板 |
| `q`/`Esc` | 关闭差异视图 |
#### Patch 模式
Patch 模式(从 WIP 差异按 `a`)允许暂存单个块,如 `git add -p`。这对于有选择地暂存 agent 工作的部分很有用。
当安装了 [delta](https://github.com/dandavison/delta) 时,块会以语法高亮呈现,以提高可读性。
| Key | Action |
| --------- | -------------------------------- |
| `y` | 暂存当前块 |
| `n` | 跳过当前块 |
| `u` | 撤销上次暂存的块 |
| `s` | 拆分块(如果可拆分) |
| `o` | 评论块(发送给 agent) |
| `j`/`k` | 导航到下一个/上一个块 |
| `q`/`Esc` | 退出 patch 模式 |
按 `y` 暂存当前块并前进到下一个。按 `n` 跳过而不暂存。标题中的计数器显示你的进度(例如 `[3/10]`)。
当单独更改之间有上下文行时,按 `s` 将当前块拆分为更小的部分。按 `u` 撤销上次暂存的块。
按 `o` 评论当前块。这向 agent 发送一条消息,包括文件路径、行号、差异块作为上下文和你的评论。用于给出反馈,如 "This function should handle the error case"。
#### 示例 tmux 绑定
添加到你的 `~/.tmux.conf` 以快速访问:
```
bind C-s display-popup -h 30 -w 100 -E "workmux dashboard"
```
然后按 `prefix + Ctrl-s` 以 tmux 弹出窗口打开仪表板。
### `workmux sandbox`
用于管理沙箱功能的命令。请参阅 [沙箱指南](https://workmux.raine.dev/guide/sandbox/) 获取完整文档。
| Command | Description |
| --------------------- | ------------------------------------------------------ |
| `sandbox pull` | 从 registry 拉取最新的容器镜像 |
| `sandbox build` | 在本地构建容器镜像 |
| `sandbox shell` | 在沙箱内启动交互式 shell |
| `sandbox agent` | 在具有 RPC 支持的沙箱中运行配置的 agent |
| `sandbox stop` | 停止运行中的 Lima VMs |
| `sandbox prune` | 删除未使用的 Lima VMs 以回收磁盘空间 |
| `sandbox install-dev` | 交叉编译并安装 workmux 到沙箱 (dev) |
### `workmux claude prune`
从 Claude 配置(`~/.claude.json`)中移除指向已删除 worktree 目录的过时条目。当你在 worktree 中运行 Claude Code 时,它在该文件中存储每个 worktree 的设置。随着时间的推移,随着 worktree 被合并或删除,它可能会积累不再存在的路径的条目。
#### 发生什么
1. 扫描 `~/.claude.json` 中指向不存在目录的条目
2. 在进行更改之前在 `~/.claude.json.bak` 创建备份
3. 移除所有过时条目
4. 报告清理的条目数
#### 安全
- 仅移除不存在的绝对路径的条目
- 修改文件前创建备份
- 保留所有有效条目和相对路径
#### 示例
```
# 清理过时的 Claude Code 条目
workmux claude prune
```
#### 示例输出
```
- Removing: /Users/user/project__worktrees/old-feature
✓ Created backup at ~/.claude.json.bak
✓ Removed 3 stale entries from ~/.claude.json
```
### `workmux completions `
为指定的 shell 生成 shell 补全脚本。补全为命令和动态分支名称建议提供 tab 补全。
- ``: Shell 类型:`bash`、`zsh` 或 `fish`。
#### 示例
```
# 生成 zsh 补全
workmux completions zsh
```
请参阅 [Shell 补全](#shell-completions) 部分了解安装说明。
### `workmux docs`
以终端格式显示此 README。用于在不离开终端的情况下快速参考。
交互式运行时,使用颜色渲染 markdown 并使用分页器(`less`)。
通过管道传输时(例如,到 LLM),输出原始 markdown 以获得干净的上下文。
#### 与 AI agent 一起使用
你可以要求 agent 阅读文档并为你配置 workmux:
```
> run `workmux docs` and configure workmux so that on the left pane
there is claude as agent, and on the right side neovim and empty
shell on top of each other
⏺ Bash(workmux docs)
⎿
… +923 lines
⏺ Write(.workmux.yaml)
⎿ Wrote 9 lines to .workmux.yaml
⏺ Created .workmux.yaml with the layout:
- Left: claude agent (focused)
- Right top: neovim
- Right bottom: empty shell
```
## Agent 状态跟踪
Workmux 可以在你的 tmux 窗口列表中显示 agent 的状态,让你一目了然地了解每个窗口中的 agent 正在做什么。

#### 关键
- 🤖 = agent 正在工作
- 💬 = agent 正在等待用户输入
- ✅ = agent 已完成(窗口焦点时自动清除)
| Agent | Status |
| ----------- | ---------------------------------------------------------------------- |
| Claude Code | ✅ 支持 |
| Copilot CLI | ✅ 支持\* |
| OpenCode | ✅ 支持 |
| Gemini CLI | [进行中](https://github.com/google-gemini/gemini-cli/issues/9070) |
| Kiro | [跟踪问题](https://github.com/kirodotdev/Kiro/issues/5440) |
| Codex | [跟踪问题](https://github.com/openai/codex/issues/2109) |
**注意:**
- **Copilot CLI**: 没有 💬 等待状态
- **Kiro**: Hooks 支持很混乱:需要自定义 agent,因为默认 agent 无法编辑
### 设置
运行 `workmux setup` 以自动检测你的 agent CLI、安装状态跟踪钩子并安装技能:
```
workmux setup
```
你也可以运行特定部分:`workmux setup --hooks` 或 `workmux setup --skills`。
如果 workmux 检测到没有状态跟踪或技能配置的 agent,它也会在首次运行时提示你。
Workmux 自动修改你的 tmux `window-status-format` 以显示状态图标。这每个会话发生一次,并且仅影响当前的 tmux 会话(不是你的全局配置)。
#### 手动设置
如果你更喜欢手动设置:
**Claude Code**: 安装 workmux 状态插件:
```
claude plugin marketplace add raine/workmux
claude plugin install workmux-status
```
或手动将钩子添加到 `~/.claude/settings.json`。请参阅
[.claude-plugin/plugin.json](.claude-plugin/plugin.json) 了解钩子配置。
**Copilot CLI**: 将钩子复制到你的仓库:
```
mkdir -p .github/hooks/workmux-status
curl -o .github/hooks/workmux-status/hooks.json \
https://raw.githubusercontent.com/raine/workmux/main/.github/hooks/workmux-status/hooks.json
```
注意:Copilot 钩子是每个仓库的。由于 Copilot CLI 钩子实现的限制,不支持等待状态。
**OpenCode**: 下载 workmux 状态插件:
```
mkdir -p ~/.config/opencode/plugin
curl -o ~/.config/opencode/plugin/workmux-status.ts \
https://raw.githubusercontent.com/raine/workmux/main/.opencode/plugin/workmux-status.ts
```
重启 OpenCode 以使插件生效。
### 自定义
你可以在配置中自定义图标:
```
# ~/.config/workmux/config.yaml
status_icons:
working: '🔄'
waiting: '⏸️'
done: '✔️'
```
如果你更喜欢自己管理 tmux 格式,禁用自动修改并将状态变量添加到你的 `~/.tmux.conf`:
```
# ~/.config/workmux/config.yaml
status_format: false
```
```
# ~/.tmux.conf
set -g window-status-format '#I:#W#{?@workmux_status, #{@workmux_status},}#{?window_flags,#{window_flags}, }'
set -g window-status-current-format '#I:#W#{?@workmux_status, #{@workmux_status},}#{?window_flags,#{window_flags}, }'
```
### 跳转到已完成的 agent
使用 `workmux last-done` 快速切换到最近完成其任务的 agent。重复调用按时间倒序循环遍历所有已完成的 agent。
添加 tmux 键绑定以快速访问:
```
# ~/.tmux.conf
bind-key L run-shell "workmux last-done"
```
然后按 `prefix + L` 跳转到最后完成的 agent,再次按循环到下一个最旧的,依此类推。
### 在 agent 之间切换
使用 `workmux last-agent` 在当前 agent 和你访问的上一个 agent 之间切换。这就像 vim 的 `Ctrl+^` 或 tmux 的 `last-window` - 它记住你来自哪个 agent 并切换回它。再次按它会返回你原来的地方。
这既可以作为 CLI 命令使用,也可以作为仪表板中的 `Tab` 键使用。
添加 tmux 键绑定以快速访问:
```
# ~/.tmux.conf
bind Tab run-shell "workmux last-agent"
```
然后按 `prefix + Tab` 在你最近的两个 agent 之间切换。
## Sandbox
workmux 可以在容器(Docker/Podman/Apple Container)或 Lima VMs 内运行 agent,将它们与主机隔离。Agent 仅限于项目 worktree;敏感文件如 SSH keys、AWS credentials 和其他 secrets 不可访问。这让你可以使用 `--dangerously-skip-permissions` 运行 agent,而不用担心它们可能在主机上触及什么。
沙箱化是透明的:状态指示器、仪表板、生成新 agent 和合并都可以正常跨沙箱边界工作。
### 后端
| | Container (Docker/Podman/Apple Container) | Lima VM |
| --------------- | ------------------------------------------ | ------------------------------- |
| **隔离** | 进程/VM 级别 | 机器级别 (虚拟机) |
| **持久性** | 临时(每次会话的新容器) | 持久(有状态 VMs) |
| **工具链** | 自定义 Dockerfile 或主机命令代理 | 内置 Nix & Devbox 支持 |
| **网络** | 可选限制(域允许列表) | 不受限制 |
Container 是一个很好的默认选择:设置简单且是临时的,因此会话之间不会积累状态。如果你想要具有内置 Nix/Devbox 工具链支持的持久 VMs,请选择 Lima。
### 快速开始
```
# ~/.config/workmux/config.yaml 或 .workmux.yaml
sandbox:
enabled: true
# backend: lima # uncomment for Lima VMs (default: container)
```
首次运行时会自动拉取预构建的容器镜像。对于 Lima,VM 在首次使用时创建和配置。
### 共享功能
两个后端都支持:
- **主机命令代理**: 通过 `host_commands` 配置从沙箱内部在主机上运行特定命令(构建工具、linter)
- **额外挂载**: 将额外的主机目录挂载到沙箱中(默认只读)
- **Git 身份**: 你的 `user.name` 和 `user.email` 会自动注入,因此 git 提交无需暴露你的完整 `~/.gitconfig` 即可工作
- **凭证共享**: Agent 凭证在主机和沙箱之间共享
- **网络限制**(仅容器):阻止出站连接,除了批准的域
请参阅 [沙箱指南](https://workmux.raine.dev/guide/sandbox/) 了解完整的设置、配置和安全详细信息。
## 会话模式
默认情况下,workmux 在当前会话中创建 tmux **窗口**。使用会话模式时,每个 worktree 获得自己的 **tmux 会话**。这允许每个 worktree 有多个窗口。
### 启用会话模式
添加到你的配置:
```
# ~/.config/workmux/config.yaml 或 .workmux.yaml
mode: session
```
或使用 `--session` 标志:
```
workmux add feature-branch --session
```
### 工作原理
- **持久性**: 模式是每个 worktree 存储的。如果你使用 `--session` 创建 worktree,后续的 `open`/`close`/`remove` 命令会自动为该 worktree 使用会话模式。
- **导航**: 在 `merge` 或 `remove` 之后,workmux 将你切换回上一个会话。
### 每个会话多个窗口
使用 `windows` 配置在每个会话中启动多个窗口。每个窗口可以有自己的窗格布局。这与顶级 `panes` 配置互斥。
```
mode: session
windows:
- name: editor
panes:
- command:
focus: true
- split: horizontal
size: 20
- name: tests
panes:
- command: just test --watch
- panes:
- command: tail -f app.log
```
每个窗口支持:
| Option | Description | Default |
| ------- | ------------------------------------------------------ | ------------ |
| `name` | 窗口名称(如果省略,tmux 从命令自动命名) | Auto |
| `panes` | 窗格布局(与顶级 `panes` 语法相同) | Single shell |
`focus: true` 跨窗口工作:打开会话时,最后一个设置 focus 的窗格决定选择哪个窗口。
### 限制
- **仅 tmux**: 会话模式目前仅支持 tmux 后端。
- **无重复**: 与支持为同一 worktree 打开多个窗口(`-`、`-3` 后缀)的窗口模式不同,会话模式为每个 worktree 创建一个会话。
## 工作流示例
这是一个完整的工作流:
```
# 开始新功能
workmux add user-auth
# 开发您的功能...
# (tmux 自动设置您配置的窗格和环境)
# 准备好后,合并并清理
workmux merge user-auth
# 开始另一个功能
workmux add api-endpoint
# 列出所有活动的 worktrees
workmux list
```
## 前后对比
workmux 将多步骤手动工作流转变为简单的命令,使并行开发工作流变得实用。
### 没有 workmux
```
# 1. 手动创建 worktree 和环境
git worktree add ../worktrees/user-auth -b user-auth
cd ../worktrees/user-auth
cp ../../project/.env.example .env
ln -s ../../project/node_modules .
npm install
# ... 以及其他设置步骤
# 2. 手动创建并配置 tmux 窗口
tmux new-window -n user-auth
tmux split-window -h 'npm run dev'
tmux send-keys -t 0 'claude' C-m
# ... 对您 desired 布局中的每个窗格重复此操作
# 3. 完成后,手动合并并清理所有内容
cd ../../project
git switch main && git pull
git merge --no-ff user-auth
tmux kill-window -t user-auth
git worktree remove ../worktrees/user-auth
git branch -d user-auth
```
### 有 workmux
```
# 创建环境
workmux add user-auth
# ... 开发功能 ...
# 合并并清理
workmux merge
```
### 并行 AI 工作流
同时运行多个 AI agent,每个在自己的 worktree 中。
```
# 启动两个处理不同任务的 agents
workmux add refactor-user-model -p "Refactor the User model to use composition"
workmux add add-search-endpoint -p "Add a /search endpoint with pagination"
# 每个 agent 独立工作。通过 tmux 窗口或 dashboard 检查进度
workmux dashboard
# 将完成的工作合并回 main
workmux merge refactor-user-model
workmux merge add-search-endpoint
```
## 为什么使用 git worktrees?
[Git worktrees](https://git-scm.com/docs/git-worktree) 让你可以在同一个仓库中同时检出多个分支,每个在单独的目录中。与标准的单目录设置相比,这提供了两个主要优势:
- **无痛的上下文切换**: 只需更改目录即可在任务之间切换(`cd ../other-branch`)。无需 `git stash` 或进行临时提交。你的进行中的工作、编辑器状态和命令历史对于每个分支保持隔离和完整。
- **真正的并行开发**: 同时在多个分支上工作而不会干扰。你可以在一个 worktree 中运行构建、安装依赖项(`npm install`)或运行测试,同时在另一个 worktree 中主动编码。这种隔离非常适合在不同的任务上并行运行多个 AI agent。
在标准的 Git 设置中,切换分支通过要求干净的工作树来打断你的流程。Worktrees 消除了这种摩擦。`workmux` 自动化整个流程并将每个 worktree 与专用的 tmux 窗口配对,创建完全隔离的开发环境。请参阅 [前后对比](#before-and-after) 了解 workmux 如何简化此工作流。
## Git worktree 注意事项
虽然强大,但 git worktrees 有一些重要的细微差别需要注意。workmux 旨在自动化解决这些问题,但了解底层机制会有所帮助。
- [Gitignored 文件需要配置](#gitignored-files-require-configuration)
- [冲突](#conflicts)
- [包管理器考虑事项](#package-manager-considerations-pnpm-yarn)
- [Rust 项目](#rust-projects)
- [Monorepo 中的端口冲突](#port-conflicts-in-monorepos)
- [符号链接和 `.gitignore` 尾部斜杠](#symlinks-and-gitignore-trailing-slashes)
- [本地 git 忽略(`.git/info/exclude`)不共享](#local-git-ignores-gitinfoexclude-are-not-shared)
### Gitignored 文件需要配置
当 `git worktree add` 创建新的工作目录时,它是一个干净的检出。你的 `.gitignore` 中列出的文件(例如,`.env` 文件、`node_modules`、IDE 配置)默认情况下不会存在于新的 worktree 中。你的应用程序在新的 worktree 中将是破损的,直到你手动创建或链接这些必要的文件。
这是 workmux 的主要功能。使用 `.workmux.yaml` 中的 `files` 部分在创建时自动复制或符号链接这些文件:
```
# .workmux.yaml
files:
copy:
- .env # Copy environment variables
symlink:
- .next/cache # Share Next.js build cache
```
注意:符号链接 `node_modules` 可能很高效,但仅当所有 worktree 共享相同的依赖项时才有效。如果不同的分支有不同的依赖项版本,每个 worktree 需要自己的安装。对于依赖项安装,考虑使用窗格命令而不是 `post_create` 钩子 - 这在后台运行安装而不阻塞 worktree 和窗口创建:
```
panes:
- command: npm install
focus: true
- split: horizontal
```
### 冲突
Worktrees 隔离你的文件系统,但它们不能防止合并冲突。如果你在两个不同的分支(在两个不同的 worktree 中)修改代码的同一区域,当你将一个合并到另一个时仍然会发生冲突。最佳实践是在并行的 worktree 中处理逻辑上独立的功能。当冲突不可避免时,使用标准的 git 工具解决它们。你也可以利用 worktree 内的 AI agent 来协助解决冲突。
### 包管理器考虑事项
像 `pnpm` 这样的现代包管理器使用带有到 `node_modules` 符号链接的全局存储。每个 worktree 通常需要自己的 `pnpm install` 来为该分支设置正确的依赖项版本。
如果你的 worktree 总是具有相同的依赖项(例如,从同一基础处理多个功能),你可能可以在 worktree 之间符号链接 `node_modules`。但是,一旦分支的依赖项发生分歧,这就会中断,因此通常在每个 worktree 中运行全新安装更安全。
注意:在大型 monorepo 中,在 worktree 移除期间清理 `node_modules` 可能需要大量时间。workmux 有一个 [特殊清理机制](https://github.com/raine/workmux/blob/main/src/scripts/cleanup_node_modules.sh),将 `node_modules` 移动到临时位置并在后台删除它,使 `remove` 命令几乎立即返回。
### Rust 项目
与 `node_modules` 不同,Rust 的 `target/` 目录 **不应** 在 worktree 之间符号链接。Cargo 在构建期间锁定 `target` 目录,因此共享它会阻塞并行构建并违背 worktree 的目的。
相反,使用 [sccache](https://github.com/mozilla/sccache) 在 worktree 之间共享编译的依赖项:
```
brew install sccache
```
添加到 `~/.cargo/config.toml`:
```
[build]
rustc-wrapper = "sccache"
```
这全局缓存编译的依赖项,因此新的 worktree 受益于缓存的构件而没有任何锁争用。
### Monorepo 中的端口冲突
在 monorepo 中运行多个服务(API、Web 应用、数据库)时,每个 worktree 需要唯一的端口以避免冲突。例如,如果你的 `.env` 有硬编码的端口如 `API_PORT=3001` 和 `VITE_PORT=3000`,同时运行两个 worktree 将失败,因为两者都会尝试绑定到相同的端口。
简单地复制 `.env` 文件不起作用,因为所有 worktree 都会使用相同的端口。
**解决方案**: 使用 `post_create` 钩子生成带有唯一端口的 `.env.local` 文件。许多框架(Vite、Next.js、CRA)自动加载 `.env.local` 并将其与 `.env` 合并,`.env.local` 优先。对于普通的 Node.js,使用多个 `--env-file` 标志,后面的文件覆盖前面的。
在 `scripts/worktree-env` 创建脚本:
```
#!/usr/bin/env bash
set -euo pipefail
port_in_use() {
lsof -nP -iTCP:"$1" -sTCP:LISTEN &>/dev/null
}
find_port() {
local port=$1
while port_in_use "$port"; do
((port++))
done
echo "$port"
}
# 对 handle 进行 Hash 以获得确定性端口偏移量 (0-99)
hash=$(echo -n "$WM_HANDLE" | md5 | cut -c1-4)
offset=$((16#$hash % 100))
# 从基于 hash 的偏移量开始查找可用端口
api_port=$(find_port $((3001 + offset * 10)))
vite_port=$(find_port $((3000 + offset * 10)))
# 生成带有端口覆盖的 .env.local
cat >.env.local < /worktree Implement user authentication
> /worktree Fix the race condition in handler.go
> /worktree Add dark mode, Implement caching # multiple tasks
```
请参阅 [技能指南](https://workmux.raine.dev/guide/skills) 了解更多技能,包括 `/merge`、`/rebase`、`/coordinator` 和 `/open-pr`。
## Shell 补全
要使命令和分支名称启用 tab 补全,请将以下内容添加到你的 shell 配置文件中。
对于 **bash**,添加到你的 `.bashrc`:
```
eval "$(workmux completions bash)"
```
对于 **zsh**,添加到你的 `.zshrc`:
```
eval "$(workmux completions zsh)"
```
对于 **fish**,添加到你的 `config.fish`:
```
workmux completions fish | source
```
## 要求
- Rust(用于构建)
- Git 2.5+(用于 worktree 支持)
- tmux(或替代后端)
### 替代后端
虽然 tmux 是主要和推荐的后端,但 workmux 也支持替代终端多路复用器:
- **[WezTerm](https://workmux.raine.dev/guide/wezterm)**(实验性)- 适用于喜欢 WezTerm 功能的用户。感谢 [@JeremyBYU](https://github.com/JeremyBYU) 贡献此后端。
- **[kitty](https://workmux.raine.dev/guide/kitty)**(实验性)- 适用于喜欢 kitty 终端的用户。需要 `allow_remote_control` 和 `listen_on` 配置。
- **[Zellij](https://workmux.raine.dev/guide/zellij)**(实验性)- 适用于喜欢 Zellij 的用户。通过 `$ZELLIJ` 自动检测。
workmux 从环境变量(`$TMUX`、`$WEZTERM_PANE`、`$KITTY_WINDOW_ID` 或 `$ZELLIJ`)自动检测后端。首先检查特定于会话的变量,因此在 kitty 内运行 tmux 正确选择 tmux 后端。设置 `$WORKMUX_BACKEND` 以覆盖检测。
## 灵感和相关工具
workmux 的灵感来自 [wtp](https://github.com/satococoa/wtp),一个出色的 git worktree 管理工具。虽然 wtp 简化了 worktree 创建和设置,但 workmux 通过将 worktree 与 tmux 窗口管理紧密耦合来进一步推进这一点。
对于并行管理多个 AI agent,像 [claude-squad](https://github.com/smtg-ai/claude-squad) 和 [vibe-kanban](https://github.com/BloopAI/vibe-kanban/) 这样的工具提供专用界面,如 TUI 或看板。相比之下,workmux 坚持其理念,即 **tmux 就是界面**,提供用于管理并行工作流的原生 tmux 体验,而无需学习单独的界面。
## 贡献
总是欢迎通过 issues 或 discussions 提交错误报告和功能建议。大型和/或复杂的 PR,特别是没有事先讨论的,可能不会被合并。感谢贡献!
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解开发设置。
## 相关项目
- [tmux-tools](https://github.com/raine/tmux-tools) — tmux 实用程序集合,包括文件选择器、智能会话等
- [tmux-file-picker](https://github.com/raine/tmux-file-picker) — 在 tmux 中弹出 fzf 以快速插入文件路径,非常适合 AI 编码助手
- [tmux-bro](https://github.com/raine/tmux-bro) — 智能 tmux 会话管理器,自动设置特定于项目的会话
- [git-surgeon](https://github.com/raine/git-surgeon) — 用于 AI agent 的非交互式块级 git 暂存
- [claude-history](https://github.com/raine/claude-history) — 使用 fzf 搜索和查看 Claude Code 对话历史
- [consult-llm-mcp](https://github.com/raine/consult-llm-mcp) — 让 Claude Code 咨询更强大的 AI 模型(o3、Gemini、GPT-5.1 Codex)的 MCP 服务器
标签:AI编程助手, C2, CLI, Git Worktree, GNU通用公共许可证, Kitty, Node.js, Rust, Tmux, WezTerm, WiFi技术, Zellij, 上下文切换, 分支管理, 可视化界面, 多任务处理, 工作流自动化, 并行开发, 开发环境管理, 开发者效率, 终端复用, 网络安全研究, 网络流量审计, 通知系统, 隔离环境