上期的结论是:口径没人能卖给你,只能自己写。这期解决紧接着的那个问题——写完放哪。四个官方 skill 的真实目录摆在一起看,从「压根没拆」到「两轴矩阵」,中间那几道线画在哪。
口径和 schema 写出来之后有个非常实际的问题:放哪。塞进 SKILL.md,一份仓库表结构就能把它撑到上千行,而且每次触发都整份进 context;塞进 CLAUDE.md 更糟——那是无条件常驻的,每个会话都付这笔钱。官方给的答案是按域拆成多份文件,SKILL.md 只留一张路由表。本期不从原理讲起,先把 anthropics/skills 里四个真实目录摊开——pdf 平铺两份、mcp-builder 一个 reference/、skill-creator 一个 references/、claude-api 直接做成两轴矩阵——再回头说这几档之间怎么选。
Skill authoring best practices 的 Runtime environment 一节列了三条,是这套结构全部的经济学依据:① Metadata pre-loaded——启动时只有所有 skill 的 name 与 description 进系统提示;② Files read on-demand——相关了才读 SKILL.md,其余文件再按需读;③ No context penalty for large files,原话是 Reference files, data, or documentation don't consume context tokens until actually read.
# 个人级:本机所有项目可见
~/.claude/skills/<skill-name>/SKILL.md
# 项目级:随仓库走,能进 git(团队共享口径就用这个)
.claude/skills/<skill-name>/SKILL.md
# 插件级:调用时带命名空间 /plugin-name:skill-name
<plugin>/skills/<skill-name>/SKILL.md
# 子目录级:在 <subdir> 或其下启动的会话才加载
<subdir>/.claude/skills/<skill-name>/SKILL.md
# 想先看现成的(19 个官方 skill 全在里面)
/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropic-agent-skills
官方 best-practices 里的 Pattern 2: Domain-specific organization 给了一个 bigquery-skill 的骨架,原样可用:SKILL.md 加一个 reference/,里面 finance.md / sales.md / product.md / marketing.md 四份。SKILL.md 正文只放三种东西——一句话说这个 skill 管什么、一张按域路由的表、一条 grep 提示:
mkdir -p .claude/skills/warehouse/reference
# SKILL.md 里的路由表,官方原样:
**Finance**: Revenue, ARR, billing → See [reference/finance.md](reference/finance.md)
**Sales**: Opportunities, pipeline, accounts → See [reference/sales.md](reference/sales.md)
# 以及一条 quick search 提示,让它自己捞:
grep -i "revenue" reference/finance.md
口径规则写进对应那份域文件,不写进 SKILL.md——官方举的例子正是「always exclude test accounts」这类规则,它属于哪个域就落在哪份里。什么时候别拆:SKILL.md 还没到 500 行、只有一个域、或者域之间强耦合(问 A 必然要读 B)——拆了只是多一跳。官方那条界线写得很硬:Keep SKILL.md body under 500 lines... Split content into separate files when approaching this limit.
claude-api 的 Reading Guide:先读 {lang}/claude-api/README.md,然后按任务加料——Chat UI 加 streaming.md,tool use 加 shared/tool-use-concepts.md + {lang}/claude-api/tool-use.md,缓存读 shared/prompt-caching.md,省钱读 shared/cost-optimization.md。mcp-builder:同一步里分叉,选 TypeScript 读 ./reference/node_mcp_server.md,选 Python 读 ./reference/python_mcp_server.md;而 mcp_best_practices.md 与 evaluation.md 是无条件读的。条件路由的价值在于「不该读的那份连名字都不会被展开」。head -100 预览而不是整份读,结果是残缺信息。所有 reference 都要从 SKILL.md 直接链过去。skills/pdf 的文件名是小写 forms.md / reference.md,而它 SKILL.md 正文写的是「read FORMS.md」「see REFERENCE.md」。macOS 默认文件系统大小写不敏感,照跑;Linux 容器里就是两个不同的名字。自己拆 reference 时,路由行里的路径从 ls 的输出里复制,别手打。reference/<域>.md 放 schema 与口径,scripts/ 放能机器校验的部分。放错层,要么每次白交 token,要么该读的永远没读。reference/<域>.md(按需读):表名字段、指标定义、口径边界、常用查询模板。skill-creator 把 schema 单独拎成 references/schemas.md,就是这一格的官方示范。scripts/(执行,不进 context):能写成校验的别写成叮嘱。官方原话:Only the script's output consumes tokens. docx 把 XSD 校验、run 合并、接受修订全做成了 scripts/ 下的脚本,一份 .md 都没拆。claude-api 把 shared/ 和语言目录分开的理由:问 Python 的人不需要 Ruby 那 8 份。reference/ 平铺就够,mcp-builder 四份到顶。主题 × 语言、或主题 × 环境两根都在 → 才值得做成 claude-api 那样的矩阵。两轴的代价是路由表必须写成 {lang}/xxx.md 这种带占位符的模板,人读着累、改起来更累。claude-api 的 SKILL.md 把模型与定价表标成 as of 2026-06-24,是本期最该抄走的一个小动作:volatile 的内容自己声明保质期,别让读者替你猜。docx / xlsx / pptx / web-artifacts-builder 四个官方 skill 至今都是 SKILL.md + scripts/,没有任何 .md 被拆出来。别因为「官方都拆」而拆——官方一多半没拆。grep -i "revenue" reference/finance.md,没有 shell 就退化成整份读。scripts/ 依赖的东西得预先在那儿;claude.ai 才能从 npm / PyPI / GitHub 拉。FORMS.md / forms.md 就是这笔账的实例。head -100 预览,深链 + 无目录的长文件 = 读到一半的 schema,这比没读到更危险——半份口径不会触发任何怀疑。template/ 至今只有一个 SKILL.md,起手式本来就是这样。reference/finance.md 里写错的口径,按需加载只会让它更晚被发现——因为你连它有没有被读过都不知道。拆 reference 之前,先保证那几份文件里的内容是对的。先读这三份:① 官方 best-practices 的 Progressive disclosure patterns 一节——Pattern 1/2/3、一层深、100 行目录,本期几乎所有规则的出处。② skills/claude-api 的 SKILL.md——看那张 Reading Guide 怎么把 28 份 shared/ 和 8 种语言目录压成一张表。③ skills/mcp-builder 的 SKILL.md + reference/——四份文件,是「最小可用的按域拆」的标准答案。
按需再看:skills/pdf(平铺两份 md 长什么样)· skills/skill-creator(references/schemas.md 与 agents/ assets/ scripts/ 的分工)· skills/docx 与 skills/xlsx(不拆也能很重的反例)· template/SKILL.md(起手式)· code.claude.com/docs/en/skills(四个加载路径)。
明确别做:因为「官方都这么做」就拆(官方 19 个 skill 里多数没拆)· 把整份 schema 写进 SKILL.md · 引用套引用超过一层 · 路由行里的路径手打不核大小写 · 拆完不在 volatile 的文件里标日期。
name(≤64 字符,小写字母数字连字符)与 description(≤1024 字符)。正文官方建议 500 行以内。claude-api 的两轴拆法:与语言无关的概念放 shared/,与语言绑定的放各语言目录,路由表里用 {lang} 占位符统一指。reference/<域>.md,不该落在 SKILL.md。shared/ 28 份 .md 与 8 种语言目录;模型表自带 as of 2026-06-24 的日期标注reference/ 四份:mcp_best_practices.md、evaluation.md 无条件读,node_mcp_server.md / python_mcp_server.md 按语言条件读references/schemas.md 把 schema 单列;另有 agents/、assets/、eval-viewer/、scripts/ 按用途分目录forms.md + reference.md + scripts/;注意正文写作 FORMS.md / REFERENCE.md 与实际小写文件名的大小写差异scripts/,确定性操作全部脚本化template/ 目录至今只有这一个文件