Guide for creating effective fx/cc marketplace plugins.
This skill provides guidance for creating high-quality plugins for the fx/cc Claude Code marketplace.
Plugins are structured packages that extend Claude Code's capabilities by bundling related components:
All plugin development work defaults to: ~/.claude/plugins/marketplaces/fx-cc/
This is the local clone of the fx/cc marketplace repository where all plugins reside.
To create an effective plugin, gather concrete examples of how it will be used:
Example questions to ask:
Example for fx-git plugin:
Conclude when there's a clear understanding of:
Analyze examples to determine:
Follow fx/cc naming conventions (see references/fx-cc-guidelines.md):
fx- prefixfx-git, fx-aws, fx-docsDecide whether to:
Skills - When to include:
Agents - When to include:
Commands - When to include:
Hooks - When to include:
Navigate to the fx/cc marketplace and create plugin directory:
cd ~/.claude/plugins/marketplaces/fx-cc/plugins
# Create plugin directory structure
mkdir -p fx-plugin-name/.claude-plugin
# Create plugin.json manifest
cat > fx-plugin-name/.claude-plugin/plugin.json <<'EOF'
{
"name": "fx-plugin-name",
"version": "0.1.0",
"description": "Clear description of what this plugin does"
}
EOF
# Create component directories as needed
cd fx-plugin-name
mkdir -p skills agents commands hooks
Directory structure:
~/.claude/plugins/marketplaces/fx-cc/plugins/fx-plugin-name/
├── .claude-plugin/
│ └── plugin.json
├── skills/ (if needed)
├── agents/ (if needed)
├── commands/ (if needed)
├── hooks/ (if needed)
└── README.md
Create skill directories with SKILL.md:
mkdir -p skills/skill-name
cat > skills/skill-name/SKILL.md <<'EOF'
---
name: skill-name
description: When this skill should be used (third-person, specific)
---
# Skill Name
Instructions using imperative/infinitive form.
## Usage
How to use this skill and reference bundled resources.
EOF
See skill-creator skill for detailed skill development guidance.
Create agent markdown files:
cat > agents/agent-name.md <<'EOF'
---
name: agent-name
description: What this agent does and when to use it
model: sonnet # Optional: sonnet (default), opus, haiku
---
Agent instructions and behavior.
Usage examples showing when to invoke this agent.
EOF
Agent reference pattern: @agent-fx-plugin-name:agent-name
Create command files (markdown or shell):
# Markdown command
cat > commands/command-name.md <<'EOF'
---
name: command-name
description: What this command does
---
Command implementation and documentation.
EOF
# Or shell script
cat > commands/command-name.sh <<'EOF'
#!/bin/bash
# Command implementation
EOF
chmod +x commands/command-name.sh
Create hooks configuration:
cat > hooks/hooks.json <<'EOF'
{
"PreToolUse": {
"command": "bash -c 'echo \"Pre-tool hook\"'",
"timeout": 5000
}
}
EOF
Create comprehensive README.md:
# Plugin Name
Brief description of plugin purpose.
## Installation
\`/plugin install fx-plugin-name\`
## Components
### Skills (if applicable)
- **skill-name** - Auto-invoked when [trigger condition]
### Agents (if applicable)
- **agent-name** - Use via \`@agent-fx-plugin-name:agent-name\` for [purpose]
### Commands (if applicable)
- \`/command-name\` - [What it does]
## Usage Examples
[Concrete examples of using each component]
## Configuration
[Any settings or environment variables]
## Contributing
[Development and testing instructions]
Update ~/.claude/plugins/marketplaces/fx-cc/.claude-plugin/marketplace.json:
cd ~/.claude/plugins/marketplaces/fx-cc
# Edit marketplace.json to add new plugin entry
# Add to "plugins" array:
{
"name": "fx-plugin-name",
"source": "./plugins/fx-plugin-name"
}
Example using jq:
jq '.plugins += [{"name": "fx-plugin-name", "source": "./plugins/fx-plugin-name"}]' \
.claude-plugin/marketplace.json > /tmp/marketplace.json && \
mv /tmp/marketplace.json .claude-plugin/marketplace.json
Validate structure:
cd ~/.claude/plugins/marketplaces/fx-cc/plugins/fx-plugin-name
# Validate JSON
jq empty .claude-plugin/plugin.json
# Check frontmatter in components
grep -r "^---$" skills/ agents/ commands/ || echo "No frontmatter found"
Test functionality:
/agents list and invoke via Task toolGit workflow:
cd ~/.claude/plugins/marketplaces/fx-cc
# Create feature branch
git checkout -b feat/fx-plugin-name
# Stage changes
git add plugins/fx-plugin-name .claude-plugin/marketplace.json
# Commit with semantic message
git commit -m "feat(fx-plugin-name): add plugin for [purpose]"
# Push for review
git push -u origin feat/fx-plugin-name
After testing:
Pattern: fx-{domain}
Pattern: fx-{utility-type}
Pattern: fx-{meta-purpose}
Critical: All operations default to ~/.claude/plugins/marketplaces/fx-cc/
When creating, editing, or managing plugins, always work from this directory unless explicitly specified otherwise.