name: 插件结构 description: 当用户询问“创建插件”、“脚手架插件”、“理解插件结构”、“组织插件组件”、“设置plugin.json”、“使用${CLAUDE_PLUGIN_ROOT}”、“添加命令/代理/技能/钩子”、“配置自动发现”,或需要关于插件目录布局、清单配置、组件组织、文件命名约定或Claude Code插件架构最佳实践的指导时,应使用此技能。 version: 0.1.0
Claude Code插件结构
概述
Claude Code插件遵循标准化的目录结构,具有自动组件发现功能。理解此结构有助于创建组织良好、可维护的插件,这些插件可以无缝集成到Claude Code中。
关键概念:
- 用于自动发现的常规目录布局
- 在
.claude-plugin/plugin.json中的清单驱动配置 - 基于组件的组织(命令、代理、技能、钩子)
- 使用
${CLAUDE_PLUGIN_ROOT}的可移植路径引用 - 显式与自动发现的组件加载
目录结构
每个Claude Code插件都遵循这种组织模式:
插件名称/
├── .claude-plugin/
│ └── plugin.json # 必需:插件清单
├── commands/ # 斜杠命令(.md文件)
├── agents/ # 子代理定义(.md文件)
├── skills/ # 代理技能(子目录)
│ └── 技能名称/
│ └── SKILL.md # 每个技能必需
├── hooks/
│ └── hooks.json # 事件处理器配置
├── .mcp.json # MCP服务器定义
└── scripts/ # 辅助脚本和实用工具
关键规则:
- 清单位置:
plugin.json清单必须在.claude-plugin/目录中 - 组件位置:所有组件目录(commands、agents、skills、hooks)必须在插件根级别,不要嵌套在
.claude-plugin/内 - 可选组件:仅创建插件实际使用的组件目录
- 命名约定:对所有目录和文件名使用短横线命名法(kebab-case)
插件清单(plugin.json)
清单定义插件元数据和配置。位于.claude-plugin/plugin.json:
必需字段
{
"name": "插件名称"
}
名称要求:
- 使用短横线命名法格式(小写加连字符)
- 必须在已安装插件中唯一
- 无空格或特殊字符
- 示例:
code-review-assistant、test-runner、api-docs
推荐元数据
{
"name": "插件名称",
"version": "1.0.0",
"description": "插件目的的简要说明",
"author": {
"name": "作者姓名",
"email": "author@example.com",
"url": "https://example.com"
},
"homepage": "https://docs.example.com",
"repository": "https://github.com/user/插件名称",
"license": "MIT",
"keywords": ["testing", "automation", "ci-cd"]
}
版本格式:遵循语义版本控制(MAJOR.MINOR.PATCH) 关键词:用于插件发现和分类
组件路径配置
指定组件的自定义路径(补充默认目录):
{
"name": "插件名称",
"commands": "./custom-commands",
"agents": ["./agents", "./specialized-agents"],
"hooks": "./config/hooks.json",
"mcpServers": "./.mcp.json"
}
重要:自定义路径补充默认值——它们不会替换默认值。默认目录和自定义路径中的组件都会加载。
路径规则:
- 必须相对于插件根目录
- 必须以
./开头 - 不能使用绝对路径
- 支持多个位置的数组
组件组织
命令
位置:commands/目录
格式:带有YAML前置元数据的Markdown文件
自动发现:commands/中的所有.md文件自动加载
示例结构:
commands/
├── review.md # /review命令
├── test.md # /test命令
└── deploy.md # /deploy命令
文件格式:
---
name: 命令名称
description: 命令描述
---
命令实现指令...
用法:命令作为原生斜杠命令集成到Claude Code中
代理
位置:agents/目录
格式:带有YAML前置元数据的Markdown文件
自动发现:agents/中的所有.md文件自动加载
示例结构:
agents/
├── code-reviewer.md
├── test-generator.md
└── refactorer.md
文件格式:
---
description: 代理角色和专业能力
capabilities:
- 特定任务1
- 特定任务2
---
详细的代理指令和知识...
用法:用户可以手动调用代理,或Claude Code基于任务上下文自动选择它们
技能
位置:skills/目录,每个技能有自己的子目录
格式:每个技能在自有目录中有SKILL.md文件
自动发现:技能子目录中的所有SKILL.md文件自动加载
示例结构:
skills/
├── api-testing/
│ ├── SKILL.md
│ ├── scripts/
│ │ └── test-runner.py
│ └── references/
│ └── api-spec.md
└── database-migrations/
├── SKILL.md
└── examples/
└── migration-template.sql
SKILL.md格式:
---
name: 技能名称
description: 何时使用此技能
version: 1.0.0
---
技能指令和指南...
支持文件:技能可以包括子目录中的脚本、参考资料、示例或资源
用法:Claude Code基于任务上下文匹配描述自动激活技能
钩子
位置:hooks/hooks.json或内联在plugin.json中
格式:定义事件处理器的JSON配置
注册:插件启用时钩子自动注册
示例结构:
hooks/
├── hooks.json # 钩子配置
└── scripts/
├── validate.sh # 钩子脚本
└── check-style.sh # 钩子脚本
配置格式:
{
"PreToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate.sh",
"timeout": 30
}]
}]
}
可用事件:PreToolUse、PostToolUse、Stop、SubagentStop、SessionStart、SessionEnd、UserPromptSubmit、PreCompact、Notification
用法:钩子响应Claude Code事件自动执行
MCP服务器
位置:插件根目录的.mcp.json或内联在plugin.json中
格式:MCP服务器定义的JSON配置
自动启动:插件启用时服务器自动启动
示例格式:
{
"mcpServers": {
"server-name": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/servers/server.js"],
"env": {
"API_KEY": "${API_KEY}"
}
}
}
}
用法:MCP服务器无缝集成到Claude Code的工具系统中
可移植路径引用
${CLAUDE_PLUGIN_ROOT}
对所有插件内路径引用使用${CLAUDE_PLUGIN_ROOT}环境变量:
{
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh"
}
为什么重要:插件安装位置取决于多种因素,如用户安装方法(市场、本地、npm)、操作系统约定或用户偏好。
使用场景:
- 钩子命令路径
- MCP服务器命令参数
- 脚本执行引用
- 资源文件路径
切勿使用:
- 硬编码的绝对路径(如
/Users/name/plugins/...) - 来自工作目录的相对路径(如命令中的
./scripts/...) - 家目录快捷方式(如
~/plugins/...)
路径解析规则
在清单JSON字段中(钩子、MCP服务器):
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/tool.sh"
在组件文件中(命令、代理、技能):
在以下位置引用脚本:${CLAUDE_PLUGIN_ROOT}/scripts/helper.py
在执行的脚本中:
#!/bin/bash
# ${CLAUDE_PLUGIN_ROOT} 作为环境变量可用
source "${CLAUDE_PLUGIN_ROOT}/lib/common.sh"
文件命名约定
组件文件
命令:使用短横线命名法.md文件
code-review.md→/code-reviewrun-tests.md→/run-testsapi-docs.md→/api-docs
代理:使用短横线命名法.md文件描述角色
test-generator.mdcode-reviewer.mdperformance-analyzer.md
技能:使用短横线命名法目录名
api-testing/database-migrations/error-handling/
支持文件
脚本:使用描述性短横线命名法名称和适当扩展名
validate-input.shgenerate-report.pyprocess-data.js
文档:使用短横线命名法Markdown文件
api-reference.mdmigration-guide.mdbest-practices.md
配置:使用标准名称
hooks.json.mcp.jsonplugin.json
自动发现机制
Claude Code自动发现和加载组件:
- 插件清单:插件启用时读取
.claude-plugin/plugin.json - 命令:扫描
commands/目录中的.md文件 - 代理:扫描
agents/目录中的.md文件 - 技能:扫描
skills/中是否包含SKILL.md的子目录 - 钩子:从
hooks/hooks.json或清单中加载配置 - MCP服务器:从
.mcp.json或清单中加载配置
发现时机:
- 插件安装:组件注册到Claude Code
- 插件启用:组件可供使用
- 无需重启:更改在下一次Claude Code会话时生效
覆盖行为:plugin.json中的自定义路径补充(而非替换)默认目录
最佳实践
组织
-
逻辑分组:将相关组件分组在一起
- 将与测试相关的命令、代理和技能放在一起
- 在
scripts/中为不同目的创建子目录
-
最小化清单:保持
plugin.json简洁- 仅在必要时指定自定义路径
- 对标准布局依赖自动发现
- 仅对简单情况使用内联配置
-
文档:包括README文件
- 插件根目录:总体目的和用法
- 组件目录:具体指南
- 脚本目录:用法和要求
命名
-
一致性:跨组件使用一致的命名
- 如果命令是
test-runner,将相关代理命名为test-runner-agent - 匹配技能目录名与其目的
- 如果命令是
-
清晰性:使用指示目的的描述性名称
- 好:
api-integration-testing/、code-quality-checker.md - 避免:
utils/、misc.md、temp.sh
- 好:
-
长度:在简洁和清晰之间取得平衡
- 命令:2-3个词(如
review-pr、run-ci) - 代理:清晰描述角色(如
code-reviewer、test-generator) - 技能:主题聚焦(如
error-handling、api-design)
- 命令:2-3个词(如
可移植性
- 始终使用${CLAUDE_PLUGIN_ROOT}:切勿硬编码路径
- 在多个系统上测试:在macOS、Linux、Windows上验证
- 记录依赖:列出所需工具和版本
- 避免系统特定功能:使用可移植的bash/Python构造
维护
- 版本一致性:在plugin.json中更新版本以发布
- 优雅弃用:在移除前明确标记旧组件
- 记录破坏性更改:注意影响现有用户的更改
- 彻底测试:验证更改后所有组件都正常工作
常见模式
最小化插件
单一命令,无依赖:
我的插件/
├── .claude-plugin/
│ └── plugin.json # 仅名称字段
└── commands/
└── hello.md # 单一命令
全功能插件
包含所有组件类型的完整插件:
我的插件/
├── .claude-plugin/
│ └── plugin.json
├── commands/ # 面向用户的命令
├── agents/ # 专业子代理
├── skills/ # 自动激活技能
├── hooks/ # 事件处理器
│ ├── hooks.json
│ └── scripts/
├── .mcp.json # 外部集成
└── scripts/ # 共享实用工具
技能聚焦插件
仅提供技能的插件:
我的插件/
├── .claude-plugin/
│ └── plugin.json
└── skills/
├── 技能一/
│ └── SKILL.md
└── 技能二/
└── SKILL.md
故障排除
组件未加载:
- 验证文件是否在正确目录中并具有正确扩展名
- 检查YAML前置元数据语法(命令、代理、技能)
- 确保技能有
SKILL.md(而非README.md或其他名称) - 确认插件已在Claude Code设置中启用
路径解析错误:
- 将所有硬编码路径替换为
${CLAUDE_PLUGIN_ROOT} - 验证清单中的路径是否相对并以
./开头 - 检查引用文件是否存在于指定路径
- 在钩子脚本中使用
echo $CLAUDE_PLUGIN_ROOT测试
自动发现不工作:
- 确认目录在插件根目录(而非
.claude-plugin/内) - 检查文件命名是否遵循约定(短横线命名法、正确扩展名)
- 验证清单中的自定义路径是否正确
- 重启Claude Code以重新加载插件配置
插件间冲突:
- 使用独特、描述性的组件名称
- 如果需要,使用插件名称命名空间命令
- 在插件README中记录潜在冲突
- 考虑相关功能的命令前缀
有关详细示例和高级模式,请参阅references/和examples/目录中的文件。