claude-token-parser 1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Maximilian Falco Widjaya
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # claude-token-parser
2
+
3
+ Parse [Claude Code](https://claude.ai/code) session logs into token usage summaries, cost breakdowns, and aggregations by project, model, and time period.
4
+
5
+ ## Install
6
+
7
+ ```
8
+ npm install claude-token-parser
9
+ ```
10
+
11
+ ## CLI
12
+
13
+ ```
14
+ npx claude-token-parser
15
+ ```
16
+
17
+ ```
18
+ Claude Code Usage Summary
19
+ ────────────────────────────────────────
20
+ Total Cost: $11248.43
21
+ Sessions: 356
22
+ Input Tokens: 3.4M
23
+ Output Tokens: 2.2M
24
+ Cache Created: 307.2M
25
+ Cache Read: 4874.1M
26
+
27
+ By Model
28
+ ────────────────────────────────────────
29
+ claude-opus-4 $11093.89 (98.6%)
30
+ claude-haiku-4 $103.38 (0.9%)
31
+ claude-sonnet-4 $51.16 (0.5%)
32
+
33
+ By Project
34
+ ────────────────────────────────────────
35
+ readme-readme $3858.16 116 sessions
36
+ readme-markdown $2339.66 60 sessions
37
+ mycelium $1159.83 27 sessions
38
+ ```
39
+
40
+ ### Options
41
+
42
+ | Flag | Description |
43
+ |---|---|
44
+ | `--daily` | Show daily breakdown (last 14 days) |
45
+ | `--weekly` | Show weekly breakdown (last 8 weeks) |
46
+ | `--monthly` | Show monthly breakdown |
47
+ | `--project <name>` | Filter to a specific project |
48
+ | `--from <YYYY-MM-DD>` | Start date |
49
+ | `--to <YYYY-MM-DD>` | End date |
50
+ | `--json` | Output raw JSON (for piping) |
51
+ | `--path <dir>` | Custom path to Claude projects dir |
52
+
53
+ ### Examples
54
+
55
+ ```bash
56
+ # Monthly cost breakdown
57
+ claude-token-parser --monthly
58
+
59
+ # Filter to one project with daily view
60
+ claude-token-parser --project mycelium --daily
61
+
62
+ # Date range
63
+ claude-token-parser --from 2026-02-01 --to 2026-02-14
64
+
65
+ # Pipe JSON to jq
66
+ claude-token-parser --json | jq '.byModel'
67
+ ```
68
+
69
+ ## Library
70
+
71
+ ```ts
72
+ import { readAll, summarize } from "claude-token-parser";
73
+ import { homedir } from "node:os";
74
+ import { join } from "node:path";
75
+
76
+ const dataPath = join(homedir(), ".claude", "projects");
77
+ const lines = await readAll(dataPath);
78
+ const summary = summarize(lines);
79
+
80
+ console.log(`Total cost: $${summary.totalCost.toFixed(2)}`);
81
+ console.log(`Sessions: ${summary.sessionCount}`);
82
+
83
+ for (const model of summary.byModel) {
84
+ console.log(`${model.model}: $${model.cost.toFixed(2)}`);
85
+ }
86
+ ```
87
+
88
+ ### API
89
+
90
+ #### Reading
91
+
92
+ - **`readAll(dataPath)`** — Read all JSONL files under a directory, returns `ParsedLine[]`
93
+ - **`readFile(filePath, project, isSubagent, byteOffset?)`** — Read a single JSONL file
94
+ - **`readIncremental(dataPath, offsets)`** — Incremental read, only processes new bytes since last offsets
95
+
96
+ #### Aggregation
97
+
98
+ - **`summarize(lines, range?)`** — Full summary with all breakdowns
99
+ - **`groupByDay(lines, range?)`** — Daily aggregation
100
+ - **`groupByWeek(lines, range?)`** — Weekly aggregation (ISO weeks, Monday start)
101
+ - **`groupByMonth(lines, range?)`** — Monthly aggregation
102
+ - **`groupBySession(lines)`** — Per-session breakdown
103
+ - **`groupByProject(lines)`** — Per-project breakdown (sorted by cost descending)
104
+ - **`groupByModel(lines)`** — Per-model breakdown (sorted by cost descending)
105
+
106
+ #### Cost
107
+
108
+ - **`calculateCost(model, tokens)`** — Calculate cost for a set of token counts
109
+ - **`normalizeModelName(model)`** — Normalize model IDs (e.g. `claude-opus-4-6-20250514` → `claude-opus-4`)
110
+ - **`getPricingTable()`** — Get the pricing table
111
+
112
+ ### Pricing
113
+
114
+ | Model | Input | Output | Cache Write | Cache Read |
115
+ |---|---|---|---|---|
116
+ | claude-opus-4 | $15.00/M | $75.00/M | $18.75/M | $1.50/M |
117
+ | claude-sonnet-4 | $3.00/M | $15.00/M | $3.75/M | $0.30/M |
118
+ | claude-haiku-4 | $0.80/M | $4.00/M | $1.00/M | $0.08/M |
119
+
120
+ ## How it works
121
+
122
+ Claude Code stores session logs as JSONL files in `~/.claude/projects/`. Each line contains token usage metadata from API responses. This package:
123
+
124
+ 1. Scans all project directories and JSONL files (including subagent logs)
125
+ 2. Extracts assistant messages with token usage data
126
+ 3. Calculates costs using current Anthropic pricing
127
+ 4. Aggregates by time period, project, model, and session
128
+
129
+ ## License
130
+
131
+ MIT
@@ -0,0 +1,10 @@
1
+ import type { DailyUsage, WeeklyUsage, MonthlyUsage, ParsedSession, ProjectUsage, ModelUsage, UsageSummary, DateRange } from "./types.js";
2
+ import type { ParsedLine } from "./reader.js";
3
+ export declare function groupByDay(lines: ParsedLine[], range?: DateRange): DailyUsage[];
4
+ export declare function groupByWeek(lines: ParsedLine[], range?: DateRange): WeeklyUsage[];
5
+ export declare function groupByMonth(lines: ParsedLine[], range?: DateRange): MonthlyUsage[];
6
+ export declare function groupBySession(lines: ParsedLine[]): ParsedSession[];
7
+ export declare function groupByProject(lines: ParsedLine[]): ProjectUsage[];
8
+ export declare function groupByModel(lines: ParsedLine[]): ModelUsage[];
9
+ export declare function summarize(lines: ParsedLine[], range?: DateRange): UsageSummary;
10
+ //# sourceMappingURL=aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgC9C,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,CAAC,EAAE,SAAS,GAChB,UAAU,EAAE,CAoDd;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,CAAC,EAAE,SAAS,GAChB,WAAW,EAAE,CAoDf;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,CAAC,EAAE,SAAS,GAChB,YAAY,EAAE,CAoDhB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE,CA2EnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAkDlE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAyC9D;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,CAAC,EAAE,SAAS,GAChB,YAAY,CAqCd"}
@@ -0,0 +1,318 @@
1
+ import { calculateCost, normalizeModelName } from "./cost-calculator.js";
2
+ function toDateKey(ts) {
3
+ return ts.slice(0, 10);
4
+ }
5
+ function toMonthKey(ts) {
6
+ return ts.slice(0, 7);
7
+ }
8
+ function toWeekStart(ts) {
9
+ const d = new Date(ts);
10
+ const day = d.getUTCDay();
11
+ const diff = d.getUTCDate() - day + (day === 0 ? -6 : 1);
12
+ const monday = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), diff));
13
+ return monday.toISOString().slice(0, 10);
14
+ }
15
+ function inRange(ts, range) {
16
+ if (!range)
17
+ return true;
18
+ const d = new Date(ts);
19
+ if (range.from && d < range.from)
20
+ return false;
21
+ if (range.to && d > range.to)
22
+ return false;
23
+ return true;
24
+ }
25
+ function filterByRange(lines, range) {
26
+ if (!range)
27
+ return lines;
28
+ return lines.filter((l) => inRange(l.timestamp, range));
29
+ }
30
+ export function groupByDay(lines, range) {
31
+ const filtered = filterByRange(lines, range);
32
+ const map = new Map();
33
+ for (const line of filtered) {
34
+ const key = toDateKey(line.timestamp);
35
+ let entry = map.get(key);
36
+ if (!entry) {
37
+ entry = {
38
+ input: 0,
39
+ output: 0,
40
+ cacheCreation: 0,
41
+ cacheRead: 0,
42
+ cost: 0,
43
+ sessions: new Set(),
44
+ };
45
+ map.set(key, entry);
46
+ }
47
+ entry.input += line.usage.input_tokens;
48
+ entry.output += line.usage.output_tokens;
49
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
50
+ entry.cacheRead += line.usage.cache_read_input_tokens;
51
+ entry.cost += calculateCost(line.model, {
52
+ inputTokens: line.usage.input_tokens,
53
+ outputTokens: line.usage.output_tokens,
54
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
55
+ cacheReadTokens: line.usage.cache_read_input_tokens,
56
+ });
57
+ entry.sessions.add(line.sessionId);
58
+ }
59
+ return Array.from(map.entries())
60
+ .map(([date, e]) => ({
61
+ date,
62
+ inputTokens: e.input,
63
+ outputTokens: e.output,
64
+ cacheCreationTokens: e.cacheCreation,
65
+ cacheReadTokens: e.cacheRead,
66
+ cost: e.cost,
67
+ sessionCount: e.sessions.size,
68
+ }))
69
+ .sort((a, b) => a.date.localeCompare(b.date));
70
+ }
71
+ export function groupByWeek(lines, range) {
72
+ const filtered = filterByRange(lines, range);
73
+ const map = new Map();
74
+ for (const line of filtered) {
75
+ const key = toWeekStart(line.timestamp);
76
+ let entry = map.get(key);
77
+ if (!entry) {
78
+ entry = {
79
+ input: 0,
80
+ output: 0,
81
+ cacheCreation: 0,
82
+ cacheRead: 0,
83
+ cost: 0,
84
+ sessions: new Set(),
85
+ };
86
+ map.set(key, entry);
87
+ }
88
+ entry.input += line.usage.input_tokens;
89
+ entry.output += line.usage.output_tokens;
90
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
91
+ entry.cacheRead += line.usage.cache_read_input_tokens;
92
+ entry.cost += calculateCost(line.model, {
93
+ inputTokens: line.usage.input_tokens,
94
+ outputTokens: line.usage.output_tokens,
95
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
96
+ cacheReadTokens: line.usage.cache_read_input_tokens,
97
+ });
98
+ entry.sessions.add(line.sessionId);
99
+ }
100
+ return Array.from(map.entries())
101
+ .map(([weekStart, e]) => ({
102
+ weekStart,
103
+ inputTokens: e.input,
104
+ outputTokens: e.output,
105
+ cacheCreationTokens: e.cacheCreation,
106
+ cacheReadTokens: e.cacheRead,
107
+ cost: e.cost,
108
+ sessionCount: e.sessions.size,
109
+ }))
110
+ .sort((a, b) => a.weekStart.localeCompare(b.weekStart));
111
+ }
112
+ export function groupByMonth(lines, range) {
113
+ const filtered = filterByRange(lines, range);
114
+ const map = new Map();
115
+ for (const line of filtered) {
116
+ const key = toMonthKey(line.timestamp);
117
+ let entry = map.get(key);
118
+ if (!entry) {
119
+ entry = {
120
+ input: 0,
121
+ output: 0,
122
+ cacheCreation: 0,
123
+ cacheRead: 0,
124
+ cost: 0,
125
+ sessions: new Set(),
126
+ };
127
+ map.set(key, entry);
128
+ }
129
+ entry.input += line.usage.input_tokens;
130
+ entry.output += line.usage.output_tokens;
131
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
132
+ entry.cacheRead += line.usage.cache_read_input_tokens;
133
+ entry.cost += calculateCost(line.model, {
134
+ inputTokens: line.usage.input_tokens,
135
+ outputTokens: line.usage.output_tokens,
136
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
137
+ cacheReadTokens: line.usage.cache_read_input_tokens,
138
+ });
139
+ entry.sessions.add(line.sessionId);
140
+ }
141
+ return Array.from(map.entries())
142
+ .map(([month, e]) => ({
143
+ month,
144
+ inputTokens: e.input,
145
+ outputTokens: e.output,
146
+ cacheCreationTokens: e.cacheCreation,
147
+ cacheReadTokens: e.cacheRead,
148
+ cost: e.cost,
149
+ sessionCount: e.sessions.size,
150
+ }))
151
+ .sort((a, b) => a.month.localeCompare(b.month));
152
+ }
153
+ export function groupBySession(lines) {
154
+ const map = new Map();
155
+ for (const line of lines) {
156
+ let entry = map.get(line.sessionId);
157
+ if (!entry) {
158
+ entry = {
159
+ project: line.project,
160
+ models: new Map(),
161
+ timestamps: [],
162
+ input: 0,
163
+ output: 0,
164
+ cacheCreation: 0,
165
+ cacheRead: 0,
166
+ cost: 0,
167
+ messageCount: 0,
168
+ };
169
+ map.set(line.sessionId, entry);
170
+ }
171
+ entry.timestamps.push(line.timestamp);
172
+ entry.input += line.usage.input_tokens;
173
+ entry.output += line.usage.output_tokens;
174
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
175
+ entry.cacheRead += line.usage.cache_read_input_tokens;
176
+ entry.cost += calculateCost(line.model, {
177
+ inputTokens: line.usage.input_tokens,
178
+ outputTokens: line.usage.output_tokens,
179
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
180
+ cacheReadTokens: line.usage.cache_read_input_tokens,
181
+ });
182
+ entry.messageCount++;
183
+ const normalized = normalizeModelName(line.model);
184
+ entry.models.set(normalized, (entry.models.get(normalized) ?? 0) + 1);
185
+ }
186
+ return Array.from(map.entries())
187
+ .map(([sessionId, e]) => {
188
+ const sorted = e.timestamps.toSorted();
189
+ let topModel = "unknown";
190
+ let topCount = 0;
191
+ for (const [model, count] of e.models) {
192
+ if (count > topCount) {
193
+ topModel = model;
194
+ topCount = count;
195
+ }
196
+ }
197
+ return {
198
+ sessionId,
199
+ project: e.project,
200
+ model: topModel,
201
+ startedAt: sorted[0],
202
+ endedAt: sorted[sorted.length - 1],
203
+ inputTokens: e.input,
204
+ outputTokens: e.output,
205
+ cacheCreationTokens: e.cacheCreation,
206
+ cacheReadTokens: e.cacheRead,
207
+ cost: e.cost,
208
+ messageCount: e.messageCount,
209
+ };
210
+ })
211
+ .sort((a, b) => a.startedAt.localeCompare(b.startedAt));
212
+ }
213
+ export function groupByProject(lines) {
214
+ const map = new Map();
215
+ for (const line of lines) {
216
+ let entry = map.get(line.project);
217
+ if (!entry) {
218
+ entry = {
219
+ input: 0,
220
+ output: 0,
221
+ cacheCreation: 0,
222
+ cacheRead: 0,
223
+ cost: 0,
224
+ sessions: new Set(),
225
+ };
226
+ map.set(line.project, entry);
227
+ }
228
+ entry.input += line.usage.input_tokens;
229
+ entry.output += line.usage.output_tokens;
230
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
231
+ entry.cacheRead += line.usage.cache_read_input_tokens;
232
+ entry.cost += calculateCost(line.model, {
233
+ inputTokens: line.usage.input_tokens,
234
+ outputTokens: line.usage.output_tokens,
235
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
236
+ cacheReadTokens: line.usage.cache_read_input_tokens,
237
+ });
238
+ entry.sessions.add(line.sessionId);
239
+ }
240
+ return Array.from(map.entries())
241
+ .map(([projectName, e]) => ({
242
+ projectName,
243
+ inputTokens: e.input,
244
+ outputTokens: e.output,
245
+ cacheCreationTokens: e.cacheCreation,
246
+ cacheReadTokens: e.cacheRead,
247
+ cost: e.cost,
248
+ sessionCount: e.sessions.size,
249
+ }))
250
+ .sort((a, b) => b.cost - a.cost);
251
+ }
252
+ export function groupByModel(lines) {
253
+ const map = new Map();
254
+ for (const line of lines) {
255
+ const model = normalizeModelName(line.model);
256
+ let entry = map.get(model);
257
+ if (!entry) {
258
+ entry = { input: 0, output: 0, cacheCreation: 0, cacheRead: 0, cost: 0 };
259
+ map.set(model, entry);
260
+ }
261
+ entry.input += line.usage.input_tokens;
262
+ entry.output += line.usage.output_tokens;
263
+ entry.cacheCreation += line.usage.cache_creation_input_tokens;
264
+ entry.cacheRead += line.usage.cache_read_input_tokens;
265
+ entry.cost += calculateCost(line.model, {
266
+ inputTokens: line.usage.input_tokens,
267
+ outputTokens: line.usage.output_tokens,
268
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
269
+ cacheReadTokens: line.usage.cache_read_input_tokens,
270
+ });
271
+ }
272
+ return Array.from(map.entries())
273
+ .map(([model, e]) => ({
274
+ model,
275
+ inputTokens: e.input,
276
+ outputTokens: e.output,
277
+ cacheCreationTokens: e.cacheCreation,
278
+ cacheReadTokens: e.cacheRead,
279
+ cost: e.cost,
280
+ }))
281
+ .sort((a, b) => b.cost - a.cost);
282
+ }
283
+ export function summarize(lines, range) {
284
+ const filtered = filterByRange(lines, range);
285
+ let totalInput = 0;
286
+ let totalOutput = 0;
287
+ let totalCacheCreation = 0;
288
+ let totalCacheRead = 0;
289
+ let totalCost = 0;
290
+ const sessions = new Set();
291
+ for (const line of filtered) {
292
+ totalInput += line.usage.input_tokens;
293
+ totalOutput += line.usage.output_tokens;
294
+ totalCacheCreation += line.usage.cache_creation_input_tokens;
295
+ totalCacheRead += line.usage.cache_read_input_tokens;
296
+ totalCost += calculateCost(line.model, {
297
+ inputTokens: line.usage.input_tokens,
298
+ outputTokens: line.usage.output_tokens,
299
+ cacheCreationTokens: line.usage.cache_creation_input_tokens,
300
+ cacheReadTokens: line.usage.cache_read_input_tokens,
301
+ });
302
+ sessions.add(line.sessionId);
303
+ }
304
+ return {
305
+ totalInputTokens: totalInput,
306
+ totalOutputTokens: totalOutput,
307
+ totalCacheCreationTokens: totalCacheCreation,
308
+ totalCacheReadTokens: totalCacheRead,
309
+ totalCost,
310
+ sessionCount: sessions.size,
311
+ daily: groupByDay(filtered),
312
+ weekly: groupByWeek(filtered),
313
+ monthly: groupByMonth(filtered),
314
+ byProject: groupByProject(filtered),
315
+ byModel: groupByModel(filtered),
316
+ };
317
+ }
318
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { readAll } from "./reader.js";
5
+ import { summarize } from "./aggregator.js";
6
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
7
+ function createSpinner(message) {
8
+ let i = 0;
9
+ const id = setInterval(() => {
10
+ process.stderr.write(`\r${SPINNER_FRAMES[i++ % SPINNER_FRAMES.length]} ${message}`);
11
+ }, 80);
12
+ return {
13
+ stop() {
14
+ clearInterval(id);
15
+ process.stderr.write(`\r${" ".repeat(message.length + 4)}\r`);
16
+ },
17
+ };
18
+ }
19
+ function formatTokens(n) {
20
+ if (n >= 1_000_000)
21
+ return `${(n / 1_000_000).toFixed(1)}M`;
22
+ if (n >= 1_000)
23
+ return `${(n / 1_000).toFixed(1)}K`;
24
+ return n.toString();
25
+ }
26
+ function formatCost(n) {
27
+ return `$${n.toFixed(2)}`;
28
+ }
29
+ function pad(str, len) {
30
+ return str.padEnd(len);
31
+ }
32
+ function printHelp() {
33
+ console.log(`
34
+ claude-token-parser — Parse Claude Code session logs
35
+
36
+ Usage:
37
+ claude-token-parser [options]
38
+
39
+ Options:
40
+ --path <dir> Path to Claude projects dir (default: ~/.claude/projects)
41
+ --json Output raw JSON instead of formatted table
42
+ --daily Show daily breakdown
43
+ --weekly Show weekly breakdown
44
+ --monthly Show monthly breakdown
45
+ --project <name> Filter to a specific project
46
+ --from <date> Start date (YYYY-MM-DD)
47
+ --to <date> End date (YYYY-MM-DD)
48
+ -h, --help Show this help message
49
+ `);
50
+ }
51
+ function parseArgs(argv) {
52
+ const opts = {
53
+ path: join(homedir(), ".claude", "projects"),
54
+ json: false,
55
+ daily: false,
56
+ weekly: false,
57
+ monthly: false,
58
+ project: undefined,
59
+ range: undefined,
60
+ help: false,
61
+ };
62
+ let from;
63
+ let to;
64
+ for (let i = 0; i < argv.length; i++) {
65
+ const arg = argv[i];
66
+ switch (arg) {
67
+ case "--path":
68
+ if (++i >= argv.length) {
69
+ console.error("Missing value for --path");
70
+ process.exit(1);
71
+ }
72
+ opts.path = argv[i];
73
+ break;
74
+ case "--json":
75
+ opts.json = true;
76
+ break;
77
+ case "--daily":
78
+ opts.daily = true;
79
+ break;
80
+ case "--weekly":
81
+ opts.weekly = true;
82
+ break;
83
+ case "--monthly":
84
+ opts.monthly = true;
85
+ break;
86
+ case "--project":
87
+ if (++i >= argv.length) {
88
+ console.error("Missing value for --project");
89
+ process.exit(1);
90
+ }
91
+ opts.project = argv[i];
92
+ break;
93
+ case "--from":
94
+ if (++i >= argv.length) {
95
+ console.error("Missing value for --from");
96
+ process.exit(1);
97
+ }
98
+ from = argv[i];
99
+ break;
100
+ case "--to":
101
+ if (++i >= argv.length) {
102
+ console.error("Missing value for --to");
103
+ process.exit(1);
104
+ }
105
+ to = argv[i];
106
+ break;
107
+ case "-h":
108
+ case "--help":
109
+ opts.help = true;
110
+ break;
111
+ }
112
+ }
113
+ if (from || to) {
114
+ opts.range = {
115
+ from: from ? new Date(from) : new Date(0),
116
+ to: to ? new Date(to + "T23:59:59.999Z") : new Date(),
117
+ };
118
+ }
119
+ return opts;
120
+ }
121
+ async function main() {
122
+ const opts = parseArgs(process.argv.slice(2));
123
+ if (opts.help) {
124
+ printHelp();
125
+ process.exit(0);
126
+ }
127
+ const spinner = opts.json ? null : createSpinner("Parsing session logs…");
128
+ let lines = await readAll(opts.path);
129
+ if (lines.length === 0) {
130
+ spinner?.stop();
131
+ console.log("No Claude Code session data found.");
132
+ console.log(`Looked in: ${opts.path}`);
133
+ process.exit(0);
134
+ }
135
+ if (opts.project) {
136
+ const filter = opts.project.toLowerCase();
137
+ lines = lines.filter((l) => l.project.toLowerCase().includes(filter));
138
+ if (lines.length === 0) {
139
+ spinner?.stop();
140
+ console.log(`No data found for project "${opts.project}".`);
141
+ process.exit(0);
142
+ }
143
+ }
144
+ const summary = summarize(lines, opts.range);
145
+ spinner?.stop();
146
+ if (opts.json) {
147
+ console.log(JSON.stringify(summary, null, 2));
148
+ return;
149
+ }
150
+ // Summary header
151
+ console.log();
152
+ console.log("Claude Code Usage Summary");
153
+ console.log("─".repeat(40));
154
+ console.log(` Total Cost: ${formatCost(summary.totalCost)}`);
155
+ console.log(` Sessions: ${summary.sessionCount}`);
156
+ console.log(` Input Tokens: ${formatTokens(summary.totalInputTokens)}`);
157
+ console.log(` Output Tokens: ${formatTokens(summary.totalOutputTokens)}`);
158
+ console.log(` Cache Created: ${formatTokens(summary.totalCacheCreationTokens)}`);
159
+ console.log(` Cache Read: ${formatTokens(summary.totalCacheReadTokens)}`);
160
+ // By Model
161
+ if (summary.byModel.length > 0) {
162
+ console.log();
163
+ console.log("By Model");
164
+ console.log("─".repeat(40));
165
+ const totalCost = summary.totalCost || 1;
166
+ for (const m of summary.byModel) {
167
+ const pct = ((m.cost / totalCost) * 100).toFixed(1);
168
+ console.log(` ${pad(m.model, 22)} ${formatCost(m.cost).padStart(8)} (${pct}%)`);
169
+ }
170
+ }
171
+ // By Project
172
+ if (summary.byProject.length > 0) {
173
+ console.log();
174
+ console.log("By Project");
175
+ console.log("─".repeat(40));
176
+ for (const p of summary.byProject) {
177
+ console.log(` ${pad(p.projectName, 22)} ${formatCost(p.cost).padStart(8)} ${p.sessionCount} sessions`);
178
+ }
179
+ }
180
+ // Daily
181
+ if (opts.daily && summary.daily.length > 0) {
182
+ console.log();
183
+ console.log("Daily");
184
+ console.log("─".repeat(40));
185
+ for (const d of summary.daily.slice(-14)) {
186
+ console.log(` ${d.date} ${formatCost(d.cost).padStart(8)} ${d.sessionCount} sessions`);
187
+ }
188
+ }
189
+ // Weekly
190
+ if (opts.weekly && summary.weekly.length > 0) {
191
+ console.log();
192
+ console.log("Weekly (week starting)");
193
+ console.log("─".repeat(40));
194
+ for (const w of summary.weekly.slice(-8)) {
195
+ console.log(` ${w.weekStart} ${formatCost(w.cost).padStart(8)} ${w.sessionCount} sessions`);
196
+ }
197
+ }
198
+ // Monthly
199
+ if (opts.monthly && summary.monthly.length > 0) {
200
+ console.log();
201
+ console.log("Monthly");
202
+ console.log("─".repeat(40));
203
+ for (const m of summary.monthly) {
204
+ console.log(` ${m.month} ${formatCost(m.cost).padStart(8)} ${m.sessionCount} sessions`);
205
+ }
206
+ }
207
+ console.log();
208
+ }
209
+ main().catch((err) => {
210
+ process.stderr.write("\r\x1b[K");
211
+ console.error(err);
212
+ process.exit(1);
213
+ });
214
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface ModelPricing {
2
+ inputPerMillion: number;
3
+ outputPerMillion: number;
4
+ cacheCreationPerMillion: number;
5
+ cacheReadPerMillion: number;
6
+ }
7
+ export declare function normalizeModelName(model: string): string;
8
+ export interface TokenCounts {
9
+ inputTokens: number;
10
+ outputTokens: number;
11
+ cacheCreationTokens?: number;
12
+ cacheReadTokens?: number;
13
+ }
14
+ export declare function calculateCost(model: string, tokens: TokenCounts): number;
15
+ export declare function getPricingTable(): Record<string, ModelPricing>;
16
+ //# sourceMappingURL=cost-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-calculator.d.ts","sourceRoot":"","sources":["../src/cost-calculator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AA6BD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAI9D"}
@@ -0,0 +1,54 @@
1
+ const PRICING = {
2
+ "claude-opus-4": {
3
+ inputPerMillion: 15.0,
4
+ outputPerMillion: 75.0,
5
+ cacheCreationPerMillion: 18.75,
6
+ cacheReadPerMillion: 1.5,
7
+ },
8
+ "claude-sonnet-4": {
9
+ inputPerMillion: 3.0,
10
+ outputPerMillion: 15.0,
11
+ cacheCreationPerMillion: 3.75,
12
+ cacheReadPerMillion: 0.3,
13
+ },
14
+ "claude-haiku-4": {
15
+ inputPerMillion: 0.8,
16
+ outputPerMillion: 4.0,
17
+ cacheCreationPerMillion: 1.0,
18
+ cacheReadPerMillion: 0.08,
19
+ },
20
+ };
21
+ const MODEL_ALIASES = {
22
+ "claude-3-5-sonnet": "claude-sonnet-4",
23
+ "claude-3-5-haiku": "claude-haiku-4",
24
+ "claude-3-opus": "claude-opus-4",
25
+ };
26
+ export function normalizeModelName(model) {
27
+ if (!model || model === "<synthetic>")
28
+ return "unknown";
29
+ if (PRICING[model])
30
+ return model;
31
+ for (const [alias, base] of Object.entries(MODEL_ALIASES)) {
32
+ if (model.startsWith(alias))
33
+ return base;
34
+ }
35
+ for (const key of Object.keys(PRICING)) {
36
+ if (model.startsWith(key))
37
+ return key;
38
+ }
39
+ return model;
40
+ }
41
+ export function calculateCost(model, tokens) {
42
+ const normalized = normalizeModelName(model);
43
+ const pricing = PRICING[normalized] ?? PRICING["claude-opus-4"];
44
+ const input = (tokens.inputTokens / 1_000_000) * pricing.inputPerMillion;
45
+ const output = (tokens.outputTokens / 1_000_000) * pricing.outputPerMillion;
46
+ const cacheCreation = ((tokens.cacheCreationTokens ?? 0) / 1_000_000) *
47
+ pricing.cacheCreationPerMillion;
48
+ const cacheRead = ((tokens.cacheReadTokens ?? 0) / 1_000_000) * pricing.cacheReadPerMillion;
49
+ return input + output + cacheCreation + cacheRead;
50
+ }
51
+ export function getPricingTable() {
52
+ return Object.fromEntries(Object.entries(PRICING).map(([k, v]) => [k, { ...v }]));
53
+ }
54
+ //# sourceMappingURL=cost-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-calculator.js","sourceRoot":"","sources":["../src/cost-calculator.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,GAAiC;IAC5C,eAAe,EAAE;QACf,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,uBAAuB,EAAE,KAAK;QAC9B,mBAAmB,EAAE,GAAG;KACzB;IACD,iBAAiB,EAAE;QACjB,eAAe,EAAE,GAAG;QACpB,gBAAgB,EAAE,IAAI;QACtB,uBAAuB,EAAE,IAAI;QAC7B,mBAAmB,EAAE,GAAG;KACzB;IACD,gBAAgB,EAAE;QAChB,eAAe,EAAE,GAAG;QACpB,gBAAgB,EAAE,GAAG;QACrB,uBAAuB,EAAE,GAAG;QAC5B,mBAAmB,EAAE,IAAI;KAC1B;CACF,CAAC;AAEF,MAAM,aAAa,GAA2B;IAC5C,mBAAmB,EAAE,iBAAiB;IACtC,kBAAkB,EAAE,gBAAgB;IACpC,eAAe,EAAE,eAAe;CACjC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IAExD,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACxC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,MAAmB;IAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IACzE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC5E,MAAM,aAAa,GACjB,CAAC,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QAC/C,OAAO,CAAC,uBAAuB,CAAC;IAClC,MAAM,SAAS,GACb,CAAC,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAE5E,OAAO,KAAK,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type { RawJSONLLine, AssistantUsage, ParsedSession, DailyUsage, WeeklyUsage, MonthlyUsage, ProjectUsage, ModelUsage, UsageSummary, DateRange, } from "./types.js";
2
+ export { readAll, readFile, readIncremental, deriveProjectName, } from "./reader.js";
3
+ export type { ParsedLine, FileOffsets } from "./reader.js";
4
+ export { groupByDay, groupByWeek, groupByMonth, groupBySession, groupByProject, groupByModel, summarize, } from "./aggregator.js";
5
+ export { calculateCost, normalizeModelName, getPricingTable, } from "./cost-calculator.js";
6
+ export type { ModelPricing, TokenCounts } from "./cost-calculator.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,OAAO,EACP,QAAQ,EACR,eAAe,EACf,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { readAll, readFile, readIncremental, deriveProjectName, } from "./reader.js";
2
+ export { groupByDay, groupByWeek, groupByMonth, groupBySession, groupByProject, groupByModel, summarize, } from "./aggregator.js";
3
+ export { calculateCost, normalizeModelName, getPricingTable, } from "./cost-calculator.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,eAAe,EACf,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { AssistantUsage } from "./types.js";
2
+ export interface ParsedLine {
3
+ sessionId: string;
4
+ timestamp: string;
5
+ model: string;
6
+ usage: AssistantUsage;
7
+ project: string;
8
+ isSubagent: boolean;
9
+ agentId?: string;
10
+ }
11
+ export interface FileOffsets {
12
+ [filePath: string]: number;
13
+ }
14
+ /**
15
+ * Derive project name from a Claude projects directory name.
16
+ * Claude encodes the full path with dashes, e.g.:
17
+ * "-Users-alice-Desktop-Code-my-app" -> "my-app"
18
+ * "-home-bob-projects-foo" -> "foo"
19
+ * "-Users-bob-dev-my-app" -> "my-app"
20
+ *
21
+ * Strategy: find the home directory prefix (Users/<user> or
22
+ * home/<user>), skip common parent directories (Desktop, Code,
23
+ * projects, dev, etc.), and use the remaining segments.
24
+ */
25
+ export declare function deriveProjectName(dirName: string): string;
26
+ export declare function readFile(filePath: string, project: string, isSubagent: boolean, byteOffset?: number): Promise<{
27
+ lines: ParsedLine[];
28
+ newOffset: number;
29
+ }>;
30
+ export declare function readAll(dataPath: string): Promise<ParsedLine[]>;
31
+ export declare function readIncremental(dataPath: string, offsets: FileOffsets): Promise<{
32
+ lines: ParsedLine[];
33
+ offsets: FileOffsets;
34
+ }>;
35
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBzD;AA8DD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,OAAO,EACnB,UAAU,SAAI,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BrD;AA4BD,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC,CAwBvB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAgCxD"}
package/dist/reader.js ADDED
@@ -0,0 +1,188 @@
1
+ import { readdir, readFile as fsReadFile, stat } from "node:fs/promises";
2
+ import { join, sep } from "node:path";
3
+ const PATH_NOISE = new Set([
4
+ "Desktop", "Documents", "Code", "projects", "dev",
5
+ "src", "repos", "workspace", "work", "git", "github",
6
+ ]);
7
+ /**
8
+ * Derive project name from a Claude projects directory name.
9
+ * Claude encodes the full path with dashes, e.g.:
10
+ * "-Users-alice-Desktop-Code-my-app" -> "my-app"
11
+ * "-home-bob-projects-foo" -> "foo"
12
+ * "-Users-bob-dev-my-app" -> "my-app"
13
+ *
14
+ * Strategy: find the home directory prefix (Users/<user> or
15
+ * home/<user>), skip common parent directories (Desktop, Code,
16
+ * projects, dev, etc.), and use the remaining segments.
17
+ */
18
+ export function deriveProjectName(dirName) {
19
+ const segments = dirName.split("-").filter(Boolean);
20
+ if (segments.length === 0)
21
+ return "unknown";
22
+ // Find home dir prefix: Users/<user> or home/<user>
23
+ let start = 0;
24
+ for (let i = 0; i < segments.length - 1; i++) {
25
+ if (segments[i] === "Users" || segments[i] === "home") {
26
+ start = i + 2; // skip "Users" + username
27
+ break;
28
+ }
29
+ }
30
+ // Skip common intermediate directories
31
+ while (start < segments.length && PATH_NOISE.has(segments[start])) {
32
+ start++;
33
+ }
34
+ if (start < segments.length) {
35
+ return segments.slice(start).join("-");
36
+ }
37
+ return segments[segments.length - 1];
38
+ }
39
+ function stripBom(content) {
40
+ if (content.charCodeAt(0) === 0xfeff) {
41
+ return content.slice(1);
42
+ }
43
+ return content;
44
+ }
45
+ const SKIP_TYPES = new Set([
46
+ "file-history-snapshot",
47
+ "progress",
48
+ "queue-operation",
49
+ "system",
50
+ "user",
51
+ ]);
52
+ function parseLine(raw, project, isSubagent) {
53
+ if (!raw.trim())
54
+ return null;
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(raw);
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ if (!parsed.type || SKIP_TYPES.has(parsed.type))
63
+ return null;
64
+ if (parsed.type !== "assistant")
65
+ return null;
66
+ const message = parsed.message;
67
+ if (!message)
68
+ return null;
69
+ const usage = message.usage;
70
+ if (!usage || typeof usage.input_tokens !== "number")
71
+ return null;
72
+ const model = message.model ?? "<synthetic>";
73
+ return {
74
+ sessionId: parsed.sessionId,
75
+ timestamp: parsed.timestamp,
76
+ model,
77
+ usage: {
78
+ input_tokens: usage.input_tokens ?? 0,
79
+ output_tokens: usage.output_tokens ?? 0,
80
+ cache_creation_input_tokens: usage.cache_creation_input_tokens ?? 0,
81
+ cache_read_input_tokens: usage.cache_read_input_tokens ?? 0,
82
+ cache_creation: usage.cache_creation,
83
+ server_tool_use: usage.server_tool_use,
84
+ service_tier: usage.service_tier ?? "",
85
+ inference_geo: usage.inference_geo,
86
+ },
87
+ project,
88
+ isSubagent,
89
+ agentId: parsed.agentId,
90
+ };
91
+ }
92
+ export async function readFile(filePath, project, isSubagent, byteOffset = 0) {
93
+ let content;
94
+ try {
95
+ const buf = await fsReadFile(filePath);
96
+ const slice = byteOffset > 0 ? buf.subarray(byteOffset) : buf;
97
+ content = stripBom(slice.toString("utf-8"));
98
+ }
99
+ catch {
100
+ return { lines: [], newOffset: byteOffset };
101
+ }
102
+ if (!content.trim())
103
+ return { lines: [], newOffset: byteOffset };
104
+ const rawLines = content.split("\n");
105
+ const lines = [];
106
+ for (const raw of rawLines) {
107
+ const parsed = parseLine(raw, project, isSubagent);
108
+ if (parsed)
109
+ lines.push(parsed);
110
+ }
111
+ try {
112
+ const fileStat = await stat(filePath);
113
+ return { lines, newOffset: fileStat.size };
114
+ }
115
+ catch {
116
+ return { lines, newOffset: byteOffset + Buffer.byteLength(content, "utf-8") };
117
+ }
118
+ }
119
+ async function findJsonlFiles(dir) {
120
+ const results = [];
121
+ let entries;
122
+ try {
123
+ entries = await readdir(dir, { withFileTypes: true });
124
+ }
125
+ catch {
126
+ return results;
127
+ }
128
+ for (const entry of entries) {
129
+ const fullPath = join(dir, entry.name);
130
+ if (entry.isDirectory()) {
131
+ const subResults = await findJsonlFiles(fullPath);
132
+ results.push(...subResults);
133
+ }
134
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
135
+ const isSubagent = fullPath.includes(`${sep}subagents${sep}`);
136
+ results.push({ path: fullPath, isSubagent });
137
+ }
138
+ }
139
+ return results;
140
+ }
141
+ export async function readAll(dataPath) {
142
+ const allLines = [];
143
+ let projectDirs;
144
+ try {
145
+ projectDirs = await readdir(dataPath, { withFileTypes: true });
146
+ }
147
+ catch {
148
+ return allLines;
149
+ }
150
+ for (const projectDir of projectDirs) {
151
+ if (!projectDir.isDirectory())
152
+ continue;
153
+ const project = deriveProjectName(projectDir.name);
154
+ const projectPath = join(dataPath, projectDir.name);
155
+ const jsonlFiles = await findJsonlFiles(projectPath);
156
+ for (const { path: filePath, isSubagent } of jsonlFiles) {
157
+ const { lines } = await readFile(filePath, project, isSubagent);
158
+ allLines.push(...lines);
159
+ }
160
+ }
161
+ return allLines;
162
+ }
163
+ export async function readIncremental(dataPath, offsets) {
164
+ const newOffsets = { ...offsets };
165
+ const allLines = [];
166
+ let projectDirs;
167
+ try {
168
+ projectDirs = await readdir(dataPath, { withFileTypes: true });
169
+ }
170
+ catch {
171
+ return { lines: allLines, offsets: newOffsets };
172
+ }
173
+ for (const projectDir of projectDirs) {
174
+ if (!projectDir.isDirectory())
175
+ continue;
176
+ const project = deriveProjectName(projectDir.name);
177
+ const projectPath = join(dataPath, projectDir.name);
178
+ const jsonlFiles = await findJsonlFiles(projectPath);
179
+ for (const { path: filePath, isSubagent } of jsonlFiles) {
180
+ const currentOffset = offsets[filePath] ?? 0;
181
+ const { lines, newOffset } = await readFile(filePath, project, isSubagent, currentOffset);
182
+ allLines.push(...lines);
183
+ newOffsets[filePath] = newOffset;
184
+ }
185
+ }
186
+ return { lines: allLines, offsets: newOffsets };
187
+ }
188
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export interface RawJSONLLine {
2
+ parentUuid: string;
3
+ isSidechain: boolean;
4
+ userType: string;
5
+ cwd: string;
6
+ sessionId: string;
7
+ version: string;
8
+ gitBranch: string;
9
+ slug?: string;
10
+ type: "user" | "assistant" | "system" | "progress" | "file-history-snapshot" | "queue-operation";
11
+ message: Record<string, unknown>;
12
+ uuid: string;
13
+ timestamp: string;
14
+ agentId?: string;
15
+ }
16
+ export interface AssistantUsage {
17
+ input_tokens: number;
18
+ output_tokens: number;
19
+ cache_creation_input_tokens: number;
20
+ cache_read_input_tokens: number;
21
+ cache_creation?: {
22
+ ephemeral_5m_input_tokens: number;
23
+ ephemeral_1h_input_tokens: number;
24
+ };
25
+ server_tool_use?: {
26
+ web_search_requests: number;
27
+ web_fetch_requests: number;
28
+ };
29
+ service_tier: string;
30
+ inference_geo?: string;
31
+ }
32
+ export interface ParsedSession {
33
+ sessionId: string;
34
+ project: string;
35
+ model: string;
36
+ startedAt: string;
37
+ endedAt: string;
38
+ inputTokens: number;
39
+ outputTokens: number;
40
+ cacheCreationTokens: number;
41
+ cacheReadTokens: number;
42
+ cost: number;
43
+ messageCount: number;
44
+ }
45
+ export interface DailyUsage {
46
+ date: string;
47
+ inputTokens: number;
48
+ outputTokens: number;
49
+ cacheCreationTokens: number;
50
+ cacheReadTokens: number;
51
+ cost: number;
52
+ sessionCount: number;
53
+ }
54
+ export interface WeeklyUsage {
55
+ weekStart: string;
56
+ inputTokens: number;
57
+ outputTokens: number;
58
+ cacheCreationTokens: number;
59
+ cacheReadTokens: number;
60
+ cost: number;
61
+ sessionCount: number;
62
+ }
63
+ export interface MonthlyUsage {
64
+ month: string;
65
+ inputTokens: number;
66
+ outputTokens: number;
67
+ cacheCreationTokens: number;
68
+ cacheReadTokens: number;
69
+ cost: number;
70
+ sessionCount: number;
71
+ }
72
+ export interface ProjectUsage {
73
+ projectName: string;
74
+ inputTokens: number;
75
+ outputTokens: number;
76
+ cacheCreationTokens: number;
77
+ cacheReadTokens: number;
78
+ cost: number;
79
+ sessionCount: number;
80
+ }
81
+ export interface ModelUsage {
82
+ model: string;
83
+ inputTokens: number;
84
+ outputTokens: number;
85
+ cacheCreationTokens: number;
86
+ cacheReadTokens: number;
87
+ cost: number;
88
+ }
89
+ export interface UsageSummary {
90
+ totalInputTokens: number;
91
+ totalOutputTokens: number;
92
+ totalCacheCreationTokens: number;
93
+ totalCacheReadTokens: number;
94
+ totalCost: number;
95
+ sessionCount: number;
96
+ daily: DailyUsage[];
97
+ weekly: WeeklyUsage[];
98
+ monthly: MonthlyUsage[];
99
+ byProject: ProjectUsage[];
100
+ byModel: ModelUsage[];
101
+ }
102
+ export interface DateRange {
103
+ from: Date;
104
+ to: Date;
105
+ }
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "claude-token-parser",
3
+ "version": "1.0.0",
4
+ "description": "Parse Claude Code session logs — token usage, cost breakdowns, and aggregations by project, model, and time period.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "claude-token-parser": "./dist/cli.js"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "keywords": [
28
+ "claude",
29
+ "claude-code",
30
+ "token-usage",
31
+ "cost-tracker",
32
+ "anthropic",
33
+ "llm",
34
+ "cli"
35
+ ],
36
+ "author": "Maximilian Falco Widjaya <maximilianfalco@gmail.com>",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/maximilianfalco/claude-token-parser.git"
41
+ },
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^20",
47
+ "typescript": "^5",
48
+ "vitest": "^3.2.0"
49
+ }
50
+ }