How Skills Are Discovered
Standard Skill Locations
Skills are loaded from these fixed locations based on scope:Automatic Discovery from Nested Directories
When you work with files in subdirectories, Claude Code automatically discovers skills from nested
.claude/skills/ directories.packages/frontend/, Claude Code also looks for skills in packages/frontend/.claude/skills/.
This supports monorepo setups where packages have their own skills.
Example Monorepo Structure
Consider a typical monorepo with separate packages:Scenario 1: Just Started Claude at Root
When you run Claude Code from/mymonorepo/ and haven’t edited any files yet:
Scenario 2: After Editing Files in a Package
After you ask Claude to editpackages/frontend/src/App.tsx:
Key Behavior: Description vs Full Content
Skill descriptions are loaded into context so Claude knows what’s available, but full skill content only loads when invoked. This is an important optimization:- Descriptions: Always in context (within character budget)
- Full content: Loaded on-demand when skill is invoked
Subagents with preloaded skills work differently - the full skill content is injected at startup.
Priority Order
When skills share the same name across levels, higher-priority locations win:Plugin skills use a
plugin-name:skill-name namespace, so they cannot conflict with other levels.Why This Design Works for Monorepos
Package-specific isolation
Frontend developers working in
packages/frontend/ get frontend-specific skills without backend skills cluttering context.Automatic discovery
No need to explicitly register package-level skills; they’re discovered when you work in those directories.
Context optimization
Only skill descriptions load initially, and nested skills are discovered on-demand.
Team autonomy
Each package team can define skills specific to their domain without coordinating with other teams.
Character Budget Considerations
Skill descriptions are loaded into context up to a character budget (default 15,000 characters). In large monorepos with many packages and skills, you may hit this limit.1
Check for warnings
Run
/context to check for warnings about excluded skills2
Increase budget if needed
Set
SLASH_COMMAND_TOOL_CHAR_BUDGET environment variable to increase the limitBest Practices
Put package-specific skills in package .claude/skills/
Put package-specific skills in package .claude/skills/
Framework-specific patterns, component conventions, testing utilities unique to that package.
Use disable-model-invocation: true for dangerous skills
Use disable-model-invocation: true for dangerous skills
Deployment or destructive skills should require explicit user invocation.
Keep skill descriptions concise
Keep skill descriptions concise
Descriptions are always in context (up to the character budget), so verbose descriptions waste context space.
Use namespacing in skill names
Use namespacing in skill names
Consider prefixing with package names (e.g.,
frontend-review, backend-deploy) to avoid confusion.