| name | plugin-scaffold |
| description | Scaffolds a Claude Code plugin with .claude-plugin/marketplace.json + plugin.json + a starter skill/agent/hook + GitHub Actions validator โ codifies the vibesubin maintenance pattern. Use when creating a new plugin, publishing to a marketplace, or "ํ๋ฌ๊ทธ์ธ ๋ง๋ค์ด์ค", "claude code plugin scaffold", "๋ง์ผํ๋ ์ด์ค ํ๋ฌ๊ทธ์ธ". |
| author | subinium |
| user-invocable | true |
| disable-model-invocation | true |
| allowed-tools | Read, Write, Bash, Edit |
| argument-hint | <plugin-name> [--with-mcp] [--with-hooks] [--with-agent] |
Plugin Scaffold
Scaffold a new Claude Code plugin in the current directory (or <plugin-name>/ subdirectory). Follows the schema verified in 2026-04 docs (see https://code.claude.com/docs/en/plugins).
Arguments
<plugin-name> (required, kebab-case, โค64 chars, NOT containing "claude" or "anthropic")
--with-mcp โ also scaffold an MCP server (Python/uvx, stdio transport)
--with-hooks โ also scaffold a PostToolUse hook stub (env-opt-in pattern)
--with-agent โ also scaffold a sub-agent
HARD validation rules
These are non-negotiable schema requirements. The scaffold MUST emit a working plugin:
<name> MUST be kebab-case, โค64 chars, NOT contain "claude"/"anthropic"
marketplace.json plugin entry MUST have name, version, description, author, homepage, repository
marketplace.json MUST use category (singular string) and tags (array) โ NOT categories (which is not in the schema)
plugin.json version MUST match marketplace.json plugin entry version (drift = release bug)
- Skill
description MUST be third-person, โค1024 chars, contain explicit "Use when..." phrase
- Hook scripts MUST be executable (
chmod +x) and reference ${CLAUDE_PLUGIN_ROOT} for cross-machine portability
Process
1. Validate plugin name
NAME="<plugin-name>"
[[ "$NAME" =~ ^[a-z][a-z0-9-]{1,63}$ ]] || { echo "Invalid name (kebab-case, โค64)"; exit 1; }
[[ "$NAME" =~ (claude|anthropic) ]] && { echo "Name must not contain 'claude' or 'anthropic'"; exit 1; }
2. Create directory structure
<plugin-name>/
โโโ .claude-plugin/
โ โโโ marketplace.json
โโโ plugins/
โ โโโ <plugin-name>/
โ โโโ .claude-plugin/
โ โ โโโ plugin.json
โ โโโ skills/
โ โ โโโ starter/
โ โ โโโ SKILL.md
โ โโโ agents/ # if --with-agent
โ โ โโโ starter.md
โ โโโ hooks/ # if --with-hooks
โ โ โโโ hooks.json
โ โ โโโ on-edit.sh
โ โโโ mcp/ # if --with-mcp
โ โโโ server.py
โโโ .github/
โ โโโ workflows/
โ โโโ validate.yml
โ โโโ release.yml
โโโ scripts/
โ โโโ validate_skills.py
โโโ tests/
โ โโโ test_metadata.py
โโโ README.md
โโโ LICENSE
โโโ CHANGELOG.md
โโโ install.sh
โโโ uninstall.sh
3. Generate canonical files
.claude-plugin/marketplace.json (note: category singular, tags array):
{
"name": "<plugin-name>",
"owner": { "name": "<author>", "email": "<email>" },
"plugins": [
{
"name": "<plugin-name>",
"source": "./plugins/<plugin-name>",
"version": "0.1.0",
"description": "<one-line description>",
"author": { "name": "<author>", "email": "<email>" },
"homepage": "https://github.com/<owner>/<plugin-name>",
"repository": "https://github.com/<owner>/<plugin-name>",
"license": "MIT",
"category": "developer-tools",
"tags": ["claude-code", "<domain>"],
"keywords": ["<keyword1>", "<keyword2>"]
}
]
}
plugins/<name>/.claude-plugin/plugin.json โ same name + version (must stay in sync, validator enforces).
plugins/<name>/skills/starter/SKILL.md โ minimal valid skill with proper frontmatter.
If --with-hooks: hooks/hooks.json registering on-edit.sh to PostToolUse Edit|Write matcher; script gates with [ "${<NAME>_AUTO:-0}" = "1" ] || exit 0 (opt-in pattern).
If --with-mcp: mcp/server.py + .mcp.json referencing ${CLAUDE_PLUGIN_ROOT}/mcp/server.py. Document that Cursor/Cline don't auto-discover (per Track 3 review).
scripts/validate_skills.py โ port from vibesubin: schema validate frontmatter, check version sync between manifests, check description length, check hooks executable.
.github/workflows/validate.yml โ runs validator on push and PR.
.github/workflows/release.yml โ runs on v*.*.* tag push: validate + manifest sync check + GH release.
4. Initialize git + remote (if not already in a repo)
[ -d .git ] || git init
git add . && git commit -m "chore: scaffold plugin <name>"
5. Print next steps
โ Plugin scaffolded at <path>
Next:
1. cd <plugin-name>
2. Edit plugins/<name>/skills/starter/SKILL.md with real content
3. python3 scripts/validate_skills.py # should pass
4. gh repo create <plugin-name> --public --source=. --remote=origin
5. git push -u origin main
6. git tag v0.1.0 && git push --tags # triggers release workflow
Constraints
- Default โ DO NOT push to GitHub automatically (HARD: user must explicitly run the push)
- Default โ DO NOT add the plugin to the user's
~/.claude/settings.json enabledPlugins (separate manual step after testing)
- DO NOT scaffold over an existing non-empty plugin directory without explicit
--force
- Korean response per global CLAUDE.md