Skip to content

Benchmarks ​

The benchmark suite measures cold CLI startup, full-catalog size, and representative operation response size as an agent sees them.

Run the suite ​

bash
npm run bench

Use fixture mode for deterministic CI output.

bash
BENCH_FIXTURES_ONLY=1 npm run bench

Each root CLI measurement starts a new process. Adapter fixture timing covers in-process parsing and formatting. Live mode adds the subprocess and network path used by the command.

Latest generated results ​

Generated 2026-10-10 on Node v26.11.1 / darwin-arm64. Mode fixture (50 iterations per case). Reproduce with npm run bench (local live mode) or BENCH_FIXTURES_ONLY=1 npm run bench (CI-deterministic fixture mode).

Cold-process CLI startup ​

command boundarywall p50wall p95evidence class
unicli --version29 ms31 msnew subprocess, constant metadata path
unicli --help28 ms31 msnew subprocess, concise root help
unicli list -f json231 ms244 msnew subprocess, manifest fast path

Full catalog response size ​

metricvalue
response tokens136947
response chars493006
distinct site labels in list output349
command rows in list output2011

Adapter call p50 and p95 response tokens ​

categorycommandinvocation tokensresponse p50 tokensresponse p95 tokenswall p50 mswall p95 msmode
newsunicli hackernews top --limit 594044040.0030.006fixture
socialunicli reddit hot --limit 584154150.0040.006fixture
social-cnunicli 36kr hot --limit 573573570.0030.003fixture
devunicli github-trending daily --limit 5114004000.0040.004fixture

Public call budget ​

metricvalue
Smallest total call budget364 tokens
Largest total call budget423 tokens
Median total call budget412 tokens
Representative response token span357-415 tokens

Reading the results ​

  • unicli --help and unicli --version measure the smallest process startup paths.
  • unicli list -f json measures catalog loading and serialization.
  • Adapter cases use --limit 5, which reflects a common agent retrieval call.
  • Full catalog output is available on request; search and describe provide the smaller everyday path.

The public response target for common list operations is 600 total tokens or less at --limit 5. Commands with larger results should expose a limit, pagination, or compact output.

Local ranking against strong baselines ​

Measured on 2026-10-10 with Node 26.11.1 on an Apple M4 Pro. Every method receives the same 2,014 built-in and core command documents, including 2,011 discoverable documents. Host inventory and user overlays are disabled for all methods. The frozen comparison uses the complete a3ccd598 source tree.

bash
npm run build
BENCH_RUNS=5 BENCH_COLD_RUNS=9 npm run bench:search

The historical set contains 617 positive and 26 negative queries. A separate 32-query set covers academic providers, model lookup, topical boundaries, and explicit sources, with four additional no-match queries. The 32 cases were used to diagnose and repair ranking failures and remain a diagnostic set. Their post-fix score measures those cases; an unseen-test estimate requires a separate holdout.

MethodHistorical Top-1Top-3Top-5MRR@5Diagnostic Top-1Resident p50 msResident p95 ms
Frozen Uni-CLI a3ccd598482/617556/617577/6170.844420/320.0570.228
Current Uni-CLI482/617556/617577/6170.844426/320.0520.191
BM25443/617533/617560/6170.791319/320.0200.083
TF-IDF cosine454/617544/617566/6170.812916/320.0180.080
MiniSearch 7.2.0 BM25+429/617512/617553/6170.767815/320.0430.172
MiniSearch BM25+ fuzzy 0.2409/617521/617559/6170.758113/320.1530.456

Resident samples interleave all methods over 3,395 queries per method. The full routers include query analysis, intent routing, scoring, top-five selection, and result shaping. Lexical baselines use the same frozen bilingual tokenization and alias expansion. BM25 uses k1=1.2, b=0.75; MiniSearch uses its shipped BM25+ defaults with exact matching and the documented fuzzy preset. Parameters remain fixed throughout the comparison.

The current router preserves the historical results and resolves six source-versus-topic failures in the diagnostic set. Six diagnostic cases miss rank one, including one outside the top five. Raw misses and negative-query scores remain in bench/search-baselines.results.json. Score scales are method-specific. Pure lexical retrieval spends less time per query; the full router achieves higher Top-1 accuracy on these sets.

Separate cold boundary ​

Nine fresh processes per full router include ESM import, index construction, and the first query. Baseline and current median process times are 83.823 ms and 82.790 ms. Median ready times are 50.160 ms and 48.659 ms. These samples exclude CLI argument parsing and host inventory. The cold CLI measurements above retain their own boundary. The report's single in-process build sample is descriptive; repeated cold samples provide the build comparison.

Resident evidence-relevance scoring ​

