前言¶
在多台机器上使用 DeepSeek Harness(DSH)时,重装插件往往不难,真正费时间的是那些「声明式」状态:调好的模型 provider、插件版本锁定与各插件配置、API 密钥与 MCP 服务定义,以及 profile 里带注释和 !!js 的 cordis patch。手工拷贝目录容易漏项,也无法在冲突时做可控合并。
下面介绍维护者 alfredhuang211 发布的联网工具类插件 dsh-configandplugin-sync(社区目录分类:联网工具)。它把上述配置抽出来,经加密或脱敏后同步到 Git、WebDAV 或 S3 兼容存储;插件源码与 node_modules 永不参与同步,只记录可复现的安装规格。
这是什么¶
DSH 配置与插件同步(英文名 DSH Config & Plugin Sync)面向「多设备同一套 DSH 工作环境」的场景:在一台设备上采集本机 DSH 状态,写入远端存储;在另一台设备上预览差异后拉取或双向合并。
- 维护者:alfredhuang211
- 仓库:github.com/alfredhuang211/dsh-configandplugin-sync
- 目录页:skillhub.cn 插件条目
- 许可证:MIT(见仓库
LICENSE) - 当前 package 版本:0.1.0(见仓库
package.json) - 运行要求:Node
>=22.19.0
DSH 生态以「一切皆插件」为思路;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装第三方插件前,宜自行审阅源码与许可证。插件与 DSH Agent 一样,以当前 OS 用户权限运行。
同步范围¶
会同步的内容¶
| 内容 | 说明 |
|---|---|
| DSH 基础配置 | $DSH_HOME/cordis.patch.yml、profiles/<name>/cordis.patch.yml、cordis.yml、package.json;按 entry id 合并,保留注释与 !!js |
| 模型 provider | 从 LLM 条目抽取 providers 及 agent-default-model |
| 插件清单 | 包名、版本、安装来源(npm/git/local-path/tarball/official 等)、启用状态;符合条件的 link: 可识别为 github:owner/repo#<commit> |
| 插件配置 | 各第三方插件主条目配置;敏感键写入前剔除并标为 redacted |
| 密钥 / 凭据 | 需口令,加密后同步(默认关闭) |
| MCP 服务 | 名称、transport、安装方式、command/args/url、header/env 名称等 |
不同步¶
- 插件代码、
node_modules、tarball 本体 - 纯本地目录插件(
link:/file:):仅在设备快照中记来源,restorable: false - 会话历史、日志、缓存
存储后端与布局¶
三种后端共用同一套文档布局,可随时从 Git 迁到 S3 等而无需改数据模型。
| 后端 | 典型场景 | 认证 | 并发 |
|---|---|---|---|
| Git | 要版本历史、多人审查 | SSH / credential helper / HTTPS token | 非 fast-forward 先合并,不强推 |
| WebDAV | NAS、Nextcloud、坚果云等 | Basic 或 Bearer | ETag + If-Match |
| S3 兼容 | AWS S3、MinIO、R2、七牛等 | AccessKey + SecretKey(+ 可选 session token) | ETag / If-Match |
远端根目录(默认前缀 dsh-config-sync/)结构大致如下:
dsh-config-sync/
├── manifest.json
├── profiles/<profile>/
│ ├── dsh-config.json
│ ├── providers.json
│ ├── plugins.json
│ ├── plugin-configs.json
│ ├── mcp.json
│ └── secrets.json # 仅加密信封
├── devices/<deviceId>.json
└── snapshots/<profile>/<deviceId>/<ts>.json # 最近保留 20 份
安装与启用¶
官方 README 给出的流程是本地构建后以 bundle 安装,而非简单的单行 dsh plugin add。
- 在插件目录内安装依赖并构建:
npm install
npm run build
构建产物包括 Host 端 lib/ 与 Web 端 lib/client.js。仓库说明:lib/ 需随 Git 提交,因 DSH 安装插件时会阻止依赖的构建脚本。
- 在 DSH 中安装该目录:
plugin_manager install_bundle target: /绝对路径/dsh-configandplugin-sync
- 重启 DSH(或等待 HMR)。设置页会出现 DSH 配置与插件同步。
典型用法¶
首次配置与同步¶
- 设置页 → 配置:选择 Git / WebDAV / S3,填写地址与凭据(凭据仅存本机,见下文安全说明)。
- 点击 测试连接,确认返回
ok: true且能读到 revision。 - 勾选同步范围(配置、provider、插件、插件配置、密钥、MCP),保存。
- 同步 标签 → 预览:查看将要上传/下载的条目与冲突,确认后执行。
- 在第二台设备重复 1–3,再 预览 → 恢复。
两台设备首次都有内容且同名条目不一致时,会进入冲突等待选择 local / remote / skip,而不是默默覆盖。
密钥与口令¶
密钥同步默认关闭。启用前需向插件提供口令,推荐顺序如下。
方式 A(推荐,桌面 App):设置 → 密钥 → 本机口令文件 → 保存。写入 ~/.dsh/dsh-configandplugin-sync/passphrase,权限 0600,不经环境变量,立即生效。
方式 B:启动时环境变量,例如 macOS:
open -a "DeepSeek Harness" --env DSH_SYNC_PASSPHRASE='你的口令'
方式 C:在 ~/.dsh/.env 中使用非 DSH_ 前缀的变量名(DSH 会拒绝 DSH_ / XDG_ / DYLD_ 前缀),例如 SYNC_PASSPHRASE,改完后需重启 DSH。
加密:scrypt 派生密钥 + AES-256-GCM;存储中只有 salt / iv / tag / 密文。口令不会写入配置或远端。
若在 cordis.patch.yml 里写了明文密钥,采集时会将敏感键替换为 *** 并告警;恢复时本机已有真实值则保留(preserveMaskedValues)。更稳妥做法是把凭据放进 ~/.dsh/.credentials.yaml,配置里只写引用名,由密钥段加密同步。
冲突与自动同步¶
同步引擎采用三方合并(本机基线、本地现值、存储现值)。cordis.patch.yml 上若两台设备改了不同 entry id,会先尝试按 id 合并;package.json 上不同依赖的改动也可自动合并,同一依赖版本冲突才需人工决策。删除类操作需 confirmDestructive。
设置页可开:启动时同步(默认延迟 15s)、定时(默认 30 分钟)、插件变更后(默认关,去抖 5s)。自动运行遇冲突会暂停;连续失败按 2 的幂退避,上限 1 小时。
Agent 工具¶
与设置页共用同一引擎,常用工具包括:dsh_sync_status、dsh_sync_inventory、dsh_sync_diff、dsh_sync_backup、dsh_sync_restore、dsh_sync_sync、dsh_sync_history、dsh_sync_secrets_status。默认多为预览,执行需显式 confirm。
安全与限制¶
- 密钥加密后才离开设备;WebDAV/S3 密码等 HTTP 响应中为空串,提交空值表示保持原值。
- 日志对常见 token、URL 内账号等做脱敏。
- MCP 只同步 header/env 名称,不同步值。
- 本机配置
~/.dsh/dsh-configandplugin-sync/config.json权限0600。
已知限制(摘自 README):
- 仅同步当前运行中的 profile。
- 本地
link:插件不复制代码,目标机需自行准备目录。 - 回滚依赖本插件快照;Git 另有提交历史,但回滚仍走快照。
- WebDAV/S3 无原生版本链时,历史页展示快照列表。
结尾¶
换机或双机并行开发 DSH 时,若你希望 provider、插件清单、MCP 与加密后的凭据保持同一套「可审查、可合并」的远端状态,而不把插件仓库打进备份包,可以按上文步骤安装 dsh-configandplugin-sync,先 测试连接 与 预览,再在两台设备上执行恢复或双向同步。