Claude Code 是一款运行在终端里的 AI 编程助手,能够读取仓库代码、执行命令、生成补丁,甚至可以完成跨文件的改动。但当项目从单文件 demo 变成多模块工程后,一个真实问题就会出现:它并没有天然掌握“项目地图”。如果没有地图,Claude Code 经常会先猜测文件位置、重复扫描目录、忽略业务模块边界,最终在错误的地方产出代码。Mellos Mapping 插件要解决的问题就是这个:先扫描项目,生成一张 Claude Code 能直接读取的结构地图,然后让 Claude Code 带着地图去写代码。下面会按“原理 -> 环境 -> 生成地图 -> 实战使用 -> 最小实现 -> 排错 -> 最佳实践”的顺序,把这条工作流完整梳理清楚。
1. 为什么 Claude Code 需要一张项目地图
1.1 没有地图时,Claude Code 在大型项目里的典型表现
用过 Claude Code 的人可能都有类似体验:在小型仓库里,它表现得很聪明,能够直接回答“这个函数在哪里”“这段逻辑是干什么的”。但仓库一旦超过几十个文件,它的行为就开始变得像一位没有目录的实习生:会反复执行 ls 去猜测目录结构,会把两个同名文件搞混,会只盯着目标函数改数据,却忽略调用方是否兼容,甚至会忽略项目里已经存在的工具函数,自己再写一份重复实现。
造成这种局面的原因很直接。Claude Code 每一次对话能携带的上下文有限,它不可能把整个仓库一次性读进内存。当用户说“帮我改一下用户模块的返回结构”时,它只能通过对话中已有的文件内容、当前目录的文件名、以及自身对常见工程结构的先验知识去推断,而推断一旦偏离,错误就会沿着代码生成过程扩散。
举例来说,一个网关项目里同时存在 controller/UserController.java 和 admin/UserController.java。没有地图时,Claude Code 很可能选中第一个文件就开始改,而真实需求是后台用户管理。等到代码评审或联调阶段,才发现改动落在错误模块里。这类问题不是 Claude Code 语义理解不行,而是缺少一张能指明“哪个模块在哪、边界是什么、影响面有多大”的地图。
1.2 项目地图到底是什么
项目地图不是给人看的完整架构文档,而是给 AI 使用的结构化上下文。它把仓库里的关键信息压缩成一份简短文本或 JSON 文件,内容通常包括:
- 项目入口文件。
- 一级和二级目录的职责。
- 模块之间的依赖关系。
- 每个模块对外暴露的关键函数、类、接口或路由。
- 项目约定的命令,例如构建、测试、启动命令。
- 高风险区域或需要特别注意的约束。
“地图”这个词强调的是一种空间感。人进入一个陌生项目时,会先看目录结构,再看 README,再沿着调用链定位目标文件。地图就是把这一系列动作提前做完,并把结果压缩给 Claude Code。它不替代代码本身,而是替代“从零开始探索代码”的阶段。
下表对比了人眼查代码、Claude Code 无地图和有地图三种情况:
| 维度 | 人眼查代码 | Claude Code 无地图 | Claude Code 有地图 |
|---|---|---|---|
| 文件定位 | 扫目录结构 | 反复试探文件路径 | 从地图直接定位 |
| 模块边界 | 靠包名和工程经验 | 容易混淆同名模块 | 地图写明职责 |
| 影响面 | 搜索调用方 | 只盯着目标文件 | 地图标注依赖方 |
| 业务约定 | 看 README 和旧代码 | 经常忽略 | 地图明确约定 |
1.3 Mellos Mapping 插件在 Claude Code 工作流中的位置
Mellos Mapping 插件的定位不是代码生成器,也不是静态分析平台,而是一个“上下文压缩器”。它站在 Claude Code 和代码仓库之间,负责把仓库的物理结构、逻辑模块、依赖关系、变更影响面压缩成一张地图,然后交给 Claude Code 使用。
“Mapping”这个名字对应三层含义:
- 路径到模块的映射:告诉 Claude Code 哪个目录属于哪个业务模块。
- 模块到 API 的映射:把模块对外暴露的函数、类、路由汇总出来。
- 变更到影响面的映射:标注哪些模块改动起来风险更高,依赖方更多。
明白这层定位后,就不会纠结 Mellos Mapping 是不是一个复杂的框架。它的价值在“先画地图,再写代码”这个工作流上:让 Claude Code 在动手改代码之前,先建立一个对项目的整体认知。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Claude Code 从哪里读取上下文,地图应如何注入
2.1 上下文注入入口必须提前确认
要让地图发挥作用,必须知道 Claude Code 能从哪些入口读取信息。不同版本对上下文的支持方式略有差异,但常见入口包括:
- 在交互对话中通过
@文件路径的方式引用文件内容。 - 项目根目录下的说明文件,例如
CLAUDE.md、README.md。 - 启动 claude 时通过命令行参数传入的提示语。
- 通过管道把文件内容作为输入传给 claude。
最直接、门槛最低的方式是交互对话中的 @MAP.md 引用。用户只需要把生成的 MAP.md 放在项目根目录,然后在提示词里写“请先阅读 @MAP.md”。Claude Code 就会把 MAP.md 内容作为上下文的一部分参与后续生成。
这里有一个容易踩的坑:不要假设所有版本都支持同一种参数。落地前先执行 claude --help 查看当前版本支持的命令和参数,否则可能花大量时间配置一个根本没有被读取的入口。
注意:上下文入口和插件机制在 Claude Code 更新后可能调整,参考本文操作时,先确认当前版本的帮助信息,不要直接照搬旧命令。
2.2 Mapping 插件的四个阶段
Mellos Mapping 的工作流程可以拆成四个阶段:扫描、归纳、输出、刷新。
| 阶段 | 输入 | 输出 | 目标 |
|---|---|---|---|
| 扫描 | 项目目录、include/ignore 规则 | 文件清单 | 知道项目里有哪些代码 |
| 归纳 | 文件清单、源码内容 | 模块摘要、导出符号、依赖关系 | 把文件组织成业务模块 |
| 输出 | 归纳结果 | MAP.md / map.json | 生成 Claude Code 可读上下文 |
| 刷新 | 最新源码、旧地图 | 新地图 | 避免地图过期误导 AI |
扫描阶段决定“看哪些文件”,通常要忽略 node_modules、dist、.git、测试文件和构建产物。归纳阶段是核心,它把分散的文件自动归类到模块下,提取每个模块对外暴露的接口。输出阶段要生成一份短而准的地图。刷新阶段则是把地图纳入日常开发循环,代码变化后重新生成地图。
四个阶段不能跳过任何一个。只扫描不归纳,地图就是文件列表;只归纳不输出,Claude Code 还是看不到;输出后不刷新,地图就会变成过期信息。
2.3 地图设计应遵守的几条原则
地图不是越长越好。Claude Code 的上下文是有限资源,如果地图写了几千行,不仅浪费 token,还会让 AI 难以聚焦,最终表现反而比没有地图更差。设计地图内容时,建议遵守四条原则。
第一,地图要短。单张 MAP.md 建议控制在 1 到 3KB,超过 5KB 就应该考虑拆成多张模块地图,按需引用。
第二,地图要稳定。路径和导出名必须写准确,不能使用模糊描述,也不能输出随机顺序。内容稳定,Claude Code 才能形成稳定的项目认知。
第三,地图要可重复生成。地图必须由脚本生成,不能靠人工维护。人工维护的地图容易遗漏新文件,最终会变成团队里的“坏文档”。
第四,地图要脱敏。不要把密钥、内网地址、个人邮箱、生产环境连接串写进地图。地图要进入对话上下文,也可能被提交到代码仓库,敏感信息一旦写入,扩散面无法控制。
3. 环境准备与最小测试项目
3.1 工具清单与版本检查
本节先准备一个最小可复现环境。学习环境中建议使用最新稳定版本,生产环境则要结合团队现有工具链确认兼容性。
| 工具 | 作用 | 检查命令 |
|---|---|---|
| Claude Code CLI | 执行对话和编码任务 | claude --version |
| Node.js | 运行 Mellos Mapping 脚本 | node -v |
| Git | 项目版本控制与脚本入库 | git --version |
| 文本编辑器 | 查看生成的地图与源码 | 任意编辑器 |
如果 Node.js 版本过低,脚本中的某些语法可能不兼容,建议使用 Node.js 18 及以上版本。Claude Code CLI 的安装方式会随版本变化,以官方文档为准。安装完成后,先运行 claude --version,确认命令能被 shell 找到。
bash复制claude --version
node -v
git --version
三条命令都能正常输出版本号,再继续后续步骤。若 claude 命令找不到,需要先检查安装路径是否加入了环境变量,或者当前用户是否具有执行权限。
3.2 创建一个最小测试项目
为了验证地图生成和 Claude Code 读取效果,建议准备一个不超过十个文件的小项目。项目太小看不出模块边界,项目太大又会在调试时分散注意力。
示例目录结构:
code复制mapping-demo/
├── package.json
├── src/
│ ├── index.js
│ ├── auth/
│ │ ├── token.js
│ │ └── login.js
│ ├── order/
│ │ ├── price.js
│ │ └── create.js
│ └── utils/
│ ├── logger.js
│ └── redis.js
src/index.js 可以是入口文件,负责启动服务并注册路由,内部引用 auth/login.js 和 order/create.js。
javascript复制const { login } = require('./auth/login');
const { createOrder } = require('./order/create');
function start() {
console.log('server started');
console.log('/auth/login', login);
console.log('/order/create', createOrder);
}
if (require.main === module) {
start();
}
src/auth/token.js 是 auth 模块内部实现,供 login.js 调用:
javascript复制const { logger } = require('../utils/logger');
function createToken(userId) {
logger('create token for ' + userId);
return 'token-' + userId;
}
function verifyToken(token) {
return token.startsWith('token-');
}
module.exports = { createToken, verifyToken };
这个小项目虽然简单,但包含了入口、模块目录、内部依赖、跨模块调用等要素,足够验证 Mapping 工作流是否真的有效。
3.3 先手工画一张预期地图
在运行插件之前,先手工写一份预期地图,这样后面才能判断生成结果是否正确。
预期地图内容:
text复制入口: src/index.js
- 启动服务
- 注册 /auth/login 和 /order/create 路由
模块 auth:
- src/auth/token.js 负责 token 生成与校验
- src/auth/login.js 负责登录流程,依赖 token 和 redis
模块 order:
- src/order/price.js 负责价格计算
- src/order/create.js 负责订单创建,依赖 price
模块 utils:
- src/utils/logger.js 日志封装
- src/utils/redis.js 缓存封装
手工画地图的目的不是替代插件,而是在测试阶段建立一个“正确答案”。当插件生成的 MAP.md 和预期不一致时,可以快速判断是扫描规则写错了,还是归纳逻辑有问题。
4. 生成第一张 Mellos 地图
4.1 本地脚本怎么放
Mellos Mapping 如果还没有统一发布到插件市场,最稳妥的复现方式是把脚本放到本地用户目录,例如 ~/.claude/plugins/mellos-mapping/。这个目录只放插件脚本和配置,不污染系统全局路径,也便于卸载。
目录结构:
code复制~/.claude/plugins/mellos-mapping/
├── index.js
├── scanner.js
├── renderer.js
└── package.json
当插件正式提供安装器时,安装方式以官方文档为准。这里给出的本地脚本方案,目的是保证“Mellos Mapping”这套工作流可以立即复现,不依赖尚未确认的发布渠道。
4.2 配置文件里的参数
地图生成脚本需要一个配置文件,放在项目根目录下,命名为 mellos.config.json。
json复制{
"root": ".",
"entry": ["src/index.js"],
"include": ["src/**/*.js"],
"ignore": ["node_modules", "dist", ".git", "**/*.test.js"],
"output": "MAP.md",
"maxDepth": 3,
"showLineNumbers": false
}
参数含义如下表:
| 参数 | 含义 | 常见值 | 配置错误的表现 |
|---|---|---|---|
| root | 扫描基础路径 | "." | root 配错会生成空地图 |
| entry | 项目入口文件 | 实际入口路径 | 入口缺失时影响面分析不完整 |
| include | 需要扫描的文件规则 | src/**/*.js | 规则不匹配会漏掉模块 |
| ignore | 需要排除的规则 | node_modules、dist | 不排除 node_modules 会扫描极慢 |
| output | 地图输出文件名 | MAP.md | 路径错误时找不到文件 |
| maxDepth | 目录展示最大深度 | 3 | 过大导致地图膨胀 |
| showLineNumbers | 是否输出行号 | false | 输出行号后地图易过期 |
忽略 node_modules 是必须的。否则脚本会遍历海量第三方文件,生成的地图毫无意义,生成过程也会非常慢。
4.3 运行生成命令并查看 MAP.md
在项目根目录执行:
bash复制node ~/.claude/plugins/mellos-mapping/index.js --config ./mellos.config.json
预期输出类似:
text复制scanning 7 files
entry: src/index.js
module auth: 2 files, exports createToken, verifyToken, login
module order: 2 files, exports calcPrice, createOrder
module utils: 2 files, exports logger, redis
write MAP.md done
生成的 MAP.md 内容示例:
markdown复制# Project Map
## Entry
- src/index.js
- starts HTTP server
- routes: /auth/login, /order/create
## Module auth
- src/auth/token.js
- exports: createToken, verifyToken
- depends: src/utils/logger.js
- src/auth/login.js
- exports: login
- depends: src/auth/token.js, src/utils/redis.js
## Module order
- src/order/price.js
- exports: calcPrice
- src/order/create.js
- exports: createOrder
- depends: src/order/price.js
## Module utils
- src/utils/logger.js
- exports: logger
- src/utils/redis.js
- exports: redis
地图里每个模块只保留一句话职责、关键导出和直接依赖。不要写函数内部实现,也不要写具体行号,这样地图才不容易过期。
4.4 验证 Claude Code 是否读到地图
生成地图后,进入正确的工作目录启动 claude:
bash复制cd mapping-demo
claude
在对话中输入:
text复制请先阅读 @MAP.md,然后告诉我:这个项目的入口文件是什么,auth 模块依赖哪些文件?
如果地图生效,Claude Code 会回答“入口是 src/index.js,auth 模块依赖 token.js 和 login.js,引用 utils 下的 logger.js 和 redis.js”。如果你愿意,也可以使用非交互命令方式,但不同版本参数不同,使用前先看帮助信息。
验证这一步不能省略。地图文件存在,和 Claude Code 实际读到了地图,是两回事。如果不验证,后续所有基于地图的生成结果都不可信。
5. 先画地图再写代码的实战流程
5.1 一个典型任务:给 auth 模块加刷新令牌接口
假设现在要给 auth 模块新增刷新令牌接口。没有地图时,提示词通常只能写“给 auth 模块加刷新令牌接口”,然后等待 Claude Code 自行搜索。有地图后,提示词可以写得更明确。
text复制请先阅读 @MAP.md。
背景:auth 模块目前只有登录和 token 校验,现在需要新增刷新令牌接口。
要求:
1. 在 src/auth/ 下新增 refresh.js,导出 refreshToken 函数。
2. 在 src/index.js 中注册 /auth/refresh 路由。
3. 保持现有 token.js 和 redis.js 的使用方式,不要改动 order 模块。
4. 完成后更新 @MAP.md,把 refresh.js 加入 auth 模块。
这段提示词包含三层信息:目标、边界、验证方式。目标告诉 Claude Code 要做什么,边界告诉它不能碰什么,验证方式要求它最后更新地图。
5.2 地图降低“改错模块”概率的原理
没有地图时,Claude Code 需要靠猜测定位文件。它可能先 ls 看目录,再搜索关键词,最后选中一个路径开始改。如果项目里存在两个相似模块,它很可能选错。
有地图后,路径和模块关系是显式给出的。Claude Code 的工作从“搜索”变成了“按图定位”。它知道 auth 模块具体包含哪些文件,也知道修改 src/auth/refresh.js 不会波及 order 模块。即使最终代码仍有小问题,至少不会出现“改错模块”这种方向性错误。
在复杂任务里,还可以让 Claude Code 先输出影响面清单,再动手。提示词里增加一句:
text复制在动手之前,先列出本次改动涉及的文件和可能受影响的模块,确认清单后再写代码。
这会让 Claude Code 把“先画地图,再写代码”的理念继续下沉到单次任务内部。
5.3 代码完成后立即刷新地图
代码完成后,地图大概率已经过期:新增了 src/auth/refresh.js,但 MAP.md 还没有对应记录。此时必须重新生成地图。
bash复制node ~/.claude/plugins/mellos-mapping/index.js --config ./mellos.config.json
然后把 MAP.md 一起提交到 Git。检查 git diff 时,如果本次改动增加了新文件,而 MAP.md 没有变化,说明扫描规则可能漏掉了新文件,需要检查 include 和 ignore 配置。
如果担心团队成员忘记刷新,可以在 package.json 中配置脚本:
json复制{
"scripts": {
"map": "node ~/.claude/plugins/mellos-mapping/index.js -c ./mellos.config.json"
}
}
之后统一执行 npm run map,减少记忆成本。
6. 自己动手实现一个最小 Mellos Mapping 插件
6.1 最小插件目录结构
如果希望完全掌握 Mellos Mapping 的工作方式,最好的办法是自己实现一个最小版本。一个能生成 MAP.md 的插件只需要三个核心文件:入口、扫描器、渲染器。
code复制mellos-mapping/
├── index.js
├── scanner.js
├── renderer.js
└── package.json
package.json 可以保持最简:
json复制{
"name": "mellos-mapping",
"version": "0.1.0",
"private": true,
"bin": {
"mellos-map": "./index.js"
}
}
index.js 负责读取配置、调用扫描器和渲染器,是整个插件的入口。
6.2 目录扫描与忽略规则
扫描器的作用是把项目目录变成文件清单,同时应用 include 和 ignore 规则。Node.js 实现一个递归遍历函数:
javascript复制const fs = require('fs');
const path = require('path');
function walk(dir, ignore) {
const results = [];
if (!fs.existsSync(dir)) return results;
for (const item of fs.readdirSync(dir)) {
const full = path.join(dir, item);
if (ignore.some((p) => full.includes(p) || item.includes(p))) {
continue;
}
const stat = fs.statSync(full);
if (stat.isDirectory()) {
results.push(...walk(full, ignore));
} else {
results.push(full);
}
}
return results;
}
function scan(root, options) {
const ignore = options.ignore || ['node_modules', '.git', 'dist'];
const allFiles = walk(root, ignore);
return allFiles.filter((file) => {
return options.include
? options.include.some((pattern) => file.includes(pattern.replace('**', '')))
: true;
});
}
module.exports = { scan, walk };
这段代码中,ignore 是必须参数。如果漏掉 node_modules,扫描时间会明显变长。include 规则先按简化字符串匹配,真实项目中建议使用 glob 库。
6.3 提取导出符号和依赖
扫描到文件后,需要从源码里提取模块名称、导出函数和依赖文件。下面是一个教学级提取函数,适合理解思路,不适合直接用在大型生产项目:
javascript复制const fs = require('fs');
function extractExports(filePath) {
const content = fs.readFileSync(filePath, 'utf8');
const exportsList = new Set();
for (const line of content.split('\n')) {
const match = line.match(/module\.exports\s*=\s*\{/);
if (match) {
// 简单处理对象导出形式,示例仅用于说明
continue;
}
const funcMatch = line.match(/function\s+([A-Za-z0-9_]+)/);
if (funcMatch) {
exportsList.add(funcMatch[1]);
}
}
return [...exportsList];
}
真正的生产项目建议使用 Babel 或 TypeScript 的 AST 解析器,而不是正则表达式。正则无法可靠处理箭头函数、默认导出、复杂对象结构。这里的示例只是为了让读者理解提取逻辑的最小闭环。
6.4 渲染 MAP.md 并接入 Claude Code
渲染器把扫描结果按目录分组,然后输出 Markdown。核心逻辑可以简化成:
javascript复制function render(scanResult) {
const lines = ['# Project Map', ''];
for (const module of scanResult.modules) {
lines.push(`## Module ${module.name}`);
for (const file of module.files) {
lines.push(`- ${file.path}`);
if (file.exports.length) {
lines.push(` - exports: ${file.exports.join(', ')}`);
}
}
lines.push('');
}
return lines.join('\n');
}
module.exports = { render };
接入 Claude Code 有三种常见方式:
第一种是交互模式引用,每次任务前写“请先阅读 @MAP.md”。
第二种是 shell alias,把生成地图命令缩短:
bash复制alias mapp="node ~/.claude/plugins/mellos-mapping/index.js -c ./mellos.config.json"
第三种是在项目说明文件中写规则,让 Claude Code 自己养成先读地图的习惯。在 CLAUDE.md 中写入:
text复制## Workflow
- Before modifying code, read MAP.md.
- If MAP.md is missing, run: npm run map
- After code changes, update MAP.md.
第三种方式更符合“先画地图,再写代码”的长期习惯,因为它把规则固化到了项目本身。
7. 常见问题与排查路径
7.1 现象一:Claude Code 没有读取地图
症状是提问项目入口时,回答内容与 MAP.md 完全不一致,或者明显在猜测。
可能原因包括:当前目录不是项目根目录,@MAP.md 路径解析失败;提示词里没有引用地图;地图文件被写入到了错误目录;地图内容太长,关键信息被截断。
排查步骤:
- 执行
ls MAP.md,确认文件确实存在。 - 执行
pwd,确认当前目录就是项目根目录。 - 检查提示词里是否写了
@MAP.md。 - 打开
MAP.md看前几行,确认不是空文件。 - 缩小地图后重试一次简单的“列出入口文件”问题。
7.2 现象二:地图文件太大占满上下文
当地图超过几 KB,Claude Code 的响应会变慢,开始忽略细节,回答经常带有“根据上下文无法确认”一类的表述。
处理思路:
- 在 ignore 中加入
**/*.test.js和dist。 - 调小
maxDepth,把目录树控制在三层以内。 - 只输出公共 API,不输出函数内部实现。
- 如果项目确实有多个大模块,拆成
MAP-auth.md、MAP-order.md,按需引用。
单张地图控制在 3KB 以内是比较合理的经验值。
7.3 现象三:地图过期后 Claude Code 按旧地图工作
新增文件后,Claude Code 不知道新文件存在;接口改了,Claude Code 还按旧调用链分析。这是“地图过期”的典型表现。
解决方式是建立刷新习惯:每次代码变更后运行一次地图生成命令。更进一步,可以在 CI 中检查地图是否过期,例如把 MAP.md 的修改时间和源码最新修改时间做比较,源码更新则任务失败。
bash复制find src -name '*.js' -newer MAP.md | head -20
这条命令会列出比 MAP.md 更新过的源码文件。有输出就说明地图需要重新生成。
7.4 现象四:插件脚本运行失败
运行脚本常见的错误以及排查方式,可以直接查下表:
| 错误现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| Cannot find module './mellos.config.json' | 配置文件路径不对 | pwd、ls |
先 cd 到项目根目录,或使用绝对路径 |
| ENOENT: no such file or directory | 目录路径写错 | 检查 root 参数 | 确认 root 指向真实存在的目录 |
| EACCES: permission denied | 无读写权限 | ls -l |
调整目录权限或使用用户目录 |
| 扫描结果为空 | include 规则不匹配 | 打印扫描文件数 | 检查 include glob 语法 |
| 内存占用过高 | 未排除 node_modules | 查看配置 | 确认 ignore 包含 node_modules |
| 正则提取不到导出 | 代码语法复杂 | 检查 scanner 日志 | 替换为 Babel AST 解析 |
排查顺序固定在四个点上:先看配置,再看文件路径,再看权限,最后看解析规则。不要一上来就怀疑 Claude Code 或插件框架,多数问题出在配置和环境。
注意:如果环境是企业统一管理,且组织策略禁止使用 Claude Code,安装或登录时会出现权限类错误。此时需要联系管理员确认账号权限,不要绕开企业限制自行配置。
8. 地图内容与生产环境的最佳实践
8.1 地图里写什么,不写什么
好的地图应该尽量精简,使用一张表格可以快速确定边界:
| 建议包含 | 说明 |
|---|---|
| 入口点 | Claude Code 从这里开始追踪调用链 |
| 模块职责 | 每个模块用一句话说明 |
| 关键导出 | 函数、类、路由名 |
| 模块依赖 | 按需列出直接依赖,不展开深层链路 |
| 构建/测试命令 | 防止 Claude Code 用错命令 |
| 高风险区域 | 手动标注改动易出问题的模块 |
| 不建议包含 | 原因 |
|---|---|
| 每行代码 | 占据上下文,且容易过期 |
| 具体行号 | 改一行代码就失效 |
| 第三方库源码位置 | 没有维护价值 |
| 密钥、内网地址 | 安全风险,且可能违反企业规范 |
| 所有测试细节 | 地图膨胀最快的原因之一 |
8.2 团队协作和生产落地清单
如果地图要进入团队仓库,需要额外考虑几件事:
- 将
MAP.md纳入版本控制,生成脚本一起入库。 - 在 CI 里检查地图是否过期,源码比地图新则阻断合并。
- 多子项目使用独立地图,不要在根目录塞一张超大地图。
- 地图生成脚本使用最小权限,避免读取环境变量和密钥。
- 地图变更也需要 Code Review,防止有人手工篡改地图内容。
生产环境还要考虑地图生成脚本的执行者权限。用户在本地可以生成地图,但 CI 中运行脚本时,需要保证脚本运行账号有项目目录的读权限,有输出目录的写权限,同时没有额外权限读取敏感配置。
8.3 从地图走向架构治理
有了稳定生成的 MAP.md 之后,很多扩展方向都可以基于它展开。
第一个方向是依赖图。把 require 和 import 关系从地图中提取出来,渲染成可视化的依赖关系图,需求变更时能快速定位受影响模块。
第二个方向是需求映射。在模块说明中写入业务编号,当 Claude Code 被问到“订单金额计算逻辑在哪”时,可以通过地图定位到 src/order/price.js。
第三个方向是代码评审辅助。把地图和 git diff 结合,生成一条“本次改动影响模块”的清单,评审人员打开 MR 时第一眼就能看到风险面。
第四个方向是自动刷新。在编辑器保存文件时增量更新地图,避免手动执行命令。
这些方向都建立在“先有地图”的基础上。如果地图还不能稳定生成,先不要急着上架构治理平台,先把单张 MAP.md 做准、做短、做稳定。
8.4 给新手的练习顺序
如果要系统掌握这套工作流,建议按以下顺序练习:
- 在最小项目里手动写一张地图,确认自己理解模块边界。
- 跑通 Mellos Mapping 生成脚本,对比自动地图和手动地图。
- 让 Claude Code 根据地图完成一个两文件改动的小任务。
- 手动新增一个模块,检查地图是否能自动更新。
- 为团队项目配置
package.json脚本和 CI 校验。 - 在此基础上扩展依赖分析和影响面工具。
给 Claude Code 装地图这件事,真正价值不在脚本本身,而在让 AI 从“猜项目”变成“看项目”。先画地图,再写代码,应该成为 Claude Code 使用者的默认操作。从第一张 MAP.md 开始,这个习惯会越来越值钱。
