Official agent skill

Turborepo

by JetBrains in JetBrains/skills

Turborepo monorepo build system guidance. An agent skill from JetBrains/skills.

OfficialMITAuto-check: notesDevelopment

Install Turborepo

skills CLI
$ npx skills add JetBrains/skills --skill turborepo -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install JetBrains/skills turborepo --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/turborepo .claude/skills/turborepo && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
turborepo
GitHub stars
366
Used in
20 other repos
Token cost
~6.7k tokens
SKILL.md length
1,335 words
Files
33 (incl. references)
Skills in repo
76
Repo updated
First seen
Licence
MIT

At a glance

Turborepo monorepo build system guidance. An agent skill from JetBrains/skills.

  • Works in 3 steps: Add the script to each relevant… → Register the task in root turbo.json → Root package.json only delegates via…
  • CI optimization
  • SKILL.md covers IMPORTANT: Package Tasks, Not…, Secondary Rule: turbo run vs…, Quick Decision Trees and Critical Anti-Patterns
  • Calls turbo and tsc; reaches v2-8-18-canary-7.turborepo.dev; needs API_KEY and GITHUB_TOKEN

What it does

Turborepo is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines, dependsOn, caching, remote cache, the "turbo" CLI, --filter, --affected, CI optimization, environment variables, internal packages, monorepo structure/best practices, and boundaries. Use when user: configures tasks/workflows/pipelines, creates packages, sets up monorepo, shares code between apps, runs changed/affected packages, debugs cache, or has apps/packages directories.

Its SKILL.md is about 6.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 38 other files, including reference files (for example `LICENSE.md`, `SYNC.md` and `command/turborepo.md`).

It sits in Development, covering Monorepo tooling. It works with Turborepo and npm. The repository describes itself as: Curated agent skills collection verified by JetBrains. The licence is MIT.

When your agent uses it

  • CI optimization
  • Environment variables
  • Internal packages
  • Monorepo structure/best practices

Example prompts

  • “/turborepo”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Add the script to each relevant package's package.json
  2. Register the task in root turbo.json
  3. Root package.json only delegates via turbo run

What it can do on your machine

Read from SKILL.md and the folder at commit e0f258b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • turbo
    • tsc

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • v2-8-18-canary-7.turborepo.dev

    Also links to:

    • turborepo.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • API_KEY
    • GITHUB_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Turborepo loads about 6.7k tokens when it runs, and up to ~28k if it reads all its reference files. Until then it costs about 118 tokens; SKILL.md has 1,335 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~118
When it runs · the whole SKILL.md, loaded when a task matches
~6.7k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~28k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:159
    ├─ .env changes not causing rebuilds → .env not in `inputs`
  • NoteMentions a .env fileSKILL.md:349
    "globalDependencies": ["**/.env.*local"]
  • NoteMentions a .env fileSKILL.md:354
    "globalDependencies": [".env"],
  • NoteMentions a .env fileSKILL.md:357
    "inputs": ["$TURBO_DEFAULT$", ".env*"],
  • NoteMentions a .env fileSKILL.md:374
    "inputs": ["$TURBO_DEFAULT$", ".env*"]
  • NoteMentions a .env fileSKILL.md:378
    "inputs": ["$TURBO_DEFAULT$", ".env*"]
  • NoteMentions a .env fileSKILL.md:382
    "inputs": ["$TURBO_DEFAULT$", ".env*"],
  • NoteMentions a .env fileSKILL.md:392
    "globalDependencies": [".env*"],
  • NoteMentions a .env fileSKILL.md:606
    ### `.env` Files Not in Inputs
  • NoteMentions a .env fileSKILL.md:608
    Turbo does NOT load `.env` files - your framework does. But Turbo needs to know about changes:

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from JetBrains/skills at commit e0f258b, republished under its MIT licence (© JetBrains). 1,335 words, ~6,728 tokens.

