dsh-settings-sync:用私有 Git 倉庫備份和恢復 DSH 全部配置

前言

DSH 的配置分散在幾個地方:插件清單和 profile 的 bundle 列表在 ~/.dsh/profiles/<profile>/package.json,每個插件各自定義的模型、MCP 服務器和麪板配置在 ~/.dsh/profiles/<profile>/cordis.patch.yml,技能在 ~/.dsh/skills/ 與 ~/.agents/skills/,插件自己的狀態在 ~/.dsh/<plugin>/。這些位置都容易丟:重裝、換機器、誤刪,任何一次都夠你重建一遍。

已有做法是 dsh export,它把配置拷成一份文件,之後怎麼搬、搬到哪、搬之前改了什麼,都要你自己管。下面介紹的 dsh-settings-sync 把這個動作變成持續的同步:一個你自己擁有的私有 Git 倉庫,一個方向一個按鈕,提交前還能看到完整 diff。

這是什麼

dsh-settings-sync 是一個 DeepSeek Harness 插件,維護者是 elfgzp。它把 DSH 的 profile 配置、插件設置、技能、已安裝插件清單和 MCP 服務器定義收集成一個快照,推到你指定的私有 Git 倉庫,也可以從倉庫拉回並恢復。不是增量備份工具,也不維護自己的存儲格式——快照本體就是一個正常的 Git 倉庫。

同步範圍

快照包含這些文件:

