Left group keeps the where-am-I identity (host, path, git, pr); the right cluster carries what's-running (model) plus cost and elapsed time, painted in array order. context_pct verified to hoist into the inline meter spacer regardless of array position. Docs + changelog updated.
4.9 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | ||||
|---|---|---|---|---|---|---|---|---|
| reference | OMP Status Line Customization | How the omp status line actually works — presets vs custom arrays, composer-shape segment routing, the context meter, and the fleet's tuned segment layout. |
|
2026-10-18 |
OMP Status Line Customization
Ground truth from the installed bundle (@oh-my-pi/pi-coding-agent/dist/cli.js)
verified live on blankpad 2026-10-18. All knobs live in
agent/config.yml under statusLine: (tracked — see
Command Center repo); the file is file-watched, so edits
repaint a running session without restart (verify visually: niri screenshot,
see niri capture recipe).
Preset vs custom — the trap
statusLine.preset ships whole configurations (default, minimal,
compact, full, nerd, ascii, custom). leftSegments /
rightSegments / segmentOptions are only read when preset: custom —
with any named preset they are silently ignored. The fleet config runs
preset: custom.
Composer shape routes the segments
composer.shape decides where the two segment arrays render:
| shape | leftSegments | rightSegments |
|---|---|---|
band (fleet) |
merged single row above editor | same row, right side (title skipped — it rides the working row) |
claude |
bottom strip, left-aligned | top rule chip, right-aligned |
rule |
same as claude, gap above strip | same |
box |
box top border | box top border |
borderless / pi / field / rail |
single bottom bar | single bottom bar |
The ⠿ Working… row is hardcoded: shimmer text + composer.tokenRate readout
(+ session title in band only). Model/thinking-level can never join it
despite the settings description — that composer-bar behavior is Tern-only.
Segment universe (27)
pi, status, model, mode, path, git, pr, subagents,
token_in, token_out, token_total, token_rate, cost, context_pct,
context_total, time_spent, time, session, hostname, cache_read,
cache_write, cache_hit, session_name, usage, collab, stream, vim.
Conditional segments render nothing until their trigger exists: vim needs
tui.vimMode, mode needs plan/yolo, pr needs an associated PR, git shows
staged/unstaged/untracked badges (branch text optional via
segmentOptions.git.showBranch), status needs an extension push.
session = first 8 chars of the session id (resume-by-id handle).
The context meter
In the band shape (fleet) the meter is the labeled inline line between the
segment groups (60% ———— × 200K). In the claude shape the red rule left of
the right-segment chip is the meter: its length tracks context usage.
statusLine.contextLine (off / percentage / annotated / embedded)
only changes rendering in box/band — in claude all non-off values
look identical. Docs' claim that contextLine is "box composer only" is
wrong for the meter itself; the labeled inline variant is the box/band-only
part.
Path segment and stripWorkPrefix
segmentOptions.path.stripWorkPrefix (default true — the code tests
!== false) gates two behaviors in the path renderer:
- Worktree sessions:
truenever shows the disk path — it renders the logicalprojectName/worktreeNamelabel (bareprojectNamewhen the current branch is named after the worktree) with the worktree glyph.falseopts out and shows the real cwd with a folder glyph, plus a↳ relativeRepoRootsuffix inside a repo. Base-directory-only is not renderable in either mode. - All sessions:
trueuses the pretty display path (scratch sessions get the scratch-folder icon);falseuses the raw absolute cwd.
abbreviate and maxLength (clip, default 40) apply afterwards in both
modes. The fleet runs true — logical label, worktree glyph (verified live
2026-10-18; an earlier trial of false for the full cwd was rejected by eye).
Fleet configuration (2026-10-18)
- Shape
band: one merged status row. Left group:session_name,vim,mode,hostname,path,git(no branch text — worktree branches are autogenerated names),pr. Right group (array order = paint order, so the last entry hugs the screen edge):model,cost,context_pct,time_spent—context_pcthoists out of the run to paint the labeled inline meter (60% ——— × 200K) as a flexible spacer between the groups.session_namerenders on the working row, not the status row. - Deliberately cut:
token_rate(lives on the working row),time(panel clock),cache_*(noise),context_total(implied by the meter),subagents,session,token_in/token_out(cumulative totals are in/sessionanyway). - Model display names slimmed in
models.yml(frank-archon, no endpoint suffix);name:is free-form display,id:is the wiring — renaming ids is the cutover procedure, see Pi Models.