bd25efaae5
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>
82 lines
4.4 KiB
Bash
Executable File
82 lines
4.4 KiB
Bash
Executable File
#!/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 的「版本說明」頁 ← 本來就是它自己
|
||
# · portal/rag.arcrun.dev/App 的「版本與更新」 ← 讀同一份 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.7(2026-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"
|