会话派生与 Git 协作
本章介绍两项配套使用的功能:将子任务派生为独立的子会话(可选择使用隔离的 git 工作树),以及将并行分支重新合并到一起的图形化合并。两者结合,可以让多个智能体在同一个仓库中并行工作。
1. 什么是派生
在任何会话中都可以拆分出一个子任务。VelaTerm 会在当前节点之下创建一个新的子会话(项目树因此形成层级:父会话 → 子会话 → 孙会话),可选择为其分配一个隔离的 git 工作树,并将任务描述作为新会话的第一条消息发送。新智能体启动后会立即开始工作,无需额外说明。
派生出的是项目树中一个真正的会话,拥有自己的进程,你可以随时查看、答复、重新打开和恢复它。它不是隐藏在后台的任务。
如果工作需要由不同的智能体分别规划、执行和验收,请改用规划与执行工作流,详见规划与执行。
2. 派生方式
| 入口 | 使用者 | 工作树 |
|---|---|---|
命令 vspawn "task" | 你或脚本,可在任何会话中使用 | 默认关闭;--worktree 可开启 |
命令 vspawn-tree "task" | 同上 | 始终开启 |
Claude Code 中的 /vspawn task,Codex 中的 $vspawn task | 你向智能体提出要求;智能体会先将任务扩展为一段自成一体的提示词 | 默认关闭 |
Claude Code 中的 /vspawn-tree task,Codex 中的 $vspawn-tree task | 同上 | 始终开启 |
这两个命令在 VelaTerm 启动的每个会话中都可以使用。智能体技能则需要先安装 Vela 技能:在「设置 ▸ 通用」中选择「安装」,然后新开一个 Claude Code 或 Codex 对话,让智能体加载这些技能。只有在你提出要求时,智能体才会调用这些技能。
新会话看不到派生它的那段对话。使用技能时,智能体会把目标、相关文件、目前的结论、约束条件和验收标准写入任务。自己运行命令时,请在任务文本中写明这些内容。
3. 目录、智能体与模型
- 目录。子会话在运行命令的目录中启动,该目录也是创建工作树时所用的仓库。传入
--cwd <path>可以使用其他项目,例如vspawn-tree --cwd /work/project "fix the parser"。这在集合中尤为重要,因为集合没有自己的项目文件夹。如果对话明确指向某一个仓库,技能会自动添加--cwd。 - 智能体。子会话使用与当前会话相同的智能体;从普通终端派生时使用 Claude Code。
--claude、--codex、--copilot或--kiro可以指定其他智能体,确认卡片中则可以选择所有智能体类型。 - 模型与推理强度。
--model <name>和--effort <level>用于设置子会话的模型和推理强度,例如vspawn --model opus --effort high "port the parser"。模型名称须使用将要运行的智能体所识别的名称。智能体不支持的设置会在创建会话前被拒绝。未指定这些选项时,同类型智能体的子会话会继承父会话的启动参数和权限设置;其他类型的子会话则使用「设置 ▸ 智能体」中该智能体的默认值。 - 视图。如果子会话和父会话都支持会话视图,子会话会以与父会话相同的视图打开;否则以该智能体的默认视图打开。
全部选项见会话命令 §3。
4. 派生前确认
默认情况下,每个派生请求都会先显示一张标题为「启动子会话」的确认卡片。该卡片不会抢走你正在使用的会话的焦点,系统通知(「子会话启动待确认」)会提醒你有请求在等待确认。
- 卡片显示发起请求的会话及其目录(「发起会话」)、将作为子会话第一条消息的「任务说明」、「运行设置」(「会话类型」「模型」「推理强度」),以及「工作目录」选项:「使用当前目录」或「独立工作树」。
- 模型建议来自所选的智能体。如果没有可用的列表,可以直接输入模型标识符。字段保持为「使用智能体默认设置」时,会使用智能体自身的设置。
- 普通终端会在工作目录中打开,不会执行任务说明中的内容。
- 「启动子会话」(或 ⌘Enter / Ctrl+Enter)会启动子会话;「取消」会放弃该请求。后续请求会排队等待,卡片会显示剩余数量(「另有 N 项待确认」)。
如果希望不经卡片直接启动,可以在「设置 ▸ 行为」中关闭「派生前确认」,或在单条命令中加上 --yes。
5. 工作树:并行工作互不冲突
使用工作树时,子会话会在自己的目录中基于新分支工作,与主工作目录及其他子会话相互隔离。多个智能体同时修改同一个仓库时,推荐采用这种方式。新工作树基于当前提交创建,不包含未提交的改动。如果无法为派生的会话创建工作树,该会话会使用原目录。
在工作树中工作的会话,其左栏图标上会显示一个小徽标;将鼠标悬停在上面可以查看工作树的名称和路径。
使用工作树的其他方式:
- 项目、分组或会话菜单中的新建 worktree 会话…,会打开创建对话框,并将「Worktree」选项设为「新建」。输入「worktree 名称」,它将用作目录名和分支名。该对话框也可以将会话挂到「选已有」的工作树上,或选择「不挂」。
- 分组菜单中的转移到 Worktree…,会将该分组绑定到一个新的或已有的工作树。此后在该分组中创建的会话会使用这个工作树;分组中已有的会话仍保留原来的目录。绑定了工作树的分组还会提供「分组信息」。
如果会话或分组的目录是 git 仓库,其 Git 子菜单包含以下各项:
| 菜单项 | 作用 |
|---|---|
| 「查看改动…」 | 以文件列表和差异对比显示工作树中的改动 |
| 「合并…」 | 打开合并对话框(§6) |
| 「复制 worktree 路径」「打开 worktree 目录」 | 适用于绑定了工作树的会话和分组 |
| 「删除 worktree…」 | 选择该仓库的一个工作树,并从磁盘上删除其目录;「强制删除(丢弃未提交的改动)」即使存在未提交的改动也会将其删除 |
绑定的工作树被删除后,会话或分组菜单中会提供「转为普通会话」或「转为普通分组」,用于解除绑定,使会话重新在项目目录中启动。
删除一个子树中含有工作树的会话时,确认对话框会提供同时删除这些工作树的选项。
6. 合并:图形化 Git 合并
工作完成后即可合并。对于目录是 git 仓库的任何会话或分组(无论是否使用工作树),选择「Git ▸ 合并…」即可打开「合并分支」对话框:
- 选择两个分支。选择「来源分支」和「目标分支」;「调换方向」可将两者互换。同一个对话框既可以将子会话的分支合并回主分支,也可以将主分支合并到子会话的分支中以进行更新。
- 确认之前,对话框会列出此次合并将带入目标分支的改动。
- 合并在检出目标分支的工作树中进行。如果目标分支没有在任何工作树中检出,则无法合并,请先检出该分支。
- 如果来源分支所在的工作树有未提交的改动,会先使用你输入的提交信息提交这些改动(「提交并合并」)。
- 如果合并出现冲突,VelaTerm 会保留冲突现场,并告诉你应在何处解决。请在该工作树的终端中解决冲突(或让智能体来解决),然后提交。
合并不会删除工作树。不再需要时,可以使用「Git ▸ 删除 worktree…」将其删除。
7. 典型工作流程
- 在主会话中与 Claude Code 讨论任务,然后运行
/vspawn-tree refactor the checkout module(需要 Vela 技能)。 - 在确认卡片上检查任务,然后选择「启动子会话」。子会话会在自己的工作树中启动,并显示在左栏中其父会话之下;工作期间状态点为绿色。
- 继续在主会话中工作。子会话提出问题或完成时,其状态点会发生变化,并弹出通知。
- 检查子会话的工作成果,然后选择「Git ▸ 合并…」,将其分支合并到主分支。
- 使用「Git ▸ 删除 worktree…」删除工作树,然后归档子会话以保留记录。