Status Line Generator
Generate a custom Claude Code status line script with your choice of columns and a color theme. Installs directly to ~/.claude/settings.json.
How It Works
Claude Code supports custom status lines via a shell script configured in ~/.claude/settings.json. The script receives session JSON on stdin (model, context window, workspace, vim, worktree, etc.) and prints formatted text to stdout.
This skill generates a bash script tailored to your preferences and installs it automatically.
Script Directory
Important: All scripts are located in the scripts/ subdirectory of this skill.
Agent Execution Instructions:
- Determine this SKILL.md file's directory path as
SKILL_DIR
- Script path =
${SKILL_DIR}/scripts/<script-name>.mjs
- Replace all
${SKILL_DIR} in this document with the actual path
Script Reference:
| Script |
Purpose |
scripts/generate.mjs |
Generate and install status line script from chosen options |
Prerequisites
- jq — required by the generated status line script to parse JSON input from Claude Code. On Windows, the script auto-detects jq installed via WinGet or scoop; if jq is still not found, add its directory to your PATH manually.
- Bun — required to run the generator. Use
npx -y bun if not installed globally.
Usage
# Preview generated script
npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements model,context,effort,git,dir --theme gruvbox
# Generate and install
npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements model,context,effort,git,dir --theme dracula --install
Options
| Flag |
Default |
Description |
--elements <list> |
model,context,cost,effort,style,git,dir |
Comma-separated columns to display |
--theme <name> |
gruvbox |
Color theme — see table below |
--effort-icon <preset> |
arrow (↯) for iconic themes, none otherwise |
Override the effort prefix icon. Presets: arrow, bolt, flash, reason, dot, none. A raw character is also accepted. |
--install |
off |
Write script to ~/.claude/scripts/statusline.sh and update settings.json |
Columns
| Column |
Description |
Data source |
model |
Active model name (e.g. "Opus 4.7") |
model.display_name |
context |
Progress bar + percentage — color changes with remaining capacity |
context_window.remaining_percentage |
cost |
Session API spend formatted as $X.XX in gold — hidden when rounds to $0.00 |
cost.total_cost_usd from input JSON |
effort |
Reasoning effort level — color changes with level |
effortLevel in ~/.claude/settings.local.json → ~/.claude/settings.json |
style |
Output style name (e.g. Explanatory, Learning) — hidden when "default" |
output_style.name from input JSON |
git |
Git branch name (yellow when dirty) |
worktree.branch → git CLI |
dir |
Repo basename (original repo when in a worktree) |
worktree.original_repo_dir → workspace.current_dir |
worktree |
Bold worktree:<id> label (hidden outside a worktree) |
worktree.name → parent-dir basename via git CLI |
vim |
Vim mode indicator (hidden when inactive) |
vim.mode |
Color-changing elements
context — bar fill + percentage color scale with remaining capacity:
| Remaining |
Color |
Meaning |
| > 50% |
green |
plenty of context |
| 20–50% |
yellow |
watch out |
| < 20% |
red |
nearly full — compact soon |
effort — value + optional prefix icon color by level:
| Level |
Color |
max, xhigh, high |
bold red |
medium |
yellow |
low, xlow, minimal |
green |
| other / unset |
dim (or hidden when completely unset) |
Themes
| Theme |
Vibe |
Icons rendered in bar |
gruvbox |
Warm retro, muted |
✦ model · ↯ effort · ❋ style · ⌂ dir · ⊕ worktree · ⎇ git · ⌨ vim |
dracula |
Modern dark, high saturation |
◈ model · ↯ effort · ❋ style · ⌂ dir · ⊕ worktree · ⎇ git · ⌨ vim |
robbyrussell |
Classic oh-my-zsh |
no prefix icons — colors + labels only |
minimal |
Default terminal colors |
no prefix icons — plain text |
The context column intentionally skips a prefix icon — the colored progress bar is already visually rich. The effort prefix (↯) is baked into iconic themes and can be overridden with --effort-icon.
Effort icons
Pass --effort-icon <preset> to swap the glyph in front of the effort value. Presets:
| Preset |
Glyph |
Notes |
arrow |
↯ |
Electric arrow — default, narrow |
bolt |
ϟ |
Greek koppa — narrow lightning |
flash |
⚡ |
Classic lightning — wide in emoji-presentation fonts |
reason |
∴ |
Therefore |
dot |
◉ |
Filled circle |
none |
(hidden) |
Drop the icon entirely |
You can also pass any raw character as --effort-icon <char>.
Worktree behavior: When inside a git worktree (detected via the input JSON's worktree.* fields or via git rev-parse --git-common-dir fallback), the worktree column shows a bold worktree:<id> label using the parent dir name (e.g. ~/.codex/worktrees/46a6/clawmaster → worktree:46a6). The git column prefers worktree.branch from the input JSON; the dir column prefers worktree.original_repo_dir so the repo identity stays stable across worktrees.
Invocation
This skill can be invoked with or without arguments:
- No args (
/webup-statusline): Interactive prompt via AskUserQuestion to pick columns and theme.
- With args (
/webup-statusline dracula): NLP parse for theme and column preferences.
Arg parsing (natural language)
The args string is free-form text. Use NLP to extract:
- theme — match against: gruvbox, robbyrussell, minimal, dracula. Recognize aliases (暗黑=dracula, 极简=minimal, 复古=gruvbox, レトロ=gruvbox).
- elements — look for mentions of: model, context/进度/コンテキスト, effort/推理强度/努力度, git/分支/ブランチ, dir/目录/ディレクトリ, worktree/工作树/ワークツリー, vim.
Unspecified fields use defaults: model,context,effort,git,dir columns, gruvbox theme.
Workflow
If no args provided: Use AskUserQuestion to ask 2 questions in a single prompt. AskUserQuestion caps each question at 4 options, so offer curated presets for columns rather than an exhaustive toggle list. If the user picks "Other", interpret their free text as a comma-separated column list (or a natural-language description that maps to one).
Q1 — Column preset (single): Which columns to display? Offer these 3 curated presets — AskUserQuestion will auto-append an "Other" option that lets the user type a free-text column list or description.
- "Everything (Recommended)" —
model,context,cost,effort,style,git,dir,worktree (all columns that have a useful signal today; vim is excluded because most users don't use vim keybindings)
- "Default" —
model,context,effort,style,git,dir (balanced — drops cost and worktree; matches the skill's default flag value)
- "Essentials" —
model,context,git,dir (lean; no effort, no style, no cost)
If the user picks the auto-added "Other", treat their free text as a comma-separated column list, or as a natural-language description to map to columns. Fall back to Default if parsing is ambiguous.
Q2 — Theme (single): Color theme?
- "Dracula" — modern dark, purple/pink/cyan (Recommended)
- "Gruvbox Dark" — warm retro palette, 24-bit true color
- "Robbyrussell" — classic oh-my-zsh style, no icons
- "Minimal" — no decoration, dim separators only
If args provided: Parse theme and columns from args. Skip the prompt.
Map user selections to script flags:
- Column preset → expand to the preset's canonical
--elements list:
Everything → model,context,cost,effort,style,git,dir,worktree
Default → model,context,effort,style,git,dir
Essentials → model,context,git,dir
Other (auto-added by AskUserQuestion) → parse the user's free text; keep only recognized column names (model,context,cost,effort,style,dir,worktree,git,vim). If parsing is ambiguous, fall back to Default.
- Theme →
--theme value (one of gruvbox, dracula, robbyrussell, minimal)
Run the generator with --install:
npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements <list> --theme <theme> --install
Tell user to restart Claude Code to see the new status line.
Output Examples
Dracula (all columns), remaining=49%, cost=$0.42, effort=high, output style=Explanatory, inside a worktree:
◈ Opus 4.7 | [■■■■■■■■■■□□□□□□□□□□] 51% | $0.42 | ↯ high | ❋ Explanatory | ⌂ clawmaster | ⊕ worktree:46a6 | ⎇ feat/xyz
(bar yellow — 49% remaining; $0.42 gold session spend next to the bar; effort "high" bold red; purple ❋ Explanatory sits between effort and dir; context carries no prefix icon — the bar is already visual enough)
Gruvbox Dark (model + context + effort + dir + git), remaining=88%, effort=medium:
✦ Opus 4.7 | [■■□□□□□□□□□□□□□□□□□□] 12% | ↯ medium | ⌂ skills-cc | ⎇ main
(bar green — 88% remaining; effort "medium" yellow)
Minimal (model + effort + dir + git), effort=low:
Claude Opus 4.7 · low · skills-cc · main
(no prefix icons in minimal; effort "low" green)
Notes
- Generated script is saved to
~/.claude/scripts/statusline.sh
- Running the skill again overwrites the existing script — just re-run to change theme or columns
- The script uses
jq to parse JSON input — make sure it's installed. On Windows, the script auto-detects WinGet and scoop jq paths; if jq is still not found, add it to PATH manually.
- Git dirty detection uses
--no-optional-locks to avoid interfering with other git operations
1---2name: webup-statusline3description: Generate and install a custom Claude Code status line with selectable columns (model, context, effort level, git, dir, worktree, vim) and a color theme. Context and effort elements color-change based on level. Triggers on "status line", "statusline", "customize status", "status bar", "effort level display", "状态栏", "ステータスライン", or similar.4---5
6# Status Line Generator
7
8Generate a custom Claude Code status line script with your choice of columns and a color theme. Installs directly to `~/.claude/settings.json`.
9
10## How It Works
11
12Claude Code supports custom status lines via a shell script configured in `~/.claude/settings.json`. The script receives session JSON on stdin (model, context window, workspace, vim, worktree, etc.) and prints formatted text to stdout.
13
14This skill generates a bash script tailored to your preferences and installs it automatically.
15
16## Script Directory
17
18**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
19
20**Agent Execution Instructions**:
211. Determine this SKILL.md file's directory path as `SKILL_DIR`
222. Script path = `${SKILL_DIR}/scripts/<script-name>.mjs`
233. Replace all `${SKILL_DIR}` in this document with the actual path
24
25**Script Reference**:
26| Script | Purpose |
27|--------|---------|
28| `scripts/generate.mjs` | Generate and install status line script from chosen options |
29
30## Prerequisites
31
32- **jq** — required by the generated status line script to parse JSON input from Claude Code. On Windows, the script auto-detects jq installed via WinGet or scoop; if jq is still not found, add its directory to your PATH manually.
33- **Bun** — required to run the generator. Use `npx -y bun` if not installed globally.
34
35## Usage
36
37```bash
38# Preview generated script
39npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements model,context,effort,git,dir --theme gruvbox
40
41# Generate and install
42npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements model,context,effort,git,dir --theme dracula --install
43```
44
45### Options
46
47| Flag | Default | Description |
48|------|---------|-------------|
49| `--elements <list>` | `model,context,cost,effort,style,git,dir` | Comma-separated columns to display |
50| `--theme <name>` | `gruvbox` | Color theme — see table below |
51| `--effort-icon <preset>` | `arrow` (`↯`) for iconic themes, none otherwise | Override the effort prefix icon. Presets: `arrow`, `bolt`, `flash`, `reason`, `dot`, `none`. A raw character is also accepted. |
52| `--install` | off | Write script to `~/.claude/scripts/statusline.sh` and update `settings.json` |
53
54### Columns
55
56| Column | Description | Data source |
57|--------|-------------|-------------|
58| `model` | Active model name (e.g. "Opus 4.7") | `model.display_name` |
59| `context` | Progress bar + percentage — **color changes with remaining capacity** | `context_window.remaining_percentage` |
60| `cost` | Session API spend formatted as `$X.XX` in gold — hidden when rounds to `$0.00` | `cost.total_cost_usd` from input JSON |
61| `effort` | Reasoning effort level — **color changes with level** | `effortLevel` in `~/.claude/settings.local.json` → `~/.claude/settings.json` |
62| `style` | Output style name (e.g. Explanatory, Learning) — hidden when "default" | `output_style.name` from input JSON |
63| `git` | Git branch name (yellow when dirty) | `worktree.branch` → git CLI |
64| `dir` | Repo basename (original repo when in a worktree) | `worktree.original_repo_dir` → `workspace.current_dir` |
65| `worktree` | Bold `worktree:<id>` label (hidden outside a worktree) | `worktree.name` → parent-dir basename via git CLI |
66| `vim` | Vim mode indicator (hidden when inactive) | `vim.mode` |
67
68### Color-changing elements
69
70**`context`** — bar fill + percentage color scale with remaining capacity:
71
72| Remaining | Color | Meaning |
73|-----------|-------|---------|
74| > 50% | green | plenty of context |
75| 20–50% | yellow | watch out |
76| < 20% | red | nearly full — compact soon |
77
78**`effort`** — value + optional prefix icon color by level:
79
80| Level | Color |
81|-------|-------|
82| `max`, `xhigh`, `high` | **bold red** |
83| `medium` | yellow |
84| `low`, `xlow`, `minimal` | green |
85| other / unset | dim (or hidden when completely unset) |
86
87### Themes
88
89| Theme | Vibe | Icons rendered in bar |
90|-------|------|------------------------|
91| `gruvbox` | Warm retro, muted | `✦` model · `↯` effort · `❋` style · `⌂` dir · `⊕` worktree · `⎇` git · `⌨` vim |
92| `dracula` | Modern dark, high saturation | `◈` model · `↯` effort · `❋` style · `⌂` dir · `⊕` worktree · `⎇` git · `⌨` vim |
93| `robbyrussell` | Classic oh-my-zsh | no prefix icons — colors + labels only |
94| `minimal` | Default terminal colors | no prefix icons — plain text |
95
96The `context` column intentionally skips a prefix icon — the colored progress bar is already visually rich. The `effort` prefix (`↯`) is baked into iconic themes and can be overridden with `--effort-icon`.
97
98### Effort icons
99
100Pass `--effort-icon <preset>` to swap the glyph in front of the effort value. Presets:
101
102| Preset | Glyph | Notes |
103|--------|-------|-------|
104| `arrow` | `↯` | Electric arrow — **default**, narrow |
105| `bolt` | `ϟ` | Greek koppa — narrow lightning |
106| `flash` | `⚡` | Classic lightning — wide in emoji-presentation fonts |
107| `reason`| `∴` | Therefore |
108| `dot` | `◉` | Filled circle |
109| `none` | (hidden) | Drop the icon entirely |
110
111You can also pass any raw character as `--effort-icon <char>`.
112
113**Worktree behavior**: When inside a git worktree (detected via the input JSON's `worktree.*` fields or via `git rev-parse --git-common-dir` fallback), the `worktree` column shows a bold `worktree:<id>` label using the parent dir name (e.g. `~/.codex/worktrees/46a6/clawmaster` → `worktree:46a6`). The `git` column prefers `worktree.branch` from the input JSON; the `dir` column prefers `worktree.original_repo_dir` so the repo identity stays stable across worktrees.
114
115## Invocation
116
117This skill can be invoked with or without arguments:
118
119- **No args** (`/webup-statusline`): Interactive prompt via `AskUserQuestion` to pick columns and theme.
120- **With args** (`/webup-statusline dracula`): NLP parse for theme and column preferences.
121
122### Arg parsing (natural language)
123
124The args string is free-form text. Use NLP to extract:
125
1261. **theme** — match against: gruvbox, robbyrussell, minimal, dracula. Recognize aliases (暗黑=dracula, 极简=minimal, 复古=gruvbox, レトロ=gruvbox).
1272. **elements** — look for mentions of: model, context/进度/コンテキスト, effort/推理强度/努力度, git/分支/ブランチ, dir/目录/ディレクトリ, worktree/工作树/ワークツリー, vim.
128
129Unspecified fields use defaults: `model,context,effort,git,dir` columns, `gruvbox` theme.
130
131## Workflow
132
1331. **If no args provided**: Use `AskUserQuestion` to ask 2 questions in a single prompt. `AskUserQuestion` caps each question at 4 options, so **offer curated presets for columns** rather than an exhaustive toggle list. If the user picks "Other", interpret their free text as a comma-separated column list (or a natural-language description that maps to one).
134
135 **Q1 — Column preset** (single): Which columns to display? Offer these 3 curated presets — `AskUserQuestion` will auto-append an "Other" option that lets the user type a free-text column list or description.
136 - "Everything (Recommended)" — `model,context,cost,effort,style,git,dir,worktree` (all columns that have a useful signal today; `vim` is excluded because most users don't use vim keybindings)
137 - "Default" — `model,context,effort,style,git,dir` (balanced — drops cost and worktree; matches the skill's default flag value)
138 - "Essentials" — `model,context,git,dir` (lean; no effort, no style, no cost)
139
140 If the user picks the auto-added "Other", treat their free text as a comma-separated column list, or as a natural-language description to map to columns. Fall back to `Default` if parsing is ambiguous.
141
142 **Q2 — Theme** (single): Color theme?
143 - "Dracula" — modern dark, purple/pink/cyan (Recommended)
144 - "Gruvbox Dark" — warm retro palette, 24-bit true color
145 - "Robbyrussell" — classic oh-my-zsh style, no icons
146 - "Minimal" — no decoration, dim separators only
147
148 **If args provided**: Parse theme and columns from args. Skip the prompt.
149
1502. Map user selections to script flags:
151 - Column preset → expand to the preset's canonical `--elements` list:
152 - `Everything` → `model,context,cost,effort,style,git,dir,worktree`
153 - `Default` → `model,context,effort,style,git,dir`
154 - `Essentials` → `model,context,git,dir`
155 - `Other` (auto-added by `AskUserQuestion`) → parse the user's free text; keep only recognized column names (`model,context,cost,effort,style,dir,worktree,git,vim`). If parsing is ambiguous, fall back to `Default`.
156 - Theme → `--theme` value (one of `gruvbox`, `dracula`, `robbyrussell`, `minimal`)
157
1583. Run the generator with `--install`:
159 ```bash
160 npx -y bun ${SKILL_DIR}/scripts/generate.mjs --elements <list> --theme <theme> --install
161 ```
162
1634. Tell user to restart Claude Code to see the new status line.
164
165## Output Examples
166
167**Dracula** (all columns), remaining=49%, cost=$0.42, effort=high, output style=Explanatory, inside a worktree:
168```
169◈ Opus 4.7 | [■■■■■■■■■■□□□□□□□□□□] 51% | $0.42 | ↯ high | ❋ Explanatory | ⌂ clawmaster | ⊕ worktree:46a6 | ⎇ feat/xyz
170```
171(bar yellow — 49% remaining; `$0.42` gold session spend next to the bar; effort "high" bold red; purple `❋ Explanatory` sits between effort and dir; context carries no prefix icon — the bar is already visual enough)
172
173**Gruvbox Dark** (model + context + effort + dir + git), remaining=88%, effort=medium:
174```
175✦ Opus 4.7 | [■■□□□□□□□□□□□□□□□□□□] 12% | ↯ medium | ⌂ skills-cc | ⎇ main
176```
177(bar green — 88% remaining; effort "medium" yellow)
178
179**Minimal** (model + effort + dir + git), effort=low:
180```
181Claude Opus 4.7 · low · skills-cc · main
182```
183(no prefix icons in minimal; effort "low" green)
184
185## Notes
186
187- Generated script is saved to `~/.claude/scripts/statusline.sh`
188- Running the skill again overwrites the existing script — just re-run to change theme or columns
189- The script uses `jq` to parse JSON input — make sure it's installed. On Windows, the script auto-detects WinGet and scoop jq paths; if jq is still not found, add it to PATH manually.
190- Git dirty detection uses `--no-optional-locks` to avoid interfering with other git operations