mini-cc 的技能系统:给 AI 装上“专业外挂”
引言今天咱们换个方向聊聊怎么给 AI喂点好饭——不是硬塞工具而是教它“怎么干活”。这顿饭就是技能系统Skill System。说实话刚开始琢磨这块的时候我挺纠结的AI 怎么才能从一个“啥都能聊”的聊天机器人变成一个能解决复杂问题的靠谱助手单纯给它堆工具Tool显然不够工具只管“做什么”不管“怎么做”。后来在深入学习 Claude code 源码的过程中逐渐领悟到——技能应该是可插拔的“能力模块”是教 AI 怎么做事的“说明书”而不是单纯让 AI 去调用某个函数。也去参考了 Anthropic 发布的 Agent Skills 开放标准。技能 vs 工具差在哪很多刚开始接触 AI 编程的朋友Tool 和 Skill 傻傻分不清。我打个比方你就明白了工具Tool是一把扳手AI 拿着它去拧螺丝。拧一下是一个独立动作用完就放下。技能Skill是 AI 背下来的一套“维修手册”。遇到问题它先翻手册按步骤判断“嗯这里得先检查电路再换电容最后测试”——手册一直挂在脑子里持续影响行为。更精准一点Tool 是“执行者”只负责单一功能Skill 是“协调者”通过编排工具实现复杂的业务逻辑。如果把 Tool 比作食材和厨具那 Skill 就是菜谱——光给 AI 一堆锅碗瓢盆没用它得知道“先烧水、再下面、等三分钟关火”才能煮出一碗面来。业界很多文章把 Tool、Skill、Agent 分别比作“肌肉、神经系统和大脑”Tool 提供基础执行能力Skill 实现标准化流程控制Agent 负责自主决策。这个比喻我觉得挺贴切。有了技能系统AI 就不再只是一个“会聊天的工具包”而是一个能持续进化的智能助手。接下来我们一起看看mini-cc 的技能系统到底长啥样以及我是怎么一步步踩坑填坑的。技能系统的核心概念mini-cc 的技能系统代码主要搁在src/skills/目录底下。核心组件就三个types.ts定义了技能的接口名字、描述、分类、Prompt、上下文等。SkillManager.ts技能的管理中心负责注册、加载内置用户自定义和搜索。built-in/内置技能的具体实现remember 记忆管理、simplify 代码简化、verify 代码验证。整个技能系统跑起来的流程大致是这样的┌─────────────────────────────────────────────────────────┐ │ Agent 循环 │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ Skill Manager │ │ │ │ (技能管理器) │ │ │ └────────┬─────────┘ │ │ │ │ │ ┌─────────────────┼─────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ remember │ │ simplify │ │ verify │ │ │ │ (记忆) │ │ (拆解) │ │ (验证) │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ │ │ │ └─────────────────┼─────────────────┘ │ │ ▼ │ │ 注入到 LLM 请求的 Prompt 中 │ └─────────────────────────────────────────────────────────┘核心思路其实很简单技能系统是挂在 Agent 主循环上的一道“预处理注入”机制。每次用户提问之前先把所有激活技能的 Prompt 揉在一起塞进 LLM 的系统指令里。LLM 根本不知道背后是谁干的它只觉得自己“好像变聪明了”——就像你早上喝咖啡不会去想咖啡豆是哪块地种的一样。核心数据结构技能在代码里长什么样我看看types.ts里的定义// src/skills/types.tsexportinterfaceSkill{name:string;// 技能唯一标识英文displayName:string;// 显示名称中文方便用户看description:string;// 技能描述category:SkillCategory;// 分类memory/code/analysis/workflow/customprompt:string;// 核心提示词——这是最精华的部分examples?:string[];// 使用示例tags?:string[];// 标签}exporttypeSkillCategory|memory// 记忆管理|code// 代码相关|analysis// 分析相关|workflow// 工作流|custom;// 自定义给你自己发挥注意真实的技能定义里没有execute方法这不是我偷懒而是技能的本质就不是“可执行代码”——技能的核心是一段精心设计的Prompt告诉 AI 应该怎么思考和行动。这个差异我一开始也踩过坑。Skill 与普通 Prompt 的本质区别在于Skill 是一份清晰、严谨、可执行的指令文档明确告诉 AI“在什么条件下按照哪些步骤产出什么结果”而不是一次性、临时性的口头交代。技能管理器实现管理器是整个技能系统的“大脑”用了单例模式确保全局只有一个实例。代码逻辑其实不复杂// src/skills/SkillManager.tsexportclassSkillManager{privatestaticinstance:SkillManager;privateskills:Mapstring,SkillnewMap();privateskillsByCategory:MapSkillCategory,Skill[]newMap();// 单例模式——确保全局只有一个publicstaticgetInstance():SkillManager{if(!SkillManager.instance){SkillManager.instancenewSkillManager();}returnSkillManager.instance;}// 注册技能同时按分类存储方便后面按类别查publicregisterSkill(skill:Skill):void{this.skills.set(skill.name,skill);constcategorySkillsthis.skillsByCategory.get(skill.category)||[];categorySkills.push(skill);this.skillsByCategory.set(skill.category,categorySkills);}// 搜索技能——你想找啥name/描述/标签/中文名都能命中publicsearchSkills(query:string):Skill[]{constlowerQueryquery.toLowerCase();returnthis.getAllSkills().filter(skillskill.name.toLowerCase().includes(lowerQuery)||skill.displayName.toLowerCase().includes(lowerQuery)||skill.description.toLowerCase().includes(lowerQuery)||skill.tags?.some(tagtag.toLowerCase().includes(lowerQuery)));}}管理器主要干三件事注册把技能存进 Map同时按分类整理好方便后面用搜索支持按名称、描述、标签模糊搜索——用户说“帮我找找关于记忆的技能”马上就能找到加载启动时自动加载内置技能和用户自定义技能JSON 格式内置技能实现mini-cc 目前内置了三个技能都是我在实际使用中反复打磨的“实用小工具”。Skill 的核心魅力正在于此它不是让 AI “多一个函数能调”而是让它“知道一种新的工作方法”。1. Remember 技能记忆管理这个技能专门用来“记东西”。用户说“记住我们使用 TypeScript 和 React”Agent 就会把这个信息存进长期记忆。下次再问“帮我写个组件”Agent 就会自动用前端的思路来答。// src/skills/built-in/remember.tsconstrememberSkill{name:remember,displayName:记忆管理,description:帮助 AI 记住重要信息存储到项目的 .ai_memory 文件中,category:memory,prompt:你是一个记忆管理助手。当用户要求你记住某些信息时你需要 1. 理解用户想要记住的内容 2. 将信息结构化存储到 .ai_memory 目录中 3. 使用清晰的分类如architecture, preferences, conventions, decisions 4. 为每条记忆添加时间戳和描述 记忆存储方式 - 使用两步走法则详细内容写入独立的 .md 文件 - 在 MEMORY.md 索引文件中添加指向该文件的单行链接描述 - 每个记忆文件可以包含 frontmatter 元数据type, description 等 请使用 FileWriteTool 或 FileEditTool 来创建和更新记忆文件。,examples:[请记住我们的项目使用 TypeScript 和 React,记住我喜欢使用函数式编程风格,请记录API 基础 URL 是 https://api.example.com],tags:[memory,persistence,context]};实现原理很简单通过 prompt 告诉 AI 在什么情况下该“记笔记”怎么提取关键信息以及用什么格式存。这部分 prompt 我反复改了好几版——一开始 AI 连“记住今天是周四”都往记忆里存后来加了“只记事实性信息不记对话细节”这条规则才总算老实了。Skill 的本质就是把这些“经验修正”固化下来。2. Simplify 技能代码简化这个技能专门用来“简化代码”。比如用户说“帮我简化 src/utils/helper.ts 中的代码”Simplify 技能会分析代码复杂度识别过长的函数、深层嵌套、重复代码然后应用重构技巧进行优化。// src/skills/built-in/simplify.tsconstsimplifySkill{name:simplify,displayName:代码简化,description:简化复杂代码提高可读性和可维护性,category:code,prompt:你是一个代码重构专家。当用户要求简化代码时你需要 1. 分析代码复杂度 - 识别过长的函数超过 50 行 - 识别深层嵌套超过 3 层 - 识别重复代码 - 识别复杂的条件逻辑 2. 应用重构技巧 - 提取函数将大函数拆分为小函数 - 提取变量用有意义的变量名替代复杂表达式 - 简化条件使用早返回、卫语句 - 消除重复提取公共逻辑 - 使用现代语法箭头函数、解构、可选链等 3. 保持功能不变 - 确保重构后的代码行为与原代码一致 - 建议运行测试验证 4. 提供对比 - 展示重构前后的代码对比 - 解释改进的原因 - 说明可读性和可维护性的提升 请使用 FileReadTool 读取代码使用 FileEditTool 进行重构。,examples:[请简化 src/utils/helper.ts 中的代码,重构这个函数让它更容易理解,这段代码太复杂了帮我优化一下],tags:[refactoring,code-quality,readability,maintainability]};这里的设计思路是用 prompt 引导 AI 建立结构化的重构思维而不是靠代码逻辑来“硬编码”简化方法。这样做的好处是灵活——今天优化前端代码明天优化后端逻辑AI 都能用同样的结构化思路去处理只要 prompt 写得够好就行。3. Verify 技能代码验证这个技能用来“检查代码质量”。比如用户说“检查 src 目录下的代码是否有问题”Verify 技能会按顺序执行编译检查、Linter 检查、测试检查并生成详细报告。// src/skills/built-in/verify.tsconstverifySkill{name:verify,displayName:代码验证,description:验证代码质量检查类型错误、linter 问题、测试覆盖率等,category:code,prompt:你是一个代码质量验证助手。当用户要求验证代码时你需要 1. 编译检查 - 运行 TypeScript 编译器检查类型错误 - 使用 BashTool 执行: npm run build 或 tsc --noEmit 2. Linter 检查 - 运行 ESLint 检查代码规范 - 使用 BashTool 执行: npm run lint 或 eslint . 3. 测试检查 - 运行测试套件 - 使用 BashTool 执行: npm test 4. 代码审查 - 使用 GrepTool 搜索常见问题模式 * console.log生产代码中的调试语句 * TODO/FIXME未完成的工作 * any 类型TypeScript 类型安全问题 * 硬编码的密钥或敏感信息 5. 生成报告 - 总结发现的问题 - 按严重程度分类 - 提供修复建议 请按顺序执行这些检查并生成详细的验证报告。,examples:[请验证当前项目的代码质量,检查 src 目录下的代码是否有问题,运行完整的代码验证流程],tags:[code-quality,testing,linting,verification]};这个技能的逻辑是让 AI 扮演“代码审查员”的角色按照既定流程检查代码质量。它会调用多种工具BashTool、GrepTool来执行不同的检查任务然后汇总成一份详细的报告。这是一个很实用的开发辅助功能帮助开发者在提交代码前确保代码质量。技能与 Agent 的集成技能是怎么跟 Agent 主循环捏合在一起的呢核心逻辑概括起来就是把技能的 prompt 合并成 LLM 的系统指令。// 技能集成的核心逻辑asyncfunctionrunSkillSystem(userInput:string):Promisestring{constskillManagerSkillManager.getInstance();// 1. 拿到所有启用的技能constenabledSkillsskillManager.getAllSkills();// 2. 把所有技能的 prompt 拼成一段超级“工作手册”constskillPromptsenabledSkills.map(skill{return【${skill.displayName}】\n${skill.prompt};}).join(\n\n);// 3. 注入到 LLM 的系统 Prompt 里constmessages[{role:system,content:你是 mini-cc 智能助手拥有以下专业能力\n\n${skillPrompts}},{role:user,content:userInput}];// 4. 调用 LLMconstresponseawaitprovider.chat(messages);returnresponse.content;}技能系统被挂在 Agent 循环的最前端。用户说的话进来之后先把所有激活技能的 prompt 合并成一段系统提示然后传给 LLM。AI 只知道自己接收到了一个“优化过”的输入并不知道背后是谁干的。这就是“给 AI 喂饭”的精髓——悄无声息地帮 AI 把问题变得更容易解决。技能管理命令mini-cc 提供了一组跟技能交互的终端命令方便你实时查看和管理// 显示所有可用技能exportfunctionshowSkillList():string{constskillManagerSkillManager.getInstance();constallSkillsskillManager.getAllSkills();conststatsskillManager.getStats();letoutput\n 技能系统\n\n;output共有${stats.total}个技能可用\n\n;// 按分类显示技能constcategories{memory: 记忆管理,code: 代码相关,analysis: 分析相关,workflow:⚙️ 工作流,custom: 自定义,};for(const[category,label]ofObject.entries(categories)){constskillsskillManager.getSkillsByCategory(categoryasany);if(skills.length0){output${label}\n;skills.forEach(skill{output•${skill.name}-${skill.displayName}\n;output${skill.description}\n;});}}returnoutput;}// 搜索技能exportfunctionsearchSkills(query:string):string{constskillManagerSkillManager.getInstance();constresultsskillManager.searchSkills(query);if(results.length0){return未找到匹配的技能: ${query};}letoutput找到${results.length}个技能\n\n;results.forEach(skill{output•${skill.name}-${skill.displayName}\n;output${skill.description}\n;});returnoutput;}对应的命令格式/skill显示所有可用技能按分类列出/skill name激活指定技能/skill search query搜索跟关键词相关的技能自定义技能mini-cc 支持用户自己写技能。你可以在用户级目录下放一个 JSON 文件一个自定义技能就诞生了。// ~/.mini-cc/skills/translate.json{name:translate,displayName:翻译助手,description:将中文翻译成英文或英文翻译成中文,category:workflow,prompt:你现在拥有翻译能力。请按照以下规则进行翻译 1. 识别用户输入的语言 2. 如果是中文翻译成英文如果是英文翻译成中文 3. 保持原文的语气和风格 4. 对于技术术语使用标准翻译 翻译示例 中文这是一个测试 英文This is a test 英文Hello World 中文你好世界,examples:[翻译你好世界,Translate: Hello World,帮我翻译这段话],tags:[翻译,语言,国际化]}配置好之后重启 mini-cc这个翻译技能就会自动加载AI 就会拥有“翻译助手”的能力。总结技能系统是 mini-cc 里一个低调但挺重要的组件三个内置技能remember 记忆管理、simplify 代码简化、verify 代码验证自定义技能支持JSON 文件就能写门槛不高按分类组织支持搜索方便管理无缝集成技能自动挂在 Agent 主循环上用户基本无感知核心设计理念其实就一句话技能不是让 AI“多一个函数可调用”而是让 AI“多一种做事的方法”。这就是 Anthropic 开源 Agent Skills 标准的思路与其给每个领域造一个专用 AI不如造一个通用 Agent再挂上可插拔的能力模块。P.S. 技能系统虽然现在还比较简单但方向是对的。2025 年底Anthropic 把 Agent Skills 发布为开放标准后2026 年这套规范已经被多家主流云服务商采纳形成了覆盖 3000 社区技能的生态。Gartner 预测2026 年 75% 的 AI 项目将聚焦于可组合的 Skills 而非单体 Agent——AI 开发正在从“手工作坊”向“工业化组装”转型。我下一步计划是让 mini-cc 的技能系统继续迭代让技能能跟 Claude、Cursor 等工具互认互用。毕竟给 AI 造一个“统一的充电接口”才是更长远的目标。源码地址https://github.com/you-want/mini-cc技能系统相关的代码主要在这几个文件里src/skills/types.ts技能接口定义src/skills/SkillManager.ts管理器实现单例模式src/skills/built-in/内置技能的具体实现欢迎围观也欢迎提 PR 加新技能顺便求个 ⭐Star救救孩子