From agent-capability-kit
Create or refactor a Claude Code plugin root with a minimal manifest and only the runtime components the plugin actually uses. Use this skill when authoring or reorganizing a plugin root offline.
npx claudepluginhub ririnto/sinon --plugin agent-capability-kitThis skill uses the workspace's default tool permissions.
Author a Claude Code plugin root that is structurally clear, minimal, and fully authorable from local files alone.
Prevents silent decimal mismatch bugs in EVM ERC-20 tokens via runtime decimals lookup, chain-aware caching, bridged-token handling, and normalization. For DeFi bots, dashboards using Python/Web3, TypeScript/ethers, Solidity.
Share bugs, ideas, or general feedback.
Author a Claude Code plugin root that is structurally clear, minimal, and fully authorable from local files alone.
Create or refactor one plugin root so the manifest is minimal, the filesystem layout matches the manifest, and optional runtime surfaces appear only when the plugin truly needs them.
This skill owns the plugin root and plugin-level runtime files:
.claude-plugin/plugin.json (Claude Code runtime manifest).codex-plugin/plugin.json (Codex runtime manifest; optional for single-runtime plugins)commands/agents/skills/hooks/.mcp.json.lsp.jsonsettings.jsonoutput-styles/monitors/plugin.json belongs inside .claude-plugin/ and .codex-plugin/../ inside plugin.json, and use the trailing-slash directory form for declared directories (for example "skills": "./skills/") rather than array-of-paths or bare ./skills.${CLAUDE_PLUGIN_ROOT} and keep generated or persistent runtime data under ${CLAUDE_PLUGIN_DATA}.agents/ at the plugin root whenever the plugin ships agents, but do not declare an agents manifest key in either runtime manifest because current host schemas reject it.name, description, author, repository, homepage, and license aligned across .claude-plugin/ and .codex-plugin/ manifests for the same plugin. Keep the runtime-specific marketplace block (for example Codex interface) only in its own manifest.Start from this tree unless the plugin needs fewer or more root-level components:
your-plugin/
├── .claude-plugin/
│ └── plugin.json
├── commands/
└── skills/
This is the normal starter layout because a plugin usually exists to ship commands, skills, or a combination of them. Add agents/ at the plugin root when the plugin ships agents or subagents, but keep it out of plugin.json. Remove any directory the plugin does not actually use, and add other runtime surfaces only when the plugin needs them.
.claude-plugin/plugin.json from assets/plugin.json or copy the minimal example below.hooks only when the plugin reacts to Claude Code lifecycle eventsmcpServers only when the plugin ships MCP server definitionslspServers only when the plugin configures LSP serverssettings only when the plugin needs plugin-level settingsoutputStyles only when the plugin ships reusable output stylesmonitors only when the plugin genuinely needs monitor definitions${CLAUDE_PLUGIN_ROOT} for bundled scripts, templates, servers, and other files that ship with the plugin${CLAUDE_PLUGIN_DATA} for generated caches, logs, indexes, or other persistent runtime data./, every declared component exists, and .claude-plugin/ contains only plugin.json.Use this as the default .claude-plugin/plugin.json starting point:
{
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
"name": "your-plugin-name",
"description": "Claude Code plugin for a clearly bounded workflow.",
"author": {
"name": "your-handle"
},
"commands": "./commands/",
"skills": "./skills/"
}
If the plugin ships agents at the plugin root, keep the directory in the plugin tree but leave it out of the manifest:
{
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
"name": "your-plugin-name",
"description": "Claude Code plugin for a clearly bounded workflow.",
"author": {
"name": "your-handle"
},
"commands": "./commands/",
"skills": "./skills/"
}
When the plugin also ships a Codex-facing manifest, mirror the same shared fields in .codex-plugin/plugin.json, keep agents/ at the plugin root without declaring it in the manifest, and add the runtime-specific interface block there (not in .claude-plugin/plugin.json):
{
"name": "your-plugin-name",
"description": "Claude Code plugin for a clearly bounded workflow.",
"author": {
"name": "your-handle"
},
"skills": "./skills/",
"interface": {
"displayName": "Your Plugin",
"shortDescription": "One-line summary for marketplace listings.",
"longDescription": "Longer marketplace copy.",
"developerName": "your-handle",
"category": "Coding",
"capabilities": ["Interactive", "Read"],
"defaultPrompt": ["First representative prompt."],
"websiteURL": "https://example.com/your-plugin"
}
}
Add optional keys only when the plugin needs the corresponding runtime surface. For example:
{
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
"name": "your-plugin-name",
"description": "Claude Code plugin for a clearly bounded workflow.",
"author": "your-handle",
"commands": "./commands/",
"skills": "./skills/",
"hooks": "./hooks/hooks.json",
"settings": "./settings.json"
}
This is valid only if ./hooks/hooks.json and ./settings.json exist and the plugin actually uses them.
Use these defaults during normal authoring:
commands/: add when the plugin ships slash commandsagents/: add when the plugin ships agents or subagents, but keep it out of both runtime manifestsskills/: add when the plugin ships reusable skillshooks/: add when the plugin must intercept or react to tool or session events.mcp.json: add when the plugin needs MCP server registrations.lsp.json: add when the plugin needs LSP server registrationssettings.json: add when the plugin needs plugin-level settingsoutput-styles/: add when the plugin ships reusable response formattingmonitors/: add only for genuine monitor behavior, not as a default scaffoldIf a plugin does not need a surface yet, omit both the file or directory and the manifest key.
Add optional surfaces only when the plugin genuinely needs that behavior. Omit both the manifest key and the filesystem artifact when the surface is not in use.
| Surface | Manifest key | When to add | Starter |
|---|---|---|---|
| Agents | none | the plugin ships agents or subagents as a root-level directory | create agents/ at the plugin root and document the shipped agents in the plugin README |
| Hooks | "hooks" | the plugin must react to Claude Code lifecycle events | copy assets/hooks.json + assets/hooks/check.sh |
| MCP | "mcpServers" | the plugin ships a local MCP server | copy assets/.mcp.json + assets/servers/example-mcp.py |
| LSP | "lspServers" | the plugin configures a language server | copy assets/.lsp.json + assets/lsp/example-lsp.py |
| Settings | "settings" | the plugin needs plugin-level settings | copy assets/settings.json |
| Output styles | "outputStyles" | the plugin ships reusable response formats | copy assets/output-style.md |
| Monitors | "monitors" | the plugin needs background observation | copy assets/monitors.json + assets/monitors/watch.sh |
Open references/plugin-runtime-components.md for per-surface extension points, tradeoffs, and deeper wiring guidance beyond the ordinary copy path above.
Keep these boundaries invariant across all plugin assets and starter files:
${CLAUDE_PLUGIN_ROOT}: read-only for bundled scripts, templates, servers, and other shipped files${CLAUDE_PLUGIN_DATA}: writable only for generated caches, logs, indexes, or other persistent runtime dataNever treat ${CLAUDE_PLUGIN_ROOT} as a writable data directory. Open references/plugin-release.md for the full example split and release-review context.
.claude-plugin/../.plugin.json promise components that the tree does not contain.${CLAUDE_PLUGIN_ROOT} as a writable data directory.Use these commands first when checking a real plugin root:
python3 -m json.tool .claude-plugin/plugin.json >/dev/null
The command above validates JSON syntax offline. For runtime validation with a live Claude Code installation, use:
claude --plugin-dir /absolute/path/to/your-plugin
This second command requires an online environment and is optional for ordinary offline authoring.
Return:
plugin.json.references/plugin-layout.md when you need expanded tree examples for minimal, command-only, or full plugin roots.references/plugin-runtime-components.md when a plugin needs deeper per-surface examples, extension points, or local file layout beyond the ordinary copy path above.references/plugin-release.md when reviewing install scope, packaging, or release checks.assets/plugin.json for the minimal starter manifest.assets/ only when the matching optional surface is part of the plugin you are authoring.