Download SKILL.mdSave it as .claude/skills/turborepo/SKILL.md (or your agent's skills folder). This skill also uses 32 other files; get the full folder from GitHub.
name
turborepo
description
Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines, dependsOn, caching, remote cache, the "turbo" CLI, --filter, --affected, CI optimization, environment variables, internal packages, monorepo structure/best practices, and boundaries. Use when user: configures tasks/workflows/pipelines, creates packages, sets up monorepo, shares code between apps, runs changed/affected packages, debugs cache, or has apps/packages directories.
metadata.short-description
Structure and optimize Turborepo monorepos
metadata.author
Anthony Fu
metadata.version
2.8.18-canary.7
metadata.source
https://github.com/antfu/skills/tree/main/skills/turborepo

Turborepo Skill

Build system for JavaScript/TypeScript monorepos. Turborepo caches task outputs and runs tasks in parallel based on dependency graph.

IMPORTANT: Package Tasks, Not Root Tasks

DO NOT create Root Tasks. ALWAYS create package tasks.

When creating tasks/scripts/pipelines, you MUST:

  1. Add the script to each relevant package's package.json
  2. Register the task in root turbo.json
  3. Root package.json only delegates via turbo run <task>

DO NOT put task logic in root package.json. This defeats Turborepo's parallelization.

json
// DO THIS: Scripts in each package
// apps/web/package.json
{ "scripts": { "build": "next build", "lint": "eslint .", "test": "vitest" } }

// apps/api/package.json
{ "scripts": { "build": "tsc", "lint": "eslint .", "test": "vitest" } }

// packages/ui/package.json
{ "scripts": { "build": "tsc", "lint": "eslint .", "test": "vitest" } }
json
// turbo.json - register tasks
{
  "tasks": {
    "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
    "lint": {},
    "test": { "dependsOn": ["build"] }
  }
}
json
// Root package.json - ONLY delegates, no task logic
{
  "scripts": {
    "build": "turbo run build",
    "lint": "turbo run lint",
    "test": "turbo run test"
  }
}
json
// DO NOT DO THIS - defeats parallelization
// Root package.json
{
  "scripts": {
    "build": "cd apps/web && next build && cd ../api && tsc",
    "lint": "eslint apps/ packages/",
    "test": "vitest"
  }
}

Root Tasks (//#taskname) are ONLY for tasks that truly cannot exist in packages (rare).

Secondary Rule: turbo run vs turbo

Always use turbo run when the command is written into code:

json
// package.json - ALWAYS "turbo run"
{
  "scripts": {
    "build": "turbo run build"
  }
}
yaml
# CI workflows - ALWAYS "turbo run"
- run: turbo run build --affected

The shorthand turbo <tasks> is ONLY for one-off terminal commands typed directly by humans or agents. Never write turbo build into package.json, CI, or scripts.

Quick Decision Trees

"I need to configure a task"
Configure a task?
├─ Define task dependencies → references/configuration/tasks.md
├─ Lint/check-types (parallel + caching) → Use Transit Nodes pattern (see below)
├─ Specify build outputs → references/configuration/tasks.md#outputs
├─ Handle environment variables → references/environment/RULE.md
├─ Set up dev/watch tasks → references/configuration/tasks.md#persistent
├─ Package-specific config → references/configuration/RULE.md#package-configurations
└─ Global settings (cacheDir, daemon) → references/configuration/global-options.md
"My cache isn't working"
Cache problems?
├─ Tasks run but outputs not restored → Missing `outputs` key
├─ Cache misses unexpectedly → references/caching/gotchas.md
├─ Need to debug hash inputs → Use --summarize or --dry
├─ Want to skip cache entirely → Use --force or cache: false
├─ Remote cache not working → references/caching/remote-cache.md
└─ Environment causing misses → references/environment/gotchas.md
"I want to run only changed packages"
Run only what changed?
├─ Changed packages + dependents (RECOMMENDED) → turbo run build --affected
├─ Custom base branch → --affected --affected-base=origin/develop
├─ Manual git comparison → --filter=...[origin/main]
└─ See all filter options → references/filtering/RULE.md

--affected is the primary way to run only changed packages. It automatically compares against the default branch and includes dependents.

"I want to filter packages"
Filter packages?
├─ Only changed packages → --affected (see above)
├─ By package name → --filter=web
├─ By directory → --filter=./apps/*
├─ Package + dependencies → --filter=web...
├─ Package + dependents → --filter=...web
└─ Complex combinations → references/filtering/patterns.md
"Environment variables aren't working"
Environment issues?
├─ Vars not available at runtime → Strict mode filtering (default)
├─ Cache hits with wrong env → Var not in `env` key
├─ .env changes not causing rebuilds → .env not in `inputs`
├─ CI variables missing → references/environment/gotchas.md
└─ Framework vars (NEXT_PUBLIC_*) → Auto-included via inference
"I need to set up CI"
CI setup?
├─ GitHub Actions → references/ci/github-actions.md
├─ Vercel deployment → references/ci/vercel.md
├─ Remote cache in CI → references/caching/remote-cache.md
├─ Only build changed packages → --affected flag
├─ Skip unnecessary builds → turbo-ignore (references/cli/commands.md)
└─ Skip container setup when no changes → turbo-ignore
"I want to watch for changes during development"
Watch mode?
├─ Re-run tasks on change → turbo watch (references/watch/RULE.md)
├─ Dev servers with dependencies → Use `with` key (references/configuration/tasks.md#with)
├─ Restart dev server on dep change → Use `interruptible: true`
└─ Persistent dev tasks → Use `persistent: true`
"I need to create/structure a package"
Package creation/structure?
├─ Create an internal package → references/best-practices/packages.md
├─ Repository structure → references/best-practices/structure.md
├─ Dependency management → references/best-practices/dependencies.md
├─ Best practices overview → references/best-practices/RULE.md
├─ JIT vs Compiled packages → references/best-practices/packages.md#compilation-strategies
└─ Sharing code between apps → references/best-practices/RULE.md#package-types
"How should I structure my monorepo?"
Monorepo structure?
├─ Standard layout (apps/, packages/) → references/best-practices/RULE.md
├─ Package types (apps vs libraries) → references/best-practices/RULE.md#package-types
├─ Creating internal packages → references/best-practices/packages.md
├─ TypeScript configuration → references/best-practices/structure.md#typescript-configuration
├─ ESLint configuration → references/best-practices/structure.md#eslint-configuration
├─ Dependency management → references/best-practices/dependencies.md
└─ Enforce package boundaries → references/boundaries/RULE.md
"I want to enforce architectural boundaries"
Enforce boundaries?
├─ Check for violations → turbo boundaries
├─ Tag packages → references/boundaries/RULE.md#tags
├─ Restrict which packages can import others → references/boundaries/RULE.md#rule-types
└─ Prevent cross-package file imports → references/boundaries/RULE.md

Critical Anti-Patterns

Using turbo Shorthand in Code

turbo run is recommended in package.json scripts and CI pipelines. The shorthand turbo <task> is intended for interactive terminal use.

json
// WRONG - using shorthand in package.json
{
  "scripts": {
    "build": "turbo build",
    "dev": "turbo dev"
  }
}

// CORRECT
{
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev"
  }
}
yaml
# WRONG - using shorthand in CI
- run: turbo build --affected

# CORRECT
- run: turbo run build --affected
Root Scripts Bypassing Turbo

Root package.json scripts MUST delegate to turbo run, not run tasks directly.

json
// WRONG - bypasses turbo entirely
{
  "scripts": {
    "build": "bun build",
    "dev": "bun dev"
  }
}

// CORRECT - delegates to turbo
{
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev"
  }
}
Using && to Chain Turbo Tasks

Don't chain turbo tasks with &&. Let turbo orchestrate.

json
// WRONG - turbo task not using turbo run
{
  "scripts": {
    "changeset:publish": "bun build && changeset publish"
  }
}

// CORRECT
{
  "scripts": {
    "changeset:publish": "turbo run build && changeset publish"
  }
}
prebuild Scripts That Manually Build Dependencies

Scripts like prebuild that manually build other packages bypass Turborepo's dependency graph.

json
// WRONG - manually building dependencies
{
  "scripts": {
    "prebuild": "cd ../../packages/types && bun run build && cd ../utils && bun run build",
    "build": "next build"
  }
}

However, the fix depends on whether workspace dependencies are declared:

  1. If dependencies ARE declared (e.g., "@repo/types": "workspace:*" in package.json), remove the prebuild script. Turbo's dependsOn: ["^build"] handles this automatically.

  2. If dependencies are NOT declared, the prebuild exists because ^build won't trigger without a dependency relationship. The fix is to:

    • Add the dependency to package.json: "@repo/types": "workspace:*"
    • Then remove the prebuild script
json
// CORRECT - declare dependency, let turbo handle build order
// package.json
{
  "dependencies": {
    "@repo/types": "workspace:*",
    "@repo/utils": "workspace:*"
  },
  "scripts": {
    "build": "next build"
  }
}

// turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"]
    }
  }
}

Key insight: ^build only runs build in packages listed as dependencies. No dependency declaration = no automatic build ordering.

Overly Broad globalDependencies

globalDependencies affects ALL tasks in ALL packages. Be specific.

json
// WRONG - heavy hammer, affects all hashes
{
  "globalDependencies": ["**/.env.*local"]
}

// BETTER - move to task-level inputs
{
  "globalDependencies": [".env"],
  "tasks": {
    "build": {
      "inputs": ["$TURBO_DEFAULT$", ".env*"],
      "outputs": ["dist/**"]
    }
  }
}
Repetitive Task Configuration

Look for repeated configuration across tasks that can be collapsed. Turborepo supports shared configuration patterns.

json
// WRONG - repetitive env and inputs across tasks
{
  "tasks": {
    "build": {
      "env": ["API_URL", "DATABASE_URL"],
      "inputs": ["$TURBO_DEFAULT$", ".env*"]
    },
    "test": {
      "env": ["API_URL", "DATABASE_URL"],
      "inputs": ["$TURBO_DEFAULT$", ".env*"]
    },
    "dev": {
      "env": ["API_URL", "DATABASE_URL"],
      "inputs": ["$TURBO_DEFAULT$", ".env*"],
      "cache": false,
      "persistent": true
    }
  }
}

// BETTER - use globalEnv and globalDependencies for shared config
{
  "globalEnv": ["API_URL", "DATABASE_URL"],
  "globalDependencies": [".env*"],
  "tasks": {
    "build": {},
    "test": {},
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

When to use global vs task-level:

  • globalEnv / globalDependencies - affects ALL tasks, use for truly shared config
  • Task-level env / inputs - use when only specific tasks need it
NOT an Anti-Pattern: Large env Arrays

A large env array (even 50+ variables) is not a problem. It usually means the user was thorough about declaring their build's environment dependencies. Do not flag this as an issue.

Using --parallel Flag

The --parallel flag bypasses Turborepo's dependency graph. If tasks need parallel execution, configure dependsOn correctly instead.

bash
# WRONG - bypasses dependency graph
turbo run lint --parallel

# CORRECT - configure tasks to allow parallel execution
# In turbo.json, set dependsOn appropriately (or use transit nodes)
turbo run lint
Package-Specific Task Overrides in Root turbo.json

When multiple packages need different task configurations, use Package Configurations (turbo.json in each package) instead of cluttering root turbo.json with package#task overrides.

json
// WRONG - root turbo.json with many package-specific overrides
{
  "tasks": {
    "test": { "dependsOn": ["build"] },
    "@repo/web#test": { "outputs": ["coverage/**"] },
    "@repo/api#test": { "outputs": ["coverage/**"] },
    "@repo/utils#test": { "outputs": [] },
    "@repo/cli#test": { "outputs": [] },
    "@repo/core#test": { "outputs": [] }
  }
}

// CORRECT - use Package Configurations
// Root turbo.json - base config only
{
  "tasks": {
    "test": { "dependsOn": ["build"] }
  }
}

// packages/web/turbo.json - package-specific override
{
  "extends": ["//"],
  "tasks": {
    "test": { "outputs": ["coverage/**"] }
  }
}

// packages/api/turbo.json
{
  "extends": ["//"],
  "tasks": {
    "test": { "outputs": ["coverage/**"] }
  }
}

Benefits of Package Configurations:

  • Keeps configuration close to the code it affects
  • Root turbo.json stays clean and focused on base patterns
  • Easier to understand what's special about each package
  • Works with $TURBO_EXTENDS$ to inherit + extend arrays

When to use package#task in root:

  • Single package needs a unique dependency (e.g., "deploy": { "dependsOn": ["web#build"] })
  • Temporary override while migrating

See references/configuration/RULE.md#package-configurations for full details.

Using ../ to Traverse Out of Package in inputs

Don't use relative paths like ../ to reference files outside the package. Use $TURBO_ROOT$ instead.

json
// WRONG - traversing out of package
{
  "tasks": {
    "build": {
      "inputs": ["$TURBO_DEFAULT$", "../shared-config.json"]
    }
  }
}

// CORRECT - use $TURBO_ROOT$ for repo root
{
  "tasks": {
    "build": {
      "inputs": ["$TURBO_DEFAULT$", "$TURBO_ROOT$/shared-config.json"]
    }
  }
}
Missing outputs for File-Producing Tasks

Before flagging missing outputs, check what the task actually produces:

  1. Read the package's script (e.g., "build": "tsc", "test": "vitest")
  2. Determine if it writes files to disk or only outputs to stdout
  3. Only flag if the task produces files that should be cached
json
// WRONG: build produces files but they're not cached
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"]
    }
  }
}

