CLAUDE.md for Monorepos
Keep agents oriented across packages with scoped commands and ownership rules.
A CLAUDE.md template for monorepos (Turborepo/Nx/pnpm workspaces): the package map, scoped build/test commands, cross-package change rules, and how to keep an agent from rebuilding the world when it only touched one package.
The template
# CLAUDE.md ## Project [Company] monorepo — pnpm workspaces + Turborepo. ## Package map - `apps/web` — customer-facing Next.js app - `apps/admin` — internal admin (Vite + React) - `apps/api` — Fastify API - `packages/ui` — shared component library (used by web + admin) - `packages/config` — shared tsconfig/eslint — changes here affect EVERYTHING - `packages/db` — Prisma schema + client — the only package allowed to talk to the database ## Commands (always scope to the package) ```bash pnpm --filter web dev # run one app pnpm --filter web test # test one package pnpm turbo run build --filter=web... # build web + its dependencies pnpm turbo run test --filter=[HEAD^] # test only what changed ``` Never run bare `pnpm build` / `pnpm test` at the root during iteration — it builds the world. ## Cross-package rules - Importing between packages: ONLY via workspace deps declared in package.json — never relative paths across package boundaries (`../../packages/ui/src` is banned) - Changing `packages/ui` or `packages/config`: run the affected-tests command for ALL dependents before finishing - `packages/db` schema changes follow the migration process in packages/db/CLAUDE.md - New shared code: goes in an existing package if one fits; creating a new package requires asking first ## Per-package conventions Each app/package may have its own CLAUDE.md with local rules — READ IT before working in that package. This file covers only repo-wide rules. ## Don't - Don't hoist dependencies to the root to fix a resolution issue — fix the package's own manifest - Don't edit generated files (`*.gen.ts`, prisma client output) - Don't bump shared dependency versions in one package only — keep versions aligned via the catalog ## Verification Definition of done: `pnpm turbo run lint typecheck test --filter=[your changes]...` passes, including dependents of anything shared you touched.
How to use
- 1Copy to the monorepo root; write the real package map — it's the section agents use most.
- 2Add thin per-package CLAUDE.md files for local rules; the root file's job is orientation and cross-package safety.
- 3The scoped-commands section pays for itself immediately in iteration speed.
Examples
Shared package change done right
Input
Agent asked to change a Button prop in packages/ui.
Output
Agent updates the prop, greps both apps for usages, updates the 7 call sites in apps/web and 2 in apps/admin, then runs `turbo run test --filter=...^ui` covering all dependents — instead of shipping a green ui package that breaks both apps.
Pro tips
- Keep the package map current — a stale map is worse than none because agents trust it.
Frequently asked questions
Root CLAUDE.md vs per-package files — what goes where?+
Root: the package map, scoped commands, and cross-package rules. Per-package: stack-specific conventions (the web app's component rules, the API's error handling). Agents read the root file plus the package file for wherever they're working.