- What:worklog、learn、report 三支技能共六處讀取分流改寫,只有結束碼 4 才建新頁; 結束碼 7 與 8 一律中止,一個字都不寫。三份目錄頁樣板補上寫入語意,明寫禁止整頁覆蓋、 不得改動別人的列。usage-stats.sh 的參數護欄改成明確回傳結束碼 2。 - Why:原本把「讀失敗」與「頁面不存在」當成同一件事。金鑰失效時讀取回 7,技能卻讀成 「這頁還沒有」,於是照樣板建一份新頁蓋回去。整份工作日誌會被這一筆條目取代, 既有教訓會被清成空表,報表則產出一份說「這段期間沒有工作」的假數字。 這些內容只活在 wiki 上,蓋掉就救不回來,所以這是本輪最要緊的一項。 - How:每一處讀取都先看結束碼再決定動作,並在技能文件裡列成表格: 0 接在既有內容後面附加,4 才從樣板建頁,5 缺網址就中止,7 金鑰或權限問題就中止, 8 其他 API 失敗就中止。目錄頁一律先讀整頁再改那一列。 stats 也補上分流,參數錯誤不再被讀成「零次」。 - Who:worklog、learn、report、stats 四支技能的 wiki 讀寫與統計輸出。
43 lines
1.5 KiB
Bash
Executable File
43 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env sh
|
||
# usage-stats.sh — 聚合 jsc-hooks 記錄的技能用量。
|
||
# 用法:
|
||
# usage-stats.sh skills [--cli <name>] # 每個 skill 的使用次數(降冪)
|
||
# usage-stats.sh chains [--cli <name>] # 每條 from -> to 呼叫鏈的次數(降冪)
|
||
# 資料: $JSC_HOME/usage/skills.jsonl、chains.jsonl(預設 $HOME/.jsc)
|
||
#
|
||
# 結束碼: 0=成功(資料檔不存在也算成功,印不出任何一行)2=用法錯誤(沒給子命令、
|
||
# 子命令不認得、--cli 沒帶值)
|
||
# 資料檔不存在為什麼算成功: hook 還沒記過任何一次用量就是這個狀態,那是「零次」,不是故障。
|
||
set -u
|
||
JSC_HOME="${JSC_HOME:-$HOME/.jsc}"
|
||
usage() {
|
||
echo '用法:usage-stats.sh skills|chains [--cli <name>]' >&2
|
||
exit 2
|
||
}
|
||
|
||
cmd="${1:-}"; [ -n "$cmd" ] || usage
|
||
shift
|
||
cli=""
|
||
while [ $# -gt 0 ]; do
|
||
case "$1" in
|
||
--cli) cli="${2:-}"; [ -n "$cli" ] || usage; shift 2 ;;
|
||
*) shift ;;
|
||
esac
|
||
done
|
||
|
||
by_cli() { # 依 --cli 過濾;未指定就原樣輸出
|
||
if [ -n "$cli" ]; then grep "\"cli\":\"$cli\""; else cat; fi
|
||
}
|
||
rank() { sort | uniq -c | sort -rn | sed 's/^ *\([0-9][0-9]*\) /\1\t/'; }
|
||
|
||
case "$cmd" in
|
||
skills)
|
||
f="$JSC_HOME/usage/skills.jsonl"; [ -f "$f" ] || exit 0
|
||
by_cli < "$f" | sed -n 's/.*"skill":"\([^"]*\)".*/\1/p' | rank ;;
|
||
chains)
|
||
f="$JSC_HOME/usage/chains.jsonl"; [ -f "$f" ] || exit 0
|
||
by_cli < "$f" | sed -n 's/.*"from":"\([^"]*\)".*"to":"\([^"]*\)".*/\1 -> \2/p' | rank ;;
|
||
*)
|
||
echo "不認得的子命令:$cmd" >&2; usage ;;
|
||
esac
|