[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CZK61BA7DRC8VF909152H4":3,"skill-same:01M6CZK61BA7DRC8VF909152H4":143},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":17,"linkOnly":18,"markdownContent":19,"markdownBody":19,"frontMatter":20,"refName":21,"commitSha":22,"skillDirectory":23,"forksCount":24,"repositoryHtmlUrl":25,"repositoryHomepageUrl":6,"ownerHtmlUrl":26,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":27,"install":28,"resources":41},"01M6CZK61BA7DRC8VF909152H4","turborepo",null,"Testing-itay\u002FDevTools-Security-Lab","Testing-itay","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F230151326?v=4","01M6CZH4Q5Z571N5ZRZWMQ3YBS","01M6CZH4W55EHV4P1D3SNNRXSS",0,"MIT","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"\n\n\n\n---\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.9\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**Prefer package tasks over Root Tasks.**\n\nWhen creating tasks\u002Fscripts\u002Fpipelines, you MUST default to package tasks:\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` when it can live in packages. 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, such as Vitest Projects' `\u002F\u002F#test`, repo-wide release scripts, or tooling that does not invoke `turbo` itself.\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-9.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",{},"main","1188d0dcbd4e64256d35bfe14c955ba1c541b1de",".claude\u002Fskills\u002Fturborepo",13,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab","https:\u002F\u002Fgithub.com\u002FTesting-itay","2026-10-16 16:13:27",{"source":7,"skillName":5,"commands":29,"prompt":39,"zipAvailable":40},[30,33,36],{"tool":31,"command":32},"npx","npx skills add Testing-itay\u002FDevTools-Security-Lab --skill turborepo",{"tool":34,"command":35},"bunx","bunx skills add Testing-itay\u002FDevTools-Security-Lab --skill turborepo",{"tool":37,"command":38},"pnpm","pnpm dlx skills add Testing-itay\u002FDevTools-Security-Lab --skill turborepo","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002FSKILL.md",true,[42,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,131,135,139],{"path":43,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":46,"sourceHtmlUrl":47},"command\u002Fturborepo.md","REFERENCE","参考文档",2788,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Fcommand\u002Fturborepo.md",{"path":49,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":50,"sourceHtmlUrl":51},"references\u002Fbest-practices\u002Fdependencies.md",4258,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fdependencies.md",{"path":53,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":54,"sourceHtmlUrl":55},"references\u002Fbest-practices\u002Fpackages.md",6292,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fpackages.md",{"path":57,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":58,"sourceHtmlUrl":59},"references\u002Fbest-practices\u002FRULE.md",4910,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002FRULE.md",{"path":61,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":62,"sourceHtmlUrl":63},"references\u002Fbest-practices\u002Fstructure.md",5496,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fbest-practices\u002Fstructure.md",{"path":65,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":66,"sourceHtmlUrl":67},"references\u002Fboundaries\u002FRULE.md",1951,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fboundaries\u002FRULE.md",{"path":69,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fcaching\u002Fgotchas.md",3938,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002Fgotchas.md",{"path":73,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Fcaching\u002Fremote-cache.md",2541,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002Fremote-cache.md",{"path":77,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fcaching\u002FRULE.md",4202,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fcaching\u002FRULE.md",{"path":81,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fci\u002Fgithub-actions.md",2816,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fgithub-actions.md",{"path":85,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fci\u002Fpatterns.md",2586,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fpatterns.md",{"path":89,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fci\u002FRULE.md",2192,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002FRULE.md",{"path":93,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fci\u002Fvercel.md",2146,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fci\u002Fvercel.md",{"path":97,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fcli\u002Fcommands.md",5572,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fcli\u002Fcommands.md",{"path":101,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fcli\u002FRULE.md",2116,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fcli\u002FRULE.md",{"path":105,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fconfiguration\u002Fglobal-options.md",7161,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fglobal-options.md",{"path":109,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fconfiguration\u002Fgotchas.md",9321,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Fgotchas.md",{"path":113,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fconfiguration\u002FRULE.md",5051,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002FRULE.md",{"path":117,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fconfiguration\u002Ftasks.md",6931,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fconfiguration\u002Ftasks.md",{"path":121,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Fenvironment\u002Fgotchas.md",4102,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fgotchas.md",{"path":125,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":126,"sourceHtmlUrl":127},"references\u002Fenvironment\u002Fmodes.md",2422,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002Fmodes.md",{"path":129,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":86,"sourceHtmlUrl":130},"references\u002Fenvironment\u002FRULE.md","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fenvironment\u002FRULE.md",{"path":132,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":133,"sourceHtmlUrl":134},"references\u002Ffiltering\u002Fpatterns.md",2415,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Ffiltering\u002Fpatterns.md",{"path":136,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":137,"sourceHtmlUrl":138},"references\u002Ffiltering\u002FRULE.md",4163,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Ffiltering\u002FRULE.md",{"path":140,"resourceType":44,"resourceTypeDesc":45,"sizeBytes":141,"sourceHtmlUrl":142},"references\u002Fwatch\u002FRULE.md",1992,"https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fturborepo\u002Freferences\u002Fwatch\u002FRULE.md",[144,153,162,171,180,185],{"skillNo":145,"name":146,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":17},"01M6CZR9VVRMS754ZKH7NPNMB1","sds-plugin-a11y-check","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fsds-frontend-plugin\u002Fskills\u002Fsds-plugin-a11y-check\u002FSKILL.md",[],[150,151,152],"sds plugin a11y check","check","plugin",{"skillNo":154,"name":155,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":17},"01M6CZR8FQ30QGEV5D3SB6DDKP","endpoint-review","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fskills\u002Fendpoint-review\u002FSKILL.md",[],[159,160,161],"endpoint review","endpoint","review",{"skillNo":163,"name":164,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":17},"01M6CZR6TYBN5EMBM70E096E66","schema-draft","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fagents\u002Fpy-plugin-endpoint-designer\u002Fskills\u002Fschema-draft\u002FSKILL.md",[],[168,169,170],"schema","schema draft","draft",{"skillNo":172,"name":173,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":17},"01M6CZR5SDWF91FHDK54XHXS67","doc-outline","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fai-documentation-workflow\u002Fskills\u002Fdoc-outline\u002FSKILL.md",[],[177,178,179],"doc outline","outline","doc",{"skillNo":181,"name":146,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":17},"01M6CZR3Z4WZCBA5FVJZB65B1Y","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewD\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fsds-frontend-plugin\u002Fskills\u002Fsds-plugin-a11y-check\u002FSKILL.md",[],[150,151,152],{"skillNo":186,"name":155,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":17},"01M6CZR2PR7T4XYSJJWQYYPXVW","https:\u002F\u002Fgithub.com\u002FTesting-itay\u002FDevTools-Security-Lab\u002Fblob\u002Fmain\u002Fsrc\u002FnewD\u002FnewDIR\u002Fbundles\u002Fplugins\u002Fpython-api-plugin\u002Fskills\u002Fendpoint-review\u002FSKILL.md",[],[161,159,160]]