Agent skill

Tmck Code Statusline

by tmck-code in tmck-code/yet-another-statusline

Edit the Claude Code statusline renderer safely. An agent skill from tmck-code/yet-another-statusline.

BSD-3-ClauseAuto-check passedDevelopment

Install Tmck Code Statusline

skills CLI
$ npx skills add tmck-code/yet-another-statusline --skill tmck-code-statusline -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tmck-code/yet-another-statusline tmck-code-statusline --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tmck-code/yet-another-statusline.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/tmck-code-statusline .claude/skills/tmck-code-statusline && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tmck-code-statusline
GitHub stars
242
Token cost
~3k tokens
SKILL.md length
1,314 words
Files
2
Skills in repo
7
Repo updated
First seen
Licence
BSD-3-Clause

At a glance

Edit the Claude Code statusline renderer safely. An agent skill from tmck-code/yet-another-statusline.

  • Works in 4 steps: Read CONTEXT.md at repo root. The terms… → Catalogue PUA glyphs on touched lines.… → Baseline tests: make test (or uv run… → …
  • Touching claude/yas//.py (the yas package)
  • SKILL.md covers Architecture map, Pre-edit checklist, PUA refactor rule (mandatory… and Rendering invariants…, plus 3 more sections
  • Calls make, uv and python3

What it does

Tmck Code Statusline is an agent skill from tmck-code/yet-another-statusline. Edit the Claude Code statusline renderer safely. Use when touching claude/yas//.py (the yas package), claude/statuslinecommand.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, recordtick/TickRecord, Nerd Font PUA glyph hazards, border/elbow column math, and the demo-based visual check.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `ARCHITECTURE.md`).

It sits in Development. The repository describes itself as: A statusline for Claude Code inspired by terminal monitor programs. The licence is BSD-3-Clause.

When your agent uses it

  • Touching claude/yas//.py (the yas package)
  • Claude/statuslinecommand.py (the entry shim)
  • Related tests under test/

Example prompts

  • “/tmck-code-statusline”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Read CONTEXT.md at repo root. The terms Billed Input, Cache Read, Output, Day Total, Context Window Size, Compaction-Risk Zone, Five-Hour…
  2. Catalogue PUA glyphs on touched lines. Scan the package (glyphs can appear in any module, though most are hoisted into constants.py)
  3. Baseline tests: make test (or uv run pytest -q). Note pass count. On Android (Termux) uv run/make test is unavailable — activate the…
  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…

What it can do on your machine

Read from SKILL.md and the folder at commit 26dc47d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • make
    • uv
    • python3
    • pytest

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use uv, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tmck Code Statusline loads about 3k tokens when it runs. Until then it costs about 124 tokens; SKILL.md has 1,314 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~124
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from tmck-code/yet-another-statusline at commit 26dc47d, republished under its BSD-3-Clause licence (© tmck-code). 1,314 words, ~3,039 tokens.

Download SKILL.mdSave it as .claude/skills/tmck-code-statusline/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
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.

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 — 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.replaces, 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
Show full SKILL.md (582 more words)Show less
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)),
    ...
]

Every ┬ in a top border must line up with a │ in the row beneath it and a ┴ in the separator below — ups/downs are how you make that happen.

Gradient

grad_at(i, width, fill=...) returns the ANSI for column i of the rainbow border. Don't reorder the parts list when extending border helpers — the gradient is positional.

