1dfc4e373a
leo 2026-08-20 問「InkStoneCo#40 加入了嗎?如果是這樣我應該可以白話文看到 hooks 的內容?」
答案是不行——43 支閘沒有任何白話清單。這一版補上。
docs/hooks-inventory.md 43 支逐支一行,按「你會在什麼時候撞到它」分 9 組
抽驗 5 支逐行核對源碼;順帶抓到 3 支有檔案沒註冊
docs/TESTING.md A1-A8 + B1-B5,每格都有「怎麼跑/該看到什麼/什麼算失敗」
scripts/test-*.sh 兩支閘的測試,共 21 條,全過
兩個實撞的洞:
- release-tag-guard 的排除清單是前綴比對,x 整條放行
(A8 那個新 session 抓到的,總管複驗屬實)。改用 #23 驗證過的判準:
關鍵字要在指令位置才算執行。補 3 條複合指令測試,8/8。
⇒ 這是 InkStoneCo#36「包一層就繞過去」的同一個病,發生在同一天新寫的閘上。
- scripts/ticket 寫死只認名叫 gitea 的 remote,在 ISEP(remote 叫 origin)整個跑不起來
⇒「開票前先搜」那道閘在新 repo 等於不存在。改成掃所有指向本站的 remote + 環境變數 fallback。
A8 已通過:新 session 裡 plugin 的閘真的觸發(exit 2、tag 未建立、訊息來自 plugin 路徑)。
文件漂移訂正:plugin.json 與 README 寫 42 支/52 條,實際 43 支/53 條。
兩支新閘補上 #40 §1 要求的三行中文檔頭。
🔴 但仍違反 #40 §3「新規則一律先 warn」——兩支都是 block。理由記在 #40 留言,等 leo 裁。
28 lines
1.1 KiB
Bash
Executable File
28 lines
1.1 KiB
Bash
Executable File
#!/bin/bash
|
||
# 打 tag 閘的測試(docs/TESTING.md A3)
|
||
# 判準:版本對不上的 tag 要擋;只是讀 tag、或文字裡提到,都不准擋
|
||
cd "$(dirname "$0")/.." || exit 1
|
||
H=hooks/release-tag-guard.sh
|
||
PASS=0; FAIL=0
|
||
run(){
|
||
printf '%s' "{\"tool_name\":\"Bash\",\"tool_input\":{\"command\":$(python3 -c 'import json,sys;print(json.dumps(sys.argv[1]))' "$2")}}" \
|
||
| bash "$H" >/dev/null 2>&1
|
||
got=$?
|
||
if [ "$got" = "$1" ]; then PASS=$((PASS+1)); printf ' ✅ '; else FAIL=$((FAIL+1)); printf ' ❌ '; fi
|
||
printf 'want=%s got=%s %.56s\n' "$1" "$got" "$2"
|
||
}
|
||
echo "── 該擋:版本號與 plugin.json 對不上 ──"
|
||
run 2 'git tag -a v9.9.9 -m test'
|
||
run 2 'echo 開始 && git tag -a v9.9.9 -m test'
|
||
run 2 'ls && git tag -a v9.9.9 -m x'
|
||
run 2 'cd /tmp; git tag -a v9.9.9 -m x'
|
||
echo "── 不該擋:只是讀、只是提到 ──"
|
||
|
||
run 0 'git tag -l'
|
||
run 0 'echo 等一下要 git tag -a v9.9.9'
|
||
run 0 'git tag -a v9.9.9 -m x --dry-run'
|
||
run 0 'grep -n "git tag" hooks/release-tag-guard.sh'
|
||
echo
|
||
echo "$PASS/$((PASS+FAIL)) 通過"
|
||
[ "$FAIL" -eq 0 ]
|