Repository navigation
chore(deps): update pnpm to v12.17.0 - #2029
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the
|
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
ccusage-guide | 16fa99d | Commit Preview URL Branch Preview URL |
Nov 06 2026, 03:26 AM |
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 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. |
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. |
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.
This PR contains the following updates:
12.16.1→12.17.0Release Notes
pnpm/pnpm (pnpm)
v12.17.0: pnpm 12.17Compare Source
pnpm 12.17.0 adds
pnpm peers check --global, dependency-group selectors and wildcards inoverrides, and runtime, package manager, Cargo, and Python updates inpnpm outdatedandpnpm update. It also fixes files that other users could not read in Docker images, and repeat installs that missed changes to local dependencies.Minor Changes
pnpm peers checknow accepts--global(-g) to check globally installed packages. After a global install or update, the peer dependency warning now suggestspnpm peers check -g#17504.pnpm outdatedandpnpm updatenow inspect and update package manager and runtime versions indevEngines.packageManager,packageManager,devEngines.runtime,engines.runtime, andruntime:dependencies. Withcargo.enabledorpython.enabled,pnpm outdatedandpnpm updatealso inspect and update Cargo dependencies inCargo.tomlandCargo.lockand Python dependencies inpyproject.tomlandpylock.toml.overridesselectors now support:prod,:optional, and:peerpseudo-selectors that target a single dependency group. They also support*wildcard patterns on parent and target package names. An override with a non-range value, such asnpm:orfile:, no longer adds a peer dependency todependencies. Removing an optional dependency with"-"now also removes the duplicate entry fromdependencies#5391.Patch Changes
Installing packages
Files that pnpm creates in a project now get the permissions the umask gives any new file, such as
0644. Before, several of them were readable only by the user who ran pnpm, which broke Docker images that run as a different user #17435.The fix applies to:
node_modules/.pnpm-workspace-state-v1.json. A different user runningpnpm runreinstalled the dependencies because it could not read this file.pnpm-workspace.yamlpnpm deploypnpm patch-commitpnpm dedupe --checkWhen pnpm edits an existing file, the file keeps its permissions.
pnpm installno longer writes broken dependency links when the project'snode_modulesis a symlink to another directory, such as another project'snode_modules. The install reported success, but the links it wrote did not resolve #17448.Commands installed with
pnpm add --globalnow find the dependencies that pnpm hoists for their package. A package that loads a dependency it does not declare, such as a native addon's platform-specific package, failed with "Cannot find module". Reinstall such a package withpnpm add --globalto update its existing command #17503.When pnpm switches to the version a project pins, it now installs that version's native binary for the current host, even if the project's
supportedArchitecturesexcludes the host. Before, pnpm could not use the pinned version and kept running the installed one. pnpm also repairs a pinned version that an earlier install left without the host's binary.With the global virtual store, a change to a dependency of one package in a dependency cycle now gives every package in that cycle a new directory. Before, the other packages kept their directories and still linked the old copy of the changed package, so the project could load two copies of it #17466.
Packages in a dependency cycle, and packages that depend on one, move to new global virtual store directories once after this update. Those that run a build miss the side-effects cache once.
With
nodeLinker: hoisted, when two workspace projects need the same package version and it cannot be hoisted to the root, each project now keeps the copy installed in its ownnode_modules. Build scripts run in each of these copies. Before, the second project's copy was replaced with a symlink to the first project's, so every repeat install imported it again #17498.The Node.js
latestselector now chooses the newest stable release #17490.Hardlinking from the store now stats each store file once per install. Since pnpm 12.8.0, a store file was stat'ed again for every package that links it. On an offline install of a large workspace, that added up to 15% system CPU #17500.
Repeat installs and local dependencies
pnpm install --frozen-lockfileno longer reports an outdated lockfile right after the install that wrote it. This happened when a pnpmfilereadPackagehook orpackageExtensionschanged the dependencies or peer dependencies of a local directory dependency outside the workspace projects. It affected afile:dependency, an injectedworkspace:../dirdependency outside the workspace patterns, and an injected workspace package left out by--filter#17447 #17473.A repeat
pnpm installnow takes the fast path whenignoredOptionalDependenciesremoves an optional dependency of afile:directory dependency. It used to resolve again on every run.pnpm installnow resolves again after an edit to an injectedworkspace:../dirdependency outside the workspace patterns under a shared lockfile. It used to keep the lockfile unchanged. The nextpnpm install --frozen-lockfilethen failed #17476.pnpm installnow resolves a local directory again after itspackage.jsonchanges when an override or a package extension adds it to the dependencies of a registry package.pnpm install --frozen-lockfilefails on a lockfile that still records the old dependencies of such a directory #17486.With
injectWorkspacePackagesand per-project lockfiles,pnpm installnow updates a project's lockfile when a local tarball that an injected workspace project depends on is replaced. The project's lockfile kept the old version and integrity before.pnpm installnow detects a change to a local tarball or directory that only a pnpmfilereadPackagehook depends on. A repeat install reported "Already up to date" and kept the old contents before pnpm/tasks#227.pnpm installnow relinks aworkspace:orlink:dependency whose link was deleted fromnode_modules. It used to report "Already up to date" and leave the link missing #17485.A repeat
pnpm installreports "Already up to date" again when a pnpmfilereadPackagehook changes the dependencies of a workspace project. Since 12.15.0, every such install ran in full #17468.After an edit to a project's
package.json,pnpm installandverifyDepsBeforeRunnow run the pnpmfile'sreadPackagehook on the edited manifest before comparing it with the lockfile. They could report the project up to date when the hook rewrote the edited dependency to a specifier the lockfile did not record.Adding and updating dependencies
pnpm update --latestwith package selectors now updates the dependencies of the selected packages within their declared ranges. Excluded packages and their dependencies keep their locked versions #17444.pnpm add <pkg>@<tag>now uses a catalog entry set to that same dist-tag. The dependency is saved ascatalog:and the entry stays as written pnpm/tasks#225.When
pnpm addadds a new dist-tag such asvue@legacyto a catalog, the catalog entry records the exact version the tag points to. The same applies to a dependency added without a version when thetagsetting names a dist-tag other thanlatest.pnpm addnow saves the resolved version range of an npm alias. For example,pnpm add v2@npm:vueandpnpm add v2@npm:vue@^3.0.0both savenpm:vue@^3.5.13.Running scripts and commands
Programs that a script or
pnpm execcommand leaves running, such as a browser opened by theopenpackage, now outlive pnpm exactly when they would outlive the command run without pnpm. Before, on Windows, a failed command,Ctrl+C, or a closed terminal ended all of them. pnpm still ends them when it is killed or crashes.When a recursive or parallel run bails, the scripts still running now receive
SIGTERMon Unix and are killed only if they are still running two seconds later. On Windows, everything those scripts started is ended, including detached processes whose parent has already exited. Before, a bail killed them at once #17465.On Windows, the shell shim of a
.cmdor.batbin now runs it under Git Bash when MSYS argument conversion is off, such as withMSYS_NO_PATHCONV=1orMSYS2_ARG_CONV_EXCL='*'. The shim used to start an interactive cmd.exe prompt #17480.pnxandpnpm createnow run the command in the directory selected by--diror--workspace-root. Without either flag, the command still runs in the directory pnpm was started in.pnpm --env-filenow reads files the waynode --env-filedoes. Values are taken as written, so$VARis no longer expanded and Windows paths such asC:\Users\meload unchanged. A file is no longer rejected for its contents.Settings and messages
pnpm versionno longer creates a git commit and tag whengitTagVersionis set tofalse#17460.pnpm publishnow reads thepublishBranchsetting frompnpm-workspace.yamland fromPNPM_CONFIG_PUBLISH_BRANCH. The--publish-branchflag overrides it.pnpmnow accepts--strict-ssland--local-address <ip>on the command line.pnpm doctoruses a 15-second timeout when checking registry connectivity.pnpm-workspace.yamlparse errors now reportERR_PNPM_INVALID_SETTING.The error for a dependency with an invalid name in a project's manifest now names the project's directory. It used to say only "The current package", which did not tell which workspace project to fix #17475.
Platinum Sponsors
Gold Sponsors
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.