Help us improve
Share bugs, ideas, or general feedback.
From tsal
Provides quick reference for Claude Code plugins: structure, manifest, installation commands, marketplaces, management UI, and standalone vs plugins comparison.
npx claudepluginhub bfollington/terma --plugin tsalHow this skill is triggered — by the user, by Claude, or both
Slash command
/tsal:claude-pluginsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Full docs:
Develops Claude Code plugins through planning, structure setup, component addition (skills, commands, hooks, MCP), dev marketplace testing, release workflows, with patterns and examples.
Guides developers on Claude Code plugin development, covering architecture, components, and routing to 9 specialized skills for tasks like structure, commands, agents, and LSP integration.
Creates, converts, validates, and publishes Claude Code plugins with Agent Skills, hooks, agents, and servers. Automates manifest generation, scanning, structure validation, and marketplace prep.
Share bugs, ideas, or general feedback.
Full docs:
| Approach | Skill names | Best for |
|---|---|---|
Standalone (.claude/) | /hello | Personal workflows, project-specific, quick experiments |
Plugins (.claude-plugin/plugin.json) | /plugin-name:hello | Sharing with teams, community distribution, versioned releases |
my-plugin/
├── .claude-plugin/
│ └── plugin.json # Required manifest
├── commands/ # Slash commands (Markdown files)
├── skills/ # Agent skills (SKILL.md files)
├── agents/ # Custom agent definitions
├── hooks/
│ └── hooks.json # Event handlers
├── .mcp.json # MCP server configs
└── .lsp.json # LSP server configs
Common mistake: Don't put commands/, skills/, etc. inside .claude-plugin/. Only plugin.json goes there.
{
"name": "my-plugin",
"description": "What the plugin does",
"version": "1.0.0",
"author": {
"name": "Your Name"
},
"homepage": "https://github.com/you/my-plugin",
"repository": "https://github.com/you/my-plugin",
"license": "MIT"
}
The name field becomes the skill namespace prefix (e.g., /my-plugin:hello).
# Add marketplaces
/plugin marketplace add owner/repo # GitHub
/plugin marketplace add https://gitlab.com/org/repo.git # Other Git
/plugin marketplace add ./local-path # Local directory
/plugin marketplace add https://example.com/marketplace.json # URL
# Add specific branch/tag
/plugin marketplace add owner/repo#v1.0.0
# List, update, remove
/plugin marketplace list
/plugin marketplace update marketplace-name
/plugin marketplace remove marketplace-name
Shortcuts: /plugin market works, rm instead of remove
# Install (defaults to user scope)
/plugin install plugin-name@marketplace-name
# Install with specific scope
claude plugin install plugin-name@marketplace-name --scope project
claude plugin install plugin-name@marketplace-name --scope local
# Enable/disable without uninstalling
/plugin disable plugin-name@marketplace-name
/plugin enable plugin-name@marketplace-name
# Uninstall
/plugin uninstall plugin-name@marketplace-name
/plugin # Opens plugin manager with tabs:
# - Discover: browse available plugins
# - Installed: manage your plugins
# - Marketplaces: add/remove marketplaces
# - Errors: view loading errors
Navigate tabs with Tab / Shift+Tab
| Scope | Who sees it | Stored in |
|---|---|---|
| User | You, all projects | ~/.claude/settings.json |
| Project | All collaborators | .claude/settings.json |
| Local | You, this repo only | .claude/settings.local.json |
| Managed | All org users | Admin-controlled |
# Load plugin from local directory
claude --plugin-dir ./my-plugin
# Load multiple plugins
claude --plugin-dir ./plugin-one --plugin-dir ./plugin-two
Restart Claude Code after making changes.
| Language | Plugin | Binary required |
|---|---|---|
| TypeScript | typescript-lsp | typescript-language-server |
| Python | pyright-lsp | pyright-langserver |
| Rust | rust-analyzer-lsp | rust-analyzer |
| Go | gopls-lsp | gopls |
| C/C++ | clangd-lsp | clangd |
Install: /plugin install typescript-lsp@claude-plugins-official
github, gitlab, atlassian, asana, linear, notion, figma, vercel, firebase, supabase, slack, sentry
commit-commands, pr-review-toolkit, agent-sdk-dev, plugin-dev
Create skills/my-skill/SKILL.md:
---
name: my-skill
description: What the skill does. Use when [context].
---
Instructions for Claude when this skill is invoked...
Create commands/hello.md:
---
description: Greet the user
disable-model-invocation: true
---
Greet the user named "$ARGUMENTS" warmly.
Use as: /my-plugin:hello Alex
Create hooks/hooks.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npm run lint:fix"
}]
}
]
}
}
Create .lsp.json at plugin root:
{
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}
/plugin > Marketplacesexport DISABLE_AUTOUPDATER=trueDISABLE_AUTOUPDATER=true FORCE_AUTOUPDATE_PLUGINS=trueAdd to .claude/settings.json for automatic marketplace prompts:
{
"extraKnownMarketplaces": ["your-org/team-plugins"],
"enabledPlugins": ["plugin-name@your-org-team-plugins"]
}
/plugin not recognized: Requires Claude Code 1.0.33+. Run claude --versionrm -rf ~/.claude/plugins/cache, restart, reinstall/plugin Errors tab, install required binary.claude-plugin/marketplace.json exists at pathmy-plugin/.claude-plugin/plugin.json.claude/commands to my-plugin/commands/.claude/skills to my-plugin/skills/settings.json to my-plugin/hooks/hooks.jsonclaude --plugin-dir ./my-plugin