Skip to main content
skill CX Codex

turborepo-monorepo — Claude Code skill: Turborepo setup guide

A skill that walks your agent through Turborepo: workspaces, turbo.json tasks, test pipelines and build caching.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add giuseppe-trisciuoglio/developer-kit --skill turborepo-monorepo -a claude-code
Open on GitHub

What turborepo-monorepo does

The skill hands your agent a working playbook for Turborepo monorepos: creating a workspace, configuring turbo.json tasks with dependencies and outputs, wiring Next.js and NestJS apps, Vitest and Jest pipelines, CI/CD, and Vercel remote caching. It ships as step-by-step sections with commands and config snippets, plus reference files for Next.js, NestJS, testing and CI/CD.

Task properties get their own tables: dependsOn, outputs, inputs, env, cache, persistent, outputLogs. Dependency patterns and filter syntax are covered too, including [HEAD^] for packages changed since the last commit. For parallel type checking the skill suggests a transit node, because without it the cache stops behaving the way you expect.

Remote caching needs a Vercel login: npx turbo login, then npx turbo link to connect the repo. Before CI, run turbo run build --dry-run to see task order and which packages are affected. The troubleshooting section opens with cache misses on unchanged files, which is your cue to review globalDependencies and inputs.

What it helps with

  • scaffold a Turborepo workspace or add turbo to an existing project
  • define build, lint and test tasks in turbo.json
  • set up a Vitest or Jest pipeline with working cache keys
  • build a GitHub Actions workflow that only touches affected packages
  • connect Vercel remote cache and debug cache misses

Example prompts for the agent

  • Create a Turborepo workspace and configure turbo.json for build, lint and test
  • Add a typecheck task using a transit node
  • Set up GitHub Actions so only packages changed since the last commit get built

How to install turborepo-monorepo

1Skills CLI (Vercel)

npx skills add giuseppe-trisciuoglio/developer-kit --skill turborepo-monorepo -a claude-code

2Manually: put the files in place

~/.claude/skills/turborepo-monorepo/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/turborepo-monorepo/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about turborepo-monorepo

How do I install turborepo-monorepo in Claude?

Run npx skills add giuseppe-trisciuoglio/developer-kit --skill turborepo-monorepo -a claude-code. The skill lands at ~/.claude/skills/turborepo-monorepo/SKILL.md.

What does turborepo-monorepo do?

It guides your agent through Turborepo monorepo setup: workspaces, turbo.json tasks, Next.js and NestJS integration, tests, CI/CD and remote caching.

What do I need for remote caching?

A Vercel account. The skill suggests npx turbo login first, then npx turbo link to connect the repository.

Source text

SKILL.md · MIT
---
name: turborepo-monorepo
description: Provides comprehensive Turborepo monorepo management guidance for TypeScript/JavaScript projects. Use when creating Turborepo workspaces, configuring turbo.json tasks, setting up Next.js/NestJS apps, managing test pipelines (Vitest/Jest), configuring CI/CD, implementing remote caching, or optimizing build performance in monorepos
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
---

# Turborepo Monorepo

## Overview

Provides guidance for Turborepo monorepo management: workspace creation, `turbo.json` task configuration, Next.js/NestJS integration, testing pipelines (Vitest/Jest), CI/CD setup, and build performance optimization.

## When to Use

- Create or initialize Turborepo workspaces
- Configure `turbo.json` tasks with dependencies and outputs
- Set up Next.js/NestJS apps in monorepo structure
- Configure Vitest/Jest test pipelines
- Build CI/CD workflows (GitHub Actions, GitLab CI)
- Implement remote caching with Vercel Remote Cache
- Optimize build times and cache hit ratios
- Debug task dependency or cache issues
- Migrate from other monorepo tools to Turborepo

## Instructions

### Workspace Creation

1. **Create a new workspace:**
   ```bash
   pnpm create turbo@latest my-workspace
   cd my-workspace
   ```

2. **Initialize in existing project:**
   ```bash
   pnpm add -D -w turbo
   ```

3. **Create turbo.json in root** (minimal config):
   ```json
   {
     "$schema": "https://turborepo.dev/schema.json",
     "pipeline": {
       "build": { "dependsOn": ["^build"], "outputs": ["dist/**", ".next/**"] },
       "lint": { "outputs": [] },
       "test": { "dependsOn": ["build"], "outputs": ["coverage/**"] }
     }
   }
   ```

4. **Add scripts to root package.json:**
   ```json
   { "scripts": { "build": "turbo run build", "dev": "turbo run dev", "lint": "turbo run lint", "test": "turbo run test", "clean": "turbo run clean" } }
   ```

