diff --git a/README.md b/README.md
index 4c184ae0..b9d157bc 100644
--- a/README.md
+++ b/README.md
@@ -1,165 +1,168 @@
-# LPM — The Package Manager for Modern Software
+
+
+
+
+
-Fast, secure, all-in-one. Written in Rust.
+LPM
-```bash
-npm install -g @lpm-registry/cli
-```
+
-The npm package is a dependency-free launcher for the native Rust binary. npm
-installs the matching platform package automatically through
-`optionalDependencies`; `lpm self-update` keeps using the same npm channel.
+## What is LPM?
-
-Other install methods
+LPM is a fast, secure package manager and developer platform for modern JavaScript and TypeScript projects. It ships as a single Rust binary called `lpm`, works with the npm ecosystem, and adds secure-by-default installs, built-in developer tooling, hosted registry features, and an npm package firewall.
```bash
-brew tap lpm-dev/lpm && brew install lpm # Homebrew
-curl -fsSL https://cli.lpm.dev/install | sh # Standalone
-cargo install --git https://github.com/lpm-dev/rust-client lpm-cli # Source
+lpm install
+lpm add lpm-source-package
+lpm run dev
```
-Standalone installs and self-updates verify release download integrity before
-swapping the binary.
+LPM has three connected parts:
-
+- **LPM CLI** - an npm-compatible package manager and dev toolkit written in Rust. It installs from npm, lpm.dev, JSR, and private registries; blocks dependency lifecycle scripts by default; and includes a task runner, dev server, test/bench runner, linter, formatter, Node version pinning, local HTTPS, tunnels, secrets, and project health checks.
+- **LPM.dev Registry** - the hosted registry and platform behind the `@lpm.dev/*` scope. Use it for private packages, Pool distribution, Marketplace sales, Swift packages, package quality analysis, generated metadata, access control, and Pro/team platform features.
+- **LPM Firewall** - a hosted verdict service for public npm package versions. It can run in monitor mode or enforcement mode before LPM materializes package bytes, helping teams catch malicious packages, critical vulnerabilities, suspicious lifecycle behavior, and policy violations during install.
+
+## Install
-## Commands
+LPM supports macOS, Linux, and Windows x64 through npm. Homebrew and the standalone installer support macOS and Linux.
```bash
-# Package management
-lpm install # Install deps (aliases: i)
-lpm add # Source delivery (any registry: lpm.dev, npm, .npmrc-private)
-lpm remove # Remove added package (aliases: rm)
-lpm uninstall # Remove from deps (aliases: un, unlink)
-lpm publish # Publish to lpm.dev (aliases: p)
-lpm upgrade # Upgrade deps to latest
-lpm outdated # Check for newer versions
-lpm audit # Security + quality audit (OSV.dev)
-lpm search # Search packages
-lpm info # Package details
-lpm quality # Quality report
-lpm query # CSS-like selector queries on installed packages
-lpm rebuild # Run dependency lifecycle scripts (phase 2 of install)
-lpm approve-scripts # Approve packages blocked by default-deny script policy
-lpm trust # Manage `trustedDependencies` in package.json
-lpm patch # Generate a local patch, `patch-package` style
-lpm patch-commit # Finalize a patch staging directory
-lpm migrate # Migrate from npm/yarn/pnpm/bun
-
-# Scripts & execution
-lpm run # Run scripts (parallel: -p, cached, watch)
-lpm dev # Zero-config dev server + HTTPS + tunnel
-lpm # Run JS/TS files directly
-lpm exec # Run project-local binaries from node_modules/.bin
-lpm # Shorthand local bin when no built-in/file/script matches
-lpm dlx # Run without installing
-lpm test # Auto-detect test runner
-lpm bench # Auto-detect benchmark runner
-
-# Built-in tools (lazy-downloaded)
-lpm lint # Oxlint
-lpm fmt # Biome
-lpm check # TypeScript (tsc --noEmit)
-lpm plugin list # Show installed tools
-lpm plugin update # Update tools
-
-# Runtime & environment
-lpm use node@22 # Install + pin Node.js version
-lpm env # Project env vars / secrets (set, get, push, pull, …)
-lpm vault # Secrets manager (Keychain-backed)
-lpm global # Manage globally-installed CLIs (~/.lpm/global/)
-
-# Dev infrastructure
-lpm tunnel # Expose localhost to the internet
-lpm tunnel claim # Claim a stable domain
-lpm tunnel inspect # View captured webhooks
-lpm tunnel replay # Replay a webhook
-lpm cert status # Local HTTPS certificate info
-lpm cert trust # Install CA to trust store
-lpm graph # Dependency graph (--format tree|dot|mermaid|json|stats|html)
-lpm ports # Dev service port management
-
-# Workspaces & deployment
-lpm filter # Preview the workspace set a `--filter` expression selects
-lpm deploy --filter # Materialize a member's deploy closure for `COPY --from=pruned`
-
-# Project health
-lpm doctor # Health check (--fix to auto-repair)
-lpm health # Check registry health
-lpm store verify # Verify package store integrity
-lpm store gc # Clean unused packages
-lpm cache # Manage ephemeral caches (metadata, tasks, dlx)
-lpm self-update # Update LPM to the latest version
-
-# Debug & inspection
-lpm download # Download and extract a tarball (no install side-effects)
-lpm resolve # Print the resolved dependency tree without installing
-
-# Auth & config
-lpm login # Authenticate (aliases: l)
-lpm logout # Clear token (aliases: lo)
-lpm whoami # Current user
-lpm token-rotate # Rotate your auth token
-lpm setup ci npmrc # Generate .npmrc for CI/CD
-lpm setup ci github-actions # Print a GitHub Actions OIDC snippet
-lpm setup local # Read-only `.npmrc` token for local development
-lpm ci # Frozen lockfile install for CI
-lpm init # Create a new package
-lpm config # CLI configuration
-lpm pool # Pool revenue stats
-lpm skills # AI agent skills (install, list, …)
-lpm swift-registry # Configure SPM integration (SE-0292)
-lpm mcp setup # Configure MCP server for AI editors
+# npm
+npm install -g @lpm-registry/cli --allow-scripts=@lpm-registry/cli
+
+# Homebrew
+brew tap lpm-dev/lpm && brew install lpm
+
+# Standalone
+curl -fsSL https://cli.lpm.dev/install | sh
```
-## How `lpm dev` Works
+The npm package is a dependency-free launcher for the native Rust binary. npm installs the matching platform package through `optionalDependencies`; the approved `postinstall` verifier checks the native binary and wires the global command where the platform allows it.
-One command. Zero config. Everything auto-detected.
+If your npm version or policy does not require explicit script approval, this also works:
```bash
-$ lpm dev
-
- ● Node 22.12.0 (from .nvmrc)
- ● Deps up to date (2ms)
- ● Env .env loaded
- ● HTTPS certificate valid
- ● Tunnel https://acme-api.lpm.llc
+npm install -g @lpm-registry/cli
+```
- [db] ✔ ready (0.8s)
- [web] ✔ ready (1.2s)
- [api] ✔ ready (3.4s)
+Update LPM with:
- ⌘ Opening https://localhost:3000
+```bash
+lpm self-update
```
-Auto-installs deps if stale. Copies `.env.example` if no `.env`. Starts multi-service orchestrator from `lpm.json`. Opens browser after readiness checks. Tunnel domain from config. HTTPS with local CA.
-
-Plus: dev tunnels, HTTPS certs, secrets vault, task caching, AI agent skills, Swift packages, dependency graph visualization — built in, not bolted on.
+## Quick Links
+
+- Get Started
+ - [Introduction](https://cli.lpm.dev/docs)
+ - [Installation](https://cli.lpm.dev/docs/installation)
+ - [Your first install](https://cli.lpm.dev/docs/first-install)
+ - [Registries](https://cli.lpm.dev/docs/registries)
+ - [Project setup](https://cli.lpm.dev/docs/project-setup)
+ - [Migrating](https://cli.lpm.dev/docs/migrating)
+ - [Comparison](https://cli.lpm.dev/docs/comparison)
+
+- Packages
+ - [`lpm install`](https://cli.lpm.dev/docs/packages/install)
+ - [`lpm add`](https://cli.lpm.dev/docs/packages/add)
+ - [`lpm publish`](https://cli.lpm.dev/docs/packages/publish)
+ - [`lpm audit`](https://cli.lpm.dev/docs/packages/audit)
+ - [`lpm trust`](https://cli.lpm.dev/docs/packages/trust)
+ - [`lpm approve-scripts`](https://cli.lpm.dev/docs/packages/approve-scripts)
+ - [Workspaces](https://cli.lpm.dev/docs/packages/workspaces)
+ - [Lockfile](https://cli.lpm.dev/docs/packages/lockfile)
+ - [Content-addressable store](https://cli.lpm.dev/docs/packages/content-addressable-store)
+ - [npm compatibility](https://cli.lpm.dev/docs/packages/npm-compatibility)
+
+- Dev
+ - [`lpm dev`](https://cli.lpm.dev/docs/dev/dev)
+ - [`lpm run`](https://cli.lpm.dev/docs/dev/run)
+ - [`lpm exec`](https://cli.lpm.dev/docs/dev/exec)
+ - [`lpm dlx`](https://cli.lpm.dev/docs/dev/dlx)
+ - [`lpm test`](https://cli.lpm.dev/docs/dev/test)
+ - [`lpm bench`](https://cli.lpm.dev/docs/dev/bench)
+ - [`lpm lint`](https://cli.lpm.dev/docs/dev/lint)
+ - [`lpm fmt`](https://cli.lpm.dev/docs/dev/fmt)
+ - [Node version pinning](https://cli.lpm.dev/docs/dev/node-version-pinning)
+ - [Environment variables](https://cli.lpm.dev/docs/dev/env)
+
+- Infra
+ - [`lpm tunnel`](https://cli.lpm.dev/docs/infra/tunnel)
+ - [`lpm cert`](https://cli.lpm.dev/docs/infra/cert)
+ - [`lpm config`](https://cli.lpm.dev/docs/infra/config)
+ - [`lpm doctor`](https://cli.lpm.dev/docs/infra/doctor)
+ - [`lpm store`](https://cli.lpm.dev/docs/infra/store)
+ - [`lpm self-update`](https://cli.lpm.dev/docs/infra/self-update)
+ - [Secrets vault](https://cli.lpm.dev/docs/infra/secrets-vault)
+ - [Port management](https://cli.lpm.dev/docs/infra/port-management)
+ - [Dependency graph](https://cli.lpm.dev/docs/infra/dependency-graph)
+
+- Guides
+ - [Publishing a package](https://cli.lpm.dev/docs/guides/publishing-a-package)
+ - [Firewall for npm](https://cli.lpm.dev/docs/guides/firewall)
+ - [Zero-config dev server](https://cli.lpm.dev/docs/guides/zero-config-dev-server)
+ - [Monorepo setup](https://cli.lpm.dev/docs/guides/monorepo-setup)
+ - [Managing secrets](https://cli.lpm.dev/docs/guides/managing-secrets)
+ - [CI/CD setup](https://cli.lpm.dev/docs/guides/ci-cd-setup)
+ - [Docker deploys](https://cli.lpm.dev/docs/guides/docker-deploys)
+ - [Migrating from npm](https://cli.lpm.dev/docs/guides/migrating-from-npm)
+ - [Migrating from pnpm](https://cli.lpm.dev/docs/guides/migrating-from-pnpm)
+ - [Migrating from yarn](https://cli.lpm.dev/docs/guides/migrating-from-yarn)
+ - [Migrating from Bun](https://cli.lpm.dev/docs/guides/migrating-from-bun)
+
+- Reference
+ - [`package.json` fields](https://cli.lpm.dev/docs/reference/package-json-lpm)
+ - [`lpm.json`](https://cli.lpm.dev/docs/reference/lpm-json)
+ - [`lpm.toml`](https://cli.lpm.dev/docs/reference/lpm-toml)
+ - [Configuration](https://cli.lpm.dev/docs/reference/config-toml)
+ - [Environment variables](https://cli.lpm.dev/docs/reference/env-vars)
+ - [Schemas](https://cli.lpm.dev/docs/reference/schemas)
+ - [Lockfile format](https://cli.lpm.dev/docs/reference/lockfile-format)
+ - [MCP servers](https://cli.lpm.dev/docs/reference/mcp-servers)
+ - [AI agent skills](https://cli.lpm.dev/docs/reference/ai-agent-skills)
+ - [Exit codes](https://cli.lpm.dev/docs/reference/exit-codes)
## Benchmarks
-| | npm | pnpm | bun | **lpm** |
-| ------------------------------- | ------: | ------: | ------: | --------------: |
-| Cold install, equal footing ¹ | 6,735ms | 1,124ms | 823ms | **957ms** |
-| Cold install, reset-each-iter ² | 7,146ms | 1,927ms | 1,207ms | **945ms** |
-| Warm install ³ | 648ms | 665ms | 263ms | **23ms** |
-| Up-to-date install ³ | 348ms | 152ms | 8ms | **6ms** |
-| Script overhead ⁴ | 67ms | 107ms | 6ms | **9ms** |
-| `lpm lint` vs `npx oxlint` ⁴ | 250ms | — | — | **78ms** (3.2×) |
-| `lpm fmt` vs `npx biome` ⁴ | 264ms | — | — | **13ms** (20×) |
-
-> **¹ Equal-footing cold install — `bench/fixture-large`** — Fresh cache and lockfile resets happen outside the timer, so this row measures install work instead of cleanup work. `lpm` and `bun` alternate per iteration to cancel out CDN warmth bias; `npm` and `pnpm` run sequentially because their install times are much larger.
->
-> **² Reset-each-iter cold install** — Same fixture as ¹, but every iteration starts cold again. `npm`, `pnpm`, and `bun` wipe inside the timer. `lpm` rotates the previous cache, store, and project state before the timer so the result reflects a cold install without charging recursive deletion.
+Install benchmarks use the tracked VitePress docs fixture, a real-world workspace graph with 535 packages.
+
+| Benchmark | npm | pnpm | bun | **lpm** | **lpm + Firewall monitor** |
+| ------------------------------- | --------: | ------: | ------: | -------: | -------------------------: |
+| Cold install, equal footing ¹ | 17,354ms | 6,125ms | 2,455ms | 2,945ms | 3,043ms |
+| Warm install ¹ | 3,819ms | 3,301ms | 451ms | **387ms** | **324ms** |
+| Up-to-date install ¹ | 282ms | 522ms | 77ms | **14ms** | **14ms** |
+
+Dev command benchmarks measure already-installed local scripts, local bins, and built-in tools.
+
+| Benchmark | npm / npx / tsx | pnpm | bun / bunx | **lpm** |
+| --------------------------------- | --------------: | ------: | ---------: | -------: |
+| Script overhead ² | 67ms | 153ms | 15ms | **9ms** |
+| Local bin: `esbuild --version` ² | 136ms | 163ms | 26ms | **17ms** |
+| Run TSX app, warm cache ³ | 112ms | — | 19ms | **41ms** |
+| `lpm lint` vs `npx oxlint` ⁴ | 249ms | — | — | **3ms** |
+| `lpm fmt` vs `npx biome` ⁴ | 269ms | — | — | **3ms** |
+
+
+Benchmark methodology
+
+> **¹ Install benchmarks** — Generated by [`run-install-readiness.mjs`](bench/scripts/run-install-readiness.mjs) with `--samples 10 --fixtures vitepress --managers lpm,bun,pnpm,npm --modes cold,warm,up-to-date --lpm-firewall-modes off,report`. Each run uses an isolated temporary project, `HOME`, package-manager cache, and `LPM_HOME`; samples are round-robin interleaved to reduce live-network bias. Dependency lifecycle scripts are disabled for all package managers. Raw artifact: [`readme-install-vitepress-20260710T140139.md`](bench/perf-results/readme-install-vitepress-20260710T140139.md).
>
-> **³ Warm / Up-to-date — `bench/project`** — Warm install means the cache and lockfile already exist and only `node_modules` gets rebuilt. Up-to-date install means nothing changed, so the package manager just checks state and exits.
+> **Firewall monitor mode** — The Firewall monitor column runs the same LPM install with `LPM_NPM_FIREWALL=report`. In the cold install row, LPM checked 535 package versions before materializing package bytes.
>
-> **⁴ Script overhead / lint / fmt — `bench/project`** — Script overhead is the cost of invoking the package runner itself. The lint and format rows compare `lpm`'s built-ins against `npx oxlint` and `npx biome`.
+> **² Script and local-bin benchmarks** — Generated by [`run-bin-benchmark.mjs`](bench/scripts/run-bin-benchmark.mjs) with 10 measured iterations after 2 warmups. Dependency installation is setup-only and not timed; rows execute package scripts or already-installed local `node_modules/.bin` entries. Raw artifact: [`readme-run-bin-20260710T141422.md`](bench/perf-results/readme-run-bin-20260710T141422.md).
>
-> **Script-policy footing.** `lpm install` runs the root project's install lifecycle (`pnpm:devPreinstall`, then `preinstall`/`install`/`postinstall`/`preprepare`/`prepare`/`postprepare`) on bare installs. Dependency lifecycle scripts stay blocked by default and run only through the trust-gated rebuild/auto-build path. For like-for-like comparisons on script-heavy fixtures, compare dependency skip-vs-skip (`bun install --ignore-scripts`) or dependency run-vs-run (`lpm install --yolo --auto-build`).
+> **³ TSX benchmark** — Generated by [`exec-runtime-benchmark.mjs`](bench/scripts/exec-runtime-benchmark.mjs) against a generated 10-module TSX ESM app with 10 measured iterations after 2 warmups. The `npm / npx / tsx` column is `tsx`; the `bun / bunx` column is `bun`. Raw artifact: [`readme-exec-runtime-20260710T141510.md`](bench/perf-results/readme-exec-runtime-20260710T141510.md).
>
-> **Bench setup.** Rows ¹-² use a `RUNS=20` cold-install sweep. Rows ³-⁴ come from the `bench/project` sweep.
+> **⁴ Built-in tool benchmarks** — Generated with `RUNS=10 LPM_BIN=target/release/lpm-rs ./bench/run.sh builtin-tools` on `bench/project`. The `npm / npx / tsx` column is `npx oxlint` or `npx @biomejs/biome`.
+
## License
diff --git a/assets/lpm-firewall-icon.svg b/assets/lpm-firewall-icon.svg
new file mode 100644
index 00000000..3daa4b13
--- /dev/null
+++ b/assets/lpm-firewall-icon.svg
@@ -0,0 +1,12 @@
+
+ LPM Firewall icon
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/lpm-icon.svg b/assets/lpm-icon.svg
new file mode 100644
index 00000000..3d2df5b7
--- /dev/null
+++ b/assets/lpm-icon.svg
@@ -0,0 +1,12 @@
+
+ LPM icon
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/lpm-registry-icon.svg b/assets/lpm-registry-icon.svg
new file mode 100644
index 00000000..8ac171f8
--- /dev/null
+++ b/assets/lpm-registry-icon.svg
@@ -0,0 +1,12 @@
+
+ LPM.dev Registry icon
+
+
+
+
+
+
+
+
+
+
diff --git a/bench/fixtures/vitepress-docs/README.md b/bench/fixtures/vitepress-docs/README.md
new file mode 100644
index 00000000..91bf2f53
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/README.md
@@ -0,0 +1,13 @@
+# VitePress Docs Benchmark Fixture
+
+This fixture captures the install graph from the VitePress 1.5.0 repository
+without vendoring the full source tree. It keeps the root package manifest,
+workspace manifests, pnpm settings, and the patch referenced by the manifest so
+`bench/scripts/run-install-readiness.mjs --fixtures vitepress` can reproduce
+the real install workload from tracked files. The tracked `fixture.npmrc`
+template is copied to `.npmrc` when the harness materializes a temp project,
+because `.npmrc` is intentionally ignored at the repository root.
+
+The fixture is used for README-facing install benchmarks because it is a
+recognizable real-world project with enough dependencies for resolver, fetch,
+link, and firewall monitor costs to be visible.
diff --git a/bench/fixtures/vitepress-docs/__tests__/e2e/package.json b/bench/fixtures/vitepress-docs/__tests__/e2e/package.json
new file mode 100644
index 00000000..1d558ff7
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/__tests__/e2e/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "tests-e2e",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "test": "vitest run",
+ "watch": "DEBUG=1 vitest",
+ "site:dev": "vitepress",
+ "site:build": "vitepress build",
+ "site:preview": "vitepress preview"
+ },
+ "devDependencies": {
+ "vitepress": "workspace:*"
+ }
+}
diff --git a/bench/fixtures/vitepress-docs/__tests__/init/package.json b/bench/fixtures/vitepress-docs/__tests__/init/package.json
new file mode 100644
index 00000000..a3f14021
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/__tests__/init/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "tests-init",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "test": "vitest run",
+ "watch": "DEBUG=1 vitest"
+ },
+ "devDependencies": {
+ "vitepress": "workspace:*"
+ }
+}
diff --git a/bench/fixtures/vitepress-docs/docs/package.json b/bench/fixtures/vitepress-docs/docs/package.json
new file mode 100644
index 00000000..25c3a0af
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/docs/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "docs",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vitepress dev",
+ "build": "vitepress build",
+ "preview": "vitepress preview",
+ "lunaria:build": "lunaria build",
+ "lunaria:open": "open-cli .vitepress/dist/_translations/index.html"
+ },
+ "devDependencies": {
+ "@lunariajs/core": "^0.1.1",
+ "markdown-it-mathjax3": "^4.3.2",
+ "open-cli": "^8.0.0",
+ "vitepress": "workspace:*"
+ }
+}
diff --git a/bench/fixtures/vitepress-docs/fixture.npmrc b/bench/fixtures/vitepress-docs/fixture.npmrc
new file mode 100644
index 00000000..ab953072
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/fixture.npmrc
@@ -0,0 +1,2 @@
+shell-emulator=true
+auto-install-peers=false
diff --git a/bench/fixtures/vitepress-docs/package.json b/bench/fixtures/vitepress-docs/package.json
new file mode 100644
index 00000000..d42dad9e
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/package.json
@@ -0,0 +1,225 @@
+{
+ "name": "vitepress",
+ "version": "1.5.0",
+ "description": "Vite & Vue powered static site generator",
+ "keywords": [
+ "vite",
+ "vue",
+ "vitepress"
+ ],
+ "homepage": "https://vitepress.dev/",
+ "bugs": {
+ "url": "https://github.com/vuejs/vitepress/issues"
+ },
+ "repository": "github:vuejs/vitepress",
+ "license": "MIT",
+ "author": "Evan You",
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./types/index.d.ts",
+ "default": "./dist/node/index.js"
+ },
+ "./dist/*": "./dist/*",
+ "./package.json": "./package.json",
+ "./client": {
+ "types": "./client.d.ts",
+ "default": "./dist/client/index.js"
+ },
+ "./theme": {
+ "types": "./theme.d.ts",
+ "default": "./dist/client/theme-default/index.js"
+ },
+ "./theme-without-fonts": {
+ "types": "./theme-without-fonts.d.ts",
+ "default": "./dist/client/theme-default/without-fonts.js"
+ },
+ "./vue-demi": {
+ "default": "./lib/vue-demi.mjs"
+ }
+ },
+ "main": "dist/node/index.js",
+ "types": "types/index.d.ts",
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "files": [
+ "bin",
+ "dist",
+ "types",
+ "template",
+ "client.d.ts",
+ "theme.d.ts",
+ "theme-without-fonts.d.ts",
+ "lib"
+ ],
+ "scripts": {
+ "dev": "rimraf dist && pnpm dev:shared && pnpm dev:start",
+ "dev:start": "pnpm --stream '/^dev:(client|node|watch)$/'",
+ "dev:client": "tsc --sourcemap -w --preserveWatchOutput -p src/client",
+ "dev:node": "DEV=true pnpm build:node -w",
+ "dev:shared": "node scripts/copyShared",
+ "dev:watch": "node scripts/watchAndCopy",
+ "build": "pnpm build:prepare && pnpm build:client && pnpm build:node",
+ "build:prepare": "rimraf dist && node scripts/copyShared",
+ "build:client": "vue-tsc --noEmit -p src/client && tsc -p src/client && node scripts/copyClient",
+ "build:node": "tsc -p src/node --noEmit && rollup --config rollup.config.ts --configPlugin esbuild",
+ "test": "pnpm --aggregate-output --reporter=append-only '/^test:(unit|e2e|init)$/'",
+ "test:unit": "vitest run -r __tests__/unit",
+ "test:unit:watch": "vitest -r __tests__/unit",
+ "test:e2e": "pnpm test:e2e-dev && pnpm test:e2e-build",
+ "test:e2e:site:dev": "pnpm -F=tests-e2e site:dev",
+ "test:e2e:site:build": "pnpm -F=tests-e2e site:build",
+ "test:e2e:site:preview": "pnpm -F=tests-e2e site:preview",
+ "test:e2e-dev": "pnpm -F=tests-e2e test",
+ "test:e2e-dev:watch": "pnpm -F=tests-e2e watch",
+ "test:e2e-build": "VITE_TEST_BUILD=1 pnpm test:e2e-dev",
+ "test:e2e-build:watch": "VITE_TEST_BUILD=1 pnpm test:e2e-dev:watch",
+ "test:init": "pnpm -F=tests-init test",
+ "test:init:watch": "pnpm -F=tests-init watch",
+ "docs": "pnpm --stream '/^(docs:)?dev$/'",
+ "docs:dev": "wait-on -d 100 dist/node/cli.js && pnpm -F=docs dev",
+ "docs:debug": "NODE_OPTIONS='--inspect-brk' pnpm docs:dev",
+ "docs:build": "pnpm build && pnpm docs:build:only",
+ "docs:build:only": "pnpm -F=docs build",
+ "docs:preview": "pnpm -F=docs preview",
+ "docs:lunaria:build": "pnpm -F=docs lunaria:build",
+ "docs:lunaria:open": "pnpm -F=docs lunaria:open",
+ "format": "prettier --check --write .",
+ "format:fail": "prettier --check .",
+ "check": "pnpm format:fail && pnpm build && pnpm test",
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
+ "release": "node scripts/release.js"
+ },
+ "simple-git-hooks": {
+ "pre-commit": "pnpm lint-staged"
+ },
+ "lint-staged": {
+ "*": "prettier --write --ignore-unknown"
+ },
+ "dependencies": {
+ "@docsearch/css": "^3.6.2",
+ "@docsearch/js": "^3.6.2",
+ "@iconify-json/simple-icons": "^1.2.10",
+ "@shikijs/core": "^1.22.2",
+ "@shikijs/transformers": "^1.22.2",
+ "@shikijs/types": "^1.22.2",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.1.4",
+ "@vue/devtools-api": "^7.5.4",
+ "@vue/shared": "^3.5.12",
+ "@vueuse/core": "^11.1.0",
+ "@vueuse/integrations": "^11.1.0",
+ "focus-trap": "^7.6.0",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.0",
+ "shiki": "^1.22.2",
+ "vite": "^5.4.10",
+ "vue": "^3.5.12"
+ },
+ "devDependencies": {
+ "@clack/prompts": "^0.7.0",
+ "@iconify/utils": "^2.1.33",
+ "@mdit-vue/plugin-component": "^2.1.3",
+ "@mdit-vue/plugin-frontmatter": "^2.1.3",
+ "@mdit-vue/plugin-headers": "^2.1.3",
+ "@mdit-vue/plugin-sfc": "^2.1.3",
+ "@mdit-vue/plugin-title": "^2.1.3",
+ "@mdit-vue/plugin-toc": "^2.1.3",
+ "@mdit-vue/shared": "^2.1.3",
+ "@polka/compression": "^1.0.0-next.28",
+ "@rollup/plugin-alias": "^5.1.1",
+ "@rollup/plugin-commonjs": "^28.0.1",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^15.3.0",
+ "@rollup/plugin-replace": "^6.0.1",
+ "@types/cross-spawn": "^6.0.6",
+ "@types/debug": "^4.1.12",
+ "@types/fs-extra": "^11.0.4",
+ "@types/lodash.template": "^4.5.3",
+ "@types/mark.js": "^8.11.12",
+ "@types/markdown-it-attrs": "^4.1.3",
+ "@types/markdown-it-container": "^2.0.10",
+ "@types/markdown-it-emoji": "^3.0.1",
+ "@types/micromatch": "^4.0.9",
+ "@types/minimist": "^1.2.5",
+ "@types/node": "^22.8.2",
+ "@types/postcss-prefix-selector": "^1.16.3",
+ "@types/prompts": "^2.4.9",
+ "chokidar": "^3.6.0",
+ "conventional-changelog-cli": "^5.0.0",
+ "cross-spawn": "^7.0.3",
+ "debug": "^4.3.7",
+ "esbuild": "^0.24.0",
+ "execa": "^9.5.1",
+ "fs-extra": "^11.2.0",
+ "get-port": "^7.1.0",
+ "gray-matter": "^4.0.3",
+ "lint-staged": "^15.2.10",
+ "lodash.template": "^4.5.0",
+ "lru-cache": "^11.0.1",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^9.2.0",
+ "markdown-it-attrs": "^4.2.0",
+ "markdown-it-container": "^4.0.0",
+ "markdown-it-emoji": "^3.0.0",
+ "markdown-it-mathjax3": "^4.3.2",
+ "micromatch": "^4.0.8",
+ "minimist": "^1.2.8",
+ "nanoid": "^5.0.8",
+ "ora": "^8.1.0",
+ "p-map": "^7.0.2",
+ "path-to-regexp": "^6.3.0",
+ "picocolors": "^1.1.1",
+ "pkg-dir": "^8.0.0",
+ "playwright-chromium": "^1.48.2",
+ "polka": "^1.0.0-next.28",
+ "postcss-prefix-selector": "^2.1.0",
+ "prettier": "^3.3.3",
+ "prompts": "^2.4.2",
+ "punycode": "^2.3.1",
+ "rimraf": "^6.0.1",
+ "rollup": "^4.24.2",
+ "rollup-plugin-dts": "^6.1.1",
+ "rollup-plugin-esbuild": "^6.1.1",
+ "semver": "^7.6.3",
+ "simple-git-hooks": "^2.11.1",
+ "sirv": "^3.0.0",
+ "sitemap": "^8.0.0",
+ "supports-color": "^9.4.0",
+ "synckit": "^0.9.2",
+ "tinyglobby": "^0.2.10",
+ "typescript": "^5.6.3",
+ "vitest": "^2.1.4",
+ "vue-tsc": "^2.1.8",
+ "wait-on": "^8.0.1"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ },
+ "packageManager": "pnpm@9.12.3",
+ "pnpm": {
+ "peerDependencyRules": {
+ "ignoreMissing": [
+ "@algolia/client-search",
+ "search-insights",
+ "postcss"
+ ]
+ },
+ "overrides": {
+ "ora>string-width": "^5"
+ },
+ "patchedDependencies": {
+ "@types/mdurl@2.0.0": "patches/@types__mdurl@2.0.0.patch"
+ }
+ }
+}
diff --git a/bench/fixtures/vitepress-docs/patches/@types__mdurl@2.0.0.patch b/bench/fixtures/vitepress-docs/patches/@types__mdurl@2.0.0.patch
new file mode 100644
index 00000000..d128d01c
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/patches/@types__mdurl@2.0.0.patch
@@ -0,0 +1,19 @@
+diff --git a/lib/parse.d.mts b/lib/parse.d.mts
+index 2e0d8f2ea00a06c0971a68d34946e797b7f8152d..f61d4dd05c1b181bc6d2d8683153abcd10fe9ab9 100644
+--- a/lib/parse.d.mts
++++ b/lib/parse.d.mts
+@@ -1,4 +1,4 @@
+-declare class Url {
++declare class _Url {
+ protocol: string;
+ slashes: string;
+ auth: string;
+@@ -14,5 +14,7 @@ declare class Url {
+ parseHost(host: string): void;
+ }
+
++type Url = _Url;
++
+ export default function parse(url: string | Url, slashesDenoteHost?: boolean): Url;
+-export type { Url };
++export { Url };
diff --git a/bench/fixtures/vitepress-docs/pnpm-workspace.yaml b/bench/fixtures/vitepress-docs/pnpm-workspace.yaml
new file mode 100644
index 00000000..8d0353c9
--- /dev/null
+++ b/bench/fixtures/vitepress-docs/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+packages:
+ - docs
+ - __tests__/*
diff --git a/bench/perf-results/readme-exec-runtime-20260710T141510.json b/bench/perf-results/readme-exec-runtime-20260710T141510.json
new file mode 100644
index 00000000..81116c90
--- /dev/null
+++ b/bench/perf-results/readme-exec-runtime-20260710T141510.json
@@ -0,0 +1,322 @@
+{
+ "metadata": {
+ "generatedAt": "2026-07-10T13:15:10.741Z",
+ "sourceGitSha": "22d20109",
+ "lpmBinarySource": "explicit LPM_BIN",
+ "iterations": 10,
+ "warmupIterations": 2,
+ "moduleCounts": [
+ 10
+ ],
+ "nodeBinary": "/Users/tolga/.n/bin/node",
+ "nodeBinarySource": "current Node process",
+ "nodeVersion": "v22.22.1",
+ "npmVersion": "10.9.4",
+ "lpmBinary": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs",
+ "lpmVersion": "lpm 0.67.0",
+ "bunBin": "/Users/tolga/.bun/bin/bun",
+ "bunBinSource": "PATH",
+ "bunAvailable": true,
+ "bunVersion": "1.3.14",
+ "nubBin": null,
+ "nubAvailable": false,
+ "nubVersion": null,
+ "tsxBin": "/tmp/lpm-bench-tools/node_modules/.bin/tsx",
+ "tsxBinSource": "LOCAL_TSX_BIN",
+ "tsxAvailable": true,
+ "tsxVersion": "tsx v4.19.4 node v22.22.1",
+ "markdownOut": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/bench/perf-results/readme-exec-runtime-20260710T141510.md",
+ "jsonOut": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/bench/perf-results/readme-exec-runtime-20260710T141510.json",
+ "scenarioFilter": "^tsx-esm-modules-10$"
+ },
+ "results": [
+ {
+ "runner": "node",
+ "scenario": "node-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "cold",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "js",
+ "entry": "scripts/entry.js",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 20.84,
+ "minMs": 20.62,
+ "p50Ms": 20.79,
+ "p95Ms": 21.11,
+ "maxMs": 21.11,
+ "samplesMs": [
+ 20.97,
+ 20.79,
+ 20.8,
+ 20.62,
+ 21.02,
+ 20.77,
+ 20.69,
+ 20.9,
+ 20.73,
+ 21.11
+ ]
+ },
+ {
+ "runner": "node",
+ "scenario": "node-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "warm",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "js",
+ "entry": "scripts/entry.js",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 20.91,
+ "minMs": 20.38,
+ "p50Ms": 20.69,
+ "p95Ms": 22.24,
+ "maxMs": 22.24,
+ "samplesMs": [
+ 22.24,
+ 21.88,
+ 20.75,
+ 20.38,
+ 20.45,
+ 20.68,
+ 20.74,
+ 20.56,
+ 20.69,
+ 20.78
+ ]
+ },
+ {
+ "runner": "bun",
+ "scenario": "bun-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "cold",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 21.98,
+ "minMs": 20.69,
+ "p50Ms": 21.38,
+ "p95Ms": 26.37,
+ "maxMs": 26.37,
+ "samplesMs": [
+ 22.06,
+ 20.69,
+ 20.96,
+ 26.37,
+ 21.38,
+ 21.18,
+ 22.86,
+ 22.1,
+ 21.44,
+ 20.79
+ ]
+ },
+ {
+ "runner": "bun",
+ "scenario": "bun-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "warm",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 18.94,
+ "minMs": 18.16,
+ "p50Ms": 18.58,
+ "p95Ms": 21.22,
+ "maxMs": 21.22,
+ "samplesMs": [
+ 21.22,
+ 19.47,
+ 18.55,
+ 19.27,
+ 18.58,
+ 18.74,
+ 18.28,
+ 18.16,
+ 18.38,
+ 18.73
+ ]
+ },
+ {
+ "runner": "lpm",
+ "scenario": "lpm-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "cold",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 66.63,
+ "minMs": 62.88,
+ "p50Ms": 65.55,
+ "p95Ms": 71.88,
+ "maxMs": 71.88,
+ "samplesMs": [
+ 63.86,
+ 70.96,
+ 71.88,
+ 65.23,
+ 62.88,
+ 63.02,
+ 65.55,
+ 68.31,
+ 66.44,
+ 68.14
+ ]
+ },
+ {
+ "runner": "lpm",
+ "scenario": "lpm-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "warm",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 41.09,
+ "minMs": 40.03,
+ "p50Ms": 40.82,
+ "p95Ms": 42.5,
+ "maxMs": 42.5,
+ "samplesMs": [
+ 42.5,
+ 40.82,
+ 41.25,
+ 40.07,
+ 40.03,
+ 40.06,
+ 40.42,
+ 41.98,
+ 41.97,
+ 41.79
+ ]
+ },
+ {
+ "runner": "nub",
+ "scenario": "nub-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "skipped",
+ "reason": "NUB_BIN is unset or not executable",
+ "cacheMode": "cold",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 0
+ },
+ {
+ "runner": "nub",
+ "scenario": "nub-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "skipped",
+ "reason": "NUB_BIN is unset or not executable",
+ "cacheMode": "warm",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 0
+ },
+ {
+ "runner": "tsx",
+ "scenario": "tsx-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "cold",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 121.94,
+ "minMs": 117.82,
+ "p50Ms": 120.63,
+ "p95Ms": 129.91,
+ "maxMs": 129.91,
+ "samplesMs": [
+ 121.36,
+ 126.9,
+ 119.21,
+ 129.91,
+ 119.8,
+ 122.89,
+ 120.63,
+ 121.33,
+ 119.59,
+ 117.82
+ ]
+ },
+ {
+ "runner": "tsx",
+ "scenario": "tsx-tsx-esm-modules-10",
+ "fixture": "tsx-esm-modules-10",
+ "label": "TSX ESM",
+ "status": "pass",
+ "cacheMode": "warm",
+ "moduleCount": 10,
+ "format": "module",
+ "projectMode": "module",
+ "entryKind": "tsx",
+ "entry": "scripts/entry.tsx",
+ "helperInvocations": 0,
+ "iterations": 10,
+ "avgMs": 112.7,
+ "minMs": 108.87,
+ "p50Ms": 112.14,
+ "p95Ms": 116.62,
+ "maxMs": 116.62,
+ "samplesMs": [
+ 108.87,
+ 112.09,
+ 116.62,
+ 113.98,
+ 112.07,
+ 112.63,
+ 115.41,
+ 112.89,
+ 112.14,
+ 110.35
+ ]
+ }
+ ]
+}
diff --git a/bench/perf-results/readme-exec-runtime-20260710T141510.md b/bench/perf-results/readme-exec-runtime-20260710T141510.md
new file mode 100644
index 00000000..8679785d
--- /dev/null
+++ b/bench/perf-results/readme-exec-runtime-20260710T141510.md
@@ -0,0 +1,37 @@
+# lpm source runtime benchmark suite
+
+- Date: `2026-07-10T13:15:10.741Z`
+- Source Git SHA: `22d20109`
+- Iterations: `10`
+- Warmup iterations: `2`
+- Module counts: `10`
+- Binary: `/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs`
+- Binary source: `explicit LPM_BIN`
+- LPM: `lpm 0.67.0`
+- Node: `v22.22.1` via `/Users/tolga/.n/bin/node`
+- Node source: `current Node process`
+- Bun: `1.3.14`
+- Bun binary: `/Users/tolga/.bun/bin/bun`
+- Nub: `skipped`
+- Nub binary: `set NUB_BIN to enable`
+- tsx: `tsx v4.19.4 node v22.22.1`
+- tsx binary: `/tmp/lpm-bench-tools/node_modules/.bin/tsx`
+
+Each comparison fixture uses the same generated module graph: `node` runs the JS baseline, while `bun`, `lpm`, `nub`, and `tsx` run the matching TS/TSX source.
+Cold clears the runner's transform cache before every measured run. Warm runs 2 unmeasured warmup iteration(s) and then reuses that cache.
+`lpm-oxc-helper` rows run one transform helper process per file. `lpm-oxc-helper-persistent` rows run one `internal-ts-transform --persistent` process for the whole module set.
+
+| Runner | Fixture | Entry | Cache | Modules | Helper calls | Format | Project mode | Status | Iterations | Avg ms | Min ms | P50 ms | P50/call ms | P95 ms | Max ms |
+| --- | --- | --- | --- | ---: | ---: | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| node | tsx-esm-modules-10 | scripts/entry.js | cold | 10 | - | module | module | pass | 10 | 20.84 | 20.62 | 20.79 | - | 21.11 | 21.11 |
+| node | tsx-esm-modules-10 | scripts/entry.js | warm | 10 | - | module | module | pass | 10 | 20.91 | 20.38 | 20.69 | - | 22.24 | 22.24 |
+| bun | tsx-esm-modules-10 | scripts/entry.tsx | cold | 10 | - | module | module | pass | 10 | 21.98 | 20.69 | 21.38 | - | 26.37 | 26.37 |
+| bun | tsx-esm-modules-10 | scripts/entry.tsx | warm | 10 | - | module | module | pass | 10 | 18.94 | 18.16 | 18.58 | - | 21.22 | 21.22 |
+| lpm | tsx-esm-modules-10 | scripts/entry.tsx | cold | 10 | - | module | module | pass | 10 | 66.63 | 62.88 | 65.55 | - | 71.88 | 71.88 |
+| lpm | tsx-esm-modules-10 | scripts/entry.tsx | warm | 10 | - | module | module | pass | 10 | 41.09 | 40.03 | 40.82 | - | 42.50 | 42.50 |
+| nub | tsx-esm-modules-10 | scripts/entry.tsx | cold | 10 | - | module | module | skipped: NUB_BIN is unset or not executable | 0 | - | - | - | - | - | - |
+| nub | tsx-esm-modules-10 | scripts/entry.tsx | warm | 10 | - | module | module | skipped: NUB_BIN is unset or not executable | 0 | - | - | - | - | - | - |
+| tsx | tsx-esm-modules-10 | scripts/entry.tsx | cold | 10 | - | module | module | pass | 10 | 121.94 | 117.82 | 120.63 | - | 129.91 | 129.91 |
+| tsx | tsx-esm-modules-10 | scripts/entry.tsx | warm | 10 | - | module | module | pass | 10 | 112.70 | 108.87 | 112.14 | - | 116.62 | 116.62 |
+
+Skipped Bun/Nub/tsx rows are benchmark-only comparisons; the harness never installs or fetches comparison tools.
diff --git a/bench/perf-results/readme-install-vitepress-20260710T140139.json b/bench/perf-results/readme-install-vitepress-20260710T140139.json
new file mode 100644
index 00000000..244c7fb2
--- /dev/null
+++ b/bench/perf-results/readme-install-vitepress-20260710T140139.json
@@ -0,0 +1,1933 @@
+{
+ "meta": {
+ "sourceDir": "/tmp/lpm-readme-vitepress-20260710T140139",
+ "rows": 150,
+ "failedRows": 0,
+ "generatedAt": "2026-07-10T13:16:17.678Z",
+ "fixture": "bench/fixtures/vitepress-docs",
+ "samples": 10,
+ "modes": [
+ "cold",
+ "warm",
+ "up-to-date"
+ ],
+ "managers": [
+ "lpm",
+ "bun",
+ "pnpm",
+ "npm"
+ ],
+ "lpmFirewallModes": [
+ "off",
+ "report"
+ ]
+ },
+ "summary": [
+ {
+ "fixture": "vitepress",
+ "manager": "bun",
+ "spec": "bun",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "cold",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 2454.5,
+ "min": 2046
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "bun",
+ "spec": "bun",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "up-to-date",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 76.5,
+ "min": 66
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "bun",
+ "spec": "bun",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "warm",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 450.5,
+ "min": 357
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current-firewall-report",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "report",
+ "mode": "cold",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 3043,
+ "min": 2635
+ },
+ "duration_ms": {
+ "median": 2974.5,
+ "min": 2569
+ },
+ "resolve_ms": {
+ "median": 1260,
+ "min": 1028
+ },
+ "firewall_batch_ms": {
+ "median": 1273.5,
+ "min": 1038
+ },
+ "firewall_chunk_count": {
+ "median": 10,
+ "min": 10
+ },
+ "firewall_chunk_sum_ms": {
+ "median": 166,
+ "min": 133
+ },
+ "firewall_chunk_max_ms": {
+ "median": 59.5,
+ "min": 35
+ },
+ "firewall_checked_count": {
+ "median": 535,
+ "min": 535
+ },
+ "firewall_allow_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_warn_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_block_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_unknown_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_matched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_rpc_failed_count": {
+ "median": 1,
+ "min": 1
+ },
+ "firewall_offline_skipped_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_initial_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_ms": {
+ "median": 61774,
+ "min": 39945
+ },
+ "resolve_followup_rpc_count": {
+ "median": 551,
+ "min": 551
+ },
+ "resolve_walker_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_escape_hatch_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_parse_ndjson_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_pubgrub_ms": {
+ "median": 1258,
+ "min": 1026
+ },
+ "resolve_platform_skipped_count": {
+ "median": 70,
+ "min": 70
+ },
+ "resolve_dispatcher_rpc_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_inflight_high_water": {
+ "median": 189.5,
+ "min": 172
+ },
+ "resolve_dispatcher_tarball_dispatched_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_peer_prefetch_count": {
+ "median": 2,
+ "min": 1
+ },
+ "resolve_streaming_bfs_walk_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_manifests_fetched": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_cache_hits": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 1459.5,
+ "min": 1005
+ },
+ "link_ms": {
+ "median": 64.5,
+ "min": 18
+ },
+ "package_count": {
+ "median": 535,
+ "min": 535
+ },
+ "downloaded": {
+ "median": 201,
+ "min": 128
+ },
+ "cached": {
+ "median": 334,
+ "min": 239
+ },
+ "fetch_task_sum_ms": {
+ "median": 121529.5,
+ "min": 36072
+ },
+ "fetch_task_max_ms": {
+ "median": 1395,
+ "min": 950
+ },
+ "fetch_queue_wait_sum_ms": {
+ "median": 121529.5,
+ "min": 36072
+ },
+ "fetch_extract_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_finalize_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_completed_count": {
+ "median": 535,
+ "min": 535
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 70,
+ "min": 70
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 473121.5,
+ "min": 330169
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 2406.5,
+ "min": 2101
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 548,
+ "min": 548
+ },
+ "metadata_body_mb_sum": {
+ "median": 70.5,
+ "min": 70.5
+ },
+ "metadata_version_count_sum": {
+ "median": 55577,
+ "min": 55577
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 60753,
+ "min": 39197
+ },
+ "metadata_http_sum_ms": {
+ "median": 58220,
+ "min": 36749
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 1860,
+ "min": 1351
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 72.5,
+ "min": 52
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 18.5,
+ "min": 11
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 985,
+ "min": 783
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 982.5,
+ "min": 782
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 241,
+ "min": 148
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 681.5,
+ "min": 536
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 21.5,
+ "min": 19
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 29.5,
+ "min": 29.5
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 9536,
+ "min": 9536
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 548,
+ "min": 548
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current-firewall-report",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "report",
+ "mode": "up-to-date",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 14,
+ "min": 13
+ },
+ "duration_ms": {
+ "median": 5,
+ "min": 5
+ },
+ "resolve_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "link_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_completed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_version_count_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 0,
+ "min": 0
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current-firewall-report",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "report",
+ "mode": "warm",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 324,
+ "min": 304
+ },
+ "duration_ms": {
+ "median": 279.5,
+ "min": 266
+ },
+ "resolve_ms": {
+ "median": 48,
+ "min": 46
+ },
+ "firewall_batch_ms": {
+ "median": 66.5,
+ "min": 54
+ },
+ "firewall_chunk_count": {
+ "median": 10,
+ "min": 10
+ },
+ "firewall_chunk_sum_ms": {
+ "median": 365,
+ "min": 321
+ },
+ "firewall_chunk_max_ms": {
+ "median": 51,
+ "min": 43
+ },
+ "firewall_checked_count": {
+ "median": 535,
+ "min": 535
+ },
+ "firewall_allow_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_warn_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_block_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_unknown_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_matched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_rpc_failed_count": {
+ "median": 1,
+ "min": 1
+ },
+ "firewall_offline_skipped_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_initial_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_walker_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_escape_hatch_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_parse_ndjson_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_pubgrub_ms": {
+ "median": 47,
+ "min": 45
+ },
+ "resolve_platform_skipped_count": {
+ "median": 70,
+ "min": 70
+ },
+ "resolve_dispatcher_rpc_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_inflight_high_water": {
+ "median": 152.5,
+ "min": 138
+ },
+ "resolve_dispatcher_tarball_dispatched_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_peer_prefetch_count": {
+ "median": 2,
+ "min": 2
+ },
+ "resolve_streaming_bfs_walk_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_manifests_fetched": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_cache_hits": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 28,
+ "min": 22
+ },
+ "link_ms": {
+ "median": 69,
+ "min": 55
+ },
+ "package_count": {
+ "median": 535,
+ "min": 535
+ },
+ "downloaded": {
+ "median": 0,
+ "min": 0
+ },
+ "cached": {
+ "median": 535,
+ "min": 535
+ },
+ "fetch_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_queue_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_extract_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_finalize_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_completed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 535,
+ "min": 535
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 70,
+ "min": 70
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0.5,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 548,
+ "min": 548
+ },
+ "metadata_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_version_count_sum": {
+ "median": 55577,
+ "min": 55577
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 1188.5,
+ "min": 864
+ },
+ "metadata_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 20.5,
+ "min": 17
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 3.5,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 2,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 9536,
+ "min": 9536
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 3,
+ "min": 3
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 548,
+ "min": 548
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "off",
+ "mode": "cold",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 2945,
+ "min": 2535
+ },
+ "duration_ms": {
+ "median": 2884.5,
+ "min": 2472
+ },
+ "resolve_ms": {
+ "median": 1337.5,
+ "min": 1125
+ },
+ "firewall_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_checked_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_allow_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_warn_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_block_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_unknown_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_matched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_rpc_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_offline_skipped_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_initial_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_ms": {
+ "median": 34642,
+ "min": 29456
+ },
+ "resolve_followup_rpc_count": {
+ "median": 551,
+ "min": 551
+ },
+ "resolve_walker_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_escape_hatch_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_parse_ndjson_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_pubgrub_ms": {
+ "median": 1334.5,
+ "min": 1124
+ },
+ "resolve_platform_skipped_count": {
+ "median": 70,
+ "min": 70
+ },
+ "resolve_dispatcher_rpc_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_inflight_high_water": {
+ "median": 209.5,
+ "min": 197
+ },
+ "resolve_dispatcher_tarball_dispatched_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_peer_prefetch_count": {
+ "median": 2,
+ "min": 2
+ },
+ "resolve_streaming_bfs_walk_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_manifests_fetched": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_cache_hits": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 1192.5,
+ "min": 894
+ },
+ "link_ms": {
+ "median": 106,
+ "min": 76
+ },
+ "package_count": {
+ "median": 535,
+ "min": 535
+ },
+ "downloaded": {
+ "median": 120,
+ "min": 45
+ },
+ "cached": {
+ "median": 415,
+ "min": 314
+ },
+ "fetch_task_sum_ms": {
+ "median": 40321.5,
+ "min": 6284
+ },
+ "fetch_task_max_ms": {
+ "median": 1141,
+ "min": 816
+ },
+ "fetch_queue_wait_sum_ms": {
+ "median": 40321.5,
+ "min": 6284
+ },
+ "fetch_extract_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_finalize_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_completed_count": {
+ "median": 491.5,
+ "min": 464
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 43.5,
+ "min": 38
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 70,
+ "min": 70
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 64,
+ "min": 64
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 64,
+ "min": 64
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 3047,
+ "min": 2526
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 92.5,
+ "min": 83
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 145741.5,
+ "min": 84804
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 2223.5,
+ "min": 1654
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 548,
+ "min": 548
+ },
+ "metadata_body_mb_sum": {
+ "median": 70.5,
+ "min": 70.5
+ },
+ "metadata_version_count_sum": {
+ "median": 55577,
+ "min": 55577
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 33743.5,
+ "min": 28570
+ },
+ "metadata_http_sum_ms": {
+ "median": 27651.5,
+ "min": 24247
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 4453,
+ "min": 1771
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 85,
+ "min": 77
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 23,
+ "min": 18
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 993,
+ "min": 867
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 991.5,
+ "min": 865
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 171,
+ "min": 112
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 777.5,
+ "min": 575
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 25,
+ "min": 21
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 29.5,
+ "min": 29.5
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 9536,
+ "min": 9536
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 548,
+ "min": 548
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "off",
+ "mode": "up-to-date",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 13.5,
+ "min": 12
+ },
+ "duration_ms": {
+ "median": 6,
+ "min": 5
+ },
+ "resolve_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "link_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_completed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_version_count_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 0,
+ "min": 0
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "lpm",
+ "spec": "lpm-current",
+ "cell": "current",
+ "route": "direct",
+ "firewall_mode": "off",
+ "mode": "warm",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 386.5,
+ "min": 357
+ },
+ "duration_ms": {
+ "median": 343,
+ "min": 313
+ },
+ "resolve_ms": {
+ "median": 51,
+ "min": 43
+ },
+ "firewall_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_chunk_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_checked_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_allow_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_warn_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_block_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_unknown_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_matched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_rpc_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "firewall_offline_skipped_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_initial_batch_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_followup_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_walker_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_escape_hatch_rpc_count": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_parse_ndjson_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_pubgrub_ms": {
+ "median": 50,
+ "min": 42
+ },
+ "resolve_platform_skipped_count": {
+ "median": 70,
+ "min": 70
+ },
+ "resolve_dispatcher_rpc_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_inflight_high_water": {
+ "median": 160,
+ "min": 143
+ },
+ "resolve_dispatcher_tarball_dispatched_count": {
+ "median": 548,
+ "min": 548
+ },
+ "resolve_dispatcher_peer_prefetch_count": {
+ "median": 2,
+ "min": 2
+ },
+ "resolve_streaming_bfs_walk_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_manifests_fetched": {
+ "median": 0,
+ "min": 0
+ },
+ "resolve_streaming_bfs_cache_hits": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_ms": {
+ "median": 23.5,
+ "min": 18
+ },
+ "link_ms": {
+ "median": 9.5,
+ "min": 7
+ },
+ "package_count": {
+ "median": 535,
+ "min": 535
+ },
+ "downloaded": {
+ "median": 0,
+ "min": 0
+ },
+ "cached": {
+ "median": 535,
+ "min": 535
+ },
+ "fetch_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_queue_wait_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_extract_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_finalize_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_selected_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_dispatched_count": {
+ "median": 605,
+ "min": 605
+ },
+ "fetch_overlap_completed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_cache_hit_count": {
+ "median": 535,
+ "min": 535
+ },
+ "fetch_overlap_skipped_platform_count": {
+ "median": 70,
+ "min": 70
+ },
+ "fetch_overlap_failed_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffered_count": {
+ "median": 64,
+ "min": 64
+ },
+ "fetch_overlap_buffered_dispatch_count": {
+ "median": 64,
+ "min": 64
+ },
+ "fetch_overlap_buffered_undispatched_count": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_buffer_wait_sum_ms": {
+ "median": 110.5,
+ "min": 79
+ },
+ "fetch_overlap_buffer_wait_max_ms": {
+ "median": 3,
+ "min": 2
+ },
+ "fetch_overlap_task_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_task_max_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "fetch_overlap_drain_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_calls": {
+ "median": 548,
+ "min": 548
+ },
+ "metadata_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_version_count_sum": {
+ "median": 55577,
+ "min": 55577
+ },
+ "metadata_raw_fetch_sum_ms": {
+ "median": 415,
+ "min": 304
+ },
+ "metadata_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_cache_info_parse_sum_ms": {
+ "median": 24,
+ "min": 17
+ },
+ "metadata_policy_release_time_sum_ms": {
+ "median": 1.5,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_http_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_read_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_json_decode_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_body_mb_sum": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_release_time_fetch_version_count_sum": {
+ "median": 9536,
+ "min": 9536
+ },
+ "metadata_policy_release_time_fetch_cache_hit_count": {
+ "median": 3,
+ "min": 3
+ },
+ "metadata_policy_release_time_fetch_not_modified_count": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_policy_full_metadata_sum_ms": {
+ "median": 0,
+ "min": 0
+ },
+ "metadata_route_npm_direct": {
+ "median": 548,
+ "min": 548
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "npm",
+ "spec": "npm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "cold",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 17353.5,
+ "min": 14902
+ },
+ "warning_count": {
+ "median": 12,
+ "min": 12
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 12,
+ "min": 12
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "npm",
+ "spec": "npm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "up-to-date",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 281.5,
+ "min": 249
+ },
+ "warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 0,
+ "min": 0
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "npm",
+ "spec": "npm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "warm",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 3818.5,
+ "min": 3369
+ },
+ "warning_count": {
+ "median": 12,
+ "min": 12
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 12,
+ "min": 12
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "pnpm",
+ "spec": "pnpm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "cold",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 6124.5,
+ "min": 5120
+ },
+ "warning_count": {
+ "median": 9,
+ "min": 9
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 9,
+ "min": 9
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "pnpm",
+ "spec": "pnpm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "up-to-date",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 522,
+ "min": 484
+ },
+ "warning_count": {
+ "median": 4,
+ "min": 4
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 4,
+ "min": 4
+ }
+ }
+ },
+ {
+ "fixture": "vitepress",
+ "manager": "pnpm",
+ "spec": "pnpm",
+ "cell": "default",
+ "route": "default",
+ "firewall_mode": "default",
+ "mode": "warm",
+ "samples": 10,
+ "successful_samples": 10,
+ "metrics": {
+ "wall_ms": {
+ "median": 3301,
+ "min": 2951
+ },
+ "warning_count": {
+ "median": 9,
+ "min": 9
+ },
+ "expected_warning_count": {
+ "median": 0,
+ "min": 0
+ },
+ "unexpected_warning_count": {
+ "median": 9,
+ "min": 9
+ }
+ }
+ }
+ ],
+ "data": {
+ "cold": {
+ "npm": 17353.5,
+ "pnpm": 6124.5,
+ "bun": 2454.5,
+ "lpm-current": 2945,
+ "lpm-current-firewall-report": 3043
+ },
+ "warm": {
+ "npm": 3818.5,
+ "pnpm": 3301,
+ "bun": 450.5,
+ "lpm-current": 386.5,
+ "lpm-current-firewall-report": 324
+ },
+ "up-to-date": {
+ "npm": 281.5,
+ "pnpm": 522,
+ "bun": 76.5,
+ "lpm-current": 13.5,
+ "lpm-current-firewall-report": 14
+ }
+ }
+}
diff --git a/bench/perf-results/readme-install-vitepress-20260710T140139.md b/bench/perf-results/readme-install-vitepress-20260710T140139.md
new file mode 100644
index 00000000..17156193
--- /dev/null
+++ b/bench/perf-results/readme-install-vitepress-20260710T140139.md
@@ -0,0 +1,36 @@
+# README VitePress Install Benchmark
+
+- Fixture: `bench/fixtures/vitepress-docs`
+- Samples: `10`
+- Modes: `cold,warm,up-to-date`
+- Managers: `lpm,bun,pnpm,npm`
+- LPM firewall modes: `off,report`
+- Raw output: `/tmp/lpm-readme-vitepress-20260710T140139`
+- Raw rows: `150`
+- Failed rows: `0`
+
+| Benchmark | npm | pnpm | bun | lpm | lpm + Firewall monitor |
+| --- | ---: | ---: | ---: | ---: | ---: |
+| Cold install, equal footing | 17,354ms | 6,125ms | 2,455ms | 2,945ms | 3,043ms |
+| Warm install | 3,819ms | 3,301ms | 451ms | 387ms | 324ms |
+| Up-to-date install | 282ms | 522ms | 77ms | 14ms | 14ms |
+
+Full harness summary:
+
+| Fixture | Spec | Mode | OK | Wall med/min | Resolve med/min | Firewall med/min | FW chunks | FW chunk sum | FW chunk max | Fetch med/min | Link med/min | Pkgs | FW checked | FW warn/block/unknown | Metadata MB | Version docs | Parity mismatches | Warnings exp/unknown |
+| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| vitepress | bun | cold | 10/10 | 2454.5/2046 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/0 |
+| vitepress | bun | up-to-date | 10/10 | 76.5/66 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/0 |
+| vitepress | bun | warm | 10/10 | 450.5/357 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/0 |
+| vitepress | lpm-current-firewall-report | cold | 10/10 | 3043/2635 | 1260/1028 | 1273.5/1038 | 10 | 166/133 | 59.5/35 | 1459.5/1005 | 64.5/18 | 535 | 535 | 0/0/0 | 70.5/70.5 | n/a | n/a | 0/0 |
+| vitepress | lpm-current-firewall-report | up-to-date | 10/10 | 14/13 | 0/0 | n/a | n/a | n/a | n/a | 0/0 | 0/0 | n/a | n/a | n/a | 0/0 | n/a | n/a | 0/0 |
+| vitepress | lpm-current-firewall-report | warm | 10/10 | 324/304 | 48/46 | 66.5/54 | 10 | 365/321 | 51/43 | 28/22 | 69/55 | 535 | 535 | 0/0/0 | 0/0 | n/a | n/a | 0/0 |
+| vitepress | lpm-current | cold | 10/10 | 2945/2535 | 1337.5/1125 | 0/0 | 0 | 0/0 | 0/0 | 1192.5/894 | 106/76 | 535 | 0 | 0/0/0 | 70.5/70.5 | n/a | n/a | 0/0 |
+| vitepress | lpm-current | up-to-date | 10/10 | 13.5/12 | 0/0 | n/a | n/a | n/a | n/a | 0/0 | 0/0 | n/a | n/a | n/a | 0/0 | n/a | n/a | 0/0 |
+| vitepress | lpm-current | warm | 10/10 | 386.5/357 | 51/43 | 0/0 | 0 | 0/0 | 0/0 | 23.5/18 | 9.5/7 | 535 | 0 | 0/0/0 | 0/0 | n/a | n/a | 0/0 |
+| vitepress | npm | cold | 10/10 | 17353.5/14902 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/12 |
+| vitepress | npm | up-to-date | 10/10 | 281.5/249 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/0 |
+| vitepress | npm | warm | 10/10 | 3818.5/3369 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/12 |
+| vitepress | pnpm | cold | 10/10 | 6124.5/5120 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/9 |
+| vitepress | pnpm | up-to-date | 10/10 | 522/484 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/4 |
+| vitepress | pnpm | warm | 10/10 | 3301/2951 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 0/9 |
diff --git a/bench/perf-results/readme-run-bin-20260710T141422.json b/bench/perf-results/readme-run-bin-20260710T141422.json
new file mode 100644
index 00000000..9ea75c98
--- /dev/null
+++ b/bench/perf-results/readme-run-bin-20260710T141422.json
@@ -0,0 +1,610 @@
+{
+ "metadata": {
+ "generatedAt": "2026-07-10T13:14:24.494Z",
+ "gitSha": "22d20109",
+ "gitBranch": "codex/rewrite-readme",
+ "gitDirty": true,
+ "gitStatus": [
+ "M README.md",
+ " M bench/scripts/README.md",
+ " M bench/scripts/run-install-readiness.mjs",
+ " M npm/cli/README.md",
+ "?? assets/",
+ "?? bench/fixtures/",
+ "?? bench/perf-results/readme-run-bin-20260710T141333.json",
+ "?? bench/perf-results/readme-run-bin-20260710T141333.md"
+ ],
+ "iterations": 10,
+ "warmupIterations": 2,
+ "commandTimeoutMs": 30000,
+ "fixtureDependencies": {
+ "esbuild": "0.28.1",
+ "typescript": "6.0.3"
+ },
+ "setup": {
+ "manager": "pnpm",
+ "command": "/Users/tolga/.n/bin/pnpm install --no-frozen-lockfile --config.dangerously-allow-all-builds=true --store-dir /var/folders/p2/32lgcl857ds0wkcnkg0qk51h0000gn/T/lpm-run-bin-bench-gErcPv/project/.pnpm-store"
+ },
+ "binaries": {
+ "lpm": {
+ "path": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs",
+ "source": "LPM_BIN",
+ "available": true,
+ "version": "lpm 0.67.0"
+ },
+ "nub": {
+ "path": "nub",
+ "source": "PATH",
+ "available": false,
+ "version": null
+ },
+ "nubx": {
+ "path": "nubx",
+ "source": "PATH",
+ "available": false,
+ "version": null
+ },
+ "node": {
+ "path": "/Users/tolga/.n/bin/node",
+ "source": "current Node process",
+ "available": true,
+ "version": "v22.22.1"
+ },
+ "npm": {
+ "path": "/Users/tolga/.n/bin/npm",
+ "source": "PATH",
+ "available": true,
+ "version": "10.9.4"
+ },
+ "npx": {
+ "path": "/Users/tolga/.n/bin/npx",
+ "source": "PATH",
+ "available": true,
+ "version": "10.9.4"
+ },
+ "pnpm": {
+ "path": "/Users/tolga/.n/bin/pnpm",
+ "source": "PATH",
+ "available": true,
+ "version": "11.3.0"
+ },
+ "bun": {
+ "path": "/Users/tolga/.bun/bin/bun",
+ "source": "PATH",
+ "available": true,
+ "version": "1.3.14"
+ },
+ "bunx": {
+ "path": "/Users/tolga/.bun/bin/bunx",
+ "source": "PATH",
+ "available": true,
+ "version": "1.3.14"
+ }
+ },
+ "host": {
+ "platform": "darwin",
+ "release": "25.5.0",
+ "arch": "arm64",
+ "cpuModel": "Apple M5 Pro",
+ "cpuCount": 18,
+ "totalMemoryBytes": 51539607552
+ },
+ "filters": {
+ "scenarios": "^(noop|esbuild-version)$",
+ "runners": "lpm-run,npm-run,pnpm-run,bun-run,lpm-exec,pnpm-exec,npx-no-install,npm-exec,bunx-no-install",
+ "groups": "script-runner,local-bin-runner"
+ },
+ "output": {
+ "markdown": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/bench/perf-results/readme-run-bin-20260710T141422.md",
+ "json": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/bench/perf-results/readme-run-bin-20260710T141422.json"
+ }
+ },
+ "fixture": {
+ "packageJson": {
+ "name": "lpm-run-bin-benchmark-fixture",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "noop": "echo hi",
+ "node-noop": "node -e \"process.stdout.write('node-noop\\\\n')\"",
+ "esbuild-version": "esbuild --version"
+ },
+ "dependencies": {
+ "esbuild": "0.28.1",
+ "typescript": "6.0.3"
+ }
+ },
+ "setupManager": "pnpm",
+ "setupCommand": "/Users/tolga/.n/bin/pnpm install --no-frozen-lockfile --config.dangerously-allow-all-builds=true --store-dir /var/folders/p2/32lgcl857ds0wkcnkg0qk51h0000gn/T/lpm-run-bin-bench-gErcPv/project/.pnpm-store",
+ "sameProjectForEveryRunner": true
+ },
+ "results": [
+ {
+ "id": "script-noop-lpm-run",
+ "group": "script-runner",
+ "runner": "lpm run",
+ "runnerKey": "lpm-run",
+ "scenario": "noop",
+ "label": "script noop",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs",
+ "args": [
+ "run",
+ "noop"
+ ],
+ "display": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs run noop"
+ },
+ "expectedStdout": "stdout contains \"hi\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 9.1,
+ "p95Ms": 9.31,
+ "avgMs": 9.08,
+ "minMs": 8.7,
+ "maxMs": 9.31,
+ "samplesMs": [
+ 9.12,
+ 9.03,
+ 9.14,
+ 8.94,
+ 9.1,
+ 9.12,
+ 9.28,
+ 9.1,
+ 8.7,
+ 9.31
+ ]
+ },
+ {
+ "id": "script-noop-npm-run",
+ "group": "script-runner",
+ "runner": "npm run",
+ "runnerKey": "npm-run",
+ "scenario": "noop",
+ "label": "script noop",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.n/bin/npm",
+ "args": [
+ "run",
+ "noop"
+ ],
+ "display": "/Users/tolga/.n/bin/npm run noop"
+ },
+ "expectedStdout": "stdout contains \"hi\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 66.94,
+ "p95Ms": 74.91,
+ "avgMs": 68.29,
+ "minMs": 66.19,
+ "maxMs": 74.91,
+ "samplesMs": [
+ 66.19,
+ 70.01,
+ 66.93,
+ 66.29,
+ 67.28,
+ 66.52,
+ 67.41,
+ 70.45,
+ 74.91,
+ 66.94
+ ]
+ },
+ {
+ "id": "script-noop-pnpm-run",
+ "group": "script-runner",
+ "runner": "pnpm run",
+ "runnerKey": "pnpm-run",
+ "scenario": "noop",
+ "label": "script noop",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.n/bin/pnpm",
+ "args": [
+ "run",
+ "noop"
+ ],
+ "display": "/Users/tolga/.n/bin/pnpm run noop"
+ },
+ "expectedStdout": "stdout contains \"hi\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 153.49,
+ "p95Ms": 155.3,
+ "avgMs": 153.8,
+ "minMs": 152.6,
+ "maxMs": 155.3,
+ "samplesMs": [
+ 154.05,
+ 153.48,
+ 153.73,
+ 154.3,
+ 152.6,
+ 154.84,
+ 155.3,
+ 153.42,
+ 152.75,
+ 153.49
+ ]
+ },
+ {
+ "id": "script-noop-bun-run",
+ "group": "script-runner",
+ "runner": "bun run",
+ "runnerKey": "bun-run",
+ "scenario": "noop",
+ "label": "script noop",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.bun/bin/bun",
+ "args": [
+ "run",
+ "noop"
+ ],
+ "display": "/Users/tolga/.bun/bin/bun run noop"
+ },
+ "expectedStdout": "stdout contains \"hi\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 14.61,
+ "p95Ms": 14.85,
+ "avgMs": 14.6,
+ "minMs": 14.32,
+ "maxMs": 14.85,
+ "samplesMs": [
+ 14.73,
+ 14.61,
+ 14.51,
+ 14.63,
+ 14.85,
+ 14.77,
+ 14.49,
+ 14.46,
+ 14.32,
+ 14.64
+ ]
+ },
+ {
+ "id": "script-esbuild-version-lpm-run",
+ "group": "script-runner",
+ "runner": "lpm run",
+ "runnerKey": "lpm-run",
+ "scenario": "esbuild-version",
+ "label": "script invokes local native bin",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs",
+ "args": [
+ "run",
+ "esbuild-version"
+ ],
+ "display": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs run esbuild-version"
+ },
+ "expectedStdout": "stdout contains \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 20.09,
+ "p95Ms": 20.67,
+ "avgMs": 20.12,
+ "minMs": 19.52,
+ "maxMs": 20.67,
+ "samplesMs": [
+ 20.27,
+ 20.67,
+ 20.29,
+ 19.86,
+ 20.09,
+ 20.35,
+ 19.89,
+ 20.14,
+ 20.09,
+ 19.52
+ ]
+ },
+ {
+ "id": "script-esbuild-version-npm-run",
+ "group": "script-runner",
+ "runner": "npm run",
+ "runnerKey": "npm-run",
+ "scenario": "esbuild-version",
+ "label": "script invokes local native bin",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.n/bin/npm",
+ "args": [
+ "run",
+ "esbuild-version"
+ ],
+ "display": "/Users/tolga/.n/bin/npm run esbuild-version"
+ },
+ "expectedStdout": "stdout contains \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 78.27,
+ "p95Ms": 81.39,
+ "avgMs": 78.56,
+ "minMs": 77.73,
+ "maxMs": 81.39,
+ "samplesMs": [
+ 78.15,
+ 77.9,
+ 78.53,
+ 78.47,
+ 78.49,
+ 81.39,
+ 78.82,
+ 78.27,
+ 77.83,
+ 77.73
+ ]
+ },
+ {
+ "id": "script-esbuild-version-pnpm-run",
+ "group": "script-runner",
+ "runner": "pnpm run",
+ "runnerKey": "pnpm-run",
+ "scenario": "esbuild-version",
+ "label": "script invokes local native bin",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.n/bin/pnpm",
+ "args": [
+ "run",
+ "esbuild-version"
+ ],
+ "display": "/Users/tolga/.n/bin/pnpm run esbuild-version"
+ },
+ "expectedStdout": "stdout contains \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 165.44,
+ "p95Ms": 167.42,
+ "avgMs": 165.56,
+ "minMs": 164.43,
+ "maxMs": 167.42,
+ "samplesMs": [
+ 165.16,
+ 165.44,
+ 164.43,
+ 164.83,
+ 165.5,
+ 165.62,
+ 167.42,
+ 166.56,
+ 165.56,
+ 165.11
+ ]
+ },
+ {
+ "id": "script-esbuild-version-bun-run",
+ "group": "script-runner",
+ "runner": "bun run",
+ "runnerKey": "bun-run",
+ "scenario": "esbuild-version",
+ "label": "script invokes local native bin",
+ "targetBin": null,
+ "command": {
+ "program": "/Users/tolga/.bun/bin/bun",
+ "args": [
+ "run",
+ "esbuild-version"
+ ],
+ "display": "/Users/tolga/.bun/bin/bun run esbuild-version"
+ },
+ "expectedStdout": "stdout contains \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 25.88,
+ "p95Ms": 27.91,
+ "avgMs": 26.09,
+ "minMs": 25.39,
+ "maxMs": 27.91,
+ "samplesMs": [
+ 26.19,
+ 25.7,
+ 25.91,
+ 25.82,
+ 25.88,
+ 25.97,
+ 25.41,
+ 25.39,
+ 26.67,
+ 27.91
+ ]
+ },
+ {
+ "id": "local-bin-esbuild-version-lpm-exec",
+ "group": "local-bin-runner",
+ "runner": "lpm exec",
+ "runnerKey": "lpm-exec",
+ "scenario": "esbuild-version",
+ "label": "native CLI local bin",
+ "targetBin": "esbuild",
+ "command": {
+ "program": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs",
+ "args": [
+ "exec",
+ "esbuild",
+ "--version"
+ ],
+ "display": "/Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs exec esbuild --version"
+ },
+ "expectedStdout": "stdout has a line exactly \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 16.82,
+ "p95Ms": 17.12,
+ "avgMs": 16.84,
+ "minMs": 16.44,
+ "maxMs": 17.12,
+ "samplesMs": [
+ 17.12,
+ 16.85,
+ 17.03,
+ 16.92,
+ 16.8,
+ 16.63,
+ 16.79,
+ 17.04,
+ 16.44,
+ 16.82
+ ]
+ },
+ {
+ "id": "local-bin-esbuild-version-pnpm-exec",
+ "group": "local-bin-runner",
+ "runner": "pnpm exec",
+ "runnerKey": "pnpm-exec",
+ "scenario": "esbuild-version",
+ "label": "native CLI local bin",
+ "targetBin": "esbuild",
+ "command": {
+ "program": "/Users/tolga/.n/bin/pnpm",
+ "args": [
+ "exec",
+ "esbuild",
+ "--version"
+ ],
+ "display": "/Users/tolga/.n/bin/pnpm exec esbuild --version"
+ },
+ "expectedStdout": "stdout has a line exactly \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 163.06,
+ "p95Ms": 164.86,
+ "avgMs": 163.19,
+ "minMs": 161.89,
+ "maxMs": 164.86,
+ "samplesMs": [
+ 163.01,
+ 163.73,
+ 164.86,
+ 162.77,
+ 161.89,
+ 163.06,
+ 162.49,
+ 163.16,
+ 163.45,
+ 163.46
+ ]
+ },
+ {
+ "id": "local-bin-esbuild-version-npx-no-install",
+ "group": "local-bin-runner",
+ "runner": "npx --no-install",
+ "runnerKey": "npx-no-install",
+ "scenario": "esbuild-version",
+ "label": "native CLI local bin",
+ "targetBin": "esbuild",
+ "command": {
+ "program": "/Users/tolga/.n/bin/npx",
+ "args": [
+ "--no-install",
+ "esbuild",
+ "--version"
+ ],
+ "display": "/Users/tolga/.n/bin/npx --no-install esbuild --version"
+ },
+ "expectedStdout": "stdout has a line exactly \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 135.83,
+ "p95Ms": 138.92,
+ "avgMs": 136.29,
+ "minMs": 135.27,
+ "maxMs": 138.92,
+ "samplesMs": [
+ 135.66,
+ 138.92,
+ 137.47,
+ 135.65,
+ 136.24,
+ 136,
+ 135.78,
+ 135.27,
+ 135.83,
+ 136.1
+ ]
+ },
+ {
+ "id": "local-bin-esbuild-version-npm-exec",
+ "group": "local-bin-runner",
+ "runner": "npm exec",
+ "runnerKey": "npm-exec",
+ "scenario": "esbuild-version",
+ "label": "native CLI local bin",
+ "targetBin": "esbuild",
+ "command": {
+ "program": "/Users/tolga/.n/bin/npm",
+ "args": [
+ "exec",
+ "--",
+ "esbuild",
+ "--version"
+ ],
+ "display": "/Users/tolga/.n/bin/npm exec -- esbuild --version"
+ },
+ "expectedStdout": "stdout has a line exactly \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 134.59,
+ "p95Ms": 143.53,
+ "avgMs": 136.47,
+ "minMs": 133.99,
+ "maxMs": 143.53,
+ "samplesMs": [
+ 134.51,
+ 134.77,
+ 140.77,
+ 143.53,
+ 139.55,
+ 134.12,
+ 134.59,
+ 134.69,
+ 133.99,
+ 134.18
+ ]
+ },
+ {
+ "id": "local-bin-esbuild-version-bunx-no-install",
+ "group": "local-bin-runner",
+ "runner": "bunx --no-install",
+ "runnerKey": "bunx-no-install",
+ "scenario": "esbuild-version",
+ "label": "native CLI local bin",
+ "targetBin": "esbuild",
+ "command": {
+ "program": "/Users/tolga/.bun/bin/bunx",
+ "args": [
+ "--no-install",
+ "esbuild",
+ "--version"
+ ],
+ "display": "/Users/tolga/.bun/bin/bunx --no-install esbuild --version"
+ },
+ "expectedStdout": "stdout has a line exactly \"0.28.1\"",
+ "status": "pass",
+ "iterations": 10,
+ "p50Ms": 26.41,
+ "p95Ms": 39.17,
+ "avgMs": 27.38,
+ "minMs": 24.78,
+ "maxMs": 39.17,
+ "samplesMs": [
+ 24.91,
+ 24.78,
+ 26.41,
+ 26.85,
+ 26.77,
+ 26.87,
+ 27.89,
+ 39.17,
+ 24.89,
+ 25.22
+ ]
+ }
+ ]
+}
diff --git a/bench/perf-results/readme-run-bin-20260710T141422.md b/bench/perf-results/readme-run-bin-20260710T141422.md
new file mode 100644
index 00000000..c3ef8448
--- /dev/null
+++ b/bench/perf-results/readme-run-bin-20260710T141422.md
@@ -0,0 +1,51 @@
+# lpm run/bin benchmark suite
+
+- Date: `2026-07-10T13:14:24.494Z`
+- Git: `22d20109` on `codex/rewrite-readme` (dirty)
+- Iterations: `10`
+- Warmup iterations: `2`
+- Timeout per command: `30000 ms`
+- Setup: `/Users/tolga/.n/bin/pnpm install --no-frozen-lockfile --config.dangerously-allow-all-builds=true --store-dir /var/folders/p2/32lgcl857ds0wkcnkg0qk51h0000gn/T/lpm-run-bin-bench-gErcPv/project/.pnpm-store`
+- Fixture dependencies: `esbuild 0.28.1`, `typescript 6.0.3`
+- Host: `darwin 25.5.0 arm64`
+- CPU: `Apple M5 Pro (18 logical)`
+
+## Tool versions
+
+| Tool | Available | Version | Binary |
+| --- | --- | --- | --- |
+| lpm | yes | lpm 0.67.0 | /Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs |
+| nub | no | - | nub |
+| nubx | no | - | nubx |
+| node | yes | v22.22.1 | /Users/tolga/.n/bin/node |
+| npm | yes | 10.9.4 | /Users/tolga/.n/bin/npm |
+| npx | yes | 10.9.4 | /Users/tolga/.n/bin/npx |
+| pnpm | yes | 11.3.0 | /Users/tolga/.n/bin/pnpm |
+| bun | yes | 1.3.14 | /Users/tolga/.bun/bin/bun |
+| bunx | yes | 1.3.14 | /Users/tolga/.bun/bin/bunx |
+
+## Methodology
+
+All rows use the same generated project. Dependency installation is setup-only and is not measured; timed rows run only local scripts or already-installed local bins.
+Warm policy: each row runs one correctness check plus 2 unmeasured warmup iteration(s), then records 10 measured iterations without clearing package-manager caches.
+Native CLI and Node CLI local-bin rows are reported separately because wrapper overhead ratios differ once the target process has its own startup cost.
+
+## Results
+
+| Group | Scenario | Runner | Command | Status | Iterations | P50 ms | P95 ms | Avg ms | Min ms | Max ms | Reason |
+| --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |
+| script-runner | noop | lpm run | /Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs run noop | pass | 10 | 9.10 | 9.31 | 9.08 | 8.70 | 9.31 | |
+| script-runner | noop | npm run | /Users/tolga/.n/bin/npm run noop | pass | 10 | 66.94 | 74.91 | 68.29 | 66.19 | 74.91 | |
+| script-runner | noop | pnpm run | /Users/tolga/.n/bin/pnpm run noop | pass | 10 | 153.49 | 155.30 | 153.80 | 152.60 | 155.30 | |
+| script-runner | noop | bun run | /Users/tolga/.bun/bin/bun run noop | pass | 10 | 14.61 | 14.85 | 14.60 | 14.32 | 14.85 | |
+| script-runner | esbuild-version | lpm run | /Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs run esbuild-version | pass | 10 | 20.09 | 20.67 | 20.12 | 19.52 | 20.67 | |
+| script-runner | esbuild-version | npm run | /Users/tolga/.n/bin/npm run esbuild-version | pass | 10 | 78.27 | 81.39 | 78.56 | 77.73 | 81.39 | |
+| script-runner | esbuild-version | pnpm run | /Users/tolga/.n/bin/pnpm run esbuild-version | pass | 10 | 165.44 | 167.42 | 165.56 | 164.43 | 167.42 | |
+| script-runner | esbuild-version | bun run | /Users/tolga/.bun/bin/bun run esbuild-version | pass | 10 | 25.88 | 27.91 | 26.09 | 25.39 | 27.91 | |
+| local-bin-runner | esbuild-version | lpm exec | /Users/tolga/Documents/Projects/lpm-dev/rust-client/target/release/lpm-rs exec esbuild --version | pass | 10 | 16.82 | 17.12 | 16.84 | 16.44 | 17.12 | |
+| local-bin-runner | esbuild-version | pnpm exec | /Users/tolga/.n/bin/pnpm exec esbuild --version | pass | 10 | 163.06 | 164.86 | 163.19 | 161.89 | 164.86 | |
+| local-bin-runner | esbuild-version | npx --no-install | /Users/tolga/.n/bin/npx --no-install esbuild --version | pass | 10 | 135.83 | 138.92 | 136.29 | 135.27 | 138.92 | |
+| local-bin-runner | esbuild-version | npm exec | /Users/tolga/.n/bin/npm exec -- esbuild --version | pass | 10 | 134.59 | 143.53 | 136.47 | 133.99 | 143.53 | |
+| local-bin-runner | esbuild-version | bunx --no-install | /Users/tolga/.bun/bin/bunx --no-install esbuild --version | pass | 10 | 26.41 | 39.17 | 27.38 | 24.78 | 39.17 | |
+
+Skipped rows mean the comparison tool or optional shorthand was unavailable in this environment.
diff --git a/bench/scripts/README.md b/bench/scripts/README.md
index 8ad2f2ec..7ee0f98f 100644
--- a/bench/scripts/README.md
+++ b/bench/scripts/README.md
@@ -9,7 +9,7 @@ not for one-off hand-timed installs.
It provides:
- isolated temp project, `HOME`, package-manager cache, and `LPM_HOME`
-- cold mode and warm-cache mode
+- cold, warm-cache, and up-to-date modes
- round-robin interleaving by sample to reduce live-network bias
- configurable sample count, fixtures, package managers, lpm routes, lpm firewall modes, and lpm env cells
- JSON, Markdown, stdout/stderr, resolved fixture source, and per-run metrics artifacts
@@ -21,6 +21,9 @@ project install artifacts before the counted run. That means warm numbers are
cache/store-warm clean-project reinstalls, not repeat no-op installs over an
already materialized `node_modules`.
+Up-to-date mode runs one more install over the project materialized by the
+previous successful install, so it measures the no-op state check.
+
Build lpm first:
```bash
@@ -33,14 +36,14 @@ Run the harness self-test after changing warning or summary logic:
node bench/scripts/run-install-readiness.mjs --self-test
```
-Capture the current lpm cold/warm reference first:
+Capture the current lpm cold/warm/up-to-date reference first:
```bash
node bench/scripts/run-install-readiness.mjs \
--samples 10 \
--fixtures dogfood,nest,vitepress \
--managers lpm \
- --modes cold,warm
+ --modes cold,warm,up-to-date
```
Capture a one-off firewall-enabled reference without paying that cost on every
@@ -51,7 +54,7 @@ node bench/scripts/run-install-readiness.mjs \
--samples 1 \
--fixtures dogfood,nest,vitepress \
--managers lpm \
- --modes cold,warm \
+ --modes cold,warm,up-to-date \
--lpm-firewall-modes off,report
```
@@ -65,7 +68,8 @@ node bench/scripts/run-install-readiness.mjs \
--samples 5 \
--fixtures dogfood,nest,vitepress \
--managers lpm,bun,pnpm,npm \
- --modes cold
+ --modes cold,warm,up-to-date \
+ --lpm-firewall-modes off,report
```
Compare one candidate lpm knob against current lpm:
@@ -75,7 +79,7 @@ node bench/scripts/run-install-readiness.mjs \
--samples 10 \
--fixtures dogfood,nest,vitepress \
--managers lpm \
- --modes cold,warm \
+ --modes cold,warm,up-to-date \
--lpm-cell current \
--lpm-cell cap:LPM_V2_FINALIZE_PERMITS=2
```
@@ -124,10 +128,10 @@ Fixture names built in today:
The harness also accepts `name=/path/to/project` and `pkg:@`
fixtures for focused checks and top-package sweeps.
-`vitepress` prefers the local real-world audit cache at
-`bench/realworld-audit/.cache/vitepress-docs` when present, because that is
-the full heavy graph used by the recent installer measurements. If the cache
-is absent, the harness falls back to a generated VitePress install fixture.
+`vitepress` prefers `bench/fixtures/vitepress-docs`, a tracked manifest-only
+fixture derived from the VitePress 1.5.0 repository. If that fixture is absent,
+the harness checks the local real-world audit cache and then falls back to a
+generated VitePress install fixture.
For production-default decisions, keep competitor and firewall-enabled runs as
reference snapshots. Legacy proxy routes remain available for focused routing
diff --git a/bench/scripts/run-install-readiness.mjs b/bench/scripts/run-install-readiness.mjs
index 9c0d1a35..3914c452 100755
--- a/bench/scripts/run-install-readiness.mjs
+++ b/bench/scripts/run-install-readiness.mjs
@@ -36,7 +36,10 @@ const BUILTIN_FIXTURES = new Map([
[
'vitepress',
{
- pathCandidates: ['bench/realworld-audit/.cache/vitepress-docs'],
+ pathCandidates: [
+ 'bench/fixtures/vitepress-docs',
+ 'bench/realworld-audit/.cache/vitepress-docs',
+ ],
packageJson: {
name: 'readiness-vitepress-install',
version: '1.0.0',
@@ -212,7 +215,8 @@ function runInstallSpec({ sample, fixture, spec, modes }) {
const shouldMeasureCold = modes.includes('cold');
const shouldMeasureWarm = modes.includes('warm');
- let warmSeedOk = true;
+ const shouldMeasureUpToDate = modes.includes('up-to-date');
+ let installedOk = true;
if (shouldMeasureCold) {
const row = measureInstall({
@@ -226,8 +230,8 @@ function runInstallSpec({ sample, fixture, spec, modes }) {
phase: 'cold',
});
rowsForSpec.push(row);
- warmSeedOk = row.exit_code === 0 && !row.parse_error;
- } else if (shouldMeasureWarm) {
+ installedOk = row.exit_code === 0 && !row.parse_error;
+ } else if (shouldMeasureWarm || shouldMeasureUpToDate) {
const row = measureInstall({
sample,
fixture,
@@ -240,22 +244,51 @@ function runInstallSpec({ sample, fixture, spec, modes }) {
counted: false,
});
rowsForSpec.push(row);
- warmSeedOk = row.exit_code === 0 && !row.parse_error;
+ installedOk = row.exit_code === 0 && !row.parse_error;
}
if (shouldMeasureWarm) {
- if (warmSeedOk) {
+ if (installedOk) {
cleanProject(projectDir);
+ const row = measureInstall({
+ sample,
+ fixture,
+ spec,
+ mode: 'warm',
+ projectDir,
+ env,
+ runDir,
+ phase: 'warm',
+ });
+ rowsForSpec.push(row);
+ installedOk = row.exit_code === 0 && !row.parse_error;
+ } else {
rowsForSpec.push(
- measureInstall({
+ recordSkippedInstall({
sample,
fixture,
spec,
mode: 'warm',
+ runDir,
+ phase: 'warm',
+ reason: 'previous install failed',
+ }),
+ );
+ }
+ }
+
+ if (shouldMeasureUpToDate) {
+ if (installedOk) {
+ rowsForSpec.push(
+ measureInstall({
+ sample,
+ fixture,
+ spec,
+ mode: 'up-to-date',
projectDir,
env,
runDir,
- phase: 'warm',
+ phase: 'up-to-date',
}),
);
} else {
@@ -264,10 +297,10 @@ function runInstallSpec({ sample, fixture, spec, modes }) {
sample,
fixture,
spec,
- mode: 'warm',
+ mode: 'up-to-date',
runDir,
- phase: 'warm',
- reason: 'seed install failed',
+ phase: 'up-to-date',
+ reason: 'previous install failed',
}),
);
}
@@ -754,6 +787,11 @@ function buildEnv({ homeDir, lpmHome, spec }) {
function materializeFixture(fixture, projectDir) {
if (fixture.path) {
fs.cpSync(fixture.path, projectDir, { recursive: true });
+ const fixtureNpmrc = path.join(projectDir, 'fixture.npmrc');
+ const npmrc = path.join(projectDir, '.npmrc');
+ if (fs.existsSync(fixtureNpmrc) && !fs.existsSync(npmrc)) {
+ fs.copyFileSync(fixtureNpmrc, npmrc);
+ }
return;
}
fs.mkdirSync(projectDir, { recursive: true });
@@ -1176,7 +1214,7 @@ function parseEnvAssignments(raw) {
function parseModes(raw) {
const modes = parseList(raw, '--modes');
for (const mode of modes) {
- if (!['cold', 'warm'].includes(mode)) {
+ if (!['cold', 'warm', 'up-to-date'].includes(mode)) {
throw new Error(`unsupported mode: ${mode}`);
}
}
@@ -1531,6 +1569,20 @@ function isWarningLikeLine(line) {
}
function runSelfTests() {
+ assert.deepEqual(parseModes('cold,warm,up-to-date'), ['cold', 'warm', 'up-to-date']);
+ assert.throws(() => parseModes('repeat'), /unsupported mode/);
+ const npmrcFixtureRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'lpm-readiness-self-test-'));
+ try {
+ const sourceDir = path.join(npmrcFixtureRoot, 'source');
+ const projectDir = path.join(npmrcFixtureRoot, 'project');
+ fs.mkdirSync(sourceDir, { recursive: true });
+ fs.writeFileSync(path.join(sourceDir, 'package.json'), '{"name":"fixture","version":"1.0.0"}\n');
+ fs.writeFileSync(path.join(sourceDir, 'fixture.npmrc'), 'shell-emulator=true\n');
+ materializeFixture({ path: sourceDir }, projectDir);
+ assert.equal(fs.readFileSync(path.join(projectDir, '.npmrc'), 'utf8'), 'shell-emulator=true\n');
+ } finally {
+ removeTree(npmrcFixtureRoot);
+ }
assert.deepEqual(parseLpmFirewallModes('off,enabled,report'), ['off', 'enforce', 'report']);
assert.throws(() => parseLpmFirewallModes('enabled,enforce'), /duplicate lpm firewall mode/);
const firewallSpecs = buildRunSpecs(
@@ -1909,7 +1961,7 @@ Options:
--top-npm-offset N Zero-based package offset for chunked top-N sweeps
--top-npm-limit N Maximum packages from --top-npm-file
--managers LIST lpm,bun,pnpm,npm (default: lpm)
- --modes LIST cold,warm (default: cold)
+ --modes LIST cold,warm,up-to-date (default: cold)
--lpm-routes LIST direct,proxy for lpm runs (default: direct)
--lpm-firewall-modes LIST
off,report,enforce for lpm runs (default: off)
@@ -1928,8 +1980,8 @@ Options:
-h, --help Show this help
Examples:
- # Current lpm cold/warm reference.
- node bench/scripts/run-install-readiness.mjs --samples 10 --modes cold,warm
+ # Current lpm cold/warm/up-to-date reference.
+ node bench/scripts/run-install-readiness.mjs --samples 10 --modes cold,warm,up-to-date
# One-off firewall-enabled reference without fail-closed auth.
node bench/scripts/run-install-readiness.mjs --samples 1 --lpm-firewall-modes off,report
diff --git a/npm/cli/README.md b/npm/cli/README.md
index 879a63c3..f4b84e30 100644
--- a/npm/cli/README.md
+++ b/npm/cli/README.md
@@ -3,7 +3,7 @@
Fast, secure, all-in-one package manager written in Rust.
```bash
-npm install -g @lpm-registry/cli
+npm install -g @lpm-registry/cli --allow-scripts=@lpm-registry/cli
```
This package is the npm gateway for the native LPM CLI. It installs a small
@@ -38,8 +38,12 @@ with optional dependencies enabled:
npm install -g @lpm-registry/cli
```
-If install scripts were disabled, reinstall without `--ignore-scripts` so npm
-can validate the native binary during installation.
+If your npm policy blocks install scripts, allow LPM's installer script so npm
+can validate the native binary during installation:
+
+```bash
+npm install -g @lpm-registry/cli --allow-scripts=@lpm-registry/cli
+```
Other install methods are documented at
[github.com/lpm-dev/rust-client](https://github.com/lpm-dev/rust-client).