Use this skill for all monorepo tasks: Nx and Turborepo setup and configuration, workspace dependency graphs, package versioning with Changesets, build caching strategy, cross-app type sharing, shared config packages, affected-build pipelines, and workspace tooling. Also covers polyrepo-to-monorepo migration. Triggers: "monorepo", "Nx", "Turborepo", "workspace", "pnpm workspace", "Changesets", "affected", "build cache", "cross-app types", "shared packages", "package versioning", "lerna", "polyrepo to monorepo".
Monorepos done wrong become slower and harder to maintain than the polyrepos they replaced. This skill ensures monorepos are set up with correct build caching, clean dependency graphs, automated versioning, and CI pipelines that only rebuild what changed — so scale doesn't kill developer velocity.
# Detect monorepo tooling
cat package.json 2>/dev/null | python3 -c "
import json, sys
d = json.load(sys.stdin)
tools = []
all_deps = {**d.get('dependencies',{}), **d.get('devDependencies',{})}
if 'nx' in all_deps: tools.append('Nx')
if 'turbo' in all_deps or 'turborepo' in all_deps: tools.append('Turborepo')
if 'lerna' in all_deps: tools.append('Lerna (legacy)')
if d.get('workspaces'): tools.append(f\"npm/yarn workspaces: {d['workspaces']}\")
print('Monorepo tools:', tools or ['none detected'])
"
cat pnpm-workspace.yaml 2>/dev/null && echo "pnpm workspace found"
ls nx.json turbo.json lerna.json 2>/dev/null
# List all packages/apps
find . -name "package.json" \
| grep -v "node_modules\|dist\|build\|coverage" \
| xargs grep -l '"name"' \
| while read f; do
name=$(python3 -c "import json; d=json.load(open('$f')); print(d.get('name','?'))")
echo "$name ($f)"
done | sort
# Package dependency graph
npx nx graph 2>/dev/null & # opens browser
turbo run build --dry=json 2>/dev/null | python3 -m json.tool | head -60
Directory structure:
myapp/
├── apps/
│ ├── web/ # Next.js frontend
│ ├── api/ # Express/Fastify backend
│ └── admin/ # Admin panel
│
├── packages/
│ ├── ui/ # shared React component library
│ ├── types/ # shared TypeScript types
│ ├── utils/ # shared utility functions
│ ├── config/ # shared configs (tsconfig, eslint, jest)
│ │ ├── tsconfig/
│ │ ├── eslint-config/
│ │ └── jest-config/
│ └── database/ # Prisma schema + client (shared)
│
├── turbo.json # pipeline config
├── pnpm-workspace.yaml
└── package.json # root — dev tooling only
pnpm-workspace.yaml: