build: migrate package tooling to nushell and node test by ryoppippi · Pull Request #1306 · ccusage/ccusage · GitHub
Skip to content

build: migrate package tooling to nushell and node test#1306

Merged
ryoppippi merged 22 commits into
mainfrom
codex/nushell-ensure-native-binary
Jun 13, 2026
Merged

build: migrate package tooling to nushell and node test#1306
ryoppippi merged 22 commits into
mainfrom
codex/nushell-ensure-native-binary

Conversation

@ryoppippi

@ryoppippi ryoppippi commented Jun 12, 2026

Copy link
Copy Markdown
Member

Migrates package and CI helper tooling away from Bun/TypeScript runner dependencies where practical. The PR now covers Nushell script ports, Node built-in tests, oxlint type-aware checking, and lighter just/package scripts.

Changes:

  • Replace action-used TypeScript/MJS helper scripts with executable Nushell scripts using Nix shebangs.
  • Move PR performance comparison/comment upsert, E2E and large fixture generation, and native package staging/verification to Nushell.
  • Keep Bun only where it is still required: pkg.pr.new package install in the performance script and the upstream models.dev generator path.
  • Remove unused bench/mitata/fs-fixture/Bun skill surface and Bun package dependency surface.
  • Replace Vitest tests/config with Node built-in test runner, and update CI plus pre-push hooks to run node --test.
  • Replace tsgo typecheck with oxlint type-aware/type-check; keep pure Nix oxlint/treefmt on a lightweight config that does not require node_modules.
  • Move app developer script entry points toward just while keeping package lifecycle scripts direct.
  • Add a repo-local Nushell skill and refresh testing/profile/type guidance for Node tests and Nushell scripts.
  • Fix the package launcher so npx/npm bin symlinks still execute the CLI.

Validation:

  • pnpm install --frozen-lockfile
  • nix develop --command just fmt
  • nix develop --command just typecheck
  • nix develop --command just test-node
  • nix develop --command pnpm --filter ./apps/ccusage run build
  • actionlint
  • nix flake check --print-build-logs
  • symlinked package-bin smoke tests for --version and daily --offline --json
  • PR CI: check, test, build matrix, npm/pnpm E2E matrix, perf comments, CodeRabbit, and cubic all pass

Replace the Bun ensure-native-binary script with a Nushell script that keeps the same native package fast path, portable binary validation, cargo fallback build, and version check behavior.

This removes Bun as a required runtime for the package prepack native-binary check. The dev shell now provides Nushell, and the CI/release packaging jobs install nushell instead of bun for that prepack path while keeping Bun available for the remaining benchmark and fixture TypeScript scripts.
@pullfrog

pullfrog Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

@ryoppippi

Copy link
Copy Markdown
Member Author

@coderabbitai review
@cubic-dev-ai review

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaces Bun/Vitest automation with Nushell scripts and Node test runner: Nushell implementations added for native-binary staging/verification, performance comparison, large/E2E fixture generation, and PR-comment upsert; CI/workflows, package scripts, justfiles, test configs, and docs updated accordingly.

Changes

Nushell migration and workflow update

