Skip to content

Releases: derjochenmeyer/claude-code-craft-statusline

v3.0.0: Activity indicator removed, Recommended workflow section

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 23 Apr 10:51

Breaking changes

  • Activity indicator removed. The hook-free indicator that showed thinking / executing / researching is 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. The show_activity and activity_live_window_secs user-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:status live-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:on and /craft-statusline:off validate 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 into settings.json.
  • run_custom_field now traps its tempfile cleanup. Previously a stray tempfile could be left behind if the harness interrupted the renderer between mktemp and the explicit rm.
  • Removed dead code render_with_flags from tests/helpers.bash. Unused by any test.

Full changelog: CHANGELOG.md

v2.0.2: Activity indicator fixes

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 23 Apr 10:53

Fixed

  • Activity indicator now reads the correct session. The renderer was picking the most-recently-modified .jsonl across all projects, so users with multiple parallel Claude Code sessions saw activity from a different session. It now follows the transcript_path field 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

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 23 Apr 10:53

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.sh therefore expanded to /scripts/craft-statusline.sh and silently produced no output. /craft-statusline:install now writes a POSIX default-expansion ${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/craft-statusline-marketplace}/scripts/craft-statusline.sh that 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

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 22 Apr 11:58

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 … | bash installer 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.json under pluginConfigs.\"craft-statusline\".options.*, surfaced to the renderer as CLAUDE_PLUGIN_OPTION_* environment variables. Editing the renderer script directly no longer works.
  • SHOW_EFFORT removed. Effort is always paired with model.

Removed

  • install.sh with 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 :install command verifies it and points users at brew install jq / apt install jq.
  • Renderer lives at scripts/craft-statusline.sh, referenced via \${CLAUDE_PLUGIN_ROOT}/scripts/craft-statusline.sh in 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

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 21 Apr 11:23

Added

  • Context field is now an absolute-token traffic light. Green while current_usage tokens stay below CONTEXT_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 once used_percentage >= CONTEXT_ALERT_AT (default 85%) and auto-compact is near. The shares the field color (not hard-coded red).
  • CONTEXT_DEGRADE_AT_TOKENS=400000 threshold, 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_tokens are 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

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 20 Apr 15:42

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 thinking after turn-end. The decoder now reads stop_reason on the most recent assistant event in the transcript (walking back past Claude Code's post-turn metadata like attachment, file-history-snapshot, custom-title), so end_turn, max_tokens, and friends correctly suppress the indicator.
  • stat flag ordering on Linux-first detection for the version-check cache (GNU stat -f silently returned a mount-point string that parsed as invalid number).

Changed

  • Removed the SHOW_EMOJI flag. ctx▸ has been the default since v1.0.0 and aligned with 5h▸/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.png in the repo.

Docs

  • SKILL.md: git symbol reference table added for /craft-statusline output.

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

Choose a tag to compare

@derjochenmeyer derjochenmeyer released this 20 Apr 12:33

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 ● researching depending on what Claude is doing right now.
  • Update badge ⬆ vX.Y.Z when 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 | bash

The 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.