vercel/turbo: crates, packages and examples together
Turborepo has no scripts that check its layout. This config checks its 61 crates, 17 packages and 29 examples together, and found crates without a README, packages without their own LICENSE and an example the example runner skips. This config was written to test alint; Turborepo doesn't use alint.
What alint found
- id: turbo-crate-has-readme
kind: for_each_dir
select: "crates/*"
when_iter: 'iter.has_file("Cargo.toml")'
require:
- kind: file_exists
paths: "{path}/README.md"
level: warning
- id: turbo-package-has-license
kind: for_each_dir
select: "packages/*"
when_iter: 'iter.has_file("package.json")'
require:
- kind: file_exists
paths: "{path}/LICENSE"
level: warning⚠︎ warning turbo-crate-has-readme
Nine crates have no README.
⚠︎ warning turbo-package-has-license
Eight of the 17 packages have no LICENSE of their own. npm pack doesn't include the root one.
- id: turbo-example-has-meta-json
kind: for_each_dir
select: "examples/*"
when_iter: 'iter.has_file("package.json")'
require:
- kind: file_exists
paths: "{path}/meta.json"
level: error✗ error turbo-example-has-meta-json
The with-microfrontends example has no meta, so the example runner skips it.
The bundled GitHub Actions rules (alint 0.16.1, on the workflows as of 7 May 2026) flag 2 action references not pinned to a commit, both in docs-alias-failure-notification.
The config
Turborepo is a Rust workspace with 61 crates next to a pnpm workspace with 17 packages, plus 29 examples, each a project of its own. The config checks a README and the workspace lints in every crate, a README, LICENSE and repository directory in every package, and the files each example needs. The Rust and JavaScript tools run from command_ rules.
- id: turbo-workspace-members-resolve
kind: registry_paths_resolve
source: Cargo.toml
extract:
toml: "$.workspace.members[*]"
base: "."
entries_are_globs: true
expect: dir
level: errorEvery entry in the root Cargo's [workspace].members, globs included, has to match at least one directory.
What stays outside alint
What runs code or reads the pull request stays with Turborepo's tools:
- the example runner, attw's check of each package's type exports, and the docs build;
- Clippy, oxlint and cargo-deny, which keep their own analysis; alint only runs them;
- the release guard and the pull-request title check, which read the pull request itself;
- the package versions, which the release workflow sets. After each stable release
versionmoves on to the next canary while the packages keep the released version, so no rule can require the two to match;.txt - matching a crate's directory with its name, such as turborepo-paths, published as turbopath. No rule kind does that yet.