feat(status): informative tmux bar (#42) + Claude Code model·effort·context statusLine (#67) - #68
Merged
Merged
Conversation
…ontext statusLine (#67) Two complementary status lines, each showing what it actually has live access to. #42 — outer tmux bar. Replace the uninformative default-tmux window-list furniture with sandbox state: brand · isolation posture (color-coded: green strict / cyan permissive / orange no-net-iso warning) · agent(s) on the left; workspace · client count · daemon|session marker · clock on the right. All read at tmux runtime from env forwarded by `docker run -e` (SANDY_EGRESS_MODE/SANDY_AGENT/SANDY_PROJECT_NAME/SANDY_DAEMON via #{E:}) plus native #{session_attached}. The window list is blanked — every sandy session is single-window (multi-agent splits into panes, not windows). #67 — inner Claude Code native statusLine. The tmux bar structurally can't show the model (it'd be the stale launch-time value) or the reasoning effort (no env surface for it). Claude Code's own statusLine gets both live on stdin, so sandy now bakes /usr/local/bin/sandy-claude-statusline (a jq one-liner → "<model> · effort: <level> · <pct>% ctx", effort omitted when the model doesn't support it, graceful `sandy` fallback on empty/malformed input) and points the generated settings.json `statusLine` at it — only if the user hasn't set their own (preserved via node's `!(k in s)` guard / jq's `//=` across all three seed branches; claude-gated, so other agents are untouched). - generate_tmux_conf(): new status-left/right + window-status blanking. - generate_dockerfile_base(): bake sandy-claude-statusline (jq present in base). - settings.json seed (node/jq/last-resort branches): statusLine, only-if-absent. - run-tests.sh §81 (20 structural + live-jq checks); SPEC Appendix A/C, CLAUDE.md "Status Lines", RELEASE_NOTES. Plan(fable)/implement(sonnet)/verify(opus 4.8) loop. The `⏻` glyph was dropped for plain color-differentiated daemon/session text (U+23FB font-coverage risk); `·`/`★` kept. Live tmux/Claude render is a maintainer host-confirm (both flagged items are fail-open cosmetic) — not runnable in CI. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #42, closes #67.
Two complementary status lines, each showing what it actually has live access to.
#42 — outer tmux bar (sandbox state)
Replaces the uninformative default-tmux window-list furniture with:
★ strict/ cyan★ permissive/ orange★ no-net-iso(a warning).docker run -e(#{E:SANDY_EGRESS_MODE}/SANDY_AGENT/SANDY_PROJECT_NAME/SANDY_DAEMON) + native#{session_attached}.#67 — inner Claude Code native statusLine (live model · effort · context)
The tmux bar structurally can't show the model (it'd be the stale launch-time value) or the reasoning effort (no env surface). Claude Code's own
statusLinegets both live on stdin, so sandy now:/usr/local/bin/sandy-claude-statusline(jq →Opus 4.8 · effort: high · 42% ctx; effort omitted when the model doesn't support it; gracefulsandyfallback on empty/malformed input),settings.jsonstatusLineat it — only if the user hasn't set their own (preserved via node's!(k in s)/ jq's//=across all three seed branches;claude-gated).Verification
bash -nclean; regen--checkclean (no new config key; changed regions outside the user-setup mirror); §81 (20 assertions) green standalone.⏻power glyph was dropped for plain color-differentiateddaemon/sessiontext (U+23FB font-coverage risk);·/★kept.Additive-only (1.3.0);
schema_versionstays 1; no new config key.🤖 Generated with Claude Code