Pi Session 管理:tree、fork、clone 与 handoff

最喜欢 Pi 的特性之一就是对 session 的管理很方便。Pi 的 session 不是线性的——它是树形的。每次回溯到某个历史节点重新发消息,就会在那个点分出一个新分支。

先看 session 长什么样

下面是一段典型的对话树:

user: "帮我写一个排序函数"
└─ assistant: "这是冒泡排序..."
   ├─ user: "改成快排" → assistant: "这是快速排序..."
   │  └─ user: "加注释" → assistant: "已加注释"  ← 当前活跃
   └─ user: "用 Rust 写" → assistant: "这是 Rust 版本..."

你随时可以回到"帮我写一个排序函数"或"改成快排"那个点,走另一条路。走了新路之后,原来的分支不会消失——它还保存在同一个 session 文件里。这就是 Pi 的 /tree ,目前 Claude Code 和 Codex 都还没有到特性。

/tree — 同一Session内切换分支

不创建新 session 文件。 打开一个树形导航器,显示当前 session 的全部对话节点。

在 /tree 里你可以:

常用按键:↑↓ 浏览、Enter 选择、Esc 取消、Shift+L 打标签、Ctrl+O 切换过滤模式(默认/隐藏工具结果/只看用户消息/只看有标签的)。

适用场景:想在同一话题下探索"如果当时选另一个方案",但不想把 session 拆成好多文件。

/fork — 从历史消息创建新 session

创建一个全新的 session 文件。 打开一个选择器,只列出用户消息。选一条之后,Pi 用一个新的 session 文件,从那条消息的父节点开始。

/fork 和 /tree 的关键区别:

/fork 的新 session 会带着 fork 点之前的所有上下文。

适用场景:一个 session 里聊了太多不同话题,想把某个方向拆出去独立跟进。比如"我们在修 bug 的途中发现了一个新需求"——把新需求 /fork 出去就不会和 bug 修复混在一起。

/clone — 复制当前分支为新 session

创建新文件,把当前活跃分支完整复制过去。起点就是当前所在的节点。

和 /fork 的区别:

等效于"把我当前已经聊出来的这条路,完整拷贝一份"。原 session 还在原处,但你可以在拷贝里随意折腾而不影响原文件。

适用场景:当前分支的方向已经不错了,但你想在不搞乱原文件的前提下做大量修改性探索。或者你想给当前的进展留一个"快照",以防接下来改崩了。

也可以用 CLI 启动:pi --fork <path|id> 或 pi --clone。

/handoff — 用 LLM 提炼后交接

这是 extension,不是内置命令。 需要先安装:

cp ~/.nvm/versions/.../examples/extensions/handoff.ts ~/.pi/agent/extensions/

前面三个命令都是"机械式"的分支操作——原样复制或切分对话。/handoff 不同:它先让模型(默认)把当前对话总结提炼,再创建新 session。

执行 /handoff <目标> 时发生的流程:

  1. 收集当前 session 的对话历史(包括压缩过的部分)

  2. 调用模型分析:关键决策是什么、涉及了哪些文件、现在在做什么

  3. 生成一个结构化的 prompt:

    ## Context
    We've been working on X. Key decisions:
    - Decision 1
    - Decision 2
    Files involved: path/to/file1.ts, path/to/file2.ts
    
    ## Task
    [清晰描述下一步该做什么]
    
  4. 创建新 session,把生成的 prompt 预填到编辑器里

  5. 你可以审核、编辑,然后直接发送

适用场景:对话了几百轮,上下文要爆了,但还需要继续做相关的工作。直接 /new 会丢失大量背景;但原样带着全部历史又不现实。/handoff 让 LLM 帮你提炼关键信息,用很小的上下文窗口携带最重要的事。也是从一个大型任务过渡到下一个子任务的理想方式。

四种方式对比

/tree /fork /clone /handoff
创建新文件 否 是 是 是
选择起点 任意节点 任意用户消息 当前活跃分支 当前上下文
上下文处理 原样保留,可加分支总结 从切点开始,带之前的上文 完整复制当前分支 LLM 总结提炼
新 session 预填 原消息文本或空 原消息文本 最后一条用户消息 生成的精炼 prompt
适用场景 同文件内探索备选方案 拆分历史话题独立跟进 备份当前分支再改 上下文太长需要"交接"
内置/extension 内置 内置 内置 需安装 handoff.ts

什么时候用哪个