statusLine.refreshInterval re-runs the command but does not repaint the display
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code (2.1.109)
Summary
When statusLine.refreshInterval is configured, the statusline command is re-executed on the timer interval as expected. However, the terminal statusline area is not visually repainted when the script output changes — the new output is only rendered on the next user interaction event (e.g., sending a message or a tool call completing).
Steps to reproduce
- Configure a statusline command that reads the current
permissionModefrom the session transcript JSONL (e.g., viagrep '"permissionMode"' <transcript> | tail -1). - Set
"refreshInterval": 3insettings.json. - Press Shift+Tab to cycle through permission modes (default → plan → auto → etc.).
- Observe: the statusline label does not update within 3 seconds.
- Send any message — the statusline immediately shows the correct (new) mode.
Expected behavior
When refreshInterval fires and the script produces different output than the previous run, Claude Code should repaint the statusline area to reflect the new content — without requiring a user interaction.
Actual behavior
The statusline command is re-executed (confirmed via debug logging) but the terminal display is not updated until the next UI event.
Impact
Any statusline data that changes independently of user messages — such as permission mode changes via Shift+Tab, external process state, or time-based values — cannot be reflected in real time. The refreshInterval option exists specifically for this use case, so the missing repaint makes it largely ineffective.
Environment
- Claude Code version: 2.1.109
- Platform: Linux (Ubuntu)
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