
1. 从“skills”这个标题说起它到底指什么第一次看到“skills”这个标题很多人会以为是某个技能培训课程或者一份简历上的能力清单。但结合热搜词里的 Agent Skills、Google Cloud、npx、Genkit、claude agent skills、codex skills 这些词来看这里说的“skills”其实是一个在 AI Agent 开发圈子里越来越热的概念——给 AI 智能体安装可复用的能力模块。你可以把它理解成给一个刚入职的实习生配一套“操作手册加工具箱”。Agent 本身有推理能力但它不知道你公司的代码规范、不知道你常用的部署流程、不知道你写论文时习惯用哪种引用格式。Skills 就是把这些领域知识、操作流程、工具调用方式打包成一个个独立模块Agent 需要的时候自己加载加载完就能按你的规矩干活。这个项目标题虽然只有“skills”一个词但它背后牵扯的东西不少怎么定义 skill、怎么安装、怎么在本地跑起来、怎么和 Google Cloud 上的 Genkit 配合、npx 在这里扮演什么角色、为什么有人用 codex 写论文也要装 skills。我接下来会把这些拆开讲清楚适合两类人看一是刚接触 Agent 开发、想搞明白 skills 到底怎么用的新手二是已经在用 Claude、Codex 这类工具但还没系统整理过自己 skill 库的老手。提示本文提到的所有操作均基于公开的开发工具和本地环境不涉及任何特殊网络配置。2. 核心思路拆解为什么 Agent 需要 Skills2.1 Agent 的“通才困境”与 Skills 的“专才补丁”大模型驱动的 Agent 有个天然矛盾它知识面极广但落到具体任务上往往不够专。你让它写一个 React 组件它能写但可能不符合你团队的目录结构、命名习惯、状态管理方案。你让它帮你分析一份实验数据它能分析但不知道你实验室的误差处理规范。Skills 解决的就是这个“最后一公里”的问题。它不试图重新训练模型而是在推理阶段动态注入领域知识。这就像你请了一个很聪明的顾问但他第一次来你公司你得先给他一份内部流程文档。Skills 就是那份文档只不过它是结构化的、可执行的、能被 Agent 自动读取的。从热搜词里能看到 “claude agent skills: a first principles deep dive” 这样的内容说明已经有人在从第一性原理层面思考这件事。我的理解是Agent 的能力等于基础模型能力乘以领域适配程度。基础模型能力已经很强了提升空间有限但领域适配程度可以从零到一这个乘数效应才是关键。2.2 Skills 与 MCP、npx 的关系辨析热搜里同时出现了 “claude mcpservers npx” 和 “npx playwright install失败”这两个词其实指向同一个技术底座npx。npx 是 Node.js 生态里的包执行工具它允许你不全局安装某个包就直接运行它。在 Agent Skills 的语境下npx 通常用来做两件事一是快速拉起一个 skill 的运行环境二是执行 skill 内部定义的工具脚本。MCP 是另一层概念全称是 Model Context Protocol你可以把它理解成 Agent 和外部工具之间的“插头标准”。Skills 更偏向“知识和流程”MCP 更偏向“工具和连接”。两者配合使用Skill 告诉 Agent 什么时候该用哪个工具MCP 负责实际调用那个工具。至于 Genkit这是 Google Cloud 推出的一个 AI 应用开发框架。它和 Skills 的结合点在于你可以用 Genkit 定义 skill 的输入输出 schema然后部署到云端让 Agent 通过 API 调用。热搜里 “Google Cloud” 和 “Genkit” 同时出现说明已经有人在探索云端 skill 的托管和分发。2.3 为什么是现在Skills 生态爆发的三个前提第一个前提是 Agent 框架的成熟。Claude、Codex 这些工具已经稳定到可以承载第三方扩展了。第二个前提是 npx 生态的普及让 skill 的分发和安装变得像 npm install 一样简单。第三个前提是社区需求从热搜词 “skills推荐”、“skills大全”、“codex好用的skills” 能看出来大家已经不满足于 Agent 的默认能力开始主动寻找和分享 skill。这三个前提叠加就形成了现在这个局面有人做 skill 开发有人做 skill 分发有人做 skill 评测还有人专门整理 “skills下载平台有哪些”。一个围绕 Agent 能力扩展的小生态正在成型。3. 核心细节解析一个 Skill 的解剖结构3.1 Skill 的目录结构与文件组成一个标准的 Agent Skill 通常包含以下文件my-skill/ ├── skill.json # 元数据名称、版本、描述、触发条件 ├── instructions.md # 给 Agent 的自然语言指令 ├── tools/ # 可执行工具脚本 │ ├── index.js │ └── helpers.js ├── templates/ # 输出模板 │ └── report.md └── tests/ # 测试用例 └── basic.test.jsskill.json是入口文件它告诉 Agent 这个 skill 叫什么、什么时候该加载、需要哪些权限。instructions.md是核心它用自然语言描述这个 skill 的工作流程。tools/目录放的是实际执行的代码通常用 JavaScript 或 Python 写。templates/放输出格式模板比如你希望 Agent 生成周报时遵循的固定结构。我见过有人把 skill 写成一个巨大的 markdown 文件所有逻辑都塞在 instructions 里。这样也能跑但维护起来很痛苦。更好的做法是把“知识”和“操作”分开instructions 里写“什么时候做什么”tools 里写“具体怎么做”。3.2 触发机制Agent 怎么知道该加载哪个 Skill这是 skill 设计里最容易被忽视但最关键的部分。Agent 不会自动加载所有 skill它需要根据当前任务判断该用哪个。触发机制通常有三种第一种是关键词触发。你在 skill.json 里定义一组关键词比如 “写论文”、“引用格式”、“文献综述”当用户输入包含这些词时Agent 就加载对应的 skill。这种方式简单直接但容易误触发。第二种是语义触发。Agent 用向量相似度判断当前任务和 skill 描述的匹配程度。这种方式更智能但需要额外的 embedding 计算。第三种是显式调用。用户直接说 “用论文写作 skill 帮我改这段”Agent 就精确加载。这种方式最可靠但需要用户知道 skill 的存在。我的经验是三者结合关键词做粗筛语义做精排显式调用做兜底。热搜里 “find skills” 这个词说明已经有人在解决“怎么让 Agent 找到合适的 skill”这个问题了。3.3 参数传递与上下文管理Skill 在执行过程中需要接收参数比如用户要处理的文件路径、目标格式、输出语言等。这些参数怎么传给 skill 的 tools 脚本是个需要设计的问题。常见做法是在 skill.json 里定义参数 schemaAgent 从对话中提取参数值然后以环境变量或命令行参数的形式传给 tools。比如{ name: paper-writer, parameters: { topic: { type: string, required: true }, citationStyle: { type: string, enum: [APA, MLA, Chicago], default: APA }, wordCount: { type: number, default: 3000 } } }Agent 解析用户输入 “帮我写一篇关于气候变化的论文用 APA 格式大概 5000 字”就会提取出 topic气候变化、citationStyleAPA、wordCount5000然后传给 skill。上下文管理是另一个坑。Skill 执行过程中可能需要读取之前的对话历史但全部塞进去会超出 token 限制。我的做法是在 skill 内部维护一个轻量级的上下文摘要只保留和当前任务相关的信息。4. 实操过程从零搭建一个可用的 Skill4.1 环境准备与依赖安装先确认本地有 Node.js 环境建议 18.x 以上。然后创建一个 skill 项目目录mkdir my-first-skill cd my-first-skill npm init -y npm install agent-skills/core如果你要用 Genkit 做云端部署还需要安装npm install genkit genkit-ai/google-cloud这里有个坑npx playwright install失败是热搜里的高频问题。如果你在 skill 里用 Playwright 做网页抓取安装浏览器二进制文件时可能会因为网络原因卡住。我的经验是设置PLAYWRIGHT_DOWNLOAD_HOST环境变量指向国内镜像或者直接用playwright-core加系统已有的 Chrome。注意skill 的依赖尽量精简。每多一个依赖安装失败的概率就多一分。能用原生 Node.js API 实现的就不要引入第三方包。4.2 编写 skill.json 与 instructions.mdskill.json是 skill 的身份证{ name: weekly-report, version: 1.0.0, description: 根据本周的 git commit 记录生成周报, triggers: [周报, weekly report, 本周总结], parameters: { repoPath: { type: string, required: true }, author: { type: string, required: false } }, tools: [tools/git-log.js, tools/format-report.js] }instructions.md是给 Agent 看的操作手册# 周报生成 Skill ## 工作流程 1. 调用 git-log.js 获取指定仓库最近 7 天的 commit 记录 2. 按作者筛选如果指定了 author 参数 3. 将 commit 信息按功能、修复、文档分类 4. 调用 format-report.js 生成 markdown 格式的周报 5. 输出结果并询问用户是否需要调整 ## 注意事项 - 如果 commit 信息为空提示用户检查仓库路径 - 分类时优先看 commit message 的前缀feat/fix/docs - 周报语言默认中文如果用户用英文提问则输出英文写 instructions 的诀窍是像给一个聪明但完全不了解你项目的同事写交接文档。不要假设 Agent 知道任何背景信息但也不要啰嗦到把每个细节都写死。4.3 实现 tools 脚本tools/git-log.js的核心逻辑const { execSync } require(child_process); function getCommits(repoPath, days 7) { const since new Date(Date.now() - days * 86400000).toISOString(); const cmd git -C ${repoPath} log --since${since} --prettyformat:%h|%an|%s; const output execSync(cmd, { encoding: utf-8 }); return output.split(\n).filter(Boolean).map(line { const [hash, author, message] line.split(|); return { hash, author, message }; }); } module.exports { getCommits };tools/format-report.js负责把 commit 列表转成周报function formatReport(commits, author) { const filtered author ? commits.filter(c c.author author) : commits; const categories { feat: [], fix: [], docs: [], other: [] }; filtered.forEach(c { const prefix c.message.split(:)[0].toLowerCase(); if (categories[prefix]) categories[prefix].push(c); else categories.other.push(c); }); let report # 本周工作周报\n\n; if (categories.feat.length) { report ## 新功能\n; categories.feat.forEach(c report - ${c.message}\n); } // ... 其他分类 return report; }这两个脚本通过 skill.json 里的 tools 字段被 Agent 调用。Agent 会根据 instructions 里的流程先调 git-log再调 format-report最后把结果返回给用户。4.4 本地测试与调试写完 skill 后用 npx 直接跑测试npx agent-skills/cli test ./my-first-skill这个命令会模拟 Agent 的加载流程检查 skill.json 格式、instructions 可读性、tools 脚本能否正常执行。如果报错优先看 skill.json 的 schema 是否符合规范再看 tools 脚本的输入输出是否和 instructions 描述一致。我调试 skill 时习惯加一个--verbose参数把 Agent 的决策过程打印出来。这样能看到它为什么选择加载这个 skill、为什么按这个顺序调用 tools。很多时候问题不在代码而在 instructions 写得不够明确导致 Agent 理解偏了。5. 常见问题与排查技巧实录5.1 Skill 加载失败的五种典型情况现象可能原因排查方法Agent 完全不加载 skillskill.json 路径不对或格式错误用npx agent-skills/cli validate检查加载了但没执行triggers 关键词不匹配在对话中显式说出触发词测试执行到一半报错tools 脚本依赖缺失检查 node_modules 和系统依赖输出格式不对instructions 描述模糊在 instructions 里加输出示例多个 skill 冲突触发条件重叠调整 triggers 或加优先级字段5.2 npx 相关问题的独家避坑技巧热搜里 “npx playwright install失败” 和 “claude mcpservers npx” 同时出现说明 npx 在 skill 生态里既是入口也是坑点。我踩过的坑包括npx 缓存导致旧版本 skill 被加载。解决方法是加--ignore-existing参数强制拉最新版。npx 执行时权限不足。在 Linux 上不要用 sudo 跑 npx而是用 nvm 管理 Node.js 版本。公司网络限制 npm registry 访问。可以配置.npmrc指向内部镜像源。提示如果你的 skill 依赖 Playwright 做浏览器自动化建议在 skill 初始化时检测浏览器是否已安装没安装就自动触发安装而不是等到执行时才报错。5.3 Skill 开发中的三个反直觉经验第一个反直觉经验instructions 不是写得越详细越好。我一开始把每个步骤都写死结果 Agent 遇到稍微不同的输入就卡住了。后来改成“目标导向”的写法只写清楚要达成什么结果、有哪些约束具体步骤让 Agent 自己规划反而更稳定。第二个反直觉经验tools 脚本要尽量“笨”。不要在 tools 里做复杂的条件判断那些逻辑应该放在 instructions 里让 Agent 决策。tools 只做确定性的事情比如读文件、调 API、格式化输出。第三个反直觉经验测试用例要覆盖“错误路径”。很多人只测试正常流程但实际使用中 Agent 经常会遇到参数缺失、文件不存在、API 超时等情况。我在每个 skill 里都加了至少三个错误场景的测试确保 Agent 能优雅地处理异常。6. Skills 的进阶玩法与生态观察6.1 用 Genkit 把 Skill 部署到云端本地 skill 有个局限换台机器就要重新配置。用 Genkit 可以把 skill 打包成云函数通过 API 调用。基本流程是npx genkit init # 选择 Google Cloud 作为部署目标 npx genkit deploy部署后你会得到一个 HTTPS 端点Agent 通过 MCP 协议连接这个端点就能使用 skill。这样做的好处是团队共享方便坏处是增加了网络延迟和运维成本。我的建议是个人用的 skill 本地跑团队共用的 skill 上云。6.2 Skill 的组合与编排单个 skill 能力有限但多个 skill 可以组合。比如“论文写作 skill”加“文献检索 skill”加“格式检查 skill”就能覆盖从选题到定稿的全流程。组合的关键是定义好 skill 之间的输入输出接口让上一个 skill 的输出能直接作为下一个的输入。热搜里 “superpower skills” 这个词可能指的就是这种组合后的增强能力。我试过把五个小 skill 串成一条流水线处理效率比单个大 skill 高不少而且每个小 skill 更容易维护和复用。6.3 从热搜词看 Skills 生态的下一步“skills下载平台有哪些”、“skills大全”、“skills推荐”这些词说明需求端已经起来了但供给端还比较分散。目前大家获取 skill 的渠道主要是 GitHub 仓库、社区分享、个人整理。未来可能会出现专门的 skill 市场有评分、有版本管理、有依赖解析。“自动挖洞skills”和“分镜skills下载”这两个词很有意思说明 skill 已经渗透到安全测试和内容创作这些垂直领域了。安全领域的 skill 需要特别小心权限控制内容创作领域的 skill 则更看重输出质量和风格一致性。“codex写论文的skills”和“nature skills”放在一起看学术写作可能是 skill 落地最快的场景之一。因为学术写作有明确的格式规范、引用标准、结构要求这些正好是 skill 擅长处理的。7. 我个人的 Skill 管理习惯我本地有一个~/.agent-skills/目录所有 skill 按领域分文件夹存放writing/、coding/、research/、ops/。每个 skill 独立 git 仓库方便追踪修改。常用的 skill 我会在 Agent 配置里设为自动加载不常用的保持手动触发。每周我会花半小时整理 skill 库删掉三个月没用过的更新依赖版本把重复功能的 skill 合并。这个习惯让我从最初的十几个 skill 精简到现在的七个但实际覆盖的场景反而更多了。最后分享一个小技巧给每个 skill 写一个CHANGELOG.md记录每次修改的原因和影响。当你半年后回头看某个 skill 为什么这么设计时这个文件能救你的命。