Repository navigation
Releases: nishuoyang/dsh-wallpaper-bg
Release list
v0.5.12 — dsh-wallpaper-bg
文档
- 新增两张橱窗预览图(
docs/screenshots/preview-hero.jpg、docs/screenshots/preview-sources.jpg):hero 图取自「浅色外观 + 原生背景模式」实拍,标题与角标压在下缘与右上角、不遮挡界面;来源图把「内置壁纸 / 自定义上传 / WE 壁纸库」三屏并排,带中英说明与一行特性注释。两张都由仓库里已有的真实截图裁切合成,没有虚构界面。 - 新增
screenshots.json(放在package.json旁):声明 8 张截图的展示顺序,供 DSH 插件市场(dsh-market、dsh-plugin.org 等详情页 / 主题 Tab)像 App Store 一样展示。不声明时市场只能从 README 里自动抽取,顺序与取舍都不可控;声明后换图也只需推自己的仓库。 - README / README.zh.md 顶部预览区把这两张图排在最前。
变更
- 插件列表图标:新增包根
icon.svg,并在package.json声明"icon": "./icon.svg"(同时加进files随包发布)。DSH 的「设置 → 插件」列表里,卡片图标取自包清单的icon字段 —— 该文件由 Host 的 package-meta 读取器取用(参见dsh-context客户端源码注释与dsh-better-sidebar/@linxin666/*等同类插件的做法)。此前本包既没有icon字段也没有图标文件,列表里显示的是壳子的兜底字形;现在换成自己的图标:蓝紫双层的「壁纸卡片」(前层远景山头 + 太阳,后层暗示多来源 / 可叠加的壁纸层)。图形在 24–32px 下有辨识度,深浅色界面都成立。 - 插件分类从「工具能力」调整为「界面与外观」:
package.json的 keywords 增加theme/themes/appearance/background/ui;仓库 GitHub topics 增加theme/wallpaper/wallpaper-engine/appearance/background/web-ui/dsh-theme。dsh-plugin.org 的分类器优先读 topics,DSH-Store 的分类按manifest.keywords匹配,两边据此把本插件归入「界面体验 / 主题外观」而不是「工具能力」。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.12.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.12.tgz完整变更见 CHANGELOG.md。
v0.5.11 — dsh-wallpaper-bg
文档
- README / README.zh.md 顶部徽章行加上社区插件目录的收录徽章(
):本插件已被 DSH Plugin Hub(dsh-plugin.org 的社区插件市场)收录并标记为 Verified(收录于 2026-08-27),徽章指向该条目页。徽章图片
https://dsh-plugin.org/badges/listed.svg实测返回 200(132×20 的 SVG)。 docs/troubleshooting.md里的当前版本号同步到 0.5.11:「适用版本」行、第 1 条自查的 health 示例,以及升级 / 锁版本示例;0.5.9 / 0.5.10 这类历史版本引用保持不变。- npm 上的 README 只随发布更新,所以这次以 0.5.11 重新发布一遍(纯文档):
lib/host.js/lib/client.js的逻辑与 0.5.10 完全一致,插件行为无任何变化;两个文件里只有版本号字符串随之更新。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.11.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.11.tgz完整变更见 CHANGELOG.md。
v0.5.10 — dsh-wallpaper-bg
修复
- 播放队列自动切下一张(尤其是两个视频之间)会闪一段黑屏(
lib/client.js):叠化本身是有的,但三处细节让它在视频之间漏了黑:- 旧图层在淡出开始的瞬间就被断源:
fadeOutLayer()原先立刻执行dispose()(releaseVideo:pause()+ 摘掉src+load()),那一帧<video>已经没有任何可画的帧,只剩图层自己的近黑底色#0b0d12,于是「旧壁纸淡出」实际是「旧壁纸塌成近黑再淡出」。现在淡出期间只pause()(暂停不丢最后一帧、也不再解码),真正releaseVideo推迟到图层被移除时;视频淡出期间不再多留解码器,帧率的旧修复不受影响。 - 近黑底色挂在图层上:
.wbg-layer自带background-color:#0b0d12,只要这一层的内容还没画出来(4K 视频从 attach +play()到真正出画面可能要几百毫秒),露出的就是这块不透明近黑。现在底色移到容器#dsh-wallpaper-bg上,图层全透明 —— 新壁纸没就绪时透出的是还在画的旧壁纸,而不是黑。 - 新图层其实没在叠化:
appendChild()与「把opacity改成 1」落在同一帧时浏览器不会产生过渡,新壁纸是「跳进来」的;同时队列预热路径(preloaded)拿到readyState就立刻叠化,没有等合成器真的画出一帧。现在crossfade()先强制结算一次样式再改opacity(叠化按设计真的跑起来),视频路径等requestVideoFrameCallback上报「已呈现首帧」后才进场(有计时兜底);首屏没有可叠化的旧层时仍直接显示,不会凭空多出 0.42s 的从黑淡入。
验证:用真实lib/client.js+ 真 IndexedDB 跑「两张视频的自定义队列」,在 60s 自动切换点上以约 30ms 间隔逐帧截图测合成像素与图层台账;修改前能拍到旧层断源(readyState 0 / 无 src)导致的近黑窗口,修改后切换全程由旧画面平滑过渡到新画面。
- 旧图层在淡出开始的瞬间就被断源:
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.10.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.10.tgz完整变更见 CHANGELOG.md。
v0.5.9 — dsh-wallpaper-bg
修复
- macOS 桌面端:装上插件后 DSH 窗口拖不动,双击也不放大(
lib/client.js,#3,感谢 @wlabbyflower):两个全屏层原先appendChild到<body>末尾,而 DSH 桌面端基础样式里有html[data-platform=darwin] body>:not(#root){-webkit-app-region:no-drag}—— 它们各自成为一块覆盖整窗的 no-drag 区域,并且在文档顺序上排在所有[data-window-drag]标题行之后;Electron 合成拖拽区域时是「靠后的矩形覆盖靠前的」(DraggableRegionsToSkRegion()按顺序逐条 union / difference),整窗拖拽区因此被抹掉(双击缩放依赖同一套区域,一起失效)。现在两层插到#root之前,靠后的标题行反向覆盖它们。视觉与功能不变(仍是position:fixed; z-index:-1,仍在所有 UI 之下);Windows / Linux / 浏览器里没有这条 darwin 规则,行为完全不变。自查:本机用 Electron 44(与 DSH 桌面端同大版本)的无边框窗口 + 真实系统鼠标拖拽复现了「改前拖不动、改后正常拖动」,见 PR 里的验证记录。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.9.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.9.tgz完整变更见 CHANGELOG.md。
v0.5.8 — dsh-wallpaper-bg
文档
- README / README.zh.md 新增「服务与 DSH 客户端的生命周期」(并补一条 FAQ「退出 DSH 客户端再进来,服务就没了?」):WE API 服务是独立的 Node 进程,退出 / 重进客户端、重载窗口都不会带走它,它只在 Windows 注销 / 关机时结束(下次登录由开机自启项拉起)。唯一会「一退客户端就没」的是从客户端内部启动的那份——在 DSH 的终端 / 工具里跑启动脚本时,进程落在客户端的进程树里,而 DSH 用带
KILL_ON_JOB_CLOSE的 Job Object 管理这些进程(实测LimitFlags = 0x00002000),客户端一退出就被一并结束,且we-api.log里没有任何报错,界面上只表现为「连不上服务」。正确做法:在资源管理器里双击脚本(父进程是explorer.exe),或交给开机自启项。
变更
- 面板「连不上服务」的两处提示各加一句(
lib/client.js):别在 DSH 客户端内部(终端 / 工具)启动服务——那样起的进程会随客户端退出一起结束,请在资源管理器里双击脚本。纯文案,不改行为。 - 插件版本 0.5.8(宿主半
/dsh-wallpaper-bg/health的version同步为 0.5.8,需重启 DSH 生效);WE API 服务仍是 0.5.1——服务端代码本次未改。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.8.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.8.tgz完整变更见 CHANGELOG.md。
v0.5.7 — dsh-wallpaper-bg
修复
- 本次现场的定性(不是脚本缺陷):用户报告「点过那几个脚本、重启电脑后 WE 服务仍不自启」,实测根因是
HKCU\...\Run里那条自启值已被删除(唯一会删它的是取消开机自启.bat,从残留痕迹看极可能是误双击),脚本与服务本身都没问题——设置开机自启.bat实跑退出码 0、写出的值名与数据都正确,静默启动链路(wscript.exe→cmd /c node server.js)也在 1 秒内把 8088 重新拉了起来。下面两条是这次排查暴露出来的真实粗糙点。 - 自启项被「禁用」后,
设置开机自启.bat会报成功但登录仍不启动:任务管理器 /「设置 → 应用 → 启动」里的「禁用」不删除HKCU\...\Run里的值,只把HKCU\...\Explorer\StartupApproved\Run里同名的状态写成01(本机实例:QianwenUpdaterTaskUser1.0.0.10的 Run 值仍在、状态是01-00-00-00-…),而登录时这种状态会被跳过。脚本以前只校验 Run 值在不在,于是这种情况照样打印[成功]。现在注册 Run 值之后会把该状态一并归一为「已启用」(REG_BINARY02 00 00 00 …,12 字节,与 Windows 给「从未被禁用过」的启动项写下的形态一致),并回读reg query校验:读到01明确警告去任务管理器启用,读到其它内容则照实打印,而不是无条件报成功。 取消开机自启.bat只删 Run 值,把StartupApproved状态留在原地:事后看注册表或任务管理器会出现两种误判——「还设着」和「设了却不生效」,本次现场正是被这条残留带偏的。现在它把状态记录一并删除,输出里也写明「只取消下次登录自动启动,当前正在运行的服务不受影响;恢复请双击设置开机自启.bat」。
文档
- README / README.zh.md 的「WE 壁纸库服务」小节补上这两点:自启项在任务管理器 → 启动里显示「已禁用」时,重新双击
设置开机自启.bat会把它重新置为「已启用」;取消开机自启.bat会把Run值与状态记录一起清掉。 - 说明分发范围:
wallpaper-engine-api/的脚本不在 npm 包里(package.json的files未包含该目录),拿到这次修复要走仓库git pull;npm 包里的本文件只作告知。
变更
- 插件版本 0.5.7(宿主半
/dsh-wallpaper-bg/health的version同步为 0.5.7,需重启 DSH 生效);WE API 服务仍是 0.5.1——服务端代码本次未改,只改了它的两个自启脚本。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.7.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.7.tgz完整变更见 CHANGELOG.md。
v0.5.6 — dsh-wallpaper-bg
修复
- 服务断线时面板会「瞒着」用户:
loadWe()失败时只setWeError、不清空列表,而错误块的渲染条件是weError && !list——于是只要本次页面会话里成功加载过一次壁纸库,之后 WE API 服务挂掉(重启电脑而没设开机自启、随手关掉了启动服务.bat的窗口等),切回 WE 页签看到的仍是一份过期列表,界面上没有任何异常迹象。现在只要列表还在而服务已连不上,就会在列表上方显示一条横幅:说明连不上服务(带当前基地址)、列表可能已过期,并给出两步——双击重启服务(管理员).bat后点「刷新」即可恢复;想以后重启电脑 / 关窗口都不用管,双击同目录的设置开机自启.bat。走横幅这条路径能确定用户装过服务(否则不会有列表),所以它只说这一步,不再让人 clone / npm install。 - 「连不上服务」的完整提示不再一上来就让人重新装:原文按「从没装过」的口径写,开头就是
git clone+npm install,对「装过、只是服务没在运行」的人(最常见)是错误的第一步。现在按代价从低到高排列:① 装过、只是没在运行 → 重启脚本(并推荐设开机自启);② 从没装过 → clone / npm install /启动服务.bat;③ 还是不行 → 看we-api.log末尾与端口设置。
文档
- README / README.zh.md 把
设置开机自启.bat从「可选第 6 步」提升为推荐步骤,并写明不设的后果:服务只活在「启动它的那个窗口」存续期间,重启电脑或关掉该窗口后就没了,WE 页签会提示连不上(列表标注可能已过期),直到手动再启动一次。
变更
- 插件版本 0.5.6(宿主半
/dsh-wallpaper-bg/health的version同步为 0.5.6,需重启 DSH 生效);WE API 服务仍是 0.5.1——服务端代码本次未改。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.6.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.6.tgz完整变更见 CHANGELOG.md。
v0.5.5 — dsh-wallpaper-bg
修复
- 新克隆的仓库装依赖时
npm install直接失败(EALLOWREMOTE):wallpaper-engine-api/package-lock.json把每个包的resolved地址写死为https://registry.npmmirror.com/...,而 npm 12 起默认allow-remote=none,会拒绝主机与当前配置源不一致的 tarball,于是npm install硬失败:EALLOWREMOTE: Fetching packages of type "remote" have been disabled(实测 npm 12.0.2 + 该 lock 文件退出码 1、去掉 lock 文件后退出码 0;npm 11.21.0 + 该 lock 文件退出码 0)。启动脚本以前只把这种情况报成npm install failed. Check your network / npm registry.,把用户引向并没有问题的网络与源,然后直接退出——新用户到此彻底卡死。 启动服务.bat的依赖补装改为三级兜底:npm install失败时,依次追加--allow-remote=all(放行 lock 文件里指向另一个 registry 的 tarball,对应上面的EALLOWREMOTE)与--no-package-lock(忽略 lock、改按用户.npmrc里配置的源解析)各重试一次,每一步都打印原因,三次都失败才提示手动执行npm install看完整报错。保留 lock 文件是有意的:本机实测registry.npmjs.org连接超时、registry.npmmirror.com0.5 秒返回 200,lock 里写死的镜像地址让安装不依赖用户配置的源,删掉它反而会让npm install卡住。.bat/.cmd/.vbs的行尾不再取决于克隆者的core.autocrlf:cmd.exe 按字节偏移而不是按行解析批处理,行尾若是裸 LF 就会定位到行中间、开始执行半截命令,刷出一片'...' is not recognized as an internal or external command——启动服务.bat/重启服务(管理员).bat都可能因此启动失败。Git for Windows 默认core.autocrlf=true(检出为 CRLF)掩盖了这一点,core.autocrlf=false/input或在非 Windows 主机克隆后再经共享目录运行就会踩到。新增.gitattributes固定*.bat/*.cmd/*.vbs为text eol=crlf(仓库内仍存 LF,检出统一为 CRLF)。- 面板里「WE 壁纸库」连不上服务时的提示改推
启动服务.bat:原文让用户双击启动服务-静默.vbs,而静默启动没有首次运行向导,缺少node_modules或we-api.config时会完全静默地失败——连窗口都不弹,唯一痕迹是we-api.log末尾的堆栈。现在提示改为启动服务.bat(首次运行走向导并写出we-api.config),静默脚本只作为后台 / 开机自启方式;bin/dsh-wallpaper-bg.js的提示沿用同样的说法。
文档
- README / README.zh.md 的「WE 壁纸库服务」小节按真实首次运行流程重写,顺序为:(a) Windows + 本机 Wallpaper Engine(服务必需;装在第二个 Steam 库时不会被自动探测,需要在向导里粘贴路径)、(b) PATH 里有 Node.js(服务是独立的 Node 进程,桌面端自带的运行时管不到它,缺了会停在
[ERROR] Node.js not found in PATH.)、(c)git clone https://github.com/nishuoyang/dsh-wallpaper-bg、(d)wallpaper-engine-api里npm install、(e) 双击启动服务.bat回答向导。同时写明首次运行请走启动服务.bat(/setup可重跑向导),启动服务-静默.vbs只用于后台 / 开机自启;双击后「什么都没发生」正是静默启动缺配置的表现,改用启动服务.bat即可。 - 补文档化两个诊断文件:
wallpaper-engine-api/we-api.log(静默 / 开机自启路径写下的服务输出)与wallpaper-engine-api/restart-debug.log(重启服务(管理员).bat的停进程 / 提权 / 等待端口记录),两者都已 gitignore。 - 纠正「重启 = 升级」的旧说法:
重启服务(管理员).bat只结束占用 8088 的进程、再以静默方式拉起node server.js,既不git pull也不npm install,不能升级服务;升级 = 仓库里git pull+wallpaper-engine-api里npm install+ 重启。FAQ 里判断服务是否过旧的依据也从已失效的subscriptionsFile(现在任何版本都会输出该键,可能为null)改为当前能力标记"webShim": 1/"monitorSelect": 1(服务版本 0.5.1)。 - 补非交互 / 无人值守安装方式:
we-api.config是server.js同目录下的纯KEY=value文件(向导写WE_INSTALL_PATH=/WE_WORKSHOP_PATH=),也可改用WE_INSTALL_PATH/WE_WORKSHOP_PATH/WE_SUBSCRIPTIONS_FILE/WEAPI_PORT环境变量(优先级高于配置文件),并可直接在wallpaper-engine-api里执行node server.js。 - 说明
WEAPI_PORT只改服务端口:启动脚本把 8088 写死(启动服务.bat检测 8088、重启服务(管理员).bat结束 / 等待 8088),换端口必须同时改这两个脚本,并同步插件设置里的基地址。 - FAQ 清理与补齐:删除 README.md 里重复的「Do web-type wallpapers render?」条目(保留内容更新的那一条,README.zh.md 本来就只有一条);「服务要升级到 0.2.6」这类过时要求改为「当前服务(0.5.1)」;补上完整的
git clone命令;npm tarball 说明去掉不准确的内容枚举(tarball 只含插件本体,不含wallpaper-engine-api/);新增两条 FAQ——npm install报EALLOWREMOTE/ 取不到包时的三步兜底命令,以及「双击启动服务后什么都没发生」= 静默启动缺配置、改用启动服务.bat。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.5.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.5.tgz完整变更见 CHANGELOG.md。
v0.5.4 — dsh-wallpaper-bg
修复
dsh-wallpaper-bg status现在能认出「装了但没进 bundles」的状态:dsh plugin … add由 DSH 自己把插件名回填进dsh.profile.bundles,只有进了这个列表才会被当成 profile 组合层加载;版本刚发布、注册表还在传播时偶尔会漏写(依赖装上了、bundles 里却没有),表现是「装完了但 设置 → 壁纸 里没有面板」。status 以前只按「依赖里有没有」判断,会误报成已安装;现在区分为installed(bundle 层,随 DSH 启动加载)与installed(依赖已装,但 dsh.profile.bundles 里没有 … → 不会被加载;重跑一次 dsh plugin --profile <name> add dsh-wallpaper-bg 即可补上),desktop profile 一行同理。- README / README.zh.md FAQ 增补:「装完没有面板」的排查步骤(查
dsh.profile.bundles、用 status 判断、重跑一次 add),以及<DSH 地址>/dsh-wallpaper-bg/health这另一半检查。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.4.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.4.tgz完整变更见 CHANGELOG.md。
v0.5.3 — dsh-wallpaper-bg
新增
- 「WE 壁纸库」连不上服务时直接给出获取方式:面板的错误提示现在写明该服务只随仓库提供、不在 npm 包里,并给出
git clone https://github.com/nishuoyang/dsh-wallpaper-bg→wallpaper-engine-api里npm install→ 双击启动服务-静默.vbs的完整步骤,同时说明不需要 WE 壁纸库时可以忽略(内置壁纸与自定义上传都不依赖它)。dsh-wallpaper-bg install/status/help与install-local.ps1的提示同样补上了仓库地址,package.json描述里也标明了这一限制(桌面端「设置 → 插件」列表与 npm 包页面可见)。
变更
- npm ↔ GitHub 双向关联:
package.json补齐repository/homepage/bugs/author(从下一次发布会写进 npm 注册表元数据,npm 包页面随即出现指向本仓库的 Repository 链接);README / README.zh.md 顶部新增 npm 版本 / 下载量 / release / license 徽章;仓库 About 的 Website 指向 npm 包页面。 - 新增两个 CI 工作流(
.github/workflows/),都不改动现有发布流程:publish-npm.yml:用 OIDC trusted publishing 发布到 npmjs(无需 token),npm 自动附带 provenance 证明——npm 包页面出现 "Built and signed on GitHub Actions" 徽章,点开直达本仓库 / commit。默认只手动触发,避免与release.ps1的本地npm publish抢版本号。publish-github-packages.yml:GitHub Release 发布后把包镜像到 GitHub Packages(@nishuoyang/dsh-wallpaper-bg),让仓库右侧的 Packages 区块列出本包。该镜像仅供 GitHub 侧展示——GitHub Packages 的 npm 源即使 public 也要带 token 才能 install,对外安装仍走 npmjs。
修复
- 装进没有 Web 服务的 profile 不再让 DSH 启动失败:宿主半原先用
inject: ['webServer']硬门控,在没有 Web 服务的 profile(headless、tui、自建 profile,以及终端里dsh plugin --profile desktop新建出来的 desktop profile)里这条插件行会永远停在 pending,DSH 启动直接报plugin tree failed to load: dsh: 1 entry did not activate / dsh-wallpaper-bg: waiting for service: webServer——用户装完插件整个 profile 都起不来。现在改为ctx.inject(['webServer'], cb)按需注入:服务缺失时插件照常激活、什么都不注册;服务出现时自动注册路由、消失时自动注销。web/ 桌面端行为与之前完全一致(/dsh-wallpaper-bg/health、/we、/asset全部照常)。
文档
- 新增「升级」小节(README / README.zh.md):说明
dsh plugin … add对已存在的依赖不会改范围(停在^0.4.1的 profile 不会自己升到 0.5.x),升级要写dsh-wallpaper-bg@latest或具体版本;并说明 pnpm 11 默认 24 小时minimumReleaseAge的影响——版本发布后约一天内add dsh-wallpaper-bg只会装到上一个版本(@latest同样受限),要立刻安装可写死版本号、加--config.minimumReleaseAge=0,或在 profile 的pnpm-workspace.yaml里配minimumReleaseAgeExclude。 - 补 Windows
link:安装的路径限制:dsh plugin经 shell 转发给 pnpm,仓库路径带空格时 spec 会被拆成两个假依赖(link:E:/My+link:Dir/plugin)导致 profile 加载失败;改用无空格路径或install-local.ps1/dsh-wallpaper-bg install(后者链接到%DSH_HOME%\node_modules,全程无空格)。 - FAQ 增补两条:安装到旧版本的处理方式;装进
headless/tui/ 自建 profile 的行为(无害但无意义)。 - WE 服务安装说明补一句:
wallpaper-engine-api/只随仓库提供,npm 包(tarball)里只有插件本体,从 npm 安装的用户要用「WE 壁纸库」需 clone 仓库(README 里已给出仓库地址)。
安装
npm install dsh-wallpaper-bg本 Release 附带的 dsh-wallpaper-bg-0.5.3.tgz 与 npm 上的产物完全一致(同一 tarball),可直接下载安装:
npm install ./dsh-wallpaper-bg-0.5.3.tgz完整变更见 CHANGELOG.md。