Feature Request: Built-in Skill activation/deactivation (enable/disable per session or globally)
Summary
Add built-in support to activate or deactivate individual Skills without removing them from the project. Currently, all Skills placed in .claude/skills/ are always loaded into every conversation, consuming context tokens regardless of relevance.
---
Problem
Skills are loaded at the start of every conversation. As a project grows and accumulates many Skills (e.g., 10+), every session pays the token cost of all skill descriptions — even when most of them are irrelevant to the current task.
Example: A session focused on writing unit tests doesn't need stripe-payment or s3-file-upload loaded. A session doing initial architecture design doesn't need pds-test or tdd-razor-pages.
There is currently no way to say "load only these 4 skills for this session."
---
Proposed Solution
Option A — CLI flags (preferred)
# Disable a skill globally (persists across sessions)
claude skill off stripe-payment
claude skill off s3-file-upload
# Re-enable
claude skill on stripe-payment
# List all skills with active/inactive status
claude skill list
# Apply a named preset (defined in .claude/skills.json or CLAUDE.md)
claude skill preset test
Option B — Session-scoped via slash command
/skill off stripe-payment # disables for this session only
/skill on tdd-razor-pages
/skill list
/skill preset dev
Option C — enabled frontmatter field in SKILL.md
---
name: stripe-payment
description: Multi-provider payment gateway integration
enabled: false # <-- new field; Claude skips loading this skill
---
---
Preset Support
Allow grouping skills into named presets in .claude/settings.json or a dedicated config:
{
"skillPresets": {
"init": ["clean-architecture-dotnet", "csharp-coding-standards", "efcore-patterns"],
"dev": ["razor-page-crud", "signalr-integration", "stripe-payment", "efcore-patterns"],
"test": ["tdd-razor-pages", "pds-test", "database-performance"],
"release": ["pds-test", "tdd-razor-pages", "database-performance"]
}
}
Then apply with:
claude skill preset dev
# or in-session:
/skill preset test
---
Current Workaround
The only workaround today is manually moving skill folders in/out of .claude/skills/ using a custom script:
.claude/skills/ ← Claude loads these
.claude/skills-inactive/ ← Claude ignores these (arbitrary folder name)
We wrote a PowerShell script to manage this, but it feels like something Claude Code should handle natively:
# skill-manager.ps1 — workaround we had to build ourselves
.\scripts\skill-manager.ps1 list
.\scripts\skill-manager.ps1 preset dev
.\scripts\skill-manager.ps1 off stripe-payment
This works but requires users to manually manage filesystem state and restart Claude Code to pick up changes.
---
Expected Behavior
| Command | Result |
|---------|--------|
| claude skill list | Shows all skills with ON/OFF status and description from SKILL.md |
| claude skill off <name> | Disables skill; excluded from context in future sessions |
| claude skill on <name> | Re-enables skill |
| claude skill preset <name> | Activates a preset group, deactivates the rest |
| /skill list | Same, but scoped to current session only |
---
Why This Matters
- Token efficiency: Projects with 10+ skills waste context on irrelevant skill descriptions every session
- Phase-based workflows: Different project phases (init, dev, test, release) need different skill sets
- Team projects: Different team members working on different areas benefit from different active skill sets
- Scales with the ecosystem: As the Claude Code skill marketplace grows, users will accumulate more skills — this problem will only get worse without a management mechanism
---
Related
- Skills documentation: https://docs.anthropic.com/en/docs/claude-code/skills
- Similar concept: VS Code extensions can be enabled/disabled per workspace
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