ClaudeCode Skills:IDE内可工程化的AI编程技能体系

📅 2026/7/6 3:57:31 👤 编程新知 🏷️ 技术资讯
ClaudeCode Skills:IDE内可工程化的AI编程技能体系 1. 项目概述这不是插件是代码工作流的“神经反射弧”“十个顶级ClaudeCode Skills装上就不想卸”——这个标题乍看像营销话术但在我连续三个月把 ClaudeCode 当主力开发伴侣用之后它成了我每天打开编辑器的第一反应。不是因为它多炫酷而是它把那些本该由人脑反复调用、容易出错、又极其耗神的“底层肌肉记忆”直接固化成了可触发、可组合、可复用的技能模块。它不替代思考但彻底解放了思考的带宽。比如你写完一段 Python 函数光是补全 docstring 就要停顿、回忆格式、查参数顺序而一个 Skill 触发后300ms 内生成符合 Google 风格、含类型提示、含典型用例的完整文档你只需要扫一眼确认。这种“零延迟响应”已经不是效率提升而是改变了你和代码之间的交互节奏。核心关键词——ClaudeCode Skills、代码自动化、IDE 智能增强、开发者工作流重构——全部指向一个事实当前大模型辅助编程的瓶颈早已不在“能不能生成代码”而在“能不能精准嵌入开发者的决策流”。ClaudeCode 的 Skills 机制正是为解决这个瓶颈而生它不是在聊天窗口里给你答案而是在你敲下 CtrlEnter 的瞬间把答案“长”进你的编辑器里。它适合三类人一是日均写 300 行以上业务逻辑的中高级工程师需要把重复性认知劳动压缩到毫秒级二是带新人的 Tech Lead需要把团队最佳实践比如 API 响应结构、错误码规范、日志埋点模板封装成一键可用的 Skill避免每次 Code Review 都在纠正同一种格式三是独立开发者或小团队没有基建能力自建 LLM 工具链但又急需把大模型能力“钉死”在具体场景里。它解决的不是“写不出”而是“写得慢、写不稳、写不一致”。我试过把 Skills 分成三类使用场景防御型防错如自动校验 SQL 注入风险字段、加速型提效如一键生成单元测试骨架、传承型沉淀如将老系统接口文档自动转成 OpenAPI 3.0 Schema。这十个技能就是从这三类里反复筛选、压测、迭代出来的“生存级”配置。它们不追求技术新颖只追求在真实项目里“开箱即稳、触发即准、改一行都不用”。2. 核心设计逻辑为什么是 Skills而不是 Prompt 或 Agent2.1 Skills 不是 Prompt 的语法糖而是“上下文锚点”的工程化实现很多人第一反应是“这不就是写个好 prompt 吗”——这是最大的误解。Prompt 是一次性的、无状态的、依赖模型随机性的输入而 Skills 是 IDE 端定义的、有明确输入契约、有固定输出 Schema、可被版本管理的可执行单元。举个最典型的例子“生成边界测试用例”Skill。Prompt 方式你复制函数签名粘贴到聊天框输入“请为这个函数生成边界条件测试用例覆盖空值、超长字符串、负数、极大整数。”→ 结果不可控模型可能漏掉某个边界可能用 pytest 写法也可能用 unittest甚至可能把测试逻辑写进函数体里。Skills 方式你在 VS Code 里选中函数按快捷键CmdShiftP→ “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 #1SQL 注入风险字段自动标注防御型为什么排第一因为它是唯一一个上线后直接拦截过线上事故的 Skill。我们有个老系统前端传?id1 OR 11这种参数后端没做任何校验直接拼 SQL。Code Review 没发现测试也没覆盖。这个 Skill 在开发阶段就把它揪出来了。核心原理不依赖模型判断“是否危险”而是用正则 AST 双重校验。正则扫描匹配所有SELECT.*FROM.*WHERE.*\.*\.*类字符串拼接模式AST 扫描定位cursor.execute(sql, params)调用检查sql变量是否来自字符串拼接而非参数化查询实操配置.claudecode/skills/sql-inject-scan.yamlid: 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 #2API 响应结构一致性校验传承型痛点场景微服务团队里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 的ResponseEntityUserPython 的- dict并递归比对字段名、类型、必填性。实操配置.claudecode/skills/api-consistency.yamlid: 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.yamlid: 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_idvalue 为原表达式 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 行按CmdShiftP→ “Log Auto Complete”回车自动在函数第一行插入 logger 调用且extra字典里的 key 全部 snake_case 化符合公司日志规范如果request.ip实际是request.client.hostSkill 会智能匹配并修正实操心得这个 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.yamlid: 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 #5Git 提交信息智能生成传承型为什么团队都在用因为它把“写什么提交信息”这个决策从“个人习惯”变成了“团队协议”。我们规定所有 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.yamlid: 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 . CmdShiftP→ “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.yamlid: 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.jsSkill 自动在顶部插入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_FOUNDGo 的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_FOUNDSkill 扫描当前文件类型读取error-codes.yaml生成对应语言的常量定义。实操配置.claudecode/skills/error-sync.yamlid: 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里按CmdShiftP→ “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.yamlid: 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 COLUMNup 为 ALTER TABLE ... ADD COLUMN ..., down 为 ALTER TABLE ... DROP COLUMN ... 2. 如果 commentText 含 ADD INDEXup 为 CREATE INDEX ..., down 为 DROP INDEX ... 3. 语法必须符合 dbConfig.dialectmysql/postgres 4. 输出格式-- UP\nup_sql\n\n-- DOWN\ndown_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设为postgresDOWN会变成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.yamlid: 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): PromiseChargeResponse { 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.yamlid: 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里按CmdShiftP→ “Perf Annotate”选择profile.cpuprofile自动高亮