在 DeepSeek Harness(DSH)中,不同 profile(如网页版 web 和桌面版 desktop)的插件配置往往不一致。手动复制文件容易出错,比如漏掉 allowBuilds 导致原生构建静默失败,或者发生端口冲突。dsh-profile-sync 是一个插件迁移工具,默认将网页版的插件集安全牵引到桌面版。
它自己不装任何东西,只做四件事:算差异、预检、写一个「退出后执行的脚本」、下次启动后核对是否真的落地。真正的安装交给官方通道(桌面端走应用内管理器,其它 profile 走 dsh plugin)。
核心功能¶
- 算差异:对比源和目标的插件列表,识别新增、变更、仅钉法不同等情况。
- 预检:在安装前检查潜在的阻碍项,包括 entry-id 撞车、可加载入口、声明完整性、引擎范围、git 源条件等。
- 生成脚本与核对:生成退出后执行的脚本,并在重启后核对实际落地情况。
- 面板交互:左侧栏增加「插件迁移」面板,支持勾选要迁移的插件,生成执行脚本或当场应用。
- Agent 工具:提供
profile_sync工具给 agent 使用,支持plan/write/status等操作。
安装与启用¶
安装过程不依赖 Node.js 运行插件本身,而是通过 install.cmd 将插件注册到 DSH 中。
- 打开 DeepSeek Harness(正在运行就对了)。
- 双击
install.cmd。 - 刷新页面 —— 左侧栏出现「插件迁移」面板。
install.cmd 会先执行自检(清单不变式 + 真加载),确认官方的 /api/plugin-manager 端点可用后,再把本插件装进 profile。桌面端必须保持运行,因为它要调用应用内的官方管理器。
使用方式¶
双击操作¶
install.cmd:执行装前自检 + 把本插件装进 profile。sync-plan.cmd:算差异并生成计划 + 生成apply.cmd。
命令行¶
需要 Node.js 20+ 在 PATH 上。
# 算差异并落成产物(plans/<时间>/plan.json + plan.txt + apply.cmd)
node bin/plan-cli.mjs plan --source web --target desktop --write
# 只看报告
node bin/plan-cli.mjs plan
# 核对上一次迁移是否真的落地
node bin/plan-cli.mjs status
# 应用计划(会先查目标端是否还在运行)
node bin/apply.mjs --plan "<plans/.../plan.json>"
# 只算不写,看看会改什么
node bin/apply.mjs --plan "<...>" --dry-run
# 退回最近一次快照
node bin/apply.mjs --rollback
# 装前自检(清单不变式 + 真加载)
node bin/check.mjs
面板操作¶
在左侧栏「插件迁移」面板中:
1. 选择源/目标。
2. 算差异,勾选要迁的插件。
3. 点击「生成执行脚本」或「应用」。
4. 核对上次迁移结果。
预检机制¶
装之前会查六件事。官方 dsh plugin add 不查第 2、3 条,所以必须由本插件拦截:
- 本机路径型 spec:
link:/file:指的路径是否存在。 - cordis entry id 撞车:两个 bundle 插入同一个 loader entry id 时,cordis 会拒绝启动整棵树。只统计
insert:块里的 id。 - 没有可加载入口的包:源码签出没有
lib/的包被提升进 bundle 层,会导致启动失败。 - 声明了
dsh.bundle.patch吗:进了bundles列表却没声明的包,官方只会当普通依赖装,不会成为 profile 层。 - 引擎范围:正确处理预发布号(如
0.2.0-rc.2)。 - git 源条件:只提醒,不阻断。
git ls-remote成功不代表pnpm能连,机制不同,给出 tarball 替代写法。
注意事项¶
- 桌面端 profile 禁止用 CLI 改:这是硬拦,
@deepseek-ai/dsh/lib/bin.js里有一条按名字拦住一切 CLI 调用的守卫。本插件在桌面端只调用官方管理器。 - cordis.patch.yml 不同步:里面装的是实例配置(端口、坐标、Tailscale 地址),不同步是为了避免端口冲突。
- 钉法不同 ≠ 版本变更:有些 profile 钉成精确号,有些用范围号。本插件单独归一类
repin,只报告、默认不动。 - 版本倒退只提醒:计划里出现
version-downgrade提醒,官方管理器会拒绝并回滚,插件提前说出来是为了避免无效操作。 - allowBuilds 语义保留:显式写
false是有意关掉构建脚本。同步时沿用源侧的值,不会一律写true,也不会把false翻成true。 - 不装插件也能先看效果:
bin/plan-cli.mjs完全独立,不依赖 DSH 在跑。
总结¶
dsh-profile-sync 通过差异计算、严格的预检和脚本生成,解决了 DSH profile 间插件迁移容易出错的问题。它依赖官方通道执行安装,并确保 cordis.patch.yml 等实例配置不被错误同步,适合需要在 web 和 desktop profile 间同步插件集的开发者使用。