manifest.json                 快照由什麼產生、什麼時候產生
profile/package.json          插件清單和 bundle 列表
profile/cordis.patch.yml      每個插件的配置
profile/cordis.yml            profile 的根入口列表
profile/pnpm-workspace.yaml   workspace 和 release 年齡
homes/dsh/<plugin>/*.json     插件級設置(星標項、默認項目、任務)
homes/dsh/skills/<name>/…     $DSH_HOME 下的用戶級技能
homes/agents/skills/<name>/…  $DSH_AGENTS_HOME 下的共享技能

下面是刻意排除的:

  • 憑據。 ~/.dsh/.credentials.yaml、tencent-intranet-auth.json、.env、*.pem、*.token、pairing.json 同時按文件名和內容排除。此外,已被納入同步的配置裏如果出現明文值,比如 cordis.patch.yml 裏的 apiKey: 行,在快照離開本機前會被替換成 <redacted by dsh-settings-sync>,配置結構保留,恢復時你知道那裏需要一個 key,然後自己補上。
  • 依賴與緩存。 node_modules、pnpm-lock.yaml、__pycache__、.plugin-manager 日誌、附件文件。
  • 會話與歷史。 ~/.dsh/sessions、~/.dsh/storages。歷史不是配置,而且是 DSH home 裏最大的那一塊。
  • 舊編輯的備份。 profile 裏任何匹配 .bak 的文件。

README 給了一個真實機器的量級:21 個已裝插件、66 個技能、6 個插件級狀態目錄,收集結果 263 個文件、1.4 MB。

安裝與啓用

README 的做法是先把倉庫放到本地路徑,比如 ~/Work/Github/dsh-settings-sync。然後在 DSH 裏通過 Settings → Plugins → Install 安裝,或者在終端運行:

dsh plugin install ~/Work/Github/dsh-settings-sync

前提是 git 在 PATH 上(沒有的話在插件配置裏填絕對路徑);只有在用到“一鍵創建倉庫”按鈕時才需要已登錄的 GitHub CLI,即先用 gh auth login 完成認證。

插件安裝後會在 Settings 下新增一個 Settings Sync 頁面,第一次啓動時彈出一個問題:從遠端拉配置下來,還是把這臺機器的配置推上去。

典型用法

  1. 設置倉庫。 粘貼一個空的私有倉庫地址,git@github.com:you/dsh-settings.git 和 https://github.com/you/dsh-settings.git 都行;也可以點 Create private repo,讓 gh 去建一個。
  2. Push,把這臺機器的配置傳上去。
  3. 在另一臺機器上安裝插件,粘貼同樣的地址,點 Pull。

按下去之前,diff 面板會完整展示這次 push 會改什麼:+added、~modified、-removed,先看完再確認。

自動同步

設置項 含義
Redact secrets 上傳前把真實 key 替換成佔位符,默認開啓
Auto push 設置變化後按檢查間隔自動 push
Remote policy never 忽略遠端;ask 彈窗詢問(默認);always 當遠端領先且本地乾淨時自動 pull
Check interval Off、5 分鐘、30 分鐘、1 小時

安全模型

  • 沒有恢復點就不覆蓋。 Pull 會先把當前狀態完整複製到 <stateDir>/backups/<timestamp>-snapshot/,pull 結束後會報出這個路徑。恢復點列在設置頁面上,可以一鍵還原。
  • 收集不到東西的 push 會被拒絕。 HOME 解析錯誤看起來像“用戶刪掉了所有東西”,把一份好備份靜默替換成空快照是不可恢復的。同理,一次 push 如果會刪掉大部分已跟蹤文件,除非顯式 force,否則也會被拒。
  • 快照是真實的 Git 倉庫,位於 <stateDir>/mirror。歷史就是備份:在那裏跑 git log 能看到每次同步,git show <commit>:profile/cordis.patch.yml 能拿到任意一次的舊文件。插件因此不需要自己的撤銷格式。
  • push 和 pull 串行執行。 一次只跑一個操作,靠一個 busy 標誌控制,第二次點擊會等待而不是互相插隊;pull 進行中的自動定時觸發會被跳過。
  • 認證用你自己的。 插件不保存 token,它執行的就是用戶平時跑的 git,所以 osxkeychain、SSH agent 或 credential.helper 都照常生效。反過來說也誠實:如果你在終端裏 git push 對該倉庫本來就不工作,在這裏也一樣不工作,報錯會直接說明。

所有狀態默認放在 $DSH_HOME/settings-sync 下:

config.json   repository、branch、策略、commit 身份
mirror/       本地克隆,它的歷史就是快照歷史
backups/      恢復點
last-run.json 最近一次 push 或 pull 的結果

開發與驗證

倉庫自帶的檢查:

pnpm test    # 等價於 node --test test/*.test.js
pnpm check   # 對每個模塊跑 node --check

測試直接用真實 git 二進制,在一個臨時 home 目錄裏搭出假 profile、兩個技能根、插件級狀態目錄、一個禁止同步的憑據和一個代表遠端的裸倉庫。沒有 mock git,因爲最容易出錯的就是 git 這一層。engines 要求 node >=20。

適用場景與注意

適合想要把 DSH 環境帶着走、又不想自己寫腳本維護備份的人:一臺機器 push,另一臺機器 pull,配置差異在按下去之前就能讀完。也適合把私有倉庫當作訂閱源,讓團隊裏不同機器上跑同一份 profile 配置。

需要留意的:

  • 憑據永不同步,換機器後需要重新填 API key。這既是限制也是設計意圖。
  • 插件以當前 DSH 進程的權限運行,能讀到和寫入它能訪問的所有路徑。安裝前應打開源碼看一眼,確認目錄排除邏輯符合你的環境,並覈對許可證(MIT)。
  • 快照保存的是配置,不保存會話歷史和依賴緩存;恢復後仍需重新裝依賴。

插件在社區目錄 SkillHub 的分類是 admin-security。需要說明的是,SkillHub 是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係,不是官方應用商店。

結尾

DSH 的理念是“一切皆插件”,配置同理值得寫進你自己的倉庫。上面這些能力來自 README 和 package.json 裏的描述,是否適合你取決於你的備份習慣和對 Git 的熟悉程度。

  • 目錄頁:https://www.skillhub.cn/plugins/elfgzp/dsh-settings-sync
  • GitHub:https://github.com/elfgzp/dsh-settings-sync
羽毛球分组比赛记分
小程序二维码

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

小夜