前言¶
在多臺機器上使用 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,先 測試連接 與 預覽,再在兩臺設備上執行恢復或雙向同步。