A single SKILL.md file is enough for personal use, but it doesn’t scale once you want to
version it, bundle it with agents and hooks, or share it with teammates. This post covers how
to package skills into a plugin and distribute that plugin through a marketplace.
You probably don’t need plugins for a personal project or a quick one-off customization. You do need them once you want to share with teammates, distribute to a community, cut versioned releases, or reuse the same setup across projects.
Definitions
Skill — an instruction (or set of instructions) that your harness (Claude Code, Codex,
etc.) can load during a session. Example: /design in Claude Code, which can be loaded
manually or automatically when you ask it to draw a chart.
Plugin — a package that contains skills plus other pieces: agents, tools, commands, hooks,
docs. Example: the
claude-security
plugin. Running it can spawn a team of agents (explorer, patch-generator, scanner), each with
its own responsibility and capability. It also ships scripts (e.g. scripts/write_scan_meta.py,
which writes scan-meta.json for a run) and hooks (e.g. hooks/banner_notice.py, which shows a
banner at the start of a session). In the simple case, a plugin can just be a bundle of skills.
Marketplace — a collection of plugins hosted remotely (e.g. GitHub) or locally. See hadifar/myplugins for an example.
Build a plugin
Create the plugin directory:
1mkdir -p plugins/daily-plugin/.claude-pluginAdd a plugin manifest at
plugins/daily-plugin/.claude-plugin/plugin.json:1 2 3 4 5 6 7 8{ "name": "daily-plugin", "description": "Adds useful skills for my daily tasks", "version": "1.0.0", "author": { "name": "Amir Hadifar" } }Add a skill to the plugin (here, one called
grill-me):1mkdir -p plugins/daily-plugin/skills/grill-me/Then create
SKILL.mdinside that folder:1 2 3 4 5 6 7--- name: grill-me description: Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases. --- Interview the user relentlessly until you reach a shared understanding. Map this as a design tree: every decision branches into the decisions that hang off it. ...
Load it in Claude Code
For a one-time load, pass --plugin-dir:
| |
To avoid passing --plugin-dir on every launch, drop the plugin into your skills directory
(~/.claude/skills/). Any folder under a skills directory that contains a
.claude-plugin/plugin.json manifest is loaded automatically as <name>@skills-dir on the
next session — no marketplace, no install step. This works, but the marketplace approach below
is the better way to distribute and version a plugin.
Share it and version it with a marketplace
Create the marketplace directories (called
mypluginshere):1 2mkdir -p myplugins/plugins/ mkdir -p myplugins/.claude-pluginAdd a marketplace manifest at
myplugins/.claude-plugin/marketplace.json:1 2 3 4 5 6 7 8 9 10 11 12 13{ "name": "myplugins", "owner": { "name": "Amir Hadifar" }, "plugins": [ { "name": "daily-plugin", "source": "./plugins/daily-plugin", "description": "Adds useful skills for my daily tasks" } ] }Push the
mypluginsfolder to git. Anyone can then install it:1 2 3# in a new Claude Code session /plugin marketplace add https://github.com/hadifar/myplugins /plugin install daily-plugin@mypluginsTo ship an update, push to git, then have teammates go to
/marketplace→ selectmyplugins→ Update marketplace.