// CORRECT: build outputs are cached
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    }
  }
}

Common outputs by framework:

  • Next.js: [".next/**", "!.next/cache/**"]
  • Vite/Rollup: ["dist/**"]
  • tsc: ["dist/**"] or custom outDir

TypeScript --noEmit can still produce cache files:

When incremental: true in tsconfig.json, tsc --noEmit writes .tsbuildinfo files even without emitting JS. Check the tsconfig before assuming no outputs:

json
// If tsconfig has incremental: true, tsc --noEmit produces cache files
{
  "tasks": {
    "typecheck": {
      "outputs": ["node_modules/.cache/tsbuildinfo.json"] // or wherever tsBuildInfoFile points
    }
  }
}

To determine correct outputs for TypeScript tasks:

  1. Check if incremental or composite is enabled in tsconfig
  2. Check tsBuildInfoFile for custom cache location (default: alongside outDir or in project root)
  3. If no incremental mode, tsc --noEmit produces no files
^build vs build Confusion
json
{
  "tasks": {
    // ^build = run build in DEPENDENCIES first (other packages this one imports)
    "build": {
      "dependsOn": ["^build"]
    },
    // build (no ^) = run build in SAME PACKAGE first
    "test": {
      "dependsOn": ["build"]
    },
    // pkg#task = specific package's task
    "deploy": {
      "dependsOn": ["web#build"]
    }
  }
}
Environment Variables Not Hashed
json
// WRONG: API_URL changes won't cause rebuilds
{
  "tasks": {
    "build": {
      "outputs": ["dist/**"]
    }
  }
}

