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)。

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

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

小夜