From claude-plugins-validation
Create Claude Code plugin or marketplace repos with full CI/CD. Use when scaffolding a new plugin or marketplace. Loaded by plugin-creator agent.
npx claudepluginhub emasoft/emasoft-plugins --plugin claude-plugins-validationThis skill uses the workspace's default tool permissions.
Scaffolds complete Claude Code plugin or marketplace repositories with standard files, CI/CD workflows, git hooks, and release pipeline.
Suggests manual /compact at logical task boundaries in long Claude Code sessions and multi-phase tasks to avoid arbitrary auto-compaction losses.
Share bugs, ideas, or general feedback.
Scaffolds complete Claude Code plugin or marketplace repositories with standard files, CI/CD workflows, git hooks, and release pipeline.
CPV supports three layouts: A (hub-and-spoke), B (nested), C (marketplace-in-plugin, self-referential). Default to A for multi-plugin sets; suggest C when one repo should be both plugin and marketplace. See marketplace-layouts.md.
git, uv, gh CLI on PATHCreate a Plugin Repository:
uv run "${CLAUDE_PLUGIN_ROOT}/scripts/generate_plugin_repo.py" <target-dir> \
--name <plugin-name> --description "<description>" \
--author "<author>" --author-email "<email>" \
--github-owner <github-username> [--marketplace <name>]
Create a Marketplace Hub (HUBS ONLY — no plugin code inside):
uv run "${CLAUDE_PLUGIN_ROOT}/scripts/generate_marketplace_repo.py" <target-dir> \
--name <marketplace-name> --owner-name "<display-name>" \
--description "<description>" --github-owner <github-username>
After generation:
plugin) — see references/launcher-invocation.md. Direct invocation refused.
The one-liner · Why the launcher is mandatory · Direct invocation (development only)
cd <target-dir> && git init && git add -A && git commit -m "Initial scaffold"gh repo create <owner>/<name> --public --source . --pushgit config core.hooksPath git-hooksCopy this checklist and track your progress:
uv run "${CLAUDE_PLUGIN_ROOT}/scripts/standardize_plugin.py" <path> [--fix]
uv run "${CLAUDE_PLUGIN_ROOT}/scripts/standardize_marketplace.py" <path> [--fix]
| Error | Resolution |
|---|---|
| Target directory exists | Choose a different name or remove the existing directory |
| Missing required arguments | Provide all mandatory flags (--name, --github-owner) |
| Validation fails after generation | Run standardize --fix, then fix remaining issues manually |
ModuleNotFoundError: yaml | Use uv run --with pyyaml python when outside CPV venv |
Create plugin · Create marketplace
Pre-Push Hook: The Quality Gate · Fix-All Mandate · Running CPV Scripts · Processing Validation Output · GitHub Secrets · CI Workflow Dependencies · Marketplace Notification · All Scripts Are Python · Binary Plugins · README Requirements · Pre-Publish Local Dry-Run · Post-Push CI Verification · Mega-Linter Configuration
Monitor tool · userConfig (plugin.json) · channels (plugin.json) · CLAUDE_PLUGIN_OPTION_ env vars · Inline marketplace (settings.json) · managed-settings.d/ drop-in directory · Plugin skill
namefield (v2.1.98)
Overview · Layout A — Hub-and-Spoke (separate repos) · Layout B — Nested single-repo (monorepo) · Layout C — Marketplace-in-plugin (self-referential single repo) · How Claude Code updates plugins in each layout · When to choose which · Rich metadata fields (author, homepage, license, category) · Why CPV does not use git-subdir · Encountering a non-CPV marketplace · Refactoring between layouts · Agent behavior summary
Why this exists · When NOT to use · Testing approach
Place bundled MCP executables in servers/, reference as ${CLAUDE_PLUGIN_ROOT}/servers/<name>. Unique names per server. See empirical-loading-bugs.md for footguns.
Use mcp__plugin_llm-externalizer_llm-externalizer__* for bounded work.
See examples.md.
Create plugin · Create marketplace
generate_plugin_repo.py --strip-dev (default) emits a cpv.strip block. See dev-stripping.md.
Why this exists · When NOT to use · Testing approach