tmck-code-statusline
Edit the Claude Code statusline renderer safely.
Skill by tmck-code
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/tmck-code-tmck-code-statusline
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing, data, writing, agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/tmck-code-statusline
What's inside
- Skill name
tmck-code-statusline- Description
- Edit the Claude Code statusline renderer safely. Use when touching claude/yas/**/*.py (the yas package), claude/statusline_command.py (the entry shim), claude/mon.py, or related tests under test/. Covers the layered renderer (GradientEngine / BorderRenderer / Renderer), the SessionView gather seam (yas/info/__init__.py), the LayoutSpec/RowSpec layout pipeline, record_tick/TickRecord, Nerd Font PUA glyph hazards, border/elbow column math, and the demo-based visual check.
- License
- BSD-3-Clause
- Instructions
- 156 lines in SKILL.md · view on GitHub
Files (2)
- ARCHITECTURE.md
- SKILL.md
SKILL.md (first lines)
# Statusline
The statusline renderer is a single-pass terminal painter with hand-tuned column math. Most bugs here are silent — wrong by one column, invisible icon, dropped byte through an Edit round-trip. This skill exists to make those bugs loud.
## Architecture map
`claude/statusline_command.py` is a 4-line shim into the **`yas`** package under
`claude/yas/` (`app.py`/`layout.py`/`renderer.py`/… at top level, `info/` for
data sources, `render/` for pure painting/maths). Full per-module map, entry
points, and the "where to make a change" table live in
[`ARCHITECTURE.md`](ARCHITECTURE.md) — read it before adding a module, a data
source, or a new row/border/gradient kind; skip it for a same-module tweak.
## Pre-edit checklist
Run all four before editing:
1. **Read `CONTEXT.md`** at repo root. The terms Billed Input, Cache Read, Output, Day Total, Context Window Size, Compaction-Risk Zone, Five-Hour Limit, Seven-Day Limit are canonical — don't rename or alias them in code without a paired update.
2. **Catalogue PUA glyphs on touched lines.** Scan the package (glyphs can appear in any module, though most are hoisted into `constants.py`):
```bash
python3 -c "
import sys
for path in sys.argv[1:]:
for ln, line in enumerate(open(path), 1):
for c in line:
cp = ord(c)
if 0xE000 <= cp <= 0xF8FF or 0xF0000 <= cp <= 0xFFFFD:
print(f'{path}:{ln} U+{cp:05X} {c!r}')
" claude/yas/*.py claude/yas/info/*.py claude/yas/render/*.py
```
Any hit on a line you plan to Edit triggers the **PUA refactor rule** below.
3. **Baseline tests**: `make test` (or `uv run pytest -q`). Note pass count. **On Android (Termux)** `uv run`/`make test` is unavailable — activate the prebuilt venv and run pytest directly:
```bash
. ~/.uvenv/bin/activate
pytest -n 4 test/
```
4. **Baseline demo**: `make demo` (or `make statusline/test`, both run `uv run python ops/demo.py`). It animates 60 frames in place via cursor escapes; eyeball the final frame and the elbow alignment as it crosses layout thresholds (narrow → medium → wide on `$COLUMNS`). For static snapshot images, `make demo/img` (writes scenario PNGs into `demo/`, honours `COLUMNS=`). For a single piped frame when you need stdout, render one directly: `COLUMNS=160 uv run python claude/statusline_command.py < ops/session-info-example.json` (no transcript-derived rows; enough for border math). For a precise, diff-able baseline instead of eyeballing colour, capture the snapshots as ANSI-stripped text via the **yas-demo-text** skill: `make demo/img && .claude/skills/yas-demo-text/scripts/demo-text.sh && cp -r demo/text /tmp/yas-base`.
## PUA refactor rule (mandatory before editing)
Nerd Font icons in this repo live in the Unicode Private Use Area (U+E000–U+F8FF and U+F0000–U+FFFFD). Literal PUA glyphs in source are invisible in many editors, render as `□` in others, and **get dropped through chat/agent round-trips** — which makes `Edit.old_string` matching fail with a stale-looking "string to replace not found" error.
If a line you need to Edit contains a raw PUA glyph, **hoist the glyph to a named constant in `constants.py` first**, then Edit. No exceptions.
Convention (matches the existing block in `constants.py`):
```python
# Nerd Font Private Use Area glyphs. Encoded as escapes so Edit, diff, and
# chat round-trips never lose the bytes. Render only in a Nerd-Font-capable
# terminal.
ICON_COST = '\uefc8' # nf-md currency-usd (cost row)
ICON_TOK_RATE = '\U000f18a7' # nf-md gauge (t/m rate label)
GLYPH_MODEL = '\U000f08b9' # nf-md monitor-dashboard (model row)
GLYPH_THINKING = '\U000f1a53' # nf-md brain (thinking indicator)
```
Import the constant where needed (`from yas.constants import GLYPH_MODEL`) and reference it in f-strings: `f'{model_clr}{GLYPH_MODEL} {model_name}...'`. Note that `Renderer.ICON_PATH` holds a *colour code*, not a glyph — don't reuse that namespace for glyphs. New glyph constants go in `constants.py` alongside `ICON_COST`/`GLYPH_MODEL`.
Runtime cost is **zero** — `'\uefc8'` (in source) and the literal glyph compile to the identical `str` object; CPython interns and the `.pyc` cache eliminates parse cost after first load.
### Fallback when refactor isn't feasible mid-task
If the line has a PUA glyph and you genuinely can't refactor first (e.g., user is mid-edit and asked for one surgical change), use a Bash heredoc with `python3` that reads, `str.replace`s, and writes. Python preserves the bytes exactly:
```bash
python3 << 'PY'
path = 'claude/yas/renderer.py'
with open(path) as f:
s = f.read()
old = "...exact old text with raw glyph copied through Read...\n"
new = "...replacement...\n"
assert old in s, 'old not found'
with open(path, 'w') as f:
f.write(s.replace(old, new, 1))
PY
```
This works because `Read` preserves the bytes when it loads them into your context, even when subsequent `Edit` calls can't transmit them through `old_string`.
## Rendering invariants (silent-bug cheat-sheet)
These are the things pytest won't catch — get them wrong and the box draws crooked.
### Width math
- **Never** use `len()` for column math. Use `_visible_width` (`render/text.py`) — it strips ANSI escapes via `_ANSI_RE` (`constants.py`) and counts wide chars (BMP emoji `0x1F300–0x1FAFF`) as 2.
- Nerd Font PUA chars count as width 1. Correct in a Nerd-Font terminal; would be wrong elsewhere, but elsewhere isn't supported.
### Column indexing on borders (`render/borders.py`)
- `border_top(width, session_id='', downs=..., fill=..., pill=...)`, `border_separator(width, ups=...)`, `border_separator_dim(width, downs=..., ups=..., pill=..., pill_edge=...)`, `border_bottom(width, ups=...)` take **1-indexed visual positions** of the inline `│` they should attach an elbow to. Live on `BorderRenderer`; `Renderer` has matching delegators.
- `border_line(content, width, fill=..., bg_lead='', bg_trail='', pill_flush=False, right_pill='')` wraps content as `│ <content>...│`. Content starts at visual column 2, which is **col-form 3** (1-indexed). `right_pill` paints a pill segment flush to the right edge.
- A `Pill` passed to `border_top` / `border_separator_dim` paints itself across `[pill.start, pill.end]` using `border_char(col, edge)` instead of the default top/separator glyph. `pill_edge='top'` is used when the pill sits *below* the separator.
### vsep convention
The vertical divider inside a content row is the 5-char string `' │ '` (two spaces, pipe, two spaces). The `│` sits at vsep-index 2.
```python
vsep = f' {self.BORDER}│{self.R} ' # visible width 5; │ at offset 2
```
### Section helpers that participate in dividers return `(line, div_offset)`
When a section contributes a `│` that should grow elbows on the surrounding borders, the helper returns `(line, div_offset)` where `div_offset` is the **0-indexed visible position of the `│` inside `line`**. Examples: `model_section_compact`, `model_right_section`, `tokens_cost` (which returns `(lines, vsep_cols, …)`).
Caller (a `build_*` function) converts to a border col and threads it into `RowSpec.downs` / `RowSpec.ups`:
```python
# Standalone row:
model_div_col = 3 + model_div_offset
# Inside a combined row whose own divider sits at top_div_col:
model_div_col = top_div_col + 3 + model_div_offset
rows = [
RowSpec('top_border', downs=(top_div_col, model_div_col)),
RowSpec('content', content=combined_line, bg_trail=bg_trail),
RowSpec('separator_dim', ups=(top_div_col, model_div_col)),From tmck-code/yet-another-statusline, BSD-3-Clause.
More from tmck-code/yet-another-statusline
- 0.753score
yas-pr-screenshots
tmck-code
Generate before/after PNG screenshots for a YAS branch's rendering changes, push them to the yas-pr-screenshots repo, and hand back a markdown before/after…
SkillBFreshness: B★ 244Claude Code +9 - 0.747score
uninstall
tmck-code
Unwire yet-another-statusline from Claude Code — removes statusLine.command from settings.json in CLAUDE_CONFIG_DIR (default ~/.claude/) and deletes the…
SkillBFreshness: B★ 244Claude Code +9 - 0.695score
yas-demo-text
tmck-code
Convert `make demo/img` statusline snapshots into ANSI-stripped plain text for diffing and PR embedding.
SkillCFreshness: C★ 244Claude Code +9 - 0.690score
yas-pr
tmck-code
Assemble a pull request that follows this repo's PR template, then open it as a draft.
SkillCFreshness: C★ 244Claude Code +9 - 0.690score
config
tmck-code
Reconfigure yet-another-statusline — re-runs the interactive install wizard (glyph mode, theme, labels, token soft-limit, and Python version) against the…
SkillCFreshness: C★ 244Claude Code +9 - 0.680score
init
tmck-code
Wire yet-another-statusline into Claude Code — writes statusLine.command to settings.json in CLAUDE_CONFIG_DIR (default ~/.claude/).
SkillCFreshness: C★ 244Claude Code +9
Signals
- Stars
- 244
- Forks
- 26
- Open issues
- 3
- Last commit (this folder)
- Jul 26, 2026 (3 months ago)
- Last release
- Jul 17, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- BSD-3-Clause
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from tmck-code
- 0.753score
yas-pr-screenshots
tmck-code
Generate before/after PNG screenshots for a YAS branch's rendering changes, push them to the yas-pr-screenshots repo, and hand back a markdown before/after…
SkillBFreshness: B★ 244Claude Code +9 - 0.747score
uninstall
tmck-code
Unwire yet-another-statusline from Claude Code — removes statusLine.command from settings.json in CLAUDE_CONFIG_DIR (default ~/.claude/) and deletes the…
SkillBFreshness: B★ 244Claude Code +9 - 0.695score
yas-demo-text
tmck-code
Convert `make demo/img` statusline snapshots into ANSI-stripped plain text for diffing and PR embedding.
SkillCFreshness: C★ 244Claude Code +9 - 0.690score
yas-pr
tmck-code
Assemble a pull request that follows this repo's PR template, then open it as a draft.
SkillCFreshness: C★ 244Claude Code +9 - 0.690score
config
tmck-code
Reconfigure yet-another-statusline — re-runs the interactive install wizard (glyph mode, theme, labels, token soft-limit, and Python version) against the…
SkillCFreshness: C★ 244Claude Code +9 - 0.680score
init
tmck-code
Wire yet-another-statusline into Claude Code — writes statusLine.command to settings.json in CLAUDE_CONFIG_DIR (default ~/.claude/).
SkillCFreshness: C★ 244Claude Code +9
Cite this page
tmck-code-statusline skill. Agent Mart. https://agentmart.dev/skills/tmck-code-tmck-code-statusline (last updated 2026-10-24)