[FEATURE] Add support for subdirectories in skills

Open 💬 48 comments Opened Oct 24, 2025 by aran0ia

Preflight Checklist

  • [x] I have searched existing requests and this feature hasn't been requested yet
  • [x] This is a single feature request (not multiple features)

Problem Statement

We have started using and developing skills with my team, and we wanted to organise them into subfolders.
Adding a subdirectory in the .claude/skills prevents claude from finding them
The workaround we found was creating a local marketplace and custom skill plugin that had a startup hook to direct claude to look recursively for scripts. Upgrading claude to v.2.0.25 broke that, and now we again are limited to a flat list of skills.

Proposed Solution

Could we add support for subdirectories so it's easier to organise/version control skills?
So if my tree looks like
plugins/custom-skills/skills/
└── collaboration/
├── skill1/
├── skill2/
└── productivity/
├── skill3/
└── skill4/
Claude can find and use skills in these subdirectories

Alternative Solutions

_No response_

Priority

Medium - Would be very helpful

Feature Category

CLI commands and flags

Use Case Example

_No response_

Additional Context

_No response_

View original on GitHub ↗

48 Comments

memorymuse · 8 months ago

I would also appreciate this. I actually assumed it worked this way and spent too much time testing and attempting to "debug" it. Same goes for recursive skill loading up the project directory chain.
note to @aran0ia , you can mimic a nested directory structure by having
skills/your-skill/

  • skills.md
  • some-sub-skill.md
  • sub-skill2.md
  • subfolder/
  • another-subskill3.md

you do that by referencing those files explicitly in the skills.md with markdown links + instructions,
e.g. "if you're working on the event system, read [the Event subskill](/subfolder/another-subskill3.md)"
markdown links like that get auto-registered in the skill system once the parent skill.md is read in.

schrockn · 8 months ago

I ran into this as well. Very inconsistent with commands, which do support folders.

hxt365 · 7 months ago

seconding this

github-actions[bot] · 6 months ago

This issue has been inactive for 30 days. If the issue is still occurring, please comment to let us know. Otherwise, this issue will be automatically closed in 30 days for housekeeping purposes.

schrockn · 6 months ago

still an issue afaik and would still like solution

jeremych1000 · 6 months ago

Yes please - definitely need subfolder support!

ghyslain-playplay · 6 months ago

+1. Especially with command/skills merge. Thanks !

yonatangross · 6 months ago

Please support it, the flat skills is hard to maintain

srb3 · 6 months ago

+1. Would really help with maintenance

yordis · 5 months ago

@ashwin-ant please help us here, we have broken few workstations and rolling things back is painful enough by now.

HighLiuk · 5 months ago

+1 > I guess it should be like traversing a wiki or docs

looeee · 5 months ago

This is still an issue that makes managing skills difficult

ralfstrobel · 5 months ago

When this issue is finally resolved, it would be great if #14836 was considered at the same time.
Meaning in the original example, the "custom-skills" sub-directory should also work if it is a symlink.

This would be extremely convenient for larger monorepos or modular repos, where dedicated sub-teams may want to maintain separate skill folders while all contributing to the global skill space.
This intention was also mentioned in the duplicate to this issue: #18192

jreed-Aces · 4 months ago

Has there been any word on this? It's been an issue that commands and such support subfolders while skills don't. It's been very difficult to namespace our skills in the way we would like.

thibaud57 · 4 months ago

yes its really crazy that it s still not available

patrykwolniewicz-b2c2 · 4 months ago

any update on that? i have over 35 skills that have to use prefix in catalogs name to keep them organized. Why won't just reuse agents / commands catalog code / module for skills grouping?

ivanjuras · 4 months ago

Any update? We really need this to be fixed. Please.

frakon · 4 months ago

This issue is here 4 months, is liked by 96 people and still has no official reaction, could you raise its importance please or put here any statement on this? Support of subdirectories for skills is VERY NECESSARY when number of skills is large. @klazuka, @ItsBarryZ

syepes · 3 months ago

Ohh yes this would be great, without sub-folders this is getting very messy :-)
But specially to keep the behavior aligned with the commands

ShriPunta · 3 months ago

Wow. I actually thought that it just works like that out of the box. (Similar to scaffolded CLAUDE.md files in subdirectories). I am glad i found this open issue.

Google hallucinated to tell me YES, but the cited post was talking about nested CLAUDE.md.
ithiria894 · 3 months ago

While native subdirectory support isn't there yet, one thing that helps in the meantime is having visibility into what skills you have across all scopes (global, workspace, project) and being able to move them between scopes via drag-and-drop.