npm run bench:relevance compares the evidence scorer with the fixed 9634121c source. On Apple M4 Pro, darwin-arm64, and Node 26.11.1, nine alternating rounds measured batches of 10,000 scoreRetrievalAlternatives calls. The median batch took 31.5234 ms for the baseline and 18.4456 ms for the current scorer, a 1.709× ratio.

bash
npm run bench:relevance

The fixed workload combines 20 queries with 500 constructed records, including multilingual text, punctuation, alternatives, empty input, and overlapping terms. Complete-result comparisons cover both values of requireAllTerms. All 20,000 comparisons matched. Each implementation receives one warm-up batch before the alternating measurements.

The measured call includes field normalization, term matching, scoring, and alternative selection. Query analyses are prepared once. Process startup, module loading, network requests, and file I/O are outside this timing boundary. These results establish the scorer's behavior and cost on the fixed workload; end-to-end source retrieval has separate network and acquisition costs. Raw samples and environment details are in bench/retrieval-relevance.results.json.

Live representation and provider measurements ​

Measured on 2026-10-10 using npm run bench:internet. Byte counts refer to decoded UTF-8 bodies. Network compression, connection setup, origin caches, and remote load retain their own effects.

Source and requestBaseline body bytesNative body bytesReductionSamples
Cloudflare Markdown-for-agents documentation175,685 HTML16,408 Markdown90.66%Three per representation, interleaved
OpenRouter gpt-5 model lookup, limit two765,940 full catalog3,349 native query99.56%One per request path

Cloudflare total HTTP-plus-conversion medians were 219.557 ms for HTML and 193.453 ms for native Markdown. The first HTML request-and-conversion sample took 6,768.108 ms. The raw report keeps that sample. Native Markdown carries source metadata and content formatting that differ from local HTML extraction.

OpenRouter returned 458 catalog records and two native-query records. Both paths selected the same two model IDs in this run. The recorded request times were 7,111.872 ms and 165.383 ms. One sample per path supports this payload observation. A general network speedup needs repeated, controlled measurements.

The Internet access guide describes the implemented route, cache, and recovery contracts. These measurements cover local discovery and selected HTTP endpoints. Hosted Exa and Context7 retrieval quality remains unmeasured by this suite.

Current product surface comparison ​

The comparison keeps each product inside its declared boundary. Catalog totals measure breadth. The Uni-CLI task suite measures whether a user can find and prepare an operation from the shipped command line.

ProductSource revisionDeclared surfaceCurrent scale
Uni-CLIworking tree on 2026-10-10web, browser, desktop, system, and local tools338 sites and 1893 commands
OpenCLI77af6bcwebsite and browser adapter runtime169 sites and 1215 commands
CLI-Anything34f5195stateful harnesses and capability matrices79 harnesses, 24 public entries, 5 matrices, and 62 matrix capabilities

The shared personal-content classifier omits generic identity commands such as whoami. The table reports current counts with the same classifier. Coverage comparisons are observations; the maintenance gate checks executable tasks and catalog consistency.

Personal content surfaceUni-CLIOpenCLI
commands8081
sites3847

Shipped discovery tasks ​

Uni-CLI completed 14/14 tasks at rank one. 14/14 top results included an invocation, inspection command, and required authentication setup. Personalized tasks completed 5/5.

TaskExpectedTop resultActionable
news-tophackernews tophackernews topyes
developer-trendinggithub-trending dailygithub-trending dailyyes
developer-code-searchgh search-codegh search-codeyes
media-playbackspotify play-trackspotify play-trackyes
auth-setupauth setupauth setupyes
cli-upgradeupgrade installupgrade installyes
harness-evolutionevolve adapterevolve adapteryes
evolution-evidenceruns distillruns distillyes
agent-plugin-inspectionplugin inspectplugin inspectyes
xiaohongshu-savedxiaohongshu savedxiaohongshu savedyes
instagram-savedinstagram savedinstagram savedyes
zhihu-recommendationszhihu recommendzhihu recommendyes
twitter-notificationstwitter notificationstwitter notificationsyes
bilibili-historybilibili historybilibili historyyes

Maintenance gates ​

  • Root discovery entry coverage 6/6
  • Generated catalog synchronization pass
  • OpenCLI pinned baseline integrity pass
  • Personal content command parity below the comparison baseline
  • Product surface gate pass

Reproduce this section with npm run bench:product-surface.

Files ​

FilePurpose
bench/cold-start.tsRoot command process timing
bench/adapter-call.tsRepresentative operation measurements
bench/tokens.tsToken estimator
bench/report.tsReport generation
bench/product-surface.tsDiscovery, personalization, and current product comparison
bench/fixtures/Deterministic response fixtures

The report command writes bench/results.json and updates the generated section on this page.

Released under the Apache-2.0 License