token-tracker 0.4.2__tar.gz → 0.4.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {token_tracker-0.4.2/src/token_tracker.egg-info → token_tracker-0.4.4}/PKG-INFO +62 -72
  2. token_tracker-0.4.4/README.md +180 -0
  3. {token_tracker-0.4.2 → token_tracker-0.4.4}/pyproject.toml +1 -1
  4. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/hooks.py +5 -2
  5. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/i18n.py +4 -8
  6. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/format.py +0 -14
  7. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/status.py +2 -5
  8. {token_tracker-0.4.2 → token_tracker-0.4.4/src/token_tracker.egg-info}/PKG-INFO +62 -72
  9. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_aggregator.py +0 -11
  10. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_hooks.py +13 -0
  11. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_status.py +6 -8
  12. token_tracker-0.4.2/README.md +0 -190
  13. {token_tracker-0.4.2 → token_tracker-0.4.4}/LICENSE +0 -0
  14. {token_tracker-0.4.2 → token_tracker-0.4.4}/setup.cfg +0 -0
  15. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/__init__.py +0 -0
  16. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/__init__.py +0 -0
  17. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/claude.py +0 -0
  18. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/codex.py +0 -0
  19. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/rate_limits.py +0 -0
  20. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/registry.py +0 -0
  21. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/types.py +0 -0
  22. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/util.py +0 -0
  23. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/__init__.py +0 -0
  24. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/aggregator.py +0 -0
  25. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/blocks.py +0 -0
  26. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/cost.py +0 -0
  27. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/cli.py +0 -0
  28. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/config.py +0 -0
  29. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/__init__.py +0 -0
  30. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/console.py +0 -0
  31. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/heatmap.py +0 -0
  32. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/panels.py +0 -0
  33. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/tables.py +0 -0
  34. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/theme.py +0 -0
  35. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/themes.py +0 -0
  36. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/wizard.py +0 -0
  37. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/SOURCES.txt +0 -0
  38. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/dependency_links.txt +0 -0
  39. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/entry_points.txt +0 -0
  40. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/requires.txt +0 -0
  41. {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/top_level.txt +0 -0
  42. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_blocks.py +0 -0
  43. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_cli.py +0 -0
  44. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_codex.py +0 -0
  45. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_cost.py +0 -0
  46. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_heatmap.py +0 -0
  47. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_tables.py +0 -0
  48. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_theme.py +0 -0
  49. {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: token-tracker
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: Track token usage across local AI agents (Claude Code, Codex)
5
5
  Author-email: stormzhang <stormzhang.dev@gmail.com>
6
6
  License: MIT License
@@ -61,15 +61,32 @@ Dynamic: license-file
61
61
 
62
62
  [English](README_EN.md)
63
63
 
64
+ ![Token Tracker Daily](assets/screenshot-daily.png)
65
+
66
+ ## 功能亮点
67
+
68
+ - **多 Agent 统一追踪** — Claude Code + Codex 统一读取,多 Agent 按来源分组
69
+ - **状态栏集成** — Claude Code 用官方 StatusLine 接口;**Codex 业界首创伪 statusline 方案**(hook 注入两行真彩色状态栏,把官方未开放的能力在 Codex 里做了出来)
70
+ - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
71
+ - **多维成本分析** — 会话 / 日 / 周 / 月多维报表,等效成本统计
72
+ - **定价识别** — litellm 在线定价 + 内置官方价双层兜底,覆盖 Claude / OpenAI / Gemini / Grok 及国产主流(Kimi / GLM / Qwen / 豆包 / DeepSeek / MiniMax / MiMo);新模型自动套用同系列定价、不静默归零
73
+ - **会话洞察** — 项目、模型、时长、消息数一览
74
+ - **多主题统一配色** — 6 套主题(Catppuccin 全家 + Nord + Dracula),CLI 报表 / CC 状态栏 / Codex 伪 statusline **三者同源**,`tt theme` 一键切换
75
+ - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
76
+ - **隐私安全** — 数据纯本地存储,不采集、不上传
77
+
64
78
  ## StatusLine 状态栏
65
79
 
66
- 自动为 Claude Code 和 Codex 配置状态栏,`tt setup` 一键配置,脚本更新时自动升级。
80
+ `tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
81
+
82
+ ### Claude Code(官方接口)
67
83
 
68
- **Claude Code**:基于官方自定义 StatusLine 接口,数据完全来自本地 Claude,准确无任何推测
84
+ 基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
69
85
 
70
86
  ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
71
87
 
72
- 状态栏共四行,从左到右:
88
+ <details>
89
+ <summary>四行布局字段详解</summary>
73
90
 
74
91
  | 行 | 字段 | 说明 |
75
92
  |----|------|------|
@@ -88,44 +105,38 @@ Dynamic: license-file
88
105
 
89
106
  > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
90
107
 
91
- **Codex**:官方暂不支持自定义 StatusLine,`tt setup` 通过 Codex `Stop` hook 装一个**伪 statusline**——每次回答完成后在回答尾部追加**两行**彩色 status,仿 Claude Code 状态栏(不再接管 Codex 官方 `status_line`,伪 statusline 信息比官方字段更全):
108
+ </details>
109
+
110
+ ### Codex(伪 statusline,业界首创)
111
+
112
+ Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
92
113
 
93
114
  ![Codex StatusLine](assets/screenshot-statusline-codex.png)
94
115
 
95
- **伪 statusline 两行布局**:
116
+ **两行布局**:
96
117
 
97
118
  - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
98
119
  - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
99
120
 
100
- 通过 `Stop` hook 注入 `systemMessage` 实现,渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
121
+ 渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
101
122
 
102
- ## Daily 概览和 日/周/月 数据报表分析
123
+ ## 报表速览
103
124
 
104
- `tt`(无参)/ `tt daily`:默认入口,GitHub 风格 token 贡献热力图 + 顶部**单一卡片**内拼三段概览(**Last 12 months / This Month / This Week**,粗→细)。
105
- - Last 12 months:橙色 Tokens / Cost / Sessions / Avg/Cost / 活跃天数 + 蓝色 单日峰值 / 当前·最长连续活跃天数
106
- - This Month / This Week:橙色 Tokens / Cost / Avg/Cost / 活跃天数,**带环比**(↑/↓ 上月 / 上周)
125
+ `tt status` 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
107
126
 
108
- `tt status`:聚焦**过去 5 小时**的实时面板——顶部多 Agent **合并**概览(Token / Cost / Sessions / Messages / Top Model),中间 **5h / 7d 订阅额度**进度条(Claude Code / Codex 分开;都没订阅额度时换成 per-agent 的 token/cost/sessions/messages 统计),底部**近期会话**列表(CC + Codex 合并、带 Agent 列、按 Cost 倒序、Cost 前三名高亮)。所有时间按**系统时区**显示,配色跟随当前主题。
127
+ ![Status](assets/screenshot.png)
109
128
 
110
- ![Token Tracker Daily](assets/screenshot-daily.png)
129
+ `tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
111
130
 
112
- ![Token Tracker Status](assets/screenshot.png)
131
+ ![Weekly](assets/screenshot-weekly.png)
113
132
 
114
- ![Token Tracker Weekly](assets/screenshot-weekly.png)
133
+ `tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
115
134
 
116
- ![Token Tracker Monthly](assets/screenshot-monthly.png)
135
+ ![Monthly](assets/screenshot-monthly.png)
117
136
 
118
- ## 功能
137
+ `tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
119
138
 
120
- - **多 Agent 追踪** — Claude Code + Codex 统一面板,左右键切换
121
- - **状态栏集成** — Claude Code statusLine + Codex status_line,首次运行自动配置,脚本更新自动升级
122
- - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
123
- - **成本分析** — 按会话、日、周、月维度的等效成本统计,多 Agent 按来源分组展示
124
- - **定价识别** — litellm 在线定价 + 内置官方价双层兜底;同系列新模型自动套用本档定价(含 Claude Fable 5 / Opus 4.8),全新系列缺价时明确提示,不静默按 $0 统计
125
- - **会话洞察** — 项目、模型、时长、消息数一览
126
- - **多主题统一配色** — 6 套主题(Catppuccin Mocha/Latte/Frappe/Macchiato + Nord + Dracula),CLI 报表、CC 状态栏与 Codex 伪 statusline **三者同源**;`tt theme` 一键切换 / 预览,暗 / 亮终端自动选 Catppuccin,首次运行交互向导引导选择,`TT_THEME` 可覆盖;终端不支持 truecolor 时自动降级到 256 色近似
127
- - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
128
- - **隐私安全** — 数据纯本地存储,不采集、不上传任何用户信息,极轻量无后顾之忧
139
+ ![Sessions](assets/screenshot-sessions.png)
129
140
 
130
141
  ## 安装
131
142
 
@@ -136,38 +147,31 @@ curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/instal
136
147
  脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
137
148
 
138
149
  > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
139
- > **卸载**:先 `tt unsetup` 还原状态栏,再按装法移除(`uv tool uninstall token-tracker` / `pipx uninstall token-tracker` / 删 `~/.local/share/token-tracker` 与 `~/.local/bin/tt`)。
150
+ > **卸载**:`tt unsetup`
140
151
 
141
152
  ## 使用
142
153
 
143
154
  ```bash
144
155
  tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
145
- tt # 过去一年 token 热力图 + 顶部三段概览(Last 12 months / This Month / This Week,= tt daily)
156
+ tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
146
157
  tt daily # 同上(tt 无参即进 daily)
147
- tt status # 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
148
- tt weekly # 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
149
- tt monthly # 按月汇总(多 Agent 分组展示)
150
- tt sessions # 最近 20 条会话明细(按 cost 倒序展示;tt sessions <n> 改条数、--sort 改排序)
158
+ tt status # 过去 5h 实时面板
159
+ tt weekly # 周报
160
+ tt monthly # 月报
161
+ tt sessions # 最近 20 条会话明细(tt sessions <n> 改条数、--sort 改排序)
151
162
  tt theme # 查看 / 切换配色主题(show / list / set / preview)
152
163
  tt unsetup # 卸载并恢复安装前的配置
164
+ tt --version # 查看版本(-v / -V 同义)
153
165
  ```
154
166
 
155
167
  > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
156
168
 
157
- ### 首次运行向导
158
-
159
- 第一次跑 `tt`(或通过 curl 一键安装脚本装完自动启动)会进入**交互式配置向导**,全程上下键选 + 回车确认:
160
-
161
- 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`,之后所有命令跟随)
162
- 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
163
- 3. **启用 Codex 伪 statusline** — Yes/No,默认 Yes(仅检测到 Codex 时)
164
-
165
- 选完给一份键值对齐的配置总结 + 重启 / 下一步提示。CI / 非 tty 环境(Docker / 脚本)自动按默认全装:**语言跟随系统设置**(读系统语言、不被 CLI 的 `LANG` 误导)、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可(终端里每次 `tt setup` 都进向导)。
166
-
167
- ### 配色主题
169
+ ## 配色主题
168
170
 
169
171
  内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
170
172
 
173
+ ![支持的主题](assets/screenshot-themes.png)
174
+
171
175
  | 主题 | 说明 |
172
176
  |------|------|
173
177
  | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
@@ -182,9 +186,20 @@ tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
182
186
  tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
183
187
  ```
184
188
 
185
- - **首次运行**(终端内、非 AI 会话)会进入交互向导引导选主题;CI / 脚本 / 会话内自动跳过、静默用默认。
186
- - 切换持久化到 `~/.config/token-tracker/config.json`(主题 + 语言 + 组件意图统一存这一个文件);优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动(`--theme` 和 `TT_THEME` 都只临时生效、不写配置)。
187
- - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到当前主题的 **256 色近似**,8 色老终端不再适配。
189
+ - 切换持久化到 `~/.config/token-tracker/config.json`;优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动。
190
+ - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到 **256 色近似**。
191
+
192
+ ## 高级
193
+
194
+ ### 首次运行向导
195
+
196
+ 第一次跑 `tt`(或在独立终端跑 `tt setup`)会进入**交互式配置向导**,全程上下键选 + 回车确认:
197
+
198
+ 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`)
199
+ 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
200
+ 3. **启用 Codex 伪 statusline** — Yes/No(仅检测到 Codex 时)
201
+
202
+ CI / 非 tty 环境(Docker / 脚本 / `curl|bash`)自动按默认全装:**语言跟随系统设置**、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可。
188
203
 
189
204
  ### 报告排序
190
205
 
@@ -197,17 +212,6 @@ tt sessions --sort tokens --asc # 按 token 升序
197
212
 
198
213
  可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
199
214
 
200
- ### Dashboard 快捷键
201
-
202
- | 按键 | 功能 |
203
- |------|------|
204
- | `←` `→` | 切换 Agent |
205
- | `↑` `↓` | 滚动内容 |
206
- | `s` | 切换排序字段(时间 → Token → 等效成本 → 消息数) |
207
- | `r` | 反转排序方向 |
208
- | `+` / `-` | 调整会话显示条数(±10,最少 10 条) |
209
- | `q` | 退出 |
210
-
211
215
  ## 数据来源
212
216
 
213
217
  | Agent | 路径 | 格式 |
@@ -215,7 +219,7 @@ tt sessions --sort tokens --asc # 按 token 升序
215
219
  | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
216
220
  | Codex | `~/.codex/sessions/` | JSONL + SQLite |
217
221
 
218
- 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`(如 `C:\Users\xxx\.claude`)。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
222
+ 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
219
223
 
220
224
  Token Tracker 对 Agent 数据**只读**,不做任何修改。
221
225
 
@@ -224,20 +228,6 @@ Token Tracker 对 Agent 数据**只读**,不做任何修改。
224
228
  - Python 3.11+
225
229
  - [Rich](https://github.com/Textualize/rich)(自动安装)
226
230
 
227
- ## 开发
228
-
229
- ```bash
230
- git clone https://github.com/stormzhang/token-tracker && cd token-tracker
231
- uv run --extra dev pytest # 运行测试
232
- uv run --extra dev ruff check src tests # Lint
233
- ```
234
-
235
- 包采用标准 src layout(`src/token_tracker/`):发行名 `token-tracker`,导入名 `token_tracker`(0.4.0 起)。
236
-
237
- ## TODO
238
-
239
- 未来持续增加更多数据报表,多维度分析。
240
-
241
231
  ## License
242
232
 
243
233
  Copyright (c) 2026 stormzhang. MIT License.
@@ -0,0 +1,180 @@
1
+ # Token Tracker (tt)
2
+
3
+ 本地 AI Agent Token 消耗追踪/分析工具,支持 **Claude Code** 和 **Codex** 。
4
+
5
+ 自定义 StatusLine 状态栏 + CLI Dashboard,实时查看 token 用量、等效成本、限额状态。
6
+
7
+ ![Python](https://img.shields.io/badge/python-3.11+-blue) ![CI](https://github.com/stormzhang/token-tracker/actions/workflows/ci.yml/badge.svg) ![License](https://img.shields.io/badge/license-MIT-green)
8
+
9
+ [English](README_EN.md)
10
+
11
+ ![Token Tracker Daily](assets/screenshot-daily.png)
12
+
13
+ ## 功能亮点
14
+
15
+ - **多 Agent 统一追踪** — Claude Code + Codex 统一读取,多 Agent 按来源分组
16
+ - **状态栏集成** — Claude Code 用官方 StatusLine 接口;**Codex 业界首创伪 statusline 方案**(hook 注入两行真彩色状态栏,把官方未开放的能力在 Codex 里做了出来)
17
+ - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
18
+ - **多维成本分析** — 会话 / 日 / 周 / 月多维报表,等效成本统计
19
+ - **定价识别** — litellm 在线定价 + 内置官方价双层兜底,覆盖 Claude / OpenAI / Gemini / Grok 及国产主流(Kimi / GLM / Qwen / 豆包 / DeepSeek / MiniMax / MiMo);新模型自动套用同系列定价、不静默归零
20
+ - **会话洞察** — 项目、模型、时长、消息数一览
21
+ - **多主题统一配色** — 6 套主题(Catppuccin 全家 + Nord + Dracula),CLI 报表 / CC 状态栏 / Codex 伪 statusline **三者同源**,`tt theme` 一键切换
22
+ - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
23
+ - **隐私安全** — 数据纯本地存储,不采集、不上传
24
+
25
+ ## StatusLine 状态栏
26
+
27
+ `tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
28
+
29
+ ### Claude Code(官方接口)
30
+
31
+ 基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
32
+
33
+ ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
34
+
35
+ <details>
36
+ <summary>四行布局字段详解</summary>
37
+
38
+ | 行 | 字段 | 说明 |
39
+ |----|------|------|
40
+ | 1 | `[项目](分支 +12 -3)` | 项目名(加粗)+ Git 分支(未提交修改标 `*`),括号内附工作区相对 HEAD 的增删行数 |
41
+ | 1 | `Total: 1.2M` | 本次会话累计消耗 token(输入+输出+cache,解析 transcript 得出) |
42
+ | 1 | `Cost: $35.51` | 本次会话等效成本(Claude Code 自带,按官方计费,准确) |
43
+ | 1 | `Code: +208 -8` | 本会话 Claude 写 / 删的代码行数(`+` 绿 `-` 红,与 git 变动同配色) |
44
+ | 2 | `Limit: 5h: ██░ 31% (1h19m)` | 5 小时滑动窗口配额(仅订阅模式;括号内重置倒计时) |
45
+ | 2 | `7d: ██░ 11% (5d8h)` | 7 天滑动窗口配额 |
46
+ | 2 | `1.0M Ctx: ██░ 20%` | 上下文窗口总大小及已用占比 |
47
+ | 3 | `Tokens: in 392k, out 937, cache 388k` | **当前上下文窗口**的 token 构成(注意:非会话累计,会随 compact 变化) |
48
+ | 3 | `Out TPS: 60 tokens/s` | 本轮 output token 生成速度(含 thinking;空闲帧保留上次值) |
49
+ | 4 | `Model: Opus 4.8/xhigh/nofast` | 模型名 / reasoning 级别 / 是否 fast 模式 |
50
+ | 4 | `Duration: 1h33m` | 当前会话已持续时间 |
51
+ | 4 | `Remote: github` | 代码仓库 host(去顶级域) |
52
+
53
+ > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
54
+
55
+ </details>
56
+
57
+ ### Codex(伪 statusline,业界首创)
58
+
59
+ Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
60
+
61
+ ![Codex StatusLine](assets/screenshot-statusline-codex.png)
62
+
63
+ **两行布局**:
64
+
65
+ - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
66
+ - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
67
+
68
+ 渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
69
+
70
+ ## 报表速览
71
+
72
+ `tt status` — 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
73
+
74
+ ![Status](assets/screenshot.png)
75
+
76
+ `tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
77
+
78
+ ![Weekly](assets/screenshot-weekly.png)
79
+
80
+ `tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
81
+
82
+ ![Monthly](assets/screenshot-monthly.png)
83
+
84
+ `tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
85
+
86
+ ![Sessions](assets/screenshot-sessions.png)
87
+
88
+ ## 安装
89
+
90
+ ```bash
91
+ curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/install.sh | bash
92
+ ```
93
+
94
+ 脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
95
+
96
+ > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
97
+ > **卸载**:`tt unsetup`
98
+
99
+ ## 使用
100
+
101
+ ```bash
102
+ tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
103
+ tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
104
+ tt daily # 同上(tt 无参即进 daily)
105
+ tt status # 过去 5h 实时面板
106
+ tt weekly # 周报
107
+ tt monthly # 月报
108
+ tt sessions # 最近 20 条会话明细(tt sessions <n> 改条数、--sort 改排序)
109
+ tt theme # 查看 / 切换配色主题(show / list / set / preview)
110
+ tt unsetup # 卸载并恢复安装前的配置
111
+ tt --version # 查看版本(-v / -V 同义)
112
+ ```
113
+
114
+ > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
115
+
116
+ ## 配色主题
117
+
118
+ 内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
119
+
120
+ ![支持的主题](assets/screenshot-themes.png)
121
+
122
+ | 主题 | 说明 |
123
+ |------|------|
124
+ | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
125
+ | `nord` | Nord |
126
+ | `dracula` | Dracula |
127
+
128
+ ```bash
129
+ tt theme # 显示当前主题及来源
130
+ tt theme list # 列出全部主题 + 色块预览
131
+ tt theme preview nord # 预览某主题(CLI 样例 + 状态栏样例行)
132
+ tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
133
+ tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
134
+ ```
135
+
136
+ - 切换持久化到 `~/.config/token-tracker/config.json`;优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动。
137
+ - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到 **256 色近似**。
138
+
139
+ ## 高级
140
+
141
+ ### 首次运行向导
142
+
143
+ 第一次跑 `tt`(或在独立终端跑 `tt setup`)会进入**交互式配置向导**,全程上下键选 + 回车确认:
144
+
145
+ 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`)
146
+ 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
147
+ 3. **启用 Codex 伪 statusline** — Yes/No(仅检测到 Codex 时)
148
+
149
+ CI / 非 tty 环境(Docker / 脚本 / `curl|bash`)自动按默认全装:**语言跟随系统设置**、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可。
150
+
151
+ ### 报告排序
152
+
153
+ 所有报告命令支持 `--sort` 和 `--asc/--desc` 参数:
154
+
155
+ ```bash
156
+ tt weekly --sort cost --desc # 按成本降序
157
+ tt sessions --sort tokens --asc # 按 token 升序
158
+ ```
159
+
160
+ 可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
161
+
162
+ ## 数据来源
163
+
164
+ | Agent | 路径 | 格式 |
165
+ |-------|------|------|
166
+ | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
167
+ | Codex | `~/.codex/sessions/` | JSONL + SQLite |
168
+
169
+ 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
170
+
171
+ Token Tracker 对 Agent 数据**只读**,不做任何修改。
172
+
173
+ ## 环境要求
174
+
175
+ - Python 3.11+
176
+ - [Rich](https://github.com/Textualize/rich)(自动安装)
177
+
178
+ ## License
179
+
180
+ Copyright (c) 2026 stormzhang. MIT License.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "token-tracker"
7
- version = "0.4.2"
7
+ version = "0.4.4"
8
8
  description = "Track token usage across local AI agents (Claude Code, Codex)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -690,7 +690,8 @@ _CODEX_STATUSLINE_REGEX = re.compile(
690
690
  r'\n*\[\[hooks\.Stop\]\]\s*'
691
691
  r'\[\[hooks\.Stop\.hooks\]\]\s*'
692
692
  r'type = "command"\s*'
693
- r'command = "[^"]*(?:codex-statusline|tt-statusline)[^"]*"\s*'
693
+ # command 兼容双引号 basic string(老用户已装)和单引号 literal string(修了 Windows 路径转义后的新装)
694
+ r'command = ["\'][^"\']*(?:codex-statusline|tt-statusline)[^"\']*["\']\s*'
694
695
  r'timeout = \d+\s*'
695
696
  )
696
697
 
@@ -712,7 +713,9 @@ def _install_codex_statusline(content: str, python: str) -> str:
712
713
  "\n\n[[hooks.Stop]]\n\n"
713
714
  "[[hooks.Stop.hooks]]\n"
714
715
  'type = "command"\n'
715
- f'command = "{cmd}"\n'
716
+ # 用 TOML literal string(单引号)包裹 command,避免 Windows 反斜杠路径被当转义符
717
+ # 解析失败(如 `C:\Users\...` 里的 `\U` 被识别为 unicode 转义起始)
718
+ f"command = '{cmd}'\n"
716
719
  "timeout = 10\n"
717
720
  )
718
721
 
@@ -50,7 +50,6 @@ _STRINGS = {
50
50
  "col_cache_read": "Cache读取",
51
51
  "model_breakdown": "模型分布",
52
52
  "col_ratio": "占比",
53
- "col_duration": "活跃/时长",
54
53
  "daily_panel_title": "当日数据面板 (P90)",
55
54
  "msg_unit": "{n} 条",
56
55
  "session_msg": "会话: {sessions} 消息: {msgs}",
@@ -72,8 +71,7 @@ _STRINGS = {
72
71
  "active_days": "活跃天数",
73
72
  "weekday_grid": "周日,周一,周二,周三,周四,周五,周六", # 热力图左侧行标签(周日开头)
74
73
  "month_short": "1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月", # 热力图月份表头
75
- "unit_day": "天", # 时长 / 连续天数单位
76
- "unit_hour": "小时", # 时长单位
74
+ "unit_day": "天", # 连续天数单位(daily streak)
77
75
  # --- theme (cli.py) ---
78
76
  "theme_current": "当前主题: {name}{src}",
79
77
  "theme_src_env": "(来自环境变量 TT_THEME)",
@@ -100,7 +98,7 @@ _STRINGS = {
100
98
  "wizard_signoff": "祝你使用愉快",
101
99
  # --- hooks.py ---
102
100
  "no_agent_install": "未检测到 Claude Code 或 Codex,请先安装其中之一",
103
- "auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha / 组件全开)配置;如需自定义请在终端运行 tt setup",
101
+ "auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha / 组件全开)配置\n如需自定义请在终端运行 tt setup",
104
102
  "first_setup": "首次使用,正在配置状态栏...",
105
103
  "cc_not_found": "未检测到 Claude Code,跳过",
106
104
  "codex_not_found": "未检测到 Codex,跳过",
@@ -167,7 +165,6 @@ _STRINGS = {
167
165
  "col_cache_read": "Cache Read",
168
166
  "model_breakdown": "Model Distribution",
169
167
  "col_ratio": "Ratio",
170
- "col_duration": "Active/Duration",
171
168
  "daily_panel_title": "Daily Panel (P90)",
172
169
  "msg_unit": "{n}",
173
170
  "session_msg": "Sessions: {sessions} Messages: {msgs}",
@@ -189,8 +186,7 @@ _STRINGS = {
189
186
  "active_days": "Active Days",
190
187
  "weekday_grid": "Sun,Mon,Tue,Wed,Thu,Fri,Sat", # 热力图左侧行标签(Sun 开头)
191
188
  "month_short": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", # 热力图月份表头
192
- "unit_day": "d", # 时长 / 连续天数单位
193
- "unit_hour": "h", # 时长单位
189
+ "unit_day": "d", # 连续天数单位(daily streak)
194
190
  # --- theme (cli.py) ---
195
191
  "theme_current": "Current theme: {name}{src}",
196
192
  "theme_src_env": " (from env TT_THEME)",
@@ -217,7 +213,7 @@ _STRINGS = {
217
213
  "wizard_signoff": "Enjoy!",
218
214
  # --- hooks.py ---
219
215
  "no_agent_install": "Claude Code or Codex not detected, please install one first",
220
- "auto_setup_hint": "Non-interactive env — configured with defaults (language follows system / theme mocha / all components on); run tt setup in a terminal to customize",
216
+ "auto_setup_hint": "Non-interactive env — configured with defaults (language follows system / theme mocha / all components on)\nRun tt setup in a terminal to customize",
221
217
  "first_setup": "First run, configuring status bar...",
222
218
  "cc_not_found": "Claude Code not detected, skipping",
223
219
  "codex_not_found": "Codex not detected, skipping",
@@ -5,7 +5,6 @@ from zoneinfo import ZoneInfo
5
5
 
6
6
  from rich.text import Text
7
7
 
8
- from ..i18n import t
9
8
  from .console import get_console
10
9
  from .theme import _S
11
10
 
@@ -124,19 +123,6 @@ def _fmt_cost(usd: float) -> str:
124
123
  return "$0"
125
124
 
126
125
 
127
- def _fmt_session_duration(active_minutes: float, span_minutes: float) -> str:
128
- """组合显示「活跃 / 跨度」:活跃恒用小数小时(9.4h);跨度 ≥1 天用 天d时h(22d14h,整天省为 22d),<1 天用小数小时(6.0h)。单位 d/h 跟随语言。"""
129
- hour, day = t("unit_hour"), t("unit_day")
130
- active = f"{active_minutes / 60:.1f}{hour}"
131
- if span_minutes >= 1440:
132
- d, rem = divmod(int(span_minutes), 1440)
133
- h = rem // 60
134
- span = f"{d}{day}{h}{hour}" if h else f"{d}{day}"
135
- else:
136
- span = f"{span_minutes / 60:.1f}{hour}"
137
- return f"{active} / {span}"
138
-
139
-
140
126
  def _display_width(s: str) -> int:
141
127
  w = 0
142
128
  for ch in s:
@@ -19,7 +19,6 @@ from .format import (
19
19
  AGENT_LABEL,
20
20
  AGENT_SHORT,
21
21
  _fmt_cost,
22
- _fmt_session_duration,
23
22
  _fmt_tokens,
24
23
  _model_short,
25
24
  _project_short,
@@ -142,7 +141,7 @@ def _render_agent_stats(per_agent: dict) -> None:
142
141
 
143
142
  def _render_sessions(sessions) -> None:
144
143
  """合并 session 列表:按 cost 倒序;Time 蓝 / Project 绿 / Tokens 橙 / Cost 黄;
145
- Tokens·Cost 各自前三(第一红、二三粉);列序 Time·Project·Tokens·Cost·Msgs·Duration·Model·Agent。"""
144
+ Tokens·Cost 各自前三(第一红、二三粉);列序 Time·Project·Tokens·Cost·Msgs·Model·Agent。"""
146
145
  mode = _width_mode()
147
146
  table = Table(title=f"{t('recent_sessions')} ({len(sessions)})", box=box.SIMPLE_HEAVY,
148
147
  header_style="bold", padding=(0, 1), expand=False)
@@ -151,7 +150,6 @@ def _render_sessions(sessions) -> None:
151
150
  table.add_column(t("col_total_tokens"), justify="right", style=_S.peach)
152
151
  table.add_column(t("col_cost"), justify="right", style=_S.warn)
153
152
  table.add_column(t("col_messages"), justify="right")
154
- table.add_column(t("col_duration"), justify="right")
155
153
  if mode != "compact":
156
154
  table.add_column(t("col_model"), no_wrap=True)
157
155
  table.add_column(t("col_agent"), no_wrap=True)
@@ -173,11 +171,10 @@ def _render_sessions(sessions) -> None:
173
171
  tok_cell,
174
172
  cost_cell,
175
173
  str(s.message_count),
176
- _fmt_session_duration(s.active_minutes, s.duration_minutes),
177
174
  ]
178
175
  if mode != "compact":
179
176
  names = list(s.models) or [s.model]
180
- row.append(", ".join(_model_short(n) for n in names[:2]))
177
+ row.append(_model_short(names[0]))
181
178
  row.append(AGENT_SHORT.get(s.agent_id, s.agent_id))
182
179
  table.add_row(*row)
183
180
  get_console().print(Padding(table, (0, 0, 0, 2), expand=False))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: token-tracker
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: Track token usage across local AI agents (Claude Code, Codex)
5
5
  Author-email: stormzhang <stormzhang.dev@gmail.com>
6
6
  License: MIT License
@@ -61,15 +61,32 @@ Dynamic: license-file
61
61
 
62
62
  [English](README_EN.md)
63
63
 
64
+ ![Token Tracker Daily](assets/screenshot-daily.png)
65
+
66
+ ## 功能亮点
67
+
68
+ - **多 Agent 统一追踪** — Claude Code + Codex 统一读取,多 Agent 按来源分组
69
+ - **状态栏集成** — Claude Code 用官方 StatusLine 接口;**Codex 业界首创伪 statusline 方案**(hook 注入两行真彩色状态栏,把官方未开放的能力在 Codex 里做了出来)
70
+ - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
71
+ - **多维成本分析** — 会话 / 日 / 周 / 月多维报表,等效成本统计
72
+ - **定价识别** — litellm 在线定价 + 内置官方价双层兜底,覆盖 Claude / OpenAI / Gemini / Grok 及国产主流(Kimi / GLM / Qwen / 豆包 / DeepSeek / MiniMax / MiMo);新模型自动套用同系列定价、不静默归零
73
+ - **会话洞察** — 项目、模型、时长、消息数一览
74
+ - **多主题统一配色** — 6 套主题(Catppuccin 全家 + Nord + Dracula),CLI 报表 / CC 状态栏 / Codex 伪 statusline **三者同源**,`tt theme` 一键切换
75
+ - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
76
+ - **隐私安全** — 数据纯本地存储,不采集、不上传
77
+
64
78
  ## StatusLine 状态栏
65
79
 
66
- 自动为 Claude Code 和 Codex 配置状态栏,`tt setup` 一键配置,脚本更新时自动升级。
80
+ `tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
81
+
82
+ ### Claude Code(官方接口)
67
83
 
68
- **Claude Code**:基于官方自定义 StatusLine 接口,数据完全来自本地 Claude,准确无任何推测
84
+ 基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
69
85
 
70
86
  ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
71
87
 
72
- 状态栏共四行,从左到右:
88
+ <details>
89
+ <summary>四行布局字段详解</summary>
73
90
 
74
91
  | 行 | 字段 | 说明 |
75
92
  |----|------|------|
@@ -88,44 +105,38 @@ Dynamic: license-file
88
105
 
89
106
  > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
90
107
 
91
- **Codex**:官方暂不支持自定义 StatusLine,`tt setup` 通过 Codex `Stop` hook 装一个**伪 statusline**——每次回答完成后在回答尾部追加**两行**彩色 status,仿 Claude Code 状态栏(不再接管 Codex 官方 `status_line`,伪 statusline 信息比官方字段更全):
108
+ </details>
109
+
110
+ ### Codex(伪 statusline,业界首创)
111
+
112
+ Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
92
113
 
93
114
  ![Codex StatusLine](assets/screenshot-statusline-codex.png)
94
115
 
95
- **伪 statusline 两行布局**:
116
+ **两行布局**:
96
117
 
97
118
  - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
98
119
  - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
99
120
 
100
- 通过 `Stop` hook 注入 `systemMessage` 实现,渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
121
+ 渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
101
122
 
102
- ## Daily 概览和 日/周/月 数据报表分析
123
+ ## 报表速览
103
124
 
104
- `tt`(无参)/ `tt daily`:默认入口,GitHub 风格 token 贡献热力图 + 顶部**单一卡片**内拼三段概览(**Last 12 months / This Month / This Week**,粗→细)。
105
- - Last 12 months:橙色 Tokens / Cost / Sessions / Avg/Cost / 活跃天数 + 蓝色 单日峰值 / 当前·最长连续活跃天数
106
- - This Month / This Week:橙色 Tokens / Cost / Avg/Cost / 活跃天数,**带环比**(↑/↓ 上月 / 上周)
125
+ `tt status` 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
107
126
 
108
- `tt status`:聚焦**过去 5 小时**的实时面板——顶部多 Agent **合并**概览(Token / Cost / Sessions / Messages / Top Model),中间 **5h / 7d 订阅额度**进度条(Claude Code / Codex 分开;都没订阅额度时换成 per-agent 的 token/cost/sessions/messages 统计),底部**近期会话**列表(CC + Codex 合并、带 Agent 列、按 Cost 倒序、Cost 前三名高亮)。所有时间按**系统时区**显示,配色跟随当前主题。
127
+ ![Status](assets/screenshot.png)
109
128
 
110
- ![Token Tracker Daily](assets/screenshot-daily.png)
129
+ `tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
111
130
 
112
- ![Token Tracker Status](assets/screenshot.png)
131
+ ![Weekly](assets/screenshot-weekly.png)
113
132
 
114
- ![Token Tracker Weekly](assets/screenshot-weekly.png)
133
+ `tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
115
134
 
116
- ![Token Tracker Monthly](assets/screenshot-monthly.png)
135
+ ![Monthly](assets/screenshot-monthly.png)
117
136
 
118
- ## 功能
137
+ `tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
119
138
 
120
- - **多 Agent 追踪** — Claude Code + Codex 统一面板,左右键切换
121
- - **状态栏集成** — Claude Code statusLine + Codex status_line,首次运行自动配置,脚本更新自动升级
122
- - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
123
- - **成本分析** — 按会话、日、周、月维度的等效成本统计,多 Agent 按来源分组展示
124
- - **定价识别** — litellm 在线定价 + 内置官方价双层兜底;同系列新模型自动套用本档定价(含 Claude Fable 5 / Opus 4.8),全新系列缺价时明确提示,不静默按 $0 统计
125
- - **会话洞察** — 项目、模型、时长、消息数一览
126
- - **多主题统一配色** — 6 套主题(Catppuccin Mocha/Latte/Frappe/Macchiato + Nord + Dracula),CLI 报表、CC 状态栏与 Codex 伪 statusline **三者同源**;`tt theme` 一键切换 / 预览,暗 / 亮终端自动选 Catppuccin,首次运行交互向导引导选择,`TT_THEME` 可覆盖;终端不支持 truecolor 时自动降级到 256 色近似
127
- - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
128
- - **隐私安全** — 数据纯本地存储,不采集、不上传任何用户信息,极轻量无后顾之忧
139
+ ![Sessions](assets/screenshot-sessions.png)
129
140
 
130
141
  ## 安装
131
142
 
@@ -136,38 +147,31 @@ curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/instal
136
147
  脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
137
148
 
138
149
  > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
139
- > **卸载**:先 `tt unsetup` 还原状态栏,再按装法移除(`uv tool uninstall token-tracker` / `pipx uninstall token-tracker` / 删 `~/.local/share/token-tracker` 与 `~/.local/bin/tt`)。
150
+ > **卸载**:`tt unsetup`
140
151
 
141
152
  ## 使用
142
153
 
143
154
  ```bash
144
155
  tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
145
- tt # 过去一年 token 热力图 + 顶部三段概览(Last 12 months / This Month / This Week,= tt daily)
156
+ tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
146
157
  tt daily # 同上(tt 无参即进 daily)
147
- tt status # 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
148
- tt weekly # 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
149
- tt monthly # 按月汇总(多 Agent 分组展示)
150
- tt sessions # 最近 20 条会话明细(按 cost 倒序展示;tt sessions <n> 改条数、--sort 改排序)
158
+ tt status # 过去 5h 实时面板
159
+ tt weekly # 周报
160
+ tt monthly # 月报
161
+ tt sessions # 最近 20 条会话明细(tt sessions <n> 改条数、--sort 改排序)
151
162
  tt theme # 查看 / 切换配色主题(show / list / set / preview)
152
163
  tt unsetup # 卸载并恢复安装前的配置
164
+ tt --version # 查看版本(-v / -V 同义)
153
165
  ```
154
166
 
155
167
  > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
156
168
 
157
- ### 首次运行向导
158
-
159
- 第一次跑 `tt`(或通过 curl 一键安装脚本装完自动启动)会进入**交互式配置向导**,全程上下键选 + 回车确认:
160
-
161
- 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`,之后所有命令跟随)
162
- 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
163
- 3. **启用 Codex 伪 statusline** — Yes/No,默认 Yes(仅检测到 Codex 时)
164
-
165
- 选完给一份键值对齐的配置总结 + 重启 / 下一步提示。CI / 非 tty 环境(Docker / 脚本)自动按默认全装:**语言跟随系统设置**(读系统语言、不被 CLI 的 `LANG` 误导)、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可(终端里每次 `tt setup` 都进向导)。
166
-
167
- ### 配色主题
169
+ ## 配色主题
168
170
 
169
171
  内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
170
172
 
173
+ ![支持的主题](assets/screenshot-themes.png)
174
+
171
175
  | 主题 | 说明 |
172
176
  |------|------|
173
177
  | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
@@ -182,9 +186,20 @@ tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
182
186
  tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
183
187
  ```
184
188
 
185
- - **首次运行**(终端内、非 AI 会话)会进入交互向导引导选主题;CI / 脚本 / 会话内自动跳过、静默用默认。
186
- - 切换持久化到 `~/.config/token-tracker/config.json`(主题 + 语言 + 组件意图统一存这一个文件);优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动(`--theme` 和 `TT_THEME` 都只临时生效、不写配置)。
187
- - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到当前主题的 **256 色近似**,8 色老终端不再适配。
189
+ - 切换持久化到 `~/.config/token-tracker/config.json`;优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动。
190
+ - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到 **256 色近似**。
191
+
192
+ ## 高级
193
+
194
+ ### 首次运行向导
195
+
196
+ 第一次跑 `tt`(或在独立终端跑 `tt setup`)会进入**交互式配置向导**,全程上下键选 + 回车确认:
197
+
198
+ 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`)
199
+ 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
200
+ 3. **启用 Codex 伪 statusline** — Yes/No(仅检测到 Codex 时)
201
+
202
+ CI / 非 tty 环境(Docker / 脚本 / `curl|bash`)自动按默认全装:**语言跟随系统设置**、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可。
188
203
 
189
204
  ### 报告排序
190
205
 
@@ -197,17 +212,6 @@ tt sessions --sort tokens --asc # 按 token 升序
197
212
 
198
213
  可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
199
214
 
200
- ### Dashboard 快捷键
201
-
202
- | 按键 | 功能 |
203
- |------|------|
204
- | `←` `→` | 切换 Agent |
205
- | `↑` `↓` | 滚动内容 |
206
- | `s` | 切换排序字段(时间 → Token → 等效成本 → 消息数) |
207
- | `r` | 反转排序方向 |
208
- | `+` / `-` | 调整会话显示条数(±10,最少 10 条) |
209
- | `q` | 退出 |
210
-
211
215
  ## 数据来源
212
216
 
213
217
  | Agent | 路径 | 格式 |
@@ -215,7 +219,7 @@ tt sessions --sort tokens --asc # 按 token 升序
215
219
  | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
216
220
  | Codex | `~/.codex/sessions/` | JSONL + SQLite |
217
221
 
218
- 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`(如 `C:\Users\xxx\.claude`)。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
222
+ 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
219
223
 
220
224
  Token Tracker 对 Agent 数据**只读**,不做任何修改。
221
225
 
@@ -224,20 +228,6 @@ Token Tracker 对 Agent 数据**只读**,不做任何修改。
224
228
  - Python 3.11+
225
229
  - [Rich](https://github.com/Textualize/rich)(自动安装)
226
230
 
227
- ## 开发
228
-
229
- ```bash
230
- git clone https://github.com/stormzhang/token-tracker && cd token-tracker
231
- uv run --extra dev pytest # 运行测试
232
- uv run --extra dev ruff check src tests # Lint
233
- ```
234
-
235
- 包采用标准 src layout(`src/token_tracker/`):发行名 `token-tracker`,导入名 `token_tracker`(0.4.0 起)。
236
-
237
- ## TODO
238
-
239
- 未来持续增加更多数据报表,多维度分析。
240
-
241
231
  ## License
242
232
 
243
233
  Copyright (c) 2026 stormzhang. MIT License.
@@ -119,17 +119,6 @@ def test_aggregate_sessions_active_minutes_drops_large_gaps():
119
119
  assert s.duration_minutes == round((3 * 24 * 60) + 10, 1)
120
120
 
121
121
 
122
- def test_fmt_session_duration_combines_active_and_span():
123
- from token_tracker.i18n import t
124
- from token_tracker.ui.format import _fmt_session_duration
125
- h, d = t("unit_hour"), t("unit_day") # 单位跟随语言,断言保持语言无关
126
- # 活跃恒小数小时;跨度 ≥1 天用 天d时h(整天省略小时),<1 天用小数小时
127
- assert _fmt_session_duration(564, 32520) == f"9.4{h} / 22{d}14{h}" # 主例:活跃 9h24m / 跨度 22d14h
128
- assert _fmt_session_duration(9 * 60, 22 * 24 * 60) == f"9.0{h} / 22{d}" # 整天跨度省略小时
129
- assert _fmt_session_duration(5 * 60, 6 * 60) == f"5.0{h} / 6.0{h}" # 跨度 <1 天用小数小时
130
- assert _fmt_session_duration(45, 90) == f"0.8{h} / 1.5{h}" # 活跃/跨度均不足 1h/1 天
131
-
132
-
133
122
  def test_aggregate_fills_projects_by_token():
134
123
  # projects 维度(weekly 项目分布用):按 project 累加 token,与 models 同机制
135
124
  d = datetime(2026, 1, 1, 10, tzinfo=UTC)
@@ -80,6 +80,19 @@ def test_codex_statusline_install_uninstall_roundtrip(tmp_path, monkeypatch):
80
80
  assert "tt-statusline" not in removed and 'command = "mine"' in removed
81
81
 
82
82
 
83
+ def test_codex_statusline_windows_path_toml_parses(tmp_path, monkeypatch):
84
+ # 回归:Windows 路径含 \U \A \P 等被 TOML basic string 当 unicode 转义起始符(issue 用户反馈)
85
+ # —— 写入的 command 必须用 literal string(单引号)包裹,写出来后能被 tomllib 原样解析回来。
86
+ import tomllib
87
+ monkeypatch.setattr(hooks, "CODEX_STATUSLINE_HOOK_PATH",
88
+ r"C:\Users\test\.config\token-tracker\codex-statusline.py")
89
+ py = r"C:\Users\test\AppData\Local\Programs\Python\Python313\python.exe"
90
+ content = hooks._install_codex_statusline("", py)
91
+ parsed = tomllib.loads(content) # 旧 bug:basic string 下 \U 等触发 TOML 解析错误
92
+ assert parsed["hooks"]["Stop"][0]["hooks"][0]["command"] == \
93
+ rf"{py} C:\Users\test\.config\token-tracker\codex-statusline.py"
94
+
95
+
83
96
  def test_codex_statusline_version_roundtrip(tmp_path, monkeypatch):
84
97
  # _installed_codex_statusline_version 读回的版本应与写入的 STATUSLINE_HOOK_VERSION 一致,
85
98
  # 保证 needs_update 不会因解析偏差而误判。
@@ -26,13 +26,14 @@ def test_build_status_data_merges_and_per_agent(monkeypatch):
26
26
  # 头图合并汇总 + per-agent 拆分 + session 合并带 agent_id 且按 cost 倒序(entries 给跨度,避免被 0min 过滤)。
27
27
  now = datetime.now(UTC)
28
28
  data_map = {
29
+ # 用「现在前 1 小时内」避免 UTC 凌晨跑 CI 时跨日被 _build_status_data 今天过滤掉
29
30
  "claude-code": [ # s1 跨度 10min
30
- _entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(hours=1), out=500),
31
- _entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=50), out=100),
31
+ _entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=30), out=500),
32
+ _entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=20), out=100),
32
33
  ],
33
34
  "codex": [ # s2 跨度 6min
34
- _entry("codex", "s2", "gpt-5", now - timedelta(hours=2), out=20),
35
- _entry("codex", "s2", "gpt-5", now - timedelta(hours=1, minutes=54), out=10),
35
+ _entry("codex", "s2", "gpt-5", now - timedelta(minutes=40), out=20),
36
+ _entry("codex", "s2", "gpt-5", now - timedelta(minutes=34), out=10),
36
37
  ],
37
38
  }
38
39
  monkeypatch.setattr(cli, "_load_entries", lambda aid, hours_back=0: data_map.get(aid, []))
@@ -74,7 +75,7 @@ def test_build_status_data_empty(monkeypatch):
74
75
 
75
76
 
76
77
  def test_render_status_with_limits(monkeypatch):
77
- # 有订阅额度 → 额度段(weekly 样式);session 强制 source 列 + Duration。
78
+ # 有订阅额度 → 额度段(weekly 样式);session 强制 source 列。
78
79
  monkeypatch.setattr("token_tracker.ui.status.forced_color_console", contextlib.nullcontext)
79
80
  now = datetime.now(UTC)
80
81
  summary = StatusSummary(total_tokens=1000, cost_usd=1.5, message_count=5, session_count=2,
@@ -98,9 +99,6 @@ def test_render_status_with_limits(monkeypatch):
98
99
  assert "Cost:" in out and "$12" in out # 当天 cost
99
100
  assert "Model:" in out and "Opus 4.8" in out # model(去掉 (1M context) 后缀)
100
101
  assert "Claude" in out and "Codex" in out # session Agent 列(短名 Claude / Codex)
101
- from token_tracker.i18n import t
102
- h = t("unit_hour") # 单位跟随语言
103
- assert f"1.1{h} / 1.1{h}" in out # Duration 组合:活跃 / 跨度(65min 连续会话,小数小时)
104
102
 
105
103
 
106
104
  def test_render_status_no_limits_shows_agent_stats(monkeypatch):
@@ -1,190 +0,0 @@
1
- # Token Tracker (tt)
2
-
3
- 本地 AI Agent Token 消耗追踪/分析工具,支持 **Claude Code** 和 **Codex** 。
4
-
5
- 自定义 StatusLine 状态栏 + CLI Dashboard,实时查看 token 用量、等效成本、限额状态。
6
-
7
- ![Python](https://img.shields.io/badge/python-3.11+-blue) ![CI](https://github.com/stormzhang/token-tracker/actions/workflows/ci.yml/badge.svg) ![License](https://img.shields.io/badge/license-MIT-green)
8
-
9
- [English](README_EN.md)
10
-
11
- ## StatusLine 状态栏
12
-
13
- 自动为 Claude Code 和 Codex 配置状态栏,`tt setup` 一键配置,脚本更新时自动升级。
14
-
15
- **Claude Code**:基于官方自定义 StatusLine 接口,数据完全来自本地 Claude,准确无任何推测
16
-
17
- ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
18
-
19
- 状态栏共四行,从左到右:
20
-
21
- | 行 | 字段 | 说明 |
22
- |----|------|------|
23
- | 1 | `[项目](分支 +12 -3)` | 项目名(加粗)+ Git 分支(未提交修改标 `*`),括号内附工作区相对 HEAD 的增删行数 |
24
- | 1 | `Total: 1.2M` | 本次会话累计消耗 token(输入+输出+cache,解析 transcript 得出) |
25
- | 1 | `Cost: $35.51` | 本次会话等效成本(Claude Code 自带,按官方计费,准确) |
26
- | 1 | `Code: +208 -8` | 本会话 Claude 写 / 删的代码行数(`+` 绿 `-` 红,与 git 变动同配色) |
27
- | 2 | `Limit: 5h: ██░ 31% (1h19m)` | 5 小时滑动窗口配额(仅订阅模式;括号内重置倒计时) |
28
- | 2 | `7d: ██░ 11% (5d8h)` | 7 天滑动窗口配额 |
29
- | 2 | `1.0M Ctx: ██░ 20%` | 上下文窗口总大小及已用占比 |
30
- | 3 | `Tokens: in 392k, out 937, cache 388k` | **当前上下文窗口**的 token 构成(注意:非会话累计,会随 compact 变化) |
31
- | 3 | `Out TPS: 60 tokens/s` | 本轮 output token 生成速度(含 thinking;空闲帧保留上次值) |
32
- | 4 | `Model: Opus 4.8/xhigh/nofast` | 模型名 / reasoning 级别 / 是否 fast 模式 |
33
- | 4 | `Duration: 1h33m` | 当前会话已持续时间 |
34
- | 4 | `Remote: github` | 代码仓库 host(去顶级域) |
35
-
36
- > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
37
-
38
- **Codex**:官方暂不支持自定义 StatusLine,`tt setup` 通过 Codex `Stop` hook 装一个**伪 statusline**——每次回答完成后在回答尾部追加**两行**彩色 status,仿 Claude Code 状态栏(不再接管 Codex 官方 `status_line`,伪 statusline 信息比官方字段更全):
39
-
40
- ![Codex StatusLine](assets/screenshot-statusline-codex.png)
41
-
42
- **伪 statusline 两行布局**:
43
-
44
- - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
45
- - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
46
-
47
- 通过 `Stop` hook 注入 `systemMessage` 实现,渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
48
-
49
- ## Daily 概览和 日/周/月 数据报表分析
50
-
51
- `tt`(无参)/ `tt daily`:默认入口,GitHub 风格 token 贡献热力图 + 顶部**单一卡片**内拼三段概览(**Last 12 months / This Month / This Week**,粗→细)。
52
- - Last 12 months:橙色 Tokens / Cost / Sessions / Avg/Cost / 活跃天数 + 蓝色 单日峰值 / 当前·最长连续活跃天数
53
- - This Month / This Week:橙色 Tokens / Cost / Avg/Cost / 活跃天数,**带环比**(↑/↓ 上月 / 上周)
54
-
55
- `tt status`:聚焦**过去 5 小时**的实时面板——顶部多 Agent **合并**概览(Token / Cost / Sessions / Messages / Top Model),中间 **5h / 7d 订阅额度**进度条(Claude Code / Codex 分开;都没订阅额度时换成 per-agent 的 token/cost/sessions/messages 统计),底部**近期会话**列表(CC + Codex 合并、带 Agent 列、按 Cost 倒序、Cost 前三名高亮)。所有时间按**系统时区**显示,配色跟随当前主题。
56
-
57
- ![Token Tracker Daily](assets/screenshot-daily.png)
58
-
59
- ![Token Tracker Status](assets/screenshot.png)
60
-
61
- ![Token Tracker Weekly](assets/screenshot-weekly.png)
62
-
63
- ![Token Tracker Monthly](assets/screenshot-monthly.png)
64
-
65
- ## 功能
66
-
67
- - **多 Agent 追踪** — Claude Code + Codex 统一面板,左右键切换
68
- - **状态栏集成** — Claude Code statusLine + Codex status_line,首次运行自动配置,脚本更新自动升级
69
- - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
70
- - **成本分析** — 按会话、日、周、月维度的等效成本统计,多 Agent 按来源分组展示
71
- - **定价识别** — litellm 在线定价 + 内置官方价双层兜底;同系列新模型自动套用本档定价(含 Claude Fable 5 / Opus 4.8),全新系列缺价时明确提示,不静默按 $0 统计
72
- - **会话洞察** — 项目、模型、时长、消息数一览
73
- - **多主题统一配色** — 6 套主题(Catppuccin Mocha/Latte/Frappe/Macchiato + Nord + Dracula),CLI 报表、CC 状态栏与 Codex 伪 statusline **三者同源**;`tt theme` 一键切换 / 预览,暗 / 亮终端自动选 Catppuccin,首次运行交互向导引导选择,`TT_THEME` 可覆盖;终端不支持 truecolor 时自动降级到 256 色近似
74
- - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
75
- - **隐私安全** — 数据纯本地存储,不采集、不上传任何用户信息,极轻量无后顾之忧
76
-
77
- ## 安装
78
-
79
- ```bash
80
- curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/install.sh | bash
81
- ```
82
-
83
- 脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
84
-
85
- > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
86
- > **卸载**:先 `tt unsetup` 还原状态栏,再按装法移除(`uv tool uninstall token-tracker` / `pipx uninstall token-tracker` / 删 `~/.local/share/token-tracker` 与 `~/.local/bin/tt`)。
87
-
88
- ## 使用
89
-
90
- ```bash
91
- tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
92
- tt # 过去一年 token 热力图 + 顶部三段概览(Last 12 months / This Month / This Week,= tt daily)
93
- tt daily # 同上(tt 无参即进 daily)
94
- tt status # 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
95
- tt weekly # 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
96
- tt monthly # 按月汇总(多 Agent 分组展示)
97
- tt sessions # 最近 20 条会话明细(按 cost 倒序展示;tt sessions <n> 改条数、--sort 改排序)
98
- tt theme # 查看 / 切换配色主题(show / list / set / preview)
99
- tt unsetup # 卸载并恢复安装前的配置
100
- ```
101
-
102
- > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
103
-
104
- ### 首次运行向导
105
-
106
- 第一次跑 `tt`(或通过 curl 一键安装脚本装完自动启动)会进入**交互式配置向导**,全程上下键选 + 回车确认:
107
-
108
- 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`,之后所有命令跟随)
109
- 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
110
- 3. **启用 Codex 伪 statusline** — Yes/No,默认 Yes(仅检测到 Codex 时)
111
-
112
- 选完给一份键值对齐的配置总结 + 重启 / 下一步提示。CI / 非 tty 环境(Docker / 脚本)自动按默认全装:**语言跟随系统设置**(读系统语言、不被 CLI 的 `LANG` 误导)、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可(终端里每次 `tt setup` 都进向导)。
113
-
114
- ### 配色主题
115
-
116
- 内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
117
-
118
- | 主题 | 说明 |
119
- |------|------|
120
- | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
121
- | `nord` | Nord |
122
- | `dracula` | Dracula |
123
-
124
- ```bash
125
- tt theme # 显示当前主题及来源
126
- tt theme list # 列出全部主题 + 色块预览
127
- tt theme preview nord # 预览某主题(CLI 样例 + 状态栏样例行)
128
- tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
129
- tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
130
- ```
131
-
132
- - **首次运行**(终端内、非 AI 会话)会进入交互向导引导选主题;CI / 脚本 / 会话内自动跳过、静默用默认。
133
- - 切换持久化到 `~/.config/token-tracker/config.json`(主题 + 语言 + 组件意图统一存这一个文件);优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动(`--theme` 和 `TT_THEME` 都只临时生效、不写配置)。
134
- - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到当前主题的 **256 色近似**,8 色老终端不再适配。
135
-
136
- ### 报告排序
137
-
138
- 所有报告命令支持 `--sort` 和 `--asc/--desc` 参数:
139
-
140
- ```bash
141
- tt weekly --sort cost --desc # 按成本降序
142
- tt sessions --sort tokens --asc # 按 token 升序
143
- ```
144
-
145
- 可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
146
-
147
- ### Dashboard 快捷键
148
-
149
- | 按键 | 功能 |
150
- |------|------|
151
- | `←` `→` | 切换 Agent |
152
- | `↑` `↓` | 滚动内容 |
153
- | `s` | 切换排序字段(时间 → Token → 等效成本 → 消息数) |
154
- | `r` | 反转排序方向 |
155
- | `+` / `-` | 调整会话显示条数(±10,最少 10 条) |
156
- | `q` | 退出 |
157
-
158
- ## 数据来源
159
-
160
- | Agent | 路径 | 格式 |
161
- |-------|------|------|
162
- | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
163
- | Codex | `~/.codex/sessions/` | JSONL + SQLite |
164
-
165
- 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`(如 `C:\Users\xxx\.claude`)。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
166
-
167
- Token Tracker 对 Agent 数据**只读**,不做任何修改。
168
-
169
- ## 环境要求
170
-
171
- - Python 3.11+
172
- - [Rich](https://github.com/Textualize/rich)(自动安装)
173
-
174
- ## 开发
175
-
176
- ```bash
177
- git clone https://github.com/stormzhang/token-tracker && cd token-tracker
178
- uv run --extra dev pytest # 运行测试
179
- uv run --extra dev ruff check src tests # Lint
180
- ```
181
-
182
- 包采用标准 src layout(`src/token_tracker/`):发行名 `token-tracker`,导入名 `token_tracker`(0.4.0 起)。
183
-
184
- ## TODO
185
-
186
- 未来持续增加更多数据报表,多维度分析。
187
-
188
- ## License
189
-
190
- Copyright (c) 2026 stormzhang. MIT License.
File without changes
File without changes