// CORRECT: API_URL changes invalidate cache
{
  "tasks": {
    "build": {
      "outputs": ["dist/**"],
      "env": ["API_URL", "API_KEY"]
    }
  }
}
.env Files Not in Inputs

Turbo does NOT load .env files - your framework does. But Turbo needs to know about changes:

json
// WRONG: .env changes don't invalidate cache
{
  "tasks": {
    "build": {
      "env": ["API_URL"]
    }
  }
}

// CORRECT: .env file changes invalidate cache
{
  "tasks": {
    "build": {
      "env": ["API_URL"],
      "inputs": ["$TURBO_DEFAULT$", ".env", ".env.*"]
    }
  }
}
Show full SKILL.md (581 more words)Show less
Root .env File in Monorepo

A .env file at the repo root is an anti-pattern — even for small monorepos or starter templates. It creates implicit coupling between packages and makes it unclear which packages depend on which variables.

// WRONG - root .env affects all packages implicitly
my-monorepo/
├── .env              # Which packages use this?
├── apps/
│   ├── web/
│   └── api/
└── packages/

// CORRECT - .env files in packages that need them
my-monorepo/
├── apps/
│   ├── web/
│   │   └── .env      # Clear: web needs DATABASE_URL
│   └── api/
│       └── .env      # Clear: api needs API_KEY
└── packages/

