plugin-creator
Installation
SKILL.md
Plugin Creator
Scaffold a well-formed Claude Code plugin with exactly the components the user wants, no more and no fewer. A plugin is a self-contained directory with a manifest (.claude-plugin/plugin.json) plus any of: skills, agents, commands, workflows, hooks, MCP servers, LSP servers, bin executables, output styles, default settings. This tool generates the correct structure, writes a valid manifest, adds a marketplace entry when requested, and explains how to test locally with --plugin-dir.
Core Principles
| Principle | Meaning |
|---|---|
| Manifest is optional but recommended | If omitted, the directory name becomes the plugin name and components auto-discover at default locations. A marketplace entry without a plugin.json is itself the manifest and accepts every plugin.json field. Provide a manifest whenever metadata, versioning, or custom paths matter. |
| Default locations first | Prefer skills/, agents/, hooks/hooks.json, .mcp.json, .lsp.json at plugin root. Override paths in plugin.json only when there is a real reason. |
Components live at the root, not in .claude-plugin/ |
Only plugin.json belongs inside .claude-plugin/. Everything else (skills/, agents/, etc.) is at the plugin root. This is the most common mistake. |
Use ${CLAUDE_PLUGIN_ROOT} for every plugin-internal path |
Absolute paths break when the plugin is cached. ${CLAUDE_PLUGIN_ROOT} resolves to the installed plugin directory at runtime. Use ${CLAUDE_PLUGIN_DATA} only for disposable caches: it survives updates but is deleted on uninstall. |
| Namespacing is automatic | Plugin skills are always invoked as /plugin-name:skill-name. The plugin name comes from the name field in plugin.json (or the directory name if there is no manifest). |
| Semantic versioning in one place | Set version in plugin.json or in the marketplace entry, not both. When it is in both, plugin.json wins. With no version anywhere, the commit SHA is the version, so every commit is an update. |