以 plugin 形式安裝時,腳本會落在 CLI 的 plugin 快取目錄。 六支腳本原本一律取「腳本位置的上兩層」當技能組根目錄,這時一定推錯。 這一輪例行稽核的第一步就實際踩到:不先手動設環境變數,腳本根本跑不動, 而叫用它們的技能說明也沒提要設,等於留了一個必炸的預設值。 把推導規則抽成共用腳本,依序試環境變數、從目前目錄往上找、 腳本位置的上兩層、家目錄底下的 plugins,並以 gitea.sh 在不在當判準。 marketplace 每個 domain 存取庫都帶一份,單看它會把 domain 誤判成根。 推不出來就結束並指名要設環境變數,同時列出試過的每一個候選, 呼叫端一眼看得出要設什麼。只 clone 單一存取庫的環境留了逃生門: 環境變數有設且是目錄就照用,並在錯誤輸出提醒。 順手補上語言檢查與 manifest 同步兩支腳本的結束碼宣告與環境變數說明。 沒有宣告,呼叫端只能猜;猜錯就把失敗當成功。
57 lines
2.7 KiB
Bash
Executable File
57 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env sh
|
||
# list-skills.sh — 列出本機所有 domain 存取庫的技能,供選技能與稽核用。
|
||
#
|
||
# 用法: list-skills.sh(不吃參數)
|
||
#
|
||
# 掃描: {root}/*/skills/*/SKILL.md,讀 frontmatter 的 name 與 description。
|
||
# domain 取存取庫目錄名,開頭的 jsc- 會去掉。
|
||
# **只列正本 marketplace 上的 domain**:工作區可能還放著不屬於技能組的
|
||
# 存取庫(例 shared、persona、code、doc),列出來會讓選技能的流程
|
||
# 誤把它們當成技能組的一部分。domain 清單取自 marketplace.json,不寫死。
|
||
# 清單只反映本機檔案;要確保檔案齊全請先跑 sync-domains.sh。
|
||
#
|
||
# 根目錄: 交給 tools/plugins-root.sh 推導(JSC_PLUGINS_ROOT -> 從 $PWD 往上找 ->
|
||
# 腳本位置上兩層 -> $HOME/plugins)。以 plugin 形式安裝時,「腳本位置上兩層」會落在
|
||
# plugin 快取目錄,單靠它一定推錯,所以推導規則抽成共用腳本。
|
||
#
|
||
# 輸出: 一行一個技能,格式 {domain}<TAB>{name}<TAB>{description},依 domain、name 排序。
|
||
# 結束碼: 0=至少列出一個技能
|
||
# 1=推導不出根目錄、讀不到 domain 清單,或一個技能都沒有
|
||
set -u
|
||
|
||
HERE=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||
. "$HERE/plugins-root.sh"
|
||
|
||
ROOT=$(jsc_plugins_root) || exit 1
|
||
|
||
# 正本 domain 清單:優先讀本機任一份 marketplace 副本(每個 repo 都帶同一份)。
|
||
mkt=""
|
||
for cand in "$HERE/../.claude-plugin/marketplace.json" "$ROOT"/*/.claude-plugin/marketplace.json; do
|
||
[ -f "$cand" ] && { mkt="$cand"; break; }
|
||
done
|
||
[ -n "$mkt" ] || { echo "找不到 marketplace.json,無法判定 domain 清單" >&2; exit 1; }
|
||
DOMAINS=$(sed -n 's/.*"name"[[:space:]]*:[[:space:]]*"jsc-\([a-z0-9-]*\)".*/\1/p' "$mkt" | sort -u)
|
||
[ -n "$DOMAINS" ] || { echo "marketplace.json 裡沒有 jsc-{domain} 條目:$mkt" >&2; exit 1; }
|
||
|
||
OUT=$(
|
||
for f in "$ROOT"/*/skills/*/SKILL.md; do
|
||
[ -f "$f" ] || continue
|
||
repo=${f#"$ROOT"/}
|
||
repo=${repo%%/*}
|
||
domain=${repo#jsc-}
|
||
# 不在正本清單上的存取庫直接跳過。
|
||
printf '%s\n' "$DOMAINS" | grep -qx "$domain" || continue
|
||
name=$(awk 'BEGIN{f=0} /^---$/{f++; next} f==1 && /^name:/{sub(/^name: */,""); print; exit}' "$f")
|
||
desc=$(awk 'BEGIN{f=0} /^---$/{f++; next} f==1 && /^description:/{sub(/^description: */,""); print; exit}' "$f")
|
||
[ -n "$name" ] || continue
|
||
printf '%s\t%s\t%s\n' "$domain" "$name" "$desc"
|
||
done | sort -t"$(printf '\t')" -k1,1 -k2,2
|
||
)
|
||
|
||
[ -n "$OUT" ] || { echo "掃不到任何 SKILL.md:$ROOT/*/skills/*/SKILL.md(先跑 sync-domains.sh)" >&2; exit 1; }
|
||
|
||
printf '%s\n' "$OUT"
|
||
count=$(printf '%s\n' "$OUT" | wc -l | tr -d ' ')
|
||
echo "共 $count 個技能" >&2
|
||
exit 0
|