第 9 章 / 共 10 章
打包成插件,一键分发给团队
9.1 从 .claude/ 散件到一个插件
现在你的资产是散的:技能在 ~/.claude/skills/,子代理在 .claude/agents/,钩子在 .claude/settings.json。它们能用,但没法整体分发——同事得一样样复制。
插件解决的就是打包分发:把这些东西装进一个自带清单的目录,别人一条命令就能装上,还能版本化更新。
9.2 plugin.json 与目录结构
插件是一个目录,根上放一个清单 .claude-plugin/plugin.json:
{
"name": "release-kit",
"description": "团队发布流程工具包:发布说明技能、发布调查子代理、格式化与守门钩子。",
"version": "1.0.0",
"author": { "name": "你的团队" }
}
name 是插件的唯一标识,也是它所有技能的命名空间前缀——release-notes 装进来后会变成 /release-kit:release-notes。version 决定别人什么时候收到更新:你不 bump 它,用户就不会被动更新。
目录结构有一条最容易踩的规矩:只有 plugin.json 放进 .claude-plugin/,其余全部放在插件根目录:
release-kit/
├── .claude-plugin/
│ └── plugin.json # 只有它在这里面
├── skills/
│ └── release-notes/
│ ├── SKILL.md
│ └── template.md
├── agents/
│ └── release-scanner.md
└── hooks/
└── hooks.json

skills/、agents/、hooks/ 都在插件根,不在 .claude-plugin/ 里面。.claude-plugin/ 只住一个 plugin.json。把目录塞错位置,是插件不生效最常见的原因。9.3 钩子进 hooks.json
技能和子代理几乎是原样搬进 skills/ 和 agents/。唯一要改形态的是钩子:它从 settings.json 的 hooks 对象,搬进插件的 hooks/hooks.json。格式完全一样,把那个 hooks 对象整块拷过去即可:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs -r npx prettier --write" }
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/guard-push.sh" }
]
}
]
}
}
插件里引用自己的文件,用 ${CLAUDE_PLUGIN_ROOT}(插件安装目录),而不是 ${CLAUDE_PROJECT_DIR}——因为脚本现在随插件走,不随项目走。把 guard-push.sh 放进插件的 hooks/ 目录一并带上。
9.4 本地测试与通过市场分发
打包完先本地测。--plugin-dir 直接加载一个插件目录,不用真的安装:
claude --plugin-dir ./release-kit
启动后逐件验收:/release-kit:release-notes 能调用吗?/context 里能看到 release-scanner 吗?改个文件,格式化钩子触发了吗?让它试 git push --force,守门拦住了吗?开发中改了插件,用 /reload-plugins 热更新,不必重启。
验收通过后,分发有两条路:
- 团队内部:把插件放进一个 git 仓库,在里面加一个
.claude-plugin/marketplace.json描述这个市场,同事用/plugin marketplace add <你的仓库>添加、再/plugin install release-kit安装。私有仓库即可,不必公开。 - 社区:提交到公共市场需要走审核,本篇不展开。