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

云端配置同步 dickpy/dsh-cloud-sync

DeepSeek Harnessv0.20.10
dickpy56 天前有提交已提供中文文档扫描:含敏感能力

把 DSH 的配置、插件和本地源码,安全地带到每一台设备。

42.7/100
综合分
23
GitHub 星标
66
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @dickpy/dsh-cloud-sync
npm 源 · @dickpy/dsh-cloud-sync 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@dickpy/dsh-cloud-sync @ 0.20.10
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 07:02:23

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 81 处,展示前 28 条)
  • 发起网络请求
    lib/client.js:454
    const response = await fetch(`/api/dsh-cloud-sync/${path}`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(va
  • 写入剪贴板
    lib/client.js:622
    try { await navigator.clipboard?.writeText(value.userCode) } catch {}
  • 写入剪贴板
    lib/client.js:637
    h('div', { className: 'githubCodeCard' }, h('strong', null, authorization.userCode), h('button', { className: 'githubCopyCode', disabled: busy !== '',
  • 读取本地文件
    lib/core.js:54
    ].find(candidate => candidate !== undefined && existsSync(candidate))
  • 执行外部命令固定命令
    lib/core.js:57
    const found = await commandOutput(spawn('where.exe', ['pnpm.cmd'], { shell: false, windowsHide: true }))
  • 读取本地文件
    lib/core.js:58
    globalShim = found.stdout.split(/ ? /).map(value => value.trim()).find(candidate => candidate !== '' && existsSync(candidate))
  • 读取本地文件
    lib/core.js:61
    if (globalShim === undefined || !existsSync(globalShim)) return undefined
  • 读取本地文件
    lib/core.js:64
    if (!existsSync(target) || await readFile(target, 'utf8') !== content) await writeFile(target, content, 'utf8')
  • 读取本地文件
    lib/core.js:64
    if (!existsSync(target) || await readFile(target, 'utf8') !== content) await writeFile(target, content, 'utf8')
  • 写入本地文件
    lib/core.js:64
    if (!existsSync(target) || await readFile(target, 'utf8') !== content) await writeFile(target, content, 'utf8')
  • 读取本地文件
    lib/core.js:79
    try { return JSON.parse(await readFile(file, 'utf8')) } catch (error) { if (error?.code === 'ENOENT') return fallback; throw error }
  • 写入本地文件
    lib/core.js:81
    async function writeJson(file, value) { await mkdir(dirname(file), { recursive: true }); await writeFile(file, `${JSON.stringify(value, null, 2)}\n`,
  • 写入本地文件
    lib/core.js:81
    async function writeJson(file, value) { await mkdir(dirname(file), { recursive: true }); await writeFile(file, `${JSON.stringify(value, null, 2)}\n`,
  • 写入本地文件
    lib/core.js:81
    async function writeJson(file, value) { await mkdir(dirname(file), { recursive: true }); await writeFile(file, `${JSON.stringify(value, null, 2)}\n`,
  • 写入本地文件
    lib/core.js:205
    await writeFile(path, next, 'utf8')
  • 写入本地文件
    lib/core.js:214
    await writeFile(path, next, 'utf8')
  • 执行外部命令固定命令
    lib/core.js:248
    const child = spawn('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], { shell: false, windowsHide: true, stdio: ['pipe', 'pipe'
  • 删除本地文件
    lib/core.js:264
    if (Object.keys(secrets).length === 0) { await rm(credentialsPath(home), { force: true }); return }
  • 发起网络请求
    lib/core.js:460
    const response = await fetch(url, { ...init, signal: controller.signal })
  • 发起网络请求
    lib/core.js:628
    const response = await fetch(url, { ...init, signal: controller.signal })
  • 发起网络请求
    lib/core.js:682
    const response = await this.request('PUT', this.objectPath(key), { body, ifMatch, ifNoneMatch })
  • 发起网络请求
    lib/core.js:688
    const response = await this.request('GET', this.objectPath(key))
  • 发起网络请求
    lib/core.js:694
    const response = await this.request('HEAD', this.bucketPath())
  • 发起网络请求
    lib/core.js:722
    const response = await fetch(url, { method, headers: githubApiHeaders(token, body !== undefined, headers), body, signal: controller.signal })
  • 删除本地文件
    lib/core.js:1212
    if (previous?.archive !== undefined && previous.archive !== archive) await rm(join(syncRoot(home), 'archives', previous.archive), { force: true })
  • 删除本地文件递归
    lib/core.js:1220
    await Promise.all(entries.slice(MAX_LOCAL_BACKUPS).map(name => rm(join(directory, name), { recursive: true, force: true })))
  • 删除本地文件递归
    lib/core.js:1261
    await rm(target, { recursive: true, force: true })
  • 执行外部命令来自配置/变量
    lib/core.js:1493
    return commandOutput(spawn(command.command, command.args, { cwd: dir, shell: false, windowsHide: true }))
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

4 张 · 点击查看大图

功能亮点

  • 同步配置档
  • 同步插件源码
  • WebDAV同步

可移植的 DeepSeek Harness 配置档,通过 WebDAV 同步本地插件源码。

v0.20.102026-10-30
本次更新让只提供 HTTP WebDAV 的家庭 NAS 可以作为同步渠道,解决 #7,合入 #8。 · HTTP WebDAV · 默认继续要求 HTTPS;需要连接仅支持 HTTP 的 NAS 时,在 WebDAV 连接窗口勾选 允许 HTTP(仅限可信内网),再填写 http:// 开头的 DAV 地址。 · 显示中英文明文凭据提示,并在保存配置、切换渠道、重新打开设置及复用已存密码重连时保留该选项。 · 切回 HTTPS 并关闭该选项后,会清除 HTTP 授权设置。 HTTP 会明文传输账号凭据及未加密的同步内容。仅在可信家庭网络或内网中启用,公网访问请使用 HTTPS。 · 修复与验证 · 连接成功提示现在显示实际渠道名称,避免 WebDAV 等渠道误显示为 GitHub Gist。 · 同步界面版本号与安装包版本统一为 0.20.10。 · 补充中英文使用说明与 HTTP 授权、协议限制、凭据脱敏、断开重连的回归测试。 · 语法检查、核心集成测试和本地化测试通过;使用本地模拟 WebDAV 服务完成浏览器交互验证。 · 安装与更新 dsh plugin --profile web add @dickpy/dsh-cloud-sync@0.20.10 也可下载本页的 dickpy-dsh-cloud-sync-0.20.10.tgz 后安装。已安装用户可通过云同步设置页的更新入口升级;安装完成后完全退出并重启 DSH。 感谢 @altruistOS 的贡献。 完整变更:
v0.20.92026-09-08
· 亮点 · 新增可配置的历史保留上限(1-200,默认 30)。历史备份数量超过上限后,最旧的备份会自动从云端删除(#6)。 · 在 Web UI 的「配置与历史」标签页里改这个上限;该值按设备保存,切换服务商后依然生效。 · 请求里没带 auto-sync 和 sync-scope 时,settings/preferences 会保留现有值。 验证: @dickpy/dsh-cloud-sync@0.20.9 test node test/core.test.mjs && node test/client-locale.test.mjs core tests passed client locale tests passed 均通过。 完整更新日志:
v0.20.82026-08-31
· 亮点 · 通过 DSH locale 服务为 Web UI 加上完整的中英文 i18n 支持。 · 支持实时切换语言,无需重启 DSH Web。 · 本地化导航、标签页、对话框、按钮、字段、工具提示、ARIA 标签、状态、错误和同步结果。 · 用插值保留服务商名称、URL、路径、包名和服务端错误详情。 · 增加 locale 与插值的回归测试。 验证: @dickpy/dsh-cloud-sync@0.20.8 check node --check lib/index.js && node --check lib/core.js && node --check lib/client.js、 @dickpy/dsh-cloud-sync@0.20.8 test node test/core.test.mjs && node test/client-locale.test.mjs core tests passed client locale tests passed 均通过。 完整变更日志:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DSH Cloud Sync 把 DSH 的配置、插件和本地源码,安全地带到每一台设备。 @dickpy/dsh-cloud-sync · WebDAV / Amazon S3 / OSS / COS / MinIO / 七牛云 Kodo / GitHub Gist · 快照历史 · 冲突恢复 · GitHub 自更新 English · 变更日志 · GitHub Releases · 问题反馈 它解决了什么问题? DSH Cloud Sync 的重点不是绑定某一种存储服务,而是让插件环境可以随时随地同步:在办公室、家里或新电脑上,都能用自己顺手的云服务保存配置和插件信息,再快速恢复出一致的 DSH 环境。 它把这件事变成一个清晰的流程:选择任意支持的云服务,上传可重建的配置和源码归档,把依赖安装交给 DSH / pnpm,在目标设备上恢复出一致的插件环境。 - 不复制会话、附件、node_modules、pnpm 缓存或明文凭据。 - 不绑定某一种云服务:WebDAV、Amazon S3、阿里云 OSS、腾讯云 COS、MinIO、七牛云 Kodo 和 GitHub Gist 都可以使用。 - 不把更新放在私有 WebDAV:插件本身通过公开 GitHub Releases 检查和安装更新。 实际效果 设置页提供三个清晰的工作区:云服务、配置与历史、同步状态。
展开完整文档(README 剩余 1 节)
DSH Cloud Sync

把 DSH 的配置、插件和本地源码,安全地带到每一台设备。

@dickpy/dsh-cloud-sync · WebDAV / Amazon S3 / OSS / COS / MinIO / 七牛云 Kodo / GitHub Gist · 快照历史 · 冲突恢复 · GitHub 自更新

English · 变更日志 · GitHub Releases · 问题反馈

它解决了什么问题?

DSH Cloud Sync 的重点不是绑定某一种存储服务,而是让插件环境可以随时随地同步:在办公室、家里或新电脑上,都能用自己顺手的云服务保存配置和插件信息,再快速恢复出一致的 DSH 环境。

它把这件事变成一个清晰的流程:选择任意支持的云服务,上传可重建的配置和源码归档,把依赖安装交给 DSH / pnpm,在目标设备上恢复出一致的插件环境。

- 不复制会话、附件、node_modules、pnpm 缓存或明文凭据。
- 不绑定某一种云服务:WebDAV、Amazon S3、阿里云 OSS、腾讯云 COS、MinIO、七牛云 Kodo 和 GitHub Gist 都可以使用。
- 不把更新放在私有 WebDAV:插件本身通过公开 GitHub Releases 检查和安装更新。

实际效果

设置页提供三个清晰的工作区:云服务、配置与历史、同步状态。下面是当前版本的实际界面:

核心能力

| 能力 | 你得到的结果 |
| 多云同步渠道 | WebDAV、Amazon S3、阿里云 OSS、腾讯云 COS、MinIO、七牛云 Kodo、GitHub Gist;同一时间只启用一个渠道,切换服务不需要改代码 |
| GitHub 授权连接 | 复制设备授权码并打开 GitHub 确认,无需手动创建 Gist;也可绑定已有的空 Gist |
| 轻量可重建快照 | 同步 package.json、lockfile、workspace、patch 和市场热更新 YAML,而不是打包整个运行环境 |
| 本地源码归档 | 自动发现可达的 file: / link: 插件源码,归档后换盘符、换电脑也能恢复 |
| 三种同步策略 | 智能合并、云端优先、本地优先;两端同时修改同一项时先展示差异再执行 |
| 历史与恢复 | 每次成功同步留下快照,支持预览、恢复远端版本和回滚到指定历史版本;历史备份数量上限可配置(默认 30),超出自动删除最旧备份 |
| 插件安装状态 | 对比远端快照与本机 Web Profile,直接安装或卸载缺失插件 |
| GitHub 自更新 | 从 GitHub Releases 检查更新,下载 .tgz 后校验 SHA-256,再由用户确认安装 |
| 兼容加密和自动同步 | 保留已有 AES-256-GCM、设备名和定时同步配置;界面只保留更容易理解的核心操作 |

工作方式

下面这张图展示了双向同步的完整链路:两台设备围绕云端快照仓库同步,保留历史、支持回滚,并可按智能合并、云端优先或本地优先执行。

目标设备只需要相同的同步渠道和 DSH profile。恢复会先备份当前 profile,再写入快照;依赖安装等到完全重启 DSH 后执行,避免覆盖正在运行的 bundle。

快速开始

按推荐顺序,任选一种方式安装;无论哪种方式,安装完成后都需要完全退出并重启 DSH Web,然后在 设置 → 云同步 中开始配置。

方式一:让 AI 助手帮你安装(最省事)

把下面这段话发给 DSH 或 Codex,让它执行安装并重启 DSH Web:

请帮我安装 DSH Cloud Sync 插件(npm 包 @dickpy/dsh-cloud-sync),然后重启 DSH Web。

方式二:通过 npm 安装(推荐)

dsh plugin --profile web add @dickpy/dsh-cloud-sync

方式三:通过聚合包(.tgz)安装

从 GitHub Releases 下载最新的 dickpy-dsh-cloud-sync-*.tgz,然后执行:

dsh plugin --profile web add .\dickpy-dsh-cloud-sync-0.20.6.tgz

适合无法直接访问 npm registry 的内网或离线环境。

方式四:自己开发启动

git clone https://github.com/dickpy/dsh-cloud-sync.git
cd dsh-cloud-sync
npm install
npm run check
dsh plugin --profile web add .

适合需要修改插件源码、调试或贡献代码的场景。

第一次同步

1. 打开 云服务,选择 WebDAV、S3、OSS、COS、MinIO、七牛云 Kodo 或 GitHub Gist。Gist 可通过授权码连接,授权完成后会自动创建 secret Gist。
2. 进入 配置与历史,选择同步策略并点击 开始同步。
3. 需要手动补充本地插件源码时,在同一页填写源码目录并点击 备份源码。
4. 换到新设备后,在 同步状态 查看插件安装情况;可先预览远端快照,再应用恢复。

同一时间只有一个同步渠道处于启用状态。连接并启用新的渠道时,旧渠道会自动停用。

每种云服务会分别保存自己的 Endpoint、Region、Bucket、对象前缀和 Access Key ID。切换回已保存的渠道时,表单会自动填充这些信息;如果该渠道的密钥已保存在本机,密钥框留空即可直接复用,不需要再次输入。

GitHub Gist

GitHub Gist 很适合不涉及本地插件源码归档的配置同步:profile 配置、插件依赖、锁文件、市场 YAML、历史快照都很轻量,使用一个 secret Gist 即可完成多设备恢复。

- 在设置中选择 GitHub Gist,复制显示的授权码并在打开的 GitHub 页面确认授权;插件会自动创建一个受管 secret Gist。
- Gist API 的单个同步对象限制为约 700 KiB,受管 Gist 最多 200 个文件。超过限制时同步会明确失败,不会截断数据。
- 连接 Gist 后会自动切换为“仅配置同步”,本地插件源码不会上传。需要同步源码时请使用 WebDAV、S3、OSS、COS、MinIO 或七牛云 Kodo。
- secret Gist 并不等同于端到端私密存储,持有链接的人可读取内容;建议启用本插件的客户端 AES-256-GCM 加密。

GitHub 授权码连接会使用本项目的 OAuth App,只请求 gist 权限;当授权服务暂不可用时,界面会自动提供拥有 gist 权限的 GitHub Token 作为备用连接方式。

WebDAV 目标目录不存在时,保存连接或首次同步会自动创建该目录;嵌套目录以及包含空格或非 ASCII 字符的目录也无需手动预先创建。

支持的同步渠道

| 渠道 | 适合场景 | 配置要点 |
| WebDAV | 坚果云、Nextcloud、NAS 等 | 填写 DAV 地址、用户名和应用密码 |
| Amazon S3 | AWS 或兼容 S3 的对象存储 | Endpoint、Region、Bucket、Access Key |
| 阿里云 OSS | 阿里云对象存储 | 使用 OSS 的 S3 兼容 Endpoint |
| 腾讯云 COS | 腾讯云对象存储 | Bucket 通常包含 APPID,填写对应 Region |
| MinIO | 自建对象存储、内网或本地开发 | 填写 MinIO Endpoint、Bucket 和密钥 |
| 七牛云 Kodo | 七牛云对象存储(新用户有免费额度) | Bucket 填写控制台中的 S3 空间名(全局唯一),Region 用七牛云 S3 Region ID(如 cn-east-1) |

公共网络上的存储服务建议使用 HTTPS。MinIO 在本机或可信内网中可以使用 HTTP。

同步策略

| 策略 | 行为 |
| 智能合并(默认) | 合并两端的插件依赖、Bundle 和源码归档;发现同一项目被两端修改时,先让你确认 |
| 云端优先 | 使用远端快照覆盖当前 profile,适合新设备恢复 |
| 本地优先 | 使用当前 profile 覆盖远端快照,适合把本机状态作为最新版本 |

安全边界

- 快照、历史和源码归档可使用 AES-256-GCM 客户端加密;每个对象使用新的 KDF salt。
- 密码和派生密钥不会写入明文设置文件;Windows 使用当前用户 DPAPI 保护已保存凭据。
- 恢复前自动备份当前 profile,源码归档恢复会做 SHA-256 校验并拒绝路径穿越。
- 加密保护的是远端内容,不替代对象存储本身的权限控制;请为 Bucket、Endpoint 以及 MinIO / Kodo 管理员账号配置最小权限。

GitHub 自更新

打开云同步设置页时,插件会直接检查 GitHub Releases,不依赖任何 WebDAV 或对象存储配置。发现新版本后:

1. 用户点击 更新;
2. 插件下载对应的 .tgz 到本机 release 缓存;
3. 使用 GitHub 提供的 SHA-256 资产摘要校验;
4. 用户确认后安装到 web profile,重启 DSH 完成切换。

更新始终是显式操作,不会在同步时静默替换正在运行的 Cloud Sync。

开发与测试

环境要求:Node.js 18 或更高版本、pnpm。

npm install
npm run check
npm test
npm pack

项目结构:

lib/index.js bundle 入口和本地 API 路由 lib/core.js 存储渠道、快照、加密和插件生命周期 lib/client.js 设置页 UI test/core.test.mjs 核心流程集成测试 docs/screenshots/ README 界面截图

发布

1. 更新 package.json 版本号并添加 CHANGELOG.md 条目;
2. 执行 npm run check 和 npm test;
3. 执行 npm pack 生成 .tgz;
4. 创建同版本的 GitHub Release 并上传 .tgz;
5. 其他设备会在设置页检测到更新,并由用户显式安装。

常见问题

没有 WebDAV,也能检查插件更新吗?

可以。插件更新来自 GitHub Releases,与同步渠道完全独立;WebDAV、S3、OSS、COS、MinIO 和七牛云 Kodo 只负责你的配置快照和源码归档。

会不会复制整个 node_modules?

不会。同步的是可重建的 profile 文件和必要的本地插件源码,依赖由目标设备上的 DSH / pnpm 重新安装。

为什么恢复后要重启 DSH?

恢复会修改 profile 配置。重启可以让 pnpm 和 DSH 从新的 profile 重新建立依赖,避免在运行中的 bundle 上热替换。

如何排除不想同步的文件?

在 DSH 同步目录创建 .dshsyncignore,每行填写一个要排除的文件或目录名。

许可证

MIT © 2025 dickpy
预览分享卡片长什么样 ↓dickpy/dsh-cloud-sync
分享 · DeepSeek Harness Hub
dickpy/dsh-cloud-sync

把 DSH 的配置、插件和本地源码,安全地带到每一台设备。

这是你的仓库?认领条目

回到顶部