
1. 先搞清楚 Claude Code 的 skills 目录到底在解决什么问题很多人第一次打开 Claude Code 的 skills 目录时表情是懵的一堆.md、.js、.json混在一起既不像普通项目源码也不像配置文件。其实你可以把它理解成给 AI 准备的「工具说明书 零件箱」——AI 本身不会做 PPT但它能读懂说明书然后去零件箱里拿对应的工具来干活。Claude Code 的 skills 机制本质上是把「一类任务的完整做法」打包成一个可复用的技能包。每个技能包放在~/.claude/skills/或项目内的.claude/skills/下目录名就是技能名。当你在对话里提到相关需求时Claude 会先扫描这些技能包的SKILL.md判断哪个技能能派上用场再按里面写的调用方式去执行脚本。以 PPT 技能包为例它要解决的问题很具体用户说「帮我生成一个关于 Q2 销售数据的 8 页 PPT」Claude 不可能凭空变出一个.pptx文件。它需要知道用什么库生成、大纲用什么格式传、输出到哪个目录、有哪些限制不能碰。这些信息全部写在技能包里而不是散落在对话上下文中。对 vibecoding 新手来说看懂 skills 目录的价值在于三点。第一你能知道 AI 到底「会什么、不会什么」避免提出它根本做不到的需求。第二你能通过改配置文件让 AI 的输出符合自己的习惯比如默认字体、默认模板、默认输出路径。第三当 AI 生成的 PPT 出问题时你知道该去哪个文件里找原因而不是干瞪眼。我试过把 PPT 技能包整个目录打印出来逐个文件读读完最大的感受是这套结构其实非常朴素没有魔法。核心就是「一个说明文件 一组脚本 若干配置 参考资料」。下面我就按这个顺序把目录树和每个文件的职责拆开讲。需要先说明的是技能包里的脚本调用最终会走模型接口如果你打算自己跑一遍验证得先有一个可用的 API Key 和 Base URL。这部分我在第 2 节讲清楚不然后面复制配置时会卡住。2. 接入前的准备Base URL、API Key 和 Model ID 三件套在动手拆目录之前得先把「让 Claude Code 能跑起来」这件事解决掉。Claude Code 本身是一个客户端它需要连到一个兼容 Anthropic 接口的服务上才能工作。这里涉及三个必须配对的参数Base URL、API Key、Model ID。三者缺一不可配错任何一个都会在验证阶段报错。Base URL 指的是接口地址。TaoToken 提供的 API 入口是https://taotoken.net/api注意这个地址后面不要加多余的斜杠或路径Claude Code 会自己在后面拼接/v1/messages之类的端点。API Key 需要你在控制台里生成生成后是一串以sk-开头的字符串只显示一次记得当场复制保存。Model ID 则是你要调用的具体模型名称比如claude-sonnet-4-5这类标识写错会导致 404 或模型不存在。获取 Key 的路径很直接打开https://taotoken.net/console登录后在 API Keys 页面点新建复制生成的密钥。如果你还没决定用哪个模型可以先到模型对话页面试几条消息确认响应正常再回到 Claude Code 里配置。模型对话入口在https://taotoken.net/model-chat适合先做连通性验证。配置 Claude Code 有两种常见方式。一种是改~/.claude/settings.json把环境变量写进去另一种是用claude config命令交互式设置。对新手我更推荐直接改配置文件因为看得见、改得动、出错了也好回滚。下面这段就是最小可用的配置片段路径和字段名都按 Claude Code 的实际约定来{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的密钥粘贴在这里, ANTHROPIC_MODEL: claude-sonnet-4-5 } }注意ANTHROPIC_BASE_URL只写到/api不要写成/api/v1。ANTHROPIC_MODEL的值要和你在控制台里能看到的模型 ID 完全一致大小写敏感。保存后重启 Claude Code让它重新读取配置。如果你用的是 Codex 或 Cline 这类工具配置思路一样只是文件名不同。Codex 读的是~/.codex/auth.json里面同样要写 Base URL 和 KeyCline 的 MCP 配置则在扩展设置里填。不管哪个工具记住「Base URL Key Model ID」这三件套必须成套出现少一个都连不上。配好之后先别急着拆技能包用一条最简单的请求验证连通性。在 Claude Code 里输入「你好回复一个字」如果它能正常回你说明三件套生效了。如果报 401多半是 Key 复制错了或过期如果报连接失败检查 Base URL 有没有写错。这一步过了再进入技能目录的拆解才有意义。3. 可复制的 skills 目录树与 PPT 技能包文件清单现在进入正题。Claude Code 的技能包目录结构是固定的你可以在~/.claude/skills/下看到每个技能一个文件夹。以 PPT 技能为例完整目录树长这样~/.claude/skills/ └── pptx/ ├── SKILL.md ├── pptxgenjs.md ├── editing.md ├── LICENSE.txt ├── settings.json ├── settings.local.json └── scripts/ ├── generate-pptx.js ├── edit-pptx.js ├── extract-content.js └── apply-template.js这个结构分四层来看最清楚。第一层是SKILL.md它是整个技能包的入口Claude 只认这个文件。第二层是参考资料pptxgenjs.md和editing.md相当于给 AI 看的 API 手册和操作指南。第三层是配置settings.json和settings.local.json控制默认行为。第四层是scripts/目录放真正干活的脚本。SKILL.md的内容结构也有讲究。开头是 YAML frontmatter声明技能名和描述Claude 靠这段文字判断「这个技能是干嘛的」。下面正文部分列能力清单、限制说明、调用示例。比如它会写明「支持生成多页 PPT、插入图表、使用模板」同时也会写「不支持复杂动画和 SmartArt」。这些限制不是随便写的是脚本实际能力的边界AI 照着执行就不会越界。scripts/里的四个脚本各管一段。generate-pptx.js接收 JSON 格式的大纲输出.pptx文件这是最常用的一个。edit-pptx.js负责改现有文件比如替换文字、换图片、加页。extract-content.js反过来从已有 PPT 里把文字、图片、表格抽出来。apply-template.js把模板套到生成结果上。这四个脚本基于 Node.js 和 pptxgenjs 库接口是固定的Claude 按SKILL.md里写的参数格式调用它们。配置文件这块settings.json是全局默认值settings.local.json是本地覆盖。后者通常加进.gitignore用来放个人偏好比如公司模板路径、常用字体。一个典型的中文配置片段如下{ defaultTheme: modern, defaultFont: Microsoft YaHei, defaultSlideSize: 16:9, maxSlides: 50, enableCharts: true, enableImages: true, outputDirectory: ./output }如果你要覆盖它就在settings.local.json里只写要改的字段比如把字体换成PingFang SC、输出目录换成./presentations、模板指向公司文件。Claude 读取时会先加载全局再叠加本地本地优先。这样你既保留了默认能力又能按项目定制。LICENSE.txt一般不用动它声明技能包的使用权限多数是 MIT 许可允许自由修改分发。真正需要你动手的只有settings.local.json和偶尔的SKILL.md扩展。把这份目录树和文件清单存下来下次看到别的技能包你也能一眼看出哪个文件管什么。4. 加载 PPT 技能后的实际调用验证与结果检查目录看懂了接下来要验证它真的能跑。验证分两步先确认 Claude 能识别到技能再确认脚本能生成文件。第一步在 Claude Code 里输入一句能触发技能的话比如「列出你当前可用的 skills」。正常情况下它会扫描~/.claude/skills/并返回技能列表你应该能看到pptx这一项。如果列表里没有说明目录位置放错了检查是不是放在了项目根目录而不是~/.claude/skills/下。第二步发一条真实的生成请求「帮我生成一个关于 Q2 销售数据的 5 页 PPT输出到 ./output 目录」。这时 Claude 会做几件事读SKILL.md确认能力读settings.json拿默认配置把需求整理成 JSON 大纲然后调用scripts/generate-pptx.js。你可以在终端里看到它执行脚本的命令行输出。脚本执行成功后./output目录下会出现一个.pptx文件。用ls -lh ./output看一下文件大小正常几页 PPT 在几十 KB 到几百 KB 之间。如果文件是 0 字节说明脚本报错了但被吞掉了需要看终端里的 stderr 输出。想更直观地验证内容可以用extract-content.js把生成的文件反向解析一遍node ~/.claude/skills/pptx/scripts/extract-content.js ./output/q2-sales.pptx这条命令会把 PPT 里的文字、图片数量、表格结构打印出来。如果输出里能看到你要求的标题和页数说明生成链路是通的。这一步特别适合排查「文件生成了但内容是空的」这类问题。再进一步你可以测试编辑能力。让 Claude「把刚才那份 PPT 的标题改成 Q2 销售复盘」它会调用edit-pptx.js。改完后再用extract-content.js检查标题是否真的变了。这一来一回就把生成、编辑、提取三个核心脚本都验证了一遍。验证过程中有个细节要注意脚本依赖 Node.js 环境和 pptxgenjs 库。如果报Cannot find module pptxgenjs说明依赖没装需要在技能目录下执行npm install pptxgenjs。这个报错很常见尤其是刚克隆技能包还没装依赖的时候。整个验证流程走完你对这个技能包的理解就从「看目录」升级到「看行为」了。知道每个文件在真实调用中扮演什么角色比单纯背目录树有用得多。5. 常见报错排查401、连接失败与 choices 解析异常配置和调用过程中有几类报错几乎每个人都会遇到。我把它们和对应的排查动作列出来你对着改就行。第一类是 401 未授权。报错信息通常是401 Unauthorized或invalid api key。原因无非三种Key 复制时带了空格、Key 已过期或被删除、Key 和 Base URL 不匹配比如用了 A 平台的 Key 去连 B 平台的地址。排查方法是回到控制台的 API Keys 页面重新生成一个 Key粘贴时注意首尾不要有换行。如果换了新 Key 还是 401检查settings.json里ANTHROPIC_BASE_URL是不是写成了https://taotoken.net/api/带了尾斜杠去掉它。第二类是连接失败报错类似local proxy failed或ECONNREFUSED。这类多半是网络层的问题不是 Key 的问题。先确认 Base URL 拼写正确再确认本机能不能访问该地址。如果你在settings.json里同时配了多个环境变量检查有没有互相覆盖。还有一种情况是 Claude Code 版本太旧不认新的配置字段升级到最新版通常能解决。第三类是reading choices相关的解析异常报错里会出现Cannot read properties of undefined (reading choices)。这个错误说明请求发出去了但返回的数据结构不是预期的格式。常见原因是 Model ID 写错了服务端返回了一个错误对象而不是正常的响应体客户端却按正常结构去解析。解决办法是把ANTHROPIC_MODEL改成控制台里确认存在的模型 ID重新请求。第四类是 OAuth 相关的报错比如OAuth token expired或authentication failed。如果你之前用过 OAuth 方式登录配置文件里可能残留了旧的 token 字段和新的 API Key 冲突。清理掉settings.json里所有oauth开头的字段只保留ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY、ANTHROPIC_MODEL这三项重启即可。第五类是脚本层面的报错比如generate-pptx.js执行时报SyntaxError或TypeError。这类通常和技能包本身有关可能是 Node.js 版本太低或者pptxgenjs版本不兼容。先跑node -v确认版本在 18 以上再到技能目录执行npm install重装依赖。如果还不行检查SKILL.md里写的调用参数格式和你实际传的是否一致。排查的核心思路是「分层定位」先确认三件套配置对不对再确认网络通不通最后才看脚本逻辑。大部分问题都出在第一层把 Base URL、Key、Model ID 对齐八成的报错就消失了。6. 把技能包用起来的下一步拆完这个 PPT 技能包你会发现 Claude Code 的 skills 机制其实很透明一个SKILL.md定义能力边界一组脚本负责执行配置文件控制默认行为。你完全可以照着这个结构把自己的重复性工作打包成技能。比如每周要出的数据周报、固定格式的合同草稿、常用的一组代码模板都可以做成技能包放进去。想继续深入的话建议先到模型对话页面把几个模型都试一遍感受不同模型在生成大纲时的差异这直接影响 PPT 脚本拿到的输入质量。如果你打算长期用 Claude Code 做编码和 Agent 类任务Coding Plan 会比按次调用更划算适合高频使用的场景。接入文档里有完整的参数说明和示例配置卡住时对着查最快。最后留一个实用习惯每次改完settings.local.json都用extract-content.js跑一遍验证确认改动真的生效了。配置文件写错但没报错的情况很常见主动验证比事后排查省事得多。