5. **Validate task graph before CI:**
   ```bash
   turbo run build --dry-run --filter=...  # Verify task execution order
   ```

### Task Configuration

1. **Configure tasks** in `turbo.json`:
   ```json
   { "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] }, "test": { "dependsOn": ["build"], "outputs": ["coverage/**"] }, "lint": { "outputs": [] } } }
   ```

2. **Run tasks:**
   ```bash
   turbo run build                      # All packages
   turbo run lint test build           # Multiple tasks
   turbo run build --filter=web       # Specific package
   ```

3. **Parallel type checking** (use transit nodes to avoid cache issues):
   ```json
   { "pipeline": { "transit": { "dependsOn": ["^transit"] }, "typecheck": { "dependsOn": ["transit"] } } }
   ```

4. **Validate before committing:**
   ```bash
   turbo run build --dry-run  # Check task order and affected packages
   ```

### Framework Integration

**Next.js:** outputs `".next/**"` and env `["NEXT_PUBLIC_*"]` - See [references/nextjs-config.md](references/nextjs-config.md)

**NestJS:** outputs `"dist/**"`, dev tasks with `cache: false, persistent: true` - See [references/nestjs-config.md](references/nestjs-config.md)

### Testing Setup

1. **Vitest configuration:**
   ```json
   {
     "pipeline": {
       "test": {
         "outputs": [],
         "inputs": ["$TURBO_DEFAULT$", "vitest.config.ts"]
       },
       "test:watch": {
         "cache": false,
         "persistent": true
       }
     }
   }
   ```

2. **Run affected tests:**
   ```bash
   turbo run test --filter=[HEAD^]
   ```
   See [references/testing-config.md](references/testing-config.md) for complete testing setup.

### Package Configurations

1. **Create package-specific turbo.json:**
   ```json
   {
     "extends": ["//"],
     "tasks": {
       "build": {
         "outputs": ["$TURBO_EXTENDS$", ".next/**"]
       }
     }
   }
   ```
   See [references/package-configs.md](references/package-configs.md) for detailed package configuration patterns.

### CI/CD Setup

1. **GitHub Actions with validation checkpoints:**
   ```yaml
   - name: Install dependencies
     run: pnpm install

   - name: Validate affected packages (dry-run)
     run: pnpm turbo run build --filter=[HEAD^] --dry-run
     # VALIDATE: Review output to confirm only expected packages will build

   - name: Run tests
     run: pnpm run test --filter=[HEAD^]

   - name: Build affected packages
     run: pnpm run build --filter=[HEAD^]

   - name: Verify cache hits
     run: pnpm turbo run build --filter=[HEAD^] --dry-run | grep "Cache"
     # VALIDATE: Confirm cache hits for unchanged packages
   ```

2. **Remote cache setup:**
   ```bash
   # Login to Vercel
   npx turbo login

   # Link repository
   npx turbo link
   ```
   See [references/ci-cd.md](references/ci-cd.md) for complete CI/CD setup examples.

## Task Properties Reference

| Property | Description | Example |
|----------|-------------|---------|
| `dependsOn` | Tasks that must complete first | `["^build"]` - dependencies first |
| `outputs` | Files/folders to cache | `["dist/**"]` |
| `inputs` | Files for cache hash | `["src/**/*.ts"]` |
| `env` | Environment variables affecting hash | `["DATABASE_URL"]` |
| `cache` | Enable/disable caching | `true` or `false` |
| `persistent` | Long-running task | `true` for dev servers |
| `outputLogs` | Log verbosity | `"full"`, `"new-only"`, `"errors-only"` |

### Dependency Patterns

- `^task` - Run task in dependencies first (topological order)
- `task` - Run task in same package first
- `package#task` - Run specific package's task

### Filter Syntax

| Filter | Description |
|--------|-------------|
| `web` | Only web package |
| `web...` | web + all dependencies |
| `...web` | web + all dependents |
| `...web...` | web + deps + dependents |
| `[HEAD^]` | Packages changed since last commit |
| `./apps/*` | All packages in apps/ |

## Best Practices

### Performance Optimization

1. **Use specific outputs** - Only cache what's needed
2. **Fine-tune inputs** - Exclude files that don't affect output
3. **Transit nodes** - Enable parallel type checking
4. **Remote cache** - Share cache across team/CI
5. **Package configurations** - Customize per-package behavior

### Caching Strategy

```json
{
  "pipeline": {
    "build": {
      "outputs": ["dist/**"],
      "inputs": ["$TURBO_DEFAULT$", "!README.md", "!**/*.md"]
    }
  }
}
```

### Task Organization

- **Independent tasks** - No `dependsOn`: lint, format, spellcheck
- **Build tasks** - `dependsOn: ["^build"]`: build, compile
- **Test tasks** - `dependsOn: ["build"]`: test, e2e
- **Dev tasks** - `cache: false, persistent: true`: dev, watch

