@seanmozeik/ccsl
v0.2.0
Published
Powerline-style status line for Claude Code
Downloads
34
Maintainers
Readme
CCSL
Powerline-style status line for Claude Code. CCSL reads the JSON Claude Code sends on stdin and prints one row of segments.
Install
Requires Bun 1.4 or later.
bun add -g @seanmozeik/ccsl
ccsl installccsl install does two things:
- Writes
statusLinein~/.claude/settings.jsonso Claude Code runs this binary. - Seeds
~/.config/ccsl/ccsl.envif that file does not already exist.
If Claude Code already has a non-ccsl status line, or you want to replace an existing env file, pass --force:
ccsl install --forceClaude Code reloads settings on save. The next status-line refresh uses CCSL.
Uninstall
ccsl uninstallThat removes the Claude Code statusLine entry when it looks like CCSL, deletes ~/.config/ccsl/ccsl.env, and removes ~/.config/ccsl if the directory is empty. Other Claude Code settings stay put.
A custom (non-ccsl) status line is left alone unless you pass --force:
ccsl uninstall --forceUninstall does not remove the npm/Homebrew package. Uninstall the binary separately if you no longer want ccsl on PATH.
Help and version
ccsl -h
ccsl --help
ccsl -V
ccsl --version-h / --help prints usage for install, uninstall, and status-line flags. -V / --version prints the CCSL version and exits. Either flag wins over a subcommand, so ccsl install --help shows help instead of installing.
With no arguments, ccsl reads Claude Code JSON on stdin and prints the status line.
Configuration
Priority: CLI flags, then process environment, then ~/.config/ccsl/ccsl.env, then built-in defaults.
The default status-line style is pipes (foreground colors only, transparent background). powerline paints Catppuccin segment fills and arrows.
Seeded env (created by ccsl install):
CCSL_FIELDS="traffic-lights,directory,git,model,context,session,weekly,spend,cache,cost"Style is left unset so pipes stays the default. Copy comments and extra knobs from ccsl.env in this repo if you want a fuller file.
| Variable | Meaning |
| --------------------- | ------------------------------------------------------ |
| CCSL_FIELDS | Comma-separated segments, in order |
| CCSL_STYLE | pipes, simple, arrows, dots, or powerline |
| CCSL_NO_ICONS | true to use ASCII fallbacks |
| CCSL_NUMBERS | compact, full, or raw |
| CCSL_PERF_CACHE | Cache-hit thresholds (green,yellow,orange %) |
| CCSL_PERF_RESPONSE | Response-time thresholds (green,yellow,orange seconds) |
| CCSL_PROGRESS_WIDTH | Usage bar width |
| CCSL_DEBUG | true to log config/input on stderr |
| CCSL_WIDTH | Max columns (0 uses COLUMNS, -1 unlimited) |
| CCSL_PRIORITY | Truncation order when the line is too wide |
CLI flags match those names (--fields, --style, --no-icons, --debug, and so on).
Segments
| Field | Source |
| ---------------- | ------------------------------------------------------------------------ |
| traffic-lights | Prompt-cache hit ratio and response time |
| directory | workspace.current_dir (preferred) or cwd |
| git | git status; falls back to worktree.branch / workspace.git_worktree |
| model | Model display name |
| context | Context-window used % |
| session | 5-hour rate limit (rate_limits.five_hour) |
| weekly | 7-day rate limit (rate_limits.seven_day) |
| spend | Spend-limit % (Claude apps gateway only) |
| cache | Prompt-cache warm / hit ratio |
| effort | Reasoning effort |
| agent | Agent name |
| pr | Open pull request (#) or GitLab merge request (!) |
| duration | Session wall-clock time |
| session-name | Custom or generated session name |
| thinking | Extended thinking on |
| fast | Fast mode on |
| version | Claude Code version |
| cost | Estimated session USD (cost.total_cost_usd, list price) |
| lines | Lines added / removed |
| vim | Vim mode |
| over-limit | Over 200k tokens |
Segments that have no stdin data are omitted. spend stays hidden until a spend limit exists. cost is the current session estimate and resets on /clear; it is not a billed invoice.
Develop
bun install
bun test
bun run typecheck
bun run lint
bun run buildbun run start runs src/index.ts. Claude Code still has to invoke the built dist/ccsl.js (or ccsl install after a global install) for the status line.
