#!/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 <