DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

Wystan68 /

Wystan68/dsh-plugin-sync

Verified

DSH plugin: keep the installed plugin set identical across devices — sync codes or an encrypted Cloudflare relay.

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@5fbb9171

插件同步 · dsh-plugin-sync

在多台登录了 DSH 的设备之间,让「装了哪些插件、哪些开、哪些关」保持一致。

两种传输方式,同一套加密载荷:

  • 同步码:在 A 设备生成一段加密文本(DSHSYNC1: 开头),在 B 设备粘贴导入。不依赖任何服务器。
  • 加密中转:把加密后的清单推送到一个 HTTPS 中转(插件自带 Cloudflare Worker + KV 的部署脚本,可在面板里一键部署),其它设备手动或定时拉取。中转只看到密文。

同步的是插件清单:包名、版本、启用/停用。配置项(cordis.patch.yml 里的 config)和插件源码不在同步范围内,也不会同步任何密钥或会话数据。

安装

在 DSH 里装(推荐,一行)

打开 设置 → 插件 → 安装插件,粘贴:

github:Wystan68/dsh-plugin-sync

或在终端装(需要 dsh 命令可用)

dsh plugin --profile desktop add github:Wystan68/dsh-plugin-sync

desktop 换成你正在用的 profile 名(不填 profile 时默认是 web)。桌面版可用完整路径调用:

"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh" plugin --profile desktop add github:Wystan68/dsh-plugin-sync

装完重启 DSH,左侧栏会出现「插件同步」图标(第 6 个)。

使用

  1. 设同步密钥:打开面板,输入一把至少 8 位的密钥(例如 correct horse battery staple),点「设置」。密钥只在本机派生,明文不上传、不写入同步数据。

  2. 两台设备用同一把密钥,面板上会显示相同的同步组码(如 qvi2a-jwfkq),表示它们在同一个组。

  3. 之后任选一种方式:

    • 同步码:A 点「生成同步码」复制,B 点「导入同步码」粘贴 → 预览差异 → 应用。
    • 中转:在「加密中转」里部署或填写地址 → A 点「推送」,B 点「拉取」→ 预览差异 → 应用。也可勾选「自动拉取并应用」。
  4. 差异预览会列出:要安装的插件、要切换的启用状态、跳过项(本地链接插件、无安装来源)、版本差异提示。确认后再点「应用变更」。

同步语义

  • 谁推送,以谁为准:同一同步组的远端只有一份最新快照,后推送的会覆盖先前的;应用后本机也变成这份清单的副本。
  • 最小改动:只安装缺失的插件、只切换与远端不同的启用状态;未列出的插件不会被卸载。版本不同只提示,不自动升降级。
  • 不会同步自己:插件同步自己的停用状态会被忽略,避免应用后界面消失。
  • 安装来源:npm 包按 name@version 安装;link: / file: 本地插件在其它设备上没有源码目录,会列入「跳过」并提示手动安装。
  • 账号通道:已登录 DeepSeek 账号时面板会显示账号信息;账号云同步接口尚未开放,当前同步由同步密钥驱动,接口就绪后可作为可选通道加入。

加密中转

一键部署(推荐)

在「加密中转」里填一个 Cloudflare API Token,点「自动部署」。Token 需要:

  • Account Settings: Read
  • Workers Scripts: Edit
  • Workers KV Storage: Edit

插件会创建 dsh-plugin-sync KV 命名空间、上传 Worker(绑定 SYNC)、尝试开启 *.workers.dev 子域,最后把地址填回面板。每一步的结果都会显示。

手动部署

在面板里打开「手动部署」,复制 Worker 脚本,或在仓库里取 worker.mjs:

  1. Cloudflare 控制台 → Workers & Pages → 创建 Worker,粘贴脚本。
  2. 绑定 KV 命名空间,变量名必须是 SYNC。
  3. 部署后把 https://<worker>.<子域>.workers.dev 填回面板。

中转协议

GET    /health
GET    /v1/snapshots/{group}    → 密文信封 JSON,或 404
PUT    /v1/snapshots/{group}    → 写入信封
DELETE /v1/snapshots/{group}
Authorization: Bearer <由密钥派生的令牌>
  • 载荷是端到端加密的 AES-256-GCM 密文,中转无法解密。
  • 同一同步组第一次写入时,中转会把令牌的 SHA-256 钉在 KV 里;换成另一把密钥既读不到也覆盖不了这个组。
  • 单次请求体上限 200 KB。

安全

  • 密钥 → PBKDF2-SHA256(210,000 次)→ 32 字节主密钥;同步组码、中转令牌、加密密钥都由主密钥 HMAC 派生。
  • 本机只保存派生后的主密钥(DSH 凭据库 plugin-sync/settings),明文口令不会落盘。
  • 同步载荷在加密前先 gzip,使用随机 12 字节 IV 与 AAD(绑定同步组),防止跨组重放。
  • 中转只存密文;删除同步组会同时删除令牌哈希。

卸载

在 设置 → 插件 里停用或移除「插件同步」,或:

dsh plugin --profile desktop remove dsh-plugin-sync

开发

纯 ESM,无运行时依赖,要求 Node.js ≥ 20。

node --test test/*.test.mjs   # 36 个测试:密钥派生、加解密、同步码、差异计划、Worker、部署、Host 端到端

结构:

index.js        Host 插件:/plugin-sync/api/state 与 /api/action(仅 owner 可访问)
client.js       Client 插件:侧栏入口与面板 UI
lib/crypto.js   密钥派生、信封加解密、同步码编解码
lib/snapshot.js 读取并规范化本机插件清单
lib/diff.js     远端 vs 本机 → 差异计划
lib/apply.js    按计划执行安装与开关
lib/relay.js    中转读写、Worker 部署
worker.mjs      Cloudflare Worker(中转服务端)

License

MIT

—/ 5

No ratings yet

Verified DSH bundle

Commit 5fbb9171a9d6

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout