🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

纪代快照守护 NokorinNishikino/kidai-snapshot-guard

DeepSeek 客户端
NokorinNishikino52 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

自动留存良好快照,崩溃后一键回滚配置

30.9/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/NokorinNishikino/kidai-snapshot-guard.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 52 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包kidai-snapshot-guard(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 06:04:56

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 103 处,展示前 39 条)
  • 读取本地文件
    lib/index.js:51
    const state = JSON.parse(readFileSync(p, "utf8"));
  • 读取本地文件
    lib/index.js:63
    if (!existsSync(root)) return 0;
  • 读取本地文件
    lib/index.js:66
    entries = readdirSync(root, { withFileTypes: true });
  • 读取本地文件
    lib/index.js:75
    const meta = JSON.parse(readFileSync(metaPath, "utf8"));
  • 写入本地文件
    lib/index.js:80
    writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\n`);
  • 写入本地文件
    lib/index.js:106
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:107
    writeFileSync(join(dir, "kidai-launch-notice.json"), `${JSON.stringify(notice, null, 2)}\n`);
  • 发起网络请求
    lib/client.js:122
    const response = await fetch(API + path, options);
  • 发起网络请求
    lib/client.js:488
    const response = await fetch(`${API}/import`, { method: "POST", body: file });
  • 写入剪贴板
    lib/client.js:730
    navigator.clipboard?.writeText(`${status.home}\\.kidai-snapshots`);
  • 读取本地文件
    lib/backup.js:62
    return JSON.parse(readFileSync(path, "utf8"));
  • 读取本地文件
    lib/backup.js:92
    if (existsSync(join(candidate, "profile-selection", "state.json"))) return candidate;
  • 读取本地文件
    lib/backup.js:117
    marker = JSON.parse(readFileSync(markerPath, "utf8"));
  • 删除本地文件
    lib/backup.js:123
    rmSync(markerPath, { force: true });
  • 写入本地文件
    lib/backup.js:135
    writeFileSync(join(home, "cordis.patch.yml"), marker.homePatch);
  • 写入本地文件
    lib/backup.js:144
    mkdirSync(dirname(pmPath), { recursive: true });
  • 写入本地文件
    lib/backup.js:145
    writeFileSync(pmPath, marker.pmState);
  • 删除本地文件
    lib/backup.js:152
    rmSync(markerPath, { force: true });
  • 读取本地文件
    lib/backup.js:170
    if (!existsSync(metaPath)) {
  • 写入本地文件
    lib/backup.js:179
    writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\n`);
  • 读取本地文件
    lib/backup.js:195
    if (!existsSync(join(profileDir, "package.json"))) return undefined;
  • 删除本地文件递归
    lib/backup.js:200
    rmSync(dir, { recursive: true, force: true });
  • 写入本地文件
    lib/backup.js:202
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/backup.js:206
    if (!existsSync(src)) return undefined;
  • 写入本地文件
    lib/backup.js:208
    copyFileSync(src, join(dir, rel));
  • 删除本地文件递归
    lib/backup.js:470
    rmSync(snapshotDir(home, id), { recursive: true, force: true });
  • 删除本地文件递归
    lib/backup.js:880
    rmSync(target, { recursive: true, force: true });
  • 读取本地文件
    lib/api.js:75
    const parsed = JSON.parse(readFileSync(join(home, "guard", "kidai-snapshot.json"), "utf8"));
  • 写入本地文件
    lib/api.js:94
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/api.js:95
    writeFileSync(path, `${JSON.stringify(settings, null, 2)}\n`);
  • 读取本地文件
    lib/api.js:192
    const data = readFileSync(result.path);
  • 读取本地文件
    lib/api.js:207
    if (!existsSync(target)) {
  • 读取本地文件
    lib/api.js:228
    if (!existsSync(target)) {
  • 删除本地文件
    lib/api.js:233
    rmSync(target, { force: true });
  • 读取本地文件
    lib/api.js:248
    if (!existsSync(target)) {
  • 读取本地文件
    lib/api.js:272
    const data = readFileSync(result.path);
  • 写入本地文件
    lib/api.js:317
    mkdirSync(tmpDir, { recursive: true });
  • 写入本地文件
    lib/api.js:319
    writeFileSync(tmp, buffer);
  • 删除本地文件
    lib/api.js:373
    rmSync(join(home, "guard", "kidai-launch-notice.json"), { force: true });
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 关闭自动保存快照
  • 单zip备份导出导入
  • 隔离自动恢复

KSG 纪代备份:DSH 内部备份插件,关闭自动保存快照、开机确认、单 zip 备份导出导入恢复、隔离自动恢复、多主流备份插件文件兼容

README

由 DeepSeek 最新模型翻译生成
💾 Kidai Snapshot Guard · 纪代快照守护 DSH 内部的自动备份管家 —— 关门前保存 · 开机后确认 · 一键回滚 简体中文 · English ✨ 为什么用? DeepSeek Harness(DSH)的配置改动(装插件、更新、启停)一旦让 DSH 起不来,最需要的是「改之前的样子」。纪代快照守护在 DSH 内部自动完成快照的「保存 → 确认 → 恢复」闭环,并与外部的 Kidai Plugin Remote 共享同一份存储——DSH 起不来时,外部管理器照样能回滚。 - 💾 关闭前自动保存 —— 每次 DSH 正常关闭都保留一版最近良好快照(配置 + 设置 + 第三方插件目录),滚动保留最新 3 份 - ✅ 开机自动确认 —— 每次成功启动,把待确认快照转为「已验证」(保留到下次成功运行) - 📦 单 zip 备份 —— 整个快照一键导出 / 导入 / 恢复为一个离线 zip——DSH 起不来也能恢复 - 🔄 隔离自动恢复 —— 外部管理器的「一次性隔离」被打断时,下次启动自动还原隔离前配置 - 🔔 启动通知 —— 「纪代备份」页顶部显示启动成功 / 自动恢复提示 - 🧩 兼容读取 —— 兼容读取并恢复 dsh-plugin-guard 回滚与 dsh-config-manager 快照
展开完整文档(README 剩余 1 节)
💾 Kidai Snapshot Guard · 纪代快照守护

DSH 内部的自动备份管家 —— 关门前保存 · 开机后确认 · 一键回滚

简体中文 · English

✨ 为什么用?

DeepSeek Harness(DSH)的配置改动(装插件、更新、启停)一旦让 DSH 起不来,最需要的是「改之前的样子」。纪代快照守护在 DSH 内部自动完成快照的「保存 → 确认 → 恢复」闭环,并与外部的 Kidai Plugin Remote 共享同一份存储——DSH 起不来时,外部管理器照样能回滚。

- 💾 关闭前自动保存 —— 每次 DSH 正常关闭都保留一版最近良好快照(配置 + 设置 + 第三方插件目录),滚动保留最新 3 份
- ✅ 开机自动确认 —— 每次成功启动,把待确认快照转为「已验证」(保留到下次成功运行)
- 📦 单 zip 备份 —— 整个快照一键导出 / 导入 / 恢复为一个离线 zip——DSH 起不来也能恢复
- 🔄 隔离自动恢复 —— 外部管理器的「一次性隔离」被打断时,下次启动自动还原隔离前配置
- 🔔 启动通知 —— 「纪代备份」页顶部显示启动成功 / 自动恢复提示
- 🧩 兼容读取 —— 兼容读取并恢复 dsh-plugin-guard 回滚与 dsh-config-manager 快照
- ✏️ 快照备注 —— 给任意快照加备注便于分辨(与外部管理器双向同步)

装好即用 —— 随 DSH 启动,无需任何操作;打开「设置 → 纪代备份」即可管理。

🚀 快速开始

安装

方式一:GitHub 直装(发布后可用)
dsh plugin --profile desktop add github:NokorinNishikino/kidai-snapshot-guard

方式二:本地开发(从 kidai-plugin-remote 仓库目录) powershell -ExecutionPolicy Bypass -File scripts\install-guard.ps1

重启 DSH 后生效,打开「设置 → 纪代备份」即可使用。

卸载

dsh plugin --profile desktop remove kidai-snapshot-guard

或手动清理:从 profiles/desktop/package.json 移除 kidai-snapshot-guard 的依赖与 bundle 声明,再删除 node_modules/kidai-snapshot-guard 目录。

独立使用:KSG 是完全独立的备份插件,不需要 Kidai Plugin Remote 也能自动快照、导出、恢复;外部管理器只是额外的外部回滚入口(DSH 起不来时用)。

然后在 DSH 内:

- 打开 设置 → 纪代备份 —— 管理快照、导出/导入、容量配额。
- 或用 /kidai-snapshot 斜杠命令查看只读摘要。

🔗 生态

| 仓库 | 职责 | 运行位置 |
| kidai-snapshot-guard(你在这里) | 快照、待确认→已验证、隔离恢复 | DSH 内部(插件) |
| kidai-plugin-remote | 外部管理与回滚界面 | DSH 之外 |
| kidai-plugin-remote-client | 同一管理器,原生窗口,零依赖 | DSH 之外 |

快照存储($DSH_HOME/.kidai-snapshots)与守护目录($DSH_HOME/guard/)两端共享:在这里保存的快照,外部管理器同样可见、可回滚;反之亦然。

📸 技术细节

- 关闭时 — dispose 效果在关闭流程等待期间拍全量快照(配置 + 设置 + 第三方包目录);同步的 exit 事件轻量快照(配置 + 设置,不含包目录)作为兜底;30 秒内去重,一次关闭 = 一份快照。
- 启动时 — 待确认快照转为 verified;维护滚动 known-good 快照(固定 id),profile 插件集变化时(30 秒监视器)刷新。
- 一次性隔离 — 读取外部管理器的隔离标记;若本次启动的 DSH 不是管理器 spawn 的那一个(PID 不匹配:管理器被杀,或直接从快捷方式启动),则还原隔离前配置并清除标记——隔离只影响一次启动,无论谁启动 DSH。
- API — DSH webServer 上的 /api/kidai-snapshot/:status / list / save / known-good / delete / export / exports / import / restore / foreign / foreign-restore / settings / quota / meta / notice / note。
- 宿主友好 & 防御式 — 每个操作都有包裹,守护插件永远不会拖垮启动,也不会阻塞关闭超过限定时间。

kidai-snapshot-guard/
├── lib/
│ ├── index.js # 插件入口:启动钩子、关闭钩子、路由注册 │ ├── backup.js # 快照引擎:创建/导出/导入/恢复、配额、隔离标记 │ ├── api.js # webServer 路由 /api/kidai-snapshot/ │ └── client.js # 「设置 → 纪代备份」页面(注入 DSH 设置区) ├── cordis.patch.yml └── package.json # dsh bundle 清单

📄 License

MIT
预览分享卡片长什么样 ↓NokorinNishikino/kidai-snapshot-guard
分享 · DeepSeek Harness Hub
NokorinNishikino/kidai-snapshot-guard

自动留存良好快照,崩溃后一键回滚配置

这是你的仓库?认领条目

回到顶部