plugins/agent-scaffolders/skills/create-plugin/SKILL.md
Scaffolds a new top-level agent plugin directory. NOT for scaffolding single skills (use `create-skill`) and NOT for adding MCP integrations to existing plugins (use `create-mcp-integration`).
npx skillsauth add richfrem/agent-plugins-skills create-pluginInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Follow the create-plugin skill workflow to scaffold a new Claude Code plugin.
$ARGUMENTS — optional plugin name in kebab-case. Omit to start with discovery.$ARGUMENTS provides a plugin name, use it to seed Phase 1plugin.json, implement
each component using the appropriate sub-skill, validate, test, and document.claude-plugin/plugin.json.skills list.agents list.commands list.hooks list.plugin.json. ✅" or list additions made.plugin.json is finalized, scaffold a plugin.yaml at the plugin root for hermes-agent compatibility. Format:
name: <plugin-name>
version: <version>
description: "<description>"
author: <author>
kind: backend # or standalone (no Python scripts)
platforms:
- linux
- macos
- windows
provides_tools: # list script basenames (no .py) that expose callable tools
- script_name
skills: # list skill directory names under skills/
- skill-name
kind: standalone — plugin has no Python scripts that hermes calls directlykind: backend — plugin has scripts in scripts/ that hermes invokes as toolsprovides_tools if scripts/ contains callable tool scriptsskills/plugin.yaml created for hermes compatibility. ✅"__init__.py (Hermes tool/hook wiring — generate when plugin has scripts): If the plugin has callable Python scripts in scripts/, scaffold a root-level __init__.py with a register(ctx) function following this pattern:
from __future__ import annotations
from pathlib import Path
_HERE = Path(__file__).resolve().parent
def register(ctx) -> None:
# Register skills
ctx.register_skill(
name="<skill-name>", # bare name only — hermes auto-prefixes plugin name as namespace
path=_HERE / "skills" / "<skill-name>",
)
# Register tools (if scripts expose callable tools)
# ctx.register_tool(name, toolset, schema, handler)
# Register hooks (if plugin needs lifecycle hooks)
# ctx.register_hook("post_tool_call", handler)
register_skill() calls for every skill in the pluginregister_tool() if the plugin provides callable Python toolsregister_hook() if the plugin needs lifecycle hooks__init__.py, hermes shows "No __init__.py" warning and the plugin won't activate__init__.py created with register() function. ✅"Plugin directory with .claude-plugin/plugin.json, component directories, README.md,
and a .claude/settings.json stub for reliable local discovery.
$ARGUMENTS is empty: begin with Phase 1 discovery — do not pre-fill plugin namecreate-mcp-integration for each one/agent-scaffolders:audit-plugin to validate structureWhen a skill needs to call a Python helper script that is shared across skills in the same
plugin, always create a file-level symlink in the skill's scripts/ folder pointing to the
canonical copy at the plugin root — never duplicate the file.
Standard pattern:
plugins/<plugin>/scripts/<canonical_name>.py ← canonical source (real file)
plugins/<plugin>/skills/<skill>/scripts/<name>.py ← symlink → ../../../scripts/<canonical_name>.py
The symlink name and target name may differ (e.g. execute.py → exploration_optimizer_execute.py).
The bridge installer resolves all symlinks to physical copies when deploying via the marketplace.
Creating symlinks correctly:
# From the skill's scripts/ directory:
ln -s ../../../scripts/<canonical_name>.py <symlink_name>.py
# Or via symlink_manager.py:
python plugins/dev-utils/scripts/symlink_manager.py create \
--src plugins/<plugin>/scripts/<canonical_name>.py \
--dst plugins/<plugin>/skills/<skill>/scripts/<symlink_name>.py
⚠️ Windows / core.symlinks warning: If git config core.symlinks is false, git checks
out symlinks as plain-text "stand-in" files. These are silently broken — the bridge installer
copies the path string, not the script. After checkout on Windows or any machine where
symlinks may have degraded, run:
python plugins/dev-utils/scripts/bulk_symlink_fixer.py plugins/<plugin-name>
Then manually verify: find plugins/<plugin-name>/skills -path "*/scripts/*" -type f ! -type l
should return nothing (all script references should be real symlinks, not plain files).
When this plugin will be distributed via a marketplace.json, the marketplace entry defaults to strict: true, which requires the plugin to have its own plugin.json. A missing plugin.json silently prevents the entire plugin from loading.
Always:
.claude-plugin/plugin.json inside the plugin directory (this skill does this by default)"strict": true — never rely on the defaultmanage-marketplace skill for the correct marketplace entry formatreferences/ADRs/. Always consult them for standards on plugin architecture, shared scripts, cross-plugin dependencies, symlinking, and loose coupling to avoid repeating yourself.testing
Skill for creating and managing isolated git worktrees (`.worktrees/issue-NNN`) for issue execution branches. USE ONLY when setting up or cleaning up isolated git worktrees for specific issue execution. DO NOT USE for managing local task files (use `task-agent`) or escalating tasks to issues (use `github-issue-backlog-agent`).
data-ai
Skill for orchestrating the end-to-end GitHub issue lifecycle flow: Issue -> Worktree -> Implementation -> PR Creation -> Resolution Closure. USE ONLY when running or dry-running full lifecycle orchestration for resolving an issue with a PR. DO NOT USE for isolated worktree management only (use `issue-worktree-agent`) or logging issues (use `github-issue-agent`).
tools
Automatically ranks GitHub issues (P0-P3) based on friction tier, frequency, and blockages, synchronizing priority labels and GitHub Projects v2 custom fields.
testing
Bridge skill for escalating ephemeral local task scratchpad items (`tasks/*.md`) into durable, taxonomy-validated, evidence-rich GitHub Issues. USE ONLY when promoting a single-session local task into durable repository backlog. DO NOT USE for managing local kanban boards (use `task-agent` instead) or directly querying/commenting on issues (use `github-issue-agent` instead).