前言¶
在 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 可关闭日志。
典型用法与验证¶
- 用
link:把正在开发的插件装进 profile,并安装本桥接插件。 - 编辑任意 linked 包里会被
import的文件(例如src/tools.js),保存。 - 查看日志(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。