








基于 claude-hud 项目改造,调整了配色(莫兰迪色系)并增加了 API 模式支持。原项目也可以直接使用。
状态栏显示在 Claude Code 终端底部,实时展示项目、Git、模型、费用和配额信息。
订阅模式(Claude Pro/Team 订阅用户):
➜ my-app git:(main) ✗ | ctx:45% | Opus 4.6 | $1.23/$5.67 (订阅) | 周:$42 | 月:$180 | 5h:32%@14:30 | 7d:15%@2.3d
API 模式(自建 API 或第三方中转):
➜ my-app git:(main) ✗ | ctx:45% | Opus 4.6 | $1.23/$5.67 (api.openai.com) | 周:$42 | 月:$180
| 段 | 含义 | 示例 |
|---|---|---|
➜ my-app git:(main) ✗ |
当前目录 + Git 分支 + 未提交更改标记 | 无更改时不显示 ✗ |
ctx:45% |
上下文窗口已用百分比 | ≥90% 变黄色警告 |
Opus 4.6 |
实际使用的模型(从 transcript 末尾读取) | 而非配置的模型 |
$1.23/$5.67 (订阅) |
今日 项目费用/总费用 + 来源标签 | API 模式显示域名 |
周:$42 |
本周累计费用 | 两种模式 |
月:$180 |
本月累计费用 | 两种模式 |
5h:32%@14:30 |
5小时配额使用率 + 重置时间 | 仅订阅模式 |
7d:15%@2.3d |
7天配额使用率 + 剩余天数 | 仅订阅模式 |
脚本通过 ANTHROPIC_BASE_URL 环境变量自动判断模式:
ccusage daily、ccusage weekly、ccusage monthly 获取(基于本地 transcript 文件,与模式无关)Claude Code-credentials)或 ~/.claude/.credentials.json 读取 OAuth token,调用 https://api.anthropic.com/api/oauth/usage 获取 5 小时和 7 天配额使用率费用标签自动提取 ANTHROPIC_BASE_URL 的域名部分显示,例如:
ANTHROPIC_BASE_URL=https://api.openai.com/v1 → 显示 (api.openai.com)ANTHROPIC_BASE_URL=https://my-proxy.com/anthropic → 显示 (my-proxy.com)Bun — TypeScript 运行时(必需)
curl -fsSL https://bun.sh/install | bash
ccusage(可选)— Claude Code 费用统计工具
npm install -g ccusage
未安装时费用相关段不显示,不影响其他功能。
从 Gist 下载 statusline.ts 到 ~/.claude/statusline.ts:
curl -fsSL https://gist.githubusercontent.com/hangox/09cdf644683f7301973d4b48b63a329d/raw/statusline.ts -o ~/.claude/statusline.ts
在 ~/.claude/settings.json 中添加:
{
"statusLine": {
"type": "command",
"command": "/bin/sh -c 'PATH=\"$HOME/.bun/bin:$PATH\" bun \"$HOME/.claude/statusline.ts\"'"
}
}
用
/bin/sh -c包裹是为了将 bun 加入 PATH,避免 Claude Code 内部环境找不到 bun。
配置后重启即可生效。
Claude Code 在每次刷新状态栏时,通过 stdin 传入 JSON:
{
"cwd": "/path/to/project",
"transcript_path": "/path/to/transcript.jsonl",
"model": { "id": "claude-opus-4-6", "display_name": "Opus 4.6" },
"context_window": {
"context_window_size": 200000,
"used_percentage": 45.2,
"current_usage": { "input_tokens": 50000, "output_tokens": 10000 }
}
}
脚本不直接使用 stdin 中的 model 字段,而是读取 transcript_path 文件末尾 8KB,从最后一条 assistant 类型消息中提取实际使用的模型 ID,再通过内置映射表转为友好名称(如 claude-opus-4-6 → Opus 4.6)。
main()
│
├── 1. readStdin() ← 读取 stdin JSON
│
├── 2. Promise.all([...]) ← 并行执行以下四项:
│ ├── getDailyData() ← ccusage daily(spawnSync,立即完成)
│ ├── getOAuthQuota() ← Anthropic API(真正异步 fetch,仅订阅模式)
│ ├── getWeeklyCost() ← ccusage weekly(spawnSync,两种模式)
│ └── getMonthlyCost() ← ccusage monthly(spawnSync,两种模式)
│
└── 3. getGitInfo() ← git 命令(同步,在 Promise.all 之后执行)
注意:daily/weekly/monthly 使用
spawnSync同步执行,用Promise.resolve()包裹后放入Promise.all并不能真正并行。实际的并行效果仅体现在 OAuth fetch(真正异步)与同步调用之间。所有spawnSync调用单次超时 5 秒。
为避免频繁调用外部命令,脚本在 /tmp/ 下维护缓存文件:
| 缓存文件 | 有效期 | 数据 | 适用模式 |
|---|---|---|---|
cl_status_today.txt |
60s | 今日费用(项目+总计) | 两种 |
cl_status_weekly.txt |
300s | 本周费用 | 两种 |
cl_status_monthly.txt |
600s | 本月费用 | 两种 |
cl_status_oauth.txt |
180s | OAuth 5h/7d 配额 | 仅订阅 |
缓存过期后自动重新获取;外部命令失败时静默跳过,不影响其他段显示。OAuth 请求失败(含 429 限流)时写入空占位缓存 {},避免在缓存有效期内反复重试。
const c 对象中的 ANSI 颜色码(支持 RGB,如莫兰迪色系)MODEL_DISPLAY 对象添加新模型main() 中增删 segments.push(...) 调用readCache() 第二个参数(秒)segments.join(" | ") 中的分隔字符串此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。