dsh-any-rollback:对话回退时一并还原工作区(含命令产物)

前言

在 DSH 里用 AI 改代码、跑脚本,一个回合往往同时留下两类痕迹:对话里的消息,以及工作区里的文件。若只想「回到某一步重来」,只回退对话会留下改到一半的文件;只手动还原文件,对话上下文仍停在错误分支。常见做法是开新会话或自己清理 out/、dist/ 等目录,代价是丢上下文或容易误删。

下面介绍社区插件 dsh-any-rollback(维护者 xinstart-1):在当前对话窗口内回退到任意一条历史用户消息,并可选择同时把文件还原到那一刻的状态,包括渲染、ffmpeg、构建脚本等命令产出的文件,而不只是模型通过 write/edit 改过的源码。插件分类为「工作流」,可在 SkillHub 目录页 查看条目;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。DSH 本身遵循「一切皆插件」的扩展方式,本插件以 MIT 许可发布,安装前建议自行查看 GitHub 仓库 源码与许可证;插件在当前 DSH 进程权限下运行,备份与还原范围与宿主可访问的路径一致。

这是什么

dsh-any-rollback 是 DSH 的对话回退插件:不 fork 会话、不开新窗口,点消息旁的 ↶ 或使用 /rewind 等命令,即可把对话视图撤回到指定用户消息之前,并把输入框填回被撤回的那句话;可选地依据插件自有的备份目录,把工作区文件一并还原。会话日志仍只追加、不删除,回退仅改变界面上的对话视图。

核心功能

按消息回退对话

每条用户消息旁有 ↶ 按钮。点击后,该消息之后的内容从对话视图上撤下,输入框自动填回被撤回的用户文本,改一改即可重新提问。

也可使用命令:

命令 作用
/rewind <序号> 回退到第 N 条用户消息之前
/rewind @<seq> 按会话内序号回退
/undo 取消上一次回退

同时还原工作区文件

回退时可选择只退对话、只退文件,或两者都退。文件还原只写回插件真正备份过的内容,不猜测、不推断。

追踪命令产出的文件

多数工具只备份模型直接编辑的文件;本插件在每个回合边界记录一份工作区清单(路径 → 大小 + mtime + sha256),对发生变化的文件按内容摘要缓存(相同字节不重复占空间)。回退时逐文件判断:有备份则还原字节;目标时刻不存在、现在却有的文件移入隔离区;超大或未缓存且无法还原的,移入隔离区并提示需重新生成。隔离区只移动、从不删除,去向记在 quarantine/index.json,可人工取回。

默认跳过 node_modules、dist、build、out 等目录(可通过 artifactExclude 调整);点目录(如 .output/)默认参与追踪,固定跳过 .git、.dsh 等 VCS 与工具状态目录。

快照自动清理

备份会占磁盘空间,插件支持按策略自动清理,也可查看状态或手动执行:

命令 作用
/snapshot-auto-cleanup 查看当前状态
/snapshot-auto-cleanup on\|off 启用 / 停用自动清理
/snapshot-auto-cleanup max-age <天数> 设置闲置天数上限
/snapshot-auto-cleanup run [--apply] 预演,或真正执行清理
/snapshot-auto-cleanup run --current [--apply] 只清理当前会话的备份

DSH 插件页还提供独立设置卡片,可开关文件备份、调整自动清理,无需手改配置文件。

配置项(节选)

键 默认值 说明
fileCheckpointingEnabled true 是否记录新的文件备份
maxFileBytes 8388608(8 MiB) 单文件备份上限,0 表示不限制
snapshotDir ~/.dsh/rewind-snapshots/ 备份存放根目录
artifactTrackingEnabled true 是否追踪命令产出的文件
artifactMaxFileBytes 67108864(64 MiB) 命令产物单文件缓存上限
artifactExclude node_modules,dist,build,out,... 追踪时跳过的目录
autoCleanupEnabled true 自动清理开关
autoCleanupMaxAgeDays 30 备份闲置多少天后可清理

完整说明见仓库 README「配置项」一节。

数据存放位置

备份目录与工作区分离,删掉备份目录只会丢失回退能力,不会动项目本身:

~/.dsh/rewind-snapshots/<会话ID>/
  <消息序号>/            # 每条消息对应的文件备份
  artifacts/
    manifests/           # 每个回合边界一份工作区清单
    quarantine/          # 回退时移出的文件
    quarantine/index.json

安装与启用

环境要求:DSH >=0.2.1-rc.1 <0.3.0-0;Node.js ^22.19.0 或 >=24.0.0。

从 Release 安装(推荐)

在 profile 的 package.json 中加入依赖(版本以 Release 为准,当前资料为 v0.19.1-any.8):

"dependencies": {
  "dsh-any-rollback": "https://github.com/xinstart-1/dsh-any-rollback/releases/download/v0.19.1-any.8/dsh-any-rollback-0.19.1-any.8.tgz"
}

在 profile 目录执行安装并重启 DSH(Windows 示例,路径中的 <profile> 换成你的 profile 名):

$node = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
$pnpm = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.mjs"
& $node $pnpm install --dir "$env:USERPROFILE\.dsh\profiles\<profile>" --prefer-offline

必须把 dsh-any-rollback 写入该 profile 的 dsh.profile.bundles 数组,该数组才是加载插件的开关。装完后重启 DSH;跑一个回合后,确认 ~/.dsh/rewind-snapshots/<会话ID>/artifacts/manifests/ 下出现清单,且用户消息旁出现 ↶。

仓库提供 node scripts/verify.mjs 校验已装包内关键文件的 SHA-256,期望值见 README「校验安装」表格。

卸载

从 dependencies 和 dsh.profile.bundles 移除 dsh-any-rollback 后重新安装依赖;备份数据不会自动删除,需手动删除 ~/.dsh/rewind-snapshots/ 才能彻底清理。

典型用法

  1. 多轮试错后,在某条用户消息旁点 ↶,选择同时回退对话与文件,从该步在同窗口继续改 prompt 或任务。
  2. 生成视频或构建产物跑了几版,想回到较早一轮:回退后命令新建的文件会进隔离区,已备份的内容写回工作区,无需手删 out/ 里一堆 mp4。
  3. 误操作回退后,用 /undo 撤销上一次回退。
  4. 磁盘紧张时,先 /snapshot-auto-cleanup run 预演,再 run --apply 执行清理。

适用场景与注意

适合:需要在同一 DSH 会话里「原地」回到任意用户消息,且希望文件状态(含脚本/命令产物)与对话上下文一致的场景。

边界(README 已写明):

  • 回退依赖已有备份;插件启用前、或关闭备份期间的改动无法还原。
  • 会话被 compact 之后,早于压缩点的消息不再出现在回退列表。
  • 超过 maxFileBytes / artifactMaxFileBytes 的文件不缓存内容,跨上限的改动无法还原,回退时会提示并保持或移入隔离区,不再误删工作区文件。

设计取舍上:会话日志只追加;回退移出的文件一律进隔离区、不直接删除;只还原有备份的字节。

结尾

dsh-any-rollback 把「撤对话」和「还原工作区(含命令产物)」绑在同一次操作里,适合在 DSH 里长对话、多轮跑脚本试错的开发流程。目录与说明:

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

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

Xiaoye