Releases: lire1131/dsh-undo-savepoint
Release list
v0.3.6
v0.3.6 — 快照补齐启动关键文件(lockfile/home patch)、恢复依赖对账(sync_deps)、CI 迁移 Windows、移除 npm 安装方式
修复
- 快照补齐启动关键文件:新增 profile 级
pnpm-lock.yaml与 home 级cordis.patch.yml,与dsh plugin add/update/remove实际改动的状态对齐(issue #8) - 恢复后对账依赖状态:undo/redo/restore 触及
package.json/pnpm-lock.yaml/pnpm-workspace.yaml时,默认报告node_modules可能不同步并给出重建命令;显式开启同步时执行pnpm install --frozen-lockfile(无 lockfile 回退普通pnpm install),安装失败不回滚已还原的配置文件 - watcher 容错(node 20 CI 暴露):
fs.watch补挂 error 处理器——被监听目录被删除/重命名时(测试清理临时目录、真实使用中卸载插件/改目录名),Windows 下 FSWatcher 异步抛EPERM,此前无处理会以未捕获异常炸掉整个进程;现自动关闭该监听并告警,不再崩溃
优化
- 移除 npm 安装方式:README 删除 npm 发布版安装说明与 npm 安装地址,安装方式收敛为 GitHub 直装(方式 A)与本地源码(方式 B)
入口
- 离线 CLI:
dsh-undo.ps1 undo|redo|restore -SyncDeps - 模型工具:
undo_restore新增sync_deps布尔参数 - REST:
/api/undo/undo|redo|restore接受可选syncDeps
CI(纯 Windows,不跨平台)
- CI 迁移 windows-latest:本项目为纯 Windows 插件(
runPnpm走cmd.exe、测试用.cmd假 pnpm),此前 CI 误跑 ubuntu-latest,第 24 节"假 pnpm"测试必然失败(pnpm.cmd在 Linux 上不生效,marker 未生成导致 ENOENT 抛崩)——现已与真实部署环境一致 - fail-fast: false:node 20 / 22 矩阵各自跑完、独立报告,不再互相取消
- 补跑 home-resolution-test.mjs:CI 与
npm test四脚本套件对齐(此前漏跑 issue #6 的 DSH_HOME 回归) - smoke-test §24 诊断加固:sync_deps 失败时打印 restore 输出尾部,marker 缺失走明确断言,不再被未捕获 ENOENT 掩盖真实失败原因
测试
- smoke 106 → 114(新增 lockfile/home patch 快照、字节级还原、默认不同步、显式同步命令校验、spec.json 一致性断言)
- e2e 10/10 无回归;CI 在 windows-latest × node[20,22] 全绿
v0.3.5
v0.3.5 — 支持 DSH_HOME 环境变量(修复 #6)
修复 #6:家目录解析此前硬编码 ~/.dsh,完全不读 DSH_HOME 环境变量。第三方 DSH 客户端(家目录非默认 ~/.dsh)使用本插件时,设置文件、快照根、profile 目录全部指向错误位置——设置偶尔丢失、自定义快照目录重启后回退默认。现已与 DSH 官方 resolveDshHome() 对齐:优先 DSH_HOME,无则回退 ~/.dsh。
修复
lib/index.js:新增 DSH_HOME_DIR 常量(DSH_HOME ?? join(HOME, '.dsh')),LEGACY_ROOT / SETTINGS_FILE / rootDir() / profileDir 共 5 处路径从 join(HOME, '.dsh', ...) 改为基于 DSH_HOME_DIR
tools/dsh-undo-savepoint-lib.ps1:同步对齐,新增 $script:DshHome,UndoSnapshotRoot / UndoHome / UndoSettingsFile / UndoHomeRoot 基于 $env:DSH_HOME 优先
DSH_UNDO_ROOT / DSH_UNDO_SETTINGS 显式覆盖优先级不变(老用户不受影响)
node_modules 发现路径保持 HOME(用户级,不在 .dsh 下)
测试:smoke 106/106、e2e 10/10 全通过(无回归);新增 DSH_HOME 验证——设 DSH_HOME=/tmp/fake 后快照和设置均写入该路径,~/.dsh 无残留;不设时回退行为与 v0.3.4 完全一致
v0.3.4
v0.3.4 — 版本号修正(修复 #5)+ WebUI 快照入口全面增强 + 会话运行中撤销安全闸
修复 #5:package.json 版本号
0.3.3.1非法(四段,非 semver),导致方式 A 安装(dsh plugin add github:lire1131/dsh-undo-plugin#master)被 pnpm/npm 拒绝——已改为合法版本0.3.4,安装恢复可用。
新增
- WebUI 快照入口全面增强(替换社区 PR #4 的"两个小相机图标"方案,改为成套 UI):
- 会话头部「撤销 / 恢复 / 快照」三按钮全部图标化(红色 ↶ / 绿色 ↷ / 相机,单色
currentColor随主题自适应) - 快照按钮 = 一键手动快照:点击立即存档当前配置(等价面板内「手动保存」,成功后按钮旁闪现「已存档 」),不再打开面板
- 头部新增自动快照状态徽章:绿点 + 「已存 N 份快照 · 最近 xx 分钟前」,30 秒自动轮询刷新;点击徽章 = 打开快照面板
- 快照面板头部:相机图标 + 标题 + 当前 profile 副标题(取自最新快照 manifest 的
profile字段)
- 会话头部「撤销 / 恢复 / 快照」三按钮全部图标化(红色 ↶ / 绿色 ↷ / 相机,单色
- 纯客户端改动(
lib/client.js),host 端与快照逻辑零改动
修复
- 会话运行中禁止撤销/恢复/回滚/安全模式切换:有任何 live 会话处于 open turn(agent 正在执行)时一律拒绝并给出明确提示(host 端安全闸 + WebUI 专属提示)。此前撤销会写回
cordis.patch.yml、触发 DSH 内置 HMR 热重建插件树,导致所有正在跑的会话一起中断;空闲时行为完全不变 - #5 版本号非法:
0.3.3.1→0.3.4(合法 semver),CHANGELOG(zh/en)同步 - 新增
tools/check-version.mjssemver 守卫,接入npm test与 CI——非法版本号不再可能合入 master
测试:smoke 106 项(新增运行中守卫:open turn 拒绝且配置未被回滚 / safe-mode 拒绝且 patch 未被改写 / closed turn 放行)+ e2e 回归全绿,CI(commit 9748f5e)通过
v0.3.3
v0.3.3 — 多 profile 支持(issue #3)+ 离线工具环境变量对齐
新增
- 多 profile 支持(issue #3):从启动参数解析当前 profile(
--profile mine/--profile=mine;dsh web回退web),config.profileName可显式覆盖profileDir默认改为当前 profile 目录(此前硬编码web——非 web profile 下快照读错、watcher 漏监听、恢复写错位置)- 快照仓库按 profile 隔离:
<快照根>/<profileName>/{auto,manual};作用域目录不存在而旧平铺目录存在时自动回退平铺(不隐身旧快照) - manifest 增加
profile字段,undo_list显示当前 profile - 离线 CLI/GUI:
DSH_UNDO_PROFILE环境变量或 settingsprofileName指定
- ps1 离线工具支持
DSH_UNDO_ROOT/DSH_UNDO_SETTINGS(与 Node 插件对齐) - package.json 声明
dsh.runtime: "host"(WhaleHarness 审计门槛:使用 child_process 须声明 host runtime) - README 补充多 profile 部署说明(zh/en)
修复
- settings.json 默认位置迁移兼容:旧位置(如
D:\dsh\undo\settings.json)配置的数据不再"隐身"——新位置读取后按配置目录继续工作
测试:smoke 101 项(新增 argv 解析 / manifest profile 字段 / 显式 profileName 覆盖)+ e2e 10 项全绿
v0.3.2
v0.3.2 — 敏感脱敏 + 局外急救全齐 + 设置页独立成栏
安全
- 敏感信息脱敏 + 本机 vault(默认):.env / .credentials.yaml 快照内值替换为 REDACTED,导出 ZIP 零泄露;本机回滚完整还原,换机占位+提示
- diff 两侧脱敏:修复当前文件侧明文泄露(如 DEEPSEEK_API_KEY: sk-...),界面永不出现真实值
- 导出敏感警告:含明文密钥的导出明确警告"请勿外传"
- .credentials.yaml 纳入快照范围
局外急救(DSH 挂了也能救)
- GUI 崩溃横幅升级(last-good 一键回退)+ 安全模式按钮 + 标题显示敏感模式
- CLI:recent 命令、settings -Set 离线改设置、恢复输出 needsRestart/预检/脱敏提示
体验
- WebUI 设置独立「快照」侧栏栏目(敏感模式下拉、插件白名单、目录选择)
- 设置双端同步修复(keepPre/autoCleanup);GUI 浏览按钮
- 孤儿 blob 清理(跨机导入残留不再占空间);undo_list 显示敏感模式
测试:smoke 98 项 + e2e 10 项全绿
v0.3.1
v0.3.1 — 跨机一致性预检 + 双语迁移指南
新增
- 跨机一致性预检:undo/redo/restore 时自动扫描目标快照引用的插件(patch 挂载条目 + package.json bundles),本机解析不到的明确列出并提示"恢复后可能启动失败",建议先装插件或安全模式启动
- 多锚点探测(用户 node_modules / profile 依赖树 / 插件位置链),任一可解析即视为已装,junction 布局下不误报
- 本地文件条目(name: './xxx')不探测;预检结果写入回滚日志
- docs/migration 双语文档:跨机迁移行为说明(插件代码不会塞进目标机、blob 残留、patch 缺插件的坑)+ 最佳实践,中英双语
- README 功能表(中英)同步更新
修复
- toolsRequire 提升为模块级(此前块级作用域导致 ReferenceError 被 try/catch 静默吞掉)
测试:smoke 71 → 76 项,e2e 10/10
v0.3.0
v0.3.0 — 崩溃归因 + 一键安全模式 + 重启联动(第 2 期)
新增
- 崩溃归因升级:启动自检从 .booting 升级为 boot-state.json,记录每次启动结果与"最后正常启动时间";上次异常退出时,undo_list 与 WebUI 直接给出具体的最后正常快照 id + 一键回退按钮,不再只说"上次崩溃了"
- 一键安全模式:对话工具 undo_safe_mode / WebUI 快照面板「安全模式」按钮 / 离线 CLI
safe-mode on|off|status——进入时自动快照 + 备份 cordis.patch.yml,把配置最小化(只留撤销系统),保证 DSH 一定能启动;退出恢复原配置。DSH 完全起不来时的终极兜底 - 重启联动:undo/redo/restore 涉及插件代码或挂载配置时,报告与 WebUI 明确提示"重启 DSH 后生效",回滚日志同步记录
测试:smoke 56 → 71 项(崩溃归因 / 安全模式往返 / 重启提示),e2e 10/10
v0.2.1
v0.2.1 — 一键桌面快捷方式
新增
- 一键桌面快捷方式:
tools/make-desktop-shortcut.bat(双击)/.ps1自动定位插件目录,桌面创建「DSH撤销管理器」快捷方式——解决"装完找不到局外工具" - README 新增「局外工具在哪」章节:两种安装方式的工具路径 + 一段无需先找文件的一行命令 + 打开工具目录命令
修复
- 澄清包名/仓库名差异:安装命令写
dsh-undo-plugin,装好后目录名是包名dsh-undo-savepoint——按仓库名找目录必然找不到,README 已标注
v0.2.0 — 插件代码级撤销(第 1 期)
新增
- 插件代码树快照:自动发现用户插件(node_modules 下的 junction,如 D:\dsh\plugins*)与 profile 本地代码文件(cordis.patch.yml 里 name: './xxx' 引用)——插件代码被改坏也能撤销,配置没变也能撤(如 whale-kit "yield* is not async iterable" 纯代码事故)
- 体积 4 道保险:扩展名白名单(资源文件不进快照,pet 57MB→47KB)、内容寻址 blob 库去重(没变的文件零拷贝)、单文件/单快照上限(超限记录 skipped)、按引用恢复(缺失明确报告)
- 插件文件 diff:undo_diff 与 WebUI 差异预览显示 plugin:/profile: 条目
- 插件 watcher:插件代码目录变化自动快照(plugin-code-change),恢复动作自身不误伤
- 单一清单 lib/spec.json:Node 与 PowerShell 共用一份快照范围配置
- pluginDirs 设置(空数组 = 关闭自动发现);导出/导入含 blob 库;manifest 记录插件名/版本/跳过项
修复
- 旧快照在 PowerShell 离线工具下被 @($null) 单元素数组污染(过滤空值)
- 离线 CLI diff 统一走 Get-UndoDiffText(支持插件文件)
- ps1 文件统一 UTF-8 BOM,PowerShell 5.1 正确解析中文注释