dsh-plugin-git-sync:用 Git 倉庫在多機之間同步 DSH 第三方插件

前言

在 DeepSeek Harness(DSH)裏,用 dsh plugin add 裝好的第三方插件都落在某個 profile 的 node_modules 下。換一臺機器或重裝環境時,profile 從零開始,只能憑記憶逐個補裝插件名、版本和安裝來源。本地目錄或已下載的 .tgz 裝上的插件,同樣沒有現成的「整包帶走」辦法。

dsh-plugin-git-sync(維護者 daoyan2142)把當前 profile 裏已安裝的第三方插件打成帶源碼的 .tgz,推到你自己控制的 GitHub 或 Gitee 倉庫;在另一臺機器上拉取清單、比對版本、校驗 SHA-256 後再安裝。倉庫裏存的是包本體而不只是名稱列表,目標機不必仍能從原始 registry 拿到同一版本。

這是什麼

DSH 生態是「一切皆插件」;社區目錄(如 SkillHub)獨立於 DeepSeek / 幻方,並非官方應用商店。本插件以當前 DSH 進程權限運行,安裝前請自行審閱源碼與許可證。

核心功能

推送側(機器 A)

  1. 調用 listBundles(),只處理已安裝的第三方插件。
  2. 解析每個包目錄,打成以 package/ 爲根的 tar.gz。
  3. 對每個 tarball 計算 SHA-256;超過平臺單文件上限時拆成 .partNNN 分片上傳。
  4. 先上傳 sync/packages/*,最後寫入 sync/manifest.json,避免上傳中斷時清單裏出現尚未存在的包。

拉取側(機器 B)

  1. 下載 sync/manifest.json,與本地已裝版本對比。
  2. 將結果分爲 install(未安裝)、same(版本一致)、differ(版本不一致)。
  3. 下載對應 tarball(或拼接分片),校驗 SHA-256 後調用 pluginManager.installBundle(tgz)。
  4. 安裝新 Host 模塊後需重啓 DSH。

設計上的幾個要點

  • 倉庫攜帶 tarball 與哈希,減輕對遠程 registry 的依賴;從本地路徑或 .tgz 安裝的插件,源碼會一併打進包。
  • 導出是增量且冪等的:每次推送會重寫相同路徑的包;不會自動刪除——在 A 上卸載的插件仍會留在倉庫裏,需在 B 手動處理,或刪除 sync/packages/ 中對應文件並改 manifest.json。
  • 插件不會讀寫倉庫中 sync/ 以外的路徑。
  • 大文件分片上限:GitHub 單片 768 KiB,Gitee 單片 4 MiB(見 README 說明)。

安裝與啓用

市場(上架後):

Plugins → Discover → 搜索 "Git Sync" → Install

npm 或 Release 中的 .tgz:

# npm 發佈後
dsh plugin --profile web add dsh-plugin-git-sync

# 本地或 Release 的 tarball
dsh plugin --profile web add ./dsh-plugin-git-sync-1.0.0.tgz

包爲純 ESM,無構建步驟、無運行時依賴。安裝後需重啓 DSH 以加載 Host 模塊;通過市場安裝時會熱掛載。

配置

打開 Settings → Git 插件同步,填寫下表字段:

字段 說明
Platform GitHub 或 Gitee;切換平臺會成組切換下方三項,且 GitHub / Gitee 各保留一套設置,互不覆蓋
Token (PAT) 存入 DSH credentials 服務;界面只顯示已配置 / 未配置。GitHub 建議 Fine-grained token,Contents: Read and write(限定倉庫);Gitee scope projects
Repository owner/repo、完整 URL 或 git@host:owner/repo.git;倉庫須已存在
Branch 如 main、master;空倉庫需先初始化(例如 README)纔有可提交分支

非敏感配置:<profile>/.git-sync/settings.json。令牌引用名爲 GIT_SYNC_GITHUB_TOKEN 或 GIT_SYNC_GITEE_TOKEN,寫在 ~/.dsh/.credentials.yaml,不會進入 settings.json 或遠端倉庫。建議使用私有倉庫(README Security 一節)。

示例結構(平臺切換時 platform 字段指向當前 UI 所顯示的一側):

settings.json
  platform: "gitee"
  profiles:
    github: { repo: "…", branch: "main" }
    gitee:  { repo: "…", branch: "master" }

遠端倉庫佈局:

sync/
├─ manifest.json
└─ packages/
   ├─ some-plugin-1.2.0.tgz
   └─ @scope/name → scope__name-1.0.0.tgz

典型用法

機器 A:首次導出

  1. 選擇平臺,粘貼 Token,點 保存。
  2. 填寫 owner/repo 與分支,點 保存設置。
  3. 點 驗證倉庫,確認 Token、倉庫名與分支可讀。
  4. 點 導出並推送;結果行會顯示上傳包數量。

機器 B:恢復

  1. 相同平臺、倉庫、分支;Token 可用同權限的另一枚。
  2. 點 拉取並對比,查看 install / same / differ 三組。
  3. 對 install 組點 安裝全部缺失插件。
  4. 對 differ 組按行 覆蓋(顯示 local → remote)。
  5. 重啓 DSH。

日常更新

在 A 上增刪或升級插件後再次 導出並推送;在 B 上 拉取並對比,對版本變化的行執行 覆蓋。插件不會在導出前讀取遠端以推斷變更,而是以本地當前安裝集爲準全量寫回。

適用場景與注意

適合:多臺開發機、重裝系統後快速對齊同一 DSH profile 的第三方插件;希望把插件集(含非 npm 來源的安裝)備份到自建 Git 倉庫。

注意:

  • 令牌僅授予目標倉庫的 contents 寫權限即可;仍須信任插件代碼與所同步的第三方包內容。
  • 卸載不會從遠端同步刪除,需手動維護 sync/ 與 manifest.json。
  • 依賴 DSH 0.2.x 的 pluginManager API;版本不匹配時勿假定行爲一致。

結尾

dsh-plugin-git-sync 把「已裝插件集合」當作可版本化的數據,經 GitHub 或 Gitee 在多機間搬運,並用清單與 SHA-256 約束安裝過程。進一步瞭解可訪問 SkillHub 目錄頁 與 GitHub 倉庫(含 中文 README)。

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

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

小夜