@mai0313/vibe-coding-tracker 1.11.0 → 2.0.0

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 CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  </div>
21
21
 
22
- **Track your AI coding costs in real-time.** Vibe Coding Tracker is a lightweight, high-performance CLI tool built in Rust that monitors and analyzes your Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, and Hermes usage — with detailed cost breakdowns, token statistics, and code operation insights, all while keeping the memory footprint minimal.
22
+ **Track your AI coding costs in real-time.** Vibe Coding Tracker is a lightweight, high-performance CLI tool built in Rust that monitors and analyzes your Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, Hermes, and Grok usage — with detailed cost breakdowns, token statistics, and code operation insights, all while keeping the memory footprint minimal.
23
23
 
24
24
  [English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md)
25
25
 
@@ -48,7 +48,7 @@ Choose your preferred view:
48
48
 
49
49
  ### Zero Configuration
50
50
 
51
- Automatically detects and processes logs from Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, and Hermes. No setup required — just run and analyze. A `~/.vct/config.toml` is created with sensible defaults on first run if you ever want to tweak behavior (see [Configuration](#configuration)).
51
+ Automatically detects and processes logs from Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, Hermes, and Grok. No setup required — just run and analyze. A `~/.vct/config.toml` is created with sensible defaults on first run if you ever want to tweak behavior (see [Configuration](#configuration)).
52
52
 
53
53
  ### Rich Insights
54
54
 
@@ -62,15 +62,15 @@ Automatically detects and processes logs from Claude Code, Codex, Copilot, Gemin
62
62
 
63
63
  ## Key Features
64
64
 
65
- | Feature | Description |
66
- | --------------------- | ------------------------------------------------------------------------------------ |
67
- | **Multi-Provider** | Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, and Hermes — all in one place |
68
- | **Smart Pricing** | Fuzzy model matching + daily cache from LiteLLM |
69
- | **4 Display Modes** | Interactive TUI, static table, plain text, and JSON |
70
- | **Dual Analysis** | Token/cost stats (`usage`) + code operation stats (`analysis`) |
71
- | **Live Quota Panels** | Live remaining quota for Claude, Codex, Copilot, and Cursor |
72
- | **Ultra-Lightweight** | Under ~50 MB RSS in the TUI, streaming JSONL parse — built with Rust |
73
- | **Live Updates** | Auto-refreshing dashboard (every 10s) with change highlighting |
65
+ | Feature | Description |
66
+ | --------------------- | ----------------------------------------------------------------------- |
67
+ | **Multi-Provider** | Claude Code, Codex, Copilot, Gemini, OpenCode, Cursor, Hermes, and Grok |
68
+ | **Smart Pricing** | Fuzzy model matching + daily cache from LiteLLM |
69
+ | **4 Display Modes** | Interactive TUI, static table, plain text, and JSON |
70
+ | **Dual Analysis** | Token/cost stats (`usage`) + code operation stats (`analysis`) |
71
+ | **Live Quota Panels** | Live remaining quota for Claude, Codex, Copilot, and Cursor |
72
+ | **Ultra-Lightweight** | Under ~50 MB RSS in the TUI, streaming session parse — built with Rust |
73
+ | **Live Updates** | Auto-refreshing dashboard (every 10s) with change highlighting |
74
74
 
75
75
  ---
76
76
 
@@ -144,7 +144,7 @@ vct <COMMAND> [OPTIONS]
144
144
  # Replace with `vibe_coding_tracker` if you are using the full binary name
145
145
 
146
146
  Commands:
147
- analysis Analyze JSONL conversation files (single file or all sessions)
147
+ analysis Analyze local session data (single file or all sessions)
148
148
  usage Display token usage statistics
149
149
  version Display version information
150
150
  update Update to the latest version from GitHub releases
@@ -176,7 +176,6 @@ Time range flags (shared by `usage` and `analysis`, mutually exclusive, default
176
176
  | `--table` | Static table, no TUI |
177
177
  | `--text` | Plain text, script-friendly |
178
178
  | `--json` | JSON with enriched pricing metadata |
179
- | `--output <FILE>` | Save enriched JSON to a file |
180
179
  | `--merge-providers` | Merge models sharing a base name across provider prefixes (ignored for `--json`) |
181
180
  | `--daily` / `--weekly` / `--monthly` / `--all` | Time range filter (see table above) |
182
181
 
@@ -195,8 +194,8 @@ vct usage --text
195
194
  # JSON for data processing (includes cost_usd and matched_model fields)
196
195
  vct usage --json
197
196
 
198
- # Save enriched JSON straight to a file
199
- vct usage --output report.json
197
+ # Save enriched JSON with shell redirection
198
+ vct usage --json > report.json
200
199
 
201
200
  # Combine time range with output format
202
201
  vct usage --weekly
@@ -292,6 +291,9 @@ The tool automatically scans these directories:
292
291
  - `~/.local/share/opencode/opencode.db` (OpenCode — SQLite database; honors `$XDG_DATA_HOME`)
293
292
  - `~/.cursor/chats/*/*/store.db` (Cursor — SQLite chat stores, used for `analysis` and a local `usage` estimate consistent with the other providers)
294
293
  - `~/.hermes/state.db` (Hermes — SQLite database, honors `$HERMES_HOME`; `usage` only)
294
+ - `$GROK_HOME/sessions/*/*/signals.json` (Grok CLI — defaults to `~/.grok`; sibling `updates.jsonl` supplies `analysis` data)
295
+
296
+ Grok `usage` is one point-in-time local context estimate: vct records `signals.json`'s `contextTokensUsed` as cache-read tokens and estimates cost at the model's cache-read price. It is not cumulative billed usage. `analysis` reconstructs completed Read / Write / Edit / Bash / TodoWrite operations from the sibling `updates.jsonl`. Grok does not support quota panels or `vct fetch`.
295
297
 
296
298
  ### Live Quota Panels
297
299
 
@@ -324,19 +326,18 @@ A panel appears only for a provider whose credentials are present. When four pan
324
326
 
325
327
  **Deep dive into code operations — see exactly what your AI assistant did.**
326
328
 
327
- ### Flags
329
+ ### Arguments and Flags
328
330
 
329
- | Flag | Purpose |
330
- | ---------------------------------------------- | ----------------------------------------------------------- |
331
- | *(none)* | Interactive TUI dashboard over all sessions |
332
- | `--path <FILE>` | Analyze a single JSONL/JSON conversation file (prints JSON) |
333
- | `--table` | Static table with per-provider totals |
334
- | `--text` | Plain text, script-friendly |
335
- | `--json` | JSON array of aggregated rows printed to stdout |
336
- | `--output <FILE>` | Save results as pretty-printed JSON |
337
- | `--daily` / `--weekly` / `--monthly` / `--all` | Time range filter (see table above) |
331
+ | Argument / Flag | Purpose |
332
+ | ---------------------------------------------- | ---------------------------------------------------------------------------------------- |
333
+ | *(none)* | Interactive TUI dashboard over all sessions |
334
+ | `<FILE>` | Analyze one JSONL/JSON session file and print its complete `CodeAnalysis` JSON |
335
+ | `--table` | Static summary table with per-provider totals |
336
+ | `--text` | Plain-text summary, script-friendly |
337
+ | `--json` | Complete parser results as JSON: one object for `<FILE>`, otherwise an array of objects |
338
+ | `--daily` / `--weekly` / `--monthly` / `--all` | Time range filter for all-session analysis (see table above; not accepted with `<FILE>`) |
338
339
 
339
- See [`examples/`](examples/) for sample inputs and matching JSON outputs for all four providers.
340
+ See [`examples/`](examples/) for sample inputs and matching JSON outputs for the four JSONL providers, plus the Grok session fixture under [`examples/grok_session/`](examples/grok_session/).
340
341
 
341
342
  ### Basic Usage
342
343
 
@@ -350,20 +351,24 @@ vct analysis --table
350
351
  # Plain text for scripts
351
352
  vct analysis --text
352
353
 
353
- # JSON of aggregated rows for data processing
354
+ # Complete parser results for every session
354
355
  vct analysis --json
355
356
 
356
357
  # Analyze a single conversation file → stdout JSON
357
- vct analysis --path ~/.claude/projects/session.jsonl
358
+ vct analysis ~/.claude/projects/session.jsonl
359
+
360
+ # Summarize only that conversation
361
+ vct analysis ~/.claude/projects/session.jsonl --table
358
362
 
359
- # Save results to JSON
360
- vct analysis --output report.json
363
+ # Save complete JSON with shell redirection
364
+ vct analysis --json > report.json
365
+ vct analysis ~/.claude/projects/session.jsonl > session-analysis.json
361
366
 
362
367
  # Combine time range with output format
363
368
  vct analysis --weekly
364
369
  vct analysis --table --monthly
365
370
  vct analysis --json --daily
366
- vct analysis --output today.json --daily
371
+ vct analysis --json --daily > today.json
367
372
  ```
368
373
 
369
374
  ### Preview: Interactive Dashboard (`vct analysis`)
@@ -390,7 +395,7 @@ vct analysis --output today.json --daily
390
395
 
391
396
  ### Preview: Table & JSON (`vct analysis`)
392
397
 
393
- `--table` renders the per-model breakdown plus a per-provider summary (with an Active Days column); `--json` emits one aggregated row per model.
398
+ `--table` renders the per-model breakdown plus a per-provider summary (with an Active Days column). `--text` and `--table` are compact projections of the same normalized parser records. `--json` keeps the complete records, including per-operation details and token usage. With no `<FILE>`, the outer array contains one `CodeAnalysis` object per session; with `<FILE>`, stdout is that single object and matches the corresponding shape under [`examples/`](examples/).
394
399
 
395
400
  ```text
396
401
  Analysis Statistics
@@ -404,23 +409,45 @@ Analysis Statistics
404
409
  └─────────────────┴────────────┴────────────┴─────────────┴──────┴──────┴──────┴───────────┴───────┘
405
410
  ```
406
411
 
407
- ```json
408
- // vct analysis --json (one model shown)
412
+ ```jsonc
413
+ // vct analysis --json (one abbreviated session shown)
409
414
  [
410
415
  {
411
- "model": "claude-opus-4-8",
412
- "editLines": 1493,
413
- "readLines": 15564,
414
- "writeLines": 970,
415
- "bashCount": 124,
416
- "editCount": 134,
417
- "readCount": 144,
418
- "todoWriteCount": 0,
419
- "writeCount": 12
416
+ "user": "alice",
417
+ "extensionName": "Claude-Code",
418
+ "insightsVersion": "...",
419
+ "machineId": "...",
420
+ "records": [
421
+ {
422
+ "totalUniqueFiles": 3,
423
+ "totalReadLines": 120,
424
+ "readFileDetails": [
425
+ {
426
+ "filePath": "/repo/src/main.rs",
427
+ "lineCount": 120,
428
+ "characterCount": 4102,
429
+ "timestamp": 1783872000000
430
+ }
431
+ ],
432
+ "toolCallCounts": { "Bash": 1, "Edit": 0, "Read": 1, "TodoWrite": 0, "Write": 0 },
433
+ "conversationUsage": { "claude-opus-4-8": { "input_tokens": 42, "output_tokens": 18 } }
434
+ }
435
+ ]
420
436
  }
421
437
  ]
422
438
  ```
423
439
 
440
+ > [!WARNING]
441
+ > Complete analysis JSON can be large and may contain source text, edit bodies, shell commands, absolute paths, repository URLs, user names, machine identifiers, and token metadata. Review it before sharing.
442
+
443
+ Batch analysis reads live provider stores. If an assistant appends to a session during the scan, later runs can legitimately contain newer data. Unchanged inputs serialize in a deterministic order.
444
+
445
+ Noninteractive analysis returns an error when every discovered source fails or uses an unrecognized schema. If only some sources fail, successful output is preserved and a warning is written to stderr.
446
+
447
+ `analysis FILE` follows the same rule for malformed or unsupported records inside one file: parsed JSON/text/table output is preserved on stdout and a generic skipped-record warning is written to stderr.
448
+
449
+ Codex code-mode sessions expose a completed JavaScript `exec` cell but no structured trace for its nested tools. VCT counts that cell as one Bash call and preserves its source in complete JSON, but does not guess nested Read/Edit/Write operations.
450
+
424
451
  ---
425
452
 
426
453
  ## Update Command
@@ -549,6 +576,15 @@ copilot = true
549
576
  gemini = true
550
577
  opencode = true
551
578
  cursor = true
579
+ hermes = true
580
+ grok = true
581
+
582
+ [logging]
583
+ # Minimum level written to ~/.vct/logs/vct-YYYY-MM-DD.log.
584
+ # One of: "off" | "error" | "warn" | "info" | "debug" | "trace".
585
+ level = "warn"
586
+ # Days of daily log files to keep; older files are pruned on startup. 0 keeps every file.
587
+ retention_days = 7
552
588
  ```
553
589
 
554
590
  | Setting | Effect |
@@ -560,10 +596,15 @@ cursor = true
560
596
  | `usage.quota.refresh_interval` | Poll cadence for every live quota panel (seconds); higher is safer against a provider's rate limits. |
561
597
  | `analysis.refresh_interval` | Redraw cadence of the `analysis` dashboard (seconds). |
562
598
  | `providers.*` | Skip a provider entirely (no scan, no API) when `false` — handy if you don't use one. |
599
+ | `logging.level` | Minimum severity written to the log file (`off`..`trace`); never printed to the terminal. |
600
+ | `logging.retention_days` | Days of daily log files to keep; older `vct-*.log` are pruned on startup (`0` keeps all). |
563
601
 
564
602
  > [!NOTE]
565
603
  > Cursor `usage` is a **local estimate** from the chat stores, so it behaves like Claude Code / Codex / Copilot / Gemini (all computed from local session files) and needs no network. It undercounts Cursor's real spend, because much of it is billed under Cursor-internal model names the local data cannot price — treat Cursor cost as approximate.
566
604
 
605
+ > [!NOTE]
606
+ > vct writes diagnostics to `~/.vct/logs/vct-YYYY-MM-DD.log` (plain text, file only — never shown in the dashboard). It stays quiet when healthy (default level `warn`) and the file is created lazily, so a healthy run leaves nothing behind. When a quota fetch fails or a session is skipped, that is where the reason is recorded — bump `logging.level` to `debug` for the full detail.
607
+
567
608
  ### Managing the file
568
609
 
569
610
  ```bash
@@ -609,6 +650,7 @@ vct config migrate
609
650
  - **Beyond tokens**: Claude web-search tool calls (`server_tool_use.web_search_requests`) are billed per query on top of the token cost; every other model's per-query charge is $0.
610
651
  - **OpenCode**: a novel model name is priced from its tokens only on an **exact** LiteLLM match; with no exact match, vct trusts the assistant message's own stored cost instead of guessing from a loosely-similar name.
611
652
  - **Hermes**: priced the same way as OpenCode — an **exact** LiteLLM match prices from tokens, otherwise vct uses Hermes's own stored cost.
653
+ - **Grok**: `contextTokensUsed` is priced as cache-read tokens only; this is a point-in-time local context estimate, not cumulative billed usage.
612
654
  - **Cache is raw**: the daily cache stores the filtered upstream LiteLLM JSON (not a derived shape), so tiered / batch pricing stays available without re-fetching, and a small in-process LRU keeps repeated lookups cheap during a TUI refresh.
613
655
 
614
656
  ---
package/README.zh-CN.md CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  </div>
21
21
 
22
- **实时追踪你的 AI 编程开销。** Vibe Coding Tracker 是一款基于 Rust 构建的轻量级高性能 CLI 工具,用于监控和分析你在 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 和 Hermes 上的使用情况——提供详细的费用明细、token 统计和代码操作洞察,同时保持极低的内存占用。
22
+ **实时追踪你的 AI 编程开销。** Vibe Coding Tracker 是一款基于 Rust 构建的轻量级高性能 CLI 工具,用于监控和分析你在 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 和 Grok 上的使用情况——提供详细的费用明细、token 统计和代码操作洞察,同时保持极低的内存占用。
23
23
 
24
24
  [English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md)
25
25
 
@@ -48,7 +48,7 @@
48
48
 
49
49
  ### 零配置
50
50
 
51
- 自动检测并处理来自 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 和 Hermes 的日志。无需任何设置——直接运行即可分析。首次运行时会自动生成一个带有合理默认值的 `~/.vct/config.toml`,方便你日后想调整行为时使用(参见 [配置](#%E9%85%8D%E7%BD%AE))。
51
+ 自动检测并处理来自 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 和 Grok 的日志。无需任何设置——直接运行即可分析。首次运行时会自动生成一个带有合理默认值的 `~/.vct/config.toml`,方便你日后想调整行为时使用(参见 [配置](#%E9%85%8D%E7%BD%AE))。
52
52
 
53
53
  ### 丰富的洞察
54
54
 
@@ -62,15 +62,15 @@
62
62
 
63
63
  ## 核心特性
64
64
 
65
- | 特性 | 说明 |
66
- | ---------------- | --------------------------------------------------------------------------- |
67
- | **多供应商支持** | Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 和 Hermes——一站式管理 |
68
- | **智能定价** | 模糊模型匹配 + 从 LiteLLM 每日缓存更新 |
69
- | **4 种显示模式** | 交互式 TUI、静态表格、纯文本和 JSON |
70
- | **双维度分析** | token/费用统计(`usage`)+ 代码操作统计(`analysis`) |
71
- | **实时额度面板** | Claude、Codex、Copilot 和 Cursor 的实时剩余额度 |
72
- | **超轻量级** | TUI 常驻内存 50 MB 以内、流式 JSONL 解析——基于 Rust 构建 |
73
- | **实时更新** | 面板自动刷新(每 10 秒),并高亮变化 |
65
+ | 特性 | 说明 |
66
+ | ---------------- | --------------------------------------------------------------------- |
67
+ | **多供应商支持** | Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 和 Grok |
68
+ | **智能定价** | 模糊模型匹配 + 从 LiteLLM 每日缓存更新 |
69
+ | **4 种显示模式** | 交互式 TUI、静态表格、纯文本和 JSON |
70
+ | **双维度分析** | token/费用统计(`usage`)+ 代码操作统计(`analysis`) |
71
+ | **实时额度面板** | Claude、Codex、Copilot 和 Cursor 的实时剩余额度 |
72
+ | **超轻量级** | TUI 常驻内存 50 MB 以内、流式 session 解析——基于 Rust 构建 |
73
+ | **实时更新** | 面板自动刷新(每 10 秒),并高亮变化 |
74
74
 
75
75
  ---
76
76
 
@@ -144,7 +144,7 @@ vct <COMMAND> [OPTIONS]
144
144
  # Replace with `vibe_coding_tracker` if you are using the full binary name
145
145
 
146
146
  Commands:
147
- analysis Analyze JSONL conversation files (single file or all sessions)
147
+ analysis Analyze local session data (single file or all sessions)
148
148
  usage Display token usage statistics
149
149
  version Display version information
150
150
  update Update to the latest version from GitHub releases
@@ -176,7 +176,6 @@ Commands:
176
176
  | `--table` | 静态表格,不启动 TUI |
177
177
  | `--text` | 纯文本,适合脚本处理 |
178
178
  | `--json` | JSON 输出,附带定价信息 |
179
- | `--output <FILE>` | 将富化 JSON 保存到文件 |
180
179
  | `--merge-providers` | 合并共享同一 base 名称、仅 provider 前缀不同的 model(`--json` 会忽略此选项) |
181
180
  | `--daily` / `--weekly` / `--monthly` / `--all` | 时间范围筛选(见上方表格) |
182
181
 
@@ -195,8 +194,8 @@ vct usage --text
195
194
  # JSON 输出,包含 cost_usd 与 matched_model 字段
196
195
  vct usage --json
197
196
 
198
- # 直接把富化 JSON 保存到文件
199
- vct usage --output report.json
197
+ # 通过 shell redirection 保存富化 JSON
198
+ vct usage --json > report.json
200
199
 
201
200
  # 时间范围与输出格式可自由组合
202
201
  vct usage --weekly
@@ -292,6 +291,9 @@ Totals (by Provider)
292
291
  - `~/.local/share/opencode/opencode.db`(OpenCode,SQLite 数据库;遵循 `$XDG_DATA_HOME`)
293
292
  - `~/.cursor/chats/*/*/store.db`(Cursor,SQLite 会话库,用于 `analysis`,并给出一个与其他 provider 一致的本地 `usage` 估算)
294
293
  - `~/.hermes/state.db`(Hermes,SQLite 数据库,遵循 `$HERMES_HOME`;仅 `usage`)
294
+ - `$GROK_HOME/sessions/*/*/signals.json`(Grok CLI,默认使用 `~/.grok`;同层的 `updates.jsonl` 提供 `analysis` 数据)
295
+
296
+ Grok 的 `usage` 是单一时点的本地 context 估算:vct 会把 `signals.json` 的 `contextTokensUsed` 记为 cache-read token,并按该 model 的 cache-read 费率估算费用。这不是累计的 billed usage。`analysis` 会从同层的 `updates.jsonl` 还原已完成的 Read / Write / Edit / Bash / TodoWrite 操作。Grok 不支持 quota panel 或 `vct fetch`。
295
297
 
296
298
  ### 实时额度面板
297
299
 
@@ -324,19 +326,18 @@ Totals (by Provider)
324
326
 
325
327
  **深入了解代码操作——查看你的 AI 助手到底做了什么。**
326
328
 
327
- ### Flag 一览
329
+ ### 参数与 Flag
328
330
 
329
- | Flag | 用途 |
330
- | ---------------------------------------------- | ------------------------------------------------ |
331
- | *(不带参数)* | 互动式 TUI 面板,覆盖所有 session |
332
- | `--path <FILE>` | 分析单一 JSONL/JSON 对话文件(stdout 输出 JSON) |
333
- | `--table` | 静态表格,附带按供应商的总计 |
334
- | `--text` | 纯文本,方便脚本处理 |
335
- | `--json` | 将聚合 row 以 JSON 数组输出到 stdout |
336
- | `--output <FILE>` | 将结果以格式化 JSON 保存到文件 |
337
- | `--daily` / `--weekly` / `--monthly` / `--all` | 时间范围筛选(见上方表格) |
331
+ | 参数 / Flag | 用途 |
332
+ | ---------------------------------------------- | ---------------------------------------------------------------------------- |
333
+ | *(不带参数)* | 互动式 TUI 面板, 覆盖所有 session |
334
+ | `<FILE>` | 分析单一 JSONL/JSON session 文件, 并将完整 `CodeAnalysis` JSON 输出到 stdout |
335
+ | `--table` | 静态摘要表格, 附带 provider 汇总 |
336
+ | `--text` | 纯文本摘要, 方便脚本处理 |
337
+ | `--json` | 完整 parser 结果. 搭配 `<FILE>` 时为单一 object, 否则为 object 数组 |
338
+ | `--daily` / `--weekly` / `--monthly` / `--all` | 所有 session 的时间范围筛选. 不可与 `<FILE>` 同时使用, 其他说明见上方表格 |
338
339
 
339
- 参见 [`examples/`](examples/) 目录,其中包含四种 provider 的示例输入与对应 JSON 输出。
340
+ 参见 [`examples/`](examples/) 目录,其中包含四种 JSONL provider 的示例输入与对应 JSON 输出,以及 [`examples/grok_session/`](examples/grok_session/) 下的 Grok session fixture。
340
341
 
341
342
  ### 基本用法
342
343
 
@@ -350,20 +351,24 @@ vct analysis --table
350
351
  # 纯文本输出,方便脚本处理
351
352
  vct analysis --text
352
353
 
353
- # 聚合数据以 JSON 输出,方便后续处理
354
+ # 输出所有 session 的完整 parser 结果
354
355
  vct analysis --json
355
356
 
356
- # 分析单一对话文件 → stdout JSON
357
- vct analysis --path ~/.claude/projects/session.jsonl
357
+ # 分析单一对话文件并输出 JSON
358
+ vct analysis ~/.claude/projects/session.jsonl
359
+
360
+ # 只汇总这个对话文件
361
+ vct analysis ~/.claude/projects/session.jsonl --table
358
362
 
359
- # Save results to JSON
360
- vct analysis --output report.json
363
+ # 通过 shell redirection 保存完整 JSON
364
+ vct analysis --json > report.json
365
+ vct analysis ~/.claude/projects/session.jsonl > session-analysis.json
361
366
 
362
367
  # 时间范围与输出格式可自由组合
363
368
  vct analysis --weekly
364
369
  vct analysis --table --monthly
365
370
  vct analysis --json --daily
366
- vct analysis --output today.json --daily
371
+ vct analysis --json --daily > today.json
367
372
  ```
368
373
 
369
374
  ### 预览:交互式面板(`vct analysis`)
@@ -390,7 +395,7 @@ vct analysis --output today.json --daily
390
395
 
391
396
  ### 预览:表格与 JSON(`vct analysis`)
392
397
 
393
- `--table` 会渲染按 model 细分的数据,并附带按 provider 的汇总(含 Active Days 列);`--json` 则为每个 model 输出一行聚合数据。
398
+ `--table` 会显示各 model 的明细, 并附上各 provider 的汇总, 包含 Active Days 列. `--text` 与 `--table` 都是相同 normalized parser records 的精简 projection. `--json` 会保留完整 records, 包括每次操作的 details 与 token usage. 未提供 `<FILE>` 时, 外层数组中的每个元素都是一个 session 的 `CodeAnalysis` object. 提供 `<FILE>` 时, stdout 只会输出该 object, shape 与 [`examples/`](examples/) 中对应的结果相同.
394
399
 
395
400
  ```text
396
401
  Analysis Statistics
@@ -404,23 +409,45 @@ Analysis Statistics
404
409
  └─────────────────┴────────────┴────────────┴─────────────┴──────┴──────┴──────┴───────────┴───────┘
405
410
  ```
406
411
 
407
- ```json
408
- // vct analysis --json (one model shown)
412
+ ```jsonc
413
+ // vct analysis --json (one abbreviated session shown)
409
414
  [
410
415
  {
411
- "model": "claude-opus-4-8",
412
- "editLines": 1493,
413
- "readLines": 15564,
414
- "writeLines": 970,
415
- "bashCount": 124,
416
- "editCount": 134,
417
- "readCount": 144,
418
- "todoWriteCount": 0,
419
- "writeCount": 12
416
+ "user": "alice",
417
+ "extensionName": "Claude-Code",
418
+ "insightsVersion": "...",
419
+ "machineId": "...",
420
+ "records": [
421
+ {
422
+ "totalUniqueFiles": 3,
423
+ "totalReadLines": 120,
424
+ "readFileDetails": [
425
+ {
426
+ "filePath": "/repo/src/main.rs",
427
+ "lineCount": 120,
428
+ "characterCount": 4102,
429
+ "timestamp": 1783872000000
430
+ }
431
+ ],
432
+ "toolCallCounts": { "Bash": 1, "Edit": 0, "Read": 1, "TodoWrite": 0, "Write": 0 },
433
+ "conversationUsage": { "claude-opus-4-8": { "input_tokens": 42, "output_tokens": 18 } }
434
+ }
435
+ ]
420
436
  }
421
437
  ]
422
438
  ```
423
439
 
440
+ > [!WARNING]
441
+ > 完整 analysis JSON 可能很大, 也可能包含 source text, edit body, shell command, absolute path, repository URL, user name, machine identifier 与 token metadata. 分享前请先检查内容.
442
+
443
+ Batch analysis 会读取 Provider 的实时数据. 如果 assistant 在扫描期间继续写入 session, 后续执行可能合理地包含更新数据. 未变动的 input 会产生固定顺序的输出.
444
+
445
+ 如果找到的 source 全部读取失败或使用无法识别的 schema, 非交互式 analysis 会返回 error. 如果只有部分 source 失败, 成功结果会保留, warning 会写入 stderr.
446
+
447
+ `analysis FILE` 对单一文件内格式错误或不受支持的 record 采用相同行为: 在 stdout 保留已解析的 JSON/text/table 输出, 并将一般性的 skipped-record warning 写入 stderr.
448
+
449
+ Codex code mode session 会提供已完成的 JavaScript `exec` cell, 但没有 nested tool 的结构化 trace. VCT 会将该 cell 计为一次 Bash call, 并在完整 JSON 中保留 source, 但不会猜测 nested Read/Edit/Write operation.
450
+
424
451
  ---
425
452
 
426
453
  ## Update 命令
@@ -548,6 +575,15 @@ copilot = true
548
575
  gemini = true
549
576
  opencode = true
550
577
  cursor = true
578
+ hermes = true
579
+ grok = true
580
+
581
+ [logging]
582
+ # 写入 ~/.vct/logs/vct-YYYY-MM-DD.log 的最低日志级别。
583
+ # 取值: "off" | "error" | "warn" | "info" | "debug" | "trace"。
584
+ level = "warn"
585
+ # 保留多少天的每日日志文件; 更旧的文件会在启动时清除。0 表示全部保留。
586
+ retention_days = 7
551
587
  ```
552
588
 
553
589
  | 设置项 | 作用 |
@@ -559,6 +595,11 @@ cursor = true
559
595
  | `usage.quota.refresh_interval` | 每个实时额度面板的轮询间隔(秒);数值越大越不容易触发 provider 的速率限制。 |
560
596
  | `analysis.refresh_interval` | `analysis` 面板的自动刷新间隔(秒)。 |
561
597
  | `providers.*` | 设为 `false` 时完全跳过某个 provider(不扫描、不调用 API)——如果你不用某个 provider 会很方便。 |
598
+ | `logging.level` | 写入日志文件的最低级别(`off`..`trace`);从不打印到终端。 |
599
+ | `logging.retention_days` | 保留多少天的每日日志文件;更旧的 `vct-*.log` 会在启动时清除(`0` 表示全部保留)。 |
600
+
601
+ > [!NOTE]
602
+ > vct 会把诊断信息写入 `~/.vct/logs/vct-YYYY-MM-DD.log`(纯文本,仅写文件,绝不显示在面板上)。健康运行时保持安静(默认级别 `warn`),且文件是惰性创建的,所以一次正常运行不会留下任何文件。当额度获取失败或某个 session 被跳过时,原因就记录在这里——需要完整细节时把 `logging.level` 调到 `debug`。
562
603
 
563
604
  > [!NOTE]
564
605
  > Cursor 的 `usage` 是从聊天库得出的**本地估算**,因此它会像 Claude Code / Codex / Copilot / Gemini 一样(都是从本地 session 文件计算得出)无需联网。该估算会低估 Cursor 的真实花费,因为其中很大一部分是以 Cursor 内部的 model 名称计费,本地数据无法为这些名称定价,所以请把 Cursor 费用视为近似值。
@@ -608,6 +649,7 @@ vct config migrate
608
649
  - **不止 token**:Claude 的 web-search 工具调用(`server_tool_use.web_search_requests`)会在 token 费用之外按每次查询计费;其他所有 model 的每次查询费用均为 $0。
609
650
  - **OpenCode**:只有在 LiteLLM 上**精确**匹配时,才会根据 token 为一个全新的 model 名称定价;若没有精确匹配,vct 会信任该 assistant message 自身存储的费用,而不是从一个只是大致相似的名称去猜测。
610
651
  - **Hermes**:与 OpenCode 相同,LiteLLM 上**精确**匹配时按 token 定价,否则使用 Hermes 自身存储的费用。
652
+ - **Grok**:只会把 `contextTokensUsed` 作为 cache-read token 计价;这是单一时点的本地 context 估算,不是累计的 billed usage。
611
653
  - **缓存为原始数据**:每日缓存存储的是经过筛选的上游 LiteLLM JSON(而非派生后的结构),因此无需重新获取即可保留分层 / 批量定价;此外还有一个小型的进程内 LRU,让 TUI 刷新期间的重复查询保持低开销。
612
654
 
613
655
  ---
package/README.zh-TW.md CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  </div>
21
21
 
22
- **即時追蹤你的 AI 程式設計花費。** Vibe Coding Tracker 是一款以 Rust 打造的輕量、高效能 CLI 工具,能監控與分析你在 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 及 Hermes 的使用狀況——提供詳細的費用明細、token 統計資料與程式碼操作分析,同時維持極低的記憶體使用量。
22
+ **即時追蹤你的 AI 程式設計花費。** Vibe Coding Tracker 是一款以 Rust 打造的輕量、高效能 CLI 工具,能監控與分析你在 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 及 Grok 的使用狀況——提供詳細的費用明細、token 統計資料與程式碼操作分析,同時維持極低的記憶體使用量。
23
23
 
24
24
  [English](README.md) | [繁體中文](README.zh-TW.md) | [简体中文](README.zh-CN.md)
25
25
 
@@ -48,7 +48,7 @@
48
48
 
49
49
  ### 零設定
50
50
 
51
- 自動偵測並處理 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 及 Hermes 的日誌檔。不需要任何設定——直接執行就能分析。首次執行時會以合理的預設值建立 `~/.vct/config.toml`,日後若想微調行為即可編輯它(見 [設定](#%E8%A8%AD%E5%AE%9A))。
51
+ 自動偵測並處理 Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 及 Grok 的日誌檔。不需要任何設定——直接執行就能分析。首次執行時會以合理的預設值建立 `~/.vct/config.toml`,日後若想微調行為即可編輯它(見 [設定](#%E8%A8%AD%E5%AE%9A))。
52
52
 
53
53
  ### 豐富洞察
54
54
 
@@ -62,15 +62,15 @@
62
62
 
63
63
  ## 主要功能
64
64
 
65
- | 功能 | 說明 |
66
- | ---------------- | ------------------------------------------------------------------------- |
67
- | **多供應商支援** | Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor 及 Hermes——一站整合 |
68
- | **智慧定價** | 模糊模型比對 + 每日從 LiteLLM cache 更新 |
69
- | **4 種顯示模式** | 互動式 TUI、靜態表格、純文字及 JSON |
70
- | **雙重分析** | Token / 費用統計(`usage`)+ 程式碼操作統計(`analysis`) |
71
- | **即時額度面板** | 即時顯示 Claude、Codex、Copilot 與 Cursor 的剩餘額度 |
72
- | **超輕量** | TUI 常駐記憶體 ~50 MB 以內、串流 JSONL 解析——以 Rust 打造 |
73
- | **即時更新** | 每 10 秒自動刷新的儀表板並突顯變更 |
65
+ | 功能 | 說明 |
66
+ | ---------------- | --------------------------------------------------------------------- |
67
+ | **多供應商支援** | Claude Code、Codex、Copilot、Gemini、OpenCode、Cursor、Hermes 及 Grok |
68
+ | **智慧定價** | 模糊模型比對 + 每日從 LiteLLM cache 更新 |
69
+ | **4 種顯示模式** | 互動式 TUI、靜態表格、純文字及 JSON |
70
+ | **雙重分析** | Token / 費用統計(`usage`)+ 程式碼操作統計(`analysis`) |
71
+ | **即時額度面板** | 即時顯示 Claude、Codex、Copilot 與 Cursor 的剩餘額度 |
72
+ | **超輕量** | TUI 常駐記憶體 ~50 MB 以內、串流 session 解析——以 Rust 打造 |
73
+ | **即時更新** | 每 10 秒自動刷新的儀表板並突顯變更 |
74
74
 
75
75
  ---
76
76
 
@@ -144,7 +144,7 @@ vct <COMMAND> [OPTIONS]
144
144
  # Replace with `vibe_coding_tracker` if you are using the full binary name
145
145
 
146
146
  Commands:
147
- analysis Analyze JSONL conversation files (single file or all sessions)
147
+ analysis Analyze local session data (single file or all sessions)
148
148
  usage Display token usage statistics
149
149
  version Display version information
150
150
  update Update to the latest version from GitHub releases
@@ -176,7 +176,6 @@ Commands:
176
176
  | `--table` | 靜態表格,不啟動 TUI |
177
177
  | `--text` | 純文字,適合腳本處理 |
178
178
  | `--json` | JSON 輸出,附帶 pricing 資訊 |
179
- | `--output <FILE>` | 將富化 JSON 存成檔案 |
180
179
  | `--merge-providers` | 合併共享同一 base 名稱、僅 provider 前綴不同的 model(`--json` 會忽略此選項) |
181
180
  | `--daily` / `--weekly` / `--monthly` / `--all` | 時間範圍篩選(見上方表格) |
182
181
 
@@ -195,8 +194,8 @@ vct usage --text
195
194
  # JSON 輸出,包含 cost_usd 與 matched_model 欄位
196
195
  vct usage --json
197
196
 
198
- # 直接把富化 JSON 存成檔案
199
- vct usage --output report.json
197
+ # 透過 shell redirection 儲存富化 JSON
198
+ vct usage --json > report.json
200
199
 
201
200
  # 時間範圍與輸出格式可自由組合
202
201
  vct usage --weekly
@@ -292,6 +291,9 @@ Totals (by Provider)
292
291
  - `~/.local/share/opencode/opencode.db`(OpenCode,SQLite 資料庫;遵循 `$XDG_DATA_HOME`)
293
292
  - `~/.cursor/chats/*/*/store.db`(Cursor,SQLite 對話庫,用於 `analysis`,並產生與其他 provider 一致的本地 `usage` 估算)
294
293
  - `~/.hermes/state.db`(Hermes,SQLite 資料庫,遵循 `$HERMES_HOME`;僅 `usage`)
294
+ - `$GROK_HOME/sessions/*/*/signals.json`(Grok CLI,預設使用 `~/.grok`;同層的 `updates.jsonl` 提供 `analysis` 資料)
295
+
296
+ Grok 的 `usage` 是單一當下的本地 context 估算:vct 會把 `signals.json` 的 `contextTokensUsed` 記為 cache-read token,並以該 model 的 cache-read 費率估算費用。這不是累計的 billed usage。`analysis` 會從同層的 `updates.jsonl` 還原已完成的 Read / Write / Edit / Bash / TodoWrite 操作。Grok 不支援 quota panel 或 `vct fetch`。
295
297
 
296
298
  ### 即時額度面板
297
299
 
@@ -324,19 +326,18 @@ Totals (by Provider)
324
326
 
325
327
  **深入分析程式碼操作——精確掌握你的 AI 助手做了哪些事。**
326
328
 
327
- ### Flag 一覽
329
+ ### 參數與 Flag
328
330
 
329
- | Flag | 用途 |
330
- | ---------------------------------------------- | ------------------------------------------------ |
331
- | *(不帶參數)* | 互動式 TUI 儀表板,涵蓋所有 session |
332
- | `--path <FILE>` | 分析單一 JSONL/JSON 對話檔案(stdout 輸出 JSON) |
333
- | `--table` | 靜態表格,附帶供應商總計 |
334
- | `--text` | 純文字,方便腳本處理 |
335
- | `--json` | 將聚合 row 以 JSON 陣列輸出到 stdout |
336
- | `--output <FILE>` | 將結果以格式化 JSON 存成檔案 |
337
- | `--daily` / `--weekly` / `--monthly` / `--all` | 時間範圍篩選(見上方表格) |
331
+ | 參數 / Flag | 用途 |
332
+ | ---------------------------------------------- | ---------------------------------------------------------------------------- |
333
+ | *(不帶參數)* | 互動式 TUI 儀表板, 涵蓋所有 session |
334
+ | `<FILE>` | 分析單一 JSONL/JSON session 檔案, 並將完整 `CodeAnalysis` JSON 輸出到 stdout |
335
+ | `--table` | 靜態摘要表格, 附帶 provider 總計 |
336
+ | `--text` | 純文字摘要, 方便腳本處理 |
337
+ | `--json` | 完整 parser 結果. 搭配 `<FILE>` 時為單一 object, 否則為 object 陣列 |
338
+ | `--daily` / `--weekly` / `--monthly` / `--all` | 所有 session 的時間範圍篩選. 不可與 `<FILE>` 同時使用, 其他說明見上方表格 |
338
339
 
339
- 請參考 [`examples/`](examples/) 目錄,裡面有四種 provider 的範例輸入與對應的 JSON 輸出。
340
+ 請參考 [`examples/`](examples/) 目錄,裡面有四種 JSONL provider 的範例輸入與對應的 JSON 輸出,以及 [`examples/grok_session/`](examples/grok_session/) 下的 Grok session fixture。
340
341
 
341
342
  ### 基本用法
342
343
 
@@ -350,20 +351,24 @@ vct analysis --table
350
351
  # 純文字輸出,方便腳本處理
351
352
  vct analysis --text
352
353
 
353
- # 聚合資料以 JSON 輸出,方便後續處理
354
+ # 輸出所有 session 的完整 parser 結果
354
355
  vct analysis --json
355
356
 
356
- # 分析單一對話檔案 → stdout JSON
357
- vct analysis --path ~/.claude/projects/session.jsonl
357
+ # 分析單一對話檔案並輸出 JSON
358
+ vct analysis ~/.claude/projects/session.jsonl
359
+
360
+ # 只摘要這個對話檔案
361
+ vct analysis ~/.claude/projects/session.jsonl --table
358
362
 
359
- # Save results to JSON
360
- vct analysis --output report.json
363
+ # 透過 shell redirection 儲存完整 JSON
364
+ vct analysis --json > report.json
365
+ vct analysis ~/.claude/projects/session.jsonl > session-analysis.json
361
366
 
362
367
  # 時間範圍與輸出格式可自由組合
363
368
  vct analysis --weekly
364
369
  vct analysis --table --monthly
365
370
  vct analysis --json --daily
366
- vct analysis --output today.json --daily
371
+ vct analysis --json --daily > today.json
367
372
  ```
368
373
 
369
374
  ### 預覽:互動式儀表板(`vct analysis`)
@@ -390,7 +395,7 @@ vct analysis --output today.json --daily
390
395
 
391
396
  ### 預覽:表格與 JSON(`vct analysis`)
392
397
 
393
- `--table` 會呈現每個 model 的明細以及每個供應商的彙總(含 Active Days 欄位);`--json` 則為每個 model 輸出一列聚合資料。
398
+ `--table` 會顯示各 model 的明細, 並附上各 provider 的摘要, 包含 Active Days 欄位. `--text` 與 `--table` 都是相同 normalized parser records 的精簡 projection. `--json` 會保留完整 records, 包括每次操作的 details 與 token usage. 未提供 `<FILE>` 時, 外層陣列中的每個元素都是一個 session 的 `CodeAnalysis` object. 提供 `<FILE>` 時, stdout 只會輸出該 object, shape 與 [`examples/`](examples/) 中對應的結果相同.
394
399
 
395
400
  ```text
396
401
  Analysis Statistics
@@ -404,23 +409,45 @@ Analysis Statistics
404
409
  └─────────────────┴────────────┴────────────┴─────────────┴──────┴──────┴──────┴───────────┴───────┘
405
410
  ```
406
411
 
407
- ```json
408
- // vct analysis --json (one model shown)
412
+ ```jsonc
413
+ // vct analysis --json (one abbreviated session shown)
409
414
  [
410
415
  {
411
- "model": "claude-opus-4-8",
412
- "editLines": 1493,
413
- "readLines": 15564,
414
- "writeLines": 970,
415
- "bashCount": 124,
416
- "editCount": 134,
417
- "readCount": 144,
418
- "todoWriteCount": 0,
419
- "writeCount": 12
416
+ "user": "alice",
417
+ "extensionName": "Claude-Code",
418
+ "insightsVersion": "...",
419
+ "machineId": "...",
420
+ "records": [
421
+ {
422
+ "totalUniqueFiles": 3,
423
+ "totalReadLines": 120,
424
+ "readFileDetails": [
425
+ {
426
+ "filePath": "/repo/src/main.rs",
427
+ "lineCount": 120,
428
+ "characterCount": 4102,
429
+ "timestamp": 1783872000000
430
+ }
431
+ ],
432
+ "toolCallCounts": { "Bash": 1, "Edit": 0, "Read": 1, "TodoWrite": 0, "Write": 0 },
433
+ "conversationUsage": { "claude-opus-4-8": { "input_tokens": 42, "output_tokens": 18 } }
434
+ }
435
+ ]
420
436
  }
421
437
  ]
422
438
  ```
423
439
 
440
+ > [!WARNING]
441
+ > 完整 analysis JSON 可能很大, 也可能包含 source text, edit body, shell command, absolute path, repository URL, user name, machine identifier 與 token metadata. 分享前請先檢查內容.
442
+
443
+ Batch analysis 會讀取 Provider 的即時資料. 如果 assistant 在掃描期間繼續寫入 session, 後續執行可能合理地包含更新資料. 未變動的 input 會產生固定順序的輸出.
444
+
445
+ 如果找到的 source 全部讀取失敗或使用無法辨識的 schema, 非互動式 analysis 會回傳 error. 如果只有部分 source 失敗, 成功結果會保留, warning 會寫入 stderr.
446
+
447
+ `analysis FILE` 對單一檔案內格式錯誤或不受支援的 record 採用相同行為: 在 stdout 保留已解析的 JSON/text/table 輸出, 並將一般性的 skipped-record warning 寫入 stderr.
448
+
449
+ Codex code mode session 會提供已完成的 JavaScript `exec` cell, 但沒有 nested tool 的結構化 trace. VCT 會將該 cell 計為一次 Bash call, 並在完整 JSON 中保留 source, 但不會猜測 nested Read/Edit/Write operation.
450
+
424
451
  ---
425
452
 
426
453
  ## Update 指令
@@ -548,6 +575,15 @@ copilot = true
548
575
  gemini = true
549
576
  opencode = true
550
577
  cursor = true
578
+ hermes = true
579
+ grok = true
580
+
581
+ [logging]
582
+ # 寫入 ~/.vct/logs/vct-YYYY-MM-DD.log 的最低日誌等級。
583
+ # 取值: "off" | "error" | "warn" | "info" | "debug" | "trace"。
584
+ level = "warn"
585
+ # 保留幾天的每日日誌檔; 更舊的檔案會在啟動時清除。0 表示全部保留。
586
+ retention_days = 7
551
587
  ```
552
588
 
553
589
  | 設定項 | 效果 |
@@ -559,6 +595,11 @@ cursor = true
559
595
  | `usage.quota.refresh_interval` | 每個即時額度面板的輪詢間隔(秒);數值越大越不容易觸發 provider 的速率限制。 |
560
596
  | `analysis.refresh_interval` | `analysis` 儀表板自動刷新的間隔(秒)。 |
561
597
  | `providers.*` | 設為 `false` 時完全略過某個 provider(不掃描、不呼叫 API),沒在用的話很方便。 |
598
+ | `logging.level` | 寫入日誌檔的最低等級(`off`..`trace`);絕不會印到終端機。 |
599
+ | `logging.retention_days` | 保留幾天的每日日誌檔;更舊的 `vct-*.log` 會在啟動時清除(`0` 表示全部保留)。 |
600
+
601
+ > [!NOTE]
602
+ > vct 會把診斷訊息寫入 `~/.vct/logs/vct-YYYY-MM-DD.log`(純文字,只寫檔案,絕不顯示在儀表板上)。健康運行時保持安靜(預設等級 `warn`),而且檔案是延遲建立的,所以一次正常執行不會留下任何檔案。當額度抓取失敗或某個 session 被略過時,原因就記錄在這裡——需要完整細節時把 `logging.level` 調到 `debug`。
562
603
 
563
604
  > [!NOTE]
564
605
  > Cursor 的 `usage` 是從對話庫產生的**本地估算**,因此行為與 Claude Code / Codex / Copilot / Gemini 一致(全都是從本地 session 檔案計算),而且不需要連網。這個估算會低估 Cursor 的真實花費,因為其中有很大一部分是以 Cursor 內部的 model 名稱計費,而本地資料無法為這些名稱定價,所以請把 Cursor 的費用視為概估值。
@@ -608,6 +649,7 @@ vct config migrate
608
649
  - **不只 token**:Claude 的網頁搜尋工具呼叫(`server_tool_use.web_search_requests`)會在 token 費用之外,按每次查詢計費;其他所有 model 的每次查詢費用皆為 $0。
609
650
  - **OpenCode**:只有在 LiteLLM **完全比對**成功時,才會依 token 為新型 model 計價;若沒有完全比對,vct 會採信該 assistant 訊息本身儲存的費用,而不是從名稱相近的 model 去猜測。
610
651
  - **Hermes**:與 OpenCode 相同,LiteLLM **完全比對**成功時依 token 計價,否則使用 Hermes 本身儲存的費用。
652
+ - **Grok**:只會把 `contextTokensUsed` 當成 cache-read token 計價;這是單一當下的本地 context 估算,不是累計的 billed usage。
611
653
  - **原始 cache**:每日 cache 儲存的是經過篩選的上游 LiteLLM JSON(而非衍生後的結構),因此分層 / 批次定價無需重新抓取即可使用;另外一個小型的行內 LRU 會讓 TUI 刷新期間的重複查詢維持低成本。
612
654
 
613
655
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mai0313/vibe-coding-tracker",
3
- "version": "1.11.0",
3
+ "version": "2.0.0",
4
4
  "description": "Vibe Coding Tracker - AI coding assistant telemetry/usage parser, aggregate JSONL events into CodeAnalysis results",
5
5
  "author": "Wei Lee <mai@mai0313.com>",
6
6
  "license": "MIT",