From f77f60ecd57fe043e430d6caf3ae322e65c82b68 Mon Sep 17 00:00:00 2001
From: Tunglies <77394545+Tunglies@users.noreply.github.com>
Date: Thu, 10 Sep 2026 08:09:54 +0800
Subject: [PATCH] docs(changelog): distill release notes and add platform
grouping
The v2.5.4 notes had grown to 97 free-form entries exposed verbatim in
the in-app update dialog. Distill them to 58 one-theme-per-line entries
capped at ~60 CJK characters with no internal terminology, and move the
writing rules into template/Changelog.md so every cycle starts from them.
Release plumbing now agrees on the --- divider: extract_update_logs.sh
stops there like updatelog.mjs, so file-only content never reaches
release bodies, while updater.mjs appends a per-tag See More link to the
update notes it generates. scripts-workflow/group_platforms.sh locks
platform entries under emoji platform headings, wired into pre-commit,
release and autobuild CI, and the changelog bump script; AGENTS.md points
agents at the template rules.
---
.github/workflows/autobuild.yml | 6 ++
.github/workflows/release.yml | 6 ++
AGENTS.md | 3 +
Changelog.md | 160 ++++++++++++----------------
Makefile.toml | 11 ++
scripts-workflow/bump_changelog.sh | 2 +
scripts-workflow/group_platforms.sh | 110 +++++++++++++++++++
scripts/extract_update_logs.sh | 7 +-
scripts/updater.mjs | 9 +-
template/Changelog.md | 26 ++++-
10 files changed, 246 insertions(+), 94 deletions(-)
create mode 100755 scripts-workflow/group_platforms.sh
diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml
index 620a68868..86f42b2e8 100644
--- a/.github/workflows/autobuild.yml
+++ b/.github/workflows/autobuild.yml
@@ -35,6 +35,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v7
+ - name: Group changelog platforms
+ run: bash ./scripts-workflow/group_platforms.sh
+
- name: Fetch UPDATE logs
id: fetch_update_logs
run: bash ./scripts/extract_update_logs.sh
@@ -510,6 +513,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v7
+ - name: Group changelog platforms
+ run: bash ./scripts-workflow/group_platforms.sh
+
- name: Fetch UPDATE logs
id: fetch_update_logs
run: bash ./scripts/extract_update_logs.sh
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 7da44be7f..90cbf9969 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -92,6 +92,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v7
+ - name: Group changelog platforms
+ run: bash ./scripts-workflow/group_platforms.sh
+
- name: Fetch UPDATE logs
id: fetch_update_logs
run: bash ./scripts/extract_update_logs.sh
@@ -624,6 +627,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v7
+ - name: Group changelog platforms
+ run: bash ./scripts-workflow/group_platforms.sh
+
- name: Fetch UPDATE logs
id: fetch_update_logs
run: bash ./scripts/extract_update_logs.sh
diff --git a/AGENTS.md b/AGENTS.md
index 69a692d6b..ce9822479 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -55,6 +55,9 @@ the ownership evidence the AI-slop review evaluates (see
[pr-ai-slop-review.md](.github/workflows/pr-ai-slop-review.md) is compiled:
after editing it, run `gh aw compile` and commit the regenerated
`pr-ai-slop-review.lock.yml`. Never edit the lock file directly.
+11. **Changelog.** Entries follow the rules in
+ [`template/Changelog.md`](template/Changelog.md): one line per
+ user-visible change, no internals.
## Pull Request Shape
diff --git a/Changelog.md b/Changelog.md
index b6a1285ab..b837df4e2 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,73 +1,69 @@
## v2.5.4
-### 🐞 修复问题
+
+ 🐞 修复问题
-- 修复 macOS 多显示器切换时托盘速率样式不同步
-- 修复 WebSocket 在 onConnected 初始化完成前被保存的问题,避免初始化失败后留下无监听且无法重试的无效连接。
-- 修复 Mihomo API 变更后 inline proxy-provider 被错误过滤的问题,解决节点显示 Unknown 及延迟测试失败的问题
-- 修复 macOS 开启「访问系统范围设置需要管理员密码」时无法设置系统代理的问题
-- 修复从未开启过系统代理的用户,每次内核启动都收到报错的问题
-- 修复受限机器上「安装服务 → 自动切换到服务模式」整条流程无法走通的问题
-- 修复 Windows 卸载后保留 TUN 配置、重新安装时因系统服务缺失而无法启动内核的问题,启动时会在当前会话回退到 Sidecar,并保留原 TUN 偏好
-- 修复系统代理开关切换失败后,界面停留在错误状态的问题
-- 修复托盘与热键切换系统代理失败时没有任何提示的问题
-- 修复代理守卫反复失败后无限重试且不告知用户的问题
-- 修复错误提示只显示最外层信息、丢失具体原因的问题
-- 修复过长的错误提示撑满界面的问题(右键复制仍为完整内容)
-- 修复部分错误提示显示为 [object Object] 的问题
-- 修复 i18n 清理脚本因导入方式错误而无法运行的问题
-- 修复 Linux 桌面环境下主题切换时应用外观不跟随的问题
-- 修复 Gemini 测试正确性
-- 修复 macOS/Linux 用户模式下旧版服务遗留的 cache.db 属主为 root 且当前用户不可写,导致无法记住上次选择节点的问题
+- 修复系统代理状态不同步:切换失败后界面停留错误状态、后台应用后未刷新、托盘与热键切换失败无提示
+- 修复代理守卫反复失败后无限重试且不告知用户的问题,连续失败后停止并告知
+- 修复其余系统代理问题:未开启过的用户每次启动收到报错、恢复备份后未关闭
+- 修复服务健康探测结果粘滞、受限机器上安装服务后无法切换服务模式,失败时回退 Sidecar 且开关状态与内核一致
+- 修复服务模式下升级内核后重启仍运行旧版本的问题(需要 clash-verge-service 2.6.8)
+- 修复 Mihomo API 变更后 proxy-provider 被误过滤,节点显示 Unknown 及延迟测试失败
- 修复代理组节点 `PASS-RULE` 被过滤丢失的问题
-- 修复 Windows 主窗口打开时关机被「此程序正在阻止关机」卡住、无法退出的问题
-- 修复代理组与首页测试列表的内联 SVG 图标含中文等非 Latin-1 字符时无法显示、甚至导致页面报错的问题,改用 UTF-8 URL 编码渲染图标
-- 修复内核启动后未恢复上次选择的节点、代理组回落到首个节点的问题,应用记录的节点选择会在内核就绪后重新应用,不再完全依赖内核的 cache.db
-- 修复修改端口失败后 PAC 服务未重新开启,导致使用 PAC 的浏览器静默直连的问题
+- 修复内核启动后未恢复上次选择的节点、代理组回落到首个节点的问题
+- 修复代理组与首页测试列表图标在含非 Latin-1 字符时无法显示、导致页面报错的问题
- 修复并发修改端口、TUN 等配置时草稿相互覆盖或被误回滚的问题
-- 修复启动初始化时 Runtime 配置未应用、代理视图分组顺序使用旧配置的问题
-- 修复刷新代理配置事件导致应用卡死的问题
-- 修复关闭「自动检查更新」后首页手动检查更新直接提示已是最新版本的问题
-- 修复订阅列表解析失败时孤立文件清理误删订阅文件的问题,订阅文件现在仅在显式删除时才会移除
-- 修复删除订阅中途失败后配置与文件状态不一致的问题
-- 修复无效的订阅排序请求导致订阅列表丢失的问题
-- 修复订阅自动更新失败未上报的问题
-- 修复重启应用后订阅自动更新倒计时被推迟并显示「更新失败」的问题,更新进行中被禁用的任务再次启用时不再重复执行
-- 修复编辑含空名称节点的订阅时代理编辑器崩溃的问题
-- 修复订阅编辑器在 YAML 格式错误时丢失原始内容的问题
-- 修复 DNS 设置 YAML 编辑模式下空内容解析报错及初始值覆盖用户配置的问题
+- 修复快速重启内核时混合端口被错误回退的问题
+- 修复修改端口失败后 PAC 服务未重新开启,导致使用 PAC 的浏览器静默直连的问题
- 修复 TUN 模式下 `fake-ip-range6` 默认值,重置为 `2001:2::0/64`
-- 修复回退到 Sidecar 后 TUN 开关仍显示已开启的问题,开关状态以内核实际运行状态为准
-- 修复服务健康探测结果粘滞、服务操作失败后未能回退到 Sidecar 的问题
-- 修复服务模式下升级内核后重启仍运行旧版本内核的问题:升级后的内核经管理员授权交付给服务,安装包也会在安装时向服务登记内置内核(需要 clash-verge-service 2.6.8)
-- 修复 macOS 内核自更新被 Hardened Runtime 终止、留下 0 字节内核文件的问题,改为由应用下载校验后原子替换
-- 修复 Windows 内核升级重启失败后遗留旧内核文件、且卸载程序不清理的问题
-- 修复 Windows 上数据目录属主为其他账户(如曾以管理员运行)导致服务模式无法使用的问题,启动时自动修复属主
+- 修复启动初始化时代理视图分组顺序使用旧配置的问题
+- 修复刷新代理配置事件导致应用卡死的问题
+- 修复订阅文件管理问题:解析失败时清理误删订阅文件、删除中途失败后状态不一致、无效排序请求导致列表丢失
+- 修复订阅自动更新失败未上报、重启后倒计时被推迟并误显「更新失败」的问题
+- 修复订阅与 DNS 编辑器问题:空名称节点导致崩溃、YAML 错误时丢失原始内容、DNS 编辑初始值覆盖用户配置
+- 修复关闭「自动检查更新」后首页手动检查更新直接提示已是最新版本的问题
+- 改进错误提示:显示完整原因而非操作系统原文、不再出现 [object Object]、过长时截断(右键复制完整内容)
+
+**🖥️ Windows**
+
+- 修复 Windows 内核升级失败遗留旧内核且卸载不清理的问题
+- 修复 Windows 数据目录属主异常导致服务模式不可用的问题,启动时自动修复属主
+- 修复 Windows 对不支持的 redir/tproxy 端口误做冲突检测的问题
+- 修复 Windows 上系统代理写入偶发瞬时失败的问题,增加重试并给出提示
+- 修复 Windows 卸载后残留 TUN 配置、重装后无法启动内核,当前会话回退 Sidecar 并保留 TUN 偏好
+- 修复 Windows 主窗口打开时关机被「此程序正在阻止关机」卡住、无法退出的问题
+
+**🍎 macOS**
+
+- 修复内核自更新在 macOS 留下 0 字节文件的问题
+- 修复 macOS 系统代理写入:管理员密码下无法设置、登录自启时网络未就绪、无活动网络服务时误报失败
+- 修复 macOS 多显示器切换时托盘速率样式不同步的问题
+
+**🐧 Linux**
+
- 修复 Linux 通过 pkexec 安装/卸载服务时 polkit 认证失败的问题
-- 修复快速重启内核或 macOS 监听守卫误判导致混合端口被错误回退的问题
-- 修复 Windows 上对不支持的 redir/tproxy 端口做冲突检测的问题
-- 修复 macOS 登录自启时网络尚未就绪导致系统代理写入失败的问题,并在出现新网络服务时自动重新应用系统代理
-- 修复 macOS 无活动网络服务时开关系统代理被当作失败的问题
-- 修复 Windows 系统代理写入偶发瞬时失败的问题,增加重试并给出提示
-- 修复内核尚未运行时开启系统代理没有明确提示、以及恢复备份后系统代理未按备份状态关闭的问题
-- 修复后台自动应用系统代理后界面状态未刷新的问题
-- 修复系统代理绕过列表在 Linux/macOS 上使用错误分隔符的问题
-- 修复退出应用时关闭内核失败没有显示具体原因的问题
-- 修复侧边栏菜单项字重不一致的问题
+- 修复 Linux 桌面环境下主题切换时应用外观不跟随的问题
+
+**🍎/🐧 macOS/Linux**
+
+- 修复系统代理绕过列表在 macOS/Linux 上使用错误分隔符的问题
+- 修复 macOS/Linux 旧服务遗留数据属主为 root,导致无法记住选中节点的问题
+
+
✨ 新增功能
-- 新增混合代理端口冲突自动回退:启动时检测端口占用并临时改用可用端口,配置中的端口保持不变、下次启动重新尝试,同时统一首页、设置与系统代理中的生效端口显示
-- 系统代理或 TUN 因权限被拒时弹出引导窗口,一步安装系统服务并自动恢复原本的设置
-- 引导窗口显示当前阶段:安装服务 / 重启内核 / 应用代理
-- 系统代理失败会保留到窗口可见时再呈现,不会因窗口隐藏或最小化而丢失
-- 区分「需要安装服务」与「服务已就绪但内核仍以 Sidecar 运行」,分别给出对应操作
+- 新增混合代理端口冲突自动回退:启动时检测端口占用并临时改用可用端口,配置端口保持不变、下次启动重新尝试
+- 系统代理或 TUN 因权限被拒时弹出引导窗口,一步安装系统服务并自动恢复原本设置,并显示当前阶段
- 支持手动点击取消代理组中固定的代理节点
-- 开启 DNS 覆写时若当前订阅包含自定义 DNS 配置会先弹窗确认,订阅更新后检测到自定义 DNS 会自动关闭覆写,避免覆盖导致节点无法连接
-- 代理页空状态给出排查引导(未导入或未激活订阅、内核不可用等),并提供前往订阅、重启内核、打开日志目录等快捷操作
+- 开启 DNS 覆写时若当前订阅包含自定义 DNS 配置会先弹窗确认,订阅更新后自动关闭覆写,避免节点无法连接
+- 代理页空状态给出排查引导(未导入或未激活订阅、内核不可用等),提供前往订阅、重启内核等快捷操作
- 订阅自动更新间隔低于 24 小时时给出警告,避免频繁重载内核中断连接
- 启动失败时弹窗显示具体原因并写入 `logs/startup.log`,不再静默退出
+
+**🍎 macOS**
+
- macOS 采用 Icon Composer 2 制作的 Liquid Glass 应用图标
@@ -76,41 +72,27 @@
🚀 优化改进
- TUN 模式设置也遵循 原始配置 < Merge 覆写 < Script 脚本 < GUI
-- 优化监听端口冲突检测:代理端口按最终 Runtime 监听范围校验并协调三层持久化,隧道按实际地址与 TCP/UDP 协议检测且保留热重载
-- 优化代理数据处理:统一通过单一 IPC 获取有序代理视图,并增强刷新、链路选择、重复判断及异常状态下的稳定性
-- 新增 macOS 启动门禁,避免多用户环境下的实例冲突
-- 加强 Service 多用户隔离与身份认证,支持安全的 Owner 接管
-- 统一系统代理所有权,实现原子化代理切换
-- 新增旧版 Service 迁移引导与 Sidecar 安全回退
-- 优化核心启动、停止及更新流程,减少竞态与残留进程
-- 优化首页当前节点的交互
-- Linux 代理设置缺失必要命令时,给出明确命令缺失信息,避免模糊报错
+- 增强代理页刷新、链路选择与异常状态下的稳定性
+- 加强服务多用户隔离与身份认证,新增旧版服务迁移引导
+- 系统代理写入半途失败后,系统状态、代理守卫与配置保持一致
+- 优化内核启动、停止及更新流程,减少启动失败与残留进程;减少慢机器上误判服务不可用
+- 优化首页当前节点的交互与固定状态显示
- 支持在前置规则与后置规则之间直接切换规则位置
-- 系统代理已经是目标状态时不再执行多余的系统写入
-- 系统代理写入半途失败后,系统状态、代理守卫与配置三者保持一致
-- 代理守卫连续失败后停止并告知,不再静默重试
-- TUN 模式开关不再需要单独的安装服务按钮,与系统代理走同一条恢复流程
-- 系统代理失败给出可操作的具体原因,而非操作系统的英文原文
-- 配置变更后统一广播刷新,界面开关与托盘状态保持同步
-- 重构命令层错误返回为结构化格式,保留完整诊断链
-- 优化首页界面中当前节点固定状态显示
-- 优化拖动排序样式及动画效果
-- Linux KDE 桌面环境设置系统代理时不再强制要求使用 `gsettings` 命令
-- 移除便携模式支持,不再识别 `.config/PORTABLE` 标记,数据目录统一使用系统应用数据目录
-- Linux 设置系统代理不再强制要求 `dconf` 命令
- 限制外部链接仅允许打开 http/https 地址,订阅主页地址同样校验
-- 更新弹窗的发布说明经过安全过滤并支持 GFM 语法(表格、提示块),版本比较统一使用语义化版本
-- 自动更新时跳过安装程序的语言选择提示
-- 内核校验进程被终止时提示检查安全软件或 CPU 兼容性,内核启动、校验失败的文件缺失错误附带具体路径
-- 放宽服务 IPC 调用超时,减少慢机器上误判服务不可用
-- 打开代理页搜索/筛选框时自动聚焦输入框,并更换筛选图标
-- 节点卡片不再显示 provider 名称
-- 订阅卡片切换中的遮罩覆盖整张卡片
-- 统一界面字体设置,编辑器统一使用等宽字体
-- 停止内核前先清理所有 WebSocket 连接,切换出站模式时批量关闭连接
-- 减少后台空闲开销(托盘速率、服务状态轮询)以及代理列表延迟排序、托盘菜单的重复计算
-- 页面切换不再显示加载状态,减少重复的订阅列表刷新
-- 日志系统重构:支持模块过滤与排除,以结构化 span 记录内核启动、代理应用、服务 IPC 等流程并去除噪音日志,修复切换日志配置时 Sidecar 日志写入器泄漏线程与文件句柄的问题
+- 优化更新与安装体验:发布说明支持 GFM 渲染、自动更新跳过语言选择提示、内核校验被终止时提示检查安全软件
+- 界面细节:搜索框自动聚焦、节点卡片不显示 provider 名称、统一字体与等宽编辑器、优化拖动排序动画
+- 停止内核前清理所有 WebSocket 连接、切换出站模式时批量关闭,修复初始化失败后留下无效连接的问题
+- 性能优化:降低托盘速率、服务状态检查等后台开销与重复计算,页面切换不再显示加载状态
+- 日志系统重构:支持模块过滤与排除、减少噪音日志,修复切换日志配置时的资源泄漏
+- 移除便携模式支持,不再识别 `.config/PORTABLE` 标记,数据目录统一使用系统应用数据目录
- 补全繁体中文后端字符串,改进俄语翻译,语言列表中的「中文」改为「简体中文」
+**🍎 macOS**
+
+- 避免 macOS 多用户环境下同时启动多个实例
+
+**🐧 Linux**
+
+- 改进 Linux 系统代理兼容性:缺失命令时给出明确信息,KDE 下不再强制 `gsettings`、`dconf`
+
diff --git a/Makefile.toml b/Makefile.toml
index 5aab6b7ad..44379dc91 100644
--- a/Makefile.toml
+++ b/Makefile.toml
@@ -118,6 +118,17 @@ end
# frontend checks
cm_run_task frontend-format
+
+# changelog platform grouping
+has_changelog = exec git diff --cached --quiet -- Changelog.md
+if eq ${has_changelog.code} 1
+ grouped = exec bash scripts-workflow/group_platforms.sh
+ if not eq ${grouped.code} 0
+ echo "Changelog platform grouping failed"
+ exit 1
+ end
+ exec git add Changelog.md
+end
'''
[tasks.pre-push]
diff --git a/scripts-workflow/bump_changelog.sh b/scripts-workflow/bump_changelog.sh
index 2fa96bc9f..d8ca606c8 100755
--- a/scripts-workflow/bump_changelog.sh
+++ b/scripts-workflow/bump_changelog.sh
@@ -32,6 +32,8 @@ bak_ts=$(timestamp)
cp "$CHANGELOG" "$BACKUP_DIR/Changelog.md.bak.$bak_ts"
echo "Backed up $CHANGELOG -> $BACKUP_DIR/Changelog.md.bak.$bak_ts"
+bash "$(dirname "$0")/group_platforms.sh"
+
if [ -f "$HISTORY" ]; then
cp "$HISTORY" "$BACKUP_DIR/Changelog.history.md.bak.$bak_ts"
echo "Backed up $HISTORY -> $BACKUP_DIR/Changelog.history.md.bak.$bak_ts"
diff --git a/scripts-workflow/group_platforms.sh b/scripts-workflow/group_platforms.sh
new file mode 100755
index 000000000..d85be9b7b
--- /dev/null
+++ b/scripts-workflow/group_platforms.sh
@@ -0,0 +1,110 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# group_platforms.sh — lock platform entries into platform subsections.
+#
+# Inside every section of Changelog.md, entries whose platform
+# mentions form a set of one or two platforms (Windows/macOS/Linux) are
+# grouped under a bold heading named by that set (e.g. **macOS/Linux**),
+# ordered Windows -> macOS -> Linux. Entries naming all three or none stay
+# in the common area above the headings. Idempotent.
+#
+# usage: group_platforms.sh [--check]
+# (default) rewrite Changelog.md in place
+# --check report misplaced entries without writing; exit 1 if any
+
+ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
+CHANGELOG="$ROOT_DIR/Changelog.md"
+
+if [ ! -f "$CHANGELOG" ]; then
+ echo "Error: $CHANGELOG not found" >&2
+ exit 2
+fi
+
+regrouped=$(awk '
+ { lines[NR] = $0 }
+ END {
+ n = NR; i = 1
+ while (i <= n) {
+ if (lines[i] ~ /^$/) {
+ j = i
+ while (j < n && lines[j] !~ /^<\/details>$/) j++
+ emit_block(i, j)
+ i = j + 1
+ } else {
+ print lines[i]
+ i++
+ }
+ }
+ }
+
+ function platform_of(l, c, key) {
+ c = 0; key = ""
+ if (l ~ /Windows/) { c++; key = key "Windows/" }
+ if (l ~ /macOS/) { c++; key = key "macOS/" }
+ if (l ~ /Linux/) { c++; key = key "Linux/" }
+ if (c == 0 || c == 3) return ""
+ sub(/\/$/, "", key)
+ return key
+ }
+
+ function heading(kk, t) {
+ t = kk
+ gsub(/Windows/, "🖥️", t)
+ gsub(/macOS/, "🍎", t)
+ gsub(/Linux/, "🐧", t)
+ return "**" t " " kk "**"
+ }
+
+ function emit_block(a, b, k, m, n, x, oi, kk, nkeys, order, count, entries) {
+ split("", count); split("", entries)
+
+ print lines[a]
+ k = a + 1
+ if (lines[k] ~ /^/) { print lines[k]; k++ }
+ print ""
+
+ for (m = k; m < b; m++) {
+ l = lines[m]
+ if (l !~ /^- /) continue
+ p = platform_of(l)
+ # increment must not live inside the subscript expression:
+ # BSD awk parses `++count[p]` there as two unary pluses
+ n = ++count[p]
+ entries[p SUBSEP n] = l
+ }
+
+ for (x = 1; x <= count[""]; x++) print entries["" SUBSEP x]
+ nkeys = split("Windows macOS Linux Windows/macOS Windows/Linux macOS/Linux", order, " ")
+ for (oi = 1; oi <= nkeys; oi++) {
+ kk = order[oi]
+ if (!count[kk]) continue
+ print ""
+ print heading(kk)
+ print ""
+ for (x = 1; x <= count[kk]; x++) print entries[kk SUBSEP x]
+ }
+ print ""
+ print lines[b]
+ }
+' "$CHANGELOG")
+
+if [ "${1:-}" = "--check" ]; then
+ if [ "$regrouped" = "$(cat "$CHANGELOG")" ]; then
+ echo "OK: platform grouping is up to date"
+ exit 0
+ fi
+ echo "Misplaced platform entries detected. Diff (current -> regrouped):"
+ diff "$CHANGELOG" <(printf '%s\n' "$regrouped") || true
+ exit 1
+fi
+
+before=$(grep -c '^- ' "$CHANGELOG" || true)
+after=$(printf '%s\n' "$regrouped" | grep -c '^- ' || true)
+if [ "$before" != "$after" ]; then
+ echo "Error: regrouping would drop entries ($before -> $after); refusing to write" >&2
+ exit 4
+fi
+
+printf '%s\n' "$regrouped" > "$CHANGELOG"
+echo "Regrouped platform entries in $CHANGELOG"
diff --git a/scripts/extract_update_logs.sh b/scripts/extract_update_logs.sh
index 1283cf3b0..6ff66ca07 100755
--- a/scripts/extract_update_logs.sh
+++ b/scripts/extract_update_logs.sh
@@ -13,12 +13,17 @@ if [[ ! -f "$CHANGELOG_FILE" ]]; then
exit 1
fi
-# 提取从第一个 '## v' 开始到下一个 '## v' 前的内容
+# 提取从第一个 '## v' 开始到 '---' 或下一个 '## v' 前的内容
+# '---' 与 scripts/updatelog.mjs 的解析一致:分隔线之后的内容
+# 只属于仓库文件,不进入任何 release body
UPDATE_LOGS=$(awk '
/^## v/ {
if (found) exit;
found=1
}
+ /^---/ && found {
+ exit
+ }
found
' "$CHANGELOG_FILE")
diff --git a/scripts/updater.mjs b/scripts/updater.mjs
index 70c05d0a2..06b93ae5d 100644
--- a/scripts/updater.mjs
+++ b/scripts/updater.mjs
@@ -72,11 +72,14 @@ async function processRelease(github, options, tag, isAlpha) {
tag: tag.name,
})
+ const notes = await resolveUpdateLog(tag.name).catch(() =>
+ resolveUpdateLogDefault().catch(() => 'No changelog available'),
+ )
+ const releaseUrl = `https://github.com/${options.owner}/${options.repo}/releases/tag/${tag.name}`
+
const updateData = {
name: tag.name,
- notes: await resolveUpdateLog(tag.name).catch(() =>
- resolveUpdateLogDefault().catch(() => 'No changelog available'),
- ),
+ notes: `${notes}\n\n**[See More](${releaseUrl})**`,
pub_date: new Date().toISOString(),
platforms: {
// platform format:
diff --git a/template/Changelog.md b/template/Changelog.md
index cd2f6daec..78356a393 100644
--- a/template/Changelog.md
+++ b/template/Changelog.md
@@ -1,6 +1,30 @@
+
## v(Version Goes Here)
-### 🐞 修复问题
+
+ 🐞 修复问题
+
+
✨ 新增功能