claude/hooks/statusline.sh
bastien 71955ea7b3 fix(shell): resolve all shellcheck warnings across scripts
- SC2088: replace ~ with $HOME in quoted strings (doctor.sh)
- SC2010/SC2012: replace ls|grep with compgen -G globs (detect-plugins.sh)
- SC2034: remove unused PKG and RED variables (install-plugins.sh, update-all.sh)
- SC2015: convert A&&B||C to proper if/then/else (update-all.sh, install-plugins.sh, session-start.sh)
- SC1090: add shellcheck source directive (statusline.sh)
- SC2129: group redirects into single block (install-plugins.sh)

0 warnings remaining (3 SC1091 info-level expected).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-04-16 01:08:23 +02:00

72 lines
1.8 KiB
Bash
Executable File

#!/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
# shellcheck source=../lib/detect-plugins.sh
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}"