AI 编程工具这两年爆发式增长,我自己的机器上就同时装着 Claude Code、Cursor、Windsurf、Cline、Roo Code、Aider 好几套,每套都有自己的 Agent 技能目录、自己的配置文件格式、自己的加载规则。结果就是同一个"代码审查"技能,我在五个地方各写了一遍,改一次要同步五遍,忘了一处就开始出现"这个工具里能用、那个工具里失效"的诡异现象。Skills Manager 这个项目就是冲着这个痛点来的——它把自己定位成一个跨平台的桌面中枢,把 54 款以上 AI 编程工具的 Agent 技能统一管起来。这篇我想从实际使用和二次开发的角度,把它的核心机制、目录结构、同步逻辑、踩坑点完整拆一遍,适合已经在用多款 AI 编程工具、被技能碎片化折磨过的开发者,也适合想自己动手做一个类似工具的人参考。
1. 为什么 Agent 技能会变成一场碎片化灾难
1.1 从"一个工具一个技能目录"说起
先把这个问题的根源讲清楚,不然后面所有的设计决策都看不懂。现在主流的 AI 编程工具,几乎每一款都支持某种形式的"自定义技能"或"自定义指令"——有的叫 Skill,有的叫 Rule,有的叫 Custom Instruction,有的叫 Agent Profile。名字不同,但本质是一回事:一段结构化的文本(通常是 Markdown 加 frontmatter),告诉模型在特定场景下该怎么做。
问题出在存放位置上。我实测统计过自己机器上的情况:
| 工具 | 技能存放位置 | 文件格式 | 加载方式 |
|---|---|---|---|
| Claude Code | ~/.claude/skills/ | Markdown + YAML frontmatter | 启动时扫描目录 |
| Cursor | .cursor/rules/ | .mdc文件 | 项目级加载 |
| Windsurf | .windsurf/rules/ | Markdown | 工作区加载 |
| Cline | 全局设置内嵌 | JSON 配置 | 设置面板管理 |
| Roo Code | .roo/rules/ | Markdown | 项目级加载 |
| Aider | CONVENTIONS.md | 单文件 Markdown | 启动参数指定 |
你看,光是存放位置就有全局目录、项目目录、内嵌配置三种模式,文件格式又有.md、.mdc、.json的差异。这意味着什么?意味着你没法简单地用一个软链接把所有工具指向同一个目录——格式不兼容,加载时机也不一样。
1.2 同步成本到底有多高
我拿自己最常用的一个"提交信息规范化"技能算过一笔账。这个技能大概 40 行 Markdown,包含提交格式规范、示例、禁止事项。我需要在 6 个工具里各维护一份,每次调整规范(比如团队决定把 scope 从可选改成必填),就要改 6 次。
单次改动 6 个文件,看起来不多。但真正的成本不在改动本身,而在一致性验证:改完之后你得逐个工具打开、触发一次、确认新规则生效了。这个过程一次大概 15 分钟。一个月如果调整 4 次技能,就是 1 小时纯浪费。如果团队有 10 个人都这么干,那就是 10 小时。
更隐蔽的成本是遗忘。我踩过最典型的坑是:在 Claude Code 里更新了代码审查技能,加了"必须检查空指针"这一条,但忘了同步到 Cursor。结果用 Cursor 写的代码漏了空指针检查,review 的时候才发现。这种问题不会报错,只会静默地降低质量,最难排查。
1.3 Skills Manager 想解决的核心命题
理解了上面的痛点,Skills Manager 的定位就清晰了。它要做的不是"再做一个 AI 编程工具",而是做一个中间层:你只维护一份技能源,它负责把这份源转换成各个工具能识别的格式,分发到各个工具能读取的位置。
这个思路其实和前端构建里的"一套源码、多端产物"很像。你写一份 TypeScript,构建工具帮你产出 ES Module、CommonJS、UMD 多种格式。Skills Manager 对技能做的事是一样的:一份技能定义,产出 Claude Code 格式、Cursor 格式、Cline 格式。
它选择做成跨平台桌面应用而不是命令行工具,我觉得是有道理的。技能管理这件事天然需要可视化:你要看到有哪些技能、分别同步到了哪些工具、哪些工具没同步成功、某个技能的原始定义长什么样。这些用 GUI 表达比 CLI 直观得多。而且桌面应用能常驻后台,做文件监听——你改了技能源,它自动重新分发,这才是真正省心的体验。
2. 54+ 工具适配背后的抽象模型
2.1 技能的三层抽象:源、适配器、目标
Skills Manager 能支持这么多工具,靠的是一套清晰的三层抽象。我把它拆开讲,理解了这三层,你自己也能给它加新工具支持。
第一层是技能源(Source)。这是你唯一需要手工维护的东西。它是一份标准化的技能定义,包含元数据(名称、描述、适用场景)和正文(具体的指令内容)。Skills Manager 内部用一套统一的 schema 来描述,不偏向任何具体工具。
第二层是适配器(Adapter)。每个工具对应一个适配器,负责把统一的技能源翻译成该工具认识的格式。比如 Cursor 适配器会把技能转成.mdc文件并加上 Cursor 特有的 frontmatter 字段;Cline 适配器会把技能转成 JSON 片段并合并进全局配置。
第三层是目标(Target)。这是技能最终落地的地方,可能是某个目录、某个配置文件、某个数据库。适配器负责写入,Skills Manager 负责记录写入状态。
这个模型的好处是可扩展性。加一个新工具支持,只需要写一个适配器,不用动核心逻辑。54 个工具听起来很多,但拆成适配器之后,每个适配器可能就几十行代码,维护成本是可控的。
2.2 适配器要处理的四类差异
写适配器的时候,真正麻烦的是工具之间的差异。我总结下来有四类:
格式差异是最表层的。有的工具要 YAML frontmatter,有的要 JSON,有的要 TOML。这个用模板引擎就能解决,难度不大。
字段差异更麻烦。同样是"技能描述"这个信息,Claude Code 用description字段,Cursor 可能用description也可能用globs来限定适用范围,Cline 可能把它塞进一个嵌套对象里。适配器需要做字段映射,还要处理某些工具不支持的字段——是丢弃还是报错,得有个策略。
位置差异是路径问题。全局技能放哪、项目技能放哪、Windows 和 macOS 路径怎么处理,这些都要在适配器里写清楚。Skills Manager 作为跨平台应用,这部分必须处理好,否则在 Windows 上能用、macOS 上就找不到目录。
加载时机差异最容易被忽略。有的工具是启动时扫描目录,你改了文件要重启才生效;有的是实时监听,改了立刻生效。Skills Manager 在同步完成后,需要根据目标工具的特性,提示用户"是否需要重启工具"。这个提示看起来小,但能省掉大量"我明明同步了怎么没生效"的困惑。
2.3 用配置驱动而不是硬编码
我特别想强调的一点是:Skills Manager 的适配器设计应该是配置驱动的。什么意思?就是每个工具的适配规则,尽量用声明式的配置描述,而不是写死在代码里。
举个例子,一个工具的适配配置大概长这样:
tool: cursor skill_dir: ".cursor/rules" file_extension: ".mdc" format: markdown_frontmatter field_mapping: name: description description: description globs: globs unsupported_fields: - priority restart_required: false这样写的好处是,当某个工具升级了格式(比如 Cursor 改了 frontmatter 字段名),你只需要改配置,不用改代码、不用重新编译。对于要维护 54 个工具适配的项目来说,这是唯一可持续的方式。硬编码的话,工具一升级你就得发版,根本跟不上。
提示:如果你打算自己给 Skills Manager 贡献适配器,优先检查目标工具是否已经有社区维护的配置模板。很多工具的格式差异其实很小,复用现有配置能省掉大量调试时间。
3. 从零跑通一次技能同步的完整链路
3.1 环境准备与首次启动
假设你现在什么都没装,想从零体验一次完整的技能同步。我把步骤拆细一点,包括那些文档里通常不写、但实际会卡住你的细节。
第一步是安装 Skills Manager 本体。作为跨平台桌面应用,它一般提供 Windows、macOS、Linux 三个平台的安装包。下载对应平台的版本,按常规方式安装即可。这里有个小坑:macOS 上如果是从非应用商店渠道下载的,首次打开可能被系统拦截,需要在"系统设置 - 隐私与安全性"里手动允许。这不是 Skills Manager 特有的问题,所有独立分发的 macOS 应用都这样。
第二步是首次启动。启动后它会做一次环境扫描,检测你机器上装了哪些 AI 编程工具。这个扫描逻辑通常是检查各个工具的默认安装路径和配置目录是否存在。如果某个工具你装在非标准位置,扫描可能漏掉,需要手动指定路径。
第三步是确认检测结果。这一步别急着跳过。我见过有人扫描完直接点下一步,结果发现常用的工具没被识别出来,后面同步一直不生效,排查半天才发现是工具没被检测到。花两分钟核对一下列表,比后面debug省事得多。
3.2 建立第一个技能源
环境准备好之后,建立你的第一个技能。建议从最简单的开始,比如一个"代码注释规范"技能,内容短、容易验证。
技能源的定义一般包含这几部分:
- 名称:唯一标识,建议用英文短横线命名,比如
code-comment-style。 - 描述:一句话说明这个技能干什么,会同步到支持描述字段的工具里。
- 适用范围:全局生效还是仅特定项目生效。
- 正文:具体的指令内容,用 Markdown 写。
正文部分我建议遵循一个原则:写得像给一个聪明但完全不了解你项目的新人看的。因为模型读技能的时候,就是这种状态。太简略它抓不住重点,太啰嗦它会忽略关键信息。我自己的经验是,一个技能正文控制在 30 到 80 行之间比较合适,超过 100 行就该考虑拆成多个技能了。
3.3 选择目标工具并执行同步
技能建好之后,勾选你要同步到的工具。这里有个策略问题:是全部勾选,还是只勾选常用的?
我的建议是先只勾选两三个,跑通流程再说。原因很简单:第一次同步大概率会遇到格式问题或路径问题,目标工具越多,排查越乱。先用两三个工具验证同步链路是通的,确认没问题了,再批量勾选剩下的。
执行同步后,Skills Manager 会逐个调用适配器,把技能写入各个目标位置。同步完成后,它会给出一个结果列表,标明每个工具是成功、失败还是跳过。失败的一定要看错误信息,通常会告诉你具体是路径不存在、权限不足还是格式转换出错。
3.4 验证同步是否真的生效
同步显示成功,不等于工具里真的生效了。这一步必须实际验证。
验证方法是:打开目标工具,触发一次会用到该技能的场景,看模型的行为是否符合技能定义。比如你同步的是"代码注释规范",就让工具写一段带注释的代码,看注释风格对不对。
如果没生效,按这个顺序排查:
- 确认文件真的写进去了:去目标目录看文件在不在,内容对不对。
- 确认工具读取的是这个位置:有些工具支持多个技能目录,可能读的是另一个。
- 确认是否需要重启:启动时扫描的工具,改完必须重启。
- 确认技能格式被正确解析:frontmatter 格式错了,工具会静默忽略整个技能。
这四步能覆盖 90% 的"同步了但没生效"问题。我踩过的坑基本都在这四步里。
4. 多工具技能冲突与优先级处理
4.1 同名技能在不同工具里的行为差异
当你把同一个技能同步到多个工具后,会遇到一个微妙的问题:同名技能在不同工具里的实际行为可能不一样。
原因在于,每个工具对技能的解释和执行都有自己的"个性"。同样一句"优先使用函数式写法",Claude Code 可能理解成"能用函数式就用",Cursor 可能理解成"禁止使用类"。这不是 Skills Manager 能控制的,是底层模型和工具实现决定的。
我的应对策略是:技能正文尽量写得无歧义。避免"优先""尽量""适当"这类模糊词,改成明确的规则。比如不写"优先使用函数式写法",而写"状态管理使用纯函数,副作用集中在明确的边界层"。规则越具体,跨工具的行为差异越小。
4.2 全局技能与项目技能的覆盖关系
Skills Manager 支持全局技能和项目技能两种粒度。全局技能对所有项目生效,项目技能只对特定项目生效。当两者冲突时,谁优先?
这个问题的答案取决于目标工具本身。有的工具项目级配置覆盖全局,有的反过来。Skills Manager 能做的是在同步时明确告知你冲突情况,让你决定怎么处理。
我自己的实践是:全局技能只放真正通用的规范,比如提交信息格式、代码注释风格、错误处理原则。项目特有的规则一律放项目技能。这样冲突的概率极低,因为两者管的是不同层面的事。
4.3 技能数量膨胀后的管理策略
用久了之后,技能会越来越多。我现在的技能库有 30 多个,如果不管理,找起来很痛苦。分享几个我摸索出来的策略:
按场景分组。把技能分成"编码规范""审查规则""文档生成""测试相关"几大类,每类下面再细分。Skills Manager 如果支持标签或分组,一定要用起来。
定期清理。每季度过一遍技能库,把半年没用过的、已经被工具内置功能替代的、内容重复的删掉。技能库不是越多越好,维护成本是随数量线性增长的。
版本化。重要的技能改动要留记录。Skills Manager 如果支持版本历史,改之前先看一眼旧版本;如果不支持,自己在技能正文里加个更新日志段落。
5. 二次开发:给 Skills Manager 加一个新工具适配器
5.1 先搞清楚目标工具的技能机制
假设你想给一个 Skills Manager 还没支持的工具加适配器。第一步不是写代码,是彻底搞清楚这个工具的技能机制。需要确认的信息包括:
- 技能文件放在哪个目录,全局和项目级分别是哪里。
- 文件格式是什么,有没有 frontmatter,字段有哪些。
- 技能是启动时加载还是实时加载。
- 有没有技能数量上限或文件大小限制。
- 技能之间有没有优先级或继承关系。
这些信息通常能在工具的官方文档里找到,找不到就去翻它的源码或社区讨论。别靠猜,猜错了适配器写出来也是错的。
5.2 适配器的最小实现
搞清楚机制后,写一个最小可用的适配器。核心逻辑就三步:读取统一格式的技能源,转换成目标工具格式,写入目标位置。
伪代码大概是这样:
class MyToolAdapter: def __init__(self, config): self.skill_dir = config["skill_dir"] self.format = config["format"] def convert(self, skill): # 把统一技能源转成目标格式 content = render_template(self.format, skill) return content def write(self, skill): content = self.convert(skill) path = os.path.join(self.skill_dir, skill.name + self.extension) with open(path, "w", encoding="utf-8") as f: f.write(content) return path关键点是错误处理要到位。目录不存在要创建,权限不足要报明确错误,格式转换失败要保留原始技能内容方便排查。这些细节决定了适配器好不好用。
5.3 测试适配器的三个层次
适配器写完必须测试,我建议分三层测:
单元测试:单独测格式转换逻辑,给一个技能源,看输出格式对不对。这层测试不碰文件系统,跑得快。
集成测试:在临时目录里跑完整的写入流程,验证文件真的被创建、内容正确。
端到端测试:在真实工具里加载同步后的技能,确认工具能识别、能生效。这层最慢但最重要,前两层过了不代表这层能过。
我踩过的坑是:单元测试和集成测试都过了,端到端测试发现工具对 frontmatter 的字段顺序有要求,顺序不对就解析失败。这种问题只有真实环境才能暴露。
6. 实际使用中的坑与经验
6.1 路径问题在 Windows 上的特殊性
跨平台应用最容易在 Windows 上翻车。Skills Manager 处理路径时,有几个 Windows 特有的坑:
反斜杠转义。Windows 路径用反斜杠,但在很多配置格式里反斜杠是转义字符。写配置的时候要么用正斜杠(Windows 也认),要么双写反斜杠。
用户目录差异。Windows 的用户目录是C:\Users\用户名,macOS 是/Users/用户名,Linux 是/home/用户名。适配器里不能硬编码,要用系统 API 获取。
长路径限制。Windows 默认路径长度上限是 260 字符,技能目录嵌套深了容易超。如果遇到写入失败但错误信息很模糊,先怀疑是不是路径太长。
6.2 技能同步的原子性问题
同步多个工具时,如果中途失败,会出现"部分工具同步了、部分没同步"的中间状态。这个状态很危险,因为你不确定哪些生效了。
我的做法是:同步前先备份,同步后做一致性检查。Skills Manager 如果支持事务性同步(要么全成功要么全回滚)最好;如果不支持,就手动在同步前把目标目录复制一份,出问题能快速恢复。
6.3 技能内容的版本管理
技能本质上是文本,应该纳入版本管理。但直接放 Git 有个问题:Skills Manager 同步出去的文件是"产物",不应该进版本库,只有技能源应该进。
我的目录结构是这样的:
my-skills/ sources/ # 技能源,进 Git code-review.md commit-style.md .skills-manager/ # Skills Manager 的工作目录,不进 Git .gitignore.gitignore里排除掉同步产物和 Skills Manager 的缓存。这样版本库里永远是干净的技能源,不会混入各工具的格式转换结果。
6.4 团队协作时的技能分发
如果团队多人使用 Skills Manager,技能源应该放在共享仓库里,每个人拉下来之后各自同步到本地工具。这样能保证团队规范一致。
但要注意个人偏好和团队规范的边界。团队规范放共享仓库,个人习惯(比如有人喜欢更详细的注释)放本地技能库。两者通过 Skills Manager 的优先级机制叠加,而不是混在一起。
注意:团队共享技能源时,改动要走 review 流程。我见过有人直接往共享仓库推了一个有问题的技能,导致全团队的 AI 工具行为异常,排查了半天才发现是技能内容写错了。
7. 这套方案适合谁,以及它的边界
Skills Manager 这类工具的价值,和你的工具使用复杂度强相关。如果你只用一款 AI 编程工具,那它对你的价值有限——单工具的技能管理,工具自带的设置面板基本够用。
但如果你符合下面任意一条,它就值得投入时间:
- 同时使用三款以上 AI 编程工具,且都在用自定义技能。
- 团队需要统一 AI 编码规范,但成员用的工具不统一。
- 经常调整技能内容,被多份副本的同步问题困扰。
- 想系统化管理自己的 AI 辅助编码知识库。
它的边界也要说清楚。Skills Manager 管的是技能的存储和分发,不管技能执行的效果。技能写得好不好、模型理解得对不对,它帮不上忙。另外,它依赖各个工具的技能机制稳定,如果某个工具大改技能格式,适配器需要跟着更新,这中间会有一段不可用期。
我自己用下来的体会是:它最大的价值不是省了那点同步时间,而是让技能管理这件事变得可维护。以前技能散落在各处,我根本不敢大改,怕改出问题找不到源头。现在所有技能有统一的源、统一的版本、统一的分发记录,改起来心里有底。这种"敢改"的信心,比省下来的时间更值钱。
最后分享一个我自己的小习惯:每次给技能库加新技能之前,先问自己"这个规则我三个月后还会用吗"。如果答案不确定,就先不加。技能库的克制,比技能库的丰富更重要——毕竟每多一个技能,就多一份要维护、要同步、要验证的东西。