[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71B2K0HR7F5GN13W0CQK3H7":3,"skill-same:01M71B2K0HR7F5GN13W0CQK3H7":171},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":14,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M71B2K0HR7F5GN13W0CQK3H7","turborepo",null,"Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.","escwxyz\u002Fskills-re","escwxyz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F124119483?v=4","01M71B1P3M16B4SZRCEAA6JD69","Jie Wang","01M71B1P47632T1KJ3RQJF6ME2",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"when","affected","cli","structure","packages","filter","tasks","code","Variables","caching","workflows","apps","remote","ci","up","turborepo monorepo","monorepo","directories","ci optimization","2026-11-10 10:12:30",false,"---\nname: turborepo\ndescription: |\n  Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\n  dependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\n  variables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\n  Use when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\n  monorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\n  or has apps\u002Fpackages directories.\nmetadata:\n  version: 2.9.7-canary.13\n---\n\n# Turborepo Skill\n\nBuild system for JavaScript\u002FTypeScript monorepos. Turborepo caches task outputs and runs tasks in parallel based on dependency graph.\n\n## IMPORTANT: Package Tasks, Not Root Tasks\n\n**DO NOT create Root Tasks. ALWAYS create package tasks.**\n\nWhen creating tasks\u002Fscripts\u002Fpipelines, you MUST:\n\n1. Add the script to each relevant package's `package.json`\n2. Register the task in root `turbo.json`\n3. Root `package.json` only delegates via `turbo run \u003Ctask>`\n\n**DO NOT** put task logic in root `package.json`. This defeats Turborepo's parallelization.\n\n```json\n\u002F\u002F DO THIS: Scripts in each package\n\u002F\u002F apps\u002Fweb\u002Fpackage.json\n{ \"scripts\": { \"build\": \"next build\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n\n\u002F\u002F apps\u002Fapi\u002Fpackage.json\n{ \"scripts\": { \"build\": \"tsc\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n\n\u002F\u002F packages\u002Fui\u002Fpackage.json\n{ \"scripts\": { \"build\": \"tsc\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n```\n\n```json\n\u002F\u002F turbo.json - register tasks\n{\n  \"tasks\": {\n    \"build\": { \"dependsOn\": [\"^build\"], \"outputs\": [\"dist\u002F**\"] },\n    \"lint\": {},\n    \"test\": { \"dependsOn\": [\"build\"] }\n  }\n}\n```\n\n```json\n\u002F\u002F Root package.json - ONLY delegates, no task logic\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"lint\": \"turbo run lint\",\n    \"test\": \"turbo run test\"\n  }\n}\n```\n\n```json\n\u002F\u002F DO NOT DO THIS - defeats parallelization\n\u002F\u002F Root package.json\n{\n  \"scripts\": {\n    \"build\": \"cd apps\u002Fweb && next build && cd ..\u002Fapi && tsc\",\n    \"lint\": \"eslint apps\u002F packages\u002F\",\n    \"test\": \"vitest\"\n  }\n}\n```\n\nRoot Tasks (`\u002F\u002F#taskname`) are ONLY for tasks that truly cannot exist in packages (rare).\n\n## Secondary Rule: `turbo run` vs `turbo`\n\n**Always use `turbo run` when the command is written into code:**\n\n```json\n\u002F\u002F package.json - ALWAYS \"turbo run\"\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\"\n  }\n}\n```\n\n```yaml\n# CI workflows - ALWAYS \"turbo run\"\n- run: turbo run build --affected\n```\n\n**The shorthand `turbo \u003Ctasks>` is ONLY for one-off terminal commands** typed directly by humans or agents. Never write `turbo build` into package.json, CI, or scripts.\n\n## Quick Decision Trees\n\n### \"I need to configure a task\"\n\n```\nConfigure a task?\n├─ Define task dependencies → references\u002Fconfiguration\u002Ftasks.md\n├─ Lint\u002Fcheck-types (parallel + caching) → Use Transit Nodes pattern (see below)\n├─ Specify build outputs → references\u002Fconfiguration\u002Ftasks.md#outputs\n├─ Handle environment variables → references\u002Fenvironment\u002FRULE.md\n├─ Set up dev\u002Fwatch tasks → references\u002Fconfiguration\u002Ftasks.md#persistent\n├─ Package-specific config → references\u002Fconfiguration\u002FRULE.md#package-configurations\n└─ Global settings (cacheDir, daemon) → references\u002Fconfiguration\u002Fglobal-options.md\n```\n\n### \"My cache isn't working\"\n\n```\nCache problems?\n├─ Tasks run but outputs not restored → Missing `outputs` key\n├─ Cache misses unexpectedly → references\u002Fcaching\u002Fgotchas.md\n├─ Need to debug hash inputs → Use --summarize or --dry\n├─ Want to skip cache entirely → Use --force or cache: false\n├─ Remote cache not working → references\u002Fcaching\u002Fremote-cache.md\n└─ Environment causing misses → references\u002Fenvironment\u002Fgotchas.md\n```\n\n### \"I want to run only changed packages\"\n\n```\nRun only what changed?\n├─ Changed packages + dependents (RECOMMENDED) → turbo run build --affected\n├─ Custom base branch → --affected --affected-base=origin\u002Fdevelop\n├─ Manual git comparison → --filter=...[origin\u002Fmain]\n└─ See all filter options → references\u002Ffiltering\u002FRULE.md\n```\n\n**`--affected` is the primary way to run only changed packages.** It automatically compares against the default branch and includes dependents.\n\n### \"I want to filter packages\"\n\n```\nFilter packages?\n├─ Only changed packages → --affected (see above)\n├─ By package name → --filter=web\n├─ By directory → --filter=.\u002Fapps\u002F*\n├─ Package + dependencies → --filter=web...\n├─ Package + dependents → --filter=...web\n└─ Complex combinations → references\u002Ffiltering\u002Fpatterns.md\n```\n\n### \"Environment variables aren't working\"\n\n```\nEnvironment issues?\n├─ Vars not available at runtime → Strict mode filtering (default)\n├─ Cache hits with wrong env → Var not in `env` key\n├─ .env changes not causing rebuilds → .env not in `inputs`\n├─ CI variables missing → references\u002Fenvironment\u002Fgotchas.md\n└─ Framework vars (NEXT_PUBLIC_*) → Auto-included via inference\n```\n\n### \"I need to set up CI\"\n\n```\nCI setup?\n├─ GitHub Actions → references\u002Fci\u002Fgithub-actions.md\n├─ Vercel deployment → references\u002Fci\u002Fvercel.md\n├─ Remote cache in CI → references\u002Fcaching\u002Fremote-cache.md\n├─ Only build changed packages → --affected flag\n├─ Skip unnecessary builds → turbo-ignore (references\u002Fcli\u002Fcommands.md)\n└─ Skip container setup when no changes → turbo-ignore\n```\n\n### \"I want to watch for changes during development\"\n\n```\nWatch mode?\n├─ Re-run tasks on change → turbo watch (references\u002Fwatch\u002FRULE.md)\n├─ Dev servers with dependencies → Use `with` key (references\u002Fconfiguration\u002Ftasks.md#with)\n├─ Restart dev server on dep change → Use `interruptible: true`\n└─ Persistent dev tasks → Use `persistent: true`\n```\n\n### \"I need to create\u002Fstructure a package\"\n\n```\nPackage creation\u002Fstructure?\n├─ Create an internal package → references\u002Fbest-practices\u002Fpackages.md\n├─ Repository structure → references\u002Fbest-practices\u002Fstructure.md\n├─ Dependency management → references\u002Fbest-practices\u002Fdependencies.md\n├─ Best practices overview → references\u002Fbest-practices\u002FRULE.md\n├─ JIT vs Compiled packages → references\u002Fbest-practices\u002Fpackages.md#compilation-strategies\n└─ Sharing code between apps → references\u002Fbest-practices\u002FRULE.md#package-types\n```\n\n### \"How should I structure my monorepo?\"\n\n```\nMonorepo structure?\n├─ Standard layout (apps\u002F, packages\u002F) → references\u002Fbest-practices\u002FRULE.md\n├─ Package types (apps vs libraries) → references\u002Fbest-practices\u002FRULE.md#package-types\n├─ Creating internal packages → references\u002Fbest-practices\u002Fpackages.md\n├─ TypeScript configuration → references\u002Fbest-practices\u002Fstructure.md#typescript-configuration\n├─ ESLint configuration → references\u002Fbest-practices\u002Fstructure.md#eslint-configuration\n├─ Dependency management → references\u002Fbest-practices\u002Fdependencies.md\n└─ Enforce package boundaries → references\u002Fboundaries\u002FRULE.md\n```\n\n### \"I want to enforce architectural boundaries\"\n\n```\nEnforce boundaries?\n├─ Check for violations → turbo boundaries\n├─ Tag packages → references\u002Fboundaries\u002FRULE.md#tags\n├─ Restrict which packages can import others → references\u002Fboundaries\u002FRULE.md#rule-types\n└─ Prevent cross-package file imports → references\u002Fboundaries\u002FRULE.md\n```\n\n## Critical Anti-Patterns\n\n### Using `turbo` Shorthand in Code\n\n**`turbo run` is recommended in package.json scripts and CI pipelines.** The shorthand `turbo \u003Ctask>` is intended for interactive terminal use.\n\n```json\n\u002F\u002F WRONG - using shorthand in package.json\n{\n  \"scripts\": {\n    \"build\": \"turbo build\",\n    \"dev\": \"turbo dev\"\n  }\n}\n\n\u002F\u002F CORRECT\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"dev\": \"turbo run dev\"\n  }\n}\n```\n\n```yaml\n# WRONG - using shorthand in CI\n- run: turbo build --affected\n\n# CORRECT\n- run: turbo run build --affected\n```\n\n### Root Scripts Bypassing Turbo\n\nRoot `package.json` scripts MUST delegate to `turbo run`, not run tasks directly.\n\n```json\n\u002F\u002F WRONG - bypasses turbo entirely\n{\n  \"scripts\": {\n    \"build\": \"bun build\",\n    \"dev\": \"bun dev\"\n  }\n}\n\n\u002F\u002F CORRECT - delegates to turbo\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"dev\": \"turbo run dev\"\n  }\n}\n```\n\n### Using `&&` to Chain Turbo Tasks\n\nDon't chain turbo tasks with `&&`. Let turbo orchestrate.\n\n```json\n\u002F\u002F WRONG - turbo task not using turbo run\n{\n  \"scripts\": {\n    \"changeset:publish\": \"bun build && changeset publish\"\n  }\n}\n\n\u002F\u002F CORRECT\n{\n  \"scripts\": {\n    \"changeset:publish\": \"turbo run build && changeset publish\"\n  }\n}\n```\n\n### `prebuild` Scripts That Manually Build Dependencies\n\nScripts like `prebuild` that manually build other packages bypass Turborepo's dependency graph.\n\n```json\n\u002F\u002F WRONG - manually building dependencies\n{\n  \"scripts\": {\n    \"prebuild\": \"cd ..\u002F..\u002Fpackages\u002Ftypes && bun run build && cd ..\u002Futils && bun run build\",\n    \"build\": \"next build\"\n  }\n}\n```\n\n**However, the fix depends on whether workspace dependencies are declared:**\n\n1. **If dependencies ARE declared** (e.g., `\"@repo\u002Ftypes\": \"workspace:*\"` in package.json), remove the `prebuild` script. Turbo's `dependsOn: [\"^build\"]` handles this automatically.\n\n2. **If dependencies are NOT declared**, the `prebuild` exists because `^build` won't trigger without a dependency relationship. The fix is to:\n   - Add the dependency to package.json: `\"@repo\u002Ftypes\": \"workspace:*\"`\n   - Then remove the `prebuild` script\n\n```json\n\u002F\u002F CORRECT - declare dependency, let turbo handle build order\n\u002F\u002F package.json\n{\n  \"dependencies\": {\n    \"@repo\u002Ftypes\": \"workspace:*\",\n    \"@repo\u002Futils\": \"workspace:*\"\n  },\n  \"scripts\": {\n    \"build\": \"next build\"\n  }\n}\n\n\u002F\u002F turbo.json\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    }\n  }\n}\n```\n\n**Key insight:** `^build` only runs build in packages listed as dependencies. No dependency declaration = no automatic build ordering.\n\n### Overly Broad `globalDependencies`\n\n`globalDependencies` affects ALL tasks in ALL packages via the **global hash** — tasks cannot opt out of specific files, even with negation globs in `inputs`. Be specific.\n\n```json\n\u002F\u002F WRONG - heavy hammer, affects all hashes\n{\n  \"globalDependencies\": [\"**\u002F.env.*local\"]\n}\n\n\u002F\u002F BETTER - move to task-level inputs\n{\n  \"globalDependencies\": [\".env\"],\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n```\n\nWith `futureFlags.globalConfiguration`, this problem is reduced because `global.inputs` files are folded into each task's inputs (not the global hash). Tasks can exclude specific files:\n\n```json\n\u002F\u002F BEST - global.inputs with per-task exclusion\n{\n  \"futureFlags\": { \"globalConfiguration\": true },\n  \"global\": {\n    \"inputs\": [\".env\"]\n  },\n  \"tasks\": {\n    \"build\": { \"outputs\": [\"dist\u002F**\"] },\n    \"lint\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"!$TURBO_ROOT$\u002F.env\"]\n    }\n  }\n}\n```\n\n### Repetitive Task Configuration\n\nLook for repeated configuration across tasks that can be collapsed. Turborepo supports shared configuration patterns.\n\n```json\n\u002F\u002F WRONG - repetitive env and inputs across tasks\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"]\n    },\n    \"test\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"]\n    },\n    \"dev\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n\n\u002F\u002F BETTER - use globalEnv and globalDependencies for shared config\n{\n  \"globalEnv\": [\"API_URL\", \"DATABASE_URL\"],\n  \"globalDependencies\": [\".env*\"],\n  \"tasks\": {\n    \"build\": {},\n    \"test\": {},\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\n**When to use global vs task-level:**\n\n- `globalEnv` \u002F `globalDependencies` - affects ALL tasks, use for truly shared config\n- Task-level `env` \u002F `inputs` - use when only specific tasks need it\n\n### NOT an Anti-Pattern: Large `env` Arrays\n\nA 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.\n\n### Using `--parallel` Flag\n\nThe `--parallel` flag bypasses Turborepo's dependency graph. If tasks need parallel execution, configure `dependsOn` correctly instead.\n\n```bash\n# WRONG - bypasses dependency graph\nturbo run lint --parallel\n\n# CORRECT - configure tasks to allow parallel execution\n# In turbo.json, set dependsOn appropriately (or use transit nodes)\nturbo run lint\n```\n\n### Package-Specific Task Overrides in Root turbo.json\n\nWhen multiple packages need different task configurations, use **Package Configurations** (`turbo.json` in each package) instead of cluttering root `turbo.json` with `package#task` overrides.\n\n```json\n\u002F\u002F WRONG - root turbo.json with many package-specific overrides\n{\n  \"tasks\": {\n    \"test\": { \"dependsOn\": [\"build\"] },\n    \"@repo\u002Fweb#test\": { \"outputs\": [\"coverage\u002F**\"] },\n    \"@repo\u002Fapi#test\": { \"outputs\": [\"coverage\u002F**\"] },\n    \"@repo\u002Futils#test\": { \"outputs\": [] },\n    \"@repo\u002Fcli#test\": { \"outputs\": [] },\n    \"@repo\u002Fcore#test\": { \"outputs\": [] }\n  }\n}\n\n\u002F\u002F CORRECT - use Package Configurations\n\u002F\u002F Root turbo.json - base config only\n{\n  \"tasks\": {\n    \"test\": { \"dependsOn\": [\"build\"] }\n  }\n}\n\n\u002F\u002F packages\u002Fweb\u002Fturbo.json - package-specific override\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"test\": { \"outputs\": [\"coverage\u002F**\"] }\n  }\n}\n\n\u002F\u002F packages\u002Fapi\u002Fturbo.json\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"test\": { \"outputs\": [\"coverage\u002F**\"] }\n  }\n}\n```\n\n**Benefits of Package Configurations:**\n\n- Keeps configuration close to the code it affects\n- Root turbo.json stays clean and focused on base patterns\n- Easier to understand what's special about each package\n- Works with `$TURBO_EXTENDS$` to inherit + extend arrays\n\n**When to use `package#task` in root:**\n\n- Single package needs a unique dependency (e.g., `\"deploy\": { \"dependsOn\": [\"web#build\"] }`)\n- Temporary override while migrating\n\nSee `references\u002Fconfiguration\u002FRULE.md#package-configurations` for full details.\n\n### Using `..\u002F` to Traverse Out of Package in `inputs`\n\nDon't use relative paths like `..\u002F` to reference files outside the package. Use `$TURBO_ROOT$` instead.\n\n```json\n\u002F\u002F WRONG - traversing out of package\n{\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"..\u002Fshared-config.json\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT - use $TURBO_ROOT$ for repo root\n{\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"$TURBO_ROOT$\u002Fshared-config.json\"]\n    }\n  }\n}\n```\n\n### Missing `outputs` for File-Producing Tasks\n\n**Before flagging missing `outputs`, check what the task actually produces:**\n\n1. Read the package's script (e.g., `\"build\": \"tsc\"`, `\"test\": \"vitest\"`)\n2. Determine if it writes files to disk or only outputs to stdout\n3. Only flag if the task produces files that should be cached\n\n```json\n\u002F\u002F WRONG: build produces files but they're not cached\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: build outputs are cached\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n```\n\nCommon outputs by framework:\n\n- Next.js: `[\".next\u002F**\", \"!.next\u002Fcache\u002F**\"]`\n- Vite\u002FRollup: `[\"dist\u002F**\"]`\n- tsc: `[\"dist\u002F**\"]` or custom `outDir`\n\n**TypeScript `--noEmit` can still produce cache files:**\n\nWhen `incremental: true` in tsconfig.json, `tsc --noEmit` writes `.tsbuildinfo` files even without emitting JS. Check the tsconfig before assuming no outputs:\n\n```json\n\u002F\u002F If tsconfig has incremental: true, tsc --noEmit produces cache files\n{\n  \"tasks\": {\n    \"typecheck\": {\n      \"outputs\": [\"node_modules\u002F.cache\u002Ftsbuildinfo.json\"] \u002F\u002F or wherever tsBuildInfoFile points\n    }\n  }\n}\n```\n\nTo determine correct outputs for TypeScript tasks:\n\n1. Check if `incremental` or `composite` is enabled in tsconfig\n2. Check `tsBuildInfoFile` for custom cache location (default: alongside `outDir` or in project root)\n3. If no incremental mode, `tsc --noEmit` produces no files\n\n### `^build` vs `build` Confusion\n\n```json\n{\n  \"tasks\": {\n    \u002F\u002F ^build = run build in DEPENDENCIES first (other packages this one imports)\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    },\n    \u002F\u002F build (no ^) = run build in SAME PACKAGE first\n    \"test\": {\n      \"dependsOn\": [\"build\"]\n    },\n    \u002F\u002F pkg#task = specific package's task\n    \"deploy\": {\n      \"dependsOn\": [\"web#build\"]\n    }\n  }\n}\n```\n\n### Environment Variables Not Hashed\n\n```json\n\u002F\u002F WRONG: API_URL changes won't cause rebuilds\n{\n  \"tasks\": {\n    \"build\": {\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: API_URL changes invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"API_KEY\"]\n    }\n  }\n}\n```\n\n### `.env` Files Not in Inputs\n\nTurbo does NOT load `.env` files - your framework does. But Turbo needs to know about changes:\n\n```json\n\u002F\u002F WRONG: .env changes don't invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: .env file changes invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env\", \".env.*\"]\n    }\n  }\n}\n```\n\n### Root `.env` File in Monorepo\n\nA `.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.\n\n```\n\u002F\u002F WRONG - root .env affects all packages implicitly\nmy-monorepo\u002F\n├── .env              # Which packages use this?\n├── apps\u002F\n│   ├── web\u002F\n│   └── api\u002F\n└── packages\u002F\n\n\u002F\u002F CORRECT - .env files in packages that need them\nmy-monorepo\u002F\n├── apps\u002F\n│   ├── web\u002F\n│   │   └── .env      # Clear: web needs DATABASE_URL\n│   └── api\u002F\n│       └── .env      # Clear: api needs API_KEY\n└── packages\u002F\n```\n\n**Problems with root `.env`:**\n\n- Unclear which packages consume which variables\n- All packages get all variables (even ones they don't need)\n- Cache invalidation is coarse-grained (root .env change invalidates everything)\n- Security risk: packages may accidentally access sensitive vars meant for others\n- Bad habits start small — starter templates should model correct patterns\n\n**If you must share variables**, use `globalEnv` to be explicit about what's shared, and document why.\n\n### Strict Mode Filtering CI Variables\n\nBy default, Turborepo filters environment variables to only those in `env`\u002F`globalEnv`. CI variables may be missing:\n\n```json\n\u002F\u002F If CI scripts need GITHUB_TOKEN but it's not in env:\n{\n  \"globalPassThroughEnv\": [\"GITHUB_TOKEN\", \"CI\"],\n  \"tasks\": { ... }\n}\n```\n\nOr use `--env-mode=loose` (not recommended for production).\n\n### Shared Code in Apps (Should Be a Package)\n\n```\n\u002F\u002F WRONG: Shared code inside an app\napps\u002F\n  web\u002F\n    shared\u002F          # This breaks monorepo principles!\n      utils.ts\n\n\u002F\u002F CORRECT: Extract to a package\npackages\u002F\n  utils\u002F\n    src\u002Futils.ts\n```\n\n### Accessing Files Across Package Boundaries\n\n```typescript\n\u002F\u002F WRONG: Reaching into another package's internals\nimport { Button } from \"..\u002F..\u002Fpackages\u002Fui\u002Fsrc\u002Fbutton\";\n\n\u002F\u002F CORRECT: Install and import properly\nimport { Button } from \"@repo\u002Fui\u002Fbutton\";\n```\n\n### Too Many Root Dependencies\n\n```json\n\u002F\u002F WRONG: App dependencies in root\n{\n  \"dependencies\": {\n    \"react\": \"^18\",\n    \"next\": \"^14\"\n  }\n}\n\n\u002F\u002F CORRECT: Only repo tools in root\n{\n  \"devDependencies\": {\n    \"turbo\": \"latest\"\n  }\n}\n```\n\n## Common Task Configurations\n\n### Standard Build Pipeline\n\n```json\n{\n  \"$schema\": \"https:\u002F\u002Fv2-9-7-canary-13.turborepo.dev\u002Fschema.json\",\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\", \".next\u002F**\", \"!.next\u002Fcache\u002F**\"]\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\nAdd a `transit` task if you have tasks that need parallel execution with cache invalidation (see below).\n\n### Dev Task with `^dev` Pattern (for `turbo watch`)\n\nA `dev` task with `dependsOn: [\"^dev\"]` and `persistent: false` in root turbo.json may look unusual but is **correct for `turbo watch` workflows**:\n\n```json\n\u002F\u002F Root turbo.json\n{\n  \"tasks\": {\n    \"dev\": {\n      \"dependsOn\": [\"^dev\"],\n      \"cache\": false,\n      \"persistent\": false  \u002F\u002F Packages have one-shot dev scripts\n    }\n  }\n}\n\n\u002F\u002F Package turbo.json (apps\u002Fweb\u002Fturbo.json)\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"dev\": {\n      \"persistent\": true  \u002F\u002F Apps run long-running dev servers\n    }\n  }\n}\n```\n\n**Why this works:**\n\n- **Packages** (e.g., `@acme\u002Fdb`, `@acme\u002Fvalidators`) have `\"dev\": \"tsc\"` — one-shot type generation that completes quickly\n- **Apps** override with `persistent: true` for actual dev servers (Next.js, etc.)\n- **`turbo watch`** re-runs the one-shot package `dev` scripts when source files change, keeping types in sync\n\n**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.\n\n**Alternative pattern:** Use a separate task name like `prepare` or `generate` for one-shot dependency builds to make the intent clearer:\n\n```json\n{\n  \"tasks\": {\n    \"prepare\": {\n      \"dependsOn\": [\"^prepare\"],\n      \"outputs\": [\"dist\u002F**\"]\n    },\n    \"dev\": {\n      \"dependsOn\": [\"prepare\"],\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\n### Transit Nodes for Parallel Tasks with Cache Invalidation\n\nSome tasks can run in parallel (don't need built output from dependencies) but must invalidate cache when dependency source code changes.\n\n**The problem with `dependsOn: [\"^taskname\"]`:**\n\n- Forces sequential execution (slow)\n\n**The problem with `dependsOn: []` (no dependencies):**\n\n- Allows parallel execution (fast)\n- But cache is INCORRECT - changing dependency source won't invalidate cache\n\n**Transit Nodes solve both:**\n\n```json\n{\n  \"tasks\": {\n    \"transit\": { \"dependsOn\": [\"^transit\"] },\n    \"my-task\": { \"dependsOn\": [\"transit\"] }\n  }\n}\n```\n\nThe `transit` task creates dependency relationships without matching any actual script, so tasks run in parallel with correct cache invalidation.\n\n**How to identify tasks that need this pattern:** Look for tasks that read source files from dependencies but don't need their build outputs.\n\n### With Environment Variables\n\n```json\n{\n  \"globalEnv\": [\"NODE_ENV\"],\n  \"globalDependencies\": [\".env\"],\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"DATABASE_URL\"]\n    }\n  }\n}\n```\n\nWith `futureFlags.globalConfiguration`, the same config moves global settings under `global` — and `.env` becomes a per-task input instead of a global hash input:\n\n```json\n{\n  \"futureFlags\": { \"globalConfiguration\": true },\n  \"global\": {\n    \"env\": [\"NODE_ENV\"],\n    \"inputs\": [\".env\"]\n  },\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"DATABASE_URL\"]\n    }\n  }\n}\n```\n\n## Reference Index\n\n### Configuration\n\n| File                                                                            | Purpose                                                                   |\n| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |\n| [configuration\u002FRULE.md](.\u002Freferences\u002Fconfiguration\u002FRULE.md)                     | turbo.json overview, Package Configurations                               |\n| [configuration\u002Ftasks.md](.\u002Freferences\u002Fconfiguration\u002Ftasks.md)                   | dependsOn, outputs, inputs, env, cache, persistent                        |\n| [configuration\u002Fglobal-options.md](.\u002Freferences\u002Fconfiguration\u002Fglobal-options.md) | globalEnv, globalDependencies, global key, futureFlags, cacheDir, envMode |\n| [configuration\u002Fgotchas.md](.\u002Freferences\u002Fconfiguration\u002Fgotchas.md)               | Common configuration mistakes                                             |\n\n### Caching\n\n| File                                                            | Purpose                                      |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [caching\u002FRULE.md](.\u002Freferences\u002Fcaching\u002FRULE.md)                 | How caching works, hash inputs               |\n| [caching\u002Fremote-cache.md](.\u002Freferences\u002Fcaching\u002Fremote-cache.md) | Vercel Remote Cache, self-hosted, login\u002Flink |\n| [caching\u002Fgotchas.md](.\u002Freferences\u002Fcaching\u002Fgotchas.md)           | Debugging cache misses, --summarize, --dry   |\n\n### Environment Variables\n\n| File                                                          | Purpose                                   |\n| ------------------------------------------------------------- | ----------------------------------------- |\n| [environment\u002FRULE.md](.\u002Freferences\u002Fenvironment\u002FRULE.md)       | env, globalEnv, passThroughEnv            |\n| [environment\u002Fmodes.md](.\u002Freferences\u002Fenvironment\u002Fmodes.md)     | Strict vs Loose mode, framework inference |\n| [environment\u002Fgotchas.md](.\u002Freferences\u002Fenvironment\u002Fgotchas.md) | .env files, CI issues                     |\n\n### Filtering\n\n| File                                                        | Purpose                  |\n| ----------------------------------------------------------- | ------------------------ |\n| [filtering\u002FRULE.md](.\u002Freferences\u002Ffiltering\u002FRULE.md)         | --filter syntax overview |\n| [filtering\u002Fpatterns.md](.\u002Freferences\u002Ffiltering\u002Fpatterns.md) | Common filter patterns   |\n\n### CI\u002FCD\n\n| File                                                      | Purpose                         |\n| --------------------------------------------------------- | ------------------------------- |\n| [ci\u002FRULE.md](.\u002Freferences\u002Fci\u002FRULE.md)                     | General CI principles           |\n| [ci\u002Fgithub-actions.md](.\u002Freferences\u002Fci\u002Fgithub-actions.md) | Complete GitHub Actions setup   |\n| [ci\u002Fvercel.md](.\u002Freferences\u002Fci\u002Fvercel.md)                 | Vercel deployment, turbo-ignore |\n| [ci\u002Fpatterns.md](.\u002Freferences\u002Fci\u002Fpatterns.md)             | --affected, caching strategies  |\n\n### CLI\n\n| File                                            | Purpose                                       |\n| ----------------------------------------------- | --------------------------------------------- |\n| [cli\u002FRULE.md](.\u002Freferences\u002Fcli\u002FRULE.md)         | turbo run basics                              |\n| [cli\u002Fcommands.md](.\u002Freferences\u002Fcli\u002Fcommands.md) | turbo run flags, turbo-ignore, other commands |\n\n### Best Practices\n\n| File                                                                          | Purpose                                                         |\n| ----------------------------------------------------------------------------- | --------------------------------------------------------------- |\n| [best-practices\u002FRULE.md](.\u002Freferences\u002Fbest-practices\u002FRULE.md)                 | Monorepo best practices overview                                |\n| [best-practices\u002Fstructure.md](.\u002Freferences\u002Fbest-practices\u002Fstructure.md)       | Repository structure, workspace config, TypeScript\u002FESLint setup |\n| [best-practices\u002Fpackages.md](.\u002Freferences\u002Fbest-practices\u002Fpackages.md)         | Creating internal packages, JIT vs Compiled, exports            |\n| [best-practices\u002Fdependencies.md](.\u002Freferences\u002Fbest-practices\u002Fdependencies.md) | Dependency management, installing, version sync                 |\n\n### Watch Mode\n\n| File                                        | Purpose                                         |\n| ------------------------------------------- | ----------------------------------------------- |\n| [watch\u002FRULE.md](.\u002Freferences\u002Fwatch\u002FRULE.md) | turbo watch, interruptible tasks, dev workflows |\n\n### Boundaries (Experimental)\n\n| File                                                  | Purpose                                               |\n| ----------------------------------------------------- | ----------------------------------------------------- |\n| [boundaries\u002FRULE.md](.\u002Freferences\u002Fboundaries\u002FRULE.md) | Enforce package isolation, tag-based dependency rules |\n\n## Source Documentation\n\nThis skill is based on the official Turborepo documentation at:\n\n- Source: `apps\u002Fdocs\u002Fcontent\u002Fdocs\u002F` in the Turborepo repository\n- Live: https:\u002F\u002Fturborepo.dev\u002Fdocs\n","# Turborepo Skill\n\nBuild system for JavaScript\u002FTypeScript monorepos. Turborepo caches task outputs and runs tasks in parallel based on dependency graph.\n\n## IMPORTANT: Package Tasks, Not Root Tasks\n\n**DO NOT create Root Tasks. ALWAYS create package tasks.**\n\nWhen creating tasks\u002Fscripts\u002Fpipelines, you MUST:\n\n1. Add the script to each relevant package's `package.json`\n2. Register the task in root `turbo.json`\n3. Root `package.json` only delegates via `turbo run \u003Ctask>`\n\n**DO NOT** put task logic in root `package.json`. This defeats Turborepo's parallelization.\n\n```json\n\u002F\u002F DO THIS: Scripts in each package\n\u002F\u002F apps\u002Fweb\u002Fpackage.json\n{ \"scripts\": { \"build\": \"next build\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n\n\u002F\u002F apps\u002Fapi\u002Fpackage.json\n{ \"scripts\": { \"build\": \"tsc\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n\n\u002F\u002F packages\u002Fui\u002Fpackage.json\n{ \"scripts\": { \"build\": \"tsc\", \"lint\": \"eslint .\", \"test\": \"vitest\" } }\n```\n\n```json\n\u002F\u002F turbo.json - register tasks\n{\n  \"tasks\": {\n    \"build\": { \"dependsOn\": [\"^build\"], \"outputs\": [\"dist\u002F**\"] },\n    \"lint\": {},\n    \"test\": { \"dependsOn\": [\"build\"] }\n  }\n}\n```\n\n```json\n\u002F\u002F Root package.json - ONLY delegates, no task logic\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"lint\": \"turbo run lint\",\n    \"test\": \"turbo run test\"\n  }\n}\n```\n\n```json\n\u002F\u002F DO NOT DO THIS - defeats parallelization\n\u002F\u002F Root package.json\n{\n  \"scripts\": {\n    \"build\": \"cd apps\u002Fweb && next build && cd ..\u002Fapi && tsc\",\n    \"lint\": \"eslint apps\u002F packages\u002F\",\n    \"test\": \"vitest\"\n  }\n}\n```\n\nRoot Tasks (`\u002F\u002F#taskname`) are ONLY for tasks that truly cannot exist in packages (rare).\n\n## Secondary Rule: `turbo run` vs `turbo`\n\n**Always use `turbo run` when the command is written into code:**\n\n```json\n\u002F\u002F package.json - ALWAYS \"turbo run\"\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\"\n  }\n}\n```\n\n```yaml\n# CI workflows - ALWAYS \"turbo run\"\n- run: turbo run build --affected\n```\n\n**The shorthand `turbo \u003Ctasks>` is ONLY for one-off terminal commands** typed directly by humans or agents. Never write `turbo build` into package.json, CI, or scripts.\n\n## Quick Decision Trees\n\n### \"I need to configure a task\"\n\n```\nConfigure a task?\n├─ Define task dependencies → references\u002Fconfiguration\u002Ftasks.md\n├─ Lint\u002Fcheck-types (parallel + caching) → Use Transit Nodes pattern (see below)\n├─ Specify build outputs → references\u002Fconfiguration\u002Ftasks.md#outputs\n├─ Handle environment variables → references\u002Fenvironment\u002FRULE.md\n├─ Set up dev\u002Fwatch tasks → references\u002Fconfiguration\u002Ftasks.md#persistent\n├─ Package-specific config → references\u002Fconfiguration\u002FRULE.md#package-configurations\n└─ Global settings (cacheDir, daemon) → references\u002Fconfiguration\u002Fglobal-options.md\n```\n\n### \"My cache isn't working\"\n\n```\nCache problems?\n├─ Tasks run but outputs not restored → Missing `outputs` key\n├─ Cache misses unexpectedly → references\u002Fcaching\u002Fgotchas.md\n├─ Need to debug hash inputs → Use --summarize or --dry\n├─ Want to skip cache entirely → Use --force or cache: false\n├─ Remote cache not working → references\u002Fcaching\u002Fremote-cache.md\n└─ Environment causing misses → references\u002Fenvironment\u002Fgotchas.md\n```\n\n### \"I want to run only changed packages\"\n\n```\nRun only what changed?\n├─ Changed packages + dependents (RECOMMENDED) → turbo run build --affected\n├─ Custom base branch → --affected --affected-base=origin\u002Fdevelop\n├─ Manual git comparison → --filter=...[origin\u002Fmain]\n└─ See all filter options → references\u002Ffiltering\u002FRULE.md\n```\n\n**`--affected` is the primary way to run only changed packages.** It automatically compares against the default branch and includes dependents.\n\n### \"I want to filter packages\"\n\n```\nFilter packages?\n├─ Only changed packages → --affected (see above)\n├─ By package name → --filter=web\n├─ By directory → --filter=.\u002Fapps\u002F*\n├─ Package + dependencies → --filter=web...\n├─ Package + dependents → --filter=...web\n└─ Complex combinations → references\u002Ffiltering\u002Fpatterns.md\n```\n\n### \"Environment variables aren't working\"\n\n```\nEnvironment issues?\n├─ Vars not available at runtime → Strict mode filtering (default)\n├─ Cache hits with wrong env → Var not in `env` key\n├─ .env changes not causing rebuilds → .env not in `inputs`\n├─ CI variables missing → references\u002Fenvironment\u002Fgotchas.md\n└─ Framework vars (NEXT_PUBLIC_*) → Auto-included via inference\n```\n\n### \"I need to set up CI\"\n\n```\nCI setup?\n├─ GitHub Actions → references\u002Fci\u002Fgithub-actions.md\n├─ Vercel deployment → references\u002Fci\u002Fvercel.md\n├─ Remote cache in CI → references\u002Fcaching\u002Fremote-cache.md\n├─ Only build changed packages → --affected flag\n├─ Skip unnecessary builds → turbo-ignore (references\u002Fcli\u002Fcommands.md)\n└─ Skip container setup when no changes → turbo-ignore\n```\n\n### \"I want to watch for changes during development\"\n\n```\nWatch mode?\n├─ Re-run tasks on change → turbo watch (references\u002Fwatch\u002FRULE.md)\n├─ Dev servers with dependencies → Use `with` key (references\u002Fconfiguration\u002Ftasks.md#with)\n├─ Restart dev server on dep change → Use `interruptible: true`\n└─ Persistent dev tasks → Use `persistent: true`\n```\n\n### \"I need to create\u002Fstructure a package\"\n\n```\nPackage creation\u002Fstructure?\n├─ Create an internal package → references\u002Fbest-practices\u002Fpackages.md\n├─ Repository structure → references\u002Fbest-practices\u002Fstructure.md\n├─ Dependency management → references\u002Fbest-practices\u002Fdependencies.md\n├─ Best practices overview → references\u002Fbest-practices\u002FRULE.md\n├─ JIT vs Compiled packages → references\u002Fbest-practices\u002Fpackages.md#compilation-strategies\n└─ Sharing code between apps → references\u002Fbest-practices\u002FRULE.md#package-types\n```\n\n### \"How should I structure my monorepo?\"\n\n```\nMonorepo structure?\n├─ Standard layout (apps\u002F, packages\u002F) → references\u002Fbest-practices\u002FRULE.md\n├─ Package types (apps vs libraries) → references\u002Fbest-practices\u002FRULE.md#package-types\n├─ Creating internal packages → references\u002Fbest-practices\u002Fpackages.md\n├─ TypeScript configuration → references\u002Fbest-practices\u002Fstructure.md#typescript-configuration\n├─ ESLint configuration → references\u002Fbest-practices\u002Fstructure.md#eslint-configuration\n├─ Dependency management → references\u002Fbest-practices\u002Fdependencies.md\n└─ Enforce package boundaries → references\u002Fboundaries\u002FRULE.md\n```\n\n### \"I want to enforce architectural boundaries\"\n\n```\nEnforce boundaries?\n├─ Check for violations → turbo boundaries\n├─ Tag packages → references\u002Fboundaries\u002FRULE.md#tags\n├─ Restrict which packages can import others → references\u002Fboundaries\u002FRULE.md#rule-types\n└─ Prevent cross-package file imports → references\u002Fboundaries\u002FRULE.md\n```\n\n## Critical Anti-Patterns\n\n### Using `turbo` Shorthand in Code\n\n**`turbo run` is recommended in package.json scripts and CI pipelines.** The shorthand `turbo \u003Ctask>` is intended for interactive terminal use.\n\n```json\n\u002F\u002F WRONG - using shorthand in package.json\n{\n  \"scripts\": {\n    \"build\": \"turbo build\",\n    \"dev\": \"turbo dev\"\n  }\n}\n\n\u002F\u002F CORRECT\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"dev\": \"turbo run dev\"\n  }\n}\n```\n\n```yaml\n# WRONG - using shorthand in CI\n- run: turbo build --affected\n\n# CORRECT\n- run: turbo run build --affected\n```\n\n### Root Scripts Bypassing Turbo\n\nRoot `package.json` scripts MUST delegate to `turbo run`, not run tasks directly.\n\n```json\n\u002F\u002F WRONG - bypasses turbo entirely\n{\n  \"scripts\": {\n    \"build\": \"bun build\",\n    \"dev\": \"bun dev\"\n  }\n}\n\n\u002F\u002F CORRECT - delegates to turbo\n{\n  \"scripts\": {\n    \"build\": \"turbo run build\",\n    \"dev\": \"turbo run dev\"\n  }\n}\n```\n\n### Using `&&` to Chain Turbo Tasks\n\nDon't chain turbo tasks with `&&`. Let turbo orchestrate.\n\n```json\n\u002F\u002F WRONG - turbo task not using turbo run\n{\n  \"scripts\": {\n    \"changeset:publish\": \"bun build && changeset publish\"\n  }\n}\n\n\u002F\u002F CORRECT\n{\n  \"scripts\": {\n    \"changeset:publish\": \"turbo run build && changeset publish\"\n  }\n}\n```\n\n### `prebuild` Scripts That Manually Build Dependencies\n\nScripts like `prebuild` that manually build other packages bypass Turborepo's dependency graph.\n\n```json\n\u002F\u002F WRONG - manually building dependencies\n{\n  \"scripts\": {\n    \"prebuild\": \"cd ..\u002F..\u002Fpackages\u002Ftypes && bun run build && cd ..\u002Futils && bun run build\",\n    \"build\": \"next build\"\n  }\n}\n```\n\n**However, the fix depends on whether workspace dependencies are declared:**\n\n1. **If dependencies ARE declared** (e.g., `\"@repo\u002Ftypes\": \"workspace:*\"` in package.json), remove the `prebuild` script. Turbo's `dependsOn: [\"^build\"]` handles this automatically.\n\n2. **If dependencies are NOT declared**, the `prebuild` exists because `^build` won't trigger without a dependency relationship. The fix is to:\n   - Add the dependency to package.json: `\"@repo\u002Ftypes\": \"workspace:*\"`\n   - Then remove the `prebuild` script\n\n```json\n\u002F\u002F CORRECT - declare dependency, let turbo handle build order\n\u002F\u002F package.json\n{\n  \"dependencies\": {\n    \"@repo\u002Ftypes\": \"workspace:*\",\n    \"@repo\u002Futils\": \"workspace:*\"\n  },\n  \"scripts\": {\n    \"build\": \"next build\"\n  }\n}\n\n\u002F\u002F turbo.json\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    }\n  }\n}\n```\n\n**Key insight:** `^build` only runs build in packages listed as dependencies. No dependency declaration = no automatic build ordering.\n\n### Overly Broad `globalDependencies`\n\n`globalDependencies` affects ALL tasks in ALL packages via the **global hash** — tasks cannot opt out of specific files, even with negation globs in `inputs`. Be specific.\n\n```json\n\u002F\u002F WRONG - heavy hammer, affects all hashes\n{\n  \"globalDependencies\": [\"**\u002F.env.*local\"]\n}\n\n\u002F\u002F BETTER - move to task-level inputs\n{\n  \"globalDependencies\": [\".env\"],\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n```\n\nWith `futureFlags.globalConfiguration`, this problem is reduced because `global.inputs` files are folded into each task's inputs (not the global hash). Tasks can exclude specific files:\n\n```json\n\u002F\u002F BEST - global.inputs with per-task exclusion\n{\n  \"futureFlags\": { \"globalConfiguration\": true },\n  \"global\": {\n    \"inputs\": [\".env\"]\n  },\n  \"tasks\": {\n    \"build\": { \"outputs\": [\"dist\u002F**\"] },\n    \"lint\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"!$TURBO_ROOT$\u002F.env\"]\n    }\n  }\n}\n```\n\n### Repetitive Task Configuration\n\nLook for repeated configuration across tasks that can be collapsed. Turborepo supports shared configuration patterns.\n\n```json\n\u002F\u002F WRONG - repetitive env and inputs across tasks\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"]\n    },\n    \"test\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"]\n    },\n    \"dev\": {\n      \"env\": [\"API_URL\", \"DATABASE_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n\n\u002F\u002F BETTER - use globalEnv and globalDependencies for shared config\n{\n  \"globalEnv\": [\"API_URL\", \"DATABASE_URL\"],\n  \"globalDependencies\": [\".env*\"],\n  \"tasks\": {\n    \"build\": {},\n    \"test\": {},\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\n**When to use global vs task-level:**\n\n- `globalEnv` \u002F `globalDependencies` - affects ALL tasks, use for truly shared config\n- Task-level `env` \u002F `inputs` - use when only specific tasks need it\n\n### NOT an Anti-Pattern: Large `env` Arrays\n\nA 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.\n\n### Using `--parallel` Flag\n\nThe `--parallel` flag bypasses Turborepo's dependency graph. If tasks need parallel execution, configure `dependsOn` correctly instead.\n\n```bash\n# WRONG - bypasses dependency graph\nturbo run lint --parallel\n\n# CORRECT - configure tasks to allow parallel execution\n# In turbo.json, set dependsOn appropriately (or use transit nodes)\nturbo run lint\n```\n\n### Package-Specific Task Overrides in Root turbo.json\n\nWhen multiple packages need different task configurations, use **Package Configurations** (`turbo.json` in each package) instead of cluttering root `turbo.json` with `package#task` overrides.\n\n```json\n\u002F\u002F WRONG - root turbo.json with many package-specific overrides\n{\n  \"tasks\": {\n    \"test\": { \"dependsOn\": [\"build\"] },\n    \"@repo\u002Fweb#test\": { \"outputs\": [\"coverage\u002F**\"] },\n    \"@repo\u002Fapi#test\": { \"outputs\": [\"coverage\u002F**\"] },\n    \"@repo\u002Futils#test\": { \"outputs\": [] },\n    \"@repo\u002Fcli#test\": { \"outputs\": [] },\n    \"@repo\u002Fcore#test\": { \"outputs\": [] }\n  }\n}\n\n\u002F\u002F CORRECT - use Package Configurations\n\u002F\u002F Root turbo.json - base config only\n{\n  \"tasks\": {\n    \"test\": { \"dependsOn\": [\"build\"] }\n  }\n}\n\n\u002F\u002F packages\u002Fweb\u002Fturbo.json - package-specific override\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"test\": { \"outputs\": [\"coverage\u002F**\"] }\n  }\n}\n\n\u002F\u002F packages\u002Fapi\u002Fturbo.json\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"test\": { \"outputs\": [\"coverage\u002F**\"] }\n  }\n}\n```\n\n**Benefits of Package Configurations:**\n\n- Keeps configuration close to the code it affects\n- Root turbo.json stays clean and focused on base patterns\n- Easier to understand what's special about each package\n- Works with `$TURBO_EXTENDS$` to inherit + extend arrays\n\n**When to use `package#task` in root:**\n\n- Single package needs a unique dependency (e.g., `\"deploy\": { \"dependsOn\": [\"web#build\"] }`)\n- Temporary override while migrating\n\nSee `references\u002Fconfiguration\u002FRULE.md#package-configurations` for full details.\n\n### Using `..\u002F` to Traverse Out of Package in `inputs`\n\nDon't use relative paths like `..\u002F` to reference files outside the package. Use `$TURBO_ROOT$` instead.\n\n```json\n\u002F\u002F WRONG - traversing out of package\n{\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"..\u002Fshared-config.json\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT - use $TURBO_ROOT$ for repo root\n{\n  \"tasks\": {\n    \"build\": {\n      \"inputs\": [\"$TURBO_DEFAULT$\", \"$TURBO_ROOT$\u002Fshared-config.json\"]\n    }\n  }\n}\n```\n\n### Missing `outputs` for File-Producing Tasks\n\n**Before flagging missing `outputs`, check what the task actually produces:**\n\n1. Read the package's script (e.g., `\"build\": \"tsc\"`, `\"test\": \"vitest\"`)\n2. Determine if it writes files to disk or only outputs to stdout\n3. Only flag if the task produces files that should be cached\n\n```json\n\u002F\u002F WRONG: build produces files but they're not cached\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: build outputs are cached\n{\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n```\n\nCommon outputs by framework:\n\n- Next.js: `[\".next\u002F**\", \"!.next\u002Fcache\u002F**\"]`\n- Vite\u002FRollup: `[\"dist\u002F**\"]`\n- tsc: `[\"dist\u002F**\"]` or custom `outDir`\n\n**TypeScript `--noEmit` can still produce cache files:**\n\nWhen `incremental: true` in tsconfig.json, `tsc --noEmit` writes `.tsbuildinfo` files even without emitting JS. Check the tsconfig before assuming no outputs:\n\n```json\n\u002F\u002F If tsconfig has incremental: true, tsc --noEmit produces cache files\n{\n  \"tasks\": {\n    \"typecheck\": {\n      \"outputs\": [\"node_modules\u002F.cache\u002Ftsbuildinfo.json\"] \u002F\u002F or wherever tsBuildInfoFile points\n    }\n  }\n}\n```\n\nTo determine correct outputs for TypeScript tasks:\n\n1. Check if `incremental` or `composite` is enabled in tsconfig\n2. Check `tsBuildInfoFile` for custom cache location (default: alongside `outDir` or in project root)\n3. If no incremental mode, `tsc --noEmit` produces no files\n\n### `^build` vs `build` Confusion\n\n```json\n{\n  \"tasks\": {\n    \u002F\u002F ^build = run build in DEPENDENCIES first (other packages this one imports)\n    \"build\": {\n      \"dependsOn\": [\"^build\"]\n    },\n    \u002F\u002F build (no ^) = run build in SAME PACKAGE first\n    \"test\": {\n      \"dependsOn\": [\"build\"]\n    },\n    \u002F\u002F pkg#task = specific package's task\n    \"deploy\": {\n      \"dependsOn\": [\"web#build\"]\n    }\n  }\n}\n```\n\n### Environment Variables Not Hashed\n\n```json\n\u002F\u002F WRONG: API_URL changes won't cause rebuilds\n{\n  \"tasks\": {\n    \"build\": {\n      \"outputs\": [\"dist\u002F**\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: API_URL changes invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"API_KEY\"]\n    }\n  }\n}\n```\n\n### `.env` Files Not in Inputs\n\nTurbo does NOT load `.env` files - your framework does. But Turbo needs to know about changes:\n\n```json\n\u002F\u002F WRONG: .env changes don't invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\"]\n    }\n  }\n}\n\n\u002F\u002F CORRECT: .env file changes invalidate cache\n{\n  \"tasks\": {\n    \"build\": {\n      \"env\": [\"API_URL\"],\n      \"inputs\": [\"$TURBO_DEFAULT$\", \".env\", \".env.*\"]\n    }\n  }\n}\n```\n\n### Root `.env` File in Monorepo\n\nA `.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.\n\n```\n\u002F\u002F WRONG - root .env affects all packages implicitly\nmy-monorepo\u002F\n├── .env              # Which packages use this?\n├── apps\u002F\n│   ├── web\u002F\n│   └── api\u002F\n└── packages\u002F\n\n\u002F\u002F CORRECT - .env files in packages that need them\nmy-monorepo\u002F\n├── apps\u002F\n│   ├── web\u002F\n│   │   └── .env      # Clear: web needs DATABASE_URL\n│   └── api\u002F\n│       └── .env      # Clear: api needs API_KEY\n└── packages\u002F\n```\n\n**Problems with root `.env`:**\n\n- Unclear which packages consume which variables\n- All packages get all variables (even ones they don't need)\n- Cache invalidation is coarse-grained (root .env change invalidates everything)\n- Security risk: packages may accidentally access sensitive vars meant for others\n- Bad habits start small — starter templates should model correct patterns\n\n**If you must share variables**, use `globalEnv` to be explicit about what's shared, and document why.\n\n### Strict Mode Filtering CI Variables\n\nBy default, Turborepo filters environment variables to only those in `env`\u002F`globalEnv`. CI variables may be missing:\n\n```json\n\u002F\u002F If CI scripts need GITHUB_TOKEN but it's not in env:\n{\n  \"globalPassThroughEnv\": [\"GITHUB_TOKEN\", \"CI\"],\n  \"tasks\": { ... }\n}\n```\n\nOr use `--env-mode=loose` (not recommended for production).\n\n### Shared Code in Apps (Should Be a Package)\n\n```\n\u002F\u002F WRONG: Shared code inside an app\napps\u002F\n  web\u002F\n    shared\u002F          # This breaks monorepo principles!\n      utils.ts\n\n\u002F\u002F CORRECT: Extract to a package\npackages\u002F\n  utils\u002F\n    src\u002Futils.ts\n```\n\n### Accessing Files Across Package Boundaries\n\n```typescript\n\u002F\u002F WRONG: Reaching into another package's internals\nimport { Button } from \"..\u002F..\u002Fpackages\u002Fui\u002Fsrc\u002Fbutton\";\n\n\u002F\u002F CORRECT: Install and import properly\nimport { Button } from \"@repo\u002Fui\u002Fbutton\";\n```\n\n### Too Many Root Dependencies\n\n```json\n\u002F\u002F WRONG: App dependencies in root\n{\n  \"dependencies\": {\n    \"react\": \"^18\",\n    \"next\": \"^14\"\n  }\n}\n\n\u002F\u002F CORRECT: Only repo tools in root\n{\n  \"devDependencies\": {\n    \"turbo\": \"latest\"\n  }\n}\n```\n\n## Common Task Configurations\n\n### Standard Build Pipeline\n\n```json\n{\n  \"$schema\": \"https:\u002F\u002Fv2-9-7-canary-13.turborepo.dev\u002Fschema.json\",\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\", \".next\u002F**\", \"!.next\u002Fcache\u002F**\"]\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\nAdd a `transit` task if you have tasks that need parallel execution with cache invalidation (see below).\n\n### Dev Task with `^dev` Pattern (for `turbo watch`)\n\nA `dev` task with `dependsOn: [\"^dev\"]` and `persistent: false` in root turbo.json may look unusual but is **correct for `turbo watch` workflows**:\n\n```json\n\u002F\u002F Root turbo.json\n{\n  \"tasks\": {\n    \"dev\": {\n      \"dependsOn\": [\"^dev\"],\n      \"cache\": false,\n      \"persistent\": false  \u002F\u002F Packages have one-shot dev scripts\n    }\n  }\n}\n\n\u002F\u002F Package turbo.json (apps\u002Fweb\u002Fturbo.json)\n{\n  \"extends\": [\"\u002F\u002F\"],\n  \"tasks\": {\n    \"dev\": {\n      \"persistent\": true  \u002F\u002F Apps run long-running dev servers\n    }\n  }\n}\n```\n\n**Why this works:**\n\n- **Packages** (e.g., `@acme\u002Fdb`, `@acme\u002Fvalidators`) have `\"dev\": \"tsc\"` — one-shot type generation that completes quickly\n- **Apps** override with `persistent: true` for actual dev servers (Next.js, etc.)\n- **`turbo watch`** re-runs the one-shot package `dev` scripts when source files change, keeping types in sync\n\n**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.\n\n**Alternative pattern:** Use a separate task name like `prepare` or `generate` for one-shot dependency builds to make the intent clearer:\n\n```json\n{\n  \"tasks\": {\n    \"prepare\": {\n      \"dependsOn\": [\"^prepare\"],\n      \"outputs\": [\"dist\u002F**\"]\n    },\n    \"dev\": {\n      \"dependsOn\": [\"prepare\"],\n      \"cache\": false,\n      \"persistent\": true\n    }\n  }\n}\n```\n\n### Transit Nodes for Parallel Tasks with Cache Invalidation\n\nSome tasks can run in parallel (don't need built output from dependencies) but must invalidate cache when dependency source code changes.\n\n**The problem with `dependsOn: [\"^taskname\"]`:**\n\n- Forces sequential execution (slow)\n\n**The problem with `dependsOn: []` (no dependencies):**\n\n- Allows parallel execution (fast)\n- But cache is INCORRECT - changing dependency source won't invalidate cache\n\n**Transit Nodes solve both:**\n\n```json\n{\n  \"tasks\": {\n    \"transit\": { \"dependsOn\": [\"^transit\"] },\n    \"my-task\": { \"dependsOn\": [\"transit\"] }\n  }\n}\n```\n\nThe `transit` task creates dependency relationships without matching any actual script, so tasks run in parallel with correct cache invalidation.\n\n**How to identify tasks that need this pattern:** Look for tasks that read source files from dependencies but don't need their build outputs.\n\n### With Environment Variables\n\n```json\n{\n  \"globalEnv\": [\"NODE_ENV\"],\n  \"globalDependencies\": [\".env\"],\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"DATABASE_URL\"]\n    }\n  }\n}\n```\n\nWith `futureFlags.globalConfiguration`, the same config moves global settings under `global` — and `.env` becomes a per-task input instead of a global hash input:\n\n```json\n{\n  \"futureFlags\": { \"globalConfiguration\": true },\n  \"global\": {\n    \"env\": [\"NODE_ENV\"],\n    \"inputs\": [\".env\"]\n  },\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\"],\n      \"env\": [\"API_URL\", \"DATABASE_URL\"]\n    }\n  }\n}\n```\n\n## Reference Index\n\n### Configuration\n\n| File                                                                            | Purpose                                                                   |\n| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |\n| [configuration\u002FRULE.md](.\u002Freferences\u002Fconfiguration\u002FRULE.md)                     | turbo.json overview, Package Configurations                               |\n| [configuration\u002Ftasks.md](.\u002Freferences\u002Fconfiguration\u002Ftasks.md)                   | dependsOn, outputs, inputs, env, cache, persistent                        |\n| [configuration\u002Fglobal-options.md](.\u002Freferences\u002Fconfiguration\u002Fglobal-options.md) | globalEnv, globalDependencies, global key, futureFlags, cacheDir, envMode |\n| [configuration\u002Fgotchas.md](.\u002Freferences\u002Fconfiguration\u002Fgotchas.md)               | Common configuration mistakes                                             |\n\n### Caching\n\n| File                                                            | Purpose                                      |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [caching\u002FRULE.md](.\u002Freferences\u002Fcaching\u002FRULE.md)                 | How caching works, hash inputs               |\n| [caching\u002Fremote-cache.md](.\u002Freferences\u002Fcaching\u002Fremote-cache.md) | Vercel Remote Cache, self-hosted, login\u002Flink |\n| [caching\u002Fgotchas.md](.\u002Freferences\u002Fcaching\u002Fgotchas.md)           | Debugging cache misses, --summarize, --dry   |\n\n### Environment Variables\n\n| File                                                          | Purpose                                   |\n| ------------------------------------------------------------- | ----------------------------------------- |\n| [environment\u002FRULE.md](.\u002Freferences\u002Fenvironment\u002FRULE.md)       | env, globalEnv, passThroughEnv            |\n| [environment\u002Fmodes.md](.\u002Freferences\u002Fenvironment\u002Fmodes.md)     | Strict vs Loose mode, framework inference |\n| [environment\u002Fgotchas.md](.\u002Freferences\u002Fenvironment\u002Fgotchas.md) | .env files, CI issues                     |\n\n### Filtering\n\n| File                                                        | Purpose                  |\n| ----------------------------------------------------------- | ------------------------ |\n| [filtering\u002FRULE.md](.\u002Freferences\u002Ffiltering\u002FRULE.md)         | --filter syntax overview |\n| [filtering\u002Fpatterns.md](.\u002Freferences\u002Ffiltering\u002Fpatterns.md) | Common filter patterns   |\n\n### CI\u002FCD\n\n| File                                                      | Purpose                         |\n| --------------------------------------------------------- | ------------------------------- |\n| [ci\u002FRULE.md](.\u002Freferences\u002Fci\u002FRULE.md)                     | General CI principles           |\n| [ci\u002Fgithub-actions.md](.\u002Freferences\u002Fci\u002Fgithub-actions.md) | Complete GitHub Actions setup   |\n| [ci\u002Fvercel.md](.\u002Freferences\u002Fci\u002Fvercel.md)                 | Vercel deployment, turbo-ignore |\n| [ci\u002Fpatterns.md](.\u002Freferences\u002Fci\u002Fpatterns.md)             | --affected, caching strategies  |\n\n### CLI\n\n| File                                            | Purpose                                       |\n| ----------------------------------------------- | --------------------------------------------- |\n| [cli\u002FRULE.md](.\u002Freferences\u002Fcli\u002FRULE.md)         | turbo run basics                              |\n| [cli\u002Fcommands.md](.\u002Freferences\u002Fcli\u002Fcommands.md) | turbo run flags, turbo-ignore, other commands |\n\n### Best Practices\n\n| File                                                                          | Purpose                                                         |\n| ----------------------------------------------------------------------------- | --------------------------------------------------------------- |\n| [best-practices\u002FRULE.md](.\u002Freferences\u002Fbest-practices\u002FRULE.md)                 | Monorepo best practices overview                                |\n| [best-practices\u002Fstructure.md](.\u002Freferences\u002Fbest-practices\u002Fstructure.md)       | Repository structure, workspace config, TypeScript\u002FESLint setup |\n| [best-practices\u002Fpackages.md](.\u002Freferences\u002Fbest-practices\u002Fpackages.md)         | Creating internal packages, JIT vs Compiled, exports            |\n| [best-practices\u002Fdependencies.md](.\u002Freferences\u002Fbest-practices\u002Fdependencies.md) | Dependency management, installing, version sync                 |\n\n### Watch Mode\n\n| File                                        | Purpose                                         |\n| ------------------------------------------- | ----------------------------------------------- |\n| [watch\u002FRULE.md](.\u002Freferences\u002Fwatch\u002FRULE.md) | turbo watch, interruptible tasks, dev workflows |\n\n### Boundaries (Experimental)\n\n| File                                                  | Purpose                                               |\n| ----------------------------------------------------- | ----------------------------------------------------- |\n| [boundaries\u002FRULE.md](.\u002Freferences\u002Fboundaries\u002FRULE.md) | Enforce package isolation, tag-based dependency rules |\n\n## Source Documentation\n\nThis skill is based on the official Turborepo documentation at:\n\n- Source: `apps\u002Fdocs\u002Fcontent\u002Fdocs\u002F` in the Turborepo repository\n- Live: https:\u002F\u002Fturborepo.dev\u002Fdocs\n",{"name":5,"metadata":43,"description":45},{"version":44},"2.9.7-canary.13","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n","main","a9b682706866a1a8a44c4621910184c29456acff",".agents\u002Fskills\u002Fturborepo","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re","https:\u002F\u002Fskills.re","https:\u002F\u002Fgithub.com\u002Fescwxyz","https:\u002F\u002Fjiewa.ng","No Ads please","2026-09-25 02:54:36",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add escwxyz\u002Fskills-re --skill turborepo",{"tool":61,"command":62},"bunx","bunx skills add escwxyz\u002Fskills-re --skill turborepo",{"tool":64,"command":65},"pnpm","pnpm dlx skills add escwxyz\u002Fskills-re --skill turborepo","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002FSKILL.md",true,[69,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167],{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"command\u002Fturborepo.md","REFERENCE","参考文档",2563,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Fcommand\u002Fturborepo.md",{"path":76,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":77,"sourceHtmlUrl":78},"references\u002Fbest-practices\u002Fdependencies.md",4255,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fdependencies.md",{"path":80,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fbest-practices\u002Fpackages.md",6289,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fpackages.md",{"path":84,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fbest-practices\u002FRULE.md",4907,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002FRULE.md",{"path":88,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fbest-practices\u002Fstructure.md",5514,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fstructure.md",{"path":92,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fboundaries\u002FRULE.md",1948,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fboundaries\u002FRULE.md",{"path":96,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fcaching\u002Fgotchas.md",3935,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002Fgotchas.md",{"path":100,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fcaching\u002Fremote-cache.md",2538,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002Fremote-cache.md",{"path":104,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fcaching\u002FRULE.md",4199,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002FRULE.md",{"path":108,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fci\u002Fgithub-actions.md",2813,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fgithub-actions.md",{"path":112,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Fci\u002Fpatterns.md",2583,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fpatterns.md",{"path":116,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Fci\u002FRULE.md",2189,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002FRULE.md",{"path":120,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Fci\u002Fvercel.md",2143,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fvercel.md",{"path":124,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fcli\u002Fcommands.md",5568,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fcli\u002Fcommands.md",{"path":128,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":129,"sourceHtmlUrl":130},"references\u002Fcli\u002FRULE.md",2113,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fcli\u002FRULE.md",{"path":132,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":133,"sourceHtmlUrl":134},"references\u002Fconfiguration\u002Fglobal-options.md",7158,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fglobal-options.md",{"path":136,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":137,"sourceHtmlUrl":138},"references\u002Fconfiguration\u002Fgotchas.md",9182,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fgotchas.md",{"path":140,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":141,"sourceHtmlUrl":142},"references\u002Fconfiguration\u002FRULE.md",5071,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002FRULE.md",{"path":144,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":145,"sourceHtmlUrl":146},"references\u002Fconfiguration\u002Ftasks.md",6896,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Ftasks.md",{"path":148,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":149,"sourceHtmlUrl":150},"references\u002Fenvironment\u002Fgotchas.md",4119,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fgotchas.md",{"path":152,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":153,"sourceHtmlUrl":154},"references\u002Fenvironment\u002Fmodes.md",2419,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fmodes.md",{"path":156,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":157,"sourceHtmlUrl":158},"references\u002Fenvironment\u002FRULE.md",2593,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002FRULE.md",{"path":160,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":161,"sourceHtmlUrl":162},"references\u002Ffiltering\u002Fpatterns.md",2412,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Ffiltering\u002Fpatterns.md",{"path":164,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":165,"sourceHtmlUrl":166},"references\u002Ffiltering\u002FRULE.md",4160,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Ffiltering\u002FRULE.md",{"path":168,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":169,"sourceHtmlUrl":170},"references\u002Fwatch\u002FRULE.md",1989,"https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fturborepo\u002Freferences\u002Fwatch\u002FRULE.md",[172,191,216,233,244,259],{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":183,"publishedAt":38},"01M71B3BPYHEEQJYA6QV653HC0","demo-skill","Demonstrates a minimal Skills.re sandbox eval fixture.","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002Fapps\u002Fserver\u002Fsrc\u002Fskill-eval-sandbox\u002Ffixtures\u002Fdemo-skill\u002FSKILL.md",[178],{"categoryNo":179,"categoryName":180,"taxonomyType":181,"taxonomyTypeDesc":182},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[184,185,186,187,188,189,190],"demo skill","demo","re","sandbox","eval","minimal","fixture",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":198,"publishedAt":38},"01M71B3A4941E8D6VHFE4FTDMQ","openspec-propose","Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.","MIT","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fopenspec-propose\u002FSKILL.md",[],[199,200,201,25,202,203,21,204,205,206,207,208,19,209,210,211,212,213,214,215],"openspec","openspec propose","ready","implementation","build","change","with","one","proposal","artifacts","use","generated","new","design","complete","for","get",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":222,"publishedAt":38},"01M71B38FC73TG0F7BM5582Y8V","openspec-explore","Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fopenspec-explore\u002FSKILL.md",[],[199,223,224,225,226,227,228,21,204,229,19,209,230,214,231,232],"explore","openspec explore","user","think","thinking partner","partner","requirements","mode","thinking","ideas",{"skillNo":234,"name":235,"nameZh":6,"description":236,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":6,"sourceHtmlUrl":237,"categories":238,"keywords":239,"publishedAt":38},"01M71B36MP2EPJ15XAZNAWBN3P","openspec-archive-change","Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fopenspec-archive-change\u002FSKILL.md",[],[240,199,241,204,225,242,19,209,202,243,213,21],"openspec archive change","archive","workflow","finalize",{"skillNo":245,"name":246,"nameZh":6,"description":247,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":6,"sourceHtmlUrl":248,"categories":249,"keywords":250,"publishedAt":38},"01M71B34X135R0FZXKKYB8K8TP","openspec-apply-change","Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.codex\u002Fskills\u002Fopenspec-apply-change\u002FSKILL.md",[],[251,204,199,252,253,254,21,255,225,25,19,209,202,256,257,258],"openspec apply change","openspec apply","apply","work","implement","start","implementing","continue",{"skillNo":260,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":6,"sourceHtmlUrl":261,"categories":262,"keywords":263,"publishedAt":38},"01M71B33BXWGK230VKH621N147","https:\u002F\u002Fgithub.com\u002Fescwxyz\u002Fskills-re\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fopenspec-propose\u002FSKILL.md",[],[200,199,19,202,203,21,204,205,206,25,208,209,210,211,212,213,214,215,207,201]]