Skip to content

monorepo@v1

Hygiene checks for repositories that host multiple packages under common subdirectories (packages/*, crates/*, apps/*, services/*). Language-agnostic about the packages themselves — pair with rust@v1 / node@v1 / etc. when you know the ecosystem.

Conventions:

  • packages/* is the npm / JS convention — each entry should have a package.json and a README.md.
  • crates/* is the Rust workspace convention — each entry should have a Cargo.toml and a README.md.
  • apps/* and services/* are polyglot buckets — README required, manifest optional (no universal convention).
extends:
- alint://bundled/monorepo@v1

4 rules. Each links to its section below, which explains the check and shows its definition.

RuleReports
monorepo-packages-have-readme
warning
Every monorepo package directory should have a README.md.
monorepo-packages-have-package-json
error
Every packages/* entry should have a package.json.
monorepo-crates-have-cargo-toml
error
Every crates/* entry should have a Cargo.toml.
monorepo-unique-package-names
warning
Package-directory basenames should be unique across the monorepo.

{a,b,c} brace alternation in globs matches any of the listed directories, so this fires for each entry under any of the four common monorepo layout roots.

Every monorepo package directory should have a README.md.

- id: monorepo-packages-have-readme
kind: for_each_dir
select: "{packages,crates,apps,services}/*"
level: warning
message: "Every monorepo package directory should have a README.md."
require:
- kind: file_exists
paths: "{path}/README.md"

monorepo-packages-have-package-json

Section titled "monorepo-packages-have-package-json"

Every packages/* entry should have a package.json.

- id: monorepo-packages-have-package-json
kind: for_each_dir
select: "packages/*"
level: error
message: "Every `packages/*` entry should have a package.json."
require:
- kind: file_exists
paths: "{path}/package.json"

Every crates/* entry should have a Cargo.toml.

- id: monorepo-crates-have-cargo-toml
kind: for_each_dir
select: "crates/*"
level: error
message: "Every `crates/*` entry should have a Cargo.toml."
require:
- kind: file_exists
paths: "{path}/Cargo.toml"

A package directory name should be globally unique so tooling and contributors can refer to a package unambiguously.

Package-directory basenames should be unique across the monorepo.

- id: monorepo-unique-package-names
kind: unique_by
select: "{packages,crates,apps,services}/*"
key: "{basename}"
level: warning
message: "Package-directory basenames should be unique across the monorepo."

Every rule here can be overridden by id from your own .alint.yml: change its level, or set level: off to drop it. An id that doesn't exist is an error at config load, so a typo can't silently pass.

extends:
- alint://bundled/monorepo@v1
rules:
- id: monorepo-packages-have-readme
level: off
- id: monorepo-unique-package-names
level: error

To take only part of the ruleset, filter it where you extend it with only: or except::

extends:
- url: alint://bundled/monorepo@v1
except: [monorepo-packages-have-readme]

Bundled rulesets covers versioning and how rulesets combine.

The full ruleset definition, comments included, is committed at crates/alint-dsl/rulesets/v1/monorepo.yml in the alint repo.