
1. 为什么你的 Claude Code 需要 Plugins 扩展Claude Code 自带文件读写、代码搜索、终端执行这些基础工具日常写业务代码基本够用。但一旦碰到团队特有的流程比如“提交前必须跑一遍 lint 和单测”“生成 PR 描述要按固定模板”“查内部 API 文档得走特定脚本”你会发现它的默认工具箱里没有这些能力。这不是缺陷而是通用工具的边界——它不可能预置每个团队的工作流。我试过把这些规则写进CLAUDE.md但问题是每个项目都要复制一份改一处就得同步所有仓库而且CLAUDE.md是全局上下文塞太多流程说明会稀释模型对当前任务的注意力。后来我把目光转向 Claude Code 的 Plugins 机制它本质是一个自包含目录把 skills、agents、hooks 打包成可安装、可版本化、可跨项目复用的单元。你可以把它理解成“给 Claude Code 装的一个能力包”装一次所有项目都能用改一次团队所有人同步生效。这篇文章面向已经用过 Claude Code、想进一步扩展它工具生态的开发者。我会从零搭一个可复用的插件目录围绕 skills按需调用的指令工作流、agents隔离上下文的子代理、hooks生命周期事件触发的脚本三类扩展点给出可复制的配置片段和本地加载验证步骤。全程不需要你改 Claude Code 源码也不需要理解它内部推理引擎只要会写 Markdown 和 JSON 就能跟做。先明确一个边界Plugins 不是新模型不是 Claude Code 的替代品也不是独立框架。它更像 IDE 的插件系统——把多个扩展组件组织好方便携带和分享。下面所有操作都在本地目录完成不涉及任何网络代理配置。2. TaoToken 前置准备拿到可用的 API Key 与 Base URL在动手写插件之前得先保证 Claude Code 能正常跑起来。如果你已经能稳定使用 Claude Code可以跳过这一节如果还没配好或者想换一个更省心的接入方式可以走 TaoToken 这条路径。它的作用是提供一个兼容 Anthropic 接口规范的 API 入口你拿到 Key 和 Base URL 后填进 Claude Code 配置即可。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号。注册流程很常规邮箱加密码收一封验证邮件就完事。登录后进入控制台找到 API Keys 页面点“创建新密钥”。这里有个细节创建时会给密钥起个名字建议按用途命名比如claude-code-local方便以后区分。创建完立刻复制保存页面刷新后完整密钥就不再显示了。第二步确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api 注意这个地址后面不加任何 UTM 参数直接填进配置即可。它兼容 Anthropic 的 Messages API 格式所以 Claude Code 能直接识别。第三步选模型 ID。在控制台的模型列表里能看到当前可用的模型标识比如claude-sonnet-4-20250514这类。把你要用的模型 ID 记下来后面写进配置。如果你不确定选哪个先用默认的 Sonnet 系列它在编码任务上响应速度和质量的平衡比较好。第四步把这三样东西填进 Claude Code 的配置。Claude Code 读取配置的位置通常在用户目录下的.claude/settings.json或者项目根目录的.claude/settings.json。如果你用的是环境变量方式也可以设置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。我建议用 settings.json因为插件配置也在这个文件体系里集中管理更清晰。这里要提醒一点API Key 属于敏感凭证不要提交到 Git 仓库。如果你在团队里共享插件插件目录本身不包含 KeyKey 是每个开发者本地配置的。插件只负责定义 skills、agents、hooks 的逻辑不负责凭证管理。这个边界要分清楚否则容易出安全问题。拿到 Key 之后先别急着写插件用一条最简单的请求验证一下通路。你可以用 curl 发一个 Messages API 请求确认返回正常。如果这一步就报 401说明 Key 或 Base URL 有问题先解决这个再往下走。验证命令我会在第四节给出这里先把前置条件说清楚一个可用的 Key、一个正确的 Base URL、一个确定的模型 ID三件套齐了再进入插件搭建。3. 从零搭建插件目录skills、agents、hooks 三件套配置现在进入核心部分。我会搭一个叫team-workflow的插件包含一个 skill代码审查流程、一个 agent文档生成子代理、一个 hook文件修改后自动跑格式化。目录结构如下team-workflow/ ├── .claude-plugin/ │ └── plugin.json ├── skills/ │ └── review/ │ └── SKILL.md ├── agents/ │ └── doc-writer.md └── hooks/ └── hooks.json先创建目录mkdir -p team-workflow/.claude-plugin mkdir -p team-workflow/skills/review mkdir -p team-workflow/agents mkdir -p team-workflow/hooks cd team-workflow3.1 插件清单 plugin.json这是插件的入口文件Claude Code 靠它识别插件名称、版本和组件。路径必须是.claude-plugin/plugin.json文件名和位置都不能改。{ name: team-workflow, description: 团队代码审查、文档生成与格式化钩子, version: 1.0.0, author: { name: Your Team } }name字段会作为命名空间前缀比如调用 skill 时写成/team-workflow:review这样不同插件的同名命令不会冲突。version建议遵循语义化版本方便团队追踪更新。3.2 skill 配置 SKILL.mdskill 是一份给模型看的操作手册放在skills/skill-name/SKILL.md。文件名固定为SKILL.md目录名就是 skill 的调用名。这里我写一个代码审查 skill--- name: review description: 按照团队规范审查代码变更 --- # 代码审查流程 当被调用时按以下步骤执行 1. 读取当前 Git 暂存区或最近一次提交的变更文件列表 2. 对每个变更文件检查 - 新增或修改的函数是否有对应的单元测试 - 外部调用是否都有 error 处理 - 日志输出是否包含请求 ID 或用户标识等上下文 3. 检查是否更新了 API 文档若涉及接口变更 4. 输出审查报告按“阻断 / 建议 / 提示”三级分类 ## 边界约束 - 只读取文件不自动修改代码 - 不执行任何 git commit 或 push - 如果变更涉及认证、加密、权限控制标记为“需人工重点审查”frontmatter 里的name和description是必须的description 会出现在命令提示里写清楚用途方便调用。正文部分就是流程说明写得越具体模型执行越稳定。3.3 agent 配置 doc-writer.mdagent 是子代理在隔离上下文里跑自己的循环返回摘要结果。适合处理“读一堆文件然后产出文档”这类会占用大量上下文的任务。放在agents/agent-name.md--- name: doc-writer description: 根据代码变更生成 API 文档草稿 --- 你是一个文档生成子代理。你的任务是 1. 读取指定的源文件提取导出的函数、类、接口 2. 为每个导出项生成一段说明包含参数、返回值、异常 3. 输出 Markdown 格式的文档草稿 约束 - 只基于实际代码内容生成不编造不存在的参数 - 如果某个函数的意图不明确标注“待确认”而不是猜测 - 不修改任何源文件agent 和 skill 的区别在于skill 是在主会话里按需调用的指令agent 是独立上下文里运行的子任务。当任务需要读取大量文件、又不想污染主会话上下文时用 agent 更合适。3.4 hook 配置 hooks.jsonhook 是在生命周期事件上触发的脚本。放在hooks/hooks.json格式如下{ hooks: { PostToolUse: [ { matcher: Write|Edit, hooks: [ { type: command, command: npx prettier --write \$CLAUDE_FILE_PATH\ 2/dev/null || true } ] } ] } }这段配置的意思是当 Claude Code 执行 Write 或 Edit 工具后对改动的文件跑一次 prettier 格式化。$CLAUDE_FILE_PATH是 Claude Code 注入的环境变量指向被修改的文件路径。末尾的|| true是防止格式化失败阻断主流程——格式化失败不应该让整个任务挂掉。hooks 支持的事件类型包括PreToolUse、PostToolUse、Notification、Stop等。matcher 用正则匹配工具名。你可以按需扩展比如在Stop事件上跑测试。三件套配齐后目录结构就完整了。接下来是本地加载验证。4. 本地加载与验证确认插件挂载成功插件写好了怎么确认 Claude Code 真的加载了它用--plugin-dir参数启动claude --plugin-dir ./team-workflow启动后在会话里输入/team-workflow:review如果 skill 注册成功你会看到它被识别为可用命令。如果输入后提示“未知命令”说明插件没加载成功回到第五节排查。验证 skill 是否生效可以故意制造一个场景改一个文件加一个没有 error 处理的外部调用然后调用 review skill看它是否按你写的流程输出审查报告。如果报告结构和你 SKILL.md 里定义的一致说明 skill 挂载正确。验证 agent可以在会话里说“用 doc-writer 子代理为 src/utils.ts 生成文档草稿”。如果 agent 配置正确Claude Code 会启动一个隔离上下文的任务返回文档草稿摘要。注意 agent 的输出是摘要形式不会把整个文件内容塞回主会话。验证 hook改一个.js文件保存后看文件是否被 prettier 格式化。如果格式变了说明 hook 触发成功。如果没变检查hooks.json的 matcher 是否匹配你用的工具名以及 prettier 是否在 PATH 里。除了本地目录加载你也可以把插件推到 Git 仓库然后通过/plugin install git-url安装。安装后插件会被缓存到本地后续启动自动加载。团队协作时每个人装同一个仓库的插件规范就统一了。这里给一条验证 API 通路的 curl 命令确认你的 Key 和 Base URL 没问题curl https://taotoken.net/api/v1/messages \ -H x-api-key: $ANTHROPIC_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: ping}] }如果返回 JSON 里带content字段说明通路正常。如果返回 401检查 Key 是否复制完整、是否有多余空格。如果返回 404检查 Base URL 是否写成了https://taotoken.net/api而不是带其他路径。验证通过后你就可以在这个插件基础上继续加 skill、加 agent、加 hook。每加一个都用--plugin-dir启动验证一次确保增量改动没破坏已有配置。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节列几个我踩过的坑都是实际会遇到的报错按现象、原因、解决三步走。401 Unauthorized。现象是请求直接被拒返回体里提示认证失败。原因通常是 API Key 无效、过期或者 Base URL 写错导致请求发到了错误的端点。排查顺序先确认ANTHROPIC_API_KEY环境变量或 settings.json 里的 Key 和 TaoToken 控制台显示的一致再确认ANTHROPIC_BASE_URL是https://taotoken.net/api没有多余斜杠或路径最后确认 Key 没有前后空格。如果都正确还报 401去控制台看 Key 是否被禁用或额度耗尽。local proxy failed。现象是 Claude Code 启动时报连接本地代理失败。这个报错通常和系统代理设置有关。检查你的环境变量里是否有HTTP_PROXY、HTTPS_PROXY、ALL_PROXY指向了一个没启动的本地端口。如果有清掉这些变量再启动。另外检查settings.json里是否配置了proxy字段指向无效地址。Claude Code 本身不需要额外代理配置直连 Base URL 即可。reading choices 相关报错。现象是模型返回的响应结构解析失败提示读取choices字段出错。这通常是因为请求发到了一个 OpenAI 格式的端点而 Claude Code 期望的是 Anthropic 格式。确认你的 Base URL 走的是 Anthropic 兼容接口请求体里用的是messages而不是prompt响应里应该是content而不是choices。如果你混用了两套配置把 OpenAI 相关的环境变量清掉。OAuth 相关报错。现象是提示 OAuth token 无效或刷新失败。Claude Code 在某些登录方式下会用 OAuth 凭证。如果你同时配置了 API Key 和 OAuth可能产生冲突。解决方式是明确用一种要么用 API Key设置ANTHROPIC_API_KEY要么用 OAuth 登录。如果你走 TaoToken 的 API Key 方式确保没有残留的 OAuth 配置文件干扰。检查~/.claude/下是否有旧的凭证文件必要时备份后移除。排查通用思路先看报错原文定位是认证层、网络层还是解析层认证层查 Key 和 Base URL网络层查代理和连通性解析层查接口格式是否匹配。每次只改一个变量改完重启验证避免多个改动叠加导致无法定位。另外插件本身的报错也值得注意。如果 skill 调用后没反应检查SKILL.md的 frontmatter 格式是否正确name和description是否都有。如果 hook 不触发检查hooks.json的 JSON 语法是否合法matcher 正则是否匹配。如果 agent 启动失败检查agents/下的文件名和 frontmatter 的name是否一致。6. 把插件接入你的日常编码流插件搭好之后怎么让它真正融入日常我的做法是分三步走。第一步先把最痛的重复流程抽成 skill。比如你们团队每次发版要跑的那串检查写成 SKILL.md调用一次全跑完。第二步把占用上下文大的任务交给 agent。比如“读十个文件生成一份迁移方案”用 agent 跑主会话只拿摘要。第三步把机械性的后处理交给 hook。比如格式化、lint、生成变更日志挂在 PostToolUse 或 Stop 事件上自动跑。如果你还在配置 Claude Code 的阶段建议先把 API Key 和 Base URL 跑通再动插件。TaoToken 的 API Keys 页面在 https://taotoken.net/api-keys 接入文档在 https://taotoken.net/doc 这两处能解决大部分配置问题。想先验证模型对话是否正常可以去 https://taotoken.net/chat 发一条消息试试。如果你打算长期用 Claude Code 做编码和 Agent 任务Coding Plan 页面 https://taotoken.net/coding-plan 有更详细的方案说明。插件生态的价值不在于装了多少个而在于你有没有把团队的最佳实践沉淀进去。一个写清楚的 SKILL.md比十个装了就忘的插件有用。从今天这个team-workflow开始把你每次重复输入的指令变成一次编写、处处调用的 skill这才是 Plugins 真正放大的地方。