Status: experimental. The first skill on this language is
fleet-ops. New output-heavy skills should follow this guide and sourceskills/_lib/term.sh.
claude-mods ships ~70 skills, many of which write to a TTY (fleet-ops,
git-ops, push-gate, sync, ...). When you run five of them in one session
and each rolled its own glyphs and dividers, the toolkit feels like five
toolkits. This document is the forcing function: one palette, one helper
library, one shape.
TERM_ASCII=1, LANG without UTF-8, and TERM=dumb.NO_COLOR.
FORCE_COLOR=1 overrides for CI tooling that wants ANSI in logs.State icons. Use through term_state_icon when possible; the literals are
listed for cross-reference.
| Meaning | Unicode | ASCII | Color | Use for |
|---|---|---|---|---|
| pending | โณ | [.] |
yellow | running, queued, in-flight |
| ready | โ | [+] |
green | passed, ready to land |
| done | ๐ | [*] |
green | merged, shipped, terminal good |
| failed | โ | [x] |
red | tests failed, refused, blocked |
| warning | โ ๏ธ | [!] |
yellow | conflict, hygiene flag |
| hint | ๐ก | [i] |
cyan | suggestion, next-step pointer |
Don't introduce new state glyphs without adding them here and to
term_state_icon. Improvising glyphs is what got us here.
Use sparingly โ borders that wrap nothing waste lines.
| Role | Unicode | ASCII |
|---|---|---|
| horizontal | โ |
- |
| vertical | โ |
\| |
| corners | โ โ โ โ |
+ |
| connectors | โ โค โฌ โด โผ |
+ |
| tree branch | โโ โโ โ |
+- \- |` |
term_header and term_divider already pick the right glyph based on
TERM_ASCII_MODE. Reach for them before drawing your own boxes.
The default layout is rule + grouped tree: a horizontal-line "app header" on top, then items grouped by state with tree connectors. Flat tables are reserved for one-row-per-thing data where grouping would just add noise.
Always present. Title in cyan, trailing meta in dim. The rule extends to terminal width so the header reads as the section's banner.
โโ fleet โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 4 lanes ยท 3 active
State icon + group label + count, then children under tree connectors.
Empty groups are omitted โ never render a group with (0).
โโ fleet โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 4 lanes ยท 3 active
โณ RUNNING (2)
โโ feat/auth-rewrite 12m
โโ spike/wasm-eval 34m
โ
READY (1)
โโ fix/cache-bust 2m
๐ LANDED (1)
โโ chore/bump-deps 1h
Why grouped instead of flat: when ten lanes are in flight, scanning a flat table for "what's actually ready to land?" forces your eyes to do the filtering. Grouping does it for you, and the count tells you at a glance whether the answer is none, one, or twelve.
When the data is genuinely flat โ git status-style fields, a single
PR's checks โ drop the tree. Glyph-first, no nested tables.
โ
secret scan clean
โ
forbidden files none
โ divergence 3 ahead, 1 behind
For hierarchies that aren't keyed on state โ a directory tree, an include graph. Use sparingly; the grouped-tree above is preferred for state.
repo/
โโ main clean
โโ feat/auth-rewrite ahead 3, dirty
โโ fix/cache-bust behind 1
Plain rule between blocks. No title.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Dim, parenthesised, single line โ never a multi-line "nothing here" banner.
(no lanes โ run: fleet init <name>...)
Color is signal layered on top of glyph and label. Strip color and the output must still be readable.
| Color | Meaning |
|---|---|
| green | success, terminal-good (READY, LANDED) |
| yellow | pending or warning (RUNNING, CONFLICT) |
| red | failure (FAILED, refused) |
| cyan | section headers, hints |
| dim | metadata: timestamps, counts, hint text |
Disabled when stdout isn't a TTY, or NO_COLOR is set. Forced on with
FORCE_COLOR=1.
fleet-ops rolling its own (flat table, double rules)โโ Fleet โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
BRANCH STATUS AGE
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โณ feat/auth-rewrite RUNNING 12m
โ
fix/cache-bust READY 2m
๐ chore/bump-deps LANDED 1h
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโ fleet โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 3 lanes ยท 2 active
โณ RUNNING (1)
โโ feat/auth-rewrite 12m
โ
READY (1)
โโ fix/cache-bust 2m
๐ LANDED (1)
โโ chore/bump-deps 1h
The header rule survives โ it's the strongest visual cue that you're inside a skill's output. The flat table gives way to grouped state, so "what's ready" and "what's still running" answer themselves before you read a single branch name.
git-ops/status reformatted in the same languageโโ Repo โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ X:/Forge/claude-mods
branch claude/sleepy-johnson-74f19d
HEAD 367b062 fix(skills/fleet-ops): consistent .claude/ path (2h ago)
sync 0 ahead / 0 behind
tree 0 staged / 2 unstaged / 1 untracked
โ ๏ธ HYGIENE main checkout on 'claude/...' โ feature work belongs in worktrees
push-gate refusalโโ push-gate โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ refusing
โ secret scan 2 hits in src/config/keys.ts
โ
forbidden files none
โ
divergence clean
๐ก run: gitleaks detect --source . --no-git
--wide or auto-detect via tput cols.TERM=dumb. Check.(no lanes) beats a 4-line ASCII shrug.skills/_lib/term.sh is the single source of truth for glyphs, colors,
and layout helpers. Source it, call term_init, then use:
LIB="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../_lib" && pwd)"
. "$LIB/term.sh"
term_init
term_header "Fleet" "$count lanes"
term_table_row "$(term_state_icon READY)" "$branch" "READY" "$age"
term_empty "no lanes โ run: fleet init <name>..."
The helpers no-op gracefully under NO_COLOR, non-TTY, and TERM_ASCII=1.
That's the whole contract โ if you're reaching for raw \033[ codes in a
skill, you're off the path.