I'm building a visual dashboard for exactly this — it shows your full Claude Code setup (skills, memories, MCP servers, hooks, configs, plugins) organized by scope hierarchy. You can move items between scopes to keep things organized, delete what you don't need, and see everything in one place instead of digging through dotfiles.

We just launched a couple days ago and are actively working on solving more of these config management pain points — give us a ⭐ to follow along: https://github.com/mcpware/claude-code-organizer

archneon · 3 months ago

This should be indeed possible. I am looking at a package that has 90+ skills. I would like to organize it into skills/package-name/skill1, skills/package-name/skill2, ... like commands. Not even sure now how to organize that, because i don't want 90+ skills in the skills root. Hmm.

ithiria894 · 3 months ago

That's exactly the kind of setup we're building for! With 90+ skills, scope visibility becomes a real problem — knowing what's loaded where, what's inheriting from global, and what's project-specific.

We just launched Claude Code Organizer a few days ago. Right now it covers moving skills and memories between scopes with a visual hierarchy view + drag-and-drop. Only tested on Ubuntu so far.

Coming soon: inline editing, a sidebar navigation with expandable tree view, and a cleaner UI overall — we're actively iterating on the design.

Would love your feedback if you give it a try, especially with a 90+ skill setup — that's a great stress test for us. Any bugs or feature requests, open an issue and we'll fix it within hours. We've been turning around updates same-day.

npx @mcpware/claude-code-organizer

⭐ If you find it useful, a star on the repo helps a lot — and follow @mcpware to get notified when we ship updates.

harsha1979 · 3 months ago

Is it possible to create a master script to process our internal skill folder structure based on how we’ve organized it? Specifically, is it possible to first reference a master index (placed at the top-level folder) before performing any searches within the folder hierarchy?

yurukusa · 3 months ago

A UserPromptSubmit hook can load skills from subdirectories:

MARKER="/tmp/cc-skills-loaded-$$"
[ -f "$MARKER" ] && exit 0
touch "$MARKER"
SKILLS_DIRS=('.claude/skills' '$HOME/.claude/skills')
CONTEXT=""
for base in "${SKILLS_DIRS[@]}"; do
    eval base="$base"
    [ -d "$base" ] || continue
    while IFS= read -r skill; do
        [ -f "$skill" ] || continue
        NAME=$(basename "$skill" .md)
        DESC=$(head -5 "$skill" | grep -i 'description:' | sed 's/.*description:\s*//')
        CONTEXT+="Skill '$NAME' available at $skill: $DESC
"
    done < <(find "$base" -name '*.md' -mindepth 2 2>/dev/null)
done
[ -z "$CONTEXT" ] && exit 0
jq -n --arg ctx "Skills from subdirectories:
$CONTEXT" '{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":$ctx}}'
exit 0

Structure:

.claude/skills/
├── git/
│   ├── commit-conventions.md
│   └── branch-naming.md
├── testing/
��   ├── unit-test-patterns.md
│   └── integration-setup.md
└── deploy/
    └── release-checklist.md

The hook recursively finds all .md skill files in subdirectories and injects them into context.

Seikilos · 3 months ago

+1 on this feature.

The problem with extra tooling to manage this is harness spread. I've decided to use one harness. This harness has no skill management beside its own bundled ones. But it has many other benefits. Now I cannot easily switch to another harness for the skill-management when I need the rest of the initial solution. And I tend not to have multiple parallel harnesses for different things. I would rather have claude code to manage these "concepts" for me instead of me managing claude.

TheXenocide · 2 months ago

Another really nice use case for this: repo-specific local-only skills. For example, you could have a .gitignored .claude/skills/local/ folder that can be changed for preference/task/etc. without polluting the global/user scope with repo-specific configuration. It could also allow for the use of submodules for specific sets of shared/related functionality

mjmirza · 2 months ago

