
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工具虽然轻量但查看技能详情、拖拽文件、可视化管理适配器时不够直观而且我在实际使用中经常需要同时打开多个项目的技能仓库纯终端操作效率不高。最终选了桌面应用技术上用了TauriRust做后端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 CodeAGENTS.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.0description填“对当前分支的变更进行结构化代码审查”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以来收获最大的一件事。