ccus-cli 0.1.3 → 0.1.4
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.
- package/README.md +178 -174
- package/dist/cli.js +27 -13
- package/dist/lib/aggregate-dashboard.js +407 -407
- package/dist/lib/dashboard.js +176 -42
- package/package.json +35 -35
package/README.md
CHANGED
|
@@ -1,174 +1,178 @@
|
|
|
1
|
-
# ccus
|
|
2
|
-
|
|
3
|
-
一个本地优先的 Claude Code statusline 使用率采集 CLI:
|
|
4
|
-
|
|
5
|
-
- `ccus install`:自动把 statusLine 命令写进 Claude Code 的 `settings.json`,省去手动改配置。
|
|
6
|
-
- `ccus statusline emit`:读取 Claude Code statusline 通过 `stdin` 传入的 JSON,输出 statusline 文本,并写入本地日志(加 `--no-store` / `--no-log` 则只输出、不落盘)。
|
|
7
|
-
- `ccus dashboard serve`:直接启动本地 Web 页面,不用先手动生成 HTML 文件。
|
|
8
|
-
- `ccus export`:默认导出当前周数据包,里面同时包含原始事件和按天维度的周汇总。
|
|
9
|
-
- `ccus aggregate`:读取一个目录里的多人 export bundle json,输出明细、按天、按周三个 CSV。
|
|
10
|
-
- `ccus aggregate serve`:同样以 bundle 目录为输入,启动本地多人 dashboard 页面,不落地任何文件。
|
|
11
|
-
|
|
12
|
-
> **支持范围**:`ccus statusline emit` 依赖 Claude Code 的 statusLine 机制(从 `stdin` 读 JSON、向 `stdout` 回一行文本),**只在命令行版 Claude Code(CLI / 终端)里生效**。
|
|
13
|
-
>
|
|
14
|
-
> Claude **桌面版** 和 **VS Code 插件** 都不支持 statusLine,因此不会调用 `ccus statusline emit`,也就采集不到使用率数据。
|
|
15
|
-
|
|
16
|
-
## 安装
|
|
17
|
-
|
|
18
|
-
全局安装(statusline 每次渲染都会调用,推荐全局装好,避免 `npx` 的启动开销):
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npm install -g ccus-cli
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
要求 Node.js >= 20。
|
|
25
|
-
|
|
26
|
-
## 快速开始
|
|
27
|
-
|
|
28
|
-
全局安装后,一条命令把 statusline 接进 Claude Code:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
ccus install
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
然后照常使用 Claude Code,statusline 会显示 5 小时额度使用率(`5h`)、7 天额度使用率(`7d`)、context window 占用百分比(`ctx`)、模型名、工作区名,以及当前 git 分支(`⎇ <branch>`,实时读取,非 git 仓库或处于 detached HEAD 时省略该段);原始 payload 也会落到本地日志,供后续 dashboard / export 使用。
|
|
35
|
-
|
|
36
|
-
攒了一段时间数据后,最常用的几条命令:
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
ccus export # 导出当前周数据包(this-week)
|
|
40
|
-
ccus export lw # 导出上一整周(last-week,周一到周日)
|
|
41
|
-
ccus export tw # 导出本周(等价于默认 ccus export)
|
|
42
|
-
|
|
43
|
-
ccus dashboard serve #
|
|
44
|
-
|
|
45
|
-
ccus aggregate --input-dir ./team-exports # 多人的数据汇总,可以导出 detail.csv、daily.csv、weekly.csv 三个维度的文件
|
|
46
|
-
ccus aggregate serve --input-dir ./team-exports #直接打开一个看板
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### 一键安装(推荐)
|
|
50
|
-
|
|
51
|
-
不想手动改配置时,直接运行:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
ccus install
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
行为:
|
|
58
|
-
|
|
59
|
-
- 默认写入 `~/.claude/settings.json`(可用 `--settings PATH` 覆盖;遵循 `CCUS_CLAUDE_DATA_DIR`)
|
|
60
|
-
- 默认写入的命令是 `ccus statusline emit`(需要先全局安装,让 PATH 上能找到 `ccus`)
|
|
61
|
-
- 只覆盖 `statusLine` 字段(保留其下已有的 `padding` 等键),其它顶层设置原样保留
|
|
62
|
-
- 已存在且命令一致时显示 `already configured`,被替换时会回显旧命令
|
|
63
|
-
- `settings.json` 无法解析为 JSON 时直接报错,不会覆盖文件
|
|
64
|
-
- `--command CMD` 可完全自定义命令;`--data-dir PATH` 会在默认命令后追加 `--data-dir`,让采样落到指定目录
|
|
65
|
-
|
|
66
|
-
### 手动配置
|
|
67
|
-
|
|
68
|
-
也可以手动在 `settings.json` 里写:
|
|
69
|
-
|
|
70
|
-
```json
|
|
71
|
-
{
|
|
72
|
-
"statusLine": {
|
|
73
|
-
"type": "command",
|
|
74
|
-
"command": "ccus statusline emit"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 常用命令
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
ccus install
|
|
83
|
-
ccus install --settings ~/.claude/settings.json
|
|
84
|
-
ccus statusline emit
|
|
85
|
-
ccus statusline emit --no-store # 只渲染并输出状态行,不写本地日志(别名 --no-log)
|
|
86
|
-
ccus dashboard build --range today --out ./ccus-dashboard.html
|
|
87
|
-
ccus dashboard open --range today
|
|
88
|
-
ccus dashboard serve --range today --open
|
|
89
|
-
ccus export
|
|
90
|
-
ccus export --range today
|
|
91
|
-
ccus export --range last-week
|
|
92
|
-
ccus export lw # 位置参数简写,等价于 --range last-week
|
|
93
|
-
ccus export tw # 等价于 --range this-week
|
|
94
|
-
ccus export --out ./alice_export_2026-05-26_to_2026-06-01.json
|
|
95
|
-
ccus aggregate --input-dir ./team-exports --out-dir ./team-report
|
|
96
|
-
ccus aggregate serve --input-dir ./team-exports
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
`serve` 会启动一个本地 HTTP 服务,默认监听 `127.0.0.1`
|
|
100
|
-
|
|
101
|
-
其中:
|
|
102
|
-
|
|
103
|
-
- `5 小时使用量百分比` 是 **展示指标**,来自 Claude 自身字段 `rate_limits.five_hour.used_percentage`
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
-
|
|
114
|
-
- `
|
|
115
|
-
-
|
|
116
|
-
- `
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- `
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
- `
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
|
|
1
|
+
# ccus
|
|
2
|
+
|
|
3
|
+
一个本地优先的 Claude Code statusline 使用率采集 CLI:
|
|
4
|
+
|
|
5
|
+
- `ccus install`:自动把 statusLine 命令写进 Claude Code 的 `settings.json`,省去手动改配置。
|
|
6
|
+
- `ccus statusline emit`:读取 Claude Code statusline 通过 `stdin` 传入的 JSON,输出 statusline 文本,并写入本地日志(加 `--no-store` / `--no-log` 则只输出、不落盘)。
|
|
7
|
+
- `ccus dashboard serve`:直接启动本地 Web 页面,不用先手动生成 HTML 文件。
|
|
8
|
+
- `ccus export`:默认导出当前周数据包,里面同时包含原始事件和按天维度的周汇总。
|
|
9
|
+
- `ccus aggregate`:读取一个目录里的多人 export bundle json,输出明细、按天、按周三个 CSV。
|
|
10
|
+
- `ccus aggregate serve`:同样以 bundle 目录为输入,启动本地多人 dashboard 页面,不落地任何文件。
|
|
11
|
+
|
|
12
|
+
> **支持范围**:`ccus statusline emit` 依赖 Claude Code 的 statusLine 机制(从 `stdin` 读 JSON、向 `stdout` 回一行文本),**只在命令行版 Claude Code(CLI / 终端)里生效**。
|
|
13
|
+
>
|
|
14
|
+
> Claude **桌面版** 和 **VS Code 插件** 都不支持 statusLine,因此不会调用 `ccus statusline emit`,也就采集不到使用率数据。
|
|
15
|
+
|
|
16
|
+
## 安装
|
|
17
|
+
|
|
18
|
+
全局安装(statusline 每次渲染都会调用,推荐全局装好,避免 `npx` 的启动开销):
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g ccus-cli
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
要求 Node.js >= 20。
|
|
25
|
+
|
|
26
|
+
## 快速开始
|
|
27
|
+
|
|
28
|
+
全局安装后,一条命令把 statusline 接进 Claude Code:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ccus install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
然后照常使用 Claude Code,statusline 会显示 5 小时额度使用率(`5h`)、7 天额度使用率(`7d`)、context window 占用百分比(`ctx`)、模型名、工作区名,以及当前 git 分支(`⎇ <branch>`,实时读取,非 git 仓库或处于 detached HEAD 时省略该段);原始 payload 也会落到本地日志,供后续 dashboard / export 使用。
|
|
35
|
+
|
|
36
|
+
攒了一段时间数据后,最常用的几条命令:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
ccus export # 导出当前周数据包(this-week)
|
|
40
|
+
ccus export lw # 导出上一整周(last-week,周一到周日)
|
|
41
|
+
ccus export tw # 导出本周(等价于默认 ccus export)
|
|
42
|
+
|
|
43
|
+
ccus dashboard serve # 启动本地页面,默认看本周(this-week)的 5 小时使用率曲线与每日用户消息数
|
|
44
|
+
|
|
45
|
+
ccus aggregate --input-dir ./team-exports # 多人的数据汇总,可以导出 detail.csv、daily.csv、weekly.csv 三个维度的文件
|
|
46
|
+
ccus aggregate serve --input-dir ./team-exports #直接打开一个看板
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 一键安装(推荐)
|
|
50
|
+
|
|
51
|
+
不想手动改配置时,直接运行:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
ccus install
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
行为:
|
|
58
|
+
|
|
59
|
+
- 默认写入 `~/.claude/settings.json`(可用 `--settings PATH` 覆盖;遵循 `CCUS_CLAUDE_DATA_DIR`)
|
|
60
|
+
- 默认写入的命令是 `ccus statusline emit`(需要先全局安装,让 PATH 上能找到 `ccus`)
|
|
61
|
+
- 只覆盖 `statusLine` 字段(保留其下已有的 `padding` 等键),其它顶层设置原样保留
|
|
62
|
+
- 已存在且命令一致时显示 `already configured`,被替换时会回显旧命令
|
|
63
|
+
- `settings.json` 无法解析为 JSON 时直接报错,不会覆盖文件
|
|
64
|
+
- `--command CMD` 可完全自定义命令;`--data-dir PATH` 会在默认命令后追加 `--data-dir`,让采样落到指定目录
|
|
65
|
+
|
|
66
|
+
### 手动配置
|
|
67
|
+
|
|
68
|
+
也可以手动在 `settings.json` 里写:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"statusLine": {
|
|
73
|
+
"type": "command",
|
|
74
|
+
"command": "ccus statusline emit"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 常用命令
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
ccus install
|
|
83
|
+
ccus install --settings ~/.claude/settings.json
|
|
84
|
+
ccus statusline emit
|
|
85
|
+
ccus statusline emit --no-store # 只渲染并输出状态行,不写本地日志(别名 --no-log)
|
|
86
|
+
ccus dashboard build --range today --out ./ccus-dashboard.html
|
|
87
|
+
ccus dashboard open --range today
|
|
88
|
+
ccus dashboard serve --range today --open
|
|
89
|
+
ccus export
|
|
90
|
+
ccus export --range today
|
|
91
|
+
ccus export --range last-week
|
|
92
|
+
ccus export lw # 位置参数简写,等价于 --range last-week
|
|
93
|
+
ccus export tw # 等价于 --range this-week
|
|
94
|
+
ccus export --out ./alice_export_2026-05-26_to_2026-06-01.json
|
|
95
|
+
ccus aggregate --input-dir ./team-exports --out-dir ./team-report
|
|
96
|
+
ccus aggregate serve --input-dir ./team-exports
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`serve` 会启动一个本地 HTTP 服务,默认监听 `127.0.0.1` 上的随机端口,并在每次请求时实时读取最新日志生成页面。`serve` 默认查看 `this-week`(整周)使用量曲线(`build` / `open` 仍默认 `today`),可用 `--range` 覆盖。
|
|
100
|
+
|
|
101
|
+
其中:
|
|
102
|
+
|
|
103
|
+
- `5 小时使用量百分比` 是 **展示指标**,来自 Claude 自身字段 `rate_limits.five_hour.used_percentage`
|
|
104
|
+
- 使用率趋势图会在同一张图上叠加两条线:实线为 5 小时使用率(`rate_limits.five_hour`),虚线为 7 天使用率(`rate_limits.seven_day`),两者各自独立按时间桶聚合
|
|
105
|
+
- 页面新增 **每日用户消息数** 柱状图:按自然日统计的真实用户请求数,口径与导出契约的 `userMessageCount` 一致(来自 `~/.claude/projects/**/*.jsonl`),不是 statusline 采样数,也仅用于页面展示、不进任何导出/聚合契约
|
|
106
|
+
- 跨多天的窗口(如 `this-week` / `last-week`)使用率曲线会自动改用小时桶聚合,避免一周生成上千个点,且 x 轴改为按自然日(月-日)打刻度
|
|
107
|
+
- 顶部统计卡展示 `Latest 5h usage`、`Peak 5h usage`、`Latest 7d usage`(含峰值)、`用户消息数`(窗口内每日真实用户请求数合计)
|
|
108
|
+
- `--range today / this-week / last-week / 24h` 是 **你要查看的采样历史时间窗口**(`last-week` 指上一个完整周一到周日)
|
|
109
|
+
- statusline 日志本身主要保存 `rawPayload` 与外部补充字段;默认导出时会同时保留原始事件,并额外汇总 `~/.claude/projects/**/*.jsonl` 中的会话 usage
|
|
110
|
+
|
|
111
|
+
## 导出
|
|
112
|
+
|
|
113
|
+
- 默认导出 `this-week`;如需导出上一个完整周(周一到周日),用 `--range last-week`,或位置参数简写 `ccus export lw`(`tw` = 本周)
|
|
114
|
+
- 周度导出固定覆盖**完整一周(周一到周日)**:`this-week` 即使本周还没过完、后面几天还没有任何数据,文件名的起止日期也会补齐到本周日,`dailySummaries` 同样按整周 7 天逐日输出
|
|
115
|
+
- 默认输出一个 `json` 数据包,里面同时包含 `rawEvents`、`weeklySummary`、`dailySummaries`
|
|
116
|
+
- 当前导出 bundle / weeklySummary 的 `schemaVersion` 为 `6`,用于标识已使用 `fiveHourLatestUsagePct`、`fiveHourPeakUsagePct`、`sevenDayLatestUsagePct`、`sevenDayPeakUsagePct` 字段的新导出契约
|
|
117
|
+
- 默认文件名会带 git email 的帐号名前缀和起止日期,例如:`alice_export_2026-05-26_to_2026-06-01.json`
|
|
118
|
+
- `userMessageCount` 来自 `~/.claude/projects/**/*.jsonl` 的非 meta `type:user` 事件
|
|
119
|
+
- `apiRequestCount` 与 token 指标来自 `~/.claude/projects/**/*.jsonl` 中带 `message.usage` 的 `type:assistant` 事件
|
|
120
|
+
- `dailySummaries` 会按每天输出消息数、请求数、token 和当天 statusline usage 摘要
|
|
121
|
+
- 不再支持其它导出格式
|
|
122
|
+
|
|
123
|
+
## 多人汇总
|
|
124
|
+
|
|
125
|
+
- 输入目录放很多通过 `ccus export` 导出的 bundle `.json` 文件
|
|
126
|
+
- `aggregate` 目前只接受 `schemaVersion: 6` 的 bundle;旧导出请先用当前版本重新 `ccus export`
|
|
127
|
+
- `ccus aggregate --input-dir DIR --out-dir DIR`
|
|
128
|
+
- 输出三个文件:
|
|
129
|
+
- `detail.csv`:来自每个 bundle 的 `rawEvents`,`contextUsedM` / `contextMaxM` 为单条事件的 context window token;另附带 `inputTokensM` / `outputTokensM` / `cacheReadInputTokensM`(按 `date` 取自当天 `dailySummaries` 的日总量,同一天多行会重复,不能按行求和)
|
|
130
|
+
- `daily.csv`:直接来自每个 bundle 的 `dailySummaries`
|
|
131
|
+
- `weekly.csv`:直接来自每个 bundle 的 `weeklySummary`
|
|
132
|
+
- CSV 里所有以 token 计的列(context 与 in/out/cache)都以百万(M)为单位(原始值除以 1,000,000),列名统一带 `M` 后缀;`contextWindowPct` 仍是百分比
|
|
133
|
+
- 想直接查看团队多人 dashboard,可以用 `ccus aggregate serve --input-dir DIR [--port 0] [--host 127.0.0.1]`:默认监听 `127.0.0.1` 上的随机端口,启动后会自动用系统默认浏览器打开,每次请求实时读取目录里的 bundle,不写入任何文件
|
|
134
|
+
|
|
135
|
+
## 调试
|
|
136
|
+
|
|
137
|
+
出问题时(比如 statusline 不出数据、导出/聚合结果不对),可以打开详细日志:
|
|
138
|
+
|
|
139
|
+
- 给任意命令加 `--verbose`(或 `--debug` / `-v`),例如 `ccus export --verbose`、`ccus aggregate --input-dir DIR --verbose`
|
|
140
|
+
- 或设置环境变量 `CCUS_DEBUG=1`,对 Claude Code 自动调用的 `ccus statusline emit` 尤其方便(无法临时加参数时)
|
|
141
|
+
|
|
142
|
+
注意:
|
|
143
|
+
|
|
144
|
+
- 调试日志一律输出到 **stderr**,stdout 仍然只输出正常结果(statusline 单行文本 / 文件路径),所以加上 `--verbose` 不会破坏 statusline 渲染
|
|
145
|
+
- 平时 `ccus statusline emit` 即使内部出错也会静默降级输出兜底文本;开启调试后会把真正的错误堆栈打到 stderr,便于定位
|
|
146
|
+
|
|
147
|
+
## 默认数据目录
|
|
148
|
+
|
|
149
|
+
- Windows: `%LOCALAPPDATA%\\ccus`
|
|
150
|
+
- macOS: `~/Library/Application Support/ccus`
|
|
151
|
+
- Linux: `$XDG_DATA_HOME/ccus` 或 `~/.local/share/ccus`
|
|
152
|
+
|
|
153
|
+
## 当前日志记录字段
|
|
154
|
+
|
|
155
|
+
- `timestamp`
|
|
156
|
+
- `gitUserName`
|
|
157
|
+
- `gitUserEmail`
|
|
158
|
+
- `schemaVersion`
|
|
159
|
+
- `rawPayload`
|
|
160
|
+
|
|
161
|
+
## 开发
|
|
162
|
+
|
|
163
|
+
从源码构建:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
npm install
|
|
167
|
+
npm run build
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
测试:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
npm run test:src # 直接跑 TypeScript 源码测试(tsx)
|
|
174
|
+
npm run build # 编译到 dist
|
|
175
|
+
npm test # 跑编译后的测试
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
发布到 npm 时只包含运行时产物(`dist` 下的 `cli.js`、`lib/**/*.js`、`types.js`)与 `README.md`、`package.json`;源码、测试、sourcemap、内部文档不会被打包。
|
package/dist/cli.js
CHANGED
|
@@ -184,28 +184,42 @@ async function handleStatuslineEmit(options) {
|
|
|
184
184
|
process.stdout.write(`${fallback.statusLine}\n`);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
-
/**
|
|
188
|
-
|
|
187
|
+
/**
|
|
188
|
+
* 加载某个时间窗口内的 dashboard 渲染数据:statusline 事件 + 每日用户消息数。
|
|
189
|
+
*
|
|
190
|
+
* 每日用户消息数与导出契约同源(Claude 本地 transcript 的真实用户请求数),仅供 dashboard 展示,
|
|
191
|
+
* 不落盘、不进任何导出/聚合契约。`defaultRange` 让 build/open 与 serve 各自决定缺省窗口。
|
|
192
|
+
*/
|
|
193
|
+
async function loadDashboardData(options, defaultRange) {
|
|
189
194
|
const dataDir = getDataDir(options);
|
|
190
|
-
const range = getStringOption(options, "range") ??
|
|
195
|
+
const range = getStringOption(options, "range") ?? defaultRange;
|
|
191
196
|
const now = new Date();
|
|
192
|
-
|
|
197
|
+
// this-week 固定补齐到完整一周(周一到周日),即使本周还没过完,曲线 x 轴也按 7 天逐日展示;
|
|
198
|
+
// 其它范围(today / last-week / 5h)不受影响。
|
|
199
|
+
const window = (0, time_1.expandToFullWeekWindow)((0, time_1.resolveRange)(range, now));
|
|
193
200
|
const events = (await (0, storage_1.readEventsForRange)(dataDir, range, now)).map((record) => (0, payload_1.computeStatuslineEvent)(record));
|
|
194
|
-
(0,
|
|
195
|
-
const
|
|
201
|
+
const claudeDailyUsage = await (0, claude_1.summarizeClaudeProjectUsageByDay)(window.start, window.end);
|
|
202
|
+
const dailyUserMessages = (0, time_1.enumerateDateKeys)(window.start, window.end).map((date) => ({
|
|
203
|
+
date,
|
|
204
|
+
userMessageCount: claudeDailyUsage.get(date)?.userMessageCount ?? 0,
|
|
205
|
+
}));
|
|
206
|
+
(0, debug_1.debugLog)("dashboard", "events loaded", { range, label: window.label, sampleCount: events.length, days: dailyUserMessages.length });
|
|
207
|
+
const html = (0, dashboard_1.buildDashboardHtml)(events, window.label, window.start, window.end, dailyUserMessages);
|
|
208
|
+
return { html, window };
|
|
209
|
+
}
|
|
210
|
+
/** 构建 dashboard 的公共逻辑,build/open 复用同一套生成流程。 */
|
|
211
|
+
async function buildDashboard(options) {
|
|
212
|
+
const dataDir = getDataDir(options);
|
|
213
|
+
const { html, window } = await loadDashboardData(options, "today");
|
|
196
214
|
const outputPath = node_path_1.default.resolve(getStringOption(options, "out") ?? node_path_1.default.join((0, paths_1.getDashboardDir)(dataDir), `${window.label}.html`));
|
|
197
215
|
await (0, export_1.writeTextFile)(outputPath, html);
|
|
198
216
|
(0, debug_1.debugLog)("dashboard", "html written", { outputPath, bytes: html.length });
|
|
199
217
|
return outputPath;
|
|
200
218
|
}
|
|
201
|
-
/** 直接返回 dashboard HTML 字符串,供本地 HTTP 服务复用。 */
|
|
219
|
+
/** 直接返回 dashboard HTML 字符串,供本地 HTTP 服务复用。serve 默认看整周使用量曲线。 */
|
|
202
220
|
async function renderDashboardHtml(options) {
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
const now = new Date();
|
|
206
|
-
const window = (0, time_1.resolveRange)(range, now);
|
|
207
|
-
const events = (await (0, storage_1.readEventsForRange)(dataDir, range, now)).map((record) => (0, payload_1.computeStatuslineEvent)(record));
|
|
208
|
-
return (0, dashboard_1.buildDashboardHtml)(events, window.label, window.start, window.end);
|
|
221
|
+
const { html } = await loadDashboardData(options, "this-week");
|
|
222
|
+
return html;
|
|
209
223
|
}
|
|
210
224
|
/** 只生成 dashboard 文件,不主动打开浏览器。 */
|
|
211
225
|
async function handleDashboardBuild(options) {
|