Hitting this running an agency-style setup. 40+ skills split across a consultancy (n8n automation), a creative pipeline, and multiple client-specific workflows. The flat-directory constraint is a material tax at this scale, not theoretical. Categories that would map cleanly to subdirs. gstack/, linkedin-, content-, solo-mixed-sales, payload-, koda-stack/*.

Concrete daily pain

  1. Every SKILL.md description field has to encode the implicit category ("Use when X for the gstack tool chain" instead of just "Use when X") because the agent's keyword matching has no hierarchy signal to lean on.
  2. Our \cc-auto-suggest.md\ trigger map is now a 55 line linear table. A subdir aware registry could auto derive trigger keywords from the parent dir name.
  3. Cross skill reuse within a category (shared fixtures, helper scripts) has no natural home. We end up duplicating.
  4. The marketplace plugin workaround mentioned in the OP did work in 2.0.24, broke in 2.0.25 (confirmed). Rebuilt as the flat layout with prefixes.
  5. Per client skill isolation (so a linkedin-content skill is only auto suggested in LinkedIn work sessions, not while debugging a Go server) becomes impossible to enforce without an explicit category gate. Prefixes in filenames are a weak substitute.

Preference for the fix. Recursive scan is simpler than any explicit nesting syntax. No config churn, no migration path needed. Specifically

  • \skill_id\ should be the full relative path from skills/ (e.g. \gstack/qa\ not \qa\) so name collisions across categories are impossible
  • Name collision fallback. Deepest match wins (gives users a clean override path)
  • SessionStart discovery cost should stay O(total skills) even with nesting, so no behavior regression on the hot path

If this is on a roadmap already, a "planned" note in this thread would help teams decide whether to invest in the local marketplace workaround or wait. Running 40+ skills flat is a real maintenance tax at professional scale.

klessou · 2 months ago

+1

aayadiCelonis · 2 months ago

+1

hydr93 · 2 months ago

+1

markosypenko · 2 months ago

+1

tleszczynski-cribl · 2 months ago

+1

ZahScr · 2 months ago

+1

rayhem · 2 months ago

+1

RobertChrist · 2 months ago

+1

martin-simon-LS · 2 months ago

+1

hongxunming · 2 months ago

Fuck you! Stupid Anthropic company — such a simple yet important feature, and you still haven't fixed it after all this time! Do you have any idea how much trouble this has caused me? I can't manually trigger skills, and sometimes this stupid Claude Code can't even find sub-skills, forcing me to manually send it the file path! And instead, you spend your time on those stupid Pokémon things!

VOFLIJAN · 1 month ago

+1

tominek · 1 month ago

+1

hassanzohdy · 1 month ago

Hello guys.

I had encountered the same issue, so I created a simple package that solves multiple issues regarding Claude and other AI providers, Agent Kit

This package solves three issues:

  1. Unifies all AI to read from AGENTS.md file.
  2. Supports nested skills folders
  3. Read skills from npm packages (if any)

So the idea is simple, you create a skills folder in your root package, split it into multiple folders (ie backend, frontend, mobile) then run the agent-kit sync command, it will flatten the skills folder into .claude/skills to be something like this:

skills/
├── frontend/
│   ├── create-component/
│   │   └── SKILL.md
│   └── setup-routing/
│       └── SKILL.md
├── backend/
│   ├── create-module-structure/
│   │   └── SKILL.md
│   └── implement-rest-api/
│       └── SKILL.md
└── mobile/
    ├── setup-navigation/
    │   └── SKILL.md
    └── create-screen/
        └── SKILL.md

This will be converted into:

.claude/skills/
├── frontend-create-component/
│   └── SKILL.md
├── frontend-setup-routing/
│   └── SKILL.md
├── backend-create-module-structure/
│   └── SKILL.md
├── backend-implement-rest-api/
│   └── SKILL.md
├── mobile-setup-navigation/
│   └── SKILL.md
└── mobile-create-screen/
    └── SKILL.md

Instructions are simple:

install the package
init it
then sync (this one that you will use when you add more skills) that's it

You could see instructions per IDE/AI (Cursor, Claude..etc) in detail from here:

https://mongez.js.org/agent-kit/agent-integrations/

schmunk42 · 1 month ago

You can put your skills into a subfolder in .claude/commands eg as symlink, they are detected automatically.

> ls -l ~/.claude/commands
company -> /path/to/company-skills

Should be visible as:

/skills

company:skill-a
company:skill-b
company:skill-c
...

See also https://code.claude.com/docs/en/skills

Custom commands have been merged into skills. A file at .claude/commands/deploy.md and a skill at .claude/skills/deploy/SKILL.md both create /deploy and work the same way. Your existing .claude/commands/ files keep working. Skills add optional features: a directory for supporting files, frontmatter to control whether you or Claude invokes them, and the ability for Claude to load them automatically when relevant.
boaza · 1 month ago

+1

real-worlds · 21 days ago

?

therealhieu · 13 days ago

+1

liel-yehoshua-sp · 9 days ago

+1

hassanzohdy · 9 days ago

Feel free to try this package it should be sufficient enough to handle this case and keep any other AI agents synced from a single source of skills folder

https://github.com/anthropics/claude-code/issues/10238#issuecomment-4574169592