fix(git): 補齊稽核缺失並修掉護欄失效

What:依 jsc-meta:skill-check 的稽核結果修正技能與工具——補上每個步驟的可檢核完成條件、
把留在內文的標準輸入輸出流程下放 tools/、修正查表與退碼路由造成的誤判。

Why:稽核發現這些缺失會讓技能在實際執行時走錯分支或靜默通過。
完成條件缺漏是最常被違反的一項;退碼誤判與查表錯誤則會讓良性狀況被當成失敗。

How:逐項對照 references/guidelines.md 的審核檢查清單修正,新增的工具都有
documented exit codes,並以真實執行驗證每條路徑。

Who:jsc-meta:skill-check 例行稽核(2026-08-25)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 14:58:54 +08:00
co-authored by Claude Opus 5
parent b94fae5c36
commit 4c9c9421c6
4 changed files with 79 additions and 12 deletions
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env sh
# base-branch.sh — 決定 PR 的基底分支。
# 用法: base-branch.sh [caller-base]
# 規則: 呼叫方傳入的分支最優先;呼叫方沒傳,才依序試 develop、main、master。
# 先 git fetch --prune origin,再確認選中的分支存在於遠端。
# 「有沒有傳」看參數個數,不看參數內容:呼叫方寫 base-branch.sh "$SOURCE_BRANCH"
# 而變數沒設定時,那是空字串,不是沒傳。若當成沒傳就會悄悄退回 develop,
# 把單一工作包直接合進 develop——這支腳本存在的目的就是擋這件事。
# 輸出: 選中的分支名(一行)。
# 護欄: 參數過多回傳 2;抓不到遠端回傳 3;呼叫方指定的分支不在遠端回傳 4;
# develop、main、master 都不在遠端回傳 5;呼叫方傳入空字串回傳 6。
# 錯誤訊息一律印繁中到 stderr。
set -u
if [ "$#" -gt 1 ]; then
echo "用法: base-branch.sh [caller-base]" >&2
exit 2
fi
ARGC=$#
CALLER=${1:-}
if [ "$ARGC" -eq 1 ] && [ -z "$CALLER" ]; then
echo "錯誤: 呼叫方傳入空字串當基底分支。請確認來源分支變數有值,或整個參數不要傳。" >&2
exit 6
fi
if ! git fetch --prune origin >/dev/null 2>&1; then
echo "錯誤: 無法向 origin 取得遠端分支。請確認遠端可以連線,再重試。" >&2
exit 3
fi
remote_has() {
[ -n "$(git ls-remote --heads origin "refs/heads/$1" 2>/dev/null)" ]
}
if [ "$ARGC" -eq 1 ]; then
if remote_has "$CALLER"; then
printf '%s\n' "$CALLER"
exit 0
fi
echo "錯誤: 呼叫方指定的基底分支 $CALLER 不在 origin 上。請確認分支名,不要自行改用其他分支。" >&2
exit 4
fi
for candidate in develop main master; do
if remote_has "$candidate"; then
printf '%s\n' "$candidate"
exit 0
fi
done
echo "錯誤: origin 上找不到 develop、main、master。請由呼叫方指定基底分支。" >&2
exit 5
+11
View File
@@ -4,6 +4,7 @@
# 規則: 全部轉小寫,非 a-z0-9 的字元換成連字號,
# 連續連字號合併成一個,並去除開頭與結尾的連字號。
# 輸出: {type}/{slug}(例如: slugify.sh feat "export report" → feat/export-report)
# 護欄: 輸入含非 ASCII 字元回傳 2;slug 化後為空回傳 3。兩者都印繁中錯誤到 stderr。
set -u
if [ "$#" -lt 2 ]; then
@@ -17,4 +18,14 @@ PHRASE="$*"
slug=$(printf '%s' "$PHRASE" | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-z0-9]/-/g' -e 's/-\{2,\}/-/g' -e 's/^-//' -e 's/-$//')
if printf '%s%s' "$TYPE" "$PHRASE" | LC_ALL=C grep -q '[^ -~]'; then
echo "錯誤: 分支名只允許 ASCII。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2
exit 2
fi
if [ -z "$slug" ]; then
echo "錯誤: 標題 slug 化後是空字串,組不出分支名。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2
exit 3
fi
printf '%s/%s\n' "$TYPE" "$slug"