Releases: derjochenmeyer/claude-code-craft-statusline
Release list
v3.0.0: Activity indicator removed, Recommended workflow section
Breaking changes
- Activity indicator removed. The hook-free indicator that showed
thinking/executing/researchingis gone. It duplicated information that Claude Code already surfaces in the main pane, and its multi-session-visibility use case is better served by a dedicated terminal multiplexer. See the new Recommended workflow section in the README. Theshow_activityandactivity_live_window_secsuser-config options are removed; settings already on disk are silently ignored.
Added
- Recommended workflow section in the README. Points users at cmux on macOS (browser pane plus context-aware tabs that light up when an agent needs input) and Warp as the cross-platform alternative for parallel Claude Code sessions.
Changed
/craft-statusline:statuslive-preview now uses the same${CLAUDE_PLUGIN_ROOT:-...}default-expansion as/craft-statusline:install. Previously the preview path could resolve to a stale versioned cache; it now falls back to the version-stable marketplace clone path, matching the install wiring./craft-statusline:onand/craft-statusline:offvalidate the field argument in bash. A missing or unrecognized field now exits non-zero with the usage hint, instead of quietly writing an unknown option key intosettings.json.run_custom_fieldnow traps its tempfile cleanup. Previously a stray tempfile could be left behind if the harness interrupted the renderer betweenmktempand the explicitrm.- Removed dead code
render_with_flagsfromtests/helpers.bash. Unused by any test.
Full changelog: CHANGELOG.md
v2.0.2: Activity indicator fixes
Fixed
- Activity indicator now reads the correct session. The renderer was picking the most-recently-modified
.jsonlacross all projects, so users with multiple parallel Claude Code sessions saw activity from a different session. It now follows thetranscript_pathfield from the harness's stdin JSON and only falls back to the global-latest scan when that field is missing. - Activity stale window raised from 10s to 60s. A 10-second idle threshold was too aggressive for typical long tool calls (10s+ Bash, multi-step Task subagents), so the indicator vanished during the moments it was meant to be most visible. 60s covers common long tool calls while still disappearing within a sensible window after a turn ends. Configurable via
activity_live_window_secs.
Note: the Activity indicator was removed entirely in v3.0.0. This release remains available for historical reference.
v2.0.1: CLAUDE_PLUGIN_ROOT workaround
Fixed
- Statusline now actually renders after a fresh plugin install. Claude Code does not currently populate
${CLAUDE_PLUGIN_ROOT}in the statusline subprocess environment (it does for hooks, MCP, LSP, and monitors). A bare${CLAUDE_PLUGIN_ROOT}/scripts/craft-statusline.shtherefore expanded to/scripts/craft-statusline.shand silently produced no output./craft-statusline:installnow writes a POSIX default-expansion${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/craft-statusline-marketplace}/scripts/craft-statusline.shthat falls back to the version-stable marketplace clone path. Once the upstream bug (anthropics/claude-code#52079) is fixed, the same line transparently uses the official plugin root.
Migration
Existing 2.0.0 users who already have a non-rendering statusline: re-run /craft-statusline:install (no force flag needed; it overwrites its own previous wiring).
v2.0.0: official Claude Code plugin
Major rewrite. craft-statusline is now distributed as an official Claude Code plugin via its own marketplace. The renderer logic is unchanged; the distribution shell around it is brand new.
Install
/plugin marketplace add derjochenmeyer/claude-code-craft-statusline
/plugin install craft-statusline
/craft-statusline:install
Restart Claude Code to see it render at the bottom of the screen.
Breaking changes
- Installation is plugin-based. The old
curl … | bashinstaller is removed. - Slash commands are namespaced:
/craft-statusline:install,/craft-statusline:uninstall,/craft-statusline:status,/craft-statusline:on <field>,/craft-statusline:off <field>. - Configuration moved to
userConfig. Toggles and thresholds live in~/.claude/settings.jsonunderpluginConfigs.\"craft-statusline\".options.*, surfaced to the renderer asCLAUDE_PLUGIN_OPTION_*environment variables. Editing the renderer script directly no longer works. SHOW_EFFORTremoved. Effort is always paired with model.
Removed
install.shwith its SHA256-pinned jq downloader, atomic tmpfile pattern, Gatekeeper handling.craft-statusline-wizard.sh.- In-renderer update checker (the plugin manager handles updates via
/plugin update).
Changed
- jq is a hard requirement. The
:installcommand verifies it and points users atbrew install jq/apt install jq. - Renderer lives at
scripts/craft-statusline.sh, referenced via\${CLAUDE_PLUGIN_ROOT}/scripts/craft-statusline.shin settings.json.
Migration from v1.x
There is no in-place upgrade. To migrate from a v1.x curl install:
rm -f ~/.claude/craft-statusline.sh ~/.claude/craft-statusline-wizard.sh
rm -rf ~/.claude/skills/craft-statusline ~/.claude/commands/craft-statusline.md
rm -f ~/.claude/state/version-check
# Then clear the old statusLine entry from ~/.claude/settings.json and install via the plugin flow above.Custom fields in ~/.claude/craft-statusline-custom.sh continue to work without changes.
v1.2.0: context traffic light with absolute-token degrade threshold
Added
- Context field is now an absolute-token traffic light. Green while
current_usagetokens stay belowCONTEXT_DEGRADE_AT_TOKENS(default 400,000); yellow⚠once the session crosses that threshold, which is the zone where model recall measurably degrades on 1M-window models even though there is still headroom; red⚠onceused_percentage >= CONTEXT_ALERT_AT(default 85%) and auto-compact is near. The⚠shares the field color (not hard-coded red). CONTEXT_DEGRADE_AT_TOKENS=400000threshold, documented with a reminder to re-validate as new model generations ship.
Changed
- Context field stops using the percent-only gradient (green < 50, yellow < 70, orange < 85, red ≥ 85). That scheme is kept only for the rate-limit fields, where percent-of-window is the right axis.
- Absolute token count is derived from
.context_window.current_usage.{input_tokens, cache_creation_input_tokens, cache_read_input_tokens}per Anthropic's documented statusline schema.total_input_tokens/total_output_tokensare cumulative session totals and deliberately avoided.
Why this matters
On a 1M-window model, 85% full is 850k tokens, well past the point where multi-needle retrieval accuracy on Opus 4.6 drops ~15-17 pp compared to 256k (Anthropic MRCR v2 benchmark). The previous percent-only alert meant you only saw a warning right before auto-compact, long after the model had started forgetting things. The new traffic light warns at the quality threshold, not just the fill threshold.
Sources: Anthropic statusline schema, Claude 4 context rot discussion.
v1.1.0: state-aware branch palette + activity indicator fixes
Added
- State-aware branch badge palette. The branch field now colors itself by the dominant git signal. Priority (blocking first): conflict (red) > diverged (coral) > behind (azure) > combined (coral) > ahead (amber) > unstaged (amber) > staged (green) > untracked (slate) > stashed (violet) > clean (green).
Fixed
- Activity indicator no longer sticks on
thinkingafter turn-end. The decoder now readsstop_reasonon the most recent assistant event in the transcript (walking back past Claude Code's post-turn metadata likeattachment,file-history-snapshot,custom-title), soend_turn,max_tokens, and friends correctly suppress the indicator. statflag ordering on Linux-first detection for the version-check cache (GNUstat -fsilently returned a mount-point string that parsed as invalid number).
Changed
- Removed the
SHOW_EMOJIflag.ctx▸has been the default since v1.0.0 and aligned with5h▸/7d▸/cost▸; the legacy✍️opt-in path is gone. - Author line collapsed into the single sponsor line in README.
- Preview screenshot now links from a GitHub issue attachment instead of shipping
assets/statusline.pngin the repo.
Docs
- SKILL.md: git symbol reference table added for
/craft-statuslineoutput.
Known issue: Claude Code's harness does not always re-render the statusline while idle, so the activity indicator may visually stall on the last rendered state until the next user prompt. The script itself correctly reports "done" — the limitation is in the harness refresh schedule, not this script.
v1.0.0 — Initial release
A carefully crafted Claude Code statusline, written in bash, with minimal design and requirements.
What it shows
Opus 4.7▸high │ main !3 ⇡2 │ ctx▸42% │ 5h▸15% │ 7d▸30% │ ● executing (Bash)
- Model + effort — current Claude model (shortened) with inline effort badge
- Git branch + status — branch with ahead/behind, staged, unstaged, untracked, stashed, conflicts badges
- Context % with session duration, and a red
⚠when usage crosses the alert threshold - Rate limits — rolling 5-hour and 7-day token windows, color-coded
- Session cost (opt-in, API billing only)
- Activity indicator — hook-free, driven by session-transcript mtime.
● thinking,● executing (Bash), or● researchingdepending on what Claude is doing right now. - Update badge
⬆ vX.Y.Zwhen a newer release is published (background check, at most once per 24h). - Custom fields via
~/.claude/craft-statusline-custom.sh— sourced, whitelist-gated, timeout-capped.
Install
curl -fsSL https://raw.githubusercontent.com/derjochenmeyer/claude-code-craft-statusline/main/install.sh | bashThe installer auto-installs jq if needed (pinned to a specific version with hardcoded SHA256), activates the statusline in ~/.claude/settings.json if nothing else is set, and reports (never overwrites) any existing configuration.
If piping into bash makes you twitch, the README documents a two-step inspected install.
Requirements
- bash 3.2+ (macOS ships this by default; Linux has newer)
- jq (auto-installed by the installer with a SHA256-pinned static binary)
- git (only if the branch field is enabled)
No Node. No Python. No Nerd Fonts. Works on macOS, Linux, WSL.
Security and quality posture
- jq pinned to version 1.8.1 with hardcoded SHA256 per platform. Manifest is not fetched from the same host as the binary, closing the bootstrap tautology.
- User-influenced values (model, effort, branch name, activity tool name) are whitelist-validated and length-capped before reaching
printf %b. - Custom fields are sourced, never eval'd; each runs under a 2-second rendertime cap so a hang cannot block the refresh.
- 35 bats-core tests. GitHub Actions CI runs shellcheck and bats on Ubuntu and macOS.
- Full disclosure process in SECURITY.md.
See CHANGELOG.md for the complete feature list, README.md for setup and customization, and CONTRIBUTING.md for the contribution conventions.