Xinqi Bao's Git

dfaa2034309de4cdbb4caaa3003c426b130a8c73
[dotfiles.git] / .claude / statusline.sh
1 #!/bin/bash
2 input=$(cat)
3
4 # ============================================================
5 # 数据提取
6 # ============================================================
7 MODEL=$(echo "$input" | jq -r '.model.display_name')
8 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
9 COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0' | xargs printf '%.2f')
10 ADDED=$(echo "$input" | jq -r '.cost.total_lines_added // 0')
11 REMOVED=$(echo "$input" | jq -r '.cost.total_lines_removed // 0')
12 API_MS=$(echo "$input" | jq -r '.cost.total_api_duration_ms // 0')
13 API_TOTAL_S=$((API_MS / 1000))
14 CWD=$(echo "$input" | jq -r '.cwd')
15 BRANCH=$(git -C "$CWD" --no-optional-locks branch --show-current 2>/dev/null)
16
17 # ============================================================
18 # 颜色定义
19 # ============================================================
20 R='\033[0m'
21 C_MODEL='\033[1;37m' # 粗体白 - 模型名
22 C_CWD='\033[1;34m' # 粗体蓝 - 工作目录
23 C_BRANCH='\033[36m' # 青色 - git 分支
24 C_COST='\033[33m' # 黄色 - 花费
25 C_DUR='\033[35m' # 紫色 - 时长
26 C_ADD='\033[32m' # 绿色 - 新增行
27 C_DEL='\033[31m' # 红色 - 删除行
28 C_DIM='\033[90m' # 灰色 - 进度条空白段
29
30 # 上下文颜色: < 70% 绿 | 70-89% 黄 | >= 90% 红
31 if [ "$PCT" -ge 90 ]; then C_CTX='\033[31m'
32 elif [ "$PCT" -ge 70 ]; then C_CTX='\033[33m'
33 else C_CTX='\033[32m'; fi
34
35 # ============================================================
36 # 进度条
37 # ============================================================
38 BAR_WIDTH=15
39 FILLED=$((PCT * BAR_WIDTH / 100))
40 EMPTY=$((BAR_WIDTH - FILLED))
41 BAR="${C_CTX}$(printf "%${FILLED}s" | tr ' ' '▓')${C_DIM}$(printf "%${EMPTY}s" | tr ' ' '░')${R}"
42
43 # ============================================================
44 # 分段构建 - 注释掉 seg_xxx 行即可关闭对应段
45 # ============================================================
46 SEP=" │ "
47 OUT=""
48 add() { [ -n "$OUT" ] && OUT="${OUT}${SEP}"; OUT="${OUT}$1"; }
49
50 # [1] 模型 + 版本
51 seg_model="${C_MODEL}${MODEL}"
52 add "$seg_model"
53
54 # [2] 工作目录 (~ 缩写, 最后两级)
55 SHORT_CWD=$(echo "$CWD" | sed "s|^$HOME|~|" | awk -F/ '{if(NF<=2)print $0; else printf "%s/%s",$((NF-1)),$NF}')
56 seg_cwd="${C_CWD}${SHORT_CWD}${R}"
57 add "$seg_cwd"
58
59 # [3] Git 分支
60 if [ -n "$BRANCH" ]; then
61 seg_git="${C_BRANCH}⎇ ${BRANCH}${R}"
62 add "$seg_git"
63 fi
64
65 # [4] 上下文进度条 + 百分比
66 seg_ctx="${BAR} ${C_CTX}${PCT}%%${R}"
67 add "$seg_ctx"
68
69 # [5] 花费
70 seg_cost="${C_COST}\$${COST}${R}"
71 add "$seg_cost"
72
73 # [6] 代码增删
74 seg_lines="${C_ADD}+${ADDED}${R} ${C_DEL}-${REMOVED}${R}"
75 add "$seg_lines"
76
77 # [7] API 耗时 (自动进位: s -> m s -> h m s)
78 if [ "$API_TOTAL_S" -ge 3600 ]; then
79 seg_dur=$(printf "${C_DUR}%dh%dm%ds${R}" $((API_TOTAL_S/3600)) $((API_TOTAL_S%3600/60)) $((API_TOTAL_S%60)))
80 elif [ "$API_TOTAL_S" -ge 60 ]; then
81 seg_dur=$(printf "${C_DUR}%dm%ds${R}" $((API_TOTAL_S/60)) $((API_TOTAL_S%60)))
82 else
83 seg_dur=$(printf "${C_DUR}%d.%ds${R}" "$API_TOTAL_S" $(( (API_MS%1000)/100 )))
84 fi
85 add "$seg_dur"
86
87 # ============================================================
88 # 输出
89 # ============================================================
90 printf '%b\n' "$OUT"