1. 从一次代码评审翻车说起:Claude Code Skills 到底解决什么问题
上周帮一个做 SaaS 的朋友看他们的后端仓库,发现同一个user.js里,三个同事写的错误处理风格完全不同:一个用try/catch包到底,一个用.catch()链式,还有一个干脆把异常吞掉只打日志。我问他为什么不统一,他说"每次让 Claude 改代码,它给的风格都不一样,索性各写各的"。
这个场景其实很典型。Claude Code 本身能力很强,但它默认不知道你团队的规范、你的目录约定、你踩过的坑。你每次对话都得重新交代一遍背景,上下文窗口很快被这些重复信息占满,真正需要它思考业务逻辑的空间反而被压缩了。Claude Code Skills 就是来解决这个问题的——它让你把"团队知识"写成可复用的模块,Claude 在需要时自动加载,不需要你每次重复。
Skills 是什么?简单说,它是 Claude Code 的知识模块系统。一个 Skill 就是一个目录,核心是SKILL.md文件,里面用 YAML frontmatter 声明触发条件,用 Markdown 正文写具体指导。Claude 在收到你的请求时,会扫描所有已安装 Skill 的description字段,匹配到相关关键词就自动加载对应的SKILL.md内容,然后基于这些指导来完成任务。
它能做什么?我实测下来,最实用的三个场景是:团队编码规范统一(比如强制用参数化查询、禁止SELECT *)、项目结构约定(比如新组件必须放在哪个目录、必须配 Storybook)、以及特定领域的操作手册(比如数据库迁移的完整流程、API 版本升级的检查清单)。
适合谁?如果你是一个人写小脚本,可能觉得没必要;但只要是两人以上的团队,或者你维护的项目超过三个月,Skills 的价值就会立刻显现。它把"口口相传的规矩"变成了"Claude 自动遵守的规则",新人入职不用再问"我们这边错误码怎么定义的",Claude 自己就知道。
这一篇我会从SKILL.md的结构拆解开始,带你走完从零搭建第一个 Skill、到多 Skill 编排、再到用 TaoToken 统一 Key 通道完成工具侧配置的完整路径。目标很明确:读完你能独立跑通一个自定义 Skill,并且知道怎么把它接入日常开发流。
2. TaoToken 前置准备:统一 Key 与 API 通道配置
在写 Skill 之前,得先把 Claude Code 的模型通道配好。我试过直接填各家厂商的 Key,切换模型时改配置很麻烦,后来统一走 TaoToken 的 API 通道,一个 Key 覆盖多个模型,配置也集中。
TaoToken 是什么?它是一个 API 聚合通道,提供统一的 Base URL 和 Key,你可以在一个配置里切换不同的模型 ID。对 Claude Code 来说,关键是它能作为 Anthropic 兼容端点接入,这样 Claude Code 的请求就能正常发出去。
你需要先拿到两样东西:API Key 和 Base URL。Key 在控制台的 API Keys 页面生成,Base URL 是https://taotoken.net/api。注意这个地址不带任何查询参数,直接填就行。
拿到 Key 之后,Claude Code 的配置方式有两种:环境变量和配置文件。环境变量适合临时测试,配置文件适合长期使用。我建议两个都配,环境变量优先级更高,方便你临时切换。
环境变量的写法:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的Key"如果你用的是 Claude Code 的 settings 文件,路径通常在~/.claude/settings.json,内容长这样:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key" } }这里有个坑要注意:ANTHROPIC_BASE_URL后面不要加/v1,Claude Code 会自己拼接路径。我一开始加了/v1,结果请求全打到 404,排查了半小时才发现是路径重复。
配好之后,你可以先用一个简单请求验证通道是否通:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-你的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"}] }'如果返回里有content字段,说明通道正常。这一步很重要,因为后面 Skill 加载依赖 Claude Code 能正常发请求,通道不通的话 Skill 写得再好也触发不了。
关于模型 ID,TaoToken 的模型对话页面有完整列表,你可以按需选。我日常用claude-sonnet-4-20250514做代码任务,复杂架构分析时切到claude-opus-4-20250514。切换只需要改配置里的 model 字段,Key 和 Base URL 不用动,这就是统一通道的好处。
如果你还没生成 Key,去控制台的 API Keys 页面创建一个,记得复制保存,页面刷新后就看不到了。接入文档在 doc 页面有更详细的参数说明,包括超时设置、重试策略这些,配的时候可以对照看。
3. 可复制配置:SKILL.md 模板与目录结构
这一节是核心,我会给出一个能直接复制使用的SKILL.md模板,以及配套的目录结构。你照着建,十分钟就能跑起来第一个 Skill。
先说目录结构。Claude Code 的 Skill 可以放在两个位置:全局的~/.claude/skills/下,对所有项目生效;或者项目级的.claude/skills/下,只对当前项目生效。我建议团队规范类的放全局,项目特定的放项目级。
一个标准 Skill 的目录长这样:
code-review-guide/ ├── SKILL.md ├── references/ │ ├── security-checklist.md │ └── performance-patterns.md ├── examples/ │ └── sample-review.md └── scripts/ └── security-scan.shSKILL.md是必须的,其他三个目录都是可选的。references/放详细参考文档,Claude 需要时才加载;examples/放示例代码;scripts/放可执行脚本。
现在看SKILL.md的完整模板。我把它拆成 frontmatter 和正文两部分。
frontmatter 部分:
--- name: code-review-guide description: This skill should be used when the user asks to "review code", "check code quality", "review this function", "analyze code", or requests code review feedback. Provides comprehensive code review standards, security checks, and best practices. version: 1.0.0 ---这里name用小写字母加连字符,description是关键——它决定了 Skill 什么时候被触发。写法上要用第三人称,包含具体的触发短语,比如"review code"、"check code quality"这些用户可能说的原话。不要写"This skill helps with code"这种太笼统的描述,Claude 匹配不到。
正文部分我按"核心原则 + 常见问题 + 审查流程 + 资源引用"四段来组织:
# Code Review Guide This skill provides standardized code review guidance focusing on security, performance, and maintainability. ## Core Review Principles When reviewing code, evaluate these aspects: ### 1. Security - Check for injection vulnerabilities (SQL, command, XSS) - Verify input validation and sanitization - Ensure sensitive data is handled properly - Review authentication and authorization logic ### 2. Performance - Identify unnecessary computations - Check for N+1 query problems - Review algorithm complexity - Verify proper resource cleanup ### 3. Maintainability - Evaluate code clarity and readability - Check for appropriate abstraction - Verify error handling completeness - Review test coverage ## Common Issues to Identify ### Critical Issues (Must Fix) - Security vulnerabilities - Performance bottlenecks - Resource leaks - Logical errors ### Improvements (Should Fix) - Code duplication - Unclear naming - Missing error handling - Insufficient logging ## Review Process 1. **Understand Intent** - Read code and comments, identify purpose and requirements 2. **Identify Issues** - Use static analysis patterns, look for anti-patterns 3. **Provide Feedback** - Explain why it's an issue, suggest specific improvements 4. **Prioritize Findings** - Mark critical vs optional, group related issues ## Additional Resources ### Reference Files - **`references/security-checklist.md`** - Detailed security review checklist - **`references/performance-patterns.md`** - Performance optimization patterns ### Example Reviews - **`examples/sample-review.md`** - Example of a thorough code review ### Utility Scripts - **`scripts/security-scan.sh`** - Automated security scan helper这个模板的关键在于:正文控制在 1500 字左右,详细内容都放到references/里。Claude 加载SKILL.md时只读正文,需要深入某个主题时才去读references/下的文件。这样上下文窗口不会被一次性占满。
配套的references/security-checklist.md可以这样写:
# Security Checklist ## Input Validation - [ ] All external inputs are validated - [ ] Input lengths/sizes are checked - [ ] Special characters are handled properly - [ ] Type checking is performed ## Authentication & Authorization - [ ] Auth tokens are validated - [ ] Permissions are checked - [ ] Role-based access is correct - [ ] Session management is secure ## Data Protection - [ ] Sensitive data is encrypted - [ ] PII is handled according to policy - [ ] Secrets are not hardcoded - [ ] Passwords are hashed properly ## Common Vulnerabilities - [ ] No SQL injection vectors - [ ] No command injection - [ ] No XSS vulnerabilities - [ ] No path traversal issuesexamples/sample-review.md放一个完整的审查示例,展示你期望的输出格式:
# Sample Code Review ## Issue: SQL Injection Vulnerability **Location**: `user.js:45` **Severity**: Critical **Current Code**: ```javascript const query = "SELECT * FROM users WHERE id = " + req.params.id;Problem: Direct concatenation of user input into SQL query.
Recommendation:
const query = "SELECT * FROM users WHERE id = ?"; db.query(query, [req.params.id], callback);Explanation: Always use parameterized queries to prevent SQL injection.
Status: Must Fix
`scripts/security-scan.sh` 放一个简单的扫描脚本: ```bash #!/bin/bash # Simple security scan helper echo "Scanning for common security issues..." # Check for hardcoded secrets grep -rn "password\s*=\s*['\"]" --include="*.js" --include="*.py" . && echo "Warning: possible hardcoded password" # Check for eval usage grep -rn "eval(" --include="*.js" . && echo "Warning: eval usage found" # Check for SQL concatenation grep -rn "SELECT.*+.*req\." --include="*.js" . && echo "Warning: possible SQL injection" echo "Scan complete."记得给脚本加执行权限:chmod +x scripts/security-scan.sh。
这套配置建好之后,目录结构完整,SKILL.md的 frontmatter 和正文都到位,references/、examples/、scripts/三个配套目录也齐了。接下来就是验证它能不能被正确加载和触发。
4. 验证请求与成功结果:Skill 加载与触发实测
配置写完了,得验证它真的能工作。这一节我给出具体的验证步骤和预期结果,你照着做就能确认 Skill 是否生效。
第一步,确认 Skill 被 Claude Code 识别。启动 Claude Code 时加上--plugin-dir参数指向你的 Skill 目录:
claude --plugin-dir ./my-plugin/如果你的 Skill 放在~/.claude/skills/下,直接启动就行,不用加参数。启动后,Claude Code 会在初始化时扫描所有 Skill 的description字段,建立触发索引。
第二步,用触发短语测试。在 Claude Code 里输入:
Please review this code for security issues或者:
Check the quality of this function如果 Skill 被正确触发,Claude 的回复会体现出SKILL.md里的审查原则——比如它会按"Security / Performance / Maintainability"三个维度来分析,而不是泛泛地说"代码看起来不错"。
我实测时用的测试代码是一个有 SQL 注入风险的函数:
app.get('/user/:id', (req, res) => { const query = "SELECT * FROM users WHERE id = " + req.params.id; db.query(query, (err, result) => { if (err) throw err; res.json(result); }); });触发 Skill 后,Claude 的回复里明确指出了"SQL Injection Vulnerability",并且引用了references/security-checklist.md里的检查项,还给出了参数化查询的修改建议。这说明 Skill 不仅被加载了,references/下的资源也按需读取了。
第三步,验证资源按需加载。你可以在SKILL.md里加一句提示,让 Claude 在需要时读取references/:
For detailed security checks, refer to `references/security-checklist.md`.然后测试一个更复杂的请求,比如"review this code and check all security aspects"。如果 Claude 的回复里出现了security-checklist.md里的具体条目(比如"Input lengths/sizes are checked"),说明按需加载生效了。
第四步,检查触发准确性。测试几个不应该触发 Skill 的请求:
What time is it?Help me write a poem如果这些请求没有触发代码审查相关的回复,说明description的边界控制得不错。如果误触发了,就需要收窄description的范围,比如把"analyze code"改成"analyze code quality",减少歧义。
第五步,看日志确认。Claude Code 在加载 Skill 时通常会在输出里显示类似Loading skill: code-review-guide的记录。如果你没看到,检查两个地方:一是SKILL.md的 frontmatter 格式是否正确(YAML 对缩进敏感),二是description里是否有匹配的关键词。
我踩过的一个坑是:description里写了"review code",但用户实际说的是"review this code",中间多了个this,结果没匹配上。后来我把常见变体都加进去,比如"review code"、"review this code"、"review the code",触发率就上来了。
验证通过后,你可以把这个 Skill 复制到~/.claude/skills/下,让它对所有项目生效。如果是团队共享,把整个目录提交到 Git 仓库,同事拉下来放到对应位置就行。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置和验证过程中,最容易卡住的就是通道和认证问题。这一节我把几个高频报错和排查路径列出来,你对照着看。
报错一:401 Unauthorized
这是最常见的。完整报错通常长这样:
API Error: 401 {"error":{"type":"authentication_error","message":"invalid x-api-key"}}原因有三个:Key 填错了、Key 过期了、或者 Base URL 和 Key 不匹配。排查步骤:先确认ANTHROPIC_API_KEY的值是不是从 TaoToken 控制台复制的完整 Key,注意不要有多余空格;然后确认ANTHROPIC_BASE_URL是https://taotoken.net/api,没有多余路径;最后去控制台的 API Keys 页面确认这个 Key 还在有效期内。
如果 Key 是对的但还是 401,检查一下环境变量有没有被其他配置覆盖。Claude Code 读取配置的优先级是:命令行参数 > 环境变量 > settings.json。你可以在终端里echo $ANTHROPIC_API_KEY确认当前生效的值。
报错二:local proxy failed
完整报错:
Error: local proxy failed: dial tcp 127.0.0.1:7890: connect: connection refused这个报错说明 Claude Code 在尝试走本地代理,但代理没启动。如果你没有配代理,检查一下环境变量里有没有HTTP_PROXY或HTTPS_PROXY,有的话清掉:
unset HTTP_PROXY unset HTTPS_PROXY如果你确实需要走代理,确保代理服务在运行,并且端口和配置一致。不过对于 TaoToken 的接入,通常不需要额外代理,直连就行。
报错三:reading choices 相关错误
完整报错:
Error: reading choices: unexpected end of JSON input这个通常出现在流式响应解析失败时。原因可能是网络中断、或者模型返回了非预期的格式。排查:先确认网络稳定,然后检查max_tokens设置是否太小导致响应被截断。如果用的是自定义脚本调用,确认content-type是application/json。
还有一个可能是模型 ID 写错了。比如你写了claude-sonnet-4但实际应该是claude-sonnet-4-20250514,服务端返回错误格式,客户端解析就报这个。去模型对话页面确认准确的模型 ID。
报错四:OAuth 相关错误
完整报错:
Error: OAuth token expired or invalidClaude Code 某些版本会尝试 OAuth 认证,如果你用的是 API Key 模式,需要确保没有残留的 OAuth 配置。检查~/.claude/目录下有没有credentials.json之类的文件,有的话备份后删掉,让 Claude Code 走 API Key 认证。
如果你用的是 Claude Code 的订阅账号登录,那 OAuth 是正常的,但那种模式不走自定义 Base URL。要接入 TaoToken,必须用 API Key 模式。
配置三件套检查清单
不管你遇到哪个报错,先确认这三样东西齐全且正确:
| 配置项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 多了/v1或末尾斜杠 |
| API Key | sk-开头的完整字符串 | 复制不完整、有多余空格 |
| Model ID | 如claude-sonnet-4-20250514 | 简写、拼错、用了不存在的版本 |
如果你用的是 CC Switch 或 Cline MCP 这类工具,配置里同样要填全这三项。CC Switch 的配置文件通常在~/.cc-switch/config.json,Cline 的在 VS Code 设置里。Codex 的auth.json则是另一种格式,但核心还是 Base URL、Key、Model ID 三件套。
排查顺序建议:先curl测通道,再启动 Claude Code 测认证,最后测 Skill 触发。这样能把问题定位到具体环节,不用瞎猜。
6. 多 Skill 编排与长期使用建议
单个 Skill 跑通之后,你可能会想:能不能让多个 Skill 协同工作?答案是能,但要注意编排方式。
多 Skill 触发的机制是这样的:Claude 收到请求后,会扫描所有 Skill 的description,匹配到多个就加载多个。比如你说"create a React component with tests",如果同时有frontend-design和testing-guide两个 Skill,它们的description都匹配到了,就会一起加载。
但这里有个问题:如果两个 Skill 的指导有冲突,Claude 可能会困惑。比如一个说"组件必须用 class 写法",另一个说"必须用函数式组件",Claude 就不知道该听谁的。解决办法是在SKILL.md里明确优先级,或者把冲突的部分合并到一个 Skill 里。
我建议的编排原则是:一个 Skill 聚焦一个领域,领域之间有交叉时,在各自的SKILL.md里加一句"当涉及 X 时,同时参考 Y Skill"。比如在frontend-design里写:
When creating components, also check `testing-guide` skill for test requirements.这样 Claude 加载frontend-design时,会知道还要去看testing-guide。
对于长期使用,我有几个实用建议。第一,Skill 要版本化。在 frontmatter 里加version字段,每次修改都更新,方便追溯。第二,定期清理。有些 Skill 可能只用了两次就再也没触发过,这种就删掉,减少扫描负担。第三,团队共享时,把 Skill 仓库作为 Git submodule 挂到项目里,这样更新能同步。
如果你需要更系统的编码辅助,比如让 Claude 在多个会话里保持一致的代码风格,可以考虑 TaoToken 的 Coding Plan。它把模型调用和 Skill 管理整合在一起,适合长期做 Agent 开发的场景。配置入口在 coding-plan 页面,接入方式和单次 API 调用一样,只是多了会话管理和用量统计。
最后说一个我自己的经验:Skill 的description不要写得太"聪明"。我一开始想用很精炼的语言概括,结果触发率很低。后来改成把用户可能说的原话都列进去,比如"review code"、"check code"、"code review"、"review this function",触发率立刻上来了。Claude 匹配的是字面关键词,不是语义理解,所以宁可啰嗦一点。
如果你还没开始,建议先从一个小 Skill 做起,比如"提交信息规范"或者"日志格式约定",跑通之后再扩展到复杂场景。接入文档在 doc 页面有完整的参数说明,API Keys 在控制台生成,模型对话页面可以测试不同模型的效果。先把通道配好,再写 Skill,顺序不要反。