1. 从一段“闪身步”说起:这个项目到底在折腾什么
第一次看到“闪身步”这个词,我脑子里浮现的是格斗游戏里那种侧身一闪、瞬间绕到对手背后的动作。后来才反应过来,这其实是个特别贴切的比喻——它形容的是在使用 Claude Code 这类 AI 编程助手时,通过一套轻巧的配置和指令切换,让 AI 在不同任务模式之间快速“闪身”,从写业务代码的常规状态,瞬间切换到调试、重构、文档生成或者测试补全等特定角色。而承载这套切换机制的东西,就是标题里说的Claude Code Mods。
说白了,Claude Code Mods 就是一套针对 Claude Code 这个命令行 AI 编程工具的“模组化配置方案”。它不是什么官方插件市场里的东西,而是社区里一帮重度用户自己摸索出来的一套玩法:通过自定义指令文件、项目级配置、上下文注入和快捷命令,把 Claude Code 从一个“什么都能聊两句”的通用助手,改造成贴合自己工作流的专用工具。你可以把它理解成给一把瑞士军刀换刀片——刀柄还是那个刀柄,但今天你要拧螺丝就装十字批头,明天要开瓶就换开瓶器。
这个内容适合谁看?我觉得有三类人最值得花时间琢磨。第一类是已经在用 Claude Code 或者类似命令行 AI 工具,但总觉得“差点意思”、每次都要重复交代背景的开发者;第二类是对 AI 辅助编程感兴趣,想看看别人怎么把工具用出花来的技术爱好者;第三类是做团队工具链建设的同学,想找一套可复制、可版本管理的 AI 配置方案。不管你是刚接触命令行 AI 的新手,还是已经用了几百小时的老手,这套模组化的思路都能给你省下不少重复劳动。
我自己的体会是,刚开始用 Claude Code 的时候,每次开新会话都要重新说一遍“这个项目用 TypeScript,测试框架是 Vitest,提交信息遵循 Conventional Commits”,说多了真的烦。后来接触到 Mods 这套思路,才意识到原来可以把这些东西固化下来,让 AI 一进项目就自动进入状态。这就像打游戏前先调好键位和灵敏度,而不是每局开局都去设置菜单里翻一遍。
2. 拆解 Claude Code Mods 的核心设计思路
2.1 为什么是“模组”而不是“插件”
这里得先厘清一个概念。很多人一听 Mods 就想到浏览器插件或者 VS Code 扩展,觉得应该有个图形界面,点一下安装就完事。但 Claude Code Mods 的本质不是二进制插件,而是一组约定优于配置的文件和目录结构。它利用的是 Claude Code 本身对项目上下文的读取能力,通过特定命名的文件来注入指令、角色定义和工具权限。
为什么选这种设计?因为命令行 AI 工具的核心交互方式是文本。你给它一段提示,它给你一段回复。如果搞成插件系统,反而要引入额外的运行时和依赖管理,复杂度上去了,灵活性却下来了。而用文件来定义模组,好处非常明显:可以直接用 Git 管理,可以按项目分支切换,可以 Code Review,可以复制粘贴给同事。我试过把一套调好的 Mods 配置直接打包发给团队里另一个人,他解压放到项目根目录就能用,零学习成本。
另一个考量是上下文窗口的利用效率。Claude Code 每次会话能处理的上下文是有限的,如果你把所有可能的指令都塞进去,真正留给代码和任务描述的空间就少了。模组化的思路是“按需加载”——平时只保留最核心的项目概览,当你要做特定任务时,再通过快捷命令把对应的模组指令注入进去。这就像出门带包,平时背个轻便的斜挎包,要去健身了再换成运动包,而不是把所有东西都塞进一个登山包里天天扛着。
2.2 模组的三个层次:全局、项目、会话
在实际操作中,我把 Claude Code Mods 分成三个层次来管理,这样既不会互相干扰,又能灵活组合。
全局层放的是跨项目通用的偏好。比如你习惯用中文回复、代码注释要写清楚边界条件、提交信息用英文、遇到不确定的 API 要先查文档再写代码。这些东西写在全局配置里,所有项目共享。我自己的全局配置里还有一条:“任何涉及文件删除的操作,必须先列出将要删除的文件清单并等待确认。”这条规则救过我至少两次,有一次 AI 差点把一个还没提交的临时目录整个删掉。
项目层放的是跟具体代码库强相关的信息。比如这个项目用的是 React 18 还是 Vue 3,状态管理用 Redux Toolkit 还是 Zustand,测试命令是pnpm test还是npm run test:unit,目录结构里src/features和src/components分别放什么。这些信息如果每次会话都手动输入,不仅浪费时间,还容易漏。项目层模组就是把这些“项目常识”固化下来。
会话层则是临时性的角色切换。比如你正在写一个复杂的正则表达式,想切换到“正则专家”模式,让 AI 用更严谨的方式帮你推导和测试;或者你刚写完一个模块,想切换到“代码审查员”模式,让它用挑剔的眼光找问题。会话层模组通常通过快捷命令触发,用完就退出,不影响后续的常规对话。
注意:三个层次的优先级要理清楚。我的做法是会话层覆盖项目层,项目层覆盖全局层。这样临时切换角色时,不会因为项目层里写了“用中文回复”而覆盖掉你想要的英文技术讨论。
2.3 闪身步的关键:角色切换的触发机制
“闪身步”这个比喻最传神的地方,在于它强调了切换的流畅性。如果每次切换角色都要手动输入一大段提示词,那就不叫闪身,叫原地转圈。Claude Code Mods 里实现快速切换的机制,主要靠两种方式。
第一种是自定义斜杠命令。Claude Code 本身支持一些内置的斜杠命令,比如/help、/clear。Mods 的思路是扩展这套命令体系,让你可以定义/review、/debug、/doc这样的快捷指令。按下回车的一瞬间,对应的模组指令就被注入到当前会话中,AI 立刻进入对应角色。我实测下来,从输入/review到 AI 开始用审查员口吻回复,延迟基本在一秒以内,体验非常顺滑。
第二种是文件监听与自动注入。这个稍微进阶一点,适合喜欢折腾的玩家。原理是监控某个特定文件的变化,当文件内容更新时,自动把新内容作为上下文推送给 Claude Code。比如你可以把当前正在编辑的文件路径写到一个.claude/active-file里,AI 就会自动聚焦到这个文件上,不用你每次手动粘贴代码。这个机制在调试场景下特别有用——你改一行代码,AI 就自动看到最新版本,省去了反复复制粘贴的麻烦。
这两种机制背后其实是一个共同的设计哲学:把重复性的上下文准备工作自动化,让人的注意力集中在真正需要思考的问题上。写代码本身已经够费脑子了,如果还要分心去记“我上次是怎么跟 AI 描述这个项目的”,那纯粹是浪费认知资源。
3. 核心细节解析与实操要点
3.1 目录结构与文件命名约定
Claude Code Mods 的落地,第一步是把目录结构搭对。虽然不同人的习惯略有差异,但社区里比较通行的做法是在项目根目录下建一个.claude文件夹,里面按功能划分子目录。下面这个结构是我自己用了半年多、迭代了七八个版本之后比较满意的一套:
.claude/ ├── mods/ │ ├── global.md # 全局偏好,所有项目共享 │ ├── project.md # 项目专属信息 │ ├── roles/ │ │ ├── reviewer.md # 代码审查员角色 │ │ ├── debugger.md # 调试专家角色 │ │ ├── documenter.md # 文档撰写角色 │ │ └── tester.md # 测试补全角色 │ └── snippets/ │ ├── api-pattern.md # 常用 API 调用模式 │ └── error-handling.md ├── commands/ │ ├── review.md # /review 命令定义 │ ├── debug.md # /debug 命令定义 │ └── doc.md # /doc 命令定义 └── config.json # 模组加载配置这个结构的关键在于职责分离。mods/roles里放的是角色定义,每个文件描述一个特定角色的行为准则和输出格式;commands里放的是触发入口,定义什么命令加载什么角色;snippets里放的是可复用的代码模式,避免在多个角色文件里重复写同样的内容。
文件命名上,我强烈建议用小写字母加连字符,不要用空格或中文。虽然 Claude Code 对中文文件名的支持没问题,但在跨平台协作时,中文文件名偶尔会在某些终端环境下出现编码问题。另外,角色文件名最好能直接反映角色用途,比如reviewer.md比role1.md不知道高到哪里去了——三个月后你回来看,还能一眼看懂。
提示:
.claude目录建议加入版本控制,但config.json里如果包含个人 API 密钥或本地路径,记得用.gitignore排除或者用环境变量替代。我踩过一次坑,把带本地绝对路径的配置提交到了公共仓库,结果同事拉下来之后路径全对不上,排查了半天。
3.2 角色定义文件的写法要点
角色定义文件是整个 Mods 体系里最核心的部分,它直接决定了 AI 切换到该角色后的行为表现。写得好,AI 就像换了一个人;写得不好,切了跟没切一样。我总结下来,一个高质量的角色定义文件应该包含五个要素。
第一是角色身份声明。用一两句话明确告诉 AI“你现在是谁”。比如审查员角色可以写:“你是一位有十五年经验的资深代码审查员,以严格但建设性的风格著称,善于发现边界条件遗漏和并发安全问题。”这句话看似简单,但它给 AI 设定了一个明确的 persona,后续的输出风格和关注点都会围绕这个身份展开。
第二是关注点清单。列出这个角色在干活时应该优先检查哪些方面。审查员角色可以列:空值处理、错误传播、资源释放、并发竞争、日志脱敏、性能退化风险。调试角色可以列:复现步骤、环境差异、最近变更、日志线索、二分定位。这个清单不用太长,五到八条足够,太长了 AI 反而抓不住重点。
第三是输出格式约定。明确告诉 AI 用什么结构来组织回复。比如审查员角色可以要求:“按严重程度分级输出,每条问题包含位置、现象、建议三部分,最后给一个总体评价。”调试角色可以要求:“先给出最可能的三个原因并按概率排序,再给出验证每个原因的具体命令。”格式约定能极大提升回复的可读性,也方便你快速扫读。
第四是禁止事项。这一条经常被忽略,但实际用起来非常关键。比如审查员角色可以写:“不要直接修改代码,只给出修改建议;不要对代码风格做主观评价,除非违反了项目已定义的 lint 规则。”调试角色可以写:“不要在没有验证的情况下断言根因;不要建议重启服务作为解决方案。”禁止事项能防止 AI 跑偏,减少无效输出。
第五是示例对话。如果某个角色的输出格式比较特殊,附上一到两个示例会非常有帮助。比如文档角色,你可以给一个“输入一段函数代码,输出对应的 JSDoc 注释”的示例。AI 看了示例之后,模仿的准确率会明显提升。我试过在测试角色里放一个“给定函数签名,输出三个边界测试用例”的示例,之后它生成的测试用例质量稳定了很多。
3.3 命令文件的触发逻辑
命令文件相对简单,它的作用是把用户输入的快捷指令映射到对应的角色文件。一个典型的命令文件长这样:
--- name: review description: 切换到代码审查员角色 role: roles/reviewer.md context: diff --- 请对当前变更进行审查。这里有几个细节值得展开。name字段定义了命令的触发词,也就是你在 Claude Code 里输入/review时匹配的内容。description是给人类看的说明,输入/help时会显示。role指向角色定义文件的路径,支持相对路径。context字段指定了自动注入的上下文类型,diff表示自动把当前的 Git diff 内容带上,这样你就不用手动粘贴变更了。
context字段支持的取值可以根据自己的需求扩展。我常用的有:diff(当前未提交的变更)、file(当前打开的文件)、selection(选中的代码片段)、test-output(最近一次测试运行的输出)。这个机制的本质是把“找上下文”这个动作也自动化掉。以前你要先跑git diff,复制输出,再粘贴给 AI,现在一条命令全搞定。
注意:
context自动注入的内容会占用上下文窗口。如果 diff 特别大,比如一次提交改了三十个文件,建议先缩小范围再触发命令,否则 AI 可能因为上下文太满而忽略掉关键部分。我的习惯是先用git add把不相关的变更暂存起来,只留要审查的部分在工作区。
4. 实操过程与核心环节实现
4.1 从零搭建一套可用的 Mods 配置
下面我以一个新项目为例,完整走一遍搭建流程。假设你刚 clone 了一个 TypeScript 后端项目,想给它配一套基础的 Mods。
第一步,创建目录骨架。在项目根目录执行:
mkdir -p .claude/mods/roles .claude/mods/snippets .claude/commands touch .claude/mods/global.md .claude/mods/project.md .claude/config.json第二步,填写全局模组。打开.claude/mods/global.md,写入跨项目通用的偏好:
# 全局偏好 - 回复使用中文,技术术语保留英文原文 - 代码注释使用英文,注释要解释“为什么”而不是“是什么” - 提交信息遵循 Conventional Commits 规范 - 涉及文件删除、数据库变更、依赖升级的操作,必须先列出影响范围并等待确认 - 不确定的 API 用法,先查官方文档再给出代码第三步,填写项目模组。打开.claude/mods/project.md,写入这个项目特有的信息:
# 项目信息 - 技术栈:TypeScript 5.x + Node.js 20 + Fastify - 测试框架:Vitest,测试文件放在 `src/**/*.test.ts` - 数据库:PostgreSQL,ORM 使用 Drizzle - 代码风格:ESLint + Prettier,提交前自动运行 - 常用命令: - 开发:`pnpm dev` - 测试:`pnpm test` - 类型检查:`pnpm typecheck` - 数据库迁移:`pnpm db:migrate`第四步,创建第一个角色。新建.claude/mods/roles/reviewer.md:
# 代码审查员 你是一位资深代码审查员,关注正确性、可维护性和安全性。 ## 关注点 - 空值和边界条件处理 - 错误传播路径是否清晰 - 数据库查询是否存在 N+1 问题 - 敏感信息是否可能泄露到日志 - 并发场景下的数据一致性 ## 输出格式 按严重程度分级:阻断、严重、建议、疑问。 每条包含:文件位置、问题描述、修改建议。 最后给出总体评价和是否建议合并。 ## 禁止事项 - 不要直接修改代码 - 不要对命名风格做主观评价 - 不要建议引入新的依赖,除非明确说明理由第五步,创建对应命令。新建.claude/commands/review.md:
--- name: review description: 审查当前变更 role: roles/reviewer.md context: diff --- 请审查当前工作区的变更。第六步,在config.json里注册模组加载顺序:
{ "loadOrder": ["global.md", "project.md"], "rolesDir": "mods/roles", "commandsDir": "commands" }这套配置搭好之后,你在项目里输入/review,Claude Code 就会自动加载全局偏好、项目信息和审查员角色,并把当前 diff 带上,直接开始审查。整个过程不需要你手动粘贴任何东西。
4.2 参数选择与性能权衡
在搭建过程中,有几个参数需要根据实际情况调整,调得好能明显提升体验,调不好反而添乱。
上下文注入的粒度。context: diff很方便,但如果你的项目提交频率很高,每次 diff 都很大,AI 的回复质量会下降。我的经验是,单次注入的 diff 行数控制在 500 行以内比较稳妥。超过这个量,AI 容易只关注开头和结尾,中间部分被忽略。如果变更确实很大,建议拆成多次审查,或者先用git add -p把变更分块。
角色文件的长度。角色定义不是越长越好。我试过写一个两千字的审查员角色文件,结果 AI 反而抓不住重点,回复变得又臭又长。后来精简到五百字左右,只保留最核心的关注点和格式约定,回复质量反而提升了。这背后的道理很简单:上下文窗口是稀缺资源,角色定义占得越多,留给实际代码的空间就越少。
命令的响应延迟。自定义命令的响应速度取决于角色文件的加载方式和上下文注入量。纯文本角色文件加载几乎无感,但如果角色文件里引用了大量 snippet,或者context字段注入了大文件,延迟就会上来。我实测下来,角色文件控制在 1KB 以内、上下文注入控制在 10KB 以内时,从输入命令到 AI 开始回复的延迟基本在可接受范围内。
多角色组合的复杂度。有时候一个任务需要多个角色配合,比如先审查再调试。我的做法是不要试图在一个命令里塞多个角色,而是保持命令的单一职责,让用户手动串联。/review完了之后,如果发现问题,再输入/debug。这样每个角色的行为都清晰可控,出了问题也容易定位是哪个角色的定义有毛病。
4.3 一个完整的调试场景实录
光说理论没意思,我拿一个真实场景走一遍。假设你在开发一个订单接口,测试报了一个偶发的 500 错误,日志里只有一句“Cannot read property 'id' of undefined”。你想用 Mods 来辅助定位。
首先,你输入/debug,触发调试角色。调试角色的定义文件里写了关注点包括“复现步骤、环境差异、最近变更、日志线索、二分定位”,输出格式要求“先给出最可能的三个原因并按概率排序,再给出验证每个原因的具体命令”。
AI 收到当前 diff 和错误日志后,回复可能是这样的:
最可能的原因排序:
- 订单查询返回了空结果,但调用方没有做空值检查(概率高)
- 并发场景下订单被其他事务删除,查询和后续操作之间存在时间窗口(概率中)
- 数据库连接池耗尽导致查询返回异常值(概率低)
验证命令:
- 原因 1:在
getOrderById调用后加日志,打印返回值- 原因 2:检查该订单的删除操作是否有事务保护
- 原因 3:查看连接池监控指标
你按照建议加了日志,发现确实是空值问题。然后你输入/review,让审查员角色检查你的修复方案。审查员会关注“空值处理是否完整”“错误传播是否清晰”“是否有测试覆盖”。整个流程下来,从发现问题到修复验证,AI 始终在正确的角色里工作,没有出现“一会儿帮你写代码一会儿帮你查日志”的混乱。
这个场景里最关键的一点是:角色切换让 AI 的注意力聚焦了。如果不用 Mods,你可能会在一个会话里既让它分析日志又让它改代码,结果它可能在你还没定位清楚根因的时候就急着给修复方案,反而干扰判断。闪身步的价值就在这里——该分析的时候专心分析,该动手的时候再动手。
5. 常见问题与排查技巧实录
5.1 模组不生效的排查路径
这是新手最常遇到的问题:明明配好了文件,输入命令却没有任何反应。我整理了一个排查顺序,按这个顺序走一遍,九成问题都能解决。
| 排查步骤 | 检查内容 | 常见原因 |
|---|---|---|
| 1 | 命令文件是否在commands目录下 | 放错目录或文件名拼写错误 |
| 2 | 命令文件的 frontmatter 格式是否正确 | 缺少---分隔符或字段名拼写错误 |
| 3 | 角色文件路径是否相对于项目根目录 | 用了绝对路径或错误的相对路径 |
| 4 | config.json是否被正确加载 | JSON 格式错误或文件位置不对 |
| 5 | Claude Code 版本是否支持自定义命令 | 旧版本可能不支持某些字段 |
我踩过最坑的一次是 frontmatter 里的name字段写成了Name,大小写不匹配,结果命令死活触发不了。排查了半小时才发现是大小写问题。从那以后我养成了一个习惯:所有配置字段名统一用小写,需要驼峰的地方用连字符替代。
另一个常见问题是角色文件里的 Markdown 格式被误解析。比如你在角色定义里写了一个代码块,但忘记闭合,后面的内容全被当成代码,AI 读到的角色定义就是残缺的。建议写完角色文件后,用 Markdown 预览工具检查一遍渲染效果,确认没有格式错乱。
5.2 角色行为不符合预期的调整方法
有时候模组生效了,但 AI 的表现跟你想的不一样。比如你定义了审查员角色,但它回复得特别简短,或者关注点跑偏了。这种情况通常有三个原因。
角色定义太抽象。如果你只写“你是一个审查员”,AI 就按它自己的理解来。但如果你写“你是一个关注空值处理和并发安全的审查员”,它就会往这个方向靠。定义越具体,行为越可控。我建议每个关注点都用“检查 XXX 是否存在 YYY 问题”的句式,比单纯列关键词效果好得多。
禁止事项不够明确。AI 有时候会“过度帮忙”,比如你让它审查,它顺手把代码改了。这时候需要在禁止事项里明确写“不要修改任何文件,只输出建议”。我试过在调试角色里加一条“不要建议重启服务”,因为之前它老是把重启当万能药,加了这条之后就老实了。
示例不够典型。如果你给了示例,但示例跟实际场景差距太大,AI 可能会生搬硬套。比如你给了一个“审查 Python 代码”的示例,但实际项目是 TypeScript,AI 可能会用 Python 的思维来审查。示例最好用项目实际使用的语言和框架来写。
提示:调整角色定义时,建议一次只改一个地方,然后立刻测试效果。如果一次改太多,出了问题你都不知道是哪个改动导致的。我一般会在 Git 里单独提交角色文件的修改,方便回滚和对比。
5.3 多项目共享与个性化覆盖
当你同时在多个项目里使用 Mods 时,会遇到一个矛盾:有些配置想全局共享,有些配置想项目独有。我的解决方案是分层加载加项目覆盖。
具体做法是:把真正通用的偏好放在一个独立的全局目录里,比如~/.claude-mods/global.md,然后在每个项目的config.json里通过extends字段引用它。项目自己的project.md里可以覆盖全局配置中的任何条目。比如全局配置说“回复用中文”,但某个项目是给海外团队看的,项目配置里就可以写“回复用英文”,覆盖掉全局设置。
这个机制的关键是加载顺序。后加载的配置覆盖先加载的。所以config.json里的loadOrder数组顺序很重要:全局配置放前面,项目配置放后面。我见过有人把顺序写反了,结果项目配置被全局配置覆盖,排查了半天。
另一个实用技巧是用环境变量做条件加载。比如你在config.json里写:
{ "loadOrder": ["global.md", "${PROJECT_ENV:-project}.md"] }这样当PROJECT_ENV环境变量设为staging时,会加载staging.md而不是默认的project.md。这个技巧在需要针对不同环境切换 AI 行为时特别有用,比如生产环境相关的操作要更谨慎,就可以在production.md里加更严格的确认规则。
5.4 性能与上下文管理的经验
用久了 Mods 之后,你会发现一个瓶颈:上下文窗口。角色定义、项目信息、代码片段、对话历史,全都在抢那点空间。我的经验是把上下文当成预算来管理。
首先,定期清理不再使用的角色和 snippet。我每两周会 review 一次.claude目录,把过去两周没用过的角色文件归档到.claude/archive里。这样加载时不会把无关内容带进来。
其次,对于大文件,不要整个注入。比如你要审查一个 800 行的文件,不要用context: file把整个文件带上,而是用context: selection只带你选中的那几十行。Claude Code 支持读取选区内容,这个功能在审查大文件时特别有用。
第三,对话历史要主动清理。Claude Code 的会话历史会占用上下文,如果一次会话聊了太久,早期内容会被挤掉。我的习惯是完成一个阶段性任务后,输入/clear清空历史,然后重新加载需要的模组。这样每次会话的上下文都是干净的,AI 的回复质量也更稳定。
最后分享一个我最近在用的技巧:用 snippet 文件做“上下文压缩”。比如项目里有一套固定的 API 响应格式,与其每次让 AI 去读代码理解,不如写一个api-response.mdsnippet,用十几行描述清楚格式和约定。AI 读 snippet 比读源码快得多,占用的上下文也少。这个思路本质上是用人类的总结能力来弥补 AI 的上下文限制,实测下来效果很好。
6. 这套玩法还能怎么扩展
聊到这里,Claude Code Mods 的核心思路和实操方法基本讲完了。但我想再展开一下,因为这套模组化的思路其实不局限于 Claude Code 这一个工具。任何命令行 AI 助手,只要支持自定义指令和上下文注入,都可以套用类似的架构。
我最近在尝试的一个方向是把 Mods 和项目的 CI 流程结合起来。比如在 CI 里加一个步骤,用审查员角色自动检查 PR 的变更,把发现的问题作为评论发到 PR 上。这样人工审查之前,AI 已经过了一遍,能过滤掉不少低级问题。实现方式也不复杂,就是在 CI 脚本里调用 Claude Code 的命令行接口,加载对应的角色文件,把 diff 传进去,解析输出。
另一个方向是团队共享的角色库。我们团队现在维护了一个内部的角色仓库,每个人都可以贡献自己调好的角色定义。比如有人擅长写正则,就贡献一个“正则专家”角色;有人对数据库优化有心得,就贡献一个“SQL 审查员”角色。新项目直接引用这个仓库里的角色,不用从零开始调。这个做法有点像内部的知识沉淀,把个人的经验变成了团队可复用的资产。
还有一个我觉得很有潜力的方向是动态角色生成。现在的角色定义都是手写的,未来可以尝试让 AI 根据项目特征自动生成角色文件。比如扫描一遍代码库,识别出技术栈、测试框架、代码风格,然后自动生成对应的项目模组。这个想法我还在实验阶段,目前的效果是生成的模组大概有七成内容可以直接用,剩下三成需要人工调整。但即便这样,也比从零开始写省事多了。
最后说一个我个人的小体会。用 Claude Code Mods 这半年多,最大的收获不是省了多少时间,而是它逼着我把很多隐性的项目知识显性化了。以前很多约定俗成的东西只存在于老员工的脑子里,新人来了要口口相传。现在写模组文件的时候,不得不把这些东西一条条写清楚。这个过程本身就是在做知识管理。所以哪怕你最后不用 Claude Code 了,这套模组文件依然是一份有价值的项目文档。