Repository navigation
fix(cli): accept --start-of-week on top-level weekly - #1945
Conversation
Since 20.x, `ccusage weekly` is the unified all-agent report and was parsed by the generic all-agent path, which only accepted shared flags. Only `ccusage claude weekly` still handled `-w/--start-of-week`, so the documented `ccusage weekly -w monday` failed with "Unknown option '-w'" and the flag was missing from `ccusage weekly --help`. Parse `-w/--start-of-week` (and `commands.weekly.startOfWeek` config) for the top-level weekly report, carry it on AgentCommandArgs, and use it for both the unified week bucketing and the `--last` window. The default stays Monday, so existing output is unchanged. Co-authored-by: jgorres <[email protected]>
Co-authored-by: jgorres <[email protected]>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
There was a problem hiding this comment.
All reported issues were addressed across 12 files
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
ccusage
@ccusage/ccusage-darwin-arm64
@ccusage/ccusage-darwin-x64
@ccusage/ccusage-linux-arm64
@ccusage/ccusage-linux-x64
@ccusage/ccusage-win32-x64
commit: |
ccusage performance comparisonPR SHA: This compares the PR package against the configured base package on the same CI runner. Package runtime diagnosticsCompares the PR package wrapper, the installed native optional dependency binary, and the workspace release binary on the same large fixture. This identifies whether slow package results come from JavaScript wrapper overhead, the published native binary build, or the Rust core itself. Fixtures: Claude
Committed fixture performanceCommitted small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage. Fixtures: Claude
Large real-world-shaped fixture performanceGenerated fixtures shaped from aggregate local log statistics: thousands of JSONL files, many small sessions, and a long tail of larger sessions. No real prompts, paths, or outputs are stored in the fixtures. Fixtures: Claude
Artifact size
Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees. |
ccusage performance comparisonPR SHA: This compares the Rust PR release binary against the configured base package on the same CI runner. Package runtime diagnosticsCompares the PR package wrapper, the installed native optional dependency binary, and the workspace release binary on the same large fixture. This identifies whether slow package results come from JavaScript wrapper overhead, the published native binary build, or the Rust core itself. Fixtures: Claude
Committed fixture performanceCommitted small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage. Fixtures: Claude
Large real-world-shaped fixture performanceGenerated fixtures shaped from aggregate local log statistics: thousands of JSONL files, many small sessions, and a long tail of larger sessions. No real prompts, paths, or outputs are stored in the fixtures. Fixtures: Claude
Artifact size
Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees. |
There was a problem hiding this comment.
ℹ️ Minor suggestions only — the flag restoration itself looks correct.
Reviewed changes
- Parser accepts
-won unified weekly:parse_all_commandnow handles-w/--start-of-week(including=form) forkind == Weekly, appliescommands.weekly.startOfWeekconfig with CLI-overrides-config precedence, and defaults to Monday. - Weekly bucketing and
--lastfollow the flag: the chosen day threads throughload_rows/load_sections/aggregate_rowsand the unified--lastwindow resolution. - Help and docs updated: new
all_weekly_optionshelp set lists the flag onccusage weekly --help, and the guides now state Monday is the unified default with Sunday remaining theclaude weeklydefault.
muse-spark-1.3-contributor (free via Pullfrog for OSS) | 𝕏
| if kind == AgentReportKind::Weekly | ||
| && matches!(parser.peek_name(), Some("-w" | "--start-of-week")) |
There was a problem hiding this comment.
Config and -w are gated on the invoked kind being weekly, so ccusage daily --sections daily,weekly ignores commands.weekly.startOfWeek and rejects -w even though the section loader already supports a custom start. Consider applying the config unconditionally and accepting the flag when the kind or the requested sections include weekly.
Technical details
# Weekly sections via non-weekly kinds ignore start-of-week
## Affected sites
- rust/crates/ccusage-cli-parser/src/parser.rs:416 — config only applied when `kind == Weekly`
- rust/crates/ccusage-cli-parser/src/parser.rs:429 — `-w` rejected unless `kind == Weekly`
- rust/crates/ccusage-adapter-all/src/loader.rs:913 — `aggregate_rows` already honors the passed day for every section
## Required outcome
- A weekly section requested via `--sections` from a non-weekly unified kind either honors `commands.weekly.startOfWeek`/`-w` or documents that it intentionally stays Monday.Assert that load_rows and load_sections bucket weekly rows by the requested start day, document that commands.weekly.startOfWeek sets the default with the flag taking precedence, and fix the weekly-reports example that paired a claude weekly comment with a ccusage weekly command. Co-authored-by: jgorres <[email protected]>
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
ccusage-guide | eccd732 | Commit Preview URL Branch Preview URL |
Oct 21 2026, 06:40 PM |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Added loader-level start-of-week coverage:
unified_weekly_rows_and_sections_honor_start_of_weekexercisesload_rowsandload_sectionswith Sunday and Monday on a fixed-timestamp fixture. - Fixed docs example pairing: the
--start-of-week sundayexample now describes the unified report whileccusage claude weeklygets its own bare command for the Sunday default. - Extended
--lastwording: the CLI options guide states config-plus-flag precedence for both unified andclaudeweekly reports.
Prior feedback: the contradictory docs comment thread is resolved by this delta. The open parser-gating thread on ccusage daily --sections ...,weekly ignoring -w/config was intentionally left as documented Monday behavior, so it is not re-raised here.
muse-spark-1.3-contributor (free via Pullfrog for OSS) | 𝕏
ccusage performance comparisonPR SHA: This compares the PR package against the configured base package on the same CI runner. Package runtime diagnosticsCompares the PR package wrapper, the installed native optional dependency binary, and the workspace release binary on the same large fixture. This identifies whether slow package results come from JavaScript wrapper overhead, the published native binary build, or the Rust core itself. Fixtures: Claude
Committed fixture performanceCommitted small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage. Fixtures: Claude
Large real-world-shaped fixture performanceGenerated fixtures shaped from aggregate local log statistics: thousands of JSONL files, many small sessions, and a long tail of larger sessions. No real prompts, paths, or outputs are stored in the fixtures. Fixtures: Claude
Artifact size
Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees. |
ccusage performance comparisonPR SHA: This compares the Rust PR release binary against the configured base package on the same CI runner. Package runtime diagnosticsCompares the PR package wrapper, the installed native optional dependency binary, and the workspace release binary on the same large fixture. This identifies whether slow package results come from JavaScript wrapper overhead, the published native binary build, or the Rust core itself. Fixtures: Claude
Committed fixture performanceCommitted small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage. Fixtures: Claude
Large real-world-shaped fixture performanceGenerated fixtures shaped from aggregate local log statistics: thousands of JSONL files, many small sessions, and a long tail of larger sessions. No real prompts, paths, or outputs are stored in the fixtures. Fixtures: Claude
Artifact size
Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees. |
Upstream tip: 30b653f (2026-11-06, chore(pricing): update models.dev snapshot) Previous fork base: c76874e (the upstream commit this fork was synced to) Synced 128 upstream commits on top of c76874e: 70 automated pricing snapshot refreshes and the following meaningful ones: b24e7a7 docs: remove LINE MAN sponsor logo (ccusage#1910) a93d2fe chore: release v20.0.38 (ccusage#1938) d91f296 docs: add ccx to community projects (ccusage#1943) aa7c675 chore: release v20.0.39 (ccusage#1944) 39fefa2 fix(cli): accept --start-of-week on top-level weekly (ccusage#1945) 600b3c9 chore: release v20.0.40 (ccusage#1946) baeb991 fix(antigravity): map model ID 1402 to claude-opus-5-5 (ccusage#1948) 06347d3 chore: release v20.0.41 (ccusage#1949) 5649632 test(hermes): derive DeepSeek provider pricing from embedded snapshot (ccusage#1951) d0847af chore(deps): update node.js to >=24.22.1 (ccusage#1950) 91dfe85 chore(deps): update pullfrog/pullfrog action to v0.1.100 (ccusage#1953) f335280 chore: release v20.0.42 (ccusage#1952) b86527d chore(deps): update rust crate rustls-webpki to 0.103.16 (ccusage#1954) 5c85ca2 chore(deps): update pullfrog/pullfrog action to v0.1.101 (ccusage#1958) f268798 fix(cli): apply source-specific config in unified reports (ccusage#1959) 37a51da chore: release v20.0.43 (ccusage#1955) e302366 chore(deps): update github/codeql-action action to v4.39.1 (ccusage#1960) 7af0db6 chore(deps): update pnpm to v12.15.0 (ccusage#1961) 730c336 chore(deps): update rust crate ureq to 3.5.0 (ccusage#1964) bd1a21a fix(release): publish platform packages before the wrapper (ccusage#1965) ca33842 chore: release v20.0.44 (ccusage#1962) b2c8f8b chore: remove unused npm registry gate test (ccusage#1966) 19e71d0 chore(deps): update songmu/tagpr action to v1.21.4 (ccusage#1969) 2a84385 fix(codex): count repeated first-response snapshots once (ccusage#1971) 60227f2 chore(deps): update rust crate smallvec to 1.16.4 (ccusage#1973) 3e31edd chore(deps): update hustcer/setup-nu action to v3.29 (ccusage#1974) d93c260 feat(pricing): add gpt-6.1-terra fast/flex multipliers (ccusage#1975) 154e13b chore: release v20.0.45 (ccusage#1967) f1b50e6 chore(deps): update pullfrog/pullfrog action to v0.1.102 (ccusage#1980) 4f1f470 perf: speed up CI and local builds (ccusage#1984) 0bd3d19 refactor(rust): move binary-only report helpers out of ccusage-core (ccusage#1985) 65c5837 fix(antigravity): skip unreadable conversation databases (ccusage#1992) 6372cac chore(deps): update dependency vitepress to v2.0.0-alpha.21 (ccusage#1994) 9a42066 chore(deps): update node.js to >=24.22.2 (ccusage#1995) 87fa788 chore(deps): update pnpm to v12.16.0 (ccusage#1996) 8cb2532 fix(codex): price recorded Ultrafast requests at Ultrafast rates (ccusage#1989) 128d6a0 chore(deps): update pnpm to v12.16.1 (ccusage#1997) 5aa9d3f chore: release v20.0.46 (ccusage#1982) 4712880 chore(deps): update rust crate unicode-width to 0.2.3 (ccusage#1998) 3d59863 chore(deps): update node.js to v26 (ccusage#1999) 96e98c6 chore(deps): update dependency @types/node to v26.6.6 (ccusage#2002) 60fac54 chore(deps): update pullfrog/pullfrog action to v0.1.103 (ccusage#2003) de83d19 fix(config): let space-form command sections override generic report sections (ccusage#2006) 72b8ad4 fix(all): count OpenCode Claude Agent turns once in unified reports (ccusage#2007) 7db7a30 test(pricing): stop the alias-precedence test depending on the LiteLLM snapshot (ccusage#2009) e7a7ee4 fix(all): keep sessions last active on the --until day (ccusage#2008) 4a3da73 chore: release v20.0.47 (ccusage#2001) 8e56c11 chore(deps): update pullfrog/pullfrog action to v0.1.104 (ccusage#2010) e2eddf7 chore(deps): update pullfrog/pullfrog action to v0.1.107 (ccusage#2012) e3d2dcb chore(deps): update pullfrog/pullfrog action to v0.1.108 (ccusage#2014) 8995f3b chore: release v20.0.48 (ccusage#2011) 3977fd0 chore(deps): update pullfrog/pullfrog action to v0.1.110 (ccusage#2017) 546ae51 fix(nix): make `nix flake show` work again on nixpkgs 26.11 (ccusage#2019) 1b5e8cc chore(deps): update kesin11/actions-timeline action to v3.2.1 (ccusage#1983) 23c5d62 chore(deps): update rust crate jiff to 0.2.39 (ccusage#2024) 7b7cec0 chore(deps): update rust crate ureq to 3.5.1 (ccusage#2025) a1e4a03 chore(deps): update pullfrog/pullfrog action to v0.1.111 (ccusage#2028) e84d142 chore(deps): update pnpm to v12.17.0 (ccusage#2029) Fork wins kept: the SQLite on-disk cache with its per-namespace ledger, --live-only and clear-cache, the pi adapter with replay suppression and per-path namespaces, the OpenCode V2 loader (now wrapped as LinkedEntry), the FxHash/Cow hot paths, parallel per-file loads with their single_thread seam, the table renderer, the fork CI and tag-only release workflow, and the pricing freshness, refresh and offline precompute paths. Hand-resolved conflicts: rust/adapters/claude/src/lib.rs: upstream's DedupedEntries/pruned dedupe lands beside the fork's collapse_replays and requestless replay rules; load_daily_summaries routes through load_daily_summaries_with_detection. rust/adapters/opencode/{parser,loader}.rs: upstream's V2 session_message parsing is wrapped as the fork's LinkedEntry, and the native Claude session link is read from the payload so it survives a cache hit. rust/adapters/antigravity/src/loader.rs: upstream's rewrite is taken, keeping the fork's per-database outcome reporting and file order. rust/crates/ccusage-core/src/pricing.rs: the fork's OnceLock embedded loader sits beside upstream's models.dev fallback and alias resolution. rust/crates/ccusage/src/main.rs: upstream dispatch plus the fork's ClearCache command. rust/crates/ccusage-core/src/cache.rs: the ledger is now generic over a LedgerPayload trait, so it covers plain entries and OpenCode's entry-plus-link pairs alike. rust/Cargo.toml: the fork's exact `=` pins stay; jiff 0.2.39, smallvec 1.16.4, ureq 3.5.1, unicode-width 0.2.3, rustls-webpki 0.103.16. .github/workflows/{ci,release}.yaml: the fork's design is kept. packages/ccusage-*/package.json (6 files) and rust/adapters/claude/src/daily.rs: stay deleted. rust/crates/ccusage-core/src/{home,last_window}.rs: upstream's crate split moved them to ccusage-cli and ccusage-report, with their snapshots. apps/ccusage/config-schema.json: regenerated from the merged Rust source (32 numeric minimums `0.0` -> `0`, new pi description), plus three snapshots regenerated in the fork layout for the codex and qwen tests. Fixes made while landing this sync, folded in so the merge stands green: fix(rust): decode cache blobs written before `data_session_id`. postcard encodes struct fields positionally, so a field added mid-struct made every blob the released 20.0.36 binary wrote undecodable. A failed decode is not merely slow: it drops the ledger rows of deleted source files, which no later run can rebuild. In an isolated fixture the released binary still reported 101,570,002 pi tokens after the source files were deleted; a warm build without the decoders reported 0. LegacyCachedEntry and LegacyLedgerEntry decode the old layout and reconstruct `data_session_id` as None; decode_exact requires the whole buffer, so a newer blob can no longer "decode" into an older struct as garbage. Four regression tests cover both layouts and the tail rule. fix(rust): warn once per table when a cached blob decodes as no known layout. The files table is rebuildable; the ledger table is not, so the warning says to save a copy before clear-cache. test(opencode): isolate the Claude-agent pairing test from the developer's real cache; it had been writing 'agent'/'plain' ledger rows into the opencode-db namespace. Version: take upstream's 20.0.48 in package.json, apps/ccusage/package.json and docs/package.json; the Rust workspace keeps version 0.0.0. DO NOT push a v20.0.48 tag from this fork: release.yaml would publish fork bytes under upstream identity.

Summary
Restores
-w/--start-of-weekon the top-levelccusage weeklycommand, and lists it inccusage weekly --help.External bug report: ENjxzlt/Claude-Code-Usage-Streamcontroller#9 (reported by @jgorres). On v20.0.39,
ccusage weekly --json --offline --last 1 -w <day>fails withUnknown option '-w', even though the docs showccusage weekly -w monday.Root cause
In 20.x,
ccusage weeklybecame the unified all-agent report. The parser sends it throughparse_all_command, which only accepts the shared flags plus--sections/--by-agent. Onlyparse_claude_weekly_command(ccusage claude weekly) still handled-w/--start-of-week. On top of that, the unified loader and the--lastwindow always used Monday weeks, and the top-level help page used the generic period option set, which doesn't include the flag.Changes
AgentCommandArgsgets astart_of_weekfield. It defaults to Monday, so output for anyone not passing the flag is unchanged.parse_all_commandaccepts-w/--start-of-week(including the--start-of-week=<day>form), but only forweekly. It also appliescommands.weekly.startOfWeekfrom the config file, whichconfig-files.mdalready documents and which was being ignored for the top-level command. The CLI flag overrides the config value.load_rows/load_sections, thenaggregate_rows) and the--lastwindow both use the chosen week start.ccusage weekly --helpnow lists-w, --start-of-weekwithdefault: monday.weekly-reports.mdno longer calls Sunday the default forccusage weekly(Sunday is still the default forccusage claude weekly), andcli-options.mdno longer says--start-of-weekonly works onccusage claude weekly.Tests
=form, and the Monday default.-wis still rejected ondaily, and invalid day values are rejected.ccusage weekly --helplists the flag;ccusage daily --helpdoesn't.last_window: on the unified weekly report,--lastuses the chosen week start.cargo test --workspace: all pass.cargo clippy --workspace --all-targets -- -D warnings: clean.ccusage weekly -w sunday,-w monday, and--start-of-week=wednesdaybucket correctly, and--last 1 -w <day>starts the window on that day.Summary by cubic
Restores
-w/--start-of-weekon the top-levelccusage weeklyso the documentedccusage weekly -w mondayworks again; since 20.x the unified all-agent parser rejected the flag withUnknown option '-w'. Output is unchanged for anyone not passing the flag (Monday stays the default).--lastwindow.commands.weekly.startOfWeekfrom the config file is now applied; the CLI flag overrides it.ccusage weekly --helplists the flag withdefault: mondayand the docs were corrected (Sunday remains the default only forccusage claude weekly).ccusage daily.Written for commit eccd732. Summary will update on new commits.
Summary by CodeRabbit
New Features
-w/--start-of-week, allowing any weekday to define reporting periods.ccusage weeklydefaults to Monday, whileccusage claude weeklydefaults to Sunday.--lastdate ranges.Documentation
Tests