smithery.ai

plugin-development

Use when creating or modifying Han plugins. Covers plugin structure, configuration, hooks, skills, and best practices.

First seen Mar 25, 2026

Installation

$ npx skills add https://smithery.ai

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery.ai · top by installs.

npx skills add https://smithery.ai

Browse all from smithery.ai

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Skill metadata

Parsed from SKILL.md frontmatter.

Allowed toolsRead, Write, Edit, Bash, Glob, Grep
Declared agents claude-code

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 4,865 B
  • docs SUMMARY.md 144 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 2 installs

SKILL.md

Han Plugin Development

This skill provides comprehensive guidance for developing Han plugins.

Plugin Types

Han supports several plugin categories:

  1. Language/Validation - Skills and validation hooks for languages/tools
  2. Discipline - Specialized agents for specific domains
  3. Service/Tool - MCP servers for external integrations

Directory Structure

Every plugin must follow this structure:

my-plugin/
├── .claude-plugin/
│   └── plugin.json      # Plugin metadata (required)
├── han-plugin.yml       # Hook configuration (optional)
├── skills/              # Skills directory (optional)
│   └── my-skill/
│       └── SKILL.md     # Skill definition
├── commands/            # Commands directory (optional)
│   └── my-command.md    # Slash command
├── hooks/               # Hook scripts (optional)
│   └── my-hook.sh       # Hook implementation
└── README.md            # Documentation

plugin.json (Required)

The plugin.json file defines metadata:

{
  "name": "my-plugin-name",
  "version": "1.0.0",
  "description": "What the plugin does",
  "author": {
    "name": "Author Name",
    "url": "https://author-website.com"
  },
  "license": "MIT",
  "keywords": ["keyword1", "keyword2"]
}

Required fields:

  • name - Must match directory name
  • version - Semantic versioning

han-plugin.yml (Hooks)

Define validation hooks that run at lifecycle events:

hooks:
  my-validation:
    event: Stop                    # When to run
    command: bash "hooks/my-hook.sh"
    description: What this hook does

    # Optional filters:
    if_changed:                    # Only run if these files changed
      - "**/*.ts"
    dirs_with:                     # Only run in dirs containing
      - "package.json"

Hook Events

  • Setup - Plugin installation
  • SessionStart - Session begins
  • UserPromptSubmit - User sends message
  • PreToolUse - Before tool execution
  • PostToolUse - After tool execution
  • Stop - Work completion (validation)
  • SubagentStop - Subagent completion

Hook Environment Variables

Scripts receive:

  • CLAUDEPLUGINROOT - Plugin directory path
  • HANSESSIONID - Current session ID
  • HANPROJECTDIR - Project directory
  • HAN_FILES - Changed files (space-separated)

Skills (SKILL.md)

Skills provide domain expertise:

---
name: skill-name
description: When to use this skill
allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
---

# Skill Title

Skill content with guidance, examples, and best practices.

Required frontmatter:

  • name - Skill identifier
  • description - When Claude should use this skill

Commands (Slash Commands)

Commands provide slash command functionality:

---
description: What the command does
---

Command implementation content...

Invoke with: /plugin-name:command-name

Validation

Before publishing, validate your plugin:

cd my-plugin
han plugin validate

This checks:

  • Required files exist
  • JSON/YAML syntax is valid
  • Frontmatter is correct
  • No misplaced files

Best Practices

Hook Scripts

  1. Use set -e - Exit on first error
  2. Quote variables - "${HANFILES}" not $HANFILES
  3. Clear error messages - Write to stderr on failure
  4. Exit codes - 0 for success, non-zero for failure

Skills

  1. Specific descriptions - Help Claude know when to use
  2. Practical examples - Show real usage patterns
  3. Progressive detail - Start simple, add complexity
  4. Troubleshooting - Include common issues

General

  1. Follow naming conventions - short names matching directory
  2. Include README - Installation and usage docs
  3. Version properly - Use semantic versioning
  4. Test locally - Install via path before publishing

Local Installation

Test your plugin locally:

# Install from local path
han plugin install /path/to/my-plugin --scope project

# Or add to .claude/settings.json manually

Publishing

Share your plugin:

  1. Push to a git repository
  2. Add to the Han marketplace (optional)
  3. Users install via: han plugin install github:user/repo

Troubleshooting

Hook Not Running

  • Check event matches lifecycle point
  • Verify command path is correct
  • Check ifchanged/dirswith filters

Validation Fails

  • Run han plugin validate for specific errors
  • Check plugin.json syntax
  • Verify skill frontmatter

Skill Not Found

  • Check SKILL.md path and naming
  • Verify frontmatter has required fields
  • Skill name should match directory name