Files
hooks/hooks/skill-usage.sh
T
jiantw83 04225a7a2d docs(hooks): 每支腳本檔頭補上結束碼宣告,文件對齊九支 hook 的現況
共用函式庫與各支腳本的檔頭各補一段結束碼宣告,逐個子命令寫明哪些情況放行、
哪些情況擋下。說明文件改寫成九支 hook 的現況,補上寫入與提交閘門、唯讀模式、
建議子命令與新的環境變數。異常目錄範本補上「一律附加、不整頁覆蓋」的寫入語意。

呼叫端要靠結束碼決定下一步,但多數腳本只寫用法、沒寫結束碼,
讀的人得自己翻程式碼推,推錯就把安靜降級當成失敗處理。
共用函式庫載不到時,殼層會就地結束並回非零,接在工具呼叫前的閘門遇到這一下
等於無聲擋人,腳本自己的放行路徑一條都跑不到,這件事非寫進每一支檔頭不可。
文件停在八支 hook 的舊敘述,看的人會誤判覆蓋範圍,以為每支 CLI 都擋得住。
目錄頁的寫入語意只寫在腳本裡,換一支工具來寫就會整頁覆蓋。

一支腳本一段檔頭,逐子命令列出結束碼,並各自註明共用函式庫載入失敗會回哪一個碼。
文件的行數一律引用腳本自己印出來的那一行,不另抄一份數字,
判定路徑增減時就不會漂移。覆蓋範圍逐支 CLI 分開寫,接不上的就寫接不上。
2026-08-31 11:17:28 +08:00

29 lines
1.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env sh
# skill-usage.sh — 記錄技能使用與呼叫鏈(供 jsc-log:stats 統計)。
# Claude: PostToolUse(matcher=Skill) 接線;其他 CLI 由 wrapper 以
# JSC_SKILL=<name> skill-usage.sh 呼叫。
# 產出:
# $JSC_HOME/usage/skills.jsonl {ts,cli,session,skill}
# $JSC_HOME/usage/chains.jsonl {ts,cli,session,from,to}(同 session 內前一技能 → 本技能)
#
# 結束碼:0=一律成功,只有這一種正常碼。取不到技能名(JSC_SKILL 與 stdin JSON 都沒有)就
# 安靜降級,不寫任何紀錄直接 exit 0;寫得成紀錄也是 exit 0。這支接在 PostToolUse,
# 技能已經跑完了,結束碼擋不掉任何事,所以連寫檔失敗都不回報。
# 唯一的非零來源同 session-timer.sh:本檔以 `. "$HERE/lib.sh"` 載入,沒有接 `|| true`,
# lib.sh 讀不到時 sh 會就地結束並回 2。
HERE=$(dirname "$0"); . "$HERE/lib.sh"
read_stdin
skill="${JSC_SKILL:-$(json_str skill)}"
[ -n "$skill" ] || exit 0
sid=$(session_id); cli=$(cli_name); ts=$(now_iso)
printf '{"ts":"%s","cli":"%s","session":"%s","skill":"%s"}\n' \
"$ts" "$cli" "$sid" "$skill" >> "$JSC_HOME/usage/skills.jsonl"
last_f="$JSC_HOME/sessions/$sid.lastskill"
last=$(cat "$last_f" 2>/dev/null || echo "")
if [ -n "$last" ]; then
printf '{"ts":"%s","cli":"%s","session":"%s","from":"%s","to":"%s"}\n' \
"$ts" "$cli" "$sid" "$last" "$skill" >> "$JSC_HOME/usage/chains.jsonl"
fi
printf '%s' "$skill" > "$last_f"
exit 0