用户手册

会话派生与 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. 典型工作流程

  1. 在主会话中与 Claude Code 讨论任务,然后运行 /vspawn-tree refactor the checkout module(需要 Vela 技能)。
  2. 在确认卡片上检查任务,然后选择「启动子会话」。子会话会在自己的工作树中启动,并显示在左栏中其父会话之下;工作期间状态点为绿色。
  3. 继续在主会话中工作。子会话提出问题或完成时,其状态点会发生变化,并弹出通知。
  4. 检查子会话的工作成果,然后选择「Git ▸ 合并…」,将其分支合并到主分支。
  5. 使用「Git ▸ 删除 worktree…」删除工作树,然后归档子会话以保留记录。