Diagnosing
One command answers every question about why the bar looks the way it does.
claude-status --doctor
That is the whole troubleshooting story. It reports which config layers loaded and which are simply absent, how Claude Code is wired, the layout in effect, what git resolved, a live spend fetch with each of the four gates, and a sample render.
It is also a modifier: add it to any other surface and it narrates to stderr
while leaving stdout byte-for-byte unchanged. --statusline --doctor gives you
the same bar and an explanation of it.
This flag was called
--debug. Both of its jobs moved together, and the old spelling is no longer recognised as either one. Run--debugnow and the binary names it as an unrecognised argument on stderr and prints the help after it — the bar, and the exit code, are unchanged. Change it wherever you have it written down,~/.claude/settings.jsonincluded.
Your access token never appears on either stream.
Colour
The report is coloured by health: green is working, yellow is absent-but-fine or something you wrote that the binary ignored, red is actively failing. Most lines are neither and stay plain — you should be able to find the red without reading the words.
A config layer that is simply absent is not yellow. Running with no config file anywhere is a supported state, and the bar renders from the defaults compiled into the binary; there is nothing to attend to. A layer goes red only when a file is there and contributed nothing.
Colour appears only when the stream is a terminal, so
claude-status --doctor > report.txt and … | grep stay clean — worth knowing
before you paste a report into an issue. Setting NO_COLOR to any non-empty
value turns it off everywhere.
--version, --caps-hook and --subagent are never coloured under any
circumstances. Those are read by machines, and a decoration there is a broken
build or a corrupted payload.
What it prints
An illustrative report, assembled to show every section at once — the layer
paths are shortened to ~/… for width, and the ignored row only appears when
a repo config actually carries a key beyond projectName. Your own output
prints fully expanded absolute paths:
claude-status 0.1.0
CONFIG LAYERS (low to high)
embedded loaded <embedded>
user using defaults ~/.config/claude-status/config.json (no file)
repo loaded /path/to/repo/.config/claude-status.json
ignored caps — a repo layer may set projectName only
CLAUDE WIRING (~/.claude/settings.json)
~/.claude/settings.json does not exist — run --configure to create it
EFFECTIVE LAYOUT
line 0: model, context, rl5h, rl7d, spend, cost
line 1: project, worktree, branch
GIT
cwd: /path/to/repo
root: /path/to/repo
project: github acme/widget (/path/to/repo)
branch: main
worktree: <none>
ahead: false
dirty: +4 -0
SPEND
cache ~/.cache/claude-status/spend.json
MISSING — first run
backoff none
lock free
creds NONE — checked ~/.claude/.credentials.json and keychain "Claude Code-credentials"
fetch GET https://api.anthropic.com/api/oauth/usage
not attempted
gate 1 spend present in lines ✓
gate 2 data present ✗ HIDDEN
gate 3 enabled=?, limitMinor=? — not reached
gate 4 show=auto, plan=<none> — not reached
VERDICT no credentials — neither ~/.claude/.credentials.json nor keychain
"Claude Code-credentials" yielded a token. Log in with Claude Code,
then re-run.
SAMPLE RENDER
<the two lines, drawn with sample figures>Reading it
using defaults is not an error. A layer that has no file is the normal
case for both the user and the repo layer, and the line says using defaults
rather than warning about it. A layer that exists but could not be read says so
differently — that is the one to look at.
ignored names dropped keys. Only the repo layer can produce these, and it
means exactly what it says: the key was thrown away. See
Per-repo.
EFFECTIVE LAYOUT is what will actually draw, after all three layers have
merged. If a segment you configured is not in this list, the problem is your
lines, not the segment.
GIT is resolved from the filesystem, so root: <none> means you are not
inside a repository — and the project, worktree and branch segments will
all sit out, which drops the second row entirely.
The four gates run in order and stop at the first that hides the segment.
gate 4 show=auto, plan=pro is the common answer for “where is my spend
segment” and it is working correctly; see Configure.
SAMPLE RENDER uses sample figures for the session — the model, context,
rate limits and cost are fixed values, not your live session. The git facts and
the project name in it are real, because those come from where you are standing.
Agent teams and the subagent panel
The subagent panel is drawn a row at a time: Claude Code hands
claude-status --subagent the rows it wants drawn and draws every other row
itself. It only hands over subagents — never teammates.
With agent teams on — CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS set, or
--agent-teams — an agent started with a name becomes a teammate rather than
a subagent. Its row reaches claude-status at no point, so it keeps Claude
Code’s own look whatever your config says, and --doctor has nothing to report
about it.
To have every agent drawn, turn agent teams off. Remove the key from the
env block of ~/.claude/settings.json, or set it to "0":
{
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "0"
}
}
Then start a new session. The cost is the teams themselves: without them, a named agent is an ordinary subagent that finishes its task and reports back, rather than a teammate you can keep sending work to.
This is Claude Code’s choice, observed in 2.1.290, not something claude-status
can change — if a later release starts handing teammate rows over, they will be
drawn like any other.
Common answers
| Symptom | Usually |
|---|---|
| No bar at all | --configure has not been run, or the binary is not on your PATH by name |
| Tofu boxes instead of separators | the terminal font is not a Nerd Font |
| Flat colours, no gradient | the terminal is not in 24-bit colour mode |
| Second row missing | you are not inside a git repository |
| Wrong project name or glyph | projectName is set somewhere — see Per-repo — or origin is not where you expect; GIT’s project: row says which |
No spend segment | gate 4 on a Pro or Max seat, which is intended |
| A segment silently absent | typo in its id — the note is on stderr |
| Some subagent rows look plain | they are teammates — agent teams is on; see above |
Reporting something
If --doctor does not explain it,
open an issue and paste its
output. It is designed to be pasteable — no token appears on either stream, and
SAMPLE RENDER carries sample figures rather than your session’s. Do glance
over it first, though: GIT, CONFIG LAYERS and SPEND all print absolute
paths, so your home directory and the name of whatever you were working on go
with it.