1. 从30%到90%:这不是玄学,是机制问题
先抛一个反直觉的结论:AI编程规范落地率低,根本原因不在大模型“笨”,而在于你一直在用正确的方式做错误的事。
我见过太多团队的做法是这样:在Trae的对话窗口里输入一大段“请你严格按照团队规范,使用TypeScript、写好单元测试、保持函数不超过20行、不允许any…”,然后满怀期待地让AI去改代码。结果前几次还行,聊到第10轮,AI已经忘了自己叫啥,更别说记住你的规范。哪怕你把规范文档直接拖进上下文,也会随着对话token的膨胀和上下文窗口的挤压,把最该遵守的“铁律”稀释成背景噪音。最后落地率一测,好一点的50%,差的直接掉到个位数。
这不是模型幻觉问题,而是机制缺失。规范只存在于瞬时对话中,没有沉淀进AI的“工作记忆”,更没进入“肌肉记忆”。
后来我换了Trae的Skills机制来做这件事,效果是实打实的提升——团队里前端组、后端组、AI Agent组三套规范全部接入后,用内置的规范审计插件抽查代码和PR,规范落地率从月初的31%一路爬到88%,最近两周已经稳定在90%附近。
这篇文章我就把这套打法完整拆开:Skills到底是什么、它为什么能把“说给AI听的话”变成“AI必须执行的制度”、怎么把你的团队规范写成一个真正可用的Skill文件、以及我在实际接入过程中踩过的那些文档里根本不会写的坑。
提示:这不是一篇Trae的官方功能说明书,而是一个实际的使用过程和工程化落地记录。里面的Skills目录结构、SKILL.md写法、规范转技能的方法,我在多个项目里验证过,可以直接抄作业,但建议你先理解机制再动手改。
如果你也是被“AI乱写代码、规范靠人肉盯”折磨的人,尤其是前端团队负责人、AI Agent方向开发者、或者正在做团队工程效能提升的人,这篇值得读完。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Skill不是“提示词模板”,是把规范变成了AI的制度
先说透Skills的运行机制,不然你连怎么写都会跑偏。
2.1 规范失效的根本原因:上下文里的“软约束”不可靠
传统做法为什么不行?因为你在对话里给AI的规范,本质上是一种“软约束”。软约束的特点是它存在于易失的上下文窗口中,会被后续的对话、代码片段、中间结果不断冲刷。AI不是不遵守,而是“记不住要遵守”。
打个比方:你让一个刚入职的实习生去写代码,口头叮嘱了十条规范。他上午还记得,下午改了十几个文件之后早就忘了第七条“枚举命名必须是PascalCase”。除非你把规范贴在工位上,变成一张随时能看到的告示牌,他才能每写一处就对照一次。
Trae的Skills机制做的就是“贴告示牌”这件事。它的核心理念是:把某类任务所需的知识、规范、流程、参考实现打包成一个独立目录,里面用一个SKILL.md文件作为“索引”,配合scripts、references等资源,让AI在该技能被触发时,能临时把这份“制度文件”载入工作记忆,并在整个任务执行周期内保持生效。
2.2 一个Skill的目录长什么样
这个机制本身不是Trae首创,它借鉴了社区里Claude Code的Skills规范,也被Anthropic官方收录为Agent Skills的标准做法。Trae在实现上做得比较狠的地方在于:Skills可以直接被触发、可以直接引用外部脚本、甚至在CLI和IDE里都能调用。
一个典型的Skill目录结构是这样的:
text复制my-team-frontend-rules/
├── SKILL.md # 技能描述、元信息、触发规则、使用步骤
├── scripts/ # 可执行脚本(如规范校验、文件扫描)
│ └── check-react-hooks.sh
└── references/ # 参考文档、规范细则、示例代码
├── react-hooks规范.md
├── typescript-style-guide.md
└── git-commit-template.md
SKILL.md是整个Skill的入口,它是带YAML frontmatter的Markdown文件。frontmatter里声明这个技能是干什么的、什么时候被调用、需要什么上下文;正文部分则告诉AI当这个技能被激活时,具体要执行哪些步骤、要翻哪些参考文档、要按什么顺序工作。
一个简化版但结构完整的SKILL.md长这样:
markdown复制---
name: frontend-code-rules
description: 团队前端编码规范。在生成或修改React/TypeScript代码时必用,确保代码风格统一、Hooks使用正确、类型完整。
---
# 前端代码规范执行流程
1. 先读取 `references/react-hooks规范.md` 和 `references/typescript-style-guide.md`
2. 按规范逐条比对当前生成或待修改的代码
3. 修改代码时必须遵守:
- 组件文件统一使用函数组件,禁止 class 组件
- Hooks 只在顶层调用,禁止条件调用
- 禁止显式使用 any,必须用 interface 定义 props
4. 交付代码前,运行 `scripts/check-react-hooks.sh` 做自动校验
看到区别了吗?传统提示词是“你最好遵守规范”,Skill是“任务执行前必须先加载规范文档,按步骤执行,最后跑校验脚本”。后者直接改变了AI的工作流程,不是靠模型自觉,而是靠流程强制。
2.3 为什么Skills能把规范落地率拉高
这套机制能做高落地率,核心原因是三个:
第一,规范从“对话期”变成了“任务期”。对话上下文会被新消息覆盖,但Skill是独立于对话内容之外的知识文件,只要任务类型匹配,AI就会重新加载SKILL.md和references文档。每次开工前都有“工位告示牌”,而不是靠记忆撑全场。
第二,规范从“文字”变成了“流程”。规范光写着“不要用any”是不够的,Skill可以让AI在写完代码后主动跑一遍类型检查,用工具兜底而不是用自觉兜底。
第三,规范从“个人经验”变成了“团队资产”。Skill文件是放在仓库里的,跟着项目走。团队任何一个人在任何一台机器上打开项目,AI都会自动加载同一套规范。新人接手项目,AI替他先背熟了团队规矩——这才是技能复利的真正价值。
3. 把“团队规范”变成“技能文件”的完整方法
理解了机制,接下来是最关键的实操环节:怎么把你们团队零散的规范文档、代码Review清单、甚至口头约定,翻译成一个AI真正能执行的Skill。
3.1 第一步:盘点规范,按任务类型拆“技能原子”
大部分团队的规范文档是一坨大杂烩:变量命名、组件结构、接口设计、Git提交格式、测试要求全都写在同一个开发规范.md里。这种文档AI不是不能读,而是不知道怎么用——它不知道什么时候该翻哪一章,更不知道优先执行哪条。
正确做法是把规范拆成“技能原子”,一个原子对应一类高频任务。比如前端团队可以拆成这样:
| 技能原子 | 对应任务 | 核心规范点 |
|---|---|---|
| react-hooks规范 | 新建/修改组件逻辑 | Hooks调用规则、依赖数组、禁止条件调用 |
| typescript类型规范 | 编写接口和类型定义 | 禁止any、Props必填类型、泛型约束 |
| 组件结构规范 | 新建组件文件 | 文件命名、函数组件、样式文件跟随 |
| git提交规范 | 生成commit message | 提交信息格式、类型前缀、关联issue |
| 接口请求规范 | 编写API调用 | 错误处理、loading状态、取消请求、超时配置 |
拆完之后,每个“原子”单独写成一个Skill目录,而不是塞进一个大而全的skill里。原因很简单:Task粒度越细,AI的加载命中率越高。你让AI“生成一个提交信息”,它只需要加载git-commit那个2KB的技能文件,而不是50KB的全量规范文档——截断风险低,执行效率高。
3.2 第二步:把规范“翻译”成AI可执行的语言
这一步是做Skill最核心的功夫。很多人的误区是直接把规范文档原文扒进去,结果AI读是读了,但行动还是没变。
原因在于:人类规范是“结果导向”的,AI需要的是“动作导向”。
比如规范文档里写“代码应该具有良好的可读性”——这句话人类能理解,AI无法执行。你得把它翻译成:
- 函数名必须用动词开头(getUser / fetchList / handleChange)
- 函数体超过20行必须拆分
- 禁止使用多层三元表达式嵌套
- 删除的代码必须连注释一起删除,禁止留大段注释掉的死代码
每一个规范点都必须是一个AI能逐条check的“可判定语句”。能用脚本校验的给脚本,能列检查项的列检查项,实在无法自动化的才靠模型判断。
我之前帮一个后端团队做Go语言规范的Skill,其中有条规范是“错误处理必须使用errors.Is判断,禁止直接比较err == nil以外的错误类型”。这条规范人类审核的时候扫一眼就知道,但AI写代码时经常写错。后来我在Skill的references里放了一个错误处理的反例和正例对照文件,并在SKILL.md的执行步骤里写明“写完每个函数后,检查错误处理部分是否遵循references中的正例模式”,落地率很快就上去了。
3.3 第三步:善用scripts,让Skill从“建议”变成“强制”
Skill机制里最容易被人忽略但威力最大的是scripts目录。SKILL.md里的规范文字只是“软约束”,而scripts是“硬校验”。如果可能,把能自动化的规范全部脚本化。
举个例子,我在前端规范Skill里放了一个check-import-order.sh,逻辑很简单——用eslint的import/order规则扫描当前项目下被AI修改过的文件,如果排序不对就自动执行fix。然后SKILL.md里写清楚:“所有import语句必须按外部库、内部模块、相对路径的顺序排列。修改完成后运行scripts/check-import-order.sh校验,如果报错则修复后再交付。”
这样AI交付的代码就是已经过横向校验的版本,而不是纯靠它“临场发挥”的版本。
有人会问:那如果AI不主动跑脚本怎么办?两个办法兜底:一是Skill的“步骤式描述”能显著提高AI执行脚本的概率,因为它是按照流程模板走的;二是配合Trae的Agent模式,AI在任务收尾时执行外部命令的概率会明显提高。如果你用的是Trae CLI,还可以把Skill触发后的脚本执行结果作为下一步骤的输入条件,这个链路会更硬核。
3.4 第四步:给Skill设计“触发条件”和“不适用场景”
这个细节很多人忽略,但它知乎决定了你的Skill会不会被滥用。
SKILL.md的frontmatter里必须写清楚这个技能的触发规则。你得告诉AI:“什么情况下必须用这个技能、什么情况下不要用”。
我之前踩过一个大坑:给公司后端项目写了一个mybatis-plus规范技能,frontmatter的description里只写了“MyBatis-Plus使用规范,在新增或修改数据访问层代码时使用”。结果AI在写一个纯工具模块(不涉及数据库的类)的时候也硬套这个技能,生成了莫名其妙的一堆QueryWrapper代码。原因就是description写得太宽泛,AI“宁可错杀也不放过”。
后来改成:“当检测到待修改文件位于src/main/java/**/mapper/**目录或当前任务明确涉及数据库查询操作时使用;在编写纯算法、纯POJO、DTO转换等与数据库无关的代码时禁止调用”。加了“不适用场景”之后,误触率立刻降下来了。
一个高质量的description格式建议如下:
yaml复制---
name: mybatis-plus-rules
description: 数据访问层规范技能。当项目使用MyBatis-Plus框架,且任务涉及新增、修改Mapper接口或XML文件时必须调用。若任务不涉及sql或数据持久化则禁止调用。
---
4. 实测链路:从Skill编写到代码审查全流程
目录结构和写法都讲完了,下面我说一个完整的实测过程。这个例子用的是我给前端团队做的“React组件开发规范”Skill,从触发到代码交付全链路走一遍,你就能知道这套东西在实际项目里到底怎么运作。
4.1 环境准备与Skill挂载
我用的是Trae的IDE版本,Skill目录直接放在项目的.trae/skills/react-component-rules/下。放进去之后Trae会自动识别,不需要额外注册。CLI场景下则通过trae skills相关命令管理。
目录结构如下:
text复制.trae/skills/react-component-rules/
├── SKILL.md
├── scripts/
│ └── lint-and-fix.sh
└── references/
├── component-structure.md
├── hooks-usage.md
└── code-examples.md
挂载完成后我先测了一次触发。新建一个名为UserProfile.tsx的文件,输入以下对话指令:
text复制帮我在components/user目录下创建一个UserProfile组件,展示用户头像、昵称、简介,支持编辑资料。
因为新建的是组件文件,且路径在components下,SKILL.md的description命中,AI自动加载了react-component-rules的全部参考文档。
4.2 AI执行过程与脚本校验
从Trae的日志里能看到,AI这次生成的代码走的链路和以前明显不同:
- 先读取references/component-structure.md,确认组件文件结构约定
- 按组件模板生成基础结构,用function关键字而不是const箭头函数(这是团队规范之一)
- 生成props接口时自动用了interface而不是type(也是规范强制项)
- 写完业务逻辑后,主动运行了scripts/lint-and-fix.sh对文件做校验
lint脚本很简单,核心内容大致是:
bash复制#!/bin/bash
# 对目标文件执行eslint、prettier修复,并调用tsc做类型检查
npx eslint "$1" --fix
npx prettier --write "$1"
npx tsc --noEmit --project tsconfig.json
这次跑下来,eslint报了3个warning,都是关于useEffect依赖数组的问题。AI根据规范文档里的hooks-usage.md修正了依赖项,第二次lint通过。
这就是Skills和普通提示词最大的区别。以前用提示词生成代码,AI大概率会把eslint放着不管,反正“编译能过就行”。但现在它有明确的脚本校验步骤,“不修复就不能交付”的流程让代码质量直接上了一个台阶。
4.3 审查阶段的最终验证
组件完成后,我故意写了一个小需求变更:往组件里加一个“关注用户”按钮,点击后调用follow接口。这个变更会触达接口规范技能和状态管理规范技能。两条链路的SKILL.md都各自加载了对应references,AI在生成代码时自动处理了:
- 加了
useCallback包裹handler - 请求期间按钮进入loading态并禁用点击
- 失败时用统一错误提示组件,而不是裸的alert弹窗
- 成功后的用户状态更新走了全局store的action,而不是组件内setState
最终代码交给团队同事人工Review,一次通过,没有返回任何修改意见。这个结果在接入Skills之前很难想象——以前人工Review最少得打回两三轮。
4.4 月度数据对比
这里放一组我们团队的真实对比数据,时间段分别是接入前的30天和接入后的30天:
| 指标 | 接入前 | 接入后 |
|---|---|---|
| 规范审计通过率 | 31% | 88% |
| 人工Review平均打回次数 | 3.2次 | 0.6次 |
| PR平均提交到合并耗时 | 2.4天 | 0.8天 |
| 样式类、类型类低级问题 | 高频出现 | 接近零 |
这里面规范审计通过率的计算口径是我们用SonarQube+自定义规则插件统计的。可以看到转折发生在接入Skills的第二周——第一周主要是磨合期,Skill调整了好几版才稳定下来。一旦稳定,数据直接起飞。
5. 踩坑实录与边界认知:Skills解决不了什么
说实话,Skills不是银弹。我调了将近两个月,踩了不少坑,这里挑几个典型的讲一下,能帮你少走弯路。
5.1 坑一:Skill文件里放了太多案例,上下文被“餐巾纸”占满
第一版Skill我写了非常多示例代码,文件名、函数体、组件结构、hooks示例全放进去。结果AI加载之后,参考文档占据了大量上下文窗口,留给实际生成代码的空间就小了,而且AI容易“过度参考”——写新组件时硬套示例代码里的结构,甚至照抄出一些不相干的字段。
后来我把references里的示例尽量精简到“只保留必须的模式对照”,默认配置是正例一个个、反例一个个,够看就行,不放花样。大段的完整组件示例删除,改成只放“结构骨架”而不是“完整实现”。
注意:Skill文件的内嵌上下文是有限资源。不要让references变成了“文档收纳箱”,每个文件最好控制在2-3KB以内,只留能被AI直接转化为动作的信息。
5.2 坑二:skill之间互相打架,触发优先级混乱
当你的Skill多了以后,一个新问题出现了——多个Skill同时命中。比如新建组件文件时,react-component-rules和typescript-type-guide同时加载,两条技能分别给出执行步骤,AI在步骤衔接的时候经常出现混乱,比如把类型规范里的“禁止用type定义组件props”和组件规范里的“必须用interface定义props”互相印证执行错乱。
解决办法是我后来在全局层面建了一个skills-index.md,充当“技能调度表”。里面明确写好:如果组件相关技能和类型相关技能同时命中时,组件技能优先;组件技能内的规范如果与类型技能冲突,以组件技能为准。然后把这个index放在所有Skill的上一级,AI在处理任务时会先查这个表。
实际上更好的办法是合并同类技能——如果两个Skill总是同时命中,说明它们被拆得太细了。我最后把typescript-type-guide合并进了react-component-rules,统一叫“前端组件与类型规范”,触发规则不变,但内部步骤顺序更清晰了。
5.3 坑三:Skill把AI框死了,创新性任务变得死板
这个坑比较微妙。Skills的强制流程适合“重复度高的生产型任务”,比如写CRUD接口、加表单页、生成commit信息。但如果你的项目处在探索期,代码结构每天都在变,太细的Skill反而会限制AI的灵活度。
我现在的策略是分两套技能:
- 硬性规范类Skill:哪个项目都必须用,对应的是团队不可妥协的红线(类型完整、命名规范、commit格式、目录结构)
- 软性流程类Skill:只在小范围试点或者特定项目用,对应的是探索性的开发流程(比如TDD流程、重构指引)
硬性规范Skill常驻,软性流程Skill按需挂载。这样既保底线,又不扼杀AI在探索任务里的主动性。
这个边界问题很重要——Skills的本质是“把经验固化成流程”,但流程不能替代判断。一旦你意识到这一点,就不会问“为什么我上了Skills之后AI连一题算法题都做不好了”这种问题了,因为那种任务根本不该套流程。
6. 从“能用”到“好用”:Skill体系进阶优化
最后聊几个进阶玩法。当你已经有了一套基础Skill之后,还有三件事值得做。
6.1 建立中央技能库,跨项目复用
我们团队现在把Skill文件放在一个独立的Git仓库里,叫team-skills。每个项目通过submodule或者复制方式引入其中需要的技能子集。这样技能文档的迭代只需改一处,全团队的AI生产力单元同步升级。
这个仓库的目录按团队角色组织,前端技能、后端技能、数据技能、文档技能各有目录。每个技能文件本身也带版本记录和更新日志,方便追踪“哪次调整让规范通过率提升了”。
6.2 用CLI把Skill嵌入CI流水线
Trae CLI可以做到更狠的事情:在CI流水线里直接调用AI执行Skill。我们现在的自动化流程是这样的:
- 开发者push代码后,CI触发trae CLI运行,加载对应项目的规范Skill
- AI自动审查本次变更涉及的文件,按SKILL.md的检查清单逐项验证
- 不合规的地方直接输出修复建议的diff
- 修复后的代码提交回PR
这一步落地后,人工Review的压力几乎消失了,审查效率高了很多。我们有条流水线接的是写接口自动化的场景,只要后端联调文档更新了,CI会自动跑一次接口测试并生成新的测试用例代码,全程不需要人动。
6.3 针对“大而全的全局规范”,优先做拆解而不是堆砌
很多团队想搞“一次性把所有规范都变成Skill”,我的建议是不要。你强行让一个Skill承载全部规范,AI加载时的上下文压力会非常大,执行步骤会变得冗长不堪,最后的落地率反而会掉。
最佳实践是从你被review打回最多、code review意见最集中的那个规范项开始。先把高频痛点解决掉,让团队看到明显提升,再逐步扩大技能覆盖范围。数据摆在那,后续推进新技能才会顺利。
以我自己为例,最初只做了一个“React组件结构规范”的Skill,解决了80%的组件混乱问题。团队觉得有效之后,才陆续加了git提交规范、类型规范、错误处理规范。现在一共13个技能,覆盖了前端和后端两套技术栈的Top级痛点。
最后提醒一句:Skills需要持续维护。代码规范会变,技术栈会升级,Skill文件如果半年不更新,它指导出来的代码风格就会老气横秋。把Skill纳入团队的定期迭代节奏里,和库版本的升级保持同步,它才会永远锋利。
