dsh-dev-hotreload:本地 link 插件保存即热重载

前言

在 DeepSeek Harness(DSH)里用 link: 或 file: 安装自己正在改的插件或预设时,改完源码保存,往往希望正在跑的宿主立刻吃到新逻辑,而不是整进程重启。DSH 自带 @deepseek-ai/dsh-hmr,但对本地链接包,官方模块监听在 ESM 缓存键与 realpath 比对上会失效,改文件只会 emit 事件,不会真正重载。官方文档指出 linked 包要在 profile 重新组合(reconciliation) 时才会生效。下面介绍社区插件 dsh-dev-hotreload(维护者 Pxczxn,分类:客户端):监视 link 安装的源码,保存后轻触 profile 的 cordis.patch.yml,走官方重组合路径,让运行中的宿主热替换该包。

这是什么

dsh-dev-hotreload 是 DSH 的本地开发热重载桥。你在本地开发的插件/预设源码一保存,正在运行的宿主就把对应包热替换掉,无需重启。仓库:GitHub - Pxczxn/dsh-dev-hotreload;社区目录页:skillhub.cn/plugins/Pxczxn/dsh-dev-hotreload。许可证 MIT,当前包版本 1.0.0;运行要求 Node.js >= 20,DSH >= 0.2.1-rc.2。

它解决什么问题

资料中对 dsh-hmr 0.2.1-rc.3 的实测结论是:link: / file: 包在缓存里以 symlink 路径为键,HMR 用 realpath 比对时 esmHas(url) 恒为 false,因此不会真正重载。有效路径是 profile 重组合:cordis.patch.yml 或 package.json 变化后,dsh-hmr 按 mtime + size 停掉变更插件、清 ESM 缓存、重新 import。

本插件的做法是监视本地源码目录,保存后经防抖(默认 400ms)改写 cordis.patch.yml 里的 tick 注释,触发配置监视 → profile 重组合 → 插件热替换(工具 schema 同步)→ 由 client-hmr 推送前端(视插件是否声明 dsh.client)。

安装与启用

安装命令须带 --profile,路径按你的环境替换为绝对路径:

# 从打包好的 tgz(分发用;pnpm pack 的产物)
dsh plugin --profile <profile> add /absolute/path/to/dsh-dev-hotreload-1.0.0.tgz

# 从本地目录链接(改源码并自举时常用)
dsh plugin --profile <profile> add link:/absolute/path/to/dsh-dev-hotreload

# 从 GitHub
dsh plugin --profile <profile> add github:Pxczxn/dsh-dev-hotreload

自行打包分发:

pnpm pack --pack-destination ./dist

包自带 dsh.bundle.patch(cordis.patch.yml),安装后行 dev-hotreload 会自动进组合,零配置即可工作。插件以当前 DSH 进程权限运行;安装前应自行阅读仓库源码与 MIT 许可证,确认可接受后再装。

零配置时如何定位资源

需要的东西 自动发现方式
profile 目录 profileContext.dir → ctx.baseUrl → 宿主进程参数里的绝对路径 → $DSH_HOME/profiles/desktop,取第一个「像 profile」的目录
监视的源码目录 读该 profile 的 package.json 里 link: / file: 依赖的真实目录;再加 node_modules 顶层(含 @scope/pkg)所有 symlink 的真实目录
轻触的 patch 文件 <profile>/cordis.patch.yml
日志 os.tmpdir()/dsh-dev-hotreload.log

node_modules、.git、dist、build、out、coverage、cache 等目录内的写入会被忽略。

可选配置

在 profile 的 cordis.patch.yml 里用同 id dev-hotreload 覆盖;config 是整体替换,未写字段用默认值:

- id: dev-hotreload
  config:
    dirs:
      - 'D:\Coding\project\dsh\plugins\my-plugin'
    autoDiscover: true
    profile: 'D:\...\profiles\desktop'
    patch: 'D:\...\profiles\desktop\cordis.patch.yml'
    log: 'D:\Coding\tmp\dev-hotreload.log'
    debounce: 400

仅监视指定目录、关闭自动发现:

- id: dev-hotreload
  config:
    autoDiscover: false
    dirs:
      - 'D:\repo\my-plugin'

log 设为 false 可关闭日志。

典型用法与验证

  1. 用 link: 把正在开发的插件装进 profile,并安装本桥接插件。
  2. 编辑任意 linked 包里会被 import 的文件(例如 src/tools.js),保存。
  3. 查看日志(Linux/macOS 示例路径在系统 tmp 下,文件名 dsh-dev-hotreload.log);Windows 上 README 示例为:
Get-Content "$env:TEMP\dsh-dev-hotreload.log" -Tail 20

应出现 change: src/... 与 ticked cordis.patch.yml。
4. 在宿主中立刻验证行为是否已更新(例如工具输出变化),即说明热替换生效。

适用场景与限制

适合:本地用 link/file 开发 DSH 插件或预设、希望保存后走官方重组合、避免频繁重启宿主。

限制(来自 README):

  • 依赖 @deepseek-ai/dsh-hmr 的配置监视;若在 profile 里把 hmr 设为 disabled: true,本插件无效。config.root 不必为本插件专门配置(linked 包模块监听无效,root: [] 即可)。
  • 每次保存触发一次重组合,开销与「改配置」同级;可用 debounce 调节。
  • 重组合失败时 dsh-hmr 不会回滚;改坏代码会看到插件 failed,修好再保存即可恢复。
  • 主要作用于会重新执行 apply 的宿主侧代码;纯 client bundle 更新由 client-hmr 负责,取决于插件是否声明 dsh.client。

DSH 生态强调「一切皆插件」;skillhub.cn 上的插件目录是社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-dev-hotreload 把「保存源码」接到官方 profile 重组合,补上 link 包在 dsh-hmr 模块监听上的缺口,适合日常本地插件开发。详情与源码见 GitHub,目录条目见 skillhub.cn。

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

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

小夜