skills/plugin-creator/SKILL.md
This skill should be used when the user asks to 'create a plugin', 'scaffold a plugin', 'set up plugin structure', 'new plugin', 'edit the plugin manifest', 'wire plugin hooks', 'validate plugin structure', or needs plugin-level work spanning multiple components. For creating or editing a single skill (even inside a plugin), use skill-creator instead.
npx skillsauth add edwinhu/workflows plugin-creatorInstall 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.
This skill wraps the built-in plugin-dev:create-plugin with enforcement pattern awareness from the superpowers framework. It adds an enforcement audit layer and PostToolUse validation hooks that the built-in version lacks.
Before drafting, classify what's being created or edited:
| Type | Description | Enforcement Needs | |------|-------------|-------------------| | Full plugin | New plugin with skills, hooks, commands, agents | High — needs enforcement across all components | | Skill addition | Adding a skill to an existing plugin | Medium — needs skill-level enforcement audit | | Hook addition | Adding hooks to an existing plugin | Medium — needs path validation, matcher coverage | | Component edit | Substantial edit to existing plugin component | Medium — needs re-audit of affected enforcement |
!cat ${CLAUDE_SKILL_DIR}/../../references/creator-anti-patterns.md
Before drafting, identify constraints that should be mechanically enforced rather than prompt-enforced. Four mechanisms are available:
| Mechanism | Resolves at | Use for |
|-----------|------------|---------|
| ${CLAUDE_SKILL_DIR} | Skill load | Script paths in Bash templates (use directly, never wrap in $()) |
| !command`` (bang) | Skill load | Injecting reference file content, environment state |
| Scoped hooks (Pre/PostToolUse) | Each tool call | Mechanically checkable constraints (lint, path guards) |
| SessionStart hook (once: true) | Session start | Expensive computations (API calls, index builds) — not paths or content |
The principle: if a constraint is mechanically checkable, enforce it with a hook. If it requires judgment, keep it as prompt text.
Use the Skill tool to invoke the built-in plugin creator:
Skill(skill="plugin-dev:create-plugin")
Follow its full process. The built-in creator handles the workflow — do not reimplement it.
After writing or revising plugin components (and before final validation), audit against the superpowers enforcement patterns. Read the enforcement checklist:
!cat ${CLAUDE_SKILL_DIR}/../../references/enforcement-checklist.md
Then score the draft using the appropriate template:
Score against all 12 patterns from the checklist. Focus especially on:
Verify:
${CLAUDE_SKILL_DIR}/../.. (not ${CLAUDE_SKILL_DIR})?Verify:
Tension resolution: Enforcement patterns go in skill body (not description), implementation code goes in scripts/, names are descriptive but descriptions are trigger-only.
Return to the built-in plugin creator's process for validation and testing. After each iteration's revision, re-run the enforcement audit (Step 3).
During iteration, watch for enforcement iteration signals (see "Enforcement Iteration Signals" in the anti-patterns reference loaded above).
references/enforcement-checklist.md (loaded above via bang injection)references/creator-anti-patterns.md (loaded above via bang injection)references/PHILOSOPHY.mdplugin-dev:create-plugindevelopment
Build the meeting-level proxy-voting × ownership panel on the WRDS SGE grid — ISS N-PX fund votes reduced to (item × block) direction cells, joined to institutional and mutual-fund ownership. Use when working with risk.voteanalysis_npx, N-PX fund-level votes, ISS→CRSP fund linking, index/passive/active voting blocks, or a proxy-voting panel that needs ownership attached.
development
Use when "CRSP CIZ", "CRSP v2", "CRSP flat file format 2.0", "crsp.dsf_v2 / msf_v2", "StkDlySecurityData", "StkMthSecurityData", "StkSecurityInfoHist", "stocknames_v2", "DlyRet / MthRet / DlyPrc / MthPrc", "SHRCD or EXCHCD equivalent in new CRSP", "SIZ to CIZ migration", "CRSP data after 2024", "CRSP delisting returns", "CRSP cumulative adjustment factors", "CRSP index INDNO / INDFAM", or any CRSP stock/index query where the legacy SIZ column names no longer exist.
development
Use when linking or deduping datasets by entity name rather than a shared key — 'fuzzy match', 'fuzzy name matching', 'entity resolution', 'record linkage', 'match company/person names', 'dedupe entity names', 'name-based join', 'bridge identifiers' (CIK ↔ permno ↔ gvkey ↔ wficn ↔ EIN ↔ personid), or any use of char n-gram TF-IDF, cosine similarity on names, `sparse_dot_topn`, or RapidFuzz at scale.
development
Use when building a publication-quality table in Python — 'regression table', 'results table', 'summary statistics table', 'etable', 'coefplot', 'great_tables', 'GT', 'gt table', 'format a table for the paper', 'export table to LaTeX/HTML', significance stars, spanners, or column formatting for a table headed into a paper, slide deck, or notebook.