1. 为什么需要这么个“技能中枢”:54+工具下的碎片化困局
先说我碰到的真实情况。去年开始,我的主力机里装了Cursor、Windsurf、Trae、Codex CLI、Cline、Continue、Zed,还有几个叫得上名的Agent框架,加起来十几个AI编程工具。每个工具都宣传自己能通过“自定义技能(Agent Skill)”让AI更懂你的项目,结果我的真实体验是:同一个“按团队规范生成提交信息”的技能,在Cursor里要写成.mdc规则文件,在Claude Code里要按.claude/skills/的目录结构放SKILL.md,在Cline里要落成clinerules指令,在Codex CLI里又得整理成AGENTS.md段落。写技能本身不费劲,费劲的是让同一套逻辑在几十个工具里保持一致。
这种状态持续了两三个月后,我实在忍不了,就动手写了一个桌面应用,叫 Skills Manager:它把散落在54+个AI编程工具和Agent框架里的技能统一收进一个本地知识库,统一编辑、统一版本、按需导出到任意目标工具。这篇文章就是我在做这个“技能中枢”过程中的完整思路、实操记录和踩坑总结,适合那些同时使用多个AI编程工具、或者打算把Agent技能资产化的开发者。
1.1 Agent技能到底是什么,为什么不能到处通用
Agent技能,本质上是一组给AI智能体用的“操作手册”:告诉它在特定场景下应该关注什么、按什么顺序执行、调用哪些命令、最终输出什么格式。比如“代码审查技能”,它会让Agent先检查变更文件列表,再逐文件扫描安全漏洞、性能问题、命名规范,最后按问题级别 | 文件位置 | 修改建议的表格输出。没有技能时,AI只能依赖通用对话能力自由发挥;有了技能,AI的行为边界和输出质量就稳定下来了。
问题在于,不同工具对“技能”的实现方式差别很大。有的是纯Markdown提示词,有的是YAML配置加脚本,有的是JavaScript/TypeScript插件,还有的直接规定一个特殊目录,放进去才能被识别。我常用的几个工具里,Claude的Skills算是最接近“事实标准”的,很多新工具都在参考它的SKILL.md写法,但真要一键搬到别的工具,依然要处理存储路径、格式封装、触发器声明这些差异。
打个比方,技能像是给新员工写的标准作业指导书,这本指导书本身没有问题,但公司有54个部门,每个部门要求你用不同的表格填写。你要么给每个部门交一份不同格式的文件,要么做一个“母本”,然后自动转换成各部门要的格式。Skills Manager选的是后者。
1.2 碎片化带来的真实痛点:版本漂移、重复劳动、迁移地狱
我仔细整理了一下自己遇到的痛点,基本可以归成五类。
第一是重复劳动。每换一个工具,我就要把所有规则重新抄一遍。Cursor里二十多个规则文件,Claude Code里十几个技能,Cline里七八条指令,内容重叠度超过百分之六十。第二是版本漂移。同一个“前端代码审查清单”,Cursor版本更新过,Claude版本还是三个月前的,两个工具的审查标准经常打架。第三是换工具成本高。我从Windsurf切换到Trae的时候,光迁移技能就花了整整一个晚上,还漏了几个只在旧工具里生效的脚本。第四是团队协作困难。我把技能文件丢进Git仓库,队友在Windows上拉下来后,一半脚本因为路径分隔符和Shell差异跑不了。第五是跨平台配置的混乱。macOS上技能目录在~/.claude/skills/,Windows上又跑到%APPDATA%底下一层,光是找目录就够烦。
这些痛点单看都不算大事,叠在一起就是每天都要付出的隐性成本。等到AI编程工具从一两个变成十几个,技能数量从几个变成几十个之后,我意识到自己缺的不是“又一个能写技能的软件”,而是一个能把这些技能统一描述、统一存放、统一分发到任意工具的“中枢”。
2. 整体设计思路:做一个“技能中枢”,而不是又一个“Agent框架”
2.1 为什么做成桌面应用,而不是IDE插件或CLI工具
一开始我也纠结过:要不要做VS Code插件?或者干脆做个命令行工具?后来都否了。
IDE插件的问题是和宿主强绑定。我做这个工具的初衷就是要解放技能,结果却把技能又关进另一个平台里,没意义。CLI工具虽然轻量,但查看技能详情、拖拽文件、可视化管理适配器时不够直观,而且我在实际使用中经常需要同时打开多个项目的技能仓库,纯终端操作效率不高。最终选了桌面应用,技术上用了Tauri(Rust做后端,Web前端做界面)。原因很实际:跨平台支持好,Windows、macOS、主流Linux发行版都能跑;内存占用比Electron低一大截,我这个工具要常驻后台监听文件变化;文件操作性能也好,技能包数量到几百个时,扫描索引依然很快。
桌面应用还有一个隐性优势:本地优先。技能内容常常涉及公司内部规范、私有提示词、密钥占位符,放在本地最安全,不需要为了同步而强行上云。
2.2 统一抽象:一套通用技能描述,多端自动产出
核心设计思路是“一个源,多个目标”,类似母带和转码的关系。我先定义了一套通用的技能包结构,作为所有工具的中间格式;然后针对每个目标工具写一个适配器,负责把通用技能包翻译成该工具能认的格式。
为什么选通用技能包而不是直接用某个工具的格式当标准?因为这样最灵活。我可以在源格式里表达“这个技能支持哪些工具”“在哪些平台可用”“依赖哪些脚本”,而具体导出到Cursor时,只需要输出Cursor认得的字段;导出到Claude时,则加上Claude要求的元数据。换句话说,源格式是完整的,导出格式是裁剪过的。
实际设计时,我借鉴了Claude Skills的SKILL.md目录结构,因为它在社区里已经形成事实参考,很多新工具都兼容这个写法。但我不让它绑架整个体系:源技能包里有skill.yaml描述元数据,有SKILL.md写核心指令,有scripts/放辅助脚本,还有tests/和assets/用于验证与静态资源。每个适配器按需取用这些内容。
2.3 54+ 工具的适配清单与分类
“54+”不是凭空喊的。我在早期调研时,把当前能看到的AI编程工具和Agent框架列了一个表,按类型分成四大类:IDE插件、CLI工具、桌面客户端、云端Agent平台。到写这篇文章时,已经适配了54个,还在持续加。下面列几个代表性的。
| 分类 | 代表工具 | 主要导出格式 |
|---|---|---|
| IDE插件 | Cursor、Windsurf、Trae、Continue、Zed | .mdc/.rules/ 项目规则文件 |
| CLI工具 | Codex CLI、Aider、OpenCode、Goose、Qwen Code | AGENTS.md/SKILL.md/ 指令目录 |
| 桌面客户端 | Claude Desktop、Cherry Studio | .claude/skills// 技能库 |
| 云端Agent平台 | Devin、Marscode、扣子(Coze) | 技能描述导入 / API配置 |
分类的意义在于,同一类型的工具往往格式接近,适配器可以复用模板;不同类型之间差异大,需要单独处理。比如IDE插件大多支持“项目级规则文件”,而CLI工具更认“目录结构 + Markdown”的组合。适配器层做到后面,已经变成一套模板渲染系统,新增一个工具往往只需要写几十行模板配置。
3. 核心细节解析:技能包结构、适配器与同步机制
3.1 技能包的目录结构与字段约定
每个技能在Skills Manager里都是一个独立目录,推荐结构如下:
my-skill/ ├── skill.yaml ├── SKILL.md ├── scripts/ │ ├── run.sh │ └── preflight.py ├── tests/ │ └── test_skill.py └── assets/ └── example.pngskill.yaml是入口文件,负责登记技能的基本信息。我自己的技能模板长这样:
name: code-review version: 1.2.0 description: 按照团队规范对代码变更进行结构化审查 trigger: code review, 代码审查 platforms: [cursor, claude, codex, cline] tags: [review, quality] scripts: preflight: scripts/preflight.py关键字段里,name必须全局唯一,因为多个工具会拿技能名当目录名或触发关键词,重名会导致互相覆盖。version用语义化版本,导出到工具后,我会在产物文件里写入版本号,方便排查“当前生效的到底是哪个版本”。trigger建议写用户最容易自然说出的几个词,不要写太长,否则Agent在复杂对话里容易匹配不上。platforms是白名单,缺省表示全平台可用。
SKILL.md是技能的核心体,也是我花最多时间调优的部分。写这个文件的准则,我归纳成三条:控制在100行以内、用可验证的指令代替模糊要求、在每个关键步骤后明确输出格式。比如“先运行git diff --name-only获取变更文件列表”就比“先看看改了哪些文件”要可靠得多。
3.2 适配器是怎么“翻译”技能的
适配器是整个系统的翻译官。我以“代码审查”技能为例,演示一下它在四个不同工具里的产物差异。
导出到Cursor时,适配器会生成一个.mdc文件放进.cursor/rules/,带上前置的frontmatter:
--- description: 代码审查技能,用于对变更代码进行结构化审查 globs: ["*.ts", "*.tsx", "*.js", "*.py"] ---导出到Claude Code时,适配器会创建.claude/skills/code-review/SKILL.md,正文内容几乎不变,但会额外要求技能目录的第一行写上---开头的简短描述,因为这个工具靠它做技能索引。导出到Codex CLI时,适配器会把技能内容合并进AGENTS.md的对应章节,并且在章节标题前加##,方便AI在长上下文里检索。导出到Cline时,则写入clinerules/code-review.md,同时把trigger字段转换成Cline的规则触发格式。
底层实现其实就是模板渲染。每个适配器由“目标工具能力清单”和“渲染模板”组成,能力清单决定了哪些技能字段能导出,渲染模板决定最终文本长什么样。一开始我以为适配器要很复杂,后来发现大部分工具要的就是frontmatter + Markdown这层壳,真正复杂的是处理那些“脚本执行差异”。比如Codex CLI允许技能直接调用终端命令,但Cursor的规则默认不能执行任意命令。我的适配器会对这类情况做降级处理:把脚本步骤改写成“文字描述”,并提示用户哪些功能在当前工具里不可用。
3.3 跨平台存储与同步:本地路径、符号链接与Git
跨平台问题是我最早踩的坑。技能包默认存放在~/.skills-manager/skills/,但到了Windows上,标准路径应该用%APPDATA%\skills-manager\skills;到了macOS和Linux,又要遵守XDG规范放在~/.config/skills-manager/。所以我写了一个统一的路径解析层,按平台自动切换。
真正让“一个中枢管多个工具”变得顺手的是符号链接方案。用户可以选择把某个技能以符号链接形式“软安装”到目标工具的技能目录里,这样在中枢里修改技能内容,目标工具下一秒钟就生效,不用反复导出。不过符号链接在部分工具有兼容问题:有些工具打包或读取时会忽略符号链接,或者把符号链接当成非法文件。因此我保留了一种“快照导出”模式:每次同步,适配器先清空目标目录里的旧产物,再写入新文件,保证最终状态一致。
Git同步也做了,但做得比较轻。每个技能包可以单独作为一个仓库,也可以把整个技能库放进一个Git仓库统一管理。团队协作时,我推荐后一种:主仓库里只有一个skills/目录,每个子目录一个技能,通过PR来更新。为了不让仓库体积失控,我在文档里特别强调了:assets/下不要放几十兆的二进制文件,真要放,记得用Git LFS。
4. 实操过程:从安装到接入第一个技能
4.1 安装与环境准备
Skills Manager目前以安装包形式提供,分别对应Windows 10+、macOS 12+、主流的Linux发行版。因为是Tauri应用,安装后体积不大,也不需要额外的Node或浏览器环境。第一次启动时,应用会检查skills-manager配置目录是否存在,不存在就自动创建,并弹出一个“技能库初始化”向导,让我选择默认工作目录。我建议把这个目录放在云盘同步文件夹里,比如坚果云、Dropbox或者iCloud,这样即使不用Git,本地文件也能在多设备间同步。
主界面左侧是技能列表,中间是技能详情预览,右侧是目标工具面板。第一次使用,先花两分钟去“设置 - 路径”里确认各个目标工具的技能目录是否被正确识别。如果工具装在自定义路径,手动补一下路径即可。这个步骤虽然简单,但做不好后面导出一定会出错。
4.2 新建一个“代码审查”技能并导出到三个工具
下面走一遍完整流程,算是给新用户的一个最小可行用例。
第一步,新建技能。点击“新建技能”,命名code-review,分类选“代码质量”。第二步,填元数据。version填0.1.0,description填“对当前分支的变更进行结构化代码审查”,trigger填code review和代码审查。第三步,编写SKILL.md。我贴一个精简但能跑的版本:
# Code Review 在收到 code review 指令时,按以下步骤执行: 1. 运行 `git diff --name-only` 获取变更文件列表。 2. 逐个文件读取 diff 内容。 3. 按安全、性能、可维护性、命名规范四类列出问题。 4. 输出 markdown 表格,列名:级别 | 文件 | 行号 | 问题描述 | 修改建议。 注意事项: - 不修改代码,只输出审查结果。 - 没有发现问题时,必须写“未发现问题”,不要沉默。第四步,加一个简单的预检脚本scripts/preflight.py,检查当前目录是否在Git仓库内,避免Agent在错误目录执行命令。第五步,在右侧“目标工具”里勾选Cursor、Claude Code、Codex CLI,点“同步导出”。
导出后我习惯去实际环境里验证一次。在Cursor项目里输入“帮我做一次code review”,看AI是否输出了规范表格。如果没触发,先去目标工具的规则目录检查生成的文件名和frontmatter是否正确,再检查trigger关键词是否够明确。实测下来,大部分失败都是因为触发词太宽泛,AI把“review”理解成了别的东西。
4.3 批量导入已有技能并清洗
老玩家手里已经有一堆散装技能,Skills Manager提供了导入向导:选择源工具类型和目录,自动扫描并导入。但我要提醒一句:导入结果只能当草稿,千万别直接大规模导出到其他工具。我在测试时把Cline的二十多条规则一次性转成通用技能包,结果有五条因为YAML缩进错误直接报废,还有三条因为依赖旧工具特性,在别的工具里根本跑不通。
清洗技能时,我一般这么做:先按名称去重,保留版本最新且内容最完整的那个;再检查skill.yaml里的trigger是否被旧工具的特殊语法污染;最后把超过150行的SKILL.md拆成“核心指令 + 附录参考”两部分,防止目标工具因为上下文截断而丢弃后半部分。清洗后的技能再手动过一遍,才加入正式技能库。
5. 常见问题与排查技巧实录
5.1 技能不生效的排查顺序
我整理了一张速查表,基本覆盖了日常能遇到的九成问题。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 导出到工具后AI完全没反应 | 目标工具规则缓存未刷新 | 重启工具,或等待几秒让文件监听生效 |
| 部分文件生效,部分不生效 | glob路径写错,匹配不上目标文件 | 检查frontmatter里的globs是否覆盖目标文件后缀 |
| Windows下脚本执行失败 | 路径带空格或反斜杠被错误转义 | 脚本内路径统一用引号包裹,必要时用正斜杠 |
| 技能内容被截断 | SKILL.md太长,超出工具单规则上限 | 拆分技能,核心指令控制在100行内 |
| 导出的技能显示旧版本 | 目标目录有历史残留文件 | 使用“先清空再写入”的快照模式 |
| 符号链接不生效 | 工具打包时忽略了符号链接 | 改用快照导出模式 |
排查的时候,我有一套固定的顺序:先确认目标工具的技能目录里有没有生成文件,有,再看文件内容是不是最新版本;内容没问题,再检查触发词和glob匹配;最后才怀疑工具本身的问题。大部分问题出在前两步。
5.2 几个只有自己用才知道的细节
最后分享几个在常规文档里不会写、但我实际用下来非常关键的细节。
不要在SKILL.md里写“请一步一步思考”这类废话。它对复杂推理有些作用,但对技能执行来说纯属浪费token,还会稀释真正有用的指令。技能要的是确定性,不是让AI思考人生。
写脚本时一定要考虑目标工具的执行权限。Codex CLI和Cline可以执行shell命令,但Cursor的规则模式默认不执行任意命令。我的适配器把这类技能标记成“降级可用”,自动把命令改写成描述性文字。如果你非要在一个不支持执行命令的工具里用脚本技能,结果只会是AI假装执行,然后给你一个编出来的输出。这种错误比不生效更难发现。
版本管理要成习惯。很多用户长期不升级技能版本,结果某个工具一次大更新后格式不兼容,旧文件全作废。我在每次修改技能后都会顺手把skill.yaml的version递增一位,并保证导出的产物文件名或frontmatter里带了版本号。真出问题时,一眼就能看出当前生效的是哪一版。
最后,我想特别提一个建议:每个技能包里最好都写一小段“验收命令”,放在tests/目录里。我在实际使用中多次遇到Agent行为异常,排查半天发现不是提示词问题,而是技能里调的脚本在高版本Python下输出格式变了。有了验收命令,每次改完技能跑一下,能省掉很多莫名其妙地debug时间。这个习惯,算是我做Skills Manager以来收获最大的一件事。