DSH 配置與插件同步:跨設備一致性的聲明式備份

前言

在多臺機器上使用 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 狀態,寫入遠端存儲;在另一臺設備上預覽差異後拉取或雙向合併。

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。

  1. 在插件目錄內安裝依賴並構建:
npm install
npm run build

構建產物包括 Host 端 lib/ 與 Web 端 lib/client.js。倉庫說明:lib/ 需隨 Git 提交,因 DSH 安裝插件時會阻止依賴的構建腳本。

  1. 在 DSH 中安裝該目錄:
plugin_manager install_bundle  target: /絕對路徑/dsh-configandplugin-sync
  1. 重啓 DSH(或等待 HMR)。設置頁會出現 DSH 配置與插件同步。

典型用法

首次配置與同步

  1. 設置頁 → 配置:選擇 Git / WebDAV / S3,填寫地址與憑據(憑據僅存本機,見下文安全說明)。
  2. 點擊 測試連接,確認返回 ok: true 且能讀到 revision。
  3. 勾選同步範圍(配置、provider、插件、插件配置、密鑰、MCP),保存。
  4. 同步 標籤 → 預覽:查看將要上傳/下載的條目與衝突,確認後執行。
  5. 在第二臺設備重複 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,先 測試連接 與 預覽,再在兩臺設備上執行恢復或雙向同步。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