pnpm-workspace.yaml lists: apps/*, packages/<category>/<name>, services/*. The rules on this page apply to all of them. Kind-specific shape lives on Packages, Services and Apps.
Required files
Every member has the files below;LICENSE is for packages and tooling only.
A member with a build or tests also carries
vitest.config.ts (extends a @stackra/vitest-config preset) and tsdown.config.ts (when build is tsdown), each starting with the file contract. All source lives in src/.
The PII table
AGENTS.md always has a ## PII section with the columns Data, Where, Handling. A member that handles no personal data says so and names the change that would make it revisit the answer:
package.json
Key order:
name, version, private, description, license, files, type, main (Expo only), sideEffects, imports, exports, scripts, dependencies, devDependencies. Order is convention, not checked.
turbo.jsonc and tiers
The tag matches the directory:
The direction rule is a law: see Boundaries and ADR 0003.
Kinds
Scaffolding
pnpm new <kind> <name> [--category <c>] [--entries <list>|none] [--description "<text>"] [--title "<Title>"] [--port <n>] [--repo <path>] [--dry-run] copies a template from tools/scaffold/templates, replaces the tokens, copies the target repo’s LICENSE (packages and tooling only), and formats the result. Then run pnpm install and pnpm verify.
What enforces this
Run it directly with
node tools/scripts/validate-repository.mjs; it prints nothing when clean.