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 tsalThis skill uses the workspace's default tool permissions.
Full docs:
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
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