Cost Tracking
Track the exact token cost of any Claude Code operation by marking a start and stop point in the session JSONL.
Start Tracking
When the user invokes /cost-tracking:
Determine the current session JSONL path. It lives at:
~/.claude/projects/<project-hash>/<session-id>.jsonlFind the project directory by looking for the most recently modified
.jsonlfile under~/.claude/projects/. The project hash is a mangled version of the working directory path (slashes replaced with dashes, e.g.,-Users-johndamask-myproject).Determine the cost tracking output directory:
~/.claude/projects/<project-hash>/cost-tracking/Run the start script:
python3 <skill-dir>/scripts/start_tracking.py <session_jsonl_path> <cost_tracking_dir>Store the returned
tracking_id— mention it to the user and remember it for the stop step.Confirm: "Cost tracking started. I'll calculate costs when you say 'stop tracking'."
Stop Tracking
When the user says "stop tracking", "stop cost tracking", or asks about the cost:
Run the stop script with the tracking_id from the start step:
python3 <skill-dir>/scripts/stop_tracking.py <tracking_id> <cost_tracking_dir>The script outputs a formatted cost report and writes:
tokens.jsonl— per-entry token log with timestamp, model, input_tokens, output_tokenssummary.json— aggregated cost breakdown by model
Present the report to the user.
Pricing
The stop script fetches pricing live from Anthropic's published page
(https://platform.claude.com/docs/en/about-claude/pricing.md) at run time — it parses the
"Model pricing" table, maps the session's model id (e.g. claude-opus-4-8) to the matching
row, and caches the result for 24h in scripts/.pricing_cache.json. It distinguishes
5-minute vs 1-hour cache writes via the cache_creation.ephemeral_* fields, and picks the
correct row when a model has date-scoped pricing (e.g. Sonnet 5's introductory rate).
resources/pricing.json is now only an offline fallback, used if both the live fetch
and the cache are unavailable. If neither the page, the cache, nor the fallback can price a
model, the script reports an error for it — it never silently substitutes another
model's rate (the failure mode that once 3×-overcharged an Opus 4.8 run at legacy Opus
rates). Keep resources/pricing.json reasonably current as a backstop, but the live page
is the source of truth.