feat(statusline): replace plan segment with profile: + effort:

Drop the `PLAN` (Max/Pro) segment — user wants runtime context, not
account-tier info. Add prefixes for clarity:

- `profile: <name>` reads `<repo>/.active-profile` (already wired in
  the previous commit).
- `effort: <level>` reads `.effortLevel` from `<repo>/settings.json`
  via jq — picks up `/effort` changes automatically since settings.json
  is the source-of-truth (symlinked into `~/.claude/settings.json`).

Sample output:

  Opus 4.7 | claude (master) | profile: full | effort: xhigh | ███░░ 42% | 3m

`lib/detect-plugins.sh` is left untouched — still used by
hooks/session-start.sh, doctor.sh, update-all.sh, install-plugins.sh.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Bastien Chanot 2026-05-21 05:17:29 +02:00
parent cb1e8cd814
commit a491de51c8

View File

@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Claude Code statusline — model, folder, branch, plan, context bar, session start # Claude Code statusline — model, folder, branch, profile, effort, context bar, session start
# Receives JSON on stdin from Claude Code. # Receives JSON on stdin from Claude Code.
INPUT=$(cat) INPUT=$(cat)
@ -18,26 +18,24 @@ if [ -d "$DIR" ]; then
fi fi
BRANCH_STR="${BRANCH:+ ($BRANCH)}" BRANCH_STR="${BRANCH:+ ($BRANCH)}"
# Plan detection (reuse shared lib) REPO="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
_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)
# Active profile (written by lib/profile.sh set|apply|reset to <repo>/.active-profile). # Active profile (written by lib/profile.sh set|apply|reset to <repo>/.active-profile).
# Read directly — `profile.sh current` is 12s+ and unusable in a statusline. # Read directly — `profile.sh current` is 12s+ and unusable in a statusline.
REPO="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROFILE="?" PROFILE="?"
if [ -f "$REPO/.active-profile" ]; then if [ -f "$REPO/.active-profile" ]; then
PROFILE=$(head -n1 "$REPO/.active-profile" | tr -d '[:space:]') PROFILE=$(head -n1 "$REPO/.active-profile" | tr -d '[:space:]')
[ -z "$PROFILE" ] && PROFILE="?" [ -z "$PROFILE" ] && PROFILE="?"
fi fi
# Effort level from settings.json (.effortLevel — set by /effort or manual edit).
# settings.json is the source-of-truth, symlinked into ~/.claude/settings.json.
EFFORT="?"
if [ -f "$REPO/settings.json" ]; then
EFFORT=$(jq -r '.effortLevel // "?"' "$REPO/settings.json" 2>/dev/null)
[ -z "$EFFORT" ] && EFFORT="?"
fi
# Session duration (from total_duration_ms) # Session duration (from total_duration_ms)
DURATION_MS=$(echo "$INPUT" | jq -r \ DURATION_MS=$(echo "$INPUT" | jq -r \
'.cost.total_duration_ms // 0' | cut -d. -f1) '.cost.total_duration_ms // 0' | cut -d. -f1)
@ -77,4 +75,4 @@ fi
RESET="\033[0m" RESET="\033[0m"
# Output: single line # Output: single line
echo -e "$MODEL | $FOLDER${BRANCH_STR} | $PLAN_UPPER | ${PROFILE} | ${COLOR}${BAR}${RESET} ${PCT}% | ${DURATION}" echo -e "$MODEL | $FOLDER${BRANCH_STR} | profile: ${PROFILE} | effort: ${EFFORT} | ${COLOR}${BAR}${RESET} ${PCT}% | ${DURATION}"