ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Claude Code中英文系列教程20:通过创建Claude Code插件分享agent和skills

Claude Code中英文系列教程20:通过创建Claude Code插件分享agent和skills 1. 从.claude/到可分发插件为什么我劝你把 agent 和 skills 打包如果你已经在.claude/目录里攒了一堆自定义 skills 和 agent每次换项目都要手动复制一遍那你迟早会遇到这个问题怎么把这些配置变成能一键安装、能跨项目复用、还能分享给同事的东西答案就是 Claude Code 插件机制。Claude Code 插件本质上是一个带.claude-plugin/plugin.json清单文件的目录它可以把 skills、agents、hooks、MCP 服务器、LSP 配置全部打包在一起。和独立配置最大的区别在于命名空间独立配置里你的技能叫/hello打包成插件后就变成/my-plugin:hello。这个前缀不是故意给你添麻烦而是防止多个插件出现同名技能时互相覆盖。我试过把一个项目里用了三个月的 code-review skill 直接搬进插件目录整个过程不到十分钟之后团队里五个人都能通过同一个插件目录加载它。这篇就按「先跑通最小插件再加 agent 和 skills最后本地验证」的顺序走一遍中间会说明怎么通过 TaoToken 统一 Key 和 API 通道来接入模型调用避免每个项目重复配环境变量。适合谁看已经在用 Claude Code、手里有至少一个自定义 skill 或 agent、想让配置可复用的人。如果你还没装 Claude Code先跑claude --version确认版本在 1.0.33 以上低于这个版本看不到/plugin命令。插件和独立配置的选择其实很简单个人实验、单项目定制、想要短命令名就用.claude/要分享、要跨项目、要版本管理就打包成插件。官方文档的建议也是先在.claude/里快速迭代等稳定了再转插件。下面直接进入可复制的操作。2. TaoToken 前置统一 Key 与 API 通道插件调用不再各配各的插件里的 agent 和 skills 最终都要调用模型如果每个项目、每个插件都单独配一套 Key 和 Base URL维护成本会很高。我的做法是先用 TaoToken 把 API 通道统一起来插件里只引用同一套环境变量。TaoToken 在这里的角色是提供统一的模型调用入口你拿到一个 Key 之后Claude Code 和插件都走同一个 Base URL。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数。具体操作分三步。第一步在 TaoToken 控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建后复制那串以sk-开头的 Key只显示一次先存到密码管理器。第二步如果你还没配过 Claude Code 的环境变量在 shell 配置文件里加上 Base URL 和 Key。第三步验证模型对话是否通可以用模型对话页面快速测一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。环境变量配置片段如下macOS 和 Linux 写在~/.zshrc或~/.bashrcWindows 用系统环境变量界面export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoToken密钥写完后执行source ~/.zshrc让配置生效。这里有个坑如果你之前配过别的 Base URL一定要确认新值覆盖了旧值可以用echo $ANTHROPIC_BASE_URL检查。对于插件开发场景我建议把 Key 放在环境变量里而不是写进plugin.json因为插件是要分发的硬编码 Key 会泄露。插件里的 agent 定义只需要声明用哪个模型Key 和 Base URL 由运行环境提供。这样团队里每个人用自己的 Key插件本身保持干净。如果你需要长期跑编码任务或者 agent 工作流可以考虑 Coding Plan入口是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景。API Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。配好之后插件里的 agent 调用模型时就会走 TaoToken 这条通道不需要在插件内部再写任何鉴权逻辑。这一步做完后面的插件目录结构和 manifest 声明才有意义否则插件加载了也调不通模型。3. 可复制配置插件目录模板 agent/skills 声明片段这一节给出完整的插件目录模板和可复制的配置文件。先看目录结构这是最容易出错的地方.claude-plugin/里只能放plugin.json其他所有目录都必须在插件根级别。my-dev-plugin/ ├── .claude-plugin/ │ └── plugin.json ├── skills/ │ └── code-review/ │ └── SKILL.md ├── agents/ │ └── reviewer.md ├── hooks/ │ └── hooks.json └── .mcp.json创建目录的命令mkdir -p my-dev-plugin/.claude-plugin mkdir -p my-dev-plugin/skills/code-review mkdir -p my-dev-plugin/agents mkdir -p my-dev-plugin/hooks清单文件my-dev-plugin/.claude-plugin/plugin.json内容如下这是插件的身份声明{ name: my-dev-plugin, description: 团队代码审查与重构辅助插件, version: 1.0.0, author: { name: Your Team }, homepage: https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc }name字段决定命名空间前缀技能会变成/my-dev-plugin:code-review。version用语义化版本方便后续更新。skills 声明文件my-dev-plugin/skills/code-review/SKILL.md注意 frontmatter 里的name和description是必需的--- name: code-review description: 审查代码的最佳实践与潜在问题在检查 PR、分析代码质量时使用 --- 审查代码时依次检查 1. 代码组织与模块划分是否清晰 2. 错误处理是否覆盖边界情况 3. 是否存在安全隐患如未校验的输入 4. 测试覆盖率是否足够 5. 命名是否表意明确agent 声明文件my-dev-plugin/agents/reviewer.md这里指定模型走 TaoToken 通道--- name: reviewer description: 专注代码审查的 agent自动检查 diff 并给出修改建议 model: claude-sonnet-4-20250514 --- 你是一名严格的代码审查者。收到代码 diff 后按以下顺序输出 1. 阻断性问题必须修改 2. 建议性问题可选优化 3. 亮点值得保留的写法 不要泛泛而谈每条意见必须指向具体行号。hooks 配置my-dev-plugin/hooks/hooks.json格式和settings.json里的 hooks 对象一致{ hooks: { PostToolUse: [ { matcher: Write|Edit, hooks: [ { type: command, command: npm run lint:fix $FILE } ] } ] } }MCP 服务器配置.mcp.json放在插件根目录如果你不需要 MCP 可以省略这个文件{ mcpServers: { filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, ./] } } }这里要提醒一句MCP 配置不要直连生产数据库本地开发用文件系统或测试环境就够了。上面这个 filesystem server 只暴露当前目录相对安全。三件套对照表方便你检查配置是否齐全配置项位置作用Base URL环境变量ANTHROPIC_BASE_URL指向 TaoToken API 通道API Key环境变量ANTHROPIC_API_KEY鉴权不写进插件Model IDagent frontmatter 的model字段指定该 agent 用哪个模型如果你用的是 Codex 或 Cline 这类工具配置思路类似Codex 的auth.json里填 Base URL 和 KeyCline 的 MCP 配置里填同样的通道信息。核心原则是插件只声明「用什么模型」不声明「怎么鉴权」。4. 验证请求本地加载插件并触发 agent 与 skills配置写完后用--plugin-dir标志本地加载不需要安装。命令如下claude --plugin-dir ./my-dev-plugin启动后先跑/help你应该能在插件命名空间下看到/my-dev-plugin:code-review。如果没看到说明 skills 目录结构有问题回到上一节检查SKILL.md是否在skills/code-review/下。触发 skill 的方式是直接输入命令/my-dev-plugin:code-reviewClaude 会读取SKILL.md里的指令并执行。你也可以带参数比如在 skill 里用$ARGUMENTS占位符接收输入--- name: review-file description: 审查指定文件的代码质量 --- 审查文件 $ARGUMENTS 的代码按阻断性、建议性、亮点三类输出意见。然后这样调用/my-dev-plugin:review-file src/utils/parser.ts验证 agent 是否加载输入/agents列表里应该出现reviewer。选中它之后发一段 diff观察它是否按你定义的格式输出。如果 agent 没出现检查agents/reviewer.md的 frontmatter 是否有name和description。验证 hooks 是否触发随便改一个文件保存看终端是否执行了npm run lint:fix。hooks 不触发通常是matcher写错了Write|Edit要匹配工具名大小写敏感。验证模型调用是否走 TaoToken可以在 agent 里让它输出当前使用的模型信息或者直接看 TaoToken 控制台的调用记录。如果调用失败先检查环境变量echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_API_KEY两个值都要非空Base URL 应该是https://taotoken.net/api。改完环境变量后要重启 Claude Code因为它在启动时读取环境变量。同时加载多个插件测试冲突claude --plugin-dir ./my-dev-plugin --plugin-dir ./another-plugin如果两个插件有同名 skill命名空间前缀会区分它们不会冲突。这也是插件机制比独立配置更适合团队的原因。成功的结果应该是/help里能看到命名空间命令/agents里能看到自定义 agent改文件时 hooks 自动执行模型调用在 TaoToken 控制台有记录。四项都通过插件就算跑通了。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节列出实际会遇到的报错和对应处理。先说 401这是最常见的鉴权失败。报错长这样API Error: 401 Unauthorized - invalid api key原因通常是ANTHROPIC_API_KEY没设置、设置成了旧值、或者 Key 复制时带了空格。处理步骤先echo $ANTHROPIC_API_KEY确认值存在且以sk-开头然后去 TaoToken 控制台重新生成一个 Key 对比。如果是在插件里硬编码了 Key删掉改用环境变量。改完重启 Claude Code。第二个报错是 local proxy failedError: local proxy failed to connect这个通常和 Base URL 有关。检查ANTHROPIC_BASE_URL是否写成了https://taotoken.net/api注意结尾不要多加斜杠也不要把 UTM 参数拼进 API 地址。如果你之前配过其他工具的代理设置确认没有残留的HTTP_PROXY或HTTPS_PROXY环境变量干扰。用env | grep -i proxy检查一下。第三个报错是 reading choicesError: reading choices: unexpected end of JSON input这个多半是模型返回了空响应或非 JSON 格式。常见原因是 agent 的model字段填了一个不存在的模型 ID。去 TaoToken 的模型列表页面确认可用的 Model ID填对之后重启。另一个可能是请求超时网络不稳定时重试一次。第四个是 OAuth 相关报错OAuth error: token exchange failed如果你用的是 Claude Code 的 OAuth 登录流程同时又在环境变量里配了 API Key两者可能冲突。处理方式是二选一要么用 OAuth 登录要么用 API Key不要同时启用。用 API Key 的话确认没有残留的 OAuth token 文件。还有一个结构类错误不报错但插件不生效把skills/或agents/放进了.claude-plugin/目录里。记住.claude-plugin/里只能有plugin.json其他目录必须在插件根级别。这个错误不会给提示只是命令不出现很容易卡住。排查顺序建议先看/help有没有命令再看/agents有没有 agent然后看环境变量最后看 TaoToken 控制台的调用记录。从外到内一层层缩小范围比盲目改配置快得多。如果以上都排查完还是不通去接入文档对照一遍配置https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 文档里有各工具的完整配置示例。6. 把插件用起来从本地验证到团队分发的下一步插件本地跑通之后下一步是让它真正进入日常工作流。我的做法是先在团队里找一个人一起测确认 agent 的输出格式符合预期再考虑分发。分发方式有两种一是直接把插件目录放进 git 仓库团队成员 clone 后用--plugin-dir加载二是走插件市场适合更大范围的分发。版本管理上每次改动plugin.json里的version字段用语义化版本。skills 和 agent 的改动如果影响输出格式升 minor 版本只是修错别字升 patch 版本。这样团队成员能清楚知道该不该更新。如果你手里已经有.claude/里的独立配置迁移到插件很简单创建插件目录把commands/、agents/、skills/复制过去hooks 从settings.json里抽出来放进hooks/hooks.json然后本地加载验证。迁移后可以把.claude/里的原始文件删掉避免重复插件版本会优先加载。对于需要长期跑 agent 工作流的场景Coding Plan 比按次调用更划算入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。API Key 如果需要轮换在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理。想快速验证模型是否可用用模型对话页面https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。最后说一个实际经验插件里的 agent 不要写得太「全能」一个 agent 专注一件事比如只做代码审查或只做重构建议。全能 agent 的 prompt 会很长输出反而不稳定。skills 也是同理一个 skill 一个明确任务用$ARGUMENTS接收变化的部分。这样组合起来插件才真正可维护、可分发给别人用。
返回列表