metaskill-packaging
Plugin Building and Packaging
Package your skills, agents, commands, and hooks as distributable plugins.
Plugin Structure
CRITICAL RULE: Only plugin.json goes inside .claude-plugin/. All components go at the plugin ROOT:
my-plugin/ <- Plugin name = neutral noun
├── .claude-plugin/
│ └── plugin.json # ONLY this file here!
├── commands/ # Slash commands (*.md) - imperative verbs
├── agents/ # Agent definitions (*.md) - role nouns
├── skills/ # Skills (*/SKILL.md) - ending in -ing
├── hooks/ # Event handlers (hooks.json)
├── .mcp.json # MCP servers (optional)
├── .lsp.json # LSP servers (optional)
└── README.md
# ❌ WRONG - components inside .claude-plugin/
.claude-plugin/
├── plugin.json
├── commands/ ← NO!
└── skills/ ← NO!
# ✅ CORRECT - components at plugin root
.claude-plugin/
└── plugin.json
commands/ ← YES!
skills/ ← YES!
plugin.json Manifest
Required fields:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "What this plugin does"
}
With recommended metadata:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "What this plugin does",
"author": {
"name": "Your Name",
"email": "you@example.com"
},
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"repository": "https://github.com/user/repo",
"homepage": "https://github.com/user/repo#readme"
}
See references/plugin-json-schema.md for the complete field reference.
Naming Conventions
See /metaskill-naming for the full naming convention.
Quick reference:
| Component | Form | Example |
|---|---|---|
| Plugin name | Neutral noun | metaskill, codeforge, datakit |
| Skills | -ing (gerund) | metaskill-authoring, metaskill-triggering |
| Agents | Role noun | metaskill-trigger-tester, metaskill-analyzer |
| Commands | Imperative verb | /metaskill-create, /quick-start |
Plugin name = Common prefix of all atoms
# ✅ GOOD - neutral noun prefix, correct suffixes
metaskill/
├── skills/
│ ├── metaskill-authoring/ # -ing
│ └── metaskill-triggering/ # -ing
├── agents/
│ └── metaskill-trigger-tester.md # role noun
└── commands/
└── quick-start.md # imperative
# ❌ BAD - verb-form prefix
skill-authoring/
├── skills/
│ └── skill-authoring-trigger/ # prefix already -ing!
No type postfixes:
# ❌ BAD - redundant type postfix
skills/code-review-skill/
agents/tester-agent.md
commands/lint-command.md
# ✅ GOOD - no type postfix
skills/code-reviewing/
agents/tester.md
commands/lint.md
Dogfooding Approaches
Quick Iteration (Active Development)
claude --plugin-dir ./my-plugin
- Loads plugin immediately
- Restart Claude Code to pick up changes
- Best for rapid iteration
Marketplace Testing (Pre-Release)
# Add your repo as a local marketplace (once)
/plugin marketplace add /path/to/your/repo
# Install the plugin
/plugin install your-repo@my-plugin
# After changes, reinstall to test
/plugin uninstall your-repo@my-plugin
/plugin install your-repo@my-plugin
- Tests the full installation flow
- Verifies the user experience
- Use before releasing
Plugin Placement in Repos
Single Plugin at Repo Root
For a repo that IS the plugin:
my-plugin-repo/
├── .claude-plugin/
│ └── plugin.json
├── skills/
│ └── my-plugin-authoring/
├── agents/
└── README.md
Plugin Inside a Project (Dogfooding)
For internal tooling within a larger project:
my-project/
├── src/
├── tests/
├── .claude/ # Project's Claude config
│ └── settings.json
└── plugins/
└── my-internal-plugin/
├── .claude-plugin/
│ └── plugin.json
└── skills/
Load with: claude --plugin-dir ./plugins/my-internal-plugin
Multiple Plugins in One Repo
Use marketplace.json to reference multiple plugins:
my-repo/
├── .claude-plugin/
│ └── marketplace.json # References plugins below
├── plugins/
│ ├── plugin-a/
│ │ ├── .claude-plugin/
│ │ │ └── plugin.json
│ │ └── skills/
│ └── plugin-b/
│ ├── .claude-plugin/
│ │ └── plugin.json
│ └── agents/
└── README.md
marketplace.json (required fields):
{
"name": "my-marketplace",
"owner": {
"name": "Your Name"
},
"plugins": [
{ "name": "plugin-a", "source": "./plugins/plugin-a" },
{ "name": "plugin-b", "source": "./plugins/plugin-b" }
]
}
With full metadata:
{
"name": "my-marketplace",
"owner": {
"name": "Your Name",
"email": "you@example.com"
},
"metadata": {
"description": "Description of your marketplace",
"version": "1.0.0"
},
"plugins": [
{
"name": "plugin-a",
"source": "./plugins/plugin-a",
"description": "What plugin-a does",
"version": "1.0.0",
"author": { "name": "Your Name", "email": "you@example.com" },
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"category": "development"
}
]
}
See references/marketplace-json-schema.md for the complete field reference.
Users can then:
/plugin marketplace add /path/to/my-repo
/plugin install my-marketplace@plugin-a
Internal vs External Plugins
Internal (Dogfooding within Repo)
Place in a plugins/ or tools/ directory:
my-project/
├── plugins/
│ └── internal-tooling/ # For this project only
│ ├── .claude-plugin/
│ │ └── plugin.json
│ └── skills/
- Not meant for distribution
- Project-specific utilities
- Load with
--plugin-dir
External (Open Source / Distribution)
Option A: Dedicated plugin repo
my-plugin/ # Repo IS the plugin
├── .claude-plugin/
│ └── plugin.json
└── skills/
Option B: Plugin marketplace repo
my-plugins/ # Repo contains multiple plugins
├── .claude-plugin/
│ └── marketplace.json
└── plugins/
├── plugin-a/
└── plugin-b/
Plugin Components Reference
| Directory | Contents | Naming Pattern |
|---|---|---|
.claude-plugin/ |
plugin.json only |
N/A |
skills/ |
*/SKILL.md |
prefix-action-ing |
agents/ |
*.md |
prefix-role-noun |
commands/ |
*.md |
imperative-verb |
hooks/ |
hooks.json |
N/A |
.mcp.json |
MCP servers | N/A |
.lsp.json |
LSP servers | N/A |
Common Mistakes
Components in Wrong Location
# ❌ WRONG
.claude-plugin/
├── plugin.json
└── skills/ # NO! Skills outside .claude-plugin/
# ✅ CORRECT
.claude-plugin/
└── plugin.json
skills/ # YES! At plugin root
Missing plugin.json
# ❌ WRONG - no manifest
my-plugin/
└── skills/
# ✅ CORRECT - has manifest
my-plugin/
├── .claude-plugin/
│ └── plugin.json
└── skills/
Verb-Form Prefix
# ❌ WRONG - prefix is already -ing
skill-authoring/
├── skills/
│ └── skill-authoring-triggering/ # Double verb!
# ✅ CORRECT - neutral noun prefix
metaskill/
├── skills/
│ └── metaskill-triggering/ # Noun + -ing
Related Skills
- For naming conventions, see
/metaskill-naming - For skill structure and writing, see
/metaskill-authoring - For skill group patterns, see
/metaskill-grouping - For trigger optimization, see
/metaskill-triggering - To test if triggers work, use the
metaskill-trigger-testeragent
More from gigaverse-app/skillet
metaskill-authoring
Write Claude Code skills and SKILL.md files. Use when creating new skills, writing skill content, structuring SKILL.md, organizing skill directories, or when user mentions "write skill", "create skill", "author skill", "new skill", "skill structure", "SKILL.md", "skill content", "skill template".
9metaskill-triggering
Optimize skill triggers and descriptions for reliable activation. Use when skill is not triggering, optimizing trigger keywords, writing frontmatter, debugging activation, or when user mentions "trigger", "frontmatter", "description", "skill not triggering", "optimize trigger", "skill won't fire", "skill activation", "trigger keywords".
8metaskill-naming
Brainstorm and validate names for plugins, skills, agents, and commands. Use when naming a new plugin, choosing atom names, validating naming conventions, or when user mentions "name plugin", "name skill", "naming convention", "brainstorm names", "what should I call", "plugin name", "good name for".
7metaskill-grouping
Create skill groups (multiple related skills packaged as a plugin). Use when creating plugins, organizing multiple related skills, building skill families, packaging tools together, or when user mentions "plugin", "multiple skills", "related skills", "skill group", "skill family", "organize skills", "cross-reference", "package skills", "shared agents". ALWAYS consider this pattern when someone asks to "create a skill" - they often need a skill GROUP packaged as a plugin.
7nicegui-development
Use when building UI with NiceGUI, creating components, fixing styling issues, or when user mentions "nicegui", "quasar", "tailwind", "ui.row", "ui.column", "gap spacing", "state management", "controller", "dialog", "modal", "ui component", "ui layout".
6pythonista-nicegui
Use when building UI with NiceGUI, creating components, fixing styling issues. Triggers on "nicegui", "quasar", "tailwind", "ui.row", "ui.column", "ui.card", "ui.dialog", "gap", "spacing", "layout", "modal", "component", "styling", "flexbox", "chart", or when creating/editing UI code.
5