## Common Issues

### Tasks not running in order

**Problem:** Tasks execute in wrong order

**Solution:** Check `dependsOn` configuration

```json
{
  "build": {
    "dependsOn": ["^build"]
  }
}
```

### Cache misses on unchanged files

**Problem:** Cache invalidating unexpectedly

**Solution:** Review `globalDependencies` and `inputs`

```json
{
  "globalDependencies": ["tsconfig.json"],
  "pipeline": {
    "build": {
      "inputs": ["$TURBO_DEFAULT$", "!*.md"]
    }
  }
}
```

### Type errors after cache hit

**Problem:** TypeScript errors not caught due to cache

**Solution:** Use transit nodes for type checking

```json
{
  "transit": { "dependsOn": ["^transit"] },
  "typecheck": { "dependsOn": ["transit"] }
}
```

## Examples

### Example 1: Create New Workspace

**Input:** "Create a Turborepo with Next.js and NestJS"

```bash
pnpm create turbo@latest my-workspace
cd my-workspace

# Add Next.js app
pnpm add next react react-dom -F apps/web

# Add NestJS API
pnpm add @nestjs/core @nestjs/common -F apps/api
```

### Example 2: Configure Testing Pipeline

**Input:** "Set up Vitest for all packages"

```json
{
  "pipeline": {
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"],
      "inputs": ["$TURBO_DEFAULT$", "vitest.config.ts"]
    },
    "test:watch": {
      "cache": false,
      "persistent": true
    }
  }
}
```

### Example 3: Run Affected Tests in CI

**Input:** "Only test changed packages in CI"

```bash
pnpm run test --filter=[HEAD^]
```

### Example 4: Debug Cache Issues

**Input:** "Why is my cache missing?"

```bash
# Dry run to see what would be executed
turbo run build --dry-run --filter=web

# Show hash inputs
turbo run build --force --filter=web
```

## Constraints and Warnings

- **Node.js 18+** is required for Turborepo
- **Package manager field** required in root `package.json`
- **Outputs must be specified** for caching to work
- **Persistent tasks** cannot have dependents
- **Windows**: WSL or Git Bash recommended
- **Remote cache** requires Vercel account or self-hosted solution
- **Large monorepos** may need increased `concurrency` settings

## Reference Files

For detailed guidance on specific topics, consult:

| Topic | Reference File |
|-------|----------------|
| turbo.json template | [references/turbo.json](references/turbo.json) |
| Next.js integration | [references/nextjs-config.md](references/nextjs-config.md) |
| NestJS integration | [references/nestjs-config.md](references/nestjs-config.md) |
| Vitest/Jest/Playwright | [references/testing-config.md](references/testing-config.md) |
| GitHub/CircleCI/GitLab CI | [references/ci-cd.md](references/ci-cd.md) |
| Package configurations | [references/package-configs.md](references/package-configs.md) |

© giuseppe-trisciuoglio · MIT · giuseppe-trisciuoglio/developer-kit

Similar skills

Everything for DevOps and infrastructure →

From the same set93

spring-boot-rest-api-standards Enforces REST API design standards for Spring Boot, covering URL structure, DTO validation, status codes, and global exception handling. CX Codex +1 4,200installs typescript-docs Creates TypeScript documentation with JSDoc, TypeDoc, and ADRs. Use it when documenting APIs, architecture choices, or framework-specific code. CX Codex +1 4,200installs nestjs Gives your agent NestJS patterns: CRUD modules, JWT guards, Drizzle schemas and migrations. Handy when you are building an API on NestJS. CX Codex +1 4,200installs unit-test-boundary-conditions A skill that hands your agent ready patterns for Java unit tests at the edges: min and max values, nulls, empty collections, overflow and double precision. CX Codex +1 4,100installs spring-data-jpa Patterns and rules for Spring Data JPA persistence layers: repository setup, pagination, entity auditing, and transaction boundaries. CX Codex +1 4,100installs spring-boot-security-jwt A skill with ready JWT auth patterns for Spring Boot 3.5.x: token generation with JJWT, filters, RBAC and OAuth2 wiring. CX Codex +1 4,100installs drawio-logical-diagrams Generates draw.io native XML files for logical flowcharts, system architecture, BPMN, and UML diagrams. Useful when documenting abstract logic without cloud provider icons. CX Codex +1 4,000installs clean-architecture Guides Clean Architecture, hexagonal architecture and DDD patterns in Java 21+ Spring Boot 3.5+ projects. Use it when separating domain code from frameworks or refactoring coupled code. CX Codex +1 4,000installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor