Files
arcrun-collector/cmd/arcrun-app/changelog-section.sh
T
Leo bd25efaae5 refactor(collector): 剪掉臍帶——collector/ 自己就算得出自己的版本號(D95 第一輪②)
leo 2026-08-17:「身為管理者,你要從頭到尾**不要有很多扭曲**,因為你根本不記得
你做的這些扭曲,**每次都要查**,很直接,源碼、產出物,從 stage 到 prod。」

`collector/` 原本要伸手到 repo 根才算得出自己的版本,共四條:

  ① `daemon-version.py` 讀 `docs-site/src/content/docs/help/changelog.md`
  ② `daemon-version.py` 讀 `ROOT/DAEMON_LINE`
  ③ `daemon-version.py` 的原始碼指紋從 repo 根 `git ls-files collector`
  ④ `changelog-section.sh` 讀 `$REPO_ROOT/docs-site/...` 並 exec
     `$REPO_ROOT/installer/scripts/daemon-notes.mjs`
  ⑤(複驗才發現的第五條)`build-msix.sh` 用 `git rev-parse --show-toplevel`/../../.env
     推 InkStoneCo 頂層拿 MS Store Identity

現在全部落在 `collector/` 內部:

  · `collector/CHANGELOG.md`  ← 新家。**原檔同時裝著兩條版本線**
    (桌面版 `v0.18.x` + 雲端引擎 `1.4.x`),已按版號格式拆開;
    雲端那 17 段原地不動留在 docs-site,桌面版這 30 段搬過來。
  · `collector/DAEMON_LINE`   ← 從 repo 根搬進來
  · 指紋改以 `collector/` 為根算(`cwd=COLLECTOR`、pathspec `.`)
    ⇒ 相對路徑前綴變了、而路徑有進雜湊 ⇒ `FINGERPRINT_ALGO` 3→4,
      照既有設計讓帳本自動整本作廢重記(不要手改 JSON)
  · `daemon-notes.mjs` 實作搬進 `collector/cmd/arcrun-app/`,
    `installer/scripts/daemon-notes.mjs` 變薄殼轉呼叫
    ⇒ **根可以往內伸手,collector 不可以往外伸手**,方向單向
  · `build-msix.sh` 改成往上找「帶著那把鍵的 .env」,
    leo 08-06「腳本自己去讀不要再問人」原樣保留,但不再綁目錄結構

驗收閘:`collector/check-standalone.sh`——不是 grep,是**行為證明**:
把 collector/ 的檔案單獨複製到 repo 之外的臨時目錄、在那裡 git init,
再跑版本計算與打包前置閘。跑得起來=真的自足。

自己發現並修掉的三件:
  · `arcrun-tray/assets/store/` 與 `--setup` 其實還活著(見上一顆 commit)
  · 兩支同名的 `daemon-notes.mjs` CLI 守衛比的是**檔名尾綴**
    ⇒ 兩支一起開火,問雲端版號時 collector 那支先 exit(1),
      薄殼根本沒機會查 docs-site。改成比絕對路徑。
  · `collector/CHANGELOG.md` 的「怎麼出新版」說明若照抄那行標題,
    會被 `daemon-version.py` 的純字串比對當成「有待發佈內容」而誤升版
    ⇒ 說明裡刻意不寫成真的標題,並把這個邊角寫在檔案裡

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 13:05:33 +08:00

82 lines
4.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# changelog-section.sh — 抽出某一版的「更新內容」,並在缺漏時擋下打包(2026-08-06)
#
# 🔴 leo 08-06:「更新內容還要寫在 docs 裡,機械化要怎麼做」
#
# 答:改的是「**寫在哪**」,不是「誰來寫」。
# 文字一定得人寫(機器編不出「語意搜尋什麼都搜不到」這種人話),
# 但**只准寫一個地方** collector/CHANGELOG.md(用戶語言那份)。
# 🔴 2026-08-18(D95 第一輪):這份檔案原本住在 repo 根的
# `docs-site/src/content/docs/help/changelog.md`,而且**同時裝著兩條版本線**
# (桌面版 v0.18.x + 雲端引擎 1.4.x)。已拆開:桌面版的搬進 `collector/`
# 雲端那條原地不動。理由:daemon 得往上伸手才拿得到自己的版本號=搬不成獨立 repo。
# 其餘全是投影、不准手改(=頂層 principles「投影不可手改,要改去改源頭」):
# · manifest.daemon.notes ← 打包時由本腳本抽出
# · docs-site 的「版本說明」頁 ← 本來就是它自己
# · portalrag.arcrun.devApp 的「版本與更新」 ← 讀同一份 manifest
#
# **關鍵是這道閘**:打包時若 changelog 找不到這一版的段落 ⇒ 直接中止、不准打包。
# ⇒ 「忘了寫更新內容」變成**不可能**,而不是靠誰記得。
# (病根:manifest.daemon.notes 過去是手寫的,於是可以跟產物完全脫節。)
#
# 用法:
# ./changelog-section.sh v0.18.7 # 印出該版段落(純文字,供 manifest.notes 用)
# ./changelog-section.sh v0.18.7 --check # 只檢查存不存在
set -euo pipefail
cd "$(dirname "$0")"
# 🔴 一律以**自己的位置**定位(往上兩層=collector/),不問 git、不問 repo 根——
# `git rev-parse --show-toplevel` 就是往上伸手的入口,剪掉它才搬得成獨立 repo。
COLLECTOR="$(cd ../.. && pwd)"
FILE="$COLLECTOR/CHANGELOG.md"
VERSION="${1:?用法:changelog-section.sh <版本,例 v0.18.7> [--check]}"
CHECK_ONLY="${2:-}"
[ -f "$FILE" ] || { echo "❌ 找不到 changelog$FILE" >&2; exit 1; }
# 段落格式:「## v0.18.72026-08-06)」——標題行以 `## <版本>` 開頭。
SECTION="$(awk -v ver="## ${VERSION}" '
index($0, ver) == 1 { inside = 1; next }
inside && /^## / { exit }
inside { print }
' "$FILE")"
if [ -z "$(printf '%s' "$SECTION" | tr -d '[:space:]')" ]; then
cat >&2 <<MSG
❌ changelog 裡沒有 ${VERSION} 的段落,不准打包。
請在 collector/CHANGELOG.md 最上面加一段:
## ${VERSION}$(date '+%Y-%m-%d')
**建議更新**——(一句話說明「這版對你意味什麼」)
- 🔴 **(用戶看得懂的白話標題)**:(發生什麼、現在怎樣)
⚠️ 寫給用戶看,不是寫給工程師看:說「以前會怎樣、現在會怎樣」,
不要寫函式名或 commit 編號。
MSG
exit 1
fi
[ "$CHECK_ONLY" = "--check" ] && { echo " ✅ changelog 有 ${VERSION} 的段落"; exit 0; }
# 給 manifest.daemon.notes 用的投影——**只有一個投影器**:同目錄的 daemon-notes.mjs
# 2026-08-18 從 installer/scripts/ 搬來;那邊只剩一層薄殼轉呼叫本目錄這支。)
#
# 🔴 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 ./daemon-notes.mjs "$VERSION"