[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F15MZDMRPF3FSNFEPBYXGJ":3,"skill-same:01M6F15MZDMRPF3FSNFEPBYXGJ":180},{"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":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6F15MZDMRPF3FSNFEPBYXGJ","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.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"up","Variables","remote","turborepo monorepo","turbo","filter","environment variables","apps","caching","structure","cli","environment","monorepo","Optimization","ci","code","packages","tasks","workflows","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.7.6\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\u002FREADME.md\n├─ Set up dev\u002Fwatch tasks → references\u002Fconfiguration\u002Ftasks.md#persistent\n├─ Package-specific config → references\u002Fconfiguration\u002FREADME.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\u002FREADME.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\u002FREADME.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\u002FREADME.md\n├─ JIT vs Compiled packages → references\u002Fbest-practices\u002Fpackages.md#compilation-strategies\n└─ Sharing code between apps → references\u002Fbest-practices\u002FREADME.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\u002FREADME.md\n├─ Package types (apps vs libraries) → references\u002Fbest-practices\u002FREADME.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\u002FREADME.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\u002FREADME.md#tags\n├─ Restrict which packages can import others → references\u002Fboundaries\u002FREADME.md#rule-types\n└─ Prevent cross-package file imports → references\u002Fboundaries\u002FREADME.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. 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\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\u002FREADME.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\u002Fturborepo.dev\u002Fschema.v2.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\n## Reference Index\n\n### Configuration\n\n| File                                                                            | Purpose                                                  |\n| ------------------------------------------------------------------------------- | -------------------------------------------------------- |\n| [configuration\u002FREADME.md](.\u002Freferences\u002Fconfiguration\u002FREADME.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, cacheDir, daemon, envMode |\n| [configuration\u002Fgotchas.md](.\u002Freferences\u002Fconfiguration\u002Fgotchas.md)               | Common configuration mistakes                            |\n\n### Caching\n\n| File                                                            | Purpose                                      |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [caching\u002FREADME.md](.\u002Freferences\u002Fcaching\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fenvironment\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Ffiltering\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fci\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fcli\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fbest-practices\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fwatch\u002FREADME.md) | turbo watch, interruptible tasks, dev workflows |\n\n### Boundaries (Experimental)\n\n| File                                                      | Purpose                                               |\n| --------------------------------------------------------- | ----------------------------------------------------- |\n| [boundaries\u002FREADME.md](.\u002Freferences\u002Fboundaries\u002FREADME.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: `docs\u002Fsite\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\u002FREADME.md\n├─ Set up dev\u002Fwatch tasks → references\u002Fconfiguration\u002Ftasks.md#persistent\n├─ Package-specific config → references\u002Fconfiguration\u002FREADME.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\u002FREADME.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\u002FREADME.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\u002FREADME.md\n├─ JIT vs Compiled packages → references\u002Fbest-practices\u002Fpackages.md#compilation-strategies\n└─ Sharing code between apps → references\u002Fbest-practices\u002FREADME.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\u002FREADME.md\n├─ Package types (apps vs libraries) → references\u002Fbest-practices\u002FREADME.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\u002FREADME.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\u002FREADME.md#tags\n├─ Restrict which packages can import others → references\u002Fboundaries\u002FREADME.md#rule-types\n└─ Prevent cross-package file imports → references\u002Fboundaries\u002FREADME.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. 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\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\u002FREADME.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\u002Fturborepo.dev\u002Fschema.v2.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\n## Reference Index\n\n### Configuration\n\n| File                                                                            | Purpose                                                  |\n| ------------------------------------------------------------------------------- | -------------------------------------------------------- |\n| [configuration\u002FREADME.md](.\u002Freferences\u002Fconfiguration\u002FREADME.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, cacheDir, daemon, envMode |\n| [configuration\u002Fgotchas.md](.\u002Freferences\u002Fconfiguration\u002Fgotchas.md)               | Common configuration mistakes                            |\n\n### Caching\n\n| File                                                            | Purpose                                      |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [caching\u002FREADME.md](.\u002Freferences\u002Fcaching\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fenvironment\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Ffiltering\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fci\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fcli\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fbest-practices\u002FREADME.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\u002FREADME.md](.\u002Freferences\u002Fwatch\u002FREADME.md) | turbo watch, interruptible tasks, dev workflows |\n\n### Boundaries (Experimental)\n\n| File                                                      | Purpose                                               |\n| --------------------------------------------------------- | ----------------------------------------------------- |\n| [boundaries\u002FREADME.md](.\u002Freferences\u002Fboundaries\u002FREADME.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: `docs\u002Fsite\u002Fcontent\u002Fdocs\u002F` in the Turborepo repository\n- Live: https:\u002F\u002Fturborepo.dev\u002Fdocs\n",{"name":5,"metadata":48,"description":50},{"version":49},"2.7.6","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","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill turborepo",{"tool":66,"command":67},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill turborepo",{"tool":69,"command":70},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill turborepo","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002FSKILL.md",true,[74,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"command\u002Fturborepo.md","REFERENCE","参考文档",2581,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Fcommand\u002Fturborepo.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fbest-practices\u002Fdependencies.md",4261,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fdependencies.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fbest-practices\u002Fpackages.md",6308,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fpackages.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fbest-practices\u002FREADME.md",4907,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fbest-practices\u002FREADME.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fbest-practices\u002Fstructure.md",5001,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fstructure.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fboundaries\u002FREADME.md",1948,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fboundaries\u002FREADME.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fcaching\u002Fgotchas.md",2828,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fcaching\u002Fgotchas.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fcaching\u002FREADME.md",2294,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fcaching\u002FREADME.md",{"path":109,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fcaching\u002Fremote-cache.md",2538,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fcaching\u002Fremote-cache.md",{"path":113,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fci\u002Fgithub-actions.md",2813,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fci\u002Fgithub-actions.md",{"path":117,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fci\u002Fpatterns.md",2583,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fci\u002Fpatterns.md",{"path":121,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Fci\u002FREADME.md",2191,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fci\u002FREADME.md",{"path":125,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":126,"sourceHtmlUrl":127},"references\u002Fci\u002Fvercel.md",2143,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fci\u002Fvercel.md",{"path":129,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":130,"sourceHtmlUrl":131},"references\u002Fcli\u002Fcommands.md",5569,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fcli\u002Fcommands.md",{"path":133,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":134,"sourceHtmlUrl":135},"references\u002Fcli\u002FREADME.md",2113,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fcli\u002FREADME.md",{"path":137,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":138,"sourceHtmlUrl":139},"references\u002Fconfiguration\u002Fglobal-options.md",4263,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fglobal-options.md",{"path":141,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":142,"sourceHtmlUrl":143},"references\u002Fconfiguration\u002Fgotchas.md",8123,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fgotchas.md",{"path":145,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":146,"sourceHtmlUrl":147},"references\u002Fconfiguration\u002FREADME.md",4331,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fconfiguration\u002FREADME.md",{"path":149,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":150,"sourceHtmlUrl":151},"references\u002Fconfiguration\u002Ftasks.md",5516,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Ftasks.md",{"path":153,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":154,"sourceHtmlUrl":155},"references\u002Fenvironment\u002Fgotchas.md",2954,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fgotchas.md",{"path":157,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":158,"sourceHtmlUrl":159},"references\u002Fenvironment\u002Fmodes.md",2419,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fmodes.md",{"path":161,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":162,"sourceHtmlUrl":163},"references\u002Fenvironment\u002FREADME.md",1739,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fenvironment\u002FREADME.md",{"path":165,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":166,"sourceHtmlUrl":167},"references\u002Ffiltering\u002Fpatterns.md",2412,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Ffiltering\u002Fpatterns.md",{"path":169,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":170,"sourceHtmlUrl":171},"references\u002Ffiltering\u002FREADME.md",4160,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Ffiltering\u002FREADME.md",{"path":173,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":174,"sourceHtmlUrl":175},"references\u002Fwatch\u002FREADME.md",1989,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Freferences\u002Fwatch\u002FREADME.md",{"path":177,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":178,"sourceHtmlUrl":179},"skill-report.json",20027,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fvercel\u002Fturborepo\u002Fskill-report.json",[181,195,205,213,219,226],{"skillNo":182,"name":183,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":191,"publishedAt":43},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[186],{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[192,193,194],"model","model hierarchy","model hierarchy skill",{"skillNo":196,"name":197,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":43},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[200],{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},[202,203,204],"MCP","zoom","zoom mcp",{"skillNo":206,"name":207,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":210,"publishedAt":43},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[211,212,31,203],"sdk","zoom apps sdk",{"skillNo":214,"name":215,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":43},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[215],{"skillNo":220,"name":221,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":225,"publishedAt":43},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[224],{"categoryNo":187,"categoryName":188,"taxonomyType":189,"taxonomyTypeDesc":190},[221],{"skillNo":227,"name":228,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":229,"categories":230,"keywords":231,"publishedAt":43},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[228]]