| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #!/usr/bin/env bash
- # Claude Code statusline — model, folder, branch, plan, context bar, session start
- # Receives JSON on stdin from Claude Code.
- INPUT=$(cat)
- MODEL=$(echo "$INPUT" | jq -r '.model.display_name // "?"')
- DIR=$(echo "$INPUT" | jq -r '.cwd // "?"')
- FOLDER="${DIR##*/}"
- PCT=$(echo "$INPUT" | jq -r \
- '.context_window.used_percentage // 0' \
- | cut -d. -f1)
- # Git branch (fast, no network)
- BRANCH=""
- if [ -d "$DIR" ]; then
- BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
- fi
- BRANCH_STR="${BRANCH:+ ($BRANCH)}"
- # Plan detection (reuse shared lib)
- _lib="$(dirname "${BASH_SOURCE[0]}")/../lib/detect-plugins.sh"
- if [ -f "$_lib" ]; then
- source "$_lib"
- PLAN=$(detect_plan 2>/dev/null || echo "pro")
- else
- PLAN="pro"
- fi
- PLAN_UPPER=$(echo "$PLAN" | tr '[:lower:]' '[:upper:]' | head -c1)$(echo "$PLAN" | tail -c+2)
- # Session duration (from total_duration_ms)
- DURATION_MS=$(echo "$INPUT" | jq -r \
- '.cost.total_duration_ms // 0' | cut -d. -f1)
- DURATION_S=$((DURATION_MS / 1000))
- if [ "$DURATION_S" -ge 3600 ]; then
- DURATION="$((DURATION_S / 3600))h$((DURATION_S % 3600 / 60))m"
- elif [ "$DURATION_S" -ge 60 ]; then
- DURATION="$((DURATION_S / 60))m"
- else
- DURATION="<1m"
- fi
- # Progress bar (20 chars wide)
- WIDTH=20
- FILLED=$((PCT * WIDTH / 100))
- EMPTY=$((WIDTH - FILLED))
- if [ "$FILLED" -gt 0 ]; then
- printf -v FILL "%${FILLED}s"
- else
- FILL=""
- fi
- if [ "$EMPTY" -gt 0 ]; then
- printf -v PAD "%${EMPTY}s"
- else
- PAD=""
- fi
- BAR="${FILL// /█}${PAD// /░}"
- # Color: green <50%, yellow 50-79%, red >=80%
- if [ "$PCT" -ge 80 ]; then
- COLOR="\033[31m"
- elif [ "$PCT" -ge 50 ]; then
- COLOR="\033[33m"
- else
- COLOR="\033[32m"
- fi
- RESET="\033[0m"
- # Output: single line
- echo -e "$MODEL | $FOLDER${BRANCH_STR} | $PLAN_UPPER | ${COLOR}${BAR}${RESET} ${PCT}% | ${DURATION}"
|