Status Line Wizard
Set up a custom status line for Claude Code with visual progress bars and configurable display options.
Instructions
CRITICAL: This command MUST NOT accept any arguments. If the user provided any text after this command, COMPLETELY IGNORE it.
Invoke the ai-statusline:statusline-setup skill and follow its workflow to:
-
Detect the operating system (Mac/Linux/Windows)
-
Check for existing statusLine configuration and offer to back up if present
-
Run the configuration wizard using AskUserQuestion to gather preferences
-
Create the appropriate script file (.sh for Mac/Linux, .ps1 for Windows)
-
Update ~/.claude/settings.json with the statusLine configuration
-
Make the script executable on Mac/Linux using chmod +x
Wizard Questions
Use AskUserQuestion with these grouped questions:
Question 1 - Context Display (multiSelect: true):
-
Token count (50k/100k) - default selected
-
Progress bar - default selected
-
Model name - default selected
Question 2 - Project Display (multiSelect: true):
-
Current directory - default selected
-
Git branch - default selected
Question 3 - Session Display (multiSelect: true):
-
Session duration - default selected
-
Current time - default selected
-
Claude Code version - default selected
-
Session cost - NOT selected by default
Success Message
After successful setup, display:
Status line configured successfully!
Script: ~/.claude/statusline.sh (or .ps1) Settings: ~/.claude/settings.json
You should see your new status line below!
To customize later, run /statusline-edit or edit the SHOW_* variables at the top of the script file.
Status Line Setup Skill
This skill provides guidance for configuring Claude Code's status line with customizable display options, progress bars, and cross-platform support.
When to Use This Skill
Invoke this skill when:
-
Setting up a custom status line for Claude Code
-
Configuring which elements to show/hide in the status line
-
Adding a visual progress bar for context usage
-
Setting up cross-platform status line scripts (bash/PowerShell)
Setup Workflow
Phase 1: Check Existing Configuration
-
Detect the operating system using Bash: uname -s (returns "Darwin" for macOS, "Linux" for Linux)
-
If command fails or returns "MINGW"/"MSYS"/"CYGWIN", assume Windows
-
Read the user's settings file:
-
Mac/Linux: ~/.claude/settings.json
-
Windows: C:/Users/USERNAME/.claude/settings.json (get USERNAME from environment)
-
Check if statusLine section already exists
-
If exists, ask user using AskUserQuestion:
-
Replace: Back up existing file and create new configuration
-
Cancel: Stop the setup process
Phase 2: Configuration Wizard
Use the AskUserQuestion tool to gather user preferences. Group questions logically:
Question 1: Context Information
-
Show model name (default: yes)
-
Show token count e.g. "50k/100k" (default: yes)
-
Show progress bar (default: yes)
Question 2: Project Information
-
Show current directory (default: yes)
-
Show git branch (default: yes)
Question 3: Session Information
-
Show session cost (default: no)
-
Show session duration (default: yes)
-
Show current time (default: yes)
-
Show Claude Code version (default: yes)
Phase 3: Create Script File
Based on OS, create the appropriate script file:
Mac/Linux: ~/.claude/statusline.sh
Windows: C:/Users/USERNAME/.claude/statusline.ps1
If script file already exists, back it up first with .backup extension.
Phase 4: Update Settings
Update the settings.json file with the statusLine configuration:
Mac/Linux:
{ "statusLine": { "type": "command", "command": "/Users/USERNAME/.claude/statusline.sh", "padding": 0 } }
Windows:
{ "statusLine": { "type": "command", "command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:/Users/USERNAME/.claude/statusline.ps1", "padding": 0 } }
Phase 5: Make Executable (Mac/Linux only)
Run chmod +x ~/.claude/statusline.sh to make the script executable.
Script Templates
Bash Script Template (Mac/Linux)
#!/bin/bash
=============================================================================
Claude Code Status Line
=============================================================================
Configuration - Set these to customize your status line
=============================================================================
SHOW_MODEL=true # Show model name (e.g., "Claude Opus 4.5") SHOW_TOKEN_COUNT=true # Show token usage count (e.g., "50k/100k") SHOW_PROGRESS_BAR=true # Show visual progress bar SHOW_DIRECTORY=true # Show current directory name SHOW_GIT_BRANCH=true # Show current git branch SHOW_COST=false # Show session cost (useful for API/Pro users) SHOW_DURATION=true # Show session duration SHOW_TIME=true # Show current time SHOW_VERSION=true # Show Claude Code version
=============================================================================
input=$(cat) model_name=$(echo "$input" | jq -r '.model.display_name') current_dir=$(basename "$(echo "$input" | jq -r '.workspace.current_dir')") version=$(echo "$input" | jq -r '.version') usage=$(echo "$input" | jq '.context_window.current_usage') cost=$(echo "$input" | jq -r '.cost.total_cost_usd') duration_ms=$(echo "$input" | jq -r '.cost.total_duration_ms') current_time=$(date +"%I:%M%p" | tr '[:upper:]' '[:lower:]')
Format cost
if [ "$cost" != "null" ] && [ -n "$cost" ]; then cost_fmt=$(printf '$%.2f' "$cost") else cost_fmt='$0.00' fi
Format duration (ms to human readable)
if [ "$duration_ms" != "null" ] && [ -n "$duration_ms" ]; then duration_s=$((duration_ms / 1000)) if [ $duration_s -lt 60 ]; then duration_fmt="${duration_s}s" elif [ $duration_s -lt 3600 ]; then mins=$((duration_s / 60)) secs=$((duration_s % 60)) duration_fmt="${mins}m ${secs}s" else hours=$((duration_s / 3600)) mins=$(((duration_s % 3600) / 60)) duration_fmt="${hours}h ${mins}m" fi else duration_fmt='0s' fi
Get git branch
git_branch=$(git -C "$(echo "$input" | jq -r '.workspace.current_dir')" branch --show-current 2>/dev/null) if [ -z "$git_branch" ]; then git_branch='-' fi
Build progress bar
build_progress_bar() { local pct=$1 local color=$2 local bar_width=10 local filled=$((pct * bar_width / 100)) local empty=$((bar_width - filled))
local bar="" for ((i=0; i<filled; i++)); do bar+="▓"; done for ((i=0; i<empty; i++)); do bar+="░"; done
printf '\033[%sm%s %d%%\033[0m' "$color" "$bar" "$pct" }
ANSI color codes
reset='\033[0m' white='\033[97m' green='\033[32m' yellow='\033[33m' red='\033[31m' blue='\033[94m' magenta='\033[35m' cyan='\033[36m' gray='\033[90m'
Build output segments
output=""
Model name
if [ "$SHOW_MODEL" = true ]; then output="${white}${model_name}${reset}" fi
Token count and progress bar
if [ "$usage" != "null" ]; then current=$(echo "$usage" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens') size=$(echo "$input" | jq '.context_window.context_window_size') pct=$((current * 100 / size)) current_k=$((current / 1000)) size_k=$((size / 1000))
if [ $pct -lt 70 ]; then color='32' elif [ $pct -lt 80 ]; then color='33' else color='31' fi
if [ "$SHOW_TOKEN_COUNT" = true ] || [ "$SHOW_PROGRESS_BAR" = true ]; then [ -n "$output" ] && output="$output · "
if [ "$SHOW_TOKEN_COUNT" = true ]; then
output="$output\033[${color}m${current_k}k/${size_k}k\033[0m"
fi
if [ "$SHOW_PROGRESS_BAR" = true ]; then
progress_bar=$(build_progress_bar "$pct" "$color")
[ "$SHOW_TOKEN_COUNT" = true ] && output="$output "
output="$output${progress_bar}"
fi
fi else if [ "$SHOW_TOKEN_COUNT" = true ] || [ "$SHOW_PROGRESS_BAR" = true ]; then [ -n "$output" ] && output="$output · " if [ "$SHOW_TOKEN_COUNT" = true ]; then output="$output${green}0k/0k${reset}" fi if [ "$SHOW_PROGRESS_BAR" = true ]; then progress_bar=$(build_progress_bar 0 '32') [ "$SHOW_TOKEN_COUNT" = true ] && output="$output " output="$output${progress_bar}" fi fi fi
Directory
if [ "$SHOW_DIRECTORY" = true ]; then [ -n "$output" ] && output="$output · " output="$output${blue}${current_dir}${reset}" fi
Git branch
if [ "$SHOW_GIT_BRANCH" = true ]; then [ -n "$output" ] && output="$output · " output="$output${magenta}${git_branch}${reset}" fi
Cost
if [ "$SHOW_COST" = true ]; then [ -n "$output" ] && output="$output · " output="$output${yellow}${cost_fmt}${reset}" fi
Duration
if [ "$SHOW_DURATION" = true ]; then [ -n "$output" ] && output="$output · " output="$output${cyan}${duration_fmt}${reset}" fi
Time
if [ "$SHOW_TIME" = true ]; then [ -n "$output" ] && output="$output · " output="$output${white}${current_time}${reset}" fi
Version
if [ "$SHOW_VERSION" = true ]; then [ -n "$output" ] && output="$output · " output="$output${gray}v${version}${reset}" fi
printf '%b' "$output"
PowerShell Script Template (Windows)
=============================================================================
Claude Code Status Line (PowerShell)
=============================================================================
Configuration - Set these to customize your status line
=============================================================================
$SHOW_MODEL = $true # Show model name (e.g., "Claude Opus 4.5") $SHOW_TOKEN_COUNT = $true # Show token usage count (e.g., "50k/100k") $SHOW_PROGRESS_BAR = $true # Show visual progress bar $SHOW_DIRECTORY = $true # Show current directory name $SHOW_GIT_BRANCH = $true # Show current git branch $SHOW_COST = $false # Show session cost (useful for API/Pro users) $SHOW_DURATION = $true # Show session duration $SHOW_TIME = $true # Show current time $SHOW_VERSION = $true # Show Claude Code version
=============================================================================
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Read JSON from stdin
$inputJson = [System.Console]::In.ReadToEnd() $data = $inputJson | ConvertFrom-Json
$model_name = $data.model.display_name $current_dir = Split-Path -Leaf "$($data.workspace.current_dir)" $version = $data.version $usage = $data.context_window.current_usage $cost = $data.cost.total_cost_usd $duration_ms = $data.cost.total_duration_ms $current_time = (Get-Date -Format "h:mmtt").ToLower()
Format cost
if ($null -ne $cost) { $cost_fmt = '$' + ('{0:F2}' -f $cost) } else { $cost_fmt = '$0.00' }
Format duration (ms to human readable)
if ($null -ne $duration_ms) { $duration_s = [math]::Floor($duration_ms / 1000) if ($duration_s -lt 60) { $duration_fmt = "${duration_s}s" } elseif ($duration_s -lt 3600) { $mins = [math]::Floor($duration_s / 60) $secs = $duration_s % 60 $duration_fmt = "${mins}m ${secs}s" } else { $hours = [math]::Floor($duration_s / 3600) $mins = [math]::Floor(($duration_s % 3600) / 60) $duration_fmt = "${hours}h ${mins}m" } } else { $duration_fmt = '0s' }
Get git branch
$git_branch = try { git -C "$($data.workspace.current_dir)" branch --show-current 2>$null } catch { $null } if ([string]::IsNullOrEmpty($git_branch)) { $git_branch = '-' }
ANSI color codes
$esc = [char]27 $reset = "$esc[0m" $white = "$esc[97m" $cyan = "$esc[36m" $green = "$esc[32m" $yellow = "$esc[33m" $red = "$esc[31m" $blue = "$esc[94m" $magenta = "$esc[35m" $gray = "$esc[90m"
Build progress bar
function Build-ProgressBar { param ( [int]$Percent, [string]$Color ) $bar_width = 10 $filled = [math]::Floor($Percent * $bar_width / 100) $empty = $bar_width - $filled
$bar = ([string][char]0x2593) * $filled + ([string][char]0x2591) * $empty
return "$Color$bar $Percent%$reset"
}
Build output segments
$segments = @()
Model name
if ($SHOW_MODEL) { $segments += "$white$model_name$reset" }
Token count and progress bar
if ($null -ne $usage) { $current = $usage.input_tokens + $usage.cache_creation_input_tokens + $usage.cache_read_input_tokens $size = $data.context_window.context_window_size $pct = [math]::Floor($current * 100 / $size) $current_k = [math]::Floor($current / 1000) $size_k = [math]::Floor($size / 1000)
if ($pct -lt 70) {
$token_color = $green
} elseif ($pct -lt 80) {
$token_color = $yellow
} else {
$token_color = $red
}
$token_segment = ""
if ($SHOW_TOKEN_COUNT) {
$token_segment = "$token_color${current_k}k/${size_k}k$reset"
}
if ($SHOW_PROGRESS_BAR) {
$progress_bar = Build-ProgressBar -Percent $pct -Color $token_color
if ($SHOW_TOKEN_COUNT) {
$token_segment += " $progress_bar"
} else {
$token_segment = $progress_bar
}
}
if ($token_segment) {
$segments += $token_segment
}
} else { $token_segment = "" if ($SHOW_TOKEN_COUNT) { $token_segment = "${green}0k/0k$reset" } if ($SHOW_PROGRESS_BAR) { $progress_bar = Build-ProgressBar -Percent 0 -Color $green if ($SHOW_TOKEN_COUNT) { $token_segment += " $progress_bar" } else { $token_segment = $progress_bar } } if ($token_segment) { $segments += $token_segment } }
Directory
if ($SHOW_DIRECTORY) { $segments += "$blue$current_dir$reset" }
Git branch
if ($SHOW_GIT_BRANCH) { $segments += "$magenta$git_branch$reset" }
Cost
if ($SHOW_COST) { $segments += "$yellow$cost_fmt$reset" }
Duration
if ($SHOW_DURATION) { $segments += "$cyan$duration_fmt$reset" }
Time
if ($SHOW_TIME) { $segments += "$white$current_time$reset" }
Version
if ($SHOW_VERSION) { $segments += "${gray}v$version$reset" }
$sep = " " + [char]0x00B7 + " " Write-Host -NoNewline ($segments -join $sep)
Configuration Variables
Variable Default Description
SHOW_MODEL true Display model name (e.g., "Claude Opus 4.5")
SHOW_TOKEN_COUNT true Display token usage (e.g., "50k/100k")
SHOW_PROGRESS_BAR true Display visual progress bar with percentage
SHOW_DIRECTORY true Display current working directory name
SHOW_GIT_BRANCH true Display current git branch
SHOW_COST false Display session cost in USD
SHOW_DURATION true Display session duration
SHOW_TIME true Display current time
SHOW_VERSION true Display Claude Code version
Important Notes
-
The scripts require jq to be installed on Mac/Linux for JSON parsing
-
PowerShell scripts work on Windows PowerShell 5.1+ and PowerShell Core 7+
-
Unicode progress bar characters should work on modern terminals
-
Colors use ANSI escape codes which work on most modern terminals
-
Status line updates appear immediately after setup