# 更新日志 dsh-hot-installer 的所有已发布版本。版本号遵循 SemVer;0.x 期间次版本号承担不兼容变更,补丁号用于修复与文档。 日期为发布者本地日期(UTC+8),与 npm 页面显示的日期一致。 ## [0.5.1] — 2026-09-20 ### 文档 - 中英 README 各加「我需要装吗(按 dsh 版本看)」矩阵:npm `latest`(0.1.5-rc.2)没有任何平台原生能力,装/卸/升级全靠本插件;`alpha`(0.1.6-alpha.2)装/卸已原生,本插件补版本升级与容错链。仅文档变化,代码与 0.5.0 相同。 ## [0.5.0] — 2026-09-20 ### 修复 - **兼容 dsh 0.1.6-alpha.2**:HMR 实现包由 `cordis-plugin-hmr` 换成 `dsh-hmr`,服务方法 `registerConfig` 改名为 `watchConfig`,旧调用抛 `TypeError` 导致热装静默失效。改为特性探测(`watchConfig ?? registerConfig`),两代 dsh 用同一份代码。 - **loader settle**:新版 loader 下 `entry.update()` 会在树真正摘掉行之前 resolve(实测配置 4→3 时行仍挂载),使去重逻辑误判"行还在"而跳过重挂,只打印 `all rows already present`——**模块永不重载**。改为删除后有界等待行真正离开树,并按权威的 `config.patches` 而非滞后的树去重。 ### 新增 - **模式自适应**:平台(`dsh-hmr`)已自行监听 profile 清单并原生重组装/卸,路径注册会撞车。撞车时进入 specOnly 模式——不抢路径,改为每秒轮询清单,只处理平台跳过的依赖版本变化,保留缓存驱逐、预检、回滚、紧急卸载整条链。启动日志写明当前模式。 - `patchRowIds` 纯函数(+单测,共 14 个)。 ## [0.4.8] — 2026-08-18 ### 修复 - 缓存驱逐同时匹配包目录与它的 realpath:Windows 上 pnpm 装的包缓存键保留 node_modules 软链路径,而 `link:` junction 到外部目录的包缓存键是 junction 目标的真实路径,只匹配一种会漏掉另一种。 ## [0.4.7] — 2026-08-18 ### 修复 - 重放日志按**实际补回**的条目计数并列出包名。此前按"判定缺失"计数,导致真实补回 1 条也打印 `replayed 3`(含 `!!js` 行被加载器求值后与原记录不再 deep-equal 的误判)。 ## [0.4.6] — 2026-08-18 ### 修复 - **升级真的会换代码了**:重挂前驱逐 `loader.internal.loadCache` 与 CJS `require.cache` 中该包的模块。此前 loader 按 URL 缓存,摘行重挂拿到的仍是旧模块——0.3.0 以来所有 `hot-reloaded` 日志都是假象(行重挂了,代码没换)。新增 `evicted N cached modules` 日志。 ## [0.4.5] — 2026-08-18 ### 新增 - 启动日志带上自身版本号(从本包 `package.json` 读取)。磁盘与运行进程的版本可能漂移,日志必须说明实际加载的是哪个版本。 ## [0.4.4] — 2026-08-18 ### 修复 - **自更新死锁**:HMR 的 refresh 任务会一直等到回调完成,而注册返回的 disposer 又要等这个任务;自更新(升级热安装器自己)时形成循环等待,watcher 永久失聪且行半卸载。回调改为立即返回 void,处理链在插件内部自行串行。 ## [0.4.3] — 2026-08-18 ### 修复 - 卸载竞态误报:5 秒重放对账与补丁层重组撞车时,`dsh plugin remove` 会因"记录的行已不在活配置里"而误报 `restart required`。现在视为**已卸载成功**。 ## [0.4.1 / 0.4.2] — 2026-08-17 ### 修复 - 0.4.1 引入**紧急卸载**:升级失败且回滚也失败时,把该包从 profile 的 bundles 列表摘掉,保证 dsh 仍可启动,并在日志给出精确的重新安装命令。 - 0.4.2 修掉由此引入的死循环:pnpm 对悬空 `link:` 也可能退出 0,于是"回滚成功"与"spec 变化"互相触发。现在回滚后必须验证包确实可用,不可用即走紧急卸载。 ## [0.4.0] — 2026-08-17 ### 新增 - **升级失败自动回滚**:新版本 import/apply 失败时,用 pnpm 把依赖装回旧版本并重新挂载,插件无感地继续用旧代码工作(日志 `update failed ... rolling back` / `rolled back`)。 ## [0.3.2] — 2026-08-17 ### 新增 - 更新前**预检**新版本的补丁声明;解析失败时旧行保持不动,只记录 `restart required`——失败的升级绝不拆掉正在工作的插件。 ### 文档 - 修正"插件列表"边界描述:官方列表读取的是运行时插件树,热装的包即时可见。 ## [0.3.1] — 2026-08-17 ### 文档 - 中文成为默认 README,新增英文版 `README.en.md`,索引行置于标题正下方。 ## [0.3.0] — 2026-08-17 ### 新增 - **重放保护**:手动编辑 `cordis.patch.yml` 会触发按启动快照的全量重组、冲掉热装行;新增 5 秒对账把丢失的行补回,并尊重补丁文件里显式的 `disabled: true`。 - **版本热更新**:快照从"包名列表"升级为"包名→版本 spec",spec 变化时摘旧行重挂新行。(当时以为这样就绕开了 ESM 缓存,0.4.6 才真正修好。) ## [0.2.0] — 2026-08-17 ### 新增 - **热卸载**:`dsh plugin remove` 当场卸载。此前包已从磁盘删除但行仍挂载,刷新页面会报 "Failed to load plugins"。实现包→行映射(启动时索引全部 bundle + 每次热装更新,仅存内存)。 ## [0.1.1] — 2026-08-16 ### 修复 - 启动失败:插件级 `inject: ['hmr']` 会让 entry 在 boot 时 pending,触发 fail-loud(`1 entry did not activate`)。去掉插件级 inject,改用子 fiber 等待 HMR 服务出现。 ## [0.1.0] — 2026-08-16 ### 新增 - 首个版本:监听 profile 清单(`package.json` 的 `dsh.profile.bundles`),把新 bundle 的补丁行注入运行中的插件树,`dsh plugin add` 免重启生效(实测约 8ms)。