plugin-creator
Skill17 starsChanged 4 months agoMITView on GitHub
Build, validate, and distribute Claude Code plugins — the packaged form of skills, agents, hooks, MCP/LSP servers, monitors and `bin/` executables, with a `.claude-plugin/plugin.json` manifest and optionally a `marketplace.json` catalog. Use this whenever the user wants to make, package, ship, share, or publish an extension: "turn this into a plugin", "make this a Claude extension", "package my skills", "publish to a marketplace", "share this with my team", "convert .claude/ into a plugin", "plugin.json", "marketplace.json", "/plugin install". Also use when a plugin already exists and something is wrong with it — components not loading, skills not showing up, hooks not firing, `claude plugin validate` failing. Reach for this even when the user says "skill" but describes distribution (versioning, install, teammates, GitHub), because that is a plugin, not a bare skill.
27 other projects use a version of this.
Adopted by
Most recently taken up by
- codewhale-hq/codewhale-plugin-marketplacetheir own version, first seen Nov 8, 2026
- delorenj/skillstheir own version, first seen Nov 7, 2026
- pleaseai/claude-code-pluginstheir own version, first seen Nov 2, 2026
- tigu77/tiguclawtheir own version, first seen Nov 1, 2026
- krzysztofsurdy/code-virtuosotheir own version, first seen Nov 1, 2026
- AbdouMoumen/claude-skills-plugintheir own version, first seen Nov 1, 2026
Used with
Projects with it also use documents, spreadsheets and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
MicrosoftSkilldocuments
Create, edit, review, comment on, or redline Word DOCX documents. Use for reports, memos, letters, and Google Docs-bound files; render and inspect before delivery.
Also in 3 projects that use this
MicrosoftSkillspreadsheets
Create, edit, analyze, and chart XLSX, CSV, and TSV files. Use for models, trackers, budgets, and Google Sheets-bound workbooks; use excel-live-control for an open Excel session.
Also in 3 projects that use this
VercelSkillfind-skills
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
Also in 7 projects that use this
NVIDIASkillgithub
Interact with GitHub using the gh CLI restricted to REST API only (no GraphQL). Use when the user wants to work with GitHub issues, pull requests, repos, releases, or Actions — especially in sandboxed environments where the GraphQL endpoint may be blocked. Trigger keywords - github, gh, pull request, PR, github issue, github actions, workflow, release, gh api.
Also in 3 projects that use this
AnthropicSkillpptx
Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.
Also in 3 projects that use this
AnthropicSkilldocx
Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks
Also in 3 projects that use this
- +3 more from microsoft
Other versions27 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 27
- openai/skills★ 27ksame name
- openai/plugins★ 7.8ksame name
- krzysztofsurdy/code-virtuoso★ 36same name
- different-ai/openwork-hub★ 35same name
- kael-odin/codex-plugins-zh★ 33same name
- wedsamuel1230/arduino-skills★ 28same name
- wedsamuel1230/embedded-engineering-skills★ 28same name
- PracticalSwan/agent-skills★ 22same name
- delorenj/skills★ 17same name
- pleaseai/claude-code-plugins★ 17same name
17 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- chrome-extension-developmentSkill
- copywritingSkill
- dense-ui-metricsSkill
- shadcnSkill
- skill-creatorSkill
The file
We split this skill into the rules it gives an agent
7 rules. 0 are common, 0 are distinctive, and 7 are very specific to this project.
0
Common
Most of the 26 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 35
If the user is customizing one repo for themselves, .claude/skills/<name>/SKILL.md is the whole answer and a plugin is packaging they will …
- Very specific: line 92
Use claude plugin details <name> to see the component inventory and projected token cost — the honest answer to "what does installing this …
- Very specific: line 160
references/components.md: Read it when adding a component type you have not shipped before. - Very specific: line 166
Never hardcode a path to plugin files: Use ${CLAUDE_PLUGIN_ROOT} — the install directory differs per user and changes on every update.
- Very specific: line 190
Always add the marketplace from a local path and install from it before pushing — it is the only way to catch a source that points …
- Very specific: line 203
Directories inside
.claude-plugin/?: Only plugin.json belongs there. - Very specific: line 214
Hook not firing?: Check the command resolves under ${CLAUDE_PLUGIN_ROOT} and that the interpreter exists on the target machine — the …
“Common” is measured: kept by at least 6 in 10 of the 26 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
plugin-creator — build and ship a Claude Code plugin
In: skills/agents/hooks you already have, or an idea for some.
Out: a directory that claude plugin validate passes, that loads under
claude --plugin-dir, and that a stranger can install.
A plugin is just a directory with a known shape. Almost everything that goes wrong is the shape being slightly off, and the CLI will tell you — so the whole job is: build the shape, run the validator, load it for real, fix what it says.
First decide: does this need to be a plugin at all?
Standalone .claude/ | Plugin | |
| Invocation | /hello | /my-plugin:hello |
| For | one project, personal, experiments | sharing, versioning, reuse across projects |
If the user is customizing one repo for themselves, .claude/skills/<name>/SKILL.md
is the whole answer and a plugin is packaging they will never use — say so and
stop. Convert to a plugin when someone else has to install it.
Reach for skill-creator instead when the work is authoring one skill's
content (what it says, how it triggers, evaluating it). This skill is about the
container. They compose: write the skills with skill-creator, ship them with
this.
The loop
Everything here is verifiable, so never hand-reason about whether a layout is right — run the command.
claude plugin init <name> --with skills agents hooks # scaffold (optional)
python3 scripts/preflight.py ./<path> # layout + sources
claude plugin validate ./<path> --strict # manifest JSON
claude --plugin-dir ./<path> # load it for real- Scaffold or lay out the directories.
claude plugin init <name>writes a working skeleton to~/.claude/skills/<name>/— which auto-loads next session as<name>@skills-dirwith no install step, so it is the fastest way to iterate.--with skills agents hooks mcp lsp output-style channeladds examples of each. For a plugin that lives in a repo instead, create the directories yourself (layout below) —initalways targets the skills dir. - Write the manifest, if you need one. It is optional: with no manifest, components are auto-discovered from default locations and the name comes from the directory. Add one when you want metadata (version, author, license) or non-default component paths.
claude plugin validate. Wrong-typed fields are errors; unrecognized fields are warnings that still load. Use--strictbefore publishing so a typo'd key (skillforskills) fails instead of silently doing nothing.- Load it:
claude --plugin-dir ./<path>. Confirm skills appear under/help, agents under/context, and that hooks actually fire.
validate is a manifest linter, not a plugin checker — this is the part that
catches people out. Measured against the real CLI, all three of these pass
with exit 0:
- components nested inside
.claude-plugin/(the plugin loads nothing) - a marketplace entry whose
sourcepath does not exist (every install breaks) - any component file being missing, malformed, or empty
And a plugin with a root SKILL.md and no manifest fails validation
(No manifest found in directory) even though it is valid at runtime. So a
green validate means "the JSON is well-formed", nothing more.
scripts/preflight.py covers exactly that gap — nesting, unresolvable
marketplace sources, missing SKILL.md, absent frontmatter, a manifest key
shadowing its default directory, bun hooks, hardcoded paths. Run it and
validate; they check disjoint things. Neither replaces loading the plugin, so
never report a plugin as working on the strength of either alone.
5. Iterate with /reload-plugins rather than restarting — it picks up
skills, agents, hooks, and plugin MCP/LSP servers. Monitors need a restart.
Use claude plugin details <name> to see the component inventory and projected
token cost — the honest answer to "what does installing this actually cost the
user's context", which is worth checking before you ship something large.
Layout
The one mistake worth memorizing: only plugin.json goes inside
.claude-plugin/. Every other directory sits at the plugin root. Components
nested under .claude-plugin/ are silently not found — nothing errors, they
just never appear, which reads like "my skill doesn't work" rather than "my
directory is one level too deep".
my-plugin/
├── .claude-plugin/plugin.json # manifest, and nothing else
├── skills/<name>/SKILL.md # skills
├── agents/<name>.md # subagents
├── hooks/hooks.json # hooks
├── workflows/ # workflow scripts
├── output-styles/ · themes/ # styles, colour themes
├── monitors/monitors.json # background watchers
├── .mcp.json · .lsp.json # MCP and LSP servers
├── bin/ # executables added to Bash PATH
├── settings.json # defaults (only `agent`, `subagentStatusLine`)
└── scripts/ · LICENSE · README.md · CHANGELOG.mdA plugin shipping exactly one skill can put SKILL.md at the root with no
skills/ directory and no manifest field — it loads as a single-skill plugin,
named from the frontmatter name. Use skills/ the moment there might be two.
Note CLAUDE.md at a plugin root is not loaded as context. Instructions
reach Claude through skills, agents and hooks — nothing else. Putting guidance
in a plugin CLAUDE.md is a common way to write documentation that never loads.
The manifest
name is the only required field. It sets the namespace: every skill becomes
/<name>:<skill>, every agent <name>:<agent>.
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "my-plugin",
"displayName": "My Plugin",
"version": "1.0.0",
"description": "What it does — shown in the plugin manager",
"author": { "name": "…", "email": "…", "url": "…" },
"homepage": "…", "repository": "…", "license": "MIT",
"keywords": ["…"]
}Set version deliberately. With it, users only update when you bump it.
Without it, git-distributed plugins fall back to the commit SHA and every
commit is a new version — which turns routine pushes into update prompts for
everyone who installed it.
Full field list, component path fields and their replace-vs-extend rules, the
${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} variables, userConfig,
defaultEnabled and dependencies are in references/manifest.md — read it
when writing anything beyond the fields above.
Components
Per-component specifics — hook events and the hooks.json shape, agent
frontmatter, MCP/LSP config, monitors, bin/, and the path-variable rules that
decide whether a bundled script can find itself — are in
references/components.md. Read it when adding a component type you have
not shipped before.
Two rules that cut across all of them, because they are the difference between a plugin that works on your machine and one that works on anyone's:
- Never hardcode a path to plugin files. Use
${CLAUDE_PLUGIN_ROOT}— the install directory differs per user and changes on every update. It resolves in skill and agent content, hook and monitor commands, and the documented fields of MCP and LSP servers. - Never write state into the plugin directory. It is a versioned cache and
the old version is deleted about two weeks after an update. Anything that must
survive — installed dependencies, caches, generated files — goes in
${CLAUDE_PLUGIN_DATA}.
Distribution
A plugin becomes installable when it is listed in a marketplace: a repo with
.claude-plugin/marketplace.json naming the marketplace, its owner, and its
plugins with a source each (relative path, github, url, git-subdir, or
npm).
claude plugin validate . # validates marketplace.json too
claude plugin marketplace add ./path # test locally first
claude plugin marketplace add owner/repo # what your users will run
claude plugin install <plugin>@<marketplace>
claude plugin tag # git tag {name}--v{version}Always add the marketplace from a local path and install from it before pushing
— it is the only way to catch a source that points somewhere wrong, and the
failure mode after publishing is everyone else's broken install.
The full marketplace schema, every source variant, metadata.pluginRoot,
private/team hosting, renames for when you rename or drop a plugin, and
version resolution are in references/marketplace.md.
When something does not load
Work down this list before theorizing — in practice it is almost always the first item:
- Directories inside
.claude-plugin/? Onlyplugin.jsonbelongs there.validatewill not catch this — it passes clean while nothing loads. claude plugin validate --strict— a misspelled manifest key is a warning, not an error, so a plugin with askillkey loads and simply has no skills.--strictis what turns that into a failure (exit 1).- Manifest key shadowing a default folder. Declaring
commands,agents,workflows,outputStyles,themesormonitorsreplaces the default directory. If both exist, the folder is ignored —claude plugin listwarns.skillsis the exception: it adds to the default scan. claude plugin details <name>to see what actually got loaded, rather than what you believe you wrote.- Hook not firing? Check the command resolves under
${CLAUDE_PLUGIN_ROOT}and that the interpreter exists on the target machine — the scaffold usesbun, which most users will not have.nodeorpython3is the safer default for anything you distribute. - Skill invisible but the plugin loads? Plugin skills are namespaced.
It is
/my-plugin:hello, never/hello.
Converting existing .claude/ configuration
Copy commands/, agents/ and skills/ to the plugin root as-is. Hooks are
the one thing that moves: the hooks object from settings.json goes into
hooks/hooks.json — same format, new home.
Then remove the originals from .claude/. Project and user .claude/agents/
override same-named plugin agents, so the plugin's version stays dead until the
original is gone. Skills do not override — you get both /name and
/plugin:name, which is merely confusing rather than broken.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

