Skills Creator
Create new Claude Code plugin components (skills, agents, commands, full plugins) with proper conventions and real content. Marketplace-agnostic: read the target .claude-plugin/marketplace.json and CLAUDE.md for project-specific conventions (author, license, category taxonomy) before scaffolding.
Decision Flow
Determine what the user wants to create:
1. "new skill" --> Skill Creation workflow
2. "new agent" --> Agent Creation workflow
3. "new command" --> Command Creation workflow
4. "new plugin" --> Full Plugin workflow (combines above)
If unclear, ask: "What do you want to create -- a skill, agent, command, or full plugin?"
Skill vs Agent Decision
Before gathering requirements, help the user decide the right component type.
Key question: "Does this need its own context/tools/isolation, or is it knowledge that any agent should access?"
- If it's knowledge, conventions, recipes --> Skill
- If it needs isolation, tool restrictions, parallel execution --> Agent
- If it's a domain with both knowledge and specialist work --> Skill + Agent(s)
See references/skills-vs-agents.md for the full decision table, real restructure examples, and anti-patterns.
Description Engineering
The description field is the single most important line in any skill or agent. It determines whether the component activates at all. Passive descriptions achieve ~50-77% activation; directive descriptions with negative constraints achieve 97-100%.
The High-Activation Template
<Domain> expert. ALWAYS invoke this skill when the user <trigger actions>.
Do not <alternative action> directly.
TRIGGER WHEN: <specific triggers, comma-separated>
DO NOT TRIGGER WHEN: <confusable case> (use <sibling-component> instead)
The last line is conditional: write it only when a confusable sibling exists to name. See "The DO NOT TRIGGER WHEN rule" below.
Examples
# BAD (50-77% activation) -- passive, suggestion-style
description: "Helps with Docker containerization tasks"
# GOOD (97-100% activation) -- directive with negative constraint
description: >
Docker containerization expert. ALWAYS invoke this skill when the user
asks about Docker, containers, Dockerfiles, or docker-compose.
Do not run Docker commands or write Dockerfiles directly.
TRIGGER WHEN: building containers, writing Dockerfiles, debugging Docker issues
DO NOT TRIGGER WHEN: the task is Kubernetes orchestration (use k8s-operator instead)
Description Rules
- Directive voice -- "ALWAYS invoke" not "Can be used for"
- Negative constraint -- "Do not X directly" prevents Claude from bypassing the skill
- Specific trigger phrases -- list the exact words/phrases that should activate it
- Third person -- "Processes X when Y" not "I process X" or "You should use this"
- Max 1024 characters -- hard limit per description
- Always include TRIGGER WHEN -- it carries the vocabulary that routes to this component
- Include DO NOT TRIGGER WHEN only when it names a sibling -- see the rule below
- Never repeat a term in both the opening sentence and TRIGGER WHEN: the trigger line keeps it
The DO NOT TRIGGER WHEN rule
A DO NOT TRIGGER WHEN clause earns its context cost only by naming the component that should handle the case instead. It is a routing instruction, not a disclaimer.
# Useless: the logical inverse of TRIGGER WHEN, discriminates nothing, costs every session
DO NOT TRIGGER WHEN: the task is outside the specific scope of this component.
# Useful: routes the confusable case to a named sibling
DO NOT TRIGGER WHEN: the target is a Python codebase (use python-dead-code instead)
When no confusable sibling exists, omit the clause entirely.
Token Budget Awareness
A description is the only part of a component that sits in context in every session; the body loads only after invocation. Anything a description restates from its own body is pure cost, paid on every request that never invokes the component.
Each skill/agent costs ~100 tokens at idle (just name + description in system prompt). All descriptions combined share a 15,000 character budget by default. When total description text exceeds this limit, components may be silently dropped from the system prompt, which degrades routing for everything.
- Keep individual descriptions under 300 characters when possible
- List the trigger vocabulary, never the feature set: if the body covers it, the description must not enumerate it
- Strip marketing adjectives (Expert, Comprehensive, Adversarial, Master), mechanics sentences ("Report-only", "Spawned in parallel"), and toolchain version numbers that are not themselves triggers
Phase 1: Requirements Gathering
Before writing any files, gather enough context to produce real content.
For Skills
Ask (adapt based on what's already known):
- What does this skill do? What problem does it solve?
- What are the exact trigger phrases? (user actions, keywords, file types -- be specific: "when the user says X", "when working on Y files")
- What should NOT trigger it? (adjacent domains that should be excluded)
- Which plugin should it live in? (existing or new)
- Does it need bundled resources? (scripts/, references/, assets/)
- What's the degree of freedom? (rigid workflow vs flexible guidance)
For Agents
Ask (adapt based on what's already known):
- What role does this agent fill? What task does it handle?
- What tools does it need? (Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task -- or all)
- Which plugin should it live in?
- What color fits its domain? See references/conventions.md for the palette and semantic guidance.
For Commands
Ask (adapt based on what's already known):
- What does this command do when invoked?
- What arguments does it expect?
- Which plugin should it live in?
For Full Plugins
Ask (adapt based on what's already known):
- What's the plugin's domain/purpose?
- What components does it need? (agents, skills, commands)
- What category? See references/conventions.md for valid categories.
Do not ask more than 3-4 questions per message. Start with the most important, follow up as needed.
Phase 2: Content Generation
Generate production-ready files with real content -- not [FILL] placeholders.
Skill Creation
- Create directory:
plugins/<plugin>/skills/<skill-name>/
- Write
SKILL.md following these rules:
- Frontmatter:
name (kebab-case, max 64 chars) and description (max 1024 chars)
- Description format -- MUST follow the high-activation template:
- Directive voice: "ALWAYS invoke this skill when..."
- Negative constraint: "Do not X directly"
- Always include a
TRIGGER WHEN: line; add DO NOT TRIGGER WHEN: only when it names a sibling
- Third person, specific trigger phrases
- See "Description Engineering" section above
- Optional frontmatter:
context: fork (isolates in subagent), allowed-tools (restricts tool access), disable-model-invocation: true (prevents auto-triggering)
- Body: under 500 lines, imperative tone, concise
- Only add context Claude doesn't already have -- don't repeat what Claude already knows
- Progressive disclosure: split into references/ if body exceeds ~300 lines
- Can use
!command syntax for dynamic context injection (shell commands that execute before content reaches Claude)
- Create
references/, scripts/, assets/ subdirs only if needed
- Write any bundled resources
Agent Creation
- Create file:
plugins/<plugin>/agents/<agent-name>.md
- Write with frontmatter and body following these rules:
- Frontmatter fields:
name, description (use YAML > for multiline), model: inherit, color, optionally tools
- Description format -- same directive template as skills:
- Always include a
TRIGGER WHEN: line; add DO NOT TRIGGER WHEN: only when it names a sibling
- Third person, specific triggers
- Example:
"Does X. TRIGGER WHEN: user needs Y. DO NOT TRIGGER WHEN: the work is Z (use sibling-agent instead)."
- Body: terse keyword-list style, imperative tone, structured with markdown headers
- Sections:
# ROLE, # CAPABILITIES or # CORE CAPABILITIES, # CONVENTIONS, # OUTPUT FORMAT
- Simple agents: 60-200 lines; complex agents: up to 800 lines
- See references/conventions.md for color palette and style patterns
Command Creation
- Create file:
plugins/<plugin>/commands/<command-name>.md
- Write with frontmatter:
description, argument-hint
- Body: step-by-step procedure, clear and actionable
Phase 3: Marketplace Registration
After files are created:
- Read
.claude-plugin/marketplace.json
- Add paths to the plugin's
agents, skills, or commands arrays
- Agents:
"./agents/<name>.md"
- Skills:
"./skills/<name>"
- Commands:
"./commands/<name>.md"
- If new plugin: add full entry to
plugins[] with all required fields (name, source, description, version 1.0.0, author, license, keywords, category, strict)
- Bump plugin version (patch for new component in existing plugin)
- Bump metadata.version (patch increment)
Phase 4: Validation
After registration:
- Verify the file exists at the registered path
- Verify frontmatter parses correctly
- Verify naming conventions (kebab-case, filename matches name field)
- Verify no em dash characters anywhere
- Report what was created with file paths
Anti-patterns
| Scenario |
Wrong |
Right |
| Writing descriptions |
Passive: "Helps with Docker" (50% activation) |
Directive: "ALWAYS invoke when user asks about Docker. Do not run Docker commands directly." (97%+ activation) |
| Description tone |
"Can be used for...", "Use when..." |
"ALWAYS invoke this skill when...", "Do not X directly" |
| Missing exclusions |
Confusable sibling exists but no DO NOT TRIGGER WHEN clause names it |
Name the component that should handle the case instead |
| Empty exclusions |
"DO NOT TRIGGER WHEN: the task is outside the specific scope of this component" |
Omit the clause when there is no sibling to name |
| Writing agent prompts |
Verbose prose paragraphs |
Terse keyword-list style |
| Skill body length |
800+ lines in SKILL.md |
Split into references/ at ~300 lines |
| Skill body content |
Repeating what Claude already knows |
Only add context Claude lacks; trust built-in knowledge |
| Creating resources |
Empty placeholder dirs |
Only create dirs that have files |
| Choosing a plugin |
Always create a new one |
Prefer adding to existing plugin if domain fits |
| Agent description |
First/second person |
Third person: "Processes X when Y" |
| Token budget |
Long verbose descriptions on all components |
Keep descriptions under 300 chars when possible; total budget is 15k chars |
| Description content |
Enumerating features the body already documents |
List trigger vocabulary only; the body loads at invocation, the description is paid every session |
Critical Rules
- All names: kebab-case
- Never use em dash -- use hyphen
- or double hyphen --
- Default model for agents:
inherit (agents follow the session model)
- Agent filename must match frontmatter
name field
- Skill directory name must match frontmatter
name field
- Always bump both plugin version AND metadata.version
- Stage marketplace.json with component files in same commit
- Write real content, never placeholder text
1---2name: skills-creator3description: Creates new Claude Code plugin components: skills, agents, commands, full plugins. Also decides skill vs agent architecture. TRIGGER WHEN: the user asks to create, add, scaffold or build a new skill, agent, command or plugin, or says "new skill", "new agent", "new plugin", "skills-creator", "skills-hammer". DO NOT TRIGGER WHEN: editing or updating an existing component, or auditing marketplace integrity (use marketplace-audit instead).4---56# Skills Creator78Create new Claude Code plugin components (skills, agents, commands, full plugins) with proper conventions and real content. Marketplace-agnostic: read the target `.claude-plugin/marketplace.json` and `CLAUDE.md` for project-specific conventions (author, license, category taxonomy) before scaffolding.910## Decision Flow1112Determine what the user wants to create:1314```151. "new skill" --> Skill Creation workflow162. "new agent" --> Agent Creation workflow173. "new command" --> Command Creation workflow184. "new plugin" --> Full Plugin workflow (combines above)19```2021If unclear, ask: "What do you want to create -- a skill, agent, command, or full plugin?"2223## Skill vs Agent Decision2425Before gathering requirements, help the user decide the right component type.2627**Key question:** "Does this need its own context/tools/isolation, or is it knowledge that any agent should access?"2829- If it's **knowledge, conventions, recipes** --> Skill30- If it needs **isolation, tool restrictions, parallel execution** --> Agent31- If it's a **domain with both knowledge and specialist work** --> Skill + Agent(s)3233See [references/skills-vs-agents.md](references/skills-vs-agents.md) for the full decision table, real restructure examples, and anti-patterns.3435## Description Engineering3637The `description` field is the single most important line in any skill or agent. It determines whether the component activates at all. Passive descriptions achieve ~50-77% activation; directive descriptions with negative constraints achieve 97-100%.3839### The High-Activation Template4041```42<Domain> expert. ALWAYS invoke this skill when the user <trigger actions>.43Do not <alternative action> directly.44TRIGGER WHEN: <specific triggers, comma-separated>45DO NOT TRIGGER WHEN: <confusable case> (use <sibling-component> instead)46```4748The last line is conditional: write it only when a confusable sibling exists to name. See "The DO NOT TRIGGER WHEN rule" below.4950### Examples5152```yaml53# BAD (50-77% activation) -- passive, suggestion-style54description: "Helps with Docker containerization tasks"5556# GOOD (97-100% activation) -- directive with negative constraint57description: >58 Docker containerization expert. ALWAYS invoke this skill when the user59 asks about Docker, containers, Dockerfiles, or docker-compose.60 Do not run Docker commands or write Dockerfiles directly.61 TRIGGER WHEN: building containers, writing Dockerfiles, debugging Docker issues62 DO NOT TRIGGER WHEN: the task is Kubernetes orchestration (use k8s-operator instead)63```6465### Description Rules66671. **Directive voice** -- "ALWAYS invoke" not "Can be used for"682. **Negative constraint** -- "Do not X directly" prevents Claude from bypassing the skill693. **Specific trigger phrases** -- list the exact words/phrases that should activate it704. **Third person** -- "Processes X when Y" not "I process X" or "You should use this"715. **Max 1024 characters** -- hard limit per description726. **Always include TRIGGER WHEN** -- it carries the vocabulary that routes to this component737. **Include DO NOT TRIGGER WHEN only when it names a sibling** -- see the rule below748. **Never repeat a term** in both the opening sentence and TRIGGER WHEN: the trigger line keeps it7576### The DO NOT TRIGGER WHEN rule7778A `DO NOT TRIGGER WHEN` clause earns its context cost only by naming the component that should handle the case instead. It is a routing instruction, not a disclaimer.7980```yaml81# Useless: the logical inverse of TRIGGER WHEN, discriminates nothing, costs every session82DO NOT TRIGGER WHEN: the task is outside the specific scope of this component.8384# Useful: routes the confusable case to a named sibling85DO NOT TRIGGER WHEN: the target is a Python codebase (use python-dead-code instead)86```8788When no confusable sibling exists, omit the clause entirely.8990### Token Budget Awareness9192A description is the only part of a component that sits in context in **every** session; the body loads only after invocation. Anything a description restates from its own body is pure cost, paid on every request that never invokes the component.9394Each skill/agent costs ~100 tokens at idle (just name + description in system prompt). All descriptions combined share a **15,000 character budget** by default. When total description text exceeds this limit, components may be silently dropped from the system prompt, which degrades routing for everything.9596- Keep individual descriptions **under 300 characters** when possible97- List the trigger vocabulary, never the feature set: if the body covers it, the description must not enumerate it98- Strip marketing adjectives (Expert, Comprehensive, Adversarial, Master), mechanics sentences ("Report-only", "Spawned in parallel"), and toolchain version numbers that are not themselves triggers99100## Phase 1: Requirements Gathering101102Before writing any files, gather enough context to produce real content.103104### For Skills105106Ask (adapt based on what's already known):1071. What does this skill do? What problem does it solve?1082. What are the exact trigger phrases? (user actions, keywords, file types -- be specific: "when the user says X", "when working on Y files")1093. What should NOT trigger it? (adjacent domains that should be excluded)1104. Which plugin should it live in? (existing or new)1115. Does it need bundled resources? (scripts/, references/, assets/)1126. What's the degree of freedom? (rigid workflow vs flexible guidance)113114### For Agents115116Ask (adapt based on what's already known):1171. What role does this agent fill? What task does it handle?1182. What tools does it need? (Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task -- or all)1193. Which plugin should it live in?1204. What color fits its domain? See [references/conventions.md](references/conventions.md) for the palette and semantic guidance.121122### For Commands123124Ask (adapt based on what's already known):1251. What does this command do when invoked?1262. What arguments does it expect?1273. Which plugin should it live in?128129### For Full Plugins130131Ask (adapt based on what's already known):1321. What's the plugin's domain/purpose?1332. What components does it need? (agents, skills, commands)1343. What category? See [references/conventions.md](references/conventions.md) for valid categories.135136**Do not ask more than 3-4 questions per message.** Start with the most important, follow up as needed.137138## Phase 2: Content Generation139140Generate production-ready files with real content -- not [FILL] placeholders.141142### Skill Creation1431441. Create directory: `plugins/<plugin>/skills/<skill-name>/`1452. Write `SKILL.md` following these rules:146 - Frontmatter: `name` (kebab-case, max 64 chars) and `description` (max 1024 chars)147 - **Description format** -- MUST follow the high-activation template:148 - Directive voice: "ALWAYS invoke this skill when..."149 - Negative constraint: "Do not X directly"150 - Always include a `TRIGGER WHEN:` line; add `DO NOT TRIGGER WHEN:` only when it names a sibling151 - Third person, specific trigger phrases152 - See "Description Engineering" section above153 - Optional frontmatter: `context: fork` (isolates in subagent), `allowed-tools` (restricts tool access), `disable-model-invocation: true` (prevents auto-triggering)154 - Body: under 500 lines, imperative tone, concise155 - Only add context Claude doesn't already have -- don't repeat what Claude already knows156 - Progressive disclosure: split into references/ if body exceeds ~300 lines157 - Can use `!command` syntax for dynamic context injection (shell commands that execute before content reaches Claude)1583. Create `references/`, `scripts/`, `assets/` subdirs only if needed1594. Write any bundled resources160161### Agent Creation1621631. Create file: `plugins/<plugin>/agents/<agent-name>.md`1642. Write with frontmatter and body following these rules:165 - Frontmatter fields: `name`, `description` (use YAML `>` for multiline), `model: inherit`, `color`, optionally `tools`166 - **Description format** -- same directive template as skills:167 - Always include a `TRIGGER WHEN:` line; add `DO NOT TRIGGER WHEN:` only when it names a sibling168 - Third person, specific triggers169 - Example: `"Does X. TRIGGER WHEN: user needs Y. DO NOT TRIGGER WHEN: the work is Z (use sibling-agent instead)."`170 - Body: terse keyword-list style, imperative tone, structured with markdown headers171 - Sections: `# ROLE`, `# CAPABILITIES` or `# CORE CAPABILITIES`, `# CONVENTIONS`, `# OUTPUT FORMAT`172 - Simple agents: 60-200 lines; complex agents: up to 800 lines173 - See [references/conventions.md](references/conventions.md) for color palette and style patterns174175### Command Creation1761771. Create file: `plugins/<plugin>/commands/<command-name>.md`1782. Write with frontmatter: `description`, `argument-hint`1793. Body: step-by-step procedure, clear and actionable180181## Phase 3: Marketplace Registration182183After files are created:1841851. **Read** `.claude-plugin/marketplace.json`1862. **Add paths** to the plugin's `agents`, `skills`, or `commands` arrays187 - Agents: `"./agents/<name>.md"`188 - Skills: `"./skills/<name>"`189 - Commands: `"./commands/<name>.md"`1903. **If new plugin**: add full entry to `plugins[]` with all required fields (name, source, description, version 1.0.0, author, license, keywords, category, strict)1914. **Bump plugin version** (patch for new component in existing plugin)1925. **Bump metadata.version** (patch increment)193194## Phase 4: Validation195196After registration:1971981. Verify the file exists at the registered path1992. Verify frontmatter parses correctly2003. Verify naming conventions (kebab-case, filename matches name field)2014. Verify no em dash characters anywhere2025. Report what was created with file paths203204## Anti-patterns205206| Scenario | Wrong | Right |207|----------|-------|-------|208| Writing descriptions | Passive: "Helps with Docker" (50% activation) | Directive: "ALWAYS invoke when user asks about Docker. Do not run Docker commands directly." (97%+ activation) |209| Description tone | "Can be used for...", "Use when..." | "ALWAYS invoke this skill when...", "Do not X directly" |210| Missing exclusions | Confusable sibling exists but no DO NOT TRIGGER WHEN clause names it | Name the component that should handle the case instead |211| Empty exclusions | "DO NOT TRIGGER WHEN: the task is outside the specific scope of this component" | Omit the clause when there is no sibling to name |212| Writing agent prompts | Verbose prose paragraphs | Terse keyword-list style |213| Skill body length | 800+ lines in SKILL.md | Split into references/ at ~300 lines |214| Skill body content | Repeating what Claude already knows | Only add context Claude lacks; trust built-in knowledge |215| Creating resources | Empty placeholder dirs | Only create dirs that have files |216| Choosing a plugin | Always create a new one | Prefer adding to existing plugin if domain fits |217| Agent description | First/second person | Third person: "Processes X when Y" |218| Token budget | Long verbose descriptions on all components | Keep descriptions under 300 chars when possible; total budget is 15k chars |219| Description content | Enumerating features the body already documents | List trigger vocabulary only; the body loads at invocation, the description is paid every session |220221## Critical Rules222223- All names: kebab-case224- Never use em dash -- use hyphen `-` or double hyphen `--`225- Default model for agents: `inherit` (agents follow the session model)226- Agent filename must match frontmatter `name` field227- Skill directory name must match frontmatter `name` field228- Always bump both plugin version AND metadata.version229- Stage marketplace.json with component files in same commit230- Write real content, never placeholder text