Problems with root .env:

  • Unclear which packages consume which variables
  • All packages get all variables (even ones they don't need)
  • Cache invalidation is coarse-grained (root .env change invalidates everything)
  • Security risk: packages may accidentally access sensitive vars meant for others
  • Bad habits start small — starter templates should model correct patterns

If you must share variables, use globalEnv to be explicit about what's shared, and document why.

Strict Mode Filtering CI Variables

By default, Turborepo filters environment variables to only those in env/globalEnv. CI variables may be missing:

json
// If CI scripts need GITHUB_TOKEN but it's not in env:
{
  "globalPassThroughEnv": ["GITHUB_TOKEN", "CI"],
  "tasks": { ... }
}

Or use --env-mode=loose (not recommended for production).

Shared Code in Apps (Should Be a Package)
// WRONG: Shared code inside an app
apps/
  web/
    shared/          # This breaks monorepo principles!
      utils.ts

// CORRECT: Extract to a package
packages/
  utils/
    src/utils.ts
Accessing Files Across Package Boundaries
typescript
// WRONG: Reaching into another package's internals
import { Button } from "../../packages/ui/src/button";

// CORRECT: Install and import properly
import { Button } from "@repo/ui/button";
Too Many Root Dependencies
json
// WRONG: App dependencies in root
{
  "dependencies": {
    "react": "^18",
    "next": "^14"
  }
}

// CORRECT: Only repo tools in root
{
  "devDependencies": {
    "turbo": "latest"
  }
}

Common Task Configurations

Standard Build Pipeline
json
{
  "$schema": "https://v2-8-18-canary-7.turborepo.dev/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**", "!.next/cache/**"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

Add a transit task if you have tasks that need parallel execution with cache invalidation (see below).

Dev Task with ^dev Pattern (for turbo watch)

A dev task with dependsOn: ["^dev"] and persistent: false in root turbo.json may look unusual but is correct for turbo watch workflows:

json
// Root turbo.json
{
  "tasks": {
    "dev": {
      "dependsOn": ["^dev"],
      "cache": false,
      "persistent": false  // Packages have one-shot dev scripts
    }
  }
}

// Package turbo.json (apps/web/turbo.json)
{
  "extends": ["//"],
  "tasks": {
    "dev": {
      "persistent": true  // Apps run long-running dev servers
    }
  }
}

Why this works:

  • Packages (e.g., @acme/db, @acme/validators) have "dev": "tsc" — one-shot type generation that completes quickly
  • Apps override with persistent: true for actual dev servers (Next.js, etc.)
  • turbo watch re-runs the one-shot package dev scripts when source files change, keeping types in sync

Intended usage: Run turbo watch dev (not turbo run dev). Watch mode re-executes one-shot tasks on file changes while keeping persistent tasks running.

Alternative pattern: Use a separate task name like prepare or generate for one-shot dependency builds to make the intent clearer:

json
{
  "tasks": {
    "prepare": {
      "dependsOn": ["^prepare"],
      "outputs": ["dist/**"]
    },
    "dev": {
      "dependsOn": ["prepare"],
      "cache": false,
      "persistent": true
    }
  }
}
Transit Nodes for Parallel Tasks with Cache Invalidation

Some tasks can run in parallel (don't need built output from dependencies) but must invalidate cache when dependency source code changes.

The problem with dependsOn: ["^taskname"]:

  • Forces sequential execution (slow)

The problem with dependsOn: [] (no dependencies):

  • Allows parallel execution (fast)
  • But cache is INCORRECT - changing dependency source won't invalidate cache

Transit Nodes solve both:

json
{
  "tasks": {
    "transit": { "dependsOn": ["^transit"] },
    "my-task": { "dependsOn": ["transit"] }
  }
}

The transit task creates dependency relationships without matching any actual script, so tasks run in parallel with correct cache invalidation.

How to identify tasks that need this pattern: Look for tasks that read source files from dependencies but don't need their build outputs.

With Environment Variables
json
{
  "globalEnv": ["NODE_ENV"],
  "globalDependencies": [".env"],
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"],
      "env": ["API_URL", "DATABASE_URL"]
    }
  }
}

Reference Index

Configuration
FilePurpose
configuration/RULE.mdturbo.json overview, Package Configurations
configuration/tasks.mddependsOn, outputs, inputs, env, cache, persistent
configuration/global-options.mdglobalEnv, globalDependencies, cacheDir, daemon, envMode
configuration/gotchas.mdCommon configuration mistakes
Caching
FilePurpose
caching/RULE.mdHow caching works, hash inputs
caching/remote-cache.mdVercel Remote Cache, self-hosted, login/link
caching/gotchas.mdDebugging cache misses, --summarize, --dry
Environment Variables
FilePurpose
environment/RULE.mdenv, globalEnv, passThroughEnv
environment/modes.mdStrict vs Loose mode, framework inference
environment/gotchas.md.env files, CI issues
Filtering
FilePurpose
filtering/RULE.md--filter syntax overview
filtering/patterns.mdCommon filter patterns
CI/CD
FilePurpose
ci/RULE.mdGeneral CI principles
ci/github-actions.mdComplete GitHub Actions setup
ci/vercel.mdVercel deployment, turbo-ignore
ci/patterns.md--affected, caching strategies
CLI
FilePurpose
cli/RULE.mdturbo run basics
cli/commands.mdturbo run flags, turbo-ignore, other commands
Best Practices
FilePurpose
best-practices/RULE.mdMonorepo best practices overview
best-practices/structure.mdRepository structure, workspace config, TypeScript/ESLint setup
best-practices/packages.mdCreating internal packages, JIT vs Compiled, exports
best-practices/dependencies.mdDependency management, installing, version sync
Watch Mode
FilePurpose
watch/RULE.mdturbo watch, interruptible tasks, dev workflows
Boundaries (Experimental)
FilePurpose
boundaries/RULE.mdEnforce package isolation, tag-based dependency rules

Source Documentation

This skill is based on the official Turborepo documentation at:

© JetBrains, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 32 other files (references) in turborepo of JetBrains/skills.

  • SKILL.md
  • LICENSE.md
  • SYNC.md
  • command/turborepo.md
  • references/best-practices/RULE.md
  • references/best-practices/dependencies.md
  • references/best-practices/packages.md
  • references/best-practices/structure.md
  • references/boundaries/RULE.md
  • references/caching/RULE.md
  • references/caching/gotchas.md
  • references/caching/remote-cache.md
  • references/ci/RULE.md
  • references/ci/github-actions.md
  • references/ci/patterns.md
  • … and 18 more

Open the folder on GitHubat commit e0f258b

Used in 20 other repositories

We found 23 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 20 other GitHub owners. This page covers the copy in JetBrains/skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Turborepo next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Turborepo compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Turborepo this skillJetBrains/skills36620 repos~6.7kAutomated safety check: NotesMIT
TS SDK Authormindfold-ai/Trellis15k—~6.1kAutomated safety check: PassMIT
Turborepo WorkflowChatbotXIO/ChatbotX885—~880Automated safety check: NotesCustom licence
Monorepo Navigatoralirezarezvani/claude-skills28k1 repos~1.2kAutomated safety check: PassMIT
Nx Run Tasksnomcopter/react-mosaic4.8k8 repos~613Automated safety check: PassCustom licence
Migrate Internal Package into GhostTryGhost/Ghost56k—~3.8kAutomated safety check: PassMIT

Similar skills

  • TS SDK Author

    mindfold-ai/Trellis

    Design, build, verify, and publish production-grade TypeScript SDKs as npm packages inside a pnpm monorepo.

    15k GitHub stars~6.1k tokensUpdated 10 days ago
    DevelopmentAuto-check passed
  • Turborepo Workflow

    ChatbotXIO/ChatbotX

    Manage turborepo monorepo development workflow including dev servers, builds, linting, and package management.

    885 GitHub stars~880 tokensUpdated yesterday
    DevelopmentAuto-check: notes
  • Monorepo Navigator

    alirezarezvani/claude-skills

    Navigate, manage, and optimize monorepos. An agent skill from alirezarezvani/claude-skills.

    28k GitHub starsUsed in 1 repo~1.2k tokens
    DevelopmentAuto-check passed
  • Nx Run Tasks

    nomcopter/react-mosaic

    Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.

    4.8k GitHub starsUsed in 8 repos~613 tokens
    DevelopmentAuto-check passed
  • Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.

    56k GitHub stars~3.8k tokensUpdated today
    DevelopmentAuto-check passed
  • Cutting A Release

    TriliumNext/Trilium

    A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.

    38k GitHub stars~3.2k tokensUpdated today
    DevelopmentAuto-check passed

More from JetBrains/skills

All 76 skills in this repo
  • Playwright

    JetBrains/skills

    Official

    A skill your agent uses when the task requires automating a real browser from the terminal (navigation, form filling, snapshots, screenshots, data extraction, UI-flow debugging) via playwright-cli…

    366 GitHub starsUsed in 11 repos~986 tokens
    Auto-check passed
  • Skill Creator

    JetBrains/skills

    Official

    Guide for creating effective skills. An agent skill from JetBrains/skills.

    366 GitHub starsUsed in 122 repos~4.7k tokens
    Auto-check passed
  • Transcribe

    JetBrains/skills

    Official

    Transcribe audio files to text with optional diarization and known-speaker hints.

    366 GitHub starsUsed in 4 repos~776 tokens
    Auto-check passed
  • Imagegen

    JetBrains/skills

    Official

    A skill your agent uses when the user asks to generate or edit images via the OpenAI Image API (for example: generate image, edit/inpaint/mask, background removal or replacement, transparent…

    366 GitHub starsUsed in 3 repos~2.5k tokens
    Auto-check passed
  • Speech

    JetBrains/skills

    Official

    A skill your agent uses when the user asks for text-to-speech narration or voiceover, accessibility reads, audio prompts, or batch speech generation via the OpenAI Audio API; run the bundled CLI…

    366 GitHub starsUsed in 3 repos~1.9k tokens
    Auto-check passed
  • Screenshot

    JetBrains/skills

    Official

    A skill your agent uses when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are…

    366 GitHub starsUsed in 6 repos~2k tokens
    Auto-check passed

Works with

Categories

Questions about Turborepo

What does Turborepo do?

Turborepo monorepo build system guidance. An agent skill from JetBrains/skills. Turborepo is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Turborepo monorepo build system guidance.

When should I use Turborepo?

Turborepo fits situations like: CI optimization; environment variables; internal packages; monorepo structure/best practices.

How do I install Turborepo in Claude Code?

Run `npx skills add JetBrains/skills --skill turborepo -a claude-code`. Or copy the skill folder (turborepo in JetBrains/skills) into .claude/skills/turborepo in your project. Claude Code loads it when a task matches its description.

How do I install Turborepo in Codex?

Run `npx skills add JetBrains/skills --skill turborepo -a codex`. Or copy the skill folder (turborepo in JetBrains/skills) into .agents/skills/turborepo in your project. Codex loads it when a task matches its description.

Can I use Turborepo in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add JetBrains/skills --skill turborepo -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/turborepo, .gemini/skills/turborepo, .github/skills/turborepo and .opencode/skills/turborepo in your project.

What does Turborepo need to run?

Going by SKILL.md and its folder, Turborepo needs the command-line tools its instructions call (turbo and tsc) and credentials named API_KEY and GITHUB_TOKEN.

Does Turborepo access the network?

SKILL.md names 2 domains. In commands or code: v2-8-18-canary-7.turborepo.dev; the agent is likely to contact it when it follows the instructions. As links in the text: turborepo.dev. This is read from the text; nothing was executed.

Is Turborepo safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Turborepo use?

Turborepo is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Turborepo use?

About 6.7k tokens (SKILL.md is roughly 27k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 21k tokens, read only when the agent opens those files.

What are the alternatives to Turborepo?

Skills that share tags, products or a category with Turborepo: TS SDK Author (mindfold-ai/Trellis, 15k stars), Turborepo Workflow (ChatbotXIO/ChatbotX, 885 stars), Monorepo Navigator (alirezarezvani/claude-skills, 28k stars) and Nx Run Tasks (nomcopter/react-mosaic, 4.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Turborepo?

JetBrains (a GitHub organization, an official publisher) maintains it in JetBrains/skills, which has 366 GitHub stars. The repository holds 76 skills in this directory. The repository was last updated on June 29, 2026.

Source: JetBrains/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.