From 2bbfa453d3da0c550f01b1122f848b140c287cea Mon Sep 17 00:00:00 2001 From: richblack Date: Sat, 8 Aug 2026 21:47:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=95=AB=E9=9D=A2=E9=82=A3?= =?UTF-8?q?=E4=B8=80=E8=A1=8C=E7=94=B1=20changelog=20=E6=A9=9F=E6=A2=B0?= =?UTF-8?q?=E5=B0=8E=E5=87=BA=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=87=BA=E8=B2=A8?= =?UTF-8?q?=E7=95=B6=E4=B8=8B=E6=89=8B=E5=B7=A5=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit leo 2026-08-08 真機看到 v0.18.24 的更新畫面: 「不要這麼長的散文,簡短講改了什麼,細節去 docs 讀。」 畫面是一整面文字牆,`**粗體**` 還原樣露出來。 真兇不是文案,是**最後一哩沒有機制**: - 單一真相源(changelog.md)08-06 就立好了(30f726b), changelog-section.sh 也有 --check 閘擋「忘了寫更新內容」。 - 但它的**投影**那一段是 `tr '\n' ' '`——把整段散文壓成一坨, 而且 grep 全 repo **沒有任何東西呼叫它**(build-*.sh 只用 --check)。 - ⇒ 每次出貨都是有人臨時寫一段 python 折行塞進 manifest, 每次重寫一次、沒人檢查結果長什麼樣。 為什麼只能是一行短句(不是排版沒做好): main.js:215 是 `
${esc(u.notes)}
` ① esc() ⇒ 任何 markdown 符號都會原樣露出 ② .d 沒有 white-space:pre ⇒ 塞 \n 也不會分行 改法: - 新增 installer/scripts/daemon-notes.mjs =**唯一的投影器**: 只取 changelog 每條的粗體標題、串成一行、超長截斷並導去說明文件。 - changelog-section.sh 的投影段改成委派給它(--check 閘原樣保留), 兩邊同一份規則不會漂移。 - ship.mjs 新增 notes 步驟:每次出貨自動套用,手改過的會被改回來。 - release.mjs 的 verifyManifest 加第四條規則:notes 必須存在、無 markdown、 單行、不超長,且**等於 changelog 的機械投影**——手改一律擋下。 實測: · v0.18.24/23/22 三版各自產出 62/51/80 字,零手工調整 · 手改成一段散文 → verify-manifest exit 1,兩條規則都抓到 · 再跑一次管線 → 自己改回正確那一行 · 用 daemon 真實 style.css + main.js 的真實 markup 渲染兩版對照並截圖: 舊 576 字(含 8 個原樣露出的 **)vs 新 62 字三行讀完 Co-Authored-By: Claude Opus 5 --- cmd/arcrun-app/changelog-section.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/arcrun-app/changelog-section.sh b/cmd/arcrun-app/changelog-section.sh index 89f82d6..da75bd4 100755 --- a/cmd/arcrun-app/changelog-section.sh +++ b/cmd/arcrun-app/changelog-section.sh @@ -55,8 +55,20 @@ fi [ "$CHECK_ONLY" = "--check" ] && { echo " ✅ changelog 有 ${VERSION} 的段落"; exit 0; } -# 給 manifest.notes 用:去掉 markdown 記號、壓成單段純文字。 -printf '%s' "$SECTION" \ - | sed -e 's/\*\*//g' -e 's/^[[:space:]]*[-*][[:space:]]*//' -e 's/`//g' \ - | tr '\n' ' ' \ - | sed -e 's/ */ /g' -e 's/^ //' -e 's/ $//' +# 給 manifest.daemon.notes 用的投影——**只有一個投影器**:installer/scripts/daemon-notes.mjs +# +# 🔴 2026-08-08 修(leo 真機看到 v0.18.24 的更新畫面): +# leo 原話「**不要這麼長的散文,簡短講改了什麼,細節去 docs 讀。**」 +# +# 本檔原本這一段是 `tr '\n' ' '`——**把整段散文壓成一大坨**。而畫面那個欄位是純文字 +# (`main.js:215` 是 `esc(u.notes)`,且 `.d` 沒有 white-space:pre) +# ⇒ 既不分行、markdown 符號還會原樣露出來 ⇒ 使用者看到一整面文字牆。 +# +# 更根本的問題:**grep 全 repo,沒有任何東西呼叫這段投影**(build-*.sh 只用 --check)。 +# ⇒ 出貨當下都是有人臨時寫一段 python 折行塞進 manifest,每次重寫一次、沒人檢查結果。 +# ⇒ 這正是「機制存在但沒被接上=等於不存在」的又一例。 +# +# 現在改成委派給那唯一的投影器(只取每條的粗體標題、串成一行、超長就截並導去 docs), +# 而 `installer/scripts/ship.mjs` 的 notes 步驟會在每次出貨時自動套用它。 +# ⇒ 兩邊同一份規則,不會漂移。上面的 --check 閘原樣保留(build-*.sh 仍靠它)。 +exec node "$REPO_ROOT/installer/scripts/daemon-notes.mjs" "$VERSION"