#!/bin/bash
# Generated by cc-statusline (https://www.npmjs.com/package/@chongdashu/cc-statusline)
# Custom Claude Code statusline - Created: 2025-08-19T05:45:09.773Z
# Theme: detailed | Colors: true | Features: directory, git, model, usage, session, tokens
input=$(cat)
# ---- color helpers (TTY-aware, respect NO_COLOR) ----
use_color=1
[ -t 1 ] || use_color=0
[ -n "$NO_COLOR" ] && use_color=0
C() { if [ "$use_color" -eq 1 ]; then printf '\033[%sm' "$1"; fi; }
RST() { if [ "$use_color" -eq 1 ]; then printf '\033[0m'; fi; }
# ---- basic colors ----
dir_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;36m'; fi; } # cyan
model_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;35m'; fi; } # magenta
version_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;33m'; fi; } # yellow
rst() { if [ "$use_color" -eq 1 ]; then printf '\033[0m'; fi; }
# ---- time helpers ----
to_epoch() {
ts="$1"
if command -v gdate >/dev/null 2>&1; then gdate -d "$ts" +%s 2>/dev/null && return; fi
date -u -j -f "%Y-%m-%dT%H:%M:%S%z" "${ts/Z/+0000}" +%s 2>/dev/null && return
python3 - "$ts" <<'PY' 2>/dev/null
import sys, datetime
s=sys.argv[1].replace('Z','+00:00')
print(int(datetime.datetime.fromisoformat(s).timestamp()))
PY
}
fmt_time_hm() {
epoch="$1"
if date -r 0 +%s >/dev/null 2>&1; then date -r "$epoch" +"%H:%M"; else date -d "@$epoch" +"%H:%M"; fi
}
progress_bar() {
pct="${1:-0}"; width="${2:-10}"
[[ "$pct" =~ ^[0-9]+$ ]] || pct=0; ((pct<0))&&pct=0; ((pct>100))&&pct=100
filled=$(( pct * width / 100 )); empty=$(( width - filled ))
printf '%*s' "$filled" '' | tr ' ' '='
printf '%*s' "$empty" '' | tr ' ' '-'
}
# git utilities
num_or_zero() { v="$1"; [[ "$v" =~ ^[0-9]+$ ]] && echo "$v" || echo 0; }
# ---- basics ----
if command -v jq >/dev/null 2>&1; then
current_dir=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // "unknown"' 2>/dev/null | sed "s|^$HOME|~|g")
model_name=$(echo "$input" | jq -r '.model.display_name // "Claude"' 2>/dev/null)
model_version=$(echo "$input" | jq -r '.model.version // ""' 2>/dev/null)
else
current_dir="unknown"
model_name="Claude"; model_version=""
fi
# ---- git colors ----
git_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;32m'; fi; }
rst() { if [ "$use_color" -eq 1 ]; then printf '\033[0m'; fi; }
# ---- git ----
git_branch=""
if git rev-parse --git-dir >/dev/null 2>&1; then
git_branch=$(git branch --show-current 2>/dev/null || git rev-parse --short HEAD 2>/dev/null)
fi
# ---- usage colors ----
usage_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;35m'; fi; }
cost_color() { if [ "$use_color" -eq 1 ]; then printf '\033[1;36m'; fi; }
session_color() {
rem_pct=$(( 100 - session_pct ))
if (( rem_pct <= 10 )); then SCLR='1;31'
elif (( rem_pct <= 25 )); then SCLR='1;33'
else SCLR='1;32'; fi
if [ "$use_color" -eq 1 ]; then printf '\033[%sm' "$SCLR"; fi
}
# ---- ccusage integration ----
session_txt=""; session_pct=0; session_bar=""
cost_usd=""; cost_per_hour=""; tpm=""; tot_tokens=""
if command -v jq >/dev/null 2>&1; then
blocks_output=$(npx ccusage@latest blocks --json 2>/dev/null || ccusage blocks --json 2>/dev/null)
if [ -n "$blocks_output" ]; then
active_block=$(echo "$blocks_output" | jq -c '.blocks[] | select(.isActive == true)' 2>/dev/null | head -n1)
if [ -n "$active_block" ]; then
cost_usd=$(echo "$active_block" | jq -r '.costUSD // empty')
cost_per_hour=$(echo "$active_block" | jq -r '.burnRate.costPerHour // empty')
tot_tokens=$(echo "$active_block" | jq -r '.totalTokens // empty')
# Session time calculation
reset_time_str=$(echo "$active_block" | jq -r '.usageLimitResetTime // .endTime // empty')
start_time_str=$(echo "$active_block" | jq -r '.startTime // empty')
if [ -n "$reset_time_str" ] && [ -n "$start_time_str" ]; then
start_sec=$(to_epoch "$start_time_str"); end_sec=$(to_epoch "$reset_time_str"); now_sec=$(date +%s)
total=$(( end_sec - start_sec )); (( total<1 )) && total=1
elapsed=$(( now_sec - start_sec )); (( elapsed<0 ))&&elapsed=0; (( elapsed>total ))&&elapsed=$total
session_pct=$(( elapsed * 100 / total ))
remaining=$(( end_sec - now_sec )); (( remaining<0 )) && remaining=0
rh=$(( remaining / 3600 )); rm=$(( (remaining % 3600) / 60 ))
end_hm=$(fmt_time_hm "$end_sec")
session_txt="$(printf '%dh %dm until reset at %s (%d%%)' "$rh" "$rm" "$end_hm" "$session_pct")"
session_bar=$(progress_bar "$session_pct" 10)
fi
fi
fi
fi
# ---- render statusline ----
printf '📁 %s%s%s' "$(dir_color)" "$current_dir" "$(rst)"
# git display
if [ -n "$git_branch" ]; then
printf ' 🌿 %s%s%s' "$(git_color)" "$git_branch" "$(rst)"
fi
printf ' 🤖 %s%s%s' "$(model_color)" "$model_name" "$(rst)"
if [ -n "$model_version" ] && [ "$model_version" != "null" ]; then
printf ' 🏷️ %s%s%s' "$(version_color)" "$model_version" "$(rst)"
fi
# session time
if [ -n "$session_txt" ]; then
printf ' ⌛ %s%s%s' "$(session_color)" "$session_txt" "$(rst)"
printf ' %s[%s]%s' "$(session_color)" "$session_bar" "$(rst)"
fi
# cost
if [ -n "$cost_usd" ] && [[ "$cost_usd" =~ ^[0-9.]+$ ]]; then
if [ -n "$cost_per_hour" ] && [[ "$cost_per_hour" =~ ^[0-9.]+$ ]]; then
printf ' 💵 %s$%.2f ($%.2f/h)%s' "$(cost_color)" "$cost_usd" "$cost_per_hour" "$(rst)"
else
printf ' 💵 %s$%.2f%s' "$(cost_color)" "$cost_usd" "$(rst)"
fi
fi
# tokens
if [ -n "$tot_tokens" ] && [[ "$tot_tokens" =~ ^[0-9]+$ ]]; then
if [ -n "$tpm" ] && [[ "$tpm" =~ ^[0-9.]+$ ]] && false; then
printf ' 📊 %s%s tok (%.0f tpm)%s' "$(usage_color)" "$tot_tokens" "$tpm" "$(rst)"
else
printf ' 📊 %s%s tok%s' "$(usage_color)" "$tot_tokens" "$(rst)"
fi
fi