feat(gitea): 新增種類推導指令與技能盤點頁型

範本種類以前由模型每次重推。底線怎麼切、標籤照什麼順序試,都是固定的
輸入輸出,卻放在技能內文裡由模型自己來,有人切錯底線,也有人跳過標籤
順序。現在把規則寫進腳本,輸出固定一行,還附上是哪個字首或哪個標籤產生
的依據。已經有標籤名單時可以直接帶進來,省掉一次 API 呼叫。

技能盤點頁是新的頁面類型。加進 wiki 存取庫的允許清單與規則驗證腳本,
這種頁才有地方可放,解析規則也才有人驗。
This commit is contained in:
2026-08-31 11:11:55 +08:00
parent 28a52c9f0c
commit 2b759542a8
2 changed files with 64 additions and 3 deletions
+4 -1
View File
@@ -2,13 +2,16 @@
# check-wiki-rules — 驗證 wiki repo 解析與 hash-id 規則。 # check-wiki-rules — 驗證 wiki repo 解析與 hash-id 規則。
# 涵蓋 TYPES 列的每一種頁面類型,每種三項:專用變數優先、退回共用變數、不得跨類型代用。 # 涵蓋 TYPES 列的每一種頁面類型,每種三項:專用變數優先、退回共用變數、不得跨類型代用。
# 全部通過印 OK 並 exit 0;任一項不符印出差異並 exit 1。 # 全部通過印 OK 並 exit 0;任一項不符印出差異並 exit 1。
# 結束碼: 0=全部通過,stdout 印 OK
# 1=有一項不符,stderr 印出 {項目}: want=… got=… 之後立刻停住,不續跑其餘項目。
# 只有 0 與 1 兩種;這支不吃參數,也沒有用法錯誤那條路。
set -eu set -eu
dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
gitea="$dir/gitea.sh" gitea="$dir/gitea.sh"
hash_id="$dir/hash-id" hash_id="$dir/hash-id"
TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET' TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET TOOLING'
fail() { fail() {
printf '%s\n' "$1" >&2 printf '%s\n' "$1" >&2
+60 -2
View File
@@ -16,12 +16,20 @@
# html-style.sh list 印出合併後的所有設定:種類<TAB>版型<TAB>風格<TAB>來源 # html-style.sh list 印出合併後的所有設定:種類<TAB>版型<TAB>風格<TAB>來源
# html-style.sh layouts 列出可用版型:名稱<TAB>繁中說明 # html-style.sh layouts 列出可用版型:名稱<TAB>繁中說明
# html-style.sh styles 列出可用風格:名稱<TAB>繁中說明 # html-style.sh styles 列出可用風格:名稱<TAB>繁中說明
# html-style.sh key wiki <頁名> 推導 wiki 頁的種類:取第一個底線前的字首
# html-style.sh key issue <owner>/<repo> <編號> [--labels <名稱>[,<名稱>]]
# 推導議題的種類:依序試每個標籤,第一個讓 get 回 project 或 global 的標籤勝出;
# 都對不到就回 ISSUE:DEFAULT。已經有標籤名單時用 --labels 帶進來,省掉一次 API 呼叫。
# key 的輸出固定一行:{種類}<TAB>{依據}
# 依據 = prefix:{字首}、label:{標籤名}、fallback:no-labels、fallback:no-configured-label
# #
# 結束碼: 0=成功 2=用法錯誤 4=版型或風格沒有對應範本檔 # 結束碼: 0=成功 1=取不到議題標籤,或設定檔的目錄建不出來 2=用法錯誤 4=版型或風格沒有對應範本檔
# #
# 陷阱: # 陷阱:
# - get 永遠印得出一組值:對不到就退 DEFAULT,再對不到就退內建預設。呼叫端不必自己準備退路, # - get 永遠印得出一組值:對不到就退 DEFAULT,再對不到就退內建預設。呼叫端不必自己準備退路,
# 但要看第三欄,才知道這組值是使用者設的還是撿來的。 # 但要看第三欄,才知道這組值是使用者設的還是撿來的。
# - key 的推導規則放在腳本裡,不放技能內文:字首怎麼切、標籤怎麼試,是固定的輸入輸出,
# 每次由模型重推就會有人切錯底線或跳過標籤順序。
# - set 會先確認範本檔真的存在,擋掉打錯字的版型或風格;設定寫得進去、出圖卻失敗最難查。 # - set 會先確認範本檔真的存在,擋掉打錯字的版型或風格;設定寫得進去、出圖卻失敗最難查。
set -u set -u
@@ -41,8 +49,10 @@ usage() {
html-style.sh set <種類> <版型> <風格> [--project|--global] html-style.sh set <種類> <版型> <風格> [--project|--global]
html-style.sh unset <種類> [--project|--global] html-style.sh unset <種類> [--project|--global]
html-style.sh list | layouts | styles html-style.sh list | layouts | styles
html-style.sh key wiki <頁名>
html-style.sh key issue <owner>/<repo> <編號> [--labels <名稱>[,<名稱>]]
種類: WIKI:{頁名前綴}、ISSUE:{標籤名}、DEFAULT 種類: WIKI:{頁名前綴}、ISSUE:{標籤名}、DEFAULT
結束碼: 0=成功 2=用法錯誤 4=版型或風格沒有對應範本檔 結束碼: 0=成功 1=取不到議題標籤或建不出目錄 2=用法錯誤 4=版型或風格沒有對應範本檔
EOF EOF
exit 2 exit 2
} }
@@ -135,6 +145,54 @@ case "$cmd" in
key="${1:-}"; [ -n "$key" ] || usage key="${1:-}"; [ -n "$key" ] || usage
resolve "$key" resolve "$key"
exit 0 ;; exit 0 ;;
key)
kind="${1:-}"; [ -n "$kind" ] || usage
shift
case "$kind" in
wiki)
page="${1:-}"; [ -n "$page" ] || usage
# 頁名前綴 = 第一個底線之前那一段;沒有底線就是整個頁名。
prefix=${page%%_*}
printf 'WIKI:%s\tprefix:%s\n' "$prefix" "$prefix"
exit 0 ;;
issue)
repo="${1:-}"; idx="${2:-}"
[ -n "$repo" ] && [ -n "$idx" ] || usage
shift 2
labels=''
have_labels=0
case "${1:-}" in
--labels) [ "$#" -ge 2 ] || usage; labels="$2"; have_labels=1 ;;
'') ;;
*) usage ;;
esac
if [ "$have_labels" = 0 ]; then
raw=$("$script_dir/issue.sh" labels-of "$repo" "$idx") || {
echo "[jsc][HTML 設定][ERR]:取不到議題 $repo#$idx 的標籤。" >&2; exit 1; }
labels=$(printf '%s' "$raw" | tr '\n' ',')
fi
matched=''
old_ifs=$IFS
IFS=','
for l in $labels; do
[ -n "$l" ] || continue
# 標籤順序就是優先序:第一個使用者真的設過的標籤勝出,
# 撿來的 DEFAULT 不算數,否則第一個標籤永遠贏,後面的設定形同虛設。
case "$(resolve "ISSUE:$l" | cut -f3)" in
project|global) matched="$l"; break ;;
esac
done
IFS=$old_ifs
if [ -n "$matched" ]; then
printf 'ISSUE:%s\tlabel:%s\n' "$matched" "$matched"
elif [ -z "$(printf '%s' "$labels" | tr -d ',')" ]; then
printf 'ISSUE:DEFAULT\tfallback:no-labels\n'
else
printf 'ISSUE:DEFAULT\tfallback:no-configured-label\n'
fi
exit 0 ;;
*) usage ;;
esac ;;
set) set)
key="${1:-}"; layout="${2:-}"; style="${3:-}" key="${1:-}"; layout="${2:-}"; style="${3:-}"
[ -n "$key" ] && [ -n "$layout" ] && [ -n "$style" ] || usage [ -n "$key" ] && [ -n "$layout" ] && [ -n "$style" ] || usage