Layout-spec rules (layout.py)

  • A build_* function returns a fully-populated LayoutSpec. Don't push rendering side effects into it; only build RowSpecs.
  • New row types need: a new kind string, a branch in render_layout, and a BorderRenderer method (if it draws a border) or a Renderer section helper (if it's content).
  • Conditional rows: append to a local rows: list[RowSpec] and assign spec.rows = rows at the end. See build_wide for the canonical pattern with optional plugins_line, task_row, and openspec_bars.
  • When a row drops out (e.g., no plugins), the surrounding ups/downs need to be re-threaded — build_wide carries a next_ups/pending_ups local and a sep_kind helper for this. Don't try to "fix it up" inside render_layout.
  • Pill threading: when the pill is active, the row immediately under the top border uses pill_flush=True and an empty bg_lead; the surrounding top_border / separator_dim receive the same Pill object. When the pill is inactive, you fall back to bg_lead/bg_trail and elbow ups/downs.

Post-edit checklist

  1. make test (uv run pytest -q; on Android (Termux) use . ~/.uvenv/bin/activate && pytest -n 4 test/) — must be green. The pass count should match the baseline plus any tests you added.
  2. make demo — eyeball the animation:
    • Every ┬ in a top border lines up with a │ in the row beneath it and a ┴ in the separator below.
    • Pill colours flow continuously across the top, sides, and bottom of the model row.
    • Resize the terminal narrower/wider during the run to verify the narrow ↔ medium ↔ wide thresholds.
    • For an exact comparison, re-strip and diff against the baseline from the pre-edit step: make demo/img && .claude/skills/yas-demo-text/scripts/demo-text.sh && diff -ru /tmp/yas-base demo/text. Every moved cell shows up as a line diff — this catches off-by-one column bugs the eye misses across the 60-frame animation.
  3. Tests — any behaviour change needs a test added or updated. Tests resolve the package via pythonpath = ["claude"] and import modules as yas.<module> / yas.info.<module> / yas.render.<module>; conftest.py exposes a strip_ansi fixture (from test/helper.py) and a tmp_home fixture that patches CLAUDE_DIR across yas.app/yas.config/yas.constants/yas.session/yas.info.subagents/yas.tokens. Width-sensitive assertions go through _visible_width. Put new tests in the file that matches the layer touched: test_gradient_math.py, test_borders.py, test_model_section.py, test_context_line.py, test_openspec_bar.py, test_tokens_cost.py, test_config.py, test_layout_seam.py, test_subagent_rows.py/test_subagent_metrics.py/test_cohort_visibility.py (subagents), test_info.py (denominator math, _fmt_elapsed, laziness), etc. Layout tests inject a SessionView directly — construct one with a known SessionInfo and Config rather than calling the builders with raw reader data.
  4. CONTEXT.md — if any displayed term changed (label, glyph meaning, what a number represents), update the glossary in the same change.

Multi-session observer (claude/mon.py/claude/mon/) module map is in ARCHITECTURE.md. Launch it with make mon/run.

Sibling skills

python-style applies as usual when touching .py files. This skill adds the statusline-specific rules on top. After a render change, use yas-demo-text to turn make demo/img snapshots into ANSI-stripped plain text for a before/after diff (see the demo steps above) — the reliable way to confirm column math instead of eyeballing the coloured animation.

© tmck-code, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .claude/skills/tmck-code-statusline of tmck-code/yet-another-statusline.

  • SKILL.md
  • ARCHITECTURE.md

Open the folder on GitHubat commit 26dc47d

Compare with similar skills

Tmck Code Statusline next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tmck Code Statusline compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tmck Code Statusline this skilltmck-code/yet-another-statusline242—~3kAutomated safety check: PassBSD-3-Clause
Vercel Composition Patternssupabase/supabase111k59 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers296k5 repos~1.9kAutomated safety check: PassMIT
Typescript Advanced Typesrolling-scopes/rsschool-app10k25 repos~4.2kAutomated safety check: PassMPL-2.0
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k5 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 59 repos~726 tokens
    DevelopmentAuto-check passed
  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    296k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Typescript Advanced Types

    rolling-scopes/rsschool-app

    Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 5 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Greploop

    onyx-dot-app/onyx

    Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed

More from tmck-code/yet-another-statusline

  • Yas Demo Text

    tmck-code/yet-another-statusline

    Convert make demo/img statusline snapshots into ANSI-stripped plain text for diffing and PR embedding.

    242 GitHub stars~649 tokensUpdated 3 days ago
    Auto-check passed
  • Yas PR Screenshots

    tmck-code/yet-another-statusline

    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 table for the PR description.

    242 GitHub stars~1.2k tokensUpdated 3 days ago
    Auto-check passed
  • Uninstall

    tmck-code/yet-another-statusline

    Unwire yet-another-statusline from Claude Code — removes statusLine.command from settings.json in CLAUDECONFIGDIR (default ~/.claude/) and deletes the renderer's runtime state.

    242 GitHub stars~1.2k tokensUpdated 3 days ago
    Auto-check: notes
  • Yas PR

    tmck-code/yet-another-statusline

    Assemble a pull request that follows this repo's PR template, then open it as a draft.

    242 GitHub stars~1.1k tokensUpdated 3 days ago
    Auto-check passed
  • Config

    tmck-code/yet-another-statusline

    Reconfigure yet-another-statusline — re-runs the interactive install wizard (glyph mode, theme, labels, token soft-limit, and Python version) against the already-installed plugin and re-wires…

    242 GitHub stars~254 tokensUpdated 3 days ago
    Auto-check: notes
  • Init

    tmck-code/yet-another-statusline

    Wire yet-another-statusline into Claude Code — writes statusLine.command to settings.json in CLAUDECONFIGDIR (default ~/.claude/).

    242 GitHub stars~185 tokensUpdated 3 days ago
    Auto-check: notes

Categories

Questions about Tmck Code Statusline

What does Tmck Code Statusline do?

Edit the Claude Code statusline renderer safely. An agent skill from tmck-code/yet-another-statusline. Tmck Code Statusline is an agent skill from tmck-code/yet-another-statusline. Edit the Claude Code statusline renderer safely.

When should I use Tmck Code Statusline?

Tmck Code Statusline fits situations like: touching claude/yas//.py (the yas package); Claude/statuslinecommand.py (the entry shim); related tests under test/.

How do I install Tmck Code Statusline in Claude Code?

Run `npx skills add tmck-code/yet-another-statusline --skill tmck-code-statusline -a claude-code`. Or copy the skill folder (.claude/skills/tmck-code-statusline in tmck-code/yet-another-statusline) into .claude/skills/tmck-code-statusline in your project. Claude Code loads it when a task matches its description.

How do I install Tmck Code Statusline in Codex?

Run `npx skills add tmck-code/yet-another-statusline --skill tmck-code-statusline -a codex`. Or copy the skill folder (.claude/skills/tmck-code-statusline in tmck-code/yet-another-statusline) into .agents/skills/tmck-code-statusline in your project. Codex loads it when a task matches its description.

Can I use Tmck Code Statusline in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tmck-code/yet-another-statusline --skill tmck-code-statusline -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tmck-code-statusline, .gemini/skills/tmck-code-statusline, .github/skills/tmck-code-statusline and .opencode/skills/tmck-code-statusline in your project.

What does Tmck Code Statusline need to run?

Going by SKILL.md and its folder, Tmck Code Statusline needs the command-line tools its instructions call (make, uv, python3 and pytest). Our summary lists: Python 3.

Does Tmck Code Statusline access the network?

SKILL.md contains no URLs. Its commands use uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Tmck Code Statusline safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Tmck Code Statusline use?

Tmck Code Statusline is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tmck Code Statusline use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Tmck Code Statusline?

Skills that share tags, products or a category with Tmck Code Statusline: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 296k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tmck Code Statusline?

tmck-code (a GitHub user) maintains it in tmck-code/yet-another-statusline, which has 242 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 4, 2026.

Source: tmck-code/yet-another-statusline on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.