From bd277b6e55fc7c51c2c4999394eedeeabb2214e7 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 31 Aug 2026 11:05:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(tools):=20=E6=96=B0=E5=A2=9E=20commit=20?= =?UTF-8?q?=E5=9E=8B=E5=88=A5=E5=84=AA=E5=85=88=E5=BA=8F=E8=85=B3=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 型別優先序原本抄在技能內文裡。改一次要跟著改好幾份,很容易對不起來。 現在把順序收進腳本,讓它成為唯一真實來源。 - 參數與標準輸入都收,commit 標題整行餵進來也認得出型別。 - 沒收到輸入回傳 2,輸入裡沒有階梯表型別回傳 3,呼叫端據此分流。 - 錯誤訊息一律印繁體中文到 stderr。 --- tools/pick-type.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 tools/pick-type.sh diff --git a/tools/pick-type.sh b/tools/pick-type.sh new file mode 100755 index 0000000..d45cd65 --- /dev/null +++ b/tools/pick-type.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env sh +# pick-type.sh — 從一組 commit 型別中選出優先度最高的一個。 +# 用法: pick-type.sh {型別或 commit 標題}... +# git log --format=%s {範圍} | pick-type.sh +# +# 說明: 優先序固定為 revert > fix > feat > perf > refactor > test > docs > style > chore。 +# 這支腳本是該優先序的唯一真實來源,SKILL.md 不再抄一份。 +# 帶參數就讀參數,一個參數算一項;沒帶參數就讀標準輸入,一行算一項。 +# 每一項只取冒號、左括號、驚嘆號之前的字,所以 commit 標題整行餵進來也認得出型別。 +# 認不得的項目直接略過,不影響其他項目。 +# +# 輸出: 勝出的型別(一行,例如: feat)。 +# 結束碼: 0 選出型別;2 沒有收到任何輸入;3 輸入裡沒有階梯表內的型別。 +# 錯誤訊息一律印繁中到 stderr。 +set -u + +if [ "$#" -gt 0 ]; then + RAW=$(printf '%s\n' "$@") +else + RAW=$(cat) +fi + +if [ -z "$(printf '%s' "$RAW" | tr -d '[:space:]')" ]; then + echo "錯誤: 沒有收到任何型別。請把 git log 取出的型別集合當參數傳入,或從標準輸入餵進來。" >&2 + exit 2 +fi + +NORM=$(printf '%s\n' "$RAW" \ + | sed -e 's/[(:!].*$//' -e 's/[[:space:]]//g' \ + | tr '[:upper:]' '[:lower:]') + +for candidate in revert fix feat perf refactor test docs style chore; do + if printf '%s\n' "$NORM" | grep -qx "$candidate"; then + printf '%s\n' "$candidate" + exit 0 + fi +done + +echo "錯誤: 輸入裡沒有階梯表內的型別。請確認 commit 訊息符合 {類型}({範圍}): {訊息} 格式,型別限 revert、fix、feat、perf、refactor、test、docs、style、chore。" >&2 +exit 3