You wrote a skill, it works in ~/.claude/skills/, and now you want to hand it to a teammate — so you wrap it in a plugin. You create the folder, add a manifest, restart Claude Code… and nothing loads. No error that helps, no skill in the list.

Nine times out of ten the cause is one wrong assumption about the directory layout. This post is the minimal structure that actually loads, verified against the current plugin docs, plus the one mistake that quietly breaks everything.

The mental model: two different roots

A plugin is just a directory. Two locations inside it matter, and they are not interchangeable:

The plugin root — the directory itself. This is where your actual components live: skills/, agents/, hooks/, .mcp.json.