Files
dotfiles/claude/statusline-command.sh
2026-07-04 14:47:22 +02:00

75 lines
2.2 KiB
Bash

#!/bin/bash
# Claude Code status line
# Shows: model display name, a progress bar for context-window tokens
# remaining in this session, current git branch, active subagent (if any),
# and enabled plugins (read from ~/.claude/settings.json).
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "unknown"')
cwd=$(echo "$input" | jq -r '.workspace.current_dir // empty')
remaining=$(echo "$input" | jq -r '.context_window.remaining_percentage // empty')
agent_name=$(echo "$input" | jq -r '.agent.name // empty')
# --- Colors (kept modest; Claude Code renders the status line dimmed) ---
c_model='\033[36m' # cyan
c_bar='\033[32m' # green
c_branch='\033[33m' # yellow
c_agent='\033[35m' # magenta
c_plugin='\033[34m' # blue
c_reset='\033[0m'
# --- Git branch (skip optional locks; silent if not a repo) ---
branch=""
if [ -n "$cwd" ]; then
branch=$(git --no-optional-locks -C "$cwd" branch --show-current 2>/dev/null)
fi
# --- Enabled plugins, read from settings.json (not present on stdin) ---
settings_file="$HOME/.claude/settings.json"
plugins=""
if [ -f "$settings_file" ]; then
plugins=$(jq -r '.enabledPlugins // {} | to_entries[] | select(.value == true) | .key | split("@")[0]' "$settings_file" 2>/dev/null | paste -sd, -)
fi
# --- Context-window remaining-tokens progress bar ---
bar=""
if [ -n "$remaining" ]; then
pct=${remaining%.*}
[ -z "$pct" ] && pct=0
[ "$pct" -lt 0 ] 2>/dev/null && pct=0
[ "$pct" -gt 100 ] 2>/dev/null && pct=100
total_blocks=10
filled=$(( pct * total_blocks / 100 ))
[ "$filled" -gt "$total_blocks" ] && filled=$total_blocks
[ "$filled" -lt 0 ] && filled=0
empty=$(( total_blocks - filled ))
bar="["
i=0
while [ "$i" -lt "$filled" ]; do bar="${bar}█"; i=$((i + 1)); done
i=0
while [ "$i" -lt "$empty" ]; do bar="${bar}░"; i=$((i + 1)); done
bar="${bar}] ${pct}% left"
fi
# --- Assemble the status line ---
printf "${c_model}%s${c_reset}" "$model"
if [ -n "$bar" ]; then
printf " ${c_bar}%s${c_reset}" "$bar"
fi
if [ -n "$branch" ]; then
printf " ${c_branch}git:%s${c_reset}" "$branch"
fi
if [ -n "$agent_name" ]; then
printf " ${c_agent}agent:%s${c_reset}" "$agent_name"
fi
if [ -n "$plugins" ]; then
printf " ${c_plugin}plugins:%s${c_reset}" "$plugins"
fi
printf '\n'