statusline.sh 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env bash
  2. # Claude Code statusline — model, folder, branch, plan, context bar, session start
  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. # Plan detection (reuse shared lib)
  18. _lib="$(dirname "${BASH_SOURCE[0]}")/../lib/detect-plugins.sh"
  19. if [ -f "$_lib" ]; then
  20. # shellcheck source=../lib/detect-plugins.sh
  21. source "$_lib"
  22. PLAN=$(detect_plan 2>/dev/null || echo "pro")
  23. else
  24. PLAN="pro"
  25. fi
  26. PLAN_UPPER=$(echo "$PLAN" | tr '[:lower:]' '[:upper:]' | head -c1)$(echo "$PLAN" | tail -c+2)
  27. # Session duration (from total_duration_ms)
  28. DURATION_MS=$(echo "$INPUT" | jq -r \
  29. '.cost.total_duration_ms // 0' | cut -d. -f1)
  30. DURATION_S=$((DURATION_MS / 1000))
  31. if [ "$DURATION_S" -ge 3600 ]; then
  32. DURATION="$((DURATION_S / 3600))h$((DURATION_S % 3600 / 60))m"
  33. elif [ "$DURATION_S" -ge 60 ]; then
  34. DURATION="$((DURATION_S / 60))m"
  35. else
  36. DURATION="<1m"
  37. fi
  38. # Progress bar (20 chars wide)
  39. WIDTH=20
  40. FILLED=$((PCT * WIDTH / 100))
  41. EMPTY=$((WIDTH - FILLED))
  42. if [ "$FILLED" -gt 0 ]; then
  43. printf -v FILL "%${FILLED}s"
  44. else
  45. FILL=""
  46. fi
  47. if [ "$EMPTY" -gt 0 ]; then
  48. printf -v PAD "%${EMPTY}s"
  49. else
  50. PAD=""
  51. fi
  52. BAR="${FILL// /█}${PAD// /░}"
  53. # Color: green <50%, yellow 50-79%, red >=80%
  54. if [ "$PCT" -ge 80 ]; then
  55. COLOR="\033[31m"
  56. elif [ "$PCT" -ge 50 ]; then
  57. COLOR="\033[33m"
  58. else
  59. COLOR="\033[32m"
  60. fi
  61. RESET="\033[0m"
  62. # Output: single line
  63. echo -e "$MODEL | $FOLDER${BRANCH_STR} | $PLAN_UPPER | ${COLOR}${BAR}${RESET} ${PCT}% | ${DURATION}"