智能体在开发过程中会对工作目录进行破坏性改动。git checkout . 无法处理未提交的更改或非仓库目录,这正是智能体操作最常出现的窗口。dsh-rewind 通过内容寻址快照和可撤销的撤销命令,为任意目录提供“时间旅行”能力。
这是什么¶
dsh-rewind 是一个 DSH 插件,由 liyixuan201211 维护。它不依赖 git,能够捕获未提交的更改、从未被跟踪的文件以及非仓库目录的状态,并提供一键回滚和可撤销的撤销机制。
安装与启用¶
在 DSH 环境中安装该插件:
dsh plugin --profile web add github:liyixuan201211/dsh-rewind
安装后,可在任何目录下使用 rewind 命令。
核心功能¶
- 内容寻址快照:对任意文件夹进行快照,文件内容通过 SHA256 哈希寻址,支持最多 8 MiB 的文件。
- 可撤销的撤销:
undo命令在执行前会先保存当前状态,因此撤销操作本身也可以被再次撤销。 - 通用目录支持:同时支持 git 和非 git 目录。
- 命令包装器:
rewind exec用于包裹批量文件修改命令,在前后自动进行快照。 - 监控模式:
rewind watch提供保护机制,通过防抖动和内容校验,适合长会话。 - 安全属性:确保原子写入、写入前内容验证、非递归删除以及仅追加日志。
典型用法¶
创建快照¶
在执行可能破坏性的操作前,创建一个标记:
rewind snap --label "before the refactor"
撤销操作¶
undo 命令默认处于“计划模式”,不直接修改文件,仅打印操作计划:
rewind undo
若要执行撤销,必须显式指定 --yes:
rewind undo --yes
批量修改与回滚¶
使用 rewind exec 包装代码转换或构建命令:
rewind exec -- npx jscodeshift -t transform.js src/
长会话保护¶
启动监控模式,设置 2 秒防抖:
rewind watch --debounce 2000
存储位置与排除项¶
快照数据存储在项目根目录的 <root>/.rewind/ 下,包含元数据、日志和对象文件。默认排除 .git、node_modules、.venv、__pycache__、dist、build、target 等路径。若路径未被捕获,插件将拒绝删除该路径,以确保撤销的安全性。
退出码契约¶
插件通过退出码定义操作状态:
| 代码 | 含义 |
|---|---|
| 0 | 操作正常 |
| 1 | 应用时出错,部分路径可能未恢复 |
| 2 | 用法错误 |
| 3 | status:树结构与上一次快照不同 |
| 4 | undo:计划已生成,但未执行(未加 --yes) |
| 5 | 拒绝:遇到不安全路径或未捕获的内容 |
| 6 | 无操作(未加 --yes 且无变更) |
结语¶
dsh-rewind 为智能体开发提供了一个可靠的“后悔药”。它通过内容寻址和严格的安全属性,确保了目录状态的可逆性。更多细节可参考插件目录页或GitHub 仓库。