statusline.sh 1.8 KB

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