dsh-file-history:按轮次快照 DSH 工作区,一键还原文件或对话

前言

在 DeepSeek Harness(DSH)里让智能体改代码,常见做法是盯着 diff、靠 git 回滚,或者手动从备份里捞文件。一轮对话里可能动很多文件,还可能通过脚本间接写入磁盘;若只想撤销「这一轮」的改动,又不想动项目里的提交历史,就需要把「一轮」当成时间单位来记、来退。

下面介绍社区插件 dsh-file-history(维护者 EmptyVessel-000,SkillHub 分类为「记忆」)。它在每一轮对话结束后对工作区拍快照,在改动了文件的回复下方展示变更卡片,并支持只还原文件、只还原对话、或两者一起还原;侧栏还提供时间线与检查点。数据存放在 ~/.dsh/file-history/,不读写项目目录下的 .git。

这是什么

dsh-file-history 是面向 DSH Web 端的文件历史插件:每一轮对话结束,插件记录该轮前后工作区在磁盘上的真实状态(不限于 AI 工具直接写入的文件),并在有改动的回复下展示文件列表、增删行数与 diff,配合还原与分支操作。

简介(仓库与目录页一致):Per-turn snapshot of your DSH workspace. Any turn can be restored — files, conversation, or both.

核心功能

按轮次快照

快照落在 $DSH_HOME/file-history/(默认 ~/.dsh/file-history/),不进项目目录。项目没有 .git 也能用;有 git 仓库时插件也不读写项目里的 .git、提交、分支或暂存区。内容相同的文件只存一份;超出保留策略的旧记录会回收。

对话下方的变更卡片

只有真正改动了文件的轮次会出现卡片:列出新增 / 修改 / 删除、各文件增删行数、被跳过的大文件数量。点文件名可看该轮 diff;底部四个操作——只还原文件、只还原对话、全部还原、从这一轮开分支;还原后可「撤销还原」。

侧栏时间线

「文件历史」页倒序展示:顶部为「现在」,往下是检查点与各轮。可展开详情并还原。检查点圆点颜色区分来路(会话开头、分叉、手动标记);父分支上的轮次压暗只读,操作按钮不可用。

输入框上方的改动条

当存在检查点且工作区与检查点不一致时,显示差异摘要(文件数、增删行数),可展开逐文件查看并「还原到检查点」。若同一线上的另一分支更晚改过同一文件,会出现提示并可跳转到该分支会话。

检查点

可在侧栏或卡片上「设为检查点」,保存当前文件树。检查点与会话线绑定;从同一会话分叉出去的会话共用一条线。自动裁剪按分支计算:保留最近 keepRecentTurns 轮,并在该族检查点足够时以 pruneAfterCheckpoints 为切点裁剪。

侧栏底部提供「清除轮次快照」(保留骨架与分支节点)与「清除所有分支历史」(含检查点,回到刚安装时的状态),仅作用于当前会话线的分支族。

还原行为摘要

操作 磁盘文件 对话
只还原文件 写回该轮开始前的内容 不动
只还原对话 不动 从该轮之前分叉新会话,原会话保留
全部还原 写回该轮开始前的内容 分叉新会话并切换过去

「从这里开分支」把文件恢复到该轮结束时的样子并开新会话,不删除原会话及之后轮次。手动改动的文件不计入插件历史,还原时会被快照覆盖。

插件不做代码审查,也不替代 git。实现上借鉴 VS Code 侧栏「时间线」的思路,单位从「一次保存」换成「一轮对话」,并可在对话内连对话一起回退。

安装与启用

需要 DSH 0.1.x(package.json 中 engines.dsh 为 ^0.1.5)、Node.js ≥ 20、git ≥ 2.20。git 不在 PATH 时可通过配置 gitPath 或环境变量 DSH_FILE_HISTORY_GIT 指定绝对路径;找不到 git 时不阻断对话,卡片上会提示不可用。

安装(Web profile):

dsh plugin --profile web add dsh-file-history

装完后重启 DSH。卸载:

dsh plugin --profile web remove dsh-file-history

配置写在 profile 的 cordis.patch.yml,也可在 设置 → 插件 → 文件历史 中修改,下一轮生效,无需重启。示例字段见仓库 config.example.yml:

- insert:
    - id: file-history
      name: 'dsh-file-history'
      config:
        gitPath: ''
        excludes: []
        maxFileBytes: 5242880
        maxEntries: 100
        pruneAfterCheckpoints: 2
        keepRecentTurns: 20
        maxDirFiles: 20000
        maxRepoFiles: 20000
        maxBytes: 2147483648

默认排除 node_modules、.git、dist、build、.venv 等,单文件超过 5 MB 不记;工作区内嵌 git 仓库按文件记录并沿用该仓库的忽略规则。

典型用法

  1. 安装并重启 DSH,在侧栏打开「文件历史」(面板不会自动弹出)。
  2. 与智能体正常对话;某轮若改动了工作区文件,在该回复下方查看变更卡片,点文件名核对 diff。
  3. 改错时按需点「只还原文件」「只还原对话」或「全部还原」;需要保留当前会话又试另一条路时,用「从这里开分支」。
  4. 在满意状态点「设为检查点」;之后输入框上方会持续对比检查点,可随时「还原到检查点」。
  5. 在时间线中跳到任意轮次或检查点查看详情;父分支只读轮次需通过改动条上的卡片切到对应分支再操作。

适用场景与注意

适合在 DSH 里频繁让智能体改同一工作区、又希望按「轮」回滚且尽量不碰项目 git 历史的开发者。也适合没有初始化 git 的临时目录。

使用前请注意:

  • 插件以当前 DSH 进程权限读写工作区与 ~/.dsh/file-history/;安装前建议查看 GitHub 源码 与 MIT 许可证。
  • 只跟随会话工作目录,不跨盘扫描;符号链接按普通文件处理;安装前的改动不在历史中。
  • 手动删除 file-history/ 下数据后历史无法找回;这不是永不丢失的归档工具。
  • 与 dsh-better-sidebar 的「本轮产出文件」共用位置,同时安装时以本插件卡片为准。

已知限制与数据策略以仓库 README「已知限制」「数据」两节为准。

结尾

dsh-file-history 把 DSH 工作区的变更粒度对齐到「每一轮对话」,在对话内完成查看 diff、还原文件或分叉会话,历史与项目 git 解耦。当前版本为 0.2.4(见仓库 package.json)。

  • SkillHub 目录页:https://www.skillhub.cn/plugins/EmptyVessel-000/dsh-file-history
  • 源码与文档:https://github.com/EmptyVessel-000/dsh-file-history

社区插件目录由 SkillHub 等站点维护,与 DeepSeek / 幻方无官方从属关系;DSH 本身遵循「一切皆插件」的扩展方式,可按需从目录选用并自行审阅源码。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