statusline.sh 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env bash
  2. # Claude Code statusline — folder, git branch, model, context %
  3. # Receives JSON on stdin from Claude Code.
  4. INPUT=$(cat)
  5. MODEL=$(echo "$INPUT" | jq -r '.model.display_name // "?"')
  6. DIR=$(echo "$INPUT" | jq -r '.cwd // "?"')
  7. FOLDER="${DIR##*/}"
  8. PCT=$(echo "$INPUT" | jq -r \
  9. '.context_window.used_percentage // 0' \
  10. | cut -d. -f1)
  11. # Git branch (fast, no network)
  12. BRANCH=""
  13. if [ -d "$DIR" ]; then
  14. BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
  15. fi
  16. BRANCH_STR="${BRANCH:+ ($BRANCH)}"
  17. # Progress bar (20 chars wide)
  18. WIDTH=20
  19. FILLED=$((PCT * WIDTH / 100))
  20. EMPTY=$((WIDTH - FILLED))
  21. if [ "$FILLED" -gt 0 ]; then
  22. printf -v FILL "%${FILLED}s"
  23. else
  24. FILL=""
  25. fi
  26. if [ "$EMPTY" -gt 0 ]; then
  27. printf -v PAD "%${EMPTY}s"
  28. else
  29. PAD=""
  30. fi
  31. BAR="${FILL// /█}${PAD// /░}"
  32. # Color: green <50%, yellow 50-79%, red >=80%
  33. if [ "$PCT" -ge 80 ]; then
  34. COLOR="\033[31m"
  35. elif [ "$PCT" -ge 50 ]; then
  36. COLOR="\033[33m"
  37. else
  38. COLOR="\033[32m"
  39. fi
  40. RESET="\033[0m"
  41. # Output: single line
  42. echo -e "$MODEL | $FOLDER${BRANCH_STR} | ${COLOR}${BAR}${RESET} ${PCT}%"