前言¶
在 DeepSeek Harness(DSH)里对会话做「分叉」,会新建一条独立会话,但侧栏默认按最近活动排序,分叉行往往和父会话分开,看起来像两条无关记录。会话一多,很难一眼看出哪条分支从哪条父会话长出来。下面介绍社区插件 dsh-session-fork-tree(维护者 ayuanxx-max),它不改核心包,只在侧栏把 parentSessionId 关系画成缩进树,并配合折叠与悬停高亮,方便做分支实验。分类为工作流;仓库 GitHub 与 SkillHub 目录页 可查阅详情。SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
DSH 会话分叉树排列功能(DSH Session Fork Tree Arrangement)是一条 Cordis bundle:fork 出来的会话挂在父会话下面,带圆角连接线、绿色 + 展开器,以及悬停时的祖先链高亮。README 写明兼容 DSH Desktop / Web;当前平台支持以仓库说明为准——Windows 11(DSH Desktop)标注为稳定运行,Ubuntu 测试中,macOS 计划中。
核心功能¶
经 README 核实,插件主要做五件事:
- 归属与顺序:子会话紧跟父会话显示;可选配置把顺序写回
workspace.sessionIds持久化,否则仅在渲染层按父链排序。 - 缩进与连接线:子行缩进 16px;从父标题左缘起画
╰(竖线到行高一半后转横线,圆角 8px,窗口变化时重算)。 - 折叠:有分叉的会话,名称右侧出现绿色
+,默认全部收起;点击展开(展开时+带绿色边框),再点收起,支持逐层递归。 - 悬停高亮:鼠标划过子行时,整条祖先链变亮。
- 自动命名:若分叉标题仍为系统默认形式(如
父名 (1)),会改为父名 · 分叉N(N 为同父分叉创建顺序);用户手动改过的标题不会被覆盖。
实现上分为 Host 与 Client:Host 从 sessionController.list() 读取 SessionSummary.parentSessionId 生成谱系,并提供 GET /fork-tree/lineage.json、GET /fork-tree/style.css(客户端约每 15 秒重取样式,改样式无需重启)等;Client 注册官方槽位 sidebar.session.row.leading 与 sidebar.workspaces.session.row.action,用 MutationObserver 在新建分叉后约 0.2–0.5 秒内归位。数据仅使用官方 API,不改 app.asar。
与同维护者的 dsh-session-accordion(会话折叠成单行)可组合使用;仓库内另有 会话管理指南 说明折叠与分叉树搭配用法。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前建议浏览仓库源码与 MIT 许可证。npm 安装为 README 推荐方式(示例版本 @0.9.0,与 README 安装节一致):
桌面版(profile=desktop):
dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0
或免全局安装:
npx -y @deepseek-ai/dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0
Web UI(profile=web):
dsh plugin --profile web add dsh-session-fork-tree@0.9.0
安装后需完全退出 DSH 再启动才会加载。卸载示例:
dsh plugin --profile desktop remove dsh-session-fork-tree
并按 README 从 profile 的 dsh.profile.bundles 中移除 dsh-session-fork-tree 后重启。
Linux / macOS 若 npm 包不可用,README 给出本地 link 方式:克隆仓库后执行 dsh plugin --profile desktop add "link:$REPO",再在 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 中加入 "dsh-session-fork-tree",然后完全退出并重启。顺序须为先 dsh plugin add,再改 bundles,最后重启;只做其一可能导致未加载或启动失败。
若重启后 DSH 无法打开,可在 profile 的 cordis.patch.yml 末尾追加禁用条目后重启恢复:
- id: fork-tree
disabled: true
典型用法¶
经过安装并重启,打开侧栏即可使用,无需额外命令:
- 对某会话执行分叉后,新会话会自动缩进到父会话下方。
- 父会话若存在子分叉,名称右侧出现绿色
+(默认收起);点击展开子树,再点收起。 - 子会话若继续分叉,会出现下一层
+,逐层展开。 - 悬停在子行上,父行与中间祖先同时高亮。
- 刷新页面或重启 DSH 后,折叠状态回到「全部收起」(折叠状态仅存内存,README 已知限制)。
可选配置写在 profile 的 cordis.patch.yml,覆盖 bundle 的 config(升级不丢):
- id: fork-tree
name: 'dsh-session-fork-tree'
config:
renames:
- sessionId: session-…
title: '父会话 · 分叉1'
reorder:
- sessionId: session-…
afterSessionId: session-…
reorder 用于把「子紧跟父」写入 sessionIds;不配置时客户端仍会在渲染层排序。
诊断可在页面 Console 执行 __ftReport() 查看当前行、缩进、连接线坐标与折叠状态;Host 自报文件位于 %TEMP%\fork-tree-report.json(Linux 上对应系统临时目录)。
适用场景与注意¶
适合经常在 DSH 里用分叉做方案对比、提示词迭代或多路径实验、且侧栏会话较多的开发者。不适合期待「折叠状态跨重启记忆」或「与任意未来侧栏 DOM 永久兼容」的场景——插件依赖侧栏内部结构与 parentSessionId,上游改版可能静默失效;行顺序在极少数情况下可能与宿主重排争抢一次,由 MutationObserver 再纠正;仅作用于当前已挂载的可见会话行。
前置:DSH 桌面版或 dsh web,可用 profile(默认 desktop),Node.js >= 18(见 package.json engines)。故障排查时查看 ~/.dsh/logs 最新日志中的 boot / activate 报错;若自行改过包名,须保证 client.js 里 window.__ModuleLoader__.load 的 id 与 package.json 的 name 一致。
结尾¶
dsh-session-fork-tree 把 DSH 侧栏里互不相干的分叉行,收成可折叠、可高亮的父子树,改动集中在官方槽位与 API,便于在不动核心的前提下理清分支关系。