Layer / File(s) Summary
Docs and skills updates
*.md, .agents/skills/*, AGENTS.md, apps/ccusage/AGENTS.md
Replaced Vitest/Bun references with Node test and Nushell guidance; added Nushell skill, node-test docs, and adjusted profiling/testing documentation.
GitHub scripts and CI wiring
.github/scripts/*, .github/workflows/*, .github/actions/*/action.yaml
Added .github/scripts/upsert-pr-comment.nu and .github/scripts/generate-e2e-fixture.nu; updated CI workflows to install/use Nushell, removed Bun runner matrix/steps, and switched perf/comment steps to .nu.
Nushell script implementations
apps/ccusage/scripts/ensure-native-binary.nu, verify-native-package.nu, stage-native-package.nu
Implemented native-binary discovery/portability checks, verification, and staging in Nushell; removed TS/MJS counterparts.
Performance & fixture tooling
apps/ccusage/scripts/compare-pr-performance.nu, generate-large-fixture.nu, .github/scripts/generate-e2e-fixture.nu
Reimplemented PR perf comparison and large/preview fixture generators in Nushell; removed Bun/TypeScript benchmark/generator scripts.
Package/build wiring and packaging scripts
apps/ccusage/package.json, apps/ccusage/justfile, justfile, packages/*/package.json
Rewired build/prepack scripts to call Nushell verifiers and generators; added build/package/schema recipes; updated prepack in packages to use .nu verifier.
CLI exports and Node tests
apps/ccusage/src/cli.ts, apps/ccusage/src/cli.test.ts, *.tsconfig*, vitest.config.ts (removed)
Gated CLI direct-execution via new isMainModule, exported helpers, added Node node:test tests for native-binary resolution/permissions, and removed Vitest configs/types from tsconfig.
Nix, linters, and formatting
nix/*, .oxlintrc.json, nix/treefmt.nix
Replaced bun with nushell in dev shell and release Nix installs, added nufmt for .nu, and configured oxlint to use a repo config file.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • pullfrog

Poem

🐰 I shelled the old Bun into the wood,
I hop through bins and check the build is good,
I stamp the version, patch the CI post,
I hum small scripts that Nushell loves the most,
A tiny hop — repo safely stood.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/nushell-ensure-native-binary

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review
@cubic-dev-ai review

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 12, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
ccusage-guide 107ca57 Commit Preview URL

Branch Preview URL
Jun 13 2026, 12:23 AM

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Fetch PR details and diff
gh pr view 1306 --repo ccusage/ccusage --json title,body,files,additions,deletions,changedFiles

echo "---FILES---"
gh pr diff 1306 --repo ccusage/ccusage

Length of output: 16779



@ryoppippi: I've reviewed the changes in this PR. Here's my assessment:

Summary

The Nushell port is a clean, faithful translation of the original Bun/TypeScript script. All core paths are preserved — native package fast path with portable-binary validation, version check, and cargo fallback build.


Observations

✅ Logic is faithfully preserved

Behaviour TypeScript Nushell
Native fast path nativePackageIncludesBinary + version check native_package_includes_binary + version check
Linux static check ldd regex on stdout+stderr ^ldd | complete, same regex
macOS dylib whitelist otool -L + prefix filter ^otool -L | complete, same filter
Windows passthrough return true true
Cargo fallback Bun.$\cargo build ...`` ^cargo build ... (error propagates naturally)
Version check .split(/\s+/).at(-1) split row --regex '\s+' | last

✅ Idiomatic Nushell

  • $env.CURRENT_FILE | path dirname | path join ../../.. | path expand is the correct way to locate the repo root from a script path.
  • get --optional $target_key for safe record access is idiomatic.
  • run-external $binary '--version' | complete is the correct form when the binary path is in a variable (the ^var short-form doesn't support arbitrary path variables in all Nushell versions).
  • Short-circuit and in native_package_includes_binary is safe — Nushell does evaluate and/or lazily.

🔍 Minor observations

is_portable_binaryldd coverage on Linux ARM64

ldd on musl-compiled static binaries correctly prints statically linked; on some ARM64 distributions it may print not a dynamic executable instead. The regex covers both cases, which is consistent with the original.

cargo_binary path never copied to native package dir

This is consistent with the TypeScript version — the cargo fallback is used only in dev/local scenarios; CI pre-builds and downloads artifacts. No change needed, just confirming parity.

nix/dev-shell.nixnushell added alongside bun

This is correct per the PR description: other TS scripts (bench, large-fixture) still use Bun APIs.


Verdict

The migration is well-executed and the logic is equivalent to the original. CI/release workflow comments are updated to reflect the change. No functional issues found.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 6 files

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread apps/ccusage/scripts/ensure-native-binary.nu Outdated
@pkg-pr-new

pkg-pr-new Bot commented Jun 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

ccusage

npx https://pkg.pr.new/ccusage@1306

@ccusage/ccusage-darwin-arm64

npx https://pkg.pr.new/@ccusage/ccusage-darwin-arm64@1306

@ccusage/ccusage-darwin-x64

npx https://pkg.pr.new/@ccusage/ccusage-darwin-x64@1306

@ccusage/ccusage-linux-arm64

npx https://pkg.pr.new/@ccusage/ccusage-linux-arm64@1306

@ccusage/ccusage-linux-x64

npx https://pkg.pr.new/@ccusage/ccusage-linux-x64@1306

@ccusage/ccusage-win32-x64

npx https://pkg.pr.new/@ccusage/ccusage-win32-x64@1306

commit: 107ca57

Avoid duplicating the native package platform map in the Nushell prepack check. The script now scans the native package manifests and selects the package whose os and cpu metadata match the current platform.

This addresses cubic feedback about drift risk while preserving the same fast path and cargo fallback behavior.
@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 98c3abe1ac04
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 1.000s 981.6ms 20.9ms 3
PR pkg.pr.new 98c3abe 766.5ms 823.7ms 21.6ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: 98c3abe. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 273.5ms 249.9ms 1.09x 723.50 MiB 747.00 MiB 1.03x 3.68 GiB/s 4.03 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 89.4ms 88.5ms 1.01x 96.00 MiB 88.75 MiB 0.92x 11.26 GiB/s 11.37 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 241.3ms 4.17 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 225.1ms 4.47 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 77.1ms 13.06 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 60.9ms 16.52 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 16.7ms 2.1ms 8.03x 42.75 MiB 3.00 MiB 0.07x 0.09 MiB/s 0.74 MiB/s
claude session --offline --json 0.00 MiB 15.7ms 2.0ms 7.78x 43.00 MiB 2.75 MiB 0.06x 0.10 MiB/s 0.77 MiB/s
codex daily --offline --json 0.00 MiB 14.8ms 2.0ms 7.40x 43.00 MiB 3.00 MiB 0.07x 0.06 MiB/s 0.43 MiB/s
codex session --offline --json 0.00 MiB 16.2ms 1.9ms 8.65x 42.75 MiB 3.00 MiB 0.07x 0.05 MiB/s 0.46 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 265.7ms 254.2ms 1.05x 726.50 MiB 731.00 MiB 1.01x 3.79 GiB/s 3.96 GiB/s
codex --offline --json 1.01 GiB 89.1ms 73.5ms 1.21x 91.00 MiB 90.50 MiB 0.99x 11.30 GiB/s 13.70 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@ryoppippi

Copy link
Copy Markdown
Member Author

@cubic-dev-ai addressed your P3 drift-risk finding in 82b37b2 by deriving the native package root from the package manifests os/cpu metadata instead of keeping a separate hardcoded map in the Nushell script.

Validation after the fix:

  • nix develop --command pnpm --filter=./apps/ccusage run ensure:native-binary
  • fallback path with packages/ccusage-darwin-arm64/bin/ccusage temporarily moved aside, then restored
  • nix develop --command just fmt
  • nix develop --command just ccusage::build

@coderabbitai review

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 98c3abe1ac04
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 770.4ms 795.3ms 22.0ms 3
PR pkg.pr.new 98c3abe 902.6ms 933.5ms 21.8ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: 98c3abe. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 253.7ms 244.9ms 1.04x 717.25 MiB 742.75 MiB 1.04x 3.97 GiB/s 4.11 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 85.2ms 84.8ms 1.00x 93.50 MiB 91.25 MiB 0.98x 11.82 GiB/s 11.88 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 245.4ms 4.10 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 220.1ms 4.57 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 73.6ms 13.67 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 59.8ms 16.83 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 15.6ms 15.9ms 0.98x 43.00 MiB 42.75 MiB 0.99x 0.10 MiB/s 0.10 MiB/s
claude session --offline --json 0.00 MiB 17.5ms 17.7ms 0.99x 42.75 MiB 42.75 MiB 1.00x 0.09 MiB/s 0.09 MiB/s
codex daily --offline --json 0.00 MiB 15.0ms 14.9ms 1.00x 42.75 MiB 42.75 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
codex session --offline --json 0.00 MiB 14.3ms 14.2ms 1.00x 43.00 MiB 43.00 MiB 1.00x 0.06 MiB/s 0.06 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 255.8ms 229.6ms 1.11x 727.00 MiB 723.25 MiB 0.99x 3.94 GiB/s 4.39 GiB/s
codex --offline --json 1.01 GiB 72.6ms 74.3ms 0.98x 91.00 MiB 93.25 MiB 1.02x 13.86 GiB/s 13.55 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

@cubic-dev-ai addressed your P3 drift-risk finding in 82b37b2 by deriving the native package root from the package manifests os/cpu metadata instead of keeping a separate hardcoded map in the Nushell script.

Validation after the fix:

  • nix develop --command pnpm --filter=./apps/ccusage run ensure:native-binary
  • fallback path with packages/ccusage-darwin-arm64/bin/ccusage temporarily moved aside, then restored
    ...

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get the latest diff of the PR
gh pr diff 1306 --repo ccusage/ccusage

Length of output: 12950



@ryoppippi: The fix in 82b37b28 looks great. The new matching_native_package_root function is a clear improvement:

glob ($repo_root | path join packages 'ccusage-*' package.json)
| each {|package_json_path|
    let os  = $package_json.os?
    let cpu = $package_json.cpu?
    if (list_contains $os $target_platform) and (list_contains $cpu $target_arch) { ... }
}
| where {|package_root| $package_root != null }

A few things I verified:

  • $package_json.os? / .cpu? — optional field access is correct; returns null if absent, which list_contains handles safely via the describe type-guard.
  • ($value | describe) =~ '^list' — Nushell's describe returns list<string> (or similar) for list values, so the '^list' regex is the right guard.
  • $candidates | get --optional 0 — correctly returns null with no match rather than erroring.
  • Drift-risk eliminated — adding a new platform package now requires no script change; the script auto-discovers it from the manifest os/cpu fields.

The rest of the script is unchanged from the previous review. Everything looks good. ✅

[approve]

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 82b37b289dd5
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 663.2ms 928.2ms 22.2ms 3
PR pkg.pr.new 82b37b2 792.4ms 799.1ms 24.4ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: 82b37b2. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 255.3ms 249.7ms 1.02x 722.50 MiB 735.25 MiB 1.02x 3.94 GiB/s 4.03 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 84.7ms 85.7ms 0.99x 90.75 MiB 93.75 MiB 1.03x 11.88 GiB/s 11.75 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 248.5ms 4.05 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 230.9ms 4.36 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 75.9ms 13.26 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 61.7ms 16.32 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 17.3ms 15.5ms 1.11x 42.75 MiB 42.75 MiB 1.00x 0.09 MiB/s 0.10 MiB/s
claude session --offline --json 0.00 MiB 16.2ms 14.0ms 1.16x 43.00 MiB 43.00 MiB 1.00x 0.10 MiB/s 0.11 MiB/s
codex daily --offline --json 0.00 MiB 13.8ms 14.3ms 0.97x 43.25 MiB 43.00 MiB 0.99x 0.06 MiB/s 0.06 MiB/s
codex session --offline --json 0.00 MiB 13.9ms 13.7ms 1.02x 42.75 MiB 42.75 MiB 1.00x 0.06 MiB/s 0.06 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 257.8ms 236.9ms 1.09x 733.00 MiB 721.00 MiB 0.98x 3.91 GiB/s 4.25 GiB/s
codex --offline --json 1.01 GiB 77.8ms 79.2ms 0.98x 91.25 MiB 90.25 MiB 0.99x 12.94 GiB/s 12.71 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 82b37b289dd5
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 782.6ms 1.010s 25.2ms 3
PR pkg.pr.new 82b37b2 665.9ms 810.5ms 25.0ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: 82b37b2. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 280.5ms 259.5ms 1.08x 726.00 MiB 732.25 MiB 1.01x 3.59 GiB/s 3.88 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 107.1ms 108.9ms 0.98x 92.75 MiB 91.00 MiB 0.98x 9.40 GiB/s 9.24 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 248.1ms 4.06 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 215.4ms 4.67 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 93.7ms 10.74 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 83.7ms 12.03 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 19.2ms 2.6ms 7.38x 42.75 MiB 3.00 MiB 0.07x 0.08 MiB/s 0.59 MiB/s
claude session --offline --json 0.00 MiB 17.5ms 2.8ms 6.19x 43.00 MiB 2.75 MiB 0.06x 0.09 MiB/s 0.55 MiB/s
codex daily --offline --json 0.00 MiB 15.9ms 3.6ms 4.45x 43.00 MiB 3.00 MiB 0.07x 0.05 MiB/s 0.24 MiB/s
codex session --offline --json 0.00 MiB 19.1ms 3.1ms 6.25x 43.00 MiB 3.00 MiB 0.07x 0.04 MiB/s 0.28 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 256.9ms 221.7ms 1.16x 747.00 MiB 735.00 MiB 0.98x 3.92 GiB/s 4.54 GiB/s
codex --offline --json 1.01 GiB 93.0ms 79.2ms 1.17x 91.00 MiB 90.00 MiB 0.99x 10.82 GiB/s 12.70 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

Make the native-binary check executable and let the script acquire Nushell through a Nix shebang pinned to the repository flake inputs.

The package build no longer needs nushell installed into the lightweight CI or release profiles, and the dev shell does not need to add nushell just for this prepack script. The cargo fallback still works when the script is invoked from the project dev shell.
@ryoppippi

Copy link
Copy Markdown
Member Author

@coderabbitai review
@cubic-dev-ai review

Pushed c4545e1 to use a Nix shebang for the Nushell script and remove nushell from the lightweight CI/release profile installs. I also checked the remaining small scripts and documented why stage-native-package.mjs should stay JS for the Windows action path.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review
@cubic-dev-ai review

Pushed c4545e1 to use a Nix shebang for the Nushell script and remove nushell from the lightweight CI/release profile installs. I also checked the remaining small scripts and documented why stage-native-package.mjs should stay JS for the Windows action path.

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
gh pr diff 1306 --repo ccusage/ccusage

Length of output: 12786



@ryoppippi: Commit c4545e17 looks great. Here's what I verified:

✅ Nix shebang — correct form and path

#!/usr/bin/env nix
#! nix shell --inputs-from ../../.. nixpkgs#nushell --command nu

The multi-line Nix shebang is the standard form. The --inputs-from ../../.. path is resolved by Nix relative to the script file's location (apps/ccusage/scripts/), so three levels up lands at the repo root — exactly matching the $env.CURRENT_FILE | path dirname | path join ../../.. | path expand logic used in the script body. Consistent and correct.

✅ CI/release profile installs trimmed correctly

File Before After
ci.yaml nixpkgs#pnpm nixpkgs#nodejs nixpkgs#bun nixpkgs#pnpm nixpkgs#nodejs
release.yaml nixpkgs#pnpm nixpkgs#bun nixpkgs#pnpm

Nushell is no longer an explicit profile install — it's self-provisioned on first invocation through the shebang. nodejs is retained in CI (needed for tsdown); it was never in the release job because setup-node handles it there.

✅ Direct invocation in package.json

scripts/ensure-native-binary.nu (no nu prefix) is correct because the file is marked executable (mode 100755) and the shebang handles runtime dispatch. Script logic is unchanged from the previously reviewed commit.

Everything is clean. The self-bootstrapping pattern is a nice quality-of-life improvement — one fewer thing to keep in sync across ci.yaml, release.yaml, and dev-shell.nix. ✅

[approve]

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 5 files

Re-trigger cubic

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: c4545e1793a8
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 779.0ms 878.1ms 22.4ms 3
PR pkg.pr.new c4545e1 1000.0ms 1.058s 22.4ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: c4545e1. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 264.6ms 255.1ms 1.04x 727.75 MiB 739.25 MiB 1.02x 3.81 GiB/s 3.95 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 85.7ms 90.9ms 0.94x 94.00 MiB 91.25 MiB 0.97x 11.75 GiB/s 11.07 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 241.2ms 4.17 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 228.7ms 4.40 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 76.6ms 13.15 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 60.0ms 16.77 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 16.7ms 2.0ms 8.22x 42.75 MiB 2.75 MiB 0.06x 0.09 MiB/s 0.76 MiB/s
claude session --offline --json 0.00 MiB 14.6ms 2.0ms 7.41x 43.00 MiB 2.75 MiB 0.06x 0.11 MiB/s 0.79 MiB/s
codex daily --offline --json 0.00 MiB 14.7ms 1.9ms 7.78x 43.25 MiB 3.00 MiB 0.07x 0.06 MiB/s 0.45 MiB/s
codex session --offline --json 0.00 MiB 14.8ms 1.8ms 8.06x 43.00 MiB 3.00 MiB 0.07x 0.06 MiB/s 0.47 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 270.8ms 252.5ms 1.07x 729.00 MiB 737.00 MiB 1.01x 3.72 GiB/s 3.99 GiB/s
codex --offline --json 1.01 GiB 78.1ms 64.5ms 1.21x 93.25 MiB 90.75 MiB 0.97x 12.89 GiB/s 15.61 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: c4545e1793a8
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 738.4ms 813.0ms 21.6ms 3
PR pkg.pr.new c4545e1 801.7ms 949.0ms 21.6ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: c4545e1. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 261.3ms 255.5ms 1.02x 721.50 MiB 724.00 MiB 1.00x 3.85 GiB/s 3.94 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 85.7ms 91.6ms 0.94x 92.25 MiB 92.00 MiB 1.00x 11.74 GiB/s 10.99 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 254.6ms 3.96 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 225.0ms 4.47 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 76.4ms 13.18 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 64.3ms 15.65 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 17.0ms 16.2ms 1.05x 43.00 MiB 43.00 MiB 1.00x 0.09 MiB/s 0.10 MiB/s
claude session --offline --json 0.00 MiB 15.6ms 19.2ms 0.81x 43.00 MiB 43.00 MiB 1.00x 0.10 MiB/s 0.08 MiB/s
codex daily --offline --json 0.00 MiB 16.9ms 14.7ms 1.14x 43.00 MiB 43.00 MiB 1.00x 0.05 MiB/s 0.06 MiB/s
codex session --offline --json 0.00 MiB 15.0ms 14.5ms 1.04x 42.75 MiB 43.25 MiB 1.01x 0.06 MiB/s 0.06 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 258.3ms 253.9ms 1.02x 729.25 MiB 732.00 MiB 1.00x 3.90 GiB/s 3.97 GiB/s
codex --offline --json 1.01 GiB 79.9ms 78.4ms 1.02x 92.25 MiB 91.75 MiB 0.99x 12.61 GiB/s 12.84 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

Replace the Bun-based upsert-pr-comment helper with a Nushell script that uses gh api through a Nix shebang. The perf jobs can now update PR comments without invoking Bun for the GitHub API wrapper.

The script preserves the existing update-or-create behavior and keeps 401/403 comment write failures non-fatal for restricted tokens.
@ryoppippi

Copy link
Copy Markdown
Member Author

@coderabbitai review
@cubic-dev-ai review

Pushed bbe813b to replace the Bun-based performance comment upsert helper with a Nushell script that uses gh api through a Nix shebang. I also checked Nushell markdown support: to md exists, but compare-pr-performance.ts still owns too much measurement/data-processing logic to move in this PR without adding churn.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review
@cubic-dev-ai review

Pushed bbe813b to replace the Bun-based performance comment upsert helper with a Nushell script that uses gh api through a Nix shebang. I also checked Nushell markdown support: to md exists, but compare-pr-performance.ts still owns too much measurement/data-processing logic to move in this PR without adding churn.

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
gh pr diff 1306 --repo ccusage/ccusage

Length of output: 20061



@ryoppippi: Commit bbe813b0 looks great. Here's what I verified:

✅ Nix shebang — correct path

#!/usr/bin/env nix
#! nix shell --inputs-from ../.. nixpkgs#nushell nixpkgs#gh --command nu

--inputs-from ../.. is relative to .github/scripts/, so two levels up lands at the repo root. Both nushell and gh are provisioned by the shebang — no external install step needed. ✅

✅ Behavior parity with the TypeScript version

Behaviour TypeScript Nushell
Env validation requiredEnv throws on null/empty required_env uses error make on null/empty
GitHub API auth Explicit Authorization: Bearer $GITHUB_TOKEN header gh api auto-reads GITHUB_TOKEN — cleaner
Comment lookup find with user?.login + body?.includes(marker) where with record type guard + str contains $marker
Auth failure skip isCommentWriteAuthFailure checks HTTP 401/403 status is_comment_write_auth_failure checks HTTP 401/HTTP 403 in stderr — correct for gh api
Update fallback catch on PATCH → create instead try_update_comment returns bool from exit code → create on false
Request body JSON.stringify({ body }) { body: $body } | to json | save via mktemp + --input
Temp file cleanup N/A rm --force $payload after use ✅

✅ CI invocation updated

pnpm exec bun .github/scripts/upsert-pr-comment.ts.github/scripts/upsert-pr-comment.nu (direct executable invocation). The shebang handles runtime dispatch. ✅

Everything is clean. The switch to gh api removes the need for manual token header management and is idiomatic for CI scripts. ✅

[approve]

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: bbe813b0d0ba
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 698.8ms 698.6ms 22.4ms 3
PR pkg.pr.new bbe813b 973.2ms 601.6ms 21.5ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: bbe813b. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 257.1ms 238.7ms 1.08x 716.25 MiB 729.25 MiB 1.02x 3.92 GiB/s 4.22 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 82.4ms 81.3ms 1.01x 92.00 MiB 89.50 MiB 0.97x 12.21 GiB/s 12.39 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 238.7ms 4.22 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 214.1ms 4.70 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 72.4ms 13.90 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 59.6ms 16.88 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 18.3ms 2.2ms 8.20x 43.00 MiB 2.75 MiB 0.06x 0.08 MiB/s 0.69 MiB/s
claude session --offline --json 0.00 MiB 18.0ms 2.1ms 8.57x 43.25 MiB 2.75 MiB 0.06x 0.09 MiB/s 0.74 MiB/s
codex daily --offline --json 0.00 MiB 18.1ms 2.0ms 9.29x 42.75 MiB 3.00 MiB 0.07x 0.05 MiB/s 0.44 MiB/s
codex session --offline --json 0.00 MiB 14.5ms 1.9ms 7.76x 43.25 MiB 3.00 MiB 0.07x 0.06 MiB/s 0.46 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs rust/target/release/ccusage directly. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 255.4ms 223.6ms 1.14x 728.25 MiB 735.00 MiB 1.01x 3.94 GiB/s 4.50 GiB/s
codex --offline --json 1.01 GiB 74.0ms 59.1ms 1.25x 92.75 MiB 90.25 MiB 0.97x 13.61 GiB/s 17.03 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: bbe813b0d0ba
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 604.0ms 720.3ms 21.4ms 3
PR pkg.pr.new bbe813b 772.6ms 673.8ms 23.4ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base package: 5f962cd49e24; PR package: bbe813b. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 269.7ms 264.1ms 1.02x 726.00 MiB 730.25 MiB 1.01x 3.73 GiB/s 3.81 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 87.0ms 88.2ms 0.99x 89.25 MiB 93.50 MiB 1.05x 11.57 GiB/s 11.41 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 253.8ms 3.97 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 268.0ms 3.76 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 82.5ms 12.20 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 65.7ms 15.33 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 15.8ms 16.9ms 0.93x 43.00 MiB 43.00 MiB 1.00x 0.10 MiB/s 0.09 MiB/s
claude session --offline --json 0.00 MiB 14.8ms 14.7ms 1.01x 42.75 MiB 42.50 MiB 0.99x 0.10 MiB/s 0.11 MiB/s
codex daily --offline --json 0.00 MiB 14.2ms 14.1ms 1.00x 43.00 MiB 42.75 MiB 0.99x 0.06 MiB/s 0.06 MiB/s
codex session --offline --json 0.00 MiB 14.7ms 14.5ms 1.01x 43.25 MiB 42.75 MiB 0.99x 0.06 MiB/s 0.06 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2,597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2,597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 266.2ms 260.1ms 1.02x 734.25 MiB 736.00 MiB 1.00x 3.78 GiB/s 3.87 GiB/s
codex --offline --json 1.01 GiB 77.9ms 77.8ms 1.00x 91.25 MiB 94.00 MiB 1.03x 12.93 GiB/s 12.94 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.32 KiB +0.00 KiB 1.00x
installed native package binary 3968.69 KiB 3968.69 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

You're iterating quickly on this pull request. To help protect your rate limits, cubic has paused automatic reviews on new pushes for now—when you're ready for another review, comment @cubic-dev-ai review.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 973bd9c9ac85
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 1.133s 1.168s 19.7ms 3
PR pkg.pr.new 973bd9c 2.683s 1.019s 18.3ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base package: 5f962cd49e24; PR package: 973bd9c. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 264.9ms 234.0ms 1.13x 734.50 MiB 719.50 MiB 0.98x 3.80 GiB/s 4.30 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 83.5ms 84.2ms 0.99x 91.25 MiB 93.00 MiB 1.02x 12.05 GiB/s 11.95 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 234.7ms 4.29 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 235.0ms 4.28 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 77.6ms 12.98 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 79.1ms 12.72 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 17.2ms 4.6ms 3.71x 43.00 MiB 10.20 MiB 0.24x 0.09 MiB/s 0.33 MiB/s
claude session --offline --json 0.00 MiB 16.9ms 2.6ms 6.56x 42.75 MiB 10.20 MiB 0.24x 0.09 MiB/s 0.60 MiB/s
codex daily --offline --json 0.00 MiB 15.5ms 3.1ms 5.00x 42.75 MiB 8.19 MiB 0.19x 0.06 MiB/s 0.28 MiB/s
codex session --offline --json 0.00 MiB 15.0ms 2.2ms 6.69x 43.00 MiB 8.19 MiB 0.19x 0.06 MiB/s 0.38 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 243.2ms 231.7ms 1.05x 743.00 MiB 910.33 MiB 1.23x 4.14 GiB/s 4.34 GiB/s
codex --offline --json 1.01 GiB 75.4ms 80.6ms 0.94x 92.50 MiB 429.05 MiB 4.64x 13.36 GiB/s 12.49 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.01 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 973bd9c9ac85
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runner startup

Execution setup measures any pre-benchmark package materialization used by the execution benchmark. Bunx temp cache measures one bunx -p <url> ccusage --version run with an empty Bun install cache. Warm reuses that cache and reports the median of repeated runs.

Package SHA Execution setup Bunx temp cache Bunx warm median Warm samples
Base pkg.pr.new 5f962cd49e24 1.704s 889.5ms 20.9ms 3
PR pkg.pr.new 973bd9c 1.175s 1.995s 20.7ms 3

Cached bunx execution performance

Runs the same large fixture through bunx -p <pkg.pr.new URL> ccusage after the Bun install cache has already been populated by the startup measurement. This separates cached package-runner execution from first-fetch package materialization.

Fixtures: Claude /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base package: 5f962cd49e24; PR package: 973bd9c. Both run through bunx -p <pkg.pr.new URL> ccusage using the warmed Bun install cache from package runner startup, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
bunx -p <pkg> ccusage claude --offline --json 1.01 GiB 257.4ms 236.8ms 1.09x 722.75 MiB 736.00 MiB 1.02x 3.91 GiB/s 4.25 GiB/s
bunx -p <pkg> ccusage codex --offline --json 1.01 GiB 98.5ms 98.4ms 1.00x 92.25 MiB 90.00 MiB 0.98x 10.22 GiB/s 10.23 GiB/s

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 235.2ms 4.28 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 230.5ms 4.37 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 89.1ms 11.30 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 91.7ms 10.98 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 20.2ms 21.3ms 0.95x 43.00 MiB 43.00 MiB 1.00x 0.08 MiB/s 0.07 MiB/s
claude session --offline --json 0.00 MiB 18.8ms 19.8ms 0.95x 43.00 MiB 42.75 MiB 0.99x 0.08 MiB/s 0.08 MiB/s
codex daily --offline --json 0.00 MiB 19.6ms 17.5ms 1.13x 43.00 MiB 43.25 MiB 1.01x 0.04 MiB/s 0.05 MiB/s
codex session --offline --json 0.00 MiB 17.6ms 17.7ms 1.00x 43.00 MiB 43.00 MiB 1.00x 0.05 MiB/s 0.05 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 245.2ms 229.0ms 1.07x 735.00 MiB 748.25 MiB 1.02x 4.11 GiB/s 4.40 GiB/s
codex --offline --json 1.01 GiB 99.2ms 97.4ms 1.02x 92.75 MiB 93.50 MiB 1.01x 10.15 GiB/s 10.34 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.01 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

Replace the remaining Action-facing JavaScript helper scripts with Nushell shebang scripts so CI can invoke them without a workspace JS install. Keep E2E coverage by generating the preview fixture from Nushell and keep package URL materialization in compare-pr-performance on Bun because pkg.pr.new install is the remaining Bun-specific path.

Remove the unused mitata bench script, drop @types/bun and the repo-local Bun API skill, and keep Bun out of the dev shell and GitHub Actions profile installs. Package execution benchmarks now run the built JS launcher with Node while package installation still runs Bun from the script shebang-provided Nix shell.
@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 2a3b1e5f2d14
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 269.2ms 3.74 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 229.5ms 4.39 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 109.1ms 9.23 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 86.8ms 11.60 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 25.2ms 3.6ms 7.10x 53.50 MiB 10.21 MiB 0.19x 0.06 MiB/s 0.43 MiB/s
claude session --offline --json 0.00 MiB 22.5ms 2.9ms 7.71x 53.75 MiB 10.21 MiB 0.19x 0.07 MiB/s 0.53 MiB/s
codex daily --offline --json 0.00 MiB 23.0ms 2.0ms 11.26x 53.50 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.42 MiB/s
codex session --offline --json 0.00 MiB 22.8ms 2.2ms 10.59x 53.50 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.40 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 270.4ms 220.5ms 1.23x 940.34 MiB 970.34 MiB 1.03x 3.72 GiB/s 4.57 GiB/s
codex --offline --json 1.01 GiB 100.6ms 81.7ms 1.23x 425.30 MiB 411.04 MiB 0.97x 10.01 GiB/s 12.32 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.01 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 2a3b1e5f2d14
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 239.4ms 4.21 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 211.8ms 4.75 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 105.6ms 9.54 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 81.8ms 12.31 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 25.3ms 24.6ms 1.03x 53.50 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
claude session --offline --json 0.00 MiB 24.7ms 23.8ms 1.04x 53.50 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
codex daily --offline --json 0.00 MiB 23.5ms 23.6ms 1.00x 53.50 MiB 53.75 MiB 1.00x 0.04 MiB/s 0.04 MiB/s
codex session --offline --json 0.00 MiB 22.9ms 22.4ms 1.02x 53.50 MiB 53.50 MiB 1.00x 0.04 MiB/s 0.04 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 269.6ms 252.0ms 1.07x 936.34 MiB 950.33 MiB 1.01x 3.73 GiB/s 4.00 GiB/s
codex --offline --json 1.01 GiB 102.9ms 103.0ms 1.00x 421.29 MiB 439.04 MiB 1.04x 9.79 GiB/s 9.78 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.33 KiB +0.01 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

Move the remaining TypeScript package tests to Node built-in test runner so Vitest and its transitive dependency tree can leave the workspace.

Use oxlint type-aware type checking as the root typecheck entry point and remove tsgo from the dev shell. Keep hermetic Nix formatter/check paths on a lightweight oxlint config because pure Nix checks do not include npm dependencies.

Refresh repo-local skills and agent guidance for Node tests and Nushell scripts.
@ryoppippi

Copy link
Copy Markdown
Member Author

@coderabbitai review
@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review
@cubic-dev-ai review

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

@ryoppippi I’ll review the latest changes in this PR.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

origin/main added models-dev compact tests while this branch removed Vitest. Convert those tests to node:test assertions so the PR merge commit passes oxlint type-aware checking.
@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: b6e9fa9f2d5b
Base SHA: 5f962cd49e24

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 249.4ms 4.04 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 213.7ms 4.71 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 100.9ms 9.98 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 79.3ms 12.69 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 24.1ms 3.1ms 7.84x 53.75 MiB 10.20 MiB 0.19x 0.06 MiB/s 0.50 MiB/s
claude session --offline --json 0.00 MiB 22.3ms 2.4ms 9.38x 53.50 MiB 10.20 MiB 0.19x 0.07 MiB/s 0.65 MiB/s
codex daily --offline --json 0.00 MiB 23.3ms 2.1ms 11.18x 53.50 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.41 MiB/s
codex session --offline --json 0.00 MiB 23.0ms 2.0ms 11.39x 53.75 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.42 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 269.1ms 216.7ms 1.24x 978.35 MiB 934.34 MiB 0.96x 3.74 GiB/s 4.65 GiB/s
codex --offline --json 1.01 GiB 101.2ms 83.0ms 1.22x 421.30 MiB 417.04 MiB 0.99x 9.95 GiB/s 12.12 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.36 KiB +0.04 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: b6e9fa9f2d5b
Base SHA: 5f962cd49e24

This compares the PR package against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 243.5ms 4.13 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 234.0ms 4.30 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 124.0ms 8.12 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 85.1ms 11.84 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 25.4ms 24.4ms 1.04x 53.75 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
claude session --offline --json 0.00 MiB 24.1ms 24.2ms 1.00x 53.75 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
codex daily --offline --json 0.00 MiB 22.6ms 24.5ms 0.92x 53.50 MiB 53.75 MiB 1.00x 0.04 MiB/s 0.03 MiB/s
codex session --offline --json 0.00 MiB 23.7ms 22.5ms 1.05x 53.25 MiB 53.75 MiB 1.01x 0.04 MiB/s 0.04 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 263.0ms 244.2ms 1.08x 950.34 MiB 954.34 MiB 1.00x 3.83 GiB/s 4.12 GiB/s
codex --offline --json 1.01 GiB 106.5ms 108.2ms 0.98x 415.30 MiB 433.04 MiB 1.04x 9.45 GiB/s 9.31 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.32 KiB 17.36 KiB +0.04 KiB 1.00x
installed native package binary 3968.69 KiB 3837.94 KiB -130.75 KiB 1.03x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@pullfrog

pullfrog Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

no API key found — this repo is configured to use deepseek/deepseek-v4-pro, which needs DEEPSEEK_API_KEY, but the runner has no key for it.

To fix: add the key as a GitHub Actions secret (referenced from your workflow's env: block) or as a Pullfrog secret in the console — or switch this repo to a different model (free models need no key).

Open repo secrets → · Configure model → · Setup docs → · Ask in Discord →

Pullfrog  | Rerun failed job ➔View workflow run | via Pullfrog | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
nix/git-hooks.nix (1)

86-90: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Align oxlint invocation with the repo-wide pinned config.

Line 89 runs oxlint . without --config nix/oxlint-check.json, while nix/checks.nix Line 124 and nix/treefmt.nix Lines 131-135 now pin that config. This can create contradictory local pre-push vs flake/treefmt lint outcomes.

Suggested fix
-              entry = "${lib.getExe pkgs.oxlint} .";
+              entry = "${lib.getExe pkgs.oxlint} --config nix/oxlint-check.json .";
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@nix/git-hooks.nix` around lines 86 - 90, The oxlint hook definition
ccusage-oxlint-check invokes oxlint via the entry attribute but omits the pinned
config; update the entry for ccusage-oxlint-check (the entry value currently
referencing lib.getExe pkgs.oxlint) to include the same --config
nix/oxlint-check.json flag so the hook runs oxlint with the repo-wide pinned
config (i.e., change the invocation string produced by entry to call oxlint
--config nix/oxlint-check.json .).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@nix/git-hooks.nix`:
- Around line 86-90: The oxlint hook definition ccusage-oxlint-check invokes
oxlint via the entry attribute but omits the pinned config; update the entry for
ccusage-oxlint-check (the entry value currently referencing lib.getExe
pkgs.oxlint) to include the same --config nix/oxlint-check.json flag so the hook
runs oxlint with the repo-wide pinned config (i.e., change the invocation string
produced by entry to call oxlint --config nix/oxlint-check.json .).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 95464765-881e-4e09-b51e-c59e7e14bb92

📥 Commits

Reviewing files that changed from the base of the PR and between bbe813b and b6e9fa9.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (65)
  • .agents/skills/bun-api-reference/SKILL.md
  • .agents/skills/commit/references/revertable-commits.md
  • .agents/skills/development/references/environment-and-validation.md
  • .agents/skills/nushell/SKILL.md
  • .agents/skills/profile/SKILL.md
  • .agents/skills/profile/references/rust.md
  • .agents/skills/profile/references/typescript.md
  • .agents/skills/tdd/SKILL.md
  • .agents/skills/tdd/references/node-test.md
  • .agents/skills/tdd/references/vitest-examples.md
  • .agents/skills/tdd/references/vitest.md
  • .agents/skills/testing/SKILL.md
  • .agents/skills/testing/references/node-test.md
  • .agents/skills/testing/references/vitest.md
  • .agents/skills/typescript/SKILL.md
  • .claude/settings.json
  • .github/actions/build-linux-native-package/action.yaml
  • .github/actions/build-macos-nix-native-package/action.yaml
  • .github/actions/build-windows-native-package/action.yaml
  • .github/scripts/generate-e2e-fixture.mjs
  • .github/scripts/generate-e2e-fixture.nu
  • .github/scripts/upsert-pr-comment.nu
  • .github/workflows/ci.yaml
  • .github/workflows/release.yaml
  • .oxlintrc.json
  • AGENTS.md
  • apps/ccusage/AGENTS.md
  • apps/ccusage/eslint.config.js
  • apps/ccusage/justfile
  • apps/ccusage/package.json
  • apps/ccusage/scripts/bench.mjs
  • apps/ccusage/scripts/compare-pr-performance.nu
  • apps/ccusage/scripts/compare-pr-performance.ts
  • apps/ccusage/scripts/ensure-native-binary.nu
  • apps/ccusage/scripts/generate-large-fixture.nu
  • apps/ccusage/scripts/generate-large-fixture.ts
  • apps/ccusage/scripts/stage-native-package.mjs
  • apps/ccusage/scripts/stage-native-package.nu
  • apps/ccusage/scripts/verify-native-package.mjs
  • apps/ccusage/scripts/verify-native-package.nu
  • apps/ccusage/src/cli.test.ts
  • apps/ccusage/src/cli.ts
  • apps/ccusage/tsconfig.json
  • apps/ccusage/tsdown.config.ts
  • apps/ccusage/vitest.config.ts
  • docs/justfile
  • docs/package.json
  • docs/tsconfig.json
  • justfile
  • nix/checks.nix
  • nix/dev-shell.nix
  • nix/git-hooks.nix
  • nix/models-dev-compact.test.ts
  • nix/oxlint-check.json
  • nix/treefmt.nix
  • package.json
  • packages/ccusage-darwin-arm64/package.json
  • packages/ccusage-darwin-x64/package.json
  • packages/ccusage-linux-arm64/package.json
  • packages/ccusage-linux-x64/package.json
  • packages/ccusage-win32-arm64/package.json
  • packages/ccusage-win32-x64/package.json
  • pnpm-workspace.yaml
  • tsconfig.json
  • vitest.config.ts
💤 Files with no reviewable changes (14)
  • apps/ccusage/vitest.config.ts
  • .agents/skills/tdd/references/vitest.md
  • .github/scripts/generate-e2e-fixture.mjs
  • apps/ccusage/scripts/verify-native-package.mjs
  • .agents/skills/bun-api-reference/SKILL.md
  • .agents/skills/testing/references/vitest.md
  • vitest.config.ts
  • apps/ccusage/scripts/generate-large-fixture.ts
  • apps/ccusage/scripts/bench.mjs
  • .agents/skills/tdd/references/vitest-examples.md
  • apps/ccusage/scripts/stage-native-package.mjs
  • pnpm-workspace.yaml
  • apps/ccusage/tsdown.config.ts
  • apps/ccusage/scripts/compare-pr-performance.ts
✅ Files skipped from review due to trivial changes (15)
  • .agents/skills/development/references/environment-and-validation.md
  • packages/ccusage-darwin-x64/package.json
  • packages/ccusage-linux-x64/package.json
  • nix/oxlint-check.json
  • packages/ccusage-linux-arm64/package.json
  • .agents/skills/testing/references/node-test.md
  • docs/tsconfig.json
  • .agents/skills/profile/SKILL.md
  • nix/dev-shell.nix
  • .agents/skills/profile/references/rust.md
  • AGENTS.md
  • .agents/skills/tdd/references/node-test.md
  • .agents/skills/tdd/SKILL.md
  • .agents/skills/typescript/SKILL.md
  • .agents/skills/commit/references/revertable-commits.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • .github/scripts/upsert-pr-comment.nu
  • .github/workflows/release.yaml
  • apps/ccusage/scripts/ensure-native-binary.nu

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: f17dd89193f6
Base SHA: 7a550caae5cc

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 239.8ms 4.20 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 212.7ms 4.73 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 103.7ms 9.71 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 81.2ms 12.39 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 25.6ms 4.2ms 6.07x 53.75 MiB 10.20 MiB 0.19x 0.06 MiB/s 0.37 MiB/s
claude session --offline --json 0.00 MiB 27.0ms 3.0ms 8.87x 53.50 MiB 10.20 MiB 0.19x 0.06 MiB/s 0.51 MiB/s
codex daily --offline --json 0.00 MiB 23.2ms 2.2ms 10.33x 53.75 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.38 MiB/s
codex session --offline --json 0.00 MiB 24.2ms 2.2ms 11.06x 53.75 MiB 8.19 MiB 0.15x 0.04 MiB/s 0.39 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 256.4ms 224.2ms 1.14x 950.33 MiB 930.33 MiB 0.98x 3.93 GiB/s 4.49 GiB/s
codex --offline --json 1.01 GiB 103.2ms 82.8ms 1.25x 425.04 MiB 411.04 MiB 0.97x 9.76 GiB/s 12.16 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.33 KiB 17.36 KiB +0.03 KiB 1.00x
installed native package binary 3837.94 KiB 3837.94 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: f17dd89193f6
Base SHA: 7a550caae5cc

This compares the PR package against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 246.9ms 4.08 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 207.1ms 4.86 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 102.2ms 9.85 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 82.2ms 12.25 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 24.3ms 24.9ms 0.97x 53.75 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
claude session --offline --json 0.00 MiB 24.9ms 23.9ms 1.04x 53.50 MiB 53.50 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
codex daily --offline --json 0.00 MiB 22.5ms 24.9ms 0.90x 54.00 MiB 53.50 MiB 0.99x 0.04 MiB/s 0.03 MiB/s
codex session --offline --json 0.00 MiB 22.3ms 21.6ms 1.03x 53.50 MiB 53.50 MiB 1.00x 0.04 MiB/s 0.04 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 272.7ms 246.6ms 1.11x 960.34 MiB 952.34 MiB 0.99x 3.69 GiB/s 4.08 GiB/s
codex --offline --json 1.01 GiB 98.2ms 107.1ms 0.92x 409.03 MiB 405.04 MiB 0.99x 10.25 GiB/s 9.40 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.33 KiB 17.36 KiB +0.03 KiB 1.00x
installed native package binary 3837.94 KiB 3837.94 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

Node test migration replaced the Vitest guard with a direct argv entry comparison. npm and npx execute package bins through node_modules/.bin symlinks, so the wrapper skipped runCli and produced empty output in E2E JSON checks.

Compare real paths for the module URL and argv entry, and cover the symlink case in the launcher tests.
@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 107ca578e624
Base SHA: 7a550caae5cc

This compares the PR package against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 244.0ms 4.13 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 222.4ms 4.53 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 108.1ms 9.31 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 82.4ms 12.22 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 27.1ms 24.7ms 1.09x 53.50 MiB 53.75 MiB 1.00x 0.06 MiB/s 0.06 MiB/s
claude session --offline --json 0.00 MiB 25.4ms 23.5ms 1.08x 53.75 MiB 53.75 MiB 1.00x 0.06 MiB/s 0.07 MiB/s
codex daily --offline --json 0.00 MiB 22.2ms 23.5ms 0.94x 53.50 MiB 53.50 MiB 1.00x 0.04 MiB/s 0.04 MiB/s
codex session --offline --json 0.00 MiB 22.6ms 23.2ms 0.98x 54.00 MiB 53.75 MiB 1.00x 0.04 MiB/s 0.04 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published ccusage package from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 266.8ms 256.4ms 1.04x 938.34 MiB 942.33 MiB 1.00x 3.77 GiB/s 3.93 GiB/s
codex --offline --json 1.01 GiB 103.9ms 107.6ms 0.97x 421.04 MiB 409.04 MiB 0.97x 9.69 GiB/s 9.35 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.33 KiB 17.43 KiB +0.10 KiB 0.99x
installed native package binary 3837.94 KiB 3837.94 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@github-actions

Copy link
Copy Markdown
Contributor

ccusage performance comparison

PR SHA: 107ca578e624
Base SHA: 7a550caae5cc

This compares the Rust PR release binary against the configured base package on the same CI runner.

Package runtime diagnostics

Compares 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
All rows run --offline --json, measured by hyperfine with 0 warmups and 1 runs. This isolates wrapper overhead from the installed native optional dependency and the workspace release binary built on the runner.

Command Runtime Input Median Throughput Samples
claude --offline --json Package wrapper 1.01 GiB 225.9ms 4.46 GiB/s 1
claude --offline --json Installed native binary 1.01 GiB 194.6ms 5.17 GiB/s 1
codex --offline --json Package wrapper 1.01 GiB 106.3ms 9.47 GiB/s 1
codex --offline --json Installed native binary 1.01 GiB 91.0ms 11.06 GiB/s 1

Committed fixture performance

Committed small fixtures for stable PR-to-PR feedback and explicit Claude/Codex command coverage.

Fixtures: Claude apps/ccusage/test/fixtures/claude (0.00 MiB, 2 files), Codex apps/ccusage/test/fixtures/codex (0.00 MiB, 1 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 2 warmups and 7 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude daily --offline --json 0.00 MiB 29.3ms 5.5ms 5.29x 53.75 MiB 10.20 MiB 0.19x 0.05 MiB/s 0.28 MiB/s
claude session --offline --json 0.00 MiB 29.1ms 3.8ms 7.73x 53.75 MiB 10.20 MiB 0.19x 0.05 MiB/s 0.41 MiB/s
codex daily --offline --json 0.00 MiB 24.6ms 2.5ms 9.94x 53.75 MiB 8.19 MiB 0.15x 0.03 MiB/s 0.35 MiB/s
codex session --offline --json 0.00 MiB 27.6ms 3.1ms 8.96x 54.00 MiB 8.19 MiB 0.15x 0.03 MiB/s 0.28 MiB/s

Large real-world-shaped fixture performance

Generated 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 /home/runner/_work/_temp/ccusage-large-fixture (1.01 GiB, 2597 files), Codex /home/runner/_work/_temp/ccusage-large-codex-fixture (1.01 GiB, 2597 files)
Base runs the published ccusage package from pkg.pr.new, installed before measurement; PR runs the published native ccusage binary from pkg.pr.new, installed before measurement. Both run --offline --json, measured by hyperfine with 0 warmups and 1 runs.
Peak RSS is measured separately with /usr/bin/time using 1 runs. Lower RSS ratios are better.

Command Input Base median PR median PR vs base Base peak RSS PR peak RSS PR/base RSS Base throughput PR throughput
claude --offline --json 1.01 GiB 270.4ms 223.2ms 1.21x 940.33 MiB 898.32 MiB 0.96x 3.72 GiB/s 4.51 GiB/s
codex --offline --json 1.01 GiB 109.9ms 89.8ms 1.22x 421.04 MiB 413.04 MiB 0.98x 9.16 GiB/s 11.21 GiB/s

Artifact size

Artifact Base PR Delta Ratio
packed ccusage-*.tgz 17.33 KiB 17.43 KiB +0.10 KiB 0.99x
installed native package binary 3837.94 KiB 3837.94 KiB +0.00 KiB 1.00x

Lower medians and smaller artifacts are better. CI runner noise still applies; use same-run ratios as directional PR feedback, not release guarantees.

@ryoppippi

Copy link
Copy Markdown
Member Author

@coderabbitai review
@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai review
@cubic-dev-ai review

@ryoppippi I have started the AI code review. It will take a few minutes to complete.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0 issues found across 2 files (changes from recent commits).

You've manually re-run cubic several times on this PR. Each manual re-review checks the full PR again and counts toward your usage quota. To preserve your usage limits, we recommend letting cubic automatically review new commits.

Re-trigger cubic

@ryoppippi ryoppippi changed the title build(ccusage): run native binary check with nushell build: migrate package tooling to nushell and node test Jun 13, 2026
@ryoppippi ryoppippi merged commit ed48f25 into main Jun 13, 2026
33 checks passed
@ryoppippi ryoppippi deleted the codex/nushell-ensure-native-binary branch June 13, 2026 11:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant