dsh-conf-sync
一键导出 / 导入 DeepSeek Harness(DSH)及任意软件的配置文件,在其他设备之间迁移"设置及一切参数"。支持三种传输通道:
| 通道 | 说明 | 典型场景 |
|---|
local | 写入/读取本地 .tar.gz 快照 | 移动硬盘 / U盘 / 直接拷贝到另一台机器 |
http | 本机起一个临时 HTTP 服务器,打印 URL | 同一局域网内两台设备秒传 |
webdav | 推送到 / 拉取自 Alist / Nextcloud WebDAV | 云盘中转,跨网络、跨地域 |
快照是标准的 .tar.gz,内含 dsh-conf-sync-manifest.json 清单与原路径映射。
安装
# ① GitHub 仓库安装(推荐 · 多设备复用,需提交到 GitHub)
dsh plugin --profile web add github:你的用户名/dsh-conf-sync
# ② 本地 tarball 安装(免发布,单机最快)
dsh plugin --profile web add ./dsh-conf-sync-0.1.0.tgz
# ③ 作为 npm 包安装(若已发布)
dsh plugin --profile web add dsh-conf-sync
# 验证已挂载
dsh --profile web --dump-config
从 GitHub 安装会拉取源码,DSH 会自动运行包的 prepare/build 脚本编译 lib/;若 pnpm ≥ 10 首次安装拒绝运行构建脚本,请在 profile 的 pnpm-workspace.yaml 中添加 allowBuilds 授权(按报错提示复制 key)。安全建议:安装时锁定提交 github:你的用户名/dsh-conf-sync#<完整commit-sha>。
前置:Node.js ^22.19.0 || >=24、pnpm(npm install -g pnpm)。开发预览期官方会有破坏性变更,若接口变动请以 dsh --dump-config 实际输出为准。
配置
在 profile(或 $DSH_HOME/cordis.patch.yml)里为插件装配配置。默认已捕获 DSH 自身配置($DSH_HOME 或 ~/.dsh、~/.config/dsh),可按需追加其他软件:
- id: dsh-conf-sync
config:
targets:
- name: DeepSeek Harness
patterns:
- C:\Users\you\.dsh
- C:\Users\you\.config\dsh
- name: VS Code
patterns:
- C:\Users\you\AppData\Roaming\Code\User\settings.json
- C:\Users\you\AppData\Roaming\Code\User\keybindings.json
outputDir: D:\backups\conf
httpPort: 3088 # 可省略,0=随机端口
webdav:
url: https://alist.example.com/dav/snapshots/
username: admin
password: 'your-token'
noBackup: false # true 则导入时直接覆盖、不备份
提示:用 dsh --profile web --patch ./overlay.yml <任务> 可临时叠加配置进行调试,不影响正式 profile。
使用(模型可直接调用)
导出
# 1) 写成本地文件
dsh_conf_export channel="local" output="D:\backups\conf\snap.tar.gz"
dsh_conf_export channel="local" # 省略 output,自动生成到 outputDir
# 2) 起局域网 HTTP 服务器,拿到分享 URL
dsh_conf_export channel="http" port=0
# 3) 推送到云盘(Alist WebDAV)
dsh_conf_export channel="webdav" name="my-machine"
导出的结果里会包含 location(路径 / URL / 远端名)、文件数与来源主机名。HTTP 通道会打印一条分享 URL。
导入(到目标设备,改 originalPath 由 manifest 自动定位)
dsh_conf_import channel="local" source="D:\backups\conf\snap.tar.gz"
dsh_conf_import channel="http" source="http://192.168.1.5:3088/snapshot-xxx.tar.gz"
dsh_conf_import channel="webdav" source="my-machine"
# 只恢复匹配的路径(正则,可选)
dsh_conf_import channel="local" source="...tar.gz" pattern="settings.json"
# 覆盖式导入(不做备份)
dsh_conf_import channel="local" source="...tar.gz" backup=false
导入时默认会把已存在的目标文件备份为 <路径>.bak-<时间戳>,再写入。
HTTP 服务器管理
dsh_conf_close # 关闭本机所有 dsh_conf_export channel=http 启动的临时共享服务器
HTTP 服务器默认随插件卸载 / DSH 退出自动关闭,dsh_conf_close 用于运行时及时回收。
工作原理
- 导出:按
targets 展开 glob → 每个文件复制到临时目录(files/<i>),生成 manifest(含原绝对路径映射)→ 用 tar + gzip 打成 .tar.gz。
- 导入:解包到临时目录 → 读 manifest → 逐条把
files/<i> 写回 originalPath(按需备份)。tar 天然拒绝 .. 越界路径,保证安全。
- 三种通道只是"快照从哪来 / 到哪去"的搬运方式,归档格式完全一致,可互通(比如 A 机导出到 WebDAV,B 机 HTTP 拉本地再导入)。
开发
npm install
npm run typecheck # tsc --noEmit
npm run build # 产出 lib/
npm run pack # 构建 + 打 tarball
node ./scripts/smoke.mjs # 三条通道的端到端冒烟测试
结构
dsh-conf-sync/
├── package.json # 声明 dsh.bundle → cordis.patch.yml,自动进 bundle 层
├── cordis.patch.yml # bundle patch:按行 id 插入插件
├── tsconfig.json
├── src/
│ ├── index.ts # 插件入口:name/inject/Config/apply + 3 个工具
│ ├── types.ts # 配置与 manifest 类型
│ ├── glob.ts # glob / 目录展开
│ ├── archive.ts # tar.gz 打包 / 解包 / 回写(含备份)
│ └── channels.ts # local / http / webdav 三个通道
└── scripts/
├── smoke.mjs # 端到端冒烟测试
└── davtest.mjs # WebDAV 通道单独测试
限制
- 路径对齐:导入时文件写回导出机器的绝对路径。若两台机器布局不同,请确保目标路径存在对应目录,或自行决定映射。
- WebDAV:需目标目录已可写(Alist 需开启 WebDAV 且目录存在)。
- 权限/敏感:快照是纯明文
.tar.gz,若含令牌请通过私有 WebDAV / 局域网传输,勿走公开网络。
- DSH 处于 Developer Preview,接口随版本演进。
协议
MIT