1. 先搞清楚:CLAUDE.md 和 Skills 到底在解决什么问题
如果你正在用 Claude Code 或者类似的 AI 编码工具搭工作流,大概率会遇到一个很具体的困惑:项目里那些"必须遵守的规则"和"某类任务才用得上的流程",到底该写在哪?写进 CLAUDE.md 吧,文件越堆越长,每次对话都占着上下文;写成 Skill 吧,又怕关键约束在没触发的时候直接丢了。
这个问题的本质,是上下文注入策略和能力复用粒度两件事被混在了一起。CLAUDE.md 解决的是"这个项目里永远成立的事实和红线",Skills 解决的是"遇到某类任务时按什么流程做"。前者是常驻的、无条件的、项目级的;后者是按需的、匹配触发的、可跨项目复用的。把这两者分清楚,你的 AI 编码工作流会干净很多,token 消耗也会明显下降。
这篇内容面向正在搭建 AI 编码工作流的开发者,我会先用一张对照表把职责边界钉死,然后给出可复制的settings.json与config.toml配置骨架,说明如何通过统一的 Key/API 通道接入,最后用一次实际调用验证配置是否生效。全程小白友好,命令和参数都能直接抄。
先给一句话版本,方便你记住:
CLAUDE.md 是贴在 Agent 桌子上的便签——"在这个项目里,永远记住这些事";Skills 是放在 Agent 书架上的操作手册——"遇到这类任务时,按这个流程做"。
便签一直在视线里,手册要用的时候才翻。这个类比后面会反复用到。
2. 一张表彻底分清 CLAUDE.md 与 Skills
下面这张表是全文的核心,建议直接收藏。它从八个维度把两者的差异拆开,每一行都对应一个实际决策点。
| 维度 | CLAUDE.md | Skills |
|---|---|---|
| 本质 | 项目级持久约束 | 场景化能力模块 |
| 作用范围 | 该项目内所有会话,全程生效 | 只在匹配到的特定任务时加载 |
| 内容类型 | 项目事实、规范、禁止事项 | 特定领域的流程、最佳实践、工具组合 |
| 加载时机 | 每次启动 Agent 时默认注入 | 任务匹配时动态加载 |
| 加载方式 | 自动,无条件 | 自动匹配或手动调用 |
| 是否占用上下文 | 是,始终占用 | 是,但只在加载时占用 |
| 可插拔 | 否,一个项目一个文件 | 是,可以有多个,随时启用/禁用 |
| 谁维护 | 你手动编写 | 你可以写,也可以用社区现成的 |
| 典型内容 | "用 pnpm,Node ≥ 18,别碰数据库 schema" | "TypeScript 迁移流程""React 组件生成规范" |
用代码来类比会更直观。CLAUDE.md 相当于全局常量,整个项目到处都能引用;Skills 相当于按需 import 的模块,用到的时候才加载进内存。
// CLAUDE.md = 全局常量,整个项目到处都能用 const PROJECT_RULES = { packageManager: "pnpm", nodeVersion: ">=18", forbiddenPaths: ["/packages/database/schema"], }; // Skills = 按需引入的模块,用到的时候才 import import { typeScriptMigrationGuide } from "./skills/ts-migration"; import { reactBestPractices } from "./skills/react-patterns";这个类比能解释一个常见现象:为什么你把所有规则都塞进 CLAUDE.md 之后,Agent 反而变笨了。因为全局常量太多,留给推理的"工作内存"就被挤占了。而 Skills 的按需加载,本质上是在做上下文预算管理。
2.1 实际运行时两者怎么配合
光看表还不够,得看一次真实的任务流。假设你的项目配置如下。
CLAUDE.md 内容:
- 使用 pnpm,不要用 npm - Node 版本 ≥ 18 - 所有 API 路径以 /api/v1 开头 - 不要在周五部署Skills 列表:
nextjs-patterns(Next.js 最佳实践)api-error-handling(统一错误处理规范)weekly-report(周报生成器)
当你执行"给项目加统一错误处理"时,运行时的加载顺序是这样的:
Agent 启动 ├── 自动读取 CLAUDE.md → "pnpm、Node ≥ 18、API 路径规则" 永驻上下文 └── 建立 Skill 索引 你下指令:"给所有 API 加统一错误处理" ├── Agent 匹配 Skill → 命中 api-error-handling → 加载到上下文 ├── Agent 规划任务(受 CLAUDE.md + Skill 双重约束) │ ├── CLAUDE.md 约束:API 路径保持 /api/v1 开头 │ └── Skill 约束:错误格式遵循 RFC 7807 └── 开始执行注意这里的关键点:CLAUDE.md 的约束是"全程在线"的,Skill 的约束是"命中才在线"的。如果这次任务没命中api-error-handling,那么 RFC 7807 这条规则就不会出现,但/api/v1这条永远在。这就是为什么通用硬约束必须写在 CLAUDE.md——Skill 不匹配就不会加载,重要约束会直接丢失。
2.2 一个直观判断法
每次纠结写哪边的时候,问自己一个问题:
"这个规则,是每次任务都要遵守的,还是某类任务才需要遵守的?"
每次都要遵守的,写 CLAUDE.md;某类任务才需要的,写成 Skill。这个判断法能覆盖九成以上的场景。
3. TaoToken 前置:统一 Key/API 通道怎么接
在给出配置骨架之前,得先把接入通道说清楚。不管你是用 Claude Code、还是自己写的 Agent 脚本,模型调用都需要一个稳定的 API 入口。TaoToken 提供的就是这样一个统一通道,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。
为什么要在讲 CLAUDE.md 和 Skills 之前先讲接入?因为配置骨架里的settings.json和config.toml,本质上都要指向一个 API 地址和一把 Key。如果通道不统一,你在多个项目、多个工具之间切换时,Key 管理会变成一团乱麻。统一通道之后,CLAUDE.md 里可以写"本项目统一走这个 API 入口",Skills 里可以写"调用模型时用这套参数",两边引用同一个来源,不会打架。
你需要先拿到一把 API Key。进入控制台创建即可:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,然后在 API Keys 页面生成密钥:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。生成后先复制保存,页面刷新后就不再完整显示。
如果你更习惯先看看模型对话效果再决定怎么配,可以直接在模型对话页面试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。想先读文档再动手的,接入文档在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
注意:Key 只放在本地环境变量或本地配置文件里,不要提交到 Git 仓库。下面所有配置示例里的
sk-xxxx都请替换成你自己的真实 Key。
4. 可复制配置:settings.json 与 config.toml 骨架
这一节是全文最实操的部分。我会给出两套配置骨架,一套是 Claude Code 风格的settings.json,一套是通用 Agent 的config.toml。你可以按自己用的工具选一套,或者两套都留着。
4.1 settings.json 配置骨架
Claude Code 的配置通常放在项目根目录的.claude/settings.json,或者用户级的~/.claude/settings.json。下面这份骨架把 API 通道、环境变量、权限边界都写清楚了。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-xxxx", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "Read", "Glob", "Grep", "Edit", "Bash(pnpm *)", "Bash(git status)", "Bash(git diff *)" ], "deny": [ "Bash(rm -rf *)", "Bash(git push --force *)", "Read(./.env)", "Read(./secrets/**)" ] }, "includeCoAuthoredBy": false }几个参数说明一下。ANTHROPIC_BASE_URL指向统一 API 入口,注意这里用的是https://taotoken.net/api,不带任何查询参数。ANTHROPIC_AUTH_TOKEN填你的 Key。permissions.deny里把.env和secrets目录挡掉,这是防止 Agent 误读敏感文件的底线,建议每个项目都加上。
如果你用的是 Claude Code 的 coding plan 模式,配置入口在:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。长期做编码和 Agent 任务的,走这个通道会更省心。
4.2 config.toml 配置骨架
如果你用的是通用 Agent 框架,或者自己写的脚本,config.toml会更合适。下面这份骨架把模型参数、上下文策略、Skill 目录都列出来了。
[api] base_url = "https://taotoken.net/api" api_key = "sk-xxxx" timeout_seconds = 120 max_retries = 3 [model] name = "claude-sonnet-4-20250514" max_tokens = 8192 temperature = 0.2 [context] # CLAUDE.md 常驻注入,路径相对于项目根目录 project_rules_file = "./CLAUDE.md" # Skills 按需加载,目录下每个子目录是一个 Skill skills_dir = "./skills" skill_auto_match = true max_loaded_skills = 3 [logging] level = "info" log_dir = "./logs"这里有两个参数值得单独说。max_loaded_skills = 3是防止一次任务命中太多 Skill 把上下文撑爆,实测下来 3 个是比较稳的上限。temperature = 0.2是编码场景的常用值,太低会死板,太高会乱改代码。
4.3 CLAUDE.md 与 Skill 的目录结构
配置写好了,目录结构也得对。推荐这样组织:
my-project/ ├── CLAUDE.md ├── .claude/ │ └── settings.json ├── config.toml ├── skills/ │ ├── api-error-handling/ │ │ └── SKILL.md │ ├── nextjs-patterns/ │ │ └── SKILL.md │ └── weekly-report/ │ └── SKILL.md └── src/CLAUDE.md 放在项目根目录,Skills 放在skills/下,每个 Skill 一个子目录,里面放SKILL.md。这样config.toml里的skills_dir指向./skills就能自动扫描到。
4.4 什么时候写 CLAUDE.md,什么时候写 Skill
把判断标准再具体化一下。
写在 CLAUDE.md 的:
- 项目永远不变的事实(技术栈、版本要求、包管理器)
- 每次都想让 Agent 知道的约束(命名规范、禁止操作、API 路径前缀)
- 简短、普适、高频的规则
写成 Skill 的:
- 特定场景才需要的专业知识(某框架的最佳实践)
- 有固定流程的多步骤任务(周报生成、代码审查、迁移流程)
- 你希望在多个项目间复用的能力
- 内容较长、只在特定时候需要的
5. 验证请求:一次实际调用确认配置生效
配置写完不能只看,得跑一次确认。下面用一个最小请求验证 API 通道是否通,再验证 CLAUDE.md 和 Skill 是否被正确加载。
5.1 先验证 API 通道
用 curl 直接打一次 API,确认 Key 和地址没问题。
curl -s https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-xxxx" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 128, "messages": [ {"role": "user", "content": "只回复两个字:通了"} ] }'如果返回的 JSON 里content字段包含"通了",说明通道正常。如果返回 401,检查 Key 是否复制完整;返回 404,检查base_url是否写成了https://taotoken.net/api而不是别的路径。
5.2 再验证 CLAUDE.md 是否被注入
在项目根目录启动 Agent,然后问一个只有 CLAUDE.md 里才有答案的问题。比如你的 CLAUDE.md 里写了"使用 pnpm",那就问:
这个项目用什么包管理器?如果 Agent 回答"pnpm",说明 CLAUDE.md 被正确注入了。如果它反问"你想用哪个",说明注入没生效,检查project_rules_file路径是否正确。
5.3 最后验证 Skill 是否按需加载
给一个能命中 Skill 的指令,比如"给所有 API 加统一错误处理"。观察 Agent 的行为:如果它开始引用 RFC 7807 或者你 Skill 里定义的错误格式,说明api-error-handling这个 Skill 被匹配并加载了。
你也可以在config.toml里把logging.level调成debug,日志里会打印每次加载了哪些 Skill,方便排查。
[debug] loaded skills: api-error-handling [debug] context tokens: 12480 / 200000看到这行日志,就说明整套配置跑通了。
6. 本篇常见错排查
配置过程中最容易踩的坑,我整理成了一张排查表。遇到问题先对照这里,能省不少时间。
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 401 Unauthorized | Key 错误或未生效 | 重新生成 Key,确认无多余空格 |
| 404 Not Found | base_url 路径写错 | 确认是https://taotoken.net/api |
| Agent 不遵守 CLAUDE.md | 文件路径不对或未注入 | 检查project_rules_file路径 |
| Skill 一直不加载 | 目录结构或匹配规则问题 | 确认skills_dir和SKILL.md存在 |
| 上下文爆掉 | CLAUDE.md 太长或 Skill 加载过多 | 精简 CLAUDE.md,调低max_loaded_skills |
| Skill 和 CLAUDE.md 冲突 | 两边写了重复或矛盾内容 | 通用约束留 CLAUDE.md,细节移入 Skill |
6.1 误区一:把所有规则都塞进 CLAUDE.md
结果就是上下文被大量规则占满,留给推理的空间变少,Agent 反而变笨。正确做法是 CLAUDE.md 只放高频约束,低频的放 Skills。
6.2 误区二:Skills 和 CLAUDE.md 写重复内容
两边写一样的东西,不仅浪费上下文,冲突时 Agent 还可能混乱。正确做法是 CLAUDE.md 写通用约束,Skills 写领域细节,互不重叠。
6.3 误区三:以为 Skill 能覆盖 CLAUDE.md
Skill 不匹配就不会加载,重要约束会直接丢失。通用硬约束必须写在 CLAUDE.md,这条没有例外。
6.4 误区四:Key 硬编码进配置文件后提交了
这是最危险的一个。Key 一旦进了 Git 历史,就算后面删掉也还在。建议用环境变量引用:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "${TAOTOKEN_API_KEY}" } }然后在 shell 里export TAOTOKEN_API_KEY=sk-xxxx,配置文件本身不含明文 Key,可以放心提交。
7. 继续往下走:按你的场景选入口
配置跑通之后,接下来怎么走取决于你的使用场景。我把几个入口按场景分一下,你对号入座就行。
如果你主要在做排障和接入,比如 Key 报错、通道不通、配置不生效,优先看 API Keys 页面和接入文档:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 和 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。文档里有完整的错误码对照。
如果你主要想验证模型效果,比如对比不同模型在编码任务上的表现,直接去模型对话页面试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。把同一段代码丢给不同模型,看谁改得对、改得少。
如果你在做长期编码或 Agent 任务,比如每天都要跑代码生成、代码审查、自动化重构,那 coding plan 会更合适:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它的定位就是给高频编码场景用的。
最后回到 CLAUDE.md 和 Skills 的关系上。我自己的习惯是:CLAUDE.md 控制在 50 行以内,只写那些"如果 Agent 不知道就会犯错"的硬约束;Skills 按领域拆,每个 Skill 只解决一类任务,能跨项目复用就复用。这样一套下来,上下文干净,Agent 的行为也可预测。你可以先从精简 CLAUDE.md 开始,把低频规则挪进 Skills,跑一周看看 token 消耗和输出质量的变化。