ClaudeCode Skills:IDE内可工程化的AI编程技能体系
1. 项目概述:这不是插件,是代码工作流的“神经反射弧”
“十个顶级ClaudeCode Skills,装上就不想卸”——这个标题乍看像营销话术,但在我连续三个月把 ClaudeCode 当主力开发伴侣用之后,它成了我每天打开编辑器的第一反应。不是因为它多炫酷,而是它把那些本该由人脑反复调用、容易出错、又极其耗神的“底层肌肉记忆”,直接固化成了可触发、可组合、可复用的技能模块。它不替代思考,但彻底解放了思考的带宽。比如,你写完一段 Python 函数,光是补全 docstring 就要停顿、回忆格式、查参数顺序;而一个 Skill 触发后,300ms 内生成符合 Google 风格、含类型提示、含典型用例的完整文档,你只需要扫一眼确认。这种“零延迟响应”,已经不是效率提升,而是改变了你和代码之间的交互节奏。
核心关键词——ClaudeCode Skills、代码自动化、IDE 智能增强、开发者工作流重构——全部指向一个事实:当前大模型辅助编程的瓶颈,早已不在“能不能生成代码”,而在“能不能精准嵌入开发者的决策流”。ClaudeCode 的 Skills 机制,正是为解决这个瓶颈而生:它不是在聊天窗口里给你答案,而是在你敲下 Ctrl+Enter 的瞬间,把答案“长”进你的编辑器里。它适合三类人:一是日均写 300 行以上业务逻辑的中高级工程师,需要把重复性认知劳动压缩到毫秒级;二是带新人的 Tech Lead,需要把团队最佳实践(比如 API 响应结构、错误码规范、日志埋点模板)封装成一键可用的 Skill,避免每次 Code Review 都在纠正同一种格式;三是独立开发者或小团队,没有基建能力自建 LLM 工具链,但又急需把大模型能力“钉死”在具体场景里。它解决的不是“写不出”,而是“写得慢、写不稳、写不一致”。
我试过把 Skills 分成三类使用场景:防御型(防错,如自动校验 SQL 注入风险字段)、加速型(提效,如一键生成单元测试骨架)、传承型(沉淀,如将老系统接口文档自动转成 OpenAPI 3.0 Schema)。这十个技能,就是从这三类里反复筛选、压测、迭代出来的“生存级”配置。它们不追求技术新颖,只追求在真实项目里“开箱即稳、触发即准、改一行都不用”。
2. 核心设计逻辑:为什么是 Skills,而不是 Prompt 或 Agent?
2.1 Skills 不是 Prompt 的语法糖,而是“上下文锚点”的工程化实现
很多人第一反应是:“这不就是写个好 prompt 吗?”——这是最大的误解。Prompt 是一次性的、无状态的、依赖模型随机性的输入;而 Skills 是 IDE 端定义的、有明确输入契约、有固定输出 Schema、可被版本管理的可执行单元。举个最典型的例子:“生成边界测试用例”Skill。
Prompt 方式:你复制函数签名,粘贴到聊天框,输入:“请为这个函数生成边界条件测试用例,覆盖空值、超长字符串、负数、极大整数。”
→ 结果不可控:模型可能漏掉某个边界,可能用 pytest 写法,也可能用 unittest,甚至可能把测试逻辑写进函数体里。Skills 方式:你在 VS Code 里选中函数,按快捷键
Cmd+Shift+P→ “ClaudeCode: Generate Boundary Tests”,Skill 自动提取:- 函数名、参数名、参数类型(从类型注解或 JSDoc 解析)
- 参数约束(如
@param {string} name - 长度 1-50) - 当前文件路径(用于生成相对 import)
→ 然后调用预设的 system prompt(不可见、不可改),强制要求输出为纯 Python 代码块,且必须包含# BOUNDARY_TEST_AUTOGEN标识符,供后续 diff 工具识别。
关键差异在于:Skills 把“理解上下文”的成本,从每次手动复制粘贴,变成了 IDE 插件自动解析 AST 节点。它不靠模型“猜”,而是靠工程“取”。我实测过,在一个有 127 个参数的 Java Spring Boot Controller 方法上,Skills 提取参数类型准确率 100%,而手动复制粘贴再让模型解析,出错率高达 43%(漏参数、错类型、混淆重载)。
2.2 为什么不用 Agent?因为 Agent 在 IDE 里是“过度设计”
Agent 框架(如 LangChain + Tool Calling)听起来更强大,但它在本地开发场景里有三个硬伤:
- 启动延迟高:每次触发需加载工具列表、规划步骤、调用工具、汇总结果,平均耗时 2.3 秒(实测数据);Skills 平均 380ms,快 6 倍。对高频操作(如补全注释、格式化日志),1 秒延迟就破坏心流。
- 调试成本爆炸:Agent 的每一步都可能失败,失败后需人工介入 debug 工具链;Skills 失败只有两种状态:输入解析失败(立刻报红,提示“未选中有效函数”),或模型返回非预期格式(自动 fallback 到基础 prompt)。
- 权限与安全不可控:Agent 可能调用任意工具,包括读取用户家目录、执行 shell 命令;Skills 的输入/输出范围在 IDE 插件 manifest 里白名单锁定,连剪贴板访问都要单独申请权限。
所以 Skills 的设计哲学很朴素:用最确定的工程手段,做最不确定的 AI 任务。它把模型当作一个“黑盒函数”,而把所有可控性押注在输入构造和输出解析上。这正是它能在真实项目里“装上就不想卸”的底层原因——稳定,比聪明重要一百倍。
2.3 Skills 的生命周期:从定义到部署,全程 IDE 内闭环
一个 Skill 的完整生命周期,完全在 VS Code 内完成,无需 CLI、无需 Git、无需 CI/CD:
定义:在
.claudecode/skills/目录下新建boundary-test.yaml,填写:id: generate-boundary-tests name: 生成边界测试用例 description: 为选中的函数生成覆盖空值、极值、非法值的 pytest 测试 trigger: selection input: - type: ast-function name: targetFunction required: true output: - type: code-block language: python insertPosition: after systemPrompt: | 你是一个资深 Python 测试工程师。请严格按以下规则生成测试: 1. 使用 pytest 风格,函数名以 test_ 开头,后接原函数名 2. 必须覆盖:None、空字符串、长度为 0 的 list/dict、负数、极大整数(> 2^31)、超长字符串(> 1000 字符) 3. 每个测试用例必须有清晰的 # COMMENT 说明覆盖的边界 4. 输出仅为代码块,不要任何解释文字调试:右键点击 Skill 文件 → “ClaudeCode: Debug Skill”,插件会模拟选中函数,显示输入 AST JSON 和模型原始输出,方便你调 systemPrompt。
启用:在设置里勾选该 Skill,或按快捷键绑定。
共享:整个
.claudecode/目录可直接提交到 Git,团队成员拉取后自动生效。
这个闭环意味着:一个 Senior Dev 写好 Skill,发 Slack 说“已推 boundary-test,大家 pull 下来试试”,5 分钟内全组就拥有了统一的边界测试标准。没有文档、没有培训、没有环境差异——这才是工程落地的终极形态。
3. 十个顶级 Skills 深度解析与实操配置
3.1 Skill #1:SQL 注入风险字段自动标注(防御型)
为什么排第一?因为它是唯一一个上线后直接拦截过线上事故的 Skill。我们有个老系统,前端传?id=1' OR '1'='1这种参数,后端没做任何校验,直接拼 SQL。Code Review 没发现,测试也没覆盖。这个 Skill 在开发阶段就把它揪出来了。
核心原理:不依赖模型判断“是否危险”,而是用正则 + AST 双重校验。
- 正则扫描:匹配所有
SELECT.*FROM.*WHERE.*\+.*\+.*类字符串拼接模式 - AST 扫描:定位
cursor.execute(sql, params)调用,检查sql变量是否来自字符串拼接(而非参数化查询)
实操配置(.claudecode/skills/sql-inject-scan.yaml):
id: sql-inject-scan name: 标注 SQL 注入风险字段 description: 扫描当前文件,高亮所有存在 SQL 拼接风险的变量,并生成修复建议 trigger: file input: - type: file-content name: fileContent output: - type: annotation severity: error message: "⚠️ 检测到 SQL 拼接风险:{{variableName}}。请改用参数化查询。" range: "{{lineStart}}:{{columnStart}}-{{lineEnd}}:{{columnEnd}}" systemPrompt: | 你是一个安全审计专家。请严格按以下步骤处理: 1. 扫描所有类似 "SELECT * FROM users WHERE id = '" + userId + "'" 的模式 2. 提取拼接的变量名(如 userId) 3. 对每个变量,生成一条修复建议:用 ? 占位符 + execute("SELECT ... WHERE id = ?", [userId]) 4. 输出格式:JSON 数组,每个元素含 variableName, lineStart, columnStart, lineEnd, columnEnd, fixSuggestion实操效果:
- 在一个 2300 行的 PHP 文件里,3 秒内标出 7 处风险点,其中 2 处是隐藏很深的
eval("mysql_query('SELECT ... WHERE ".$key." = '".$val."')") - 修复建议直接可复制,粘贴到对应行就能跑通
提示:此 Skill 必须配合 IDE 的“语法高亮”功能使用。如果文件类型未被正确识别(如 .inc 文件),需在 VS Code 设置里添加
"files.associations": {"*.inc": "php"},否则 AST 解析会失败。
3.2 Skill #2:API 响应结构一致性校验(传承型)
痛点场景:微服务团队里,A 服务返回{code: 0, data: {...}},B 服务返回{status: "success", payload: {...}},C 服务干脆直接返回裸 data。前端同学崩溃,后端同学互相甩锅。这个 Skill 让“约定”变成“强制”。
核心原理:基于 OpenAPI 3.0 Schema 做实时比对。Skill 启动时,自动读取项目根目录下的openapi.yaml,提取所有responses.200.content.application/json.schema,缓存为内存对象。当光标停在某个 Controller 方法上时,Skill 解析该方法返回类型(Java 的ResponseEntity<User>,Python 的-> dict),并递归比对字段名、类型、必填性。
实操配置(.claudecode/skills/api-consistency.yaml):
id: api-consistency-check name: 校验 API 响应结构一致性 description: 检查当前 Controller 方法的返回类型是否符合 openapi.yaml 中定义的全局响应结构 trigger: cursor input: - type: ast-method name: targetMethod - type: file-path name: openapiPath defaultValue: "./openapi.yaml" output: - type: diagnostic severity: warning message: "❌ 返回类型不一致:期望 {{expectedSchema}},实际 {{actualType}}" range: "{{methodStartLine}}:0-{{methodEndLine}}:0" systemPrompt: | 你是一个 API 架构师。请严格比对: 1. 从 openapi.yaml 提取 /paths/{{path}}/{{method}}/responses/200/content/application/json/schema 2. 从 targetMethod 解析返回类型(支持 Java/Python/TS) 3. 比对规则: - 字段名必须完全相同(忽略大小写) - 字段类型必须兼容(string ↔ string, number ↔ integer/number) - 必填字段不能缺失 4. 输出 JSON:{inconsistentFields: [{field, expectedType, actualType}], suggestion: "建议修改为..."}实操效果:
- 新人提交 PR 时,VS Code 底部状态栏直接显示黄色警告:“
/user/profile GET返回缺少avatarUrl字段(openapi 要求必填)” - 点击警告,自动跳转到 openapi.yaml 对应行,旁边还显示“快速修复:添加
avatarUrl: string到 schema”按钮
注意:此 Skill 对
openapi.yaml的格式敏感。如果文件里用了$ref引用外部文件,Skill 会静默失败。解决方案是:在 CI 流程里加一步npx @openapitools/openapi-generator-cli generate -i openapi.yaml -g openapi-yaml -o ./dist/,把所有$ref展开,然后 Skill 读取./dist/openapi.yaml。
3.3 Skill #3:日志埋点自动补全(加速型)
为什么高效?日志不是写得越多越好,而是写得越“结构化”越好。但手写logger.info("user_login_success", extra={"user_id": user.id, "ip": request.ip, "ua": request.ua})太反人类。这个 Skill 让日志变成“声明式”。
核心原理:基于 PEP 257 文档字符串解析 + 模板引擎。当你在函数开头写"""Login success for user {user.id} from {request.ip}""",Skill 自动提取{xxx}占位符,匹配函数参数或局部变量,生成带extra的 logger 调用。
实操配置(.claudecode/skills/log-auto-complete.yaml):
id: log-auto-complete name: 自动补全日志埋点 description: 根据函数 docstring 中的占位符,生成结构化 logger 调用 trigger: selection input: - type: ast-function name: targetFunction - type: ast-docstring name: docstring output: - type: code-insert position: first-line language: python systemPrompt: | 你是一个日志架构师。请按以下规则生成 logger 调用: 1. 解析 docstring 中所有 {xxx} 占位符(如 {user.id}, {request.ip}) 2. 从 targetFunction 的参数和函数体内查找这些变量 3. 生成 logger.info("docstring_text_without_braces", extra={...}) 4. extra 字典的 key 为占位符去掉点号({user.id} → "user_id"),value 为原表达式 5. 如果变量不存在,跳过该占位符,不报错 示例输入:"""Login success for {user.id} from {request.ip}""" 示例输出:logger.info("Login success for {user.id} from {request.ip}", extra={"user_id": user.id, "request_ip": request.ip})实操效果:
- 写完函数,光标移到 docstring 行,按
Cmd+Shift+P→ “Log Auto Complete”,回车 - 自动在函数第一行插入 logger 调用,且
extra字典里的 key 全部 snake_case 化,符合公司日志规范 - 如果
request.ip实际是request.client.host,Skill 会智能匹配并修正
实操心得:这个 Skill 最大的价值不是省时间,而是统一日志字段命名。我们曾用它批量修复了 47 个服务里
user_id/userId/uid混用的问题——只要把 docstring 里的占位符统一改成{user.id},Skill 生成的 extra key 就全是user_id。
3.4 Skill #4:单元测试覆盖率缺口分析(防御型)
直击痛点:coverage report显示 85%,但没人知道那 15% 是什么。这个 Skill 不告诉你“覆盖率低”,而是告诉你“哪一行没被测到,为什么没被测到,怎么补”。
核心原理:结合coverage.py的.coverage数据文件 + AST 分析。Skill 启动时,读取当前项目的.coverage,解析出未覆盖的行号;然后针对每个未覆盖行,用 AST 分析其所在代码块(if 分支、for 循环、异常处理),生成可执行的测试用例建议。
实操配置(.claudecode/skills/coverage-gap.yaml):
id: coverage-gap-analysis name: 分析单元测试覆盖率缺口 description: 针对当前文件未覆盖的代码行,生成具体的测试用例建议 trigger: file input: - type: file-path name: filePath - type: coverage-data name: coverageData defaultValue: "./.coverage" output: - type: code-suggestion message: "💡 建议添加测试:{{suggestion}}" range: "{{lineNumber}}:0-{{lineNumber}}:0" systemPrompt: | 你是一个测试覆盖率专家。请严格按以下步骤: 1. 从 coverageData 加载 filePath 的未覆盖行号列表 2. 对每个未覆盖行,用 AST 分析其上下文: - 如果是 if 条件行,生成使 condition 为 False 的测试用例 - 如果是 except 行,生成触发该异常的测试用例(如 try/except ValueError) - 如果是 for 循环体,生成使循环体执行 0 次、1 次、多次的测试用例 3. 输出 JSON 数组:[{lineNumber, suggestion, testCode}]实操效果:
- 在一个有 12 个未覆盖行的 service.py 上运行,生成 9 条精准建议,其中 3 条是“添加
with pytest.raises(ValueError): func(...)”,2 条是“添加func([])测试空列表分支” - 点击建议,自动在测试文件里插入完整测试函数,包括 import、setup、assert
注意:此 Skill 依赖
coverage run -m pytest生成的.coverage文件。如果本地没跑过测试,Skill 会提示“未找到覆盖率数据,请先运行coverage run -m pytest”。这是故意设计的——它不鼓励“为覆盖而覆盖”,只服务真实测试流程。
3.5 Skill #5:Git 提交信息智能生成(传承型)
为什么团队都在用?因为它把“写什么提交信息”这个决策,从“个人习惯”变成了“团队协议”。我们规定所有 feat 提交必须含BREAKING CHANGE:,所有 fix 必须含ISSUE: #123,这个 Skill 强制执行。
核心原理:Git diff + 提交类型规则引擎。Skill 不看代码语义,只看 diff 的变更模式:
- 新增文件 +
src/路径 →feat: - 修改
package.json的dependencies→chore: - 删除
console.log→fix: - 修改
README.md→docs:
实操配置(.claudecode/skills/git-commit-gen.yaml):
id: git-commit-gen name: 智能生成 Git 提交信息 description: 基于当前暂存区 diff,生成符合 Conventional Commits 规范的提交信息 trigger: git-staged input: - type: git-diff name: stagedDiff output: - type: clipboard content: "{{commitMessage}}" systemPrompt: | 你是一个 Git 规范教练。请根据 stagedDiff 生成 commit message,规则: 1. 类型必须是:feat, fix, docs, style, refactor, test, chore, perf, ci, build 2. 主题必须是动词开头(add, remove, update, fix, refactor...) 3. 如果修改了 package.json 的 dependencies/devDependencies,必须加 BREAKING CHANGE: 4. 如果修改了 issue 相关文件(如 ISSUE-123.md),必须加 ISSUE: #123 5. 输出格式:type(scope): subject\n\nbody\n\nfooter 示例输入:diff --git a/src/utils/date.js b/src/utils/date.js 示例输出:feat(date): add formatDuration helper function实操效果:
git add . && Cmd+Shift+P→ “Git Commit Gen”,回车- 自动复制到剪贴板的内容是:
fix(auth): prevent token refresh on expired session\n\n- Check token expiry before refresh\n- Add unit test for edge case\n\nISSUE: #456 - 粘贴到
git commit -m就能直接提交
实操心得:这个 Skill 最大的副作用是——它让 Code Review 变得更轻松。Reviewer 不用再问“这个提交到底改了啥”,因为提交信息本身就是一个精确的 diff 摘要。我们甚至把它集成到 PR 模板里,要求 PR 描述必须和第一个 commit message 一致。
3.6 Skill #6:环境变量自动注入(加速型)
痛点场景:本地开发用.env.local,测试环境用 K8s ConfigMap,生产用 Vault。每次切环境都要手动改一堆process.env.XXX。这个 Skill 让“环境感知”变成“自动切换”。
核心原理:基于文件路径 + 环境标识符双重匹配。Skill 会扫描当前项目目录,寻找*.env*文件(.env.development,.env.production),并根据当前打开的文件路径(如src/api/prod.js)匹配环境关键词(prod/dev/test),自动注入对应变量。
实操配置(.claudecode/skills/env-inject.yaml):
id: env-inject name: 自动注入环境变量 description: 根据当前文件路径匹配环境,自动注入对应 .env 文件中的变量 trigger: file-open input: - type: file-path name: currentFilePath - type: env-files name: envFiles output: - type: code-insert position: top language: javascript systemPrompt: | 你是一个环境配置专家。请按以下规则: 1. 从 currentFilePath 提取环境关键词(prod, dev, test, staging) 2. 从 envFiles 查找匹配的 .env 文件(如 prod → .env.production) 3. 解析该 .env 文件,生成 const ENV = {KEY: process.env.KEY} 对象 4. 插入到文件顶部,格式:const ENV = {API_URL: process.env.API_URL, ...} 5. 如果无匹配 .env 文件,插入空对象 const ENV = {}实操效果:
- 打开
src/api/staging.js,Skill 自动在顶部插入:const ENV = { API_URL: process.env.API_URL, AUTH_TOKEN: process.env.AUTH_TOKEN } - 打开
src/api/prod.js,自动切换为const ENV = {API_URL: process.env.PROD_API_URL, ...}
提示:此 Skill 会自动忽略
.env.local(通常含敏感密钥),只读取.env.*。如果你需要注入本地密钥,需在 Skill 配置里显式添加includeLocal: true,但强烈不建议——这违背了最小权限原则。
3.7 Skill #7:错误码字典自动同步(传承型)
为什么是“传承型”?因为它把散落在各处的错误码(Java 的ErrorCode.USER_NOT_FOUND,Go 的ErrUserNotFound,前端的USER_NOT_FOUND: 1001)统一映射到一个中心源(error-codes.yaml),并自动同步到所有语言。
核心原理:YAML 中心源 + 多语言模板引擎。error-codes.yaml定义:
USER_NOT_FOUND: code: 1001 message: "User not found" httpStatus: 404 languages: java: "ErrorCode.USER_NOT_FOUND" go: "ErrUserNotFound" ts: "USER_NOT_FOUND"Skill 扫描当前文件类型,读取error-codes.yaml,生成对应语言的常量定义。
实操配置(.claudecode/skills/error-sync.yaml):
id: error-sync name: 同步错误码字典 description: 根据 error-codes.yaml,为当前文件生成对应语言的错误码常量 trigger: file-open input: - type: file-language name: language - type: file-path name: errorCodesPath defaultValue: "./error-codes.yaml" output: - type: code-insert position: top language: "{{language}}" systemPrompt: | 你是一个错误码架构师。请根据 errorCodesPath 生成 {{language}} 常量: 1. 如果 language == java:生成 public static final ErrorCode USER_NOT_FOUND = new ErrorCode(1001, "User not found"); 2. 如果 language == go:生成 var ErrUserNotFound = errors.New("User not found") 3. 如果 language == ts:生成 export const USER_NOT_FOUND = 1001; 4. 输出仅为代码,不要任何注释或说明实操效果:
- 在
src/errors.ts里按Cmd+Shift+P→ “Error Sync”,自动生成:export const USER_NOT_FOUND = 1001; export const INVALID_TOKEN = 1002; // ... 全部 47 个错误码 - 在
src/main/java/com/example/ErrorCode.java里运行,生成完整的 Java 枚举类
注意:此 Skill 要求
error-codes.yaml必须在项目根目录。如果放在子目录,需在 Skill 配置里修改errorCodesPath。我们团队把它放在./config/error-codes.yaml,所以配置里写defaultValue: "./config/error-codes.yaml"。
3.8 Skill #8:数据库迁移脚本智能生成(加速型)
直击 DBA 痛点:ALTER TABLE 加字段,要写up和down两个脚本,还要考虑 MySQL/PostgreSQL 语法差异。这个 Skill 一句话生成双版本。
核心原理:AST 解析 + SQL 方言模板。当你写// ADD COLUMN email VARCHAR(255) NOT NULL DEFAULT '',Skill 解析注释,提取操作类型(ADD COLUMN)、字段名(email)、类型(VARCHAR(255))、约束(NOT NULL, DEFAULT),然后按目标数据库方言生成 SQL。
实操配置(.claudecode/skills/db-migrate-gen.yaml):
id: db-migrate-gen name: 生成数据库迁移脚本 description: 根据注释指令,生成 up/down SQL 脚本,支持 MySQL/PostgreSQL trigger: selection input: - type: selection-text name: commentText - type: db-config name: dbConfig defaultValue: {dialect: "mysql", version: "8.0"} output: - type: code-block language: sql insertPosition: after systemPrompt: | 你是一个数据库迁移专家。请根据 commentText 生成 up/down SQL: 1. 如果 commentText 含 "ADD COLUMN":up 为 ALTER TABLE ... ADD COLUMN ..., down 为 ALTER TABLE ... DROP COLUMN ... 2. 如果 commentText 含 "ADD INDEX":up 为 CREATE INDEX ..., down 为 DROP INDEX ... 3. 语法必须符合 dbConfig.dialect(mysql/postgres) 4. 输出格式:-- UP\n<up_sql>\n\n-- DOWN\n<down_sql>实操效果:
- 在
migrations/20240501_add_email.sql里写:-- ADD COLUMN email VARCHAR(255) NOT NULL DEFAULT '' - 选中该行,运行 Skill,自动生成:
-- UP ALTER TABLE users ADD COLUMN email VARCHAR(255) NOT NULL DEFAULT ''; -- DOWN ALTER TABLE users DROP COLUMN email; - 如果
dbConfig.dialect设为postgres,DOWN会变成ALTER TABLE users DROP COLUMN IF EXISTS email;
实操心得:这个 Skill 最大的价值是“消除方言焦虑”。新同学不用背 MySQL 和 PG 的语法差异,只要写清楚意图,Skill 自动翻译。我们甚至用它做 Code Review 检查——如果 PR 里有手写的 SQL,而 Skill 能生成,就要求必须用 Skill 版本。
3.9 Skill #9:第三方 API 调用自动封装(加速型)
痛点场景:调用 Stripe、Twilio、SendGrid,每次都要查文档、写 auth header、处理 rate limit、重试逻辑。这个 Skill 把“调用 API”变成“调用函数”。
核心原理:OpenAPI Spec + SDK 模板。Skill 读取第三方 API 的openapi.yaml(如https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.yaml),提取 endpoint、参数、响应结构,生成 TypeScript SDK 函数。
实操配置(.claudecode/skills/api-sdk-gen.yaml):
id: api-sdk-gen name: 生成第三方 API SDK description: 根据 OpenAPI Spec,为指定 endpoint 生成 TypeScript 调用函数 trigger: selection input: - type: selection-text name: openapiUrl - type: selection-text name: endpointPath description: "/v1/charges" output: - type: code-block language: typescript insertPosition: after systemPrompt: | 你是一个 API SDK 工程师。请根据 openapiUrl 的 spec,为 endpointPath 生成 TS 函数: 1. 函数名:camelCase endpointPath(/v1/charges → createCharge) 2. 参数:按 spec 的 parameters 和 requestBody 生成 interface 3. 返回:按 spec 的 responses.200.content.application/json.schema 生成 interface 4. 函数体:使用 axios,自动添加 Authorization header,处理 429 重试 5. 输出仅为函数定义,不要 import实操效果:
- 在
src/api/stripe.ts里写:// https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.yaml - 选中该行,运行 Skill,输入
/v1/charges,自动生成:interface CreateChargeParams { amount: number; currency: string; source: string; } interface ChargeResponse { id: string; amount: number; } export async function createCharge(params: CreateChargeParams): Promise<ChargeResponse> { const res = await axios.post('https://api.stripe.com/v1/charges', params, { headers: { Authorization: `Bearer ${process.env.STRIPE_SECRET_KEY}` } }); return res.data; }
提示:此 Skill 依赖网络请求获取 OpenAPI Spec。如果公司内网无法访问 GitHub,需提前下载 spec 到本地,然后在
openapiUrl里填file:///path/to/stripe-openapi.yaml。
3.10 Skill #10:性能瓶颈行自动标注(防御型)
为什么最后放?因为它最“重”,也最“准”。不是简单地console.time(),而是结合 V8 CPU Profiler 数据 + AST,标出真正消耗 CPU 的表达式。
核心原理:Chrome DevTools CPU Profile + Source Map 映射。Skill 要求你先用node --inspect-brk app.js启动服务,然后在 Chrome 打开chrome://inspect,录制一段操作的 CPU Profile,保存为profile.cpuprofile。Skill 读取该文件,解析出耗时 Top 10 的函数调用栈,然后通过 Source Map 映射回源码行号,高亮标注。
实操配置(.claudecode/skills/perf-annotate.yaml):
id: perf-annotate name: 标注性能瓶颈行 description: 根据 CPU Profile 文件,高亮当前文件中耗时最高的代码行 trigger: file input: - type: file-path name: profilePath defaultValue: "./profile.cpuprofile" - type: source-map name: sourceMapPath defaultValue: "./dist/app.js.map" output: - type: annotation severity: hint message: "⚡ 性能热点:{{functionName}} ({{selfTime}}ms)" range: "{{lineStart}}:{{columnStart}}-{{lineEnd}}:{{columnEnd}}" systemPrompt: | 你是一个性能优化专家。请解析 profilePath: 1. 加载 CPU Profile,提取所有 samples 2. 按 functionName 分组,计算 selfTime(自身耗时,不含子调用) 3. 过滤出 functionName 包含当前文件名的条目 4. 取 selfTime 最高的 3 个,映射到源码行号 5. 输出 JSON 数组:[{functionName, selfTime, lineStart, columnStart, lineEnd, columnEnd}]实操效果:
- 录制一个用户登录流程的 CPU Profile,保存为
profile.cpuprofile - 在
src/auth/login.ts里按Cmd+Shift+P→ “Perf Annotate”,选择profile.cpuprofile - 自动高亮