Move the profile switcher into the status line#52
Merged
Conversation
The profile tab strip spent a full terminal row on information that rarely changes, and its extra chrome row made every layout computation conditional on the profile count — the source of the multi-profile off-by-one where the help line was pushed off-screen and the row budget was derived from a tabless height. The profiles now render at the bottom right of the status line (active highlighted, others dimmed, unloaded marked with a dot, same switch keys), the title-line chip stays only for single-profile sessions, and MinTerminalHeight/VisibleRows lose their tabBar parameter entirely, so multi- and single-profile sessions share one geometry. Closes #45 Closes #38 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP
This was referenced Jul 19, 2026
The profile strip rendered every profile unbounded, and statusLine dropped the whole right side when it did not fit — with the title chip also suppressed in multi-profile mode, realistic profile sets on a 52-80 column terminal lost every indication of the active profile. profileStrip now takes a width budget: the active profile always renders, neighbors are added while they fit, and an ellipsis stands in for whatever is dropped from either end, mirroring the old tab bar's narrow-terminal behavior. statusLine computes the strip after its narrow-width early-out (no more discarded renders below 40 columns) and budgets it against the position text plus a minimum status-text allowance. Regression test replaces the coverage deleted with the tab bar; a stale tab-bar comment in the demo profile loader is updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP
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 #45. Closes #38.
The profile tab strip occupied the whole first row and made every layout computation conditional on the profile count — which is exactly what broke in #38 (
handleProfileListadded the tab bar without recomputingvisible/budget, hiding the help line and skewing the row budget by one).Instead of patching the recompute, this deletes the row:
·. Same tab/shift-tab switch keys.MinTerminalHeight/VisibleRowslose theirtabBarparameter andfixedChromeRowsWithTabis gone — multi- and single-profile sessions share one geometry, so the Multi-profile sessions render one row too many (help line hidden, budget off by one) #38 bug class no longer exists (net −102 lines).Verified with unit tests (updated:
TestMultiProfileViewUsesNoExtraRowasserts multi-profile geometry equalsVisibleRows) plus terminal runs:--democapture shows the strip bottom-right with the help line back on screen, and a two-profile z/OSMF fixture run confirms both profiles' list requests use the exact 2× budget for the reclaimed geometry (max-items=48at 120×30) and record reads stay in framed record mode (record-range=0,48).🤖 Generated with Claude Code
https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP