pnpm/pnpm

pnpm replaces 13 cross-package field invariants enforced by an in-tree 470-line meta-updater plugin — alint covers 11 of them declaratively today, no plugin install required.

Narrative
Catches conventions your pipeline assumes but doesn't verify
Rules
112
Last revalidated
Engineering reference
README on GitHub · .alint.yml

Why this case study matters

pnpm IS the canonical pnpm-workspace monorepo: 169 packages spread across ~50 functional root directories (cache/, cli/, store/, engine/pm/, installing/dedupe/, deps/compliance/, etc.) rather than the usual packages/* flat layout. Whatever convention pnpm enforces on itself becomes the reference shape for the hundreds of downstream TS/JS monorepos that copy it. The pnpm package itself ships ~16M weekly downloads at the time of capture; showing alint configures cleanly against the pnpm reference itself gives instant credibility with the JS/TS audience — and makes examples/pnpm-pnpm/.alint.yml a literal copy-paste starter for any downstream pnpm-workspace user.

Headline catch

pnpm keeps its 169 packages in lock-step through .meta-updater/ — a 470-line in-tree TypeScript plugin (@pnpm-private/updater) backed by @pnpm/meta-updater. The plugin enforces 13 distinct cross-package field invariants on every install: license, funding, bugs, engines.node, type, homepage, repository, keywords, dependencies sort order, the catalog: remap, the workspace:* remap, the scripts.lint/scripts.test/scripts.compile shape, and a per-package tsconfig.json#references tree derived from pnpm-lock.yaml.

Alint covers 11 of those 13 invariants today by asserting against the expected literal value — close enough that catching drift on a new package is a one-line PR for alint vs. requiring contributors to install + run the meta-updater plugin locally. The remaining two (catalog-completeness, internal/external dep remap) close once cross_file_value_equals ships in v0.10.

This is the “hand-rolled cross-package field-sync plugin” data point — alongside microsoft/typescript (frozen, meticulously curated) and apache/airflow (109-hook pre-commit pipeline). pnpm pushed cross_file_value_equals past saturation: the 8th of 10 confirmed sources (airflow, tokio, clap, uv, react, pnpm, nodejs/node, pytorch, vscode, istio).

Where alint earns its keep here

Future story angles

The factual engineering writeup (tooling inventory, mapping table, gap catalogue, validation status footer) lives in the public alint repo at github.com/asamarts/alint/tree/main/examples/pnpm-pnpm/README.md.