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.