六种可行方案 · AGENTS.md 团队同步 · MCP 闭源知识网关 · 分阶段落地路线
30 人团队、每人每天多次对话,全量预载有三个致命问题:token 成本爆炸、上下文窗口挤占、解读过期。Claude Code、Cursor、Devin 等业界产品演化出的标准架构是:
| 层级 | 内容 | 注入方式 | 体积 |
|---|---|---|---|
| L0 常驻层 | 仓库地图 + 架构简报(目录职责、模块关系、关键数据流、常见坑) | 每次对话默认注入 | 1–3k tokens |
| L1 检索层 | 代码切片的向量 / 关键词混合索引,或语义代码检索服务 | 按问题相关性动态检索 | 按需 |
| L2 探索层 | grep / 读文件 / LSP 跳转定义等工具 | agent 自主调用 | 按需 |
L0 解决「问什么都先懂这个仓库」,L1/L2 解决「问到具体函数时能看到真代码」。只做 L0 会答不准,只做 L1/L2 每次都要重新摸索、又慢又贵。
业界事实标准:AGENTS.md 是正在形成的开放规范(OpenAI Codex CLI、Cursor、Gemini CLI 等均已支持),Claude Code 使用 CLAUDE.md。文件放在仓库里随代码走,每次对话自动加载,无需任何人手动粘贴。
dsh-agent-instructions 模块):每个会话自动读取用户全局 ~/.dsh/AGENTS.md,以及从项目根到当前目录每一级的 AGENTS.md / CLAUDE.md;支持 AGENTS.local.md 本地个人偏好(不进 Git);支持子目录嵌套——agent 在哪个目录干活就自动加载哪份解读;内容相同的文件自动去重,单文件默认上限 1 MiB,且有整体预算控制。
落地示例:仓库根目录放一份「平台架构总览」,server/src/services/ios/ 放「iOS 内存剖析服务的设计与坑」,client/ 放前端结构说明。半小时即可让全组受益。
👉 每人环境各不相同时如何同步?见下方专题一。
方案 A 的短板是靠人维护会过期。解法是让 AI 在 CI 里自动生成和更新解读:
docs/codebase-brief.md(或直接更新 AGENTS.md 的附录段落);建一份全队共享的代码索引(embedding + BM25 混合检索效果最好):
MCP(Model Context Protocol)是当前 agent 生态的事实标准协议。团队部署一个共享 MCP server,暴露 search_code / get_module_architecture / find_symbol(LSP 语义跳转,如开源的 Serena)等工具,每个人的 agent 客户端连接同一个 server。好处:
👉 内部知识库如何对使用者保持闭源?见下方专题二。
30 人共用同一段 L0 常驻解读时,务必走 prompt / context caching(Anthropic、OpenAI、DeepSeek 均支持):相同前缀的缓存命中后成本降到原价的约 10%,且首 token 延迟大幅下降。如果团队统一走自建网关(如 LiteLLM),可以在网关层强制给每个请求注入同一段简报前缀——「默认加载」不再依赖每个人自觉配置,而是被平台保证的。
持久记忆适合存个人偏好和历史结论(「这位同事负责 websocket 模块」),不适合存代码事实——代码事实会过期,且记忆系统天然缺乏「随代码演进」的机制。团队级代码知识应优先使用 A–E。
结论:能用,而且方案 A 恰恰是最不怕环境差异的。它的同步机制非常干净——AGENTS.md 是仓库里的普通文件,走 Git 同步,不依赖任何人的本地配置,git pull 下来就有。这正是它成为业界标准的原因:把「agent 需要知道什么」当代码资产的一部分管理,而不是每个人的私有配置。
| 文件 | 位置 | 同步方式 | 放什么 |
|---|---|---|---|
AGENTS.md | 仓库根目录 | Git 同步,全员一致 | 仓库级架构解读、规范 |
<子目录>/AGENTS.md | 如 server/、client/ | Git 同步,全员一致 | 模块级解读(agent 在哪个目录干活就加载哪份) |
AGENTS.local.md | 各目录可选 | .gitignore,不同步 | 个人偏好(「回答用中文」「我负责前端」) |
~/.dsh/AGENTS.md | 每人 home 目录 | 本机文件,天生不同步 | 跨项目的个人习惯(语言、代码风格偏好) |
关键认知:这个体系故意把内容分成两类——代码知识进 Git(全队共享、随代码演进),个人偏好留本地(互不干扰)。你不需要「把每个人的环境同步成一样」,需要同步的只有前者,而前者本来就是 Git 的本职。
| 环境差异 | 是否构成问题 | 原因 |
|---|---|---|
| 操作系统不同(macOS / Linux / Windows) | 无影响 | AGENTS.md 就是 UTF-8 文本文件 |
| 仓库克隆路径不同 | 无影响 | DSH 加载器从项目根(默认以 .git 标记识别)逐级向下读到当前工作目录,与克隆在哪无关 |
| agent 工具不同(Claude Code / Cursor / Codex CLI) | 基本无影响 | 这些工具都认 AGENTS.md 或 CLAUDE.md;DSH 两者都读,且内容相同时自动去重(就算有人放了一份内容相同的 CLAUDE.md 也只渲染一次) |
| 各人 agent 全局配置不同 | 无影响 | 全局配置管个人偏好,项目文件管项目知识,互不覆盖 |
| 有人暂时没 pull 最新 | 唯一的「不同步」来源 | 和代码落后同一个性质,git pull 即解决 |
30 个人只要都能 git clone 这个仓库,方案 A 就自动对全员生效,零额外配置。
CODEOWNERS 里指定架构负责人必须审批;AGENTS.local.md / CLAUDE.local.md,防止个人偏好误提交污染全队;AGENTS.local.md 或 ~/.dsh/AGENTS.md;结论:可以,而且「内容闭源」恰恰是 MCP 相对方案 A / C 的核心优势。这源于 MCP 的根本特性——信任边界反转:方案 A 和 C 是把知识「分发」到每个人手里(文件、索引),MCP 是把知识「留在服务端」,别人只能隔着接口问。你的知识库、源码、索引、embedding 一 byte 都不用离开你的基础设施。
| 客户端可见 | 服务端可控性 |
|---|---|
| ① 工具清单 + 描述 + 参数 schema | 完全可控——想暴露几个工具暴露几个 |
| ② 它自己发起的调用参数 | 完全可控——服务端可校验 / 拒绝 |
| ③ 服务端返回的结果 | 完全可控——返回什么由你决定 |
服务端的实现代码、知识库原文、向量索引、embedding、内部文档——全都不在协议暴露面上。用户拿到的只是「问 → 答」的结果流,就像你可以调用一家公司的客服,却不可能拿到它的内部手册。
ask_kb(question) → 综合后的答案get_module_map(module) → 策划过的模块地图find_symbol(name) → 签名 + 摘要 + 文件行号引用关键设计决策:暴露什么粒度的工具,决定了泄露多少。
| ❌ 泄露式设计(别这么做) | ✅ 闭源式设计 |
|---|---|
read_document(id) 返回文档全文 | ask_kb(question) 返回综合后的答案 |
grep(pattern) 直接查内部库 | find_symbol(name) 返回签名 + 一句话摘要 + 文件行号引用 |
list_all_docs() 枚举知识库 | get_module_map() 返回你策划过的模块地图 |
最强闭源形态:工具内部做「RAG 检索 → 服务端 LLM 合成 → 只回传最终答案」,调用方的 agent 从头到尾没见过任何原始切片,只见过结论——「给答案,不给语料」(answer, not corpus)。
| ✅ 可以完全藏住 | ⚠️ 只能管控、不能根除 |
|---|---|
| MCP server 实现代码 | 用户把问到的答案复制出去(任何系统都无解) |
| 知识库原始文档全文 | 通过海量查询批量抽取语料(可用下面的手段压制) |
| 向量索引 / embedding | 答案中带出的局部片段 |
| 检索管道、prompt 模板、知识库规模与目录结构 | — |
针对右列的配套管控(均为 MCP 服务端的标准做法):
ask_kb、访客只读模块地图;| 档位 | 泄露风险 | agent 能力 |
|---|---|---|
| 返回原文切片 | 高 | 最强(agent 能自己细读代码) |
| 返回加工片段(摘要 + 定位) | 中 | 中(够回答多数问题;实践中的甜点位) |
| 只返回合成答案 | 最低 | 最弱(agent 沦为转发器,深挖能力取决于服务端合成质量) |
@modelcontextprotocol/sdk,作为客户端接入远程 MCP server 没有障碍;协议通用,团队里用 Cursor / Claude Code 的人连同一个地址即可。
| 方案 | 成本 | 新鲜度 | 准确性 | 内容可闭源 | 访问可审计 | 适合阶段 |
|---|---|---|---|---|---|---|
| A. AGENTS.md | 极低 | 靠人维护 | 中 | ❌ repo 权限即全文 | ❌ | 立刻做 |
| B. CI 生成解读 | 低 | 自动保鲜 | 中高 | ❌ 产物进 Git | ❌ | 第 1 个月 |
| C. 共享 RAG 索引 | 中 | 随 commit 重建 | 高 | △ 切片会回传 | △ | 第 2 个月起 |
| D. MCP 代码智能 | 中高 | 实时 | 最高 | ✅ 原生支持 | ✅ 调用留痕 | 平台化阶段 |
| E. 网关 + 缓存 | 低 | — | — | — | ✅ 网关日志 | 与 C/D 配套 |
| F. 记忆系统 | 低 | 差 | 低 | △ 个人本地 | ❌ | 仅个人偏好 |
「内容可闭源」= 知识库原文能否不给使用者;「访问可审计」= 能否留痕谁在何时问了什么。两项都是 MCP(方案 D)的独有优势,详见专题二。
仓库根目录 + 关键子目录编写 AGENTS.md(人工或让 agent 辅助生成初稿),全员立即受益。
CI 流水线自动再生成解读(方案 B),并让 L0 简报保持 ≤ 3k tokens;同步启用网关统一注入与 prompt caching(方案 E)。
建共享混合检索索引(方案 C)+ 接入语义代码 MCP server(方案 D);涉及内部知识库时直接采用闭源网关形态(见专题二),权限模型与审计日志从第一天就设计进去。
建立「黄金问题集」:收集团队真实问过的 50 个源码问题,每次调整注入策略就回归评测一次,防止「注入了很多但答案没变好」。
本团队环境中已有一个 xnu-source-analysis 技能——它就是「预制源码解读结果打包成可复用知识」的活样本(XNU 内核内存管理源码的结构化解读笔记,按需加载)。这与方案 B 的产物形态是同一件事:把解读沉淀为随仓库演进的资产,而不是每次对话现场重读源码。