双工具协同实践¶
本文你会学到:
- 🤔 为什么两者可以在同一台电脑上协同工作
- 🗂️ 扩展体系(Skills / Hooks / MCP / Instructions)哪些可以共享、哪些要各自维护
- 📌 防止配置冗余的单一来源策略
- 🎯 不同任务场景下如何选择工具
🚀 上手路径:三步落地¶
如果你是第一次做双工具协同,按这个顺序落地即可,不要一上来就搭全套:
第一天:在项目根创建一份
CLAUDE.md,删除(或改为符号链接)已有的.github/copilot-instructions.md第一周:把共用的 MCP 配置迁到
.mcp.json,凭证换成环境变量第一月:根据团队实际痛点再考虑 Skills 和 Hooks
大部分团队用好前两步已经足够。
🤔 为什么两者值得同时使用?¶
GitHub Copilot CLI 和 Claude Code 并不是互相替代的关系,它们在设计哲学上有明显分工:
Copilot CLI强调 AI 与人类的职责分工——每一步都可以审批确认,内置 GitHub MCP,对 Issue / PR / CI 的原生集成无需额外配置Claude Code强调代理自主性——Sub-agents 并行执行、百万 token 上下文窗口,适合跨越多文件的复杂任务
两者共同遵循 MCP 协议、AGENTS.md 跨平台规范,以及部分相同的扩展目录格式。这意味着你不需要为两个工具各维护一套配置——大多数扩展只需写一份,两者都能读到。
⚙️ 扩展体系协同概览¶
全局层
| 类型 | Claude Code | Copilot CLI | 可否共享 |
|---|---|---|---|
| 配置目录 | ~/.claude/ |
~/.copilot/(Windows:%USERPROFILE%\.copilot\) |
❌ 各自独立 |
| 全局指令文件 | ~/.claude/CLAUDE.md |
~/.copilot/copilot-instructions.md |
❌ 各自维护 |
| MCP 配置 | ~/.claude.json(mcpServers 字段) |
~/.copilot/mcp-config.json |
❌ 各自维护 |
| Skills | ~/.claude/skills/ |
~/.claude/skills/(兼容) |
✅ 共用 |
| Hooks | ~/.claude/settings.json hooks 字段 |
~/.claude/settings.json(兼容) |
✅ 共用 |
| Agents / Sub-agents | ~/.claude/agents/ |
无对等概念 | ❌ Claude Code 独有 |
| 会话/历史 | ~/.claude/projects/ |
Copilot CLI 自有存储 | ❌ 格式不同 |
项目层
| 类型 | Claude Code | Copilot CLI | 可否共享 |
|---|---|---|---|
| 项目指令 | ./CLAUDE.md(及子目录层叠) |
./AGENTS.md / .github/copilot-instructions.md |
✅ 共用 CLAUDE.md |
| 项目级 MCP | ./.mcp.json |
./.mcp.json(两者共用) |
✅ 共用 .mcp.json |
| Skills | .claude/skills/ |
.claude/skills/(兼容) |
✅ 共用 .claude/skills/ |
| Hooks | .claude/settings.json hooks 字段 |
.claude/settings.json(兼容)/ .github/hooks/*.json |
✅ 共用 settings.json |
| Agents / Sub-agents | .claude/agents/ |
无对等概念 | ❌ Claude Code 独有 |
| 忽略文件 | .gitignore(默认复用)+ settings.json 的 permissions.deny |
.gitignore(直接读取) |
✅ 部分共享 |
共享能力分级¶
可直接共享(高价值)
- 项目指令文件:
CLAUDE.md同时被两个工具读取,维护一份即可 - MCP 服务器配置:
.mcp.json的mcpServers字段 schema 完全兼容 - Skills:
.claude/skills/目录两者均自动加载 - Hooks:
.claude/settings.json的hooks字段两者均识别
部分可共享(需注意)
- 忽略文件:Claude Code 默认复用
.gitignore。如需在此之外额外排除(例如.env.local参与 git 但不希望 AI 读),在.claude/settings.json的permissions.deny中声明,而不是新增.claudeignore。Copilot CLI 直接读.gitignore - 自定义斜杠命令:Claude Code 的
~/.claude/commands/*.md是其专有机制,Copilot CLI 无完全对等方案,只能手动引用 prompt 片段 - 环境变量:项目级
.env(非密钥部分)两者均可读取,凭证类环境变量各自独立
不能共享
| 内容 | 原因 |
|---|---|
| 认证凭证 | Claude Code 用 Anthropic API key,Copilot CLI 用 GitHub OAuth,机制不同 |
| 会话历史 | 格式与存储位置都不同,无法互通 |
| 模型选择 / Sub-agents | Sub-agents 是 Claude Code 独有机制,.claude/agents/*.md 文件在 Copilot CLI 中会被忽略,不会报错也不会生效;Copilot CLI 模型切换也独立 |
| Claude Code Hooks | PreToolUse/PostToolUse 等事件类型在 Copilot CLI 中无对等概念 |
📋 指令层:消除冗余的单一来源策略¶
项目级规范:只写一份 CLAUDE.md¶
最容易产生冗余的地方是项目规范。你可能有这样的疑问:
我用 Copilot CLI 时应该维护
.github/copilot-instructions.md,用 Claude Code 时应该维护CLAUDE.md——两份文件要同步,太麻烦了。
实际上不需要两份。根据 Copilot CLI 的文档,仓库根目录的 CLAUDE.md 会被 Copilot CLI 自动读取,效果与 AGENTS.md 完全相同。
如果你更倾向于以 AGENTS.md 作为开放规范的统一源(未来迁移其他 AI CLI 更方便),也可以反向建立符号链接:
两种方向都可行,关键是**只维护一份**,另一份用符号链接指向它。
推荐结构(项目级):
不要同时维护 CLAUDE.md 和 .github/copilot-instructions.md,内容重复不仅需要人工同步,还会双倍消耗上下文 token。较新版本的 Copilot CLI 已支持自动去重(具体版本以官方文档为准),但语义冗余仍然存在。
📊 内容归属决策表¶
在展开具体策略前,先用这张表确定"一条信息应该放哪里"——这是后续两节(三文件同步 + Monorepo 分层)共同遵循的总纲:
| 内容类型 | 单项目 | Monorepo |
|---|---|---|
| 技术栈、架构拓扑 | docs/ARCHITECTURE.md |
根 docs/ARCHITECTURE.md |
| 跨文件/跨模块约定 | docs/CONVENTIONS.md |
根 docs/ + 子项目覆盖 |
| AI 行为偏好(语言、提交信息格式等) | CLAUDE.md |
根 CLAUDE.md |
| 本项目特定技术栈、命令 | CLAUDE.md |
子项目 CLAUDE.md |
| 给人看的入门指引 | README.md |
根 + 各子项目 README.md |
三文件同步 和 Monorepo 分层是同一套体系在不同规模下的应用——前者是简单场景,后者是复杂场景。
📄 三文件同步:以 docs/ 为权威来源¶
同时维护 README.md + CLAUDE.md + copilot-instructions.md 时,三份文件极易内容重叠、更新时漏掉一份。根本解法是把"谁是权威来源"按信息类型切分清楚。
推荐目录结构
docs/ 里的文件是权威来源,CLAUDE.md 和 copilot-instructions.md 都**引用**它们,不复制内容。
README.md(只给人看,不写 AI 指令)
在 README 里塞"请遵循 xxx"之类的 AI 指令,会让人类读者困惑,也让 README 失焦。只写项目入口,链接到 docs/:
CLAUDE.md(只写 Claude 特有内容,用 @ 引用共享文档)
Claude Code 支持 @文件路径 语法,会自动把引用的文件加载进上下文,无需复制内容:
| CLAUDE.md | |
|---|---|
.github/copilot-instructions.md(只写 Copilot 特有内容)
Copilot CLI 没有 @ 引用机制,但在需要时会读取被提到的文件路径:
| .github/copilot-instructions.md | |
|---|---|
效果:更新技术栈只改 docs/ARCHITECTURE.md 一处,三个地方自然同步,不会漂移。
进阶:用生成脚本代替手动引用(不推荐作为默认方案)
@ 引用是懒加载机制,比拼接文件更省 token,默认应优先使用引用方式。以下场景才考虑生成脚本:
- 目标工具不支持文件引用
- CI 机器人需要单文件投喂
- 需要给非 AI 系统(如合规审计)产出快照
⚠️ 生成产物建议加入
.gitignore并在 pre-commit 时再生成,避免 PR diff 噪音。如果生成产物参与 Git,还需要在 CI 里跑一遍脚本,维护成本明显高于引用方式。
目录级规范:各有所长¶
| 层级 | Claude Code | Copilot CLI | 建议 |
|---|---|---|---|
| 子目录规范 | 子目录 CLAUDE.md(自动层叠) |
.github/instructions/*.instructions.md(按 applyTo 匹配) |
优先用 Copilot 的路径匹配,Claude Code 也会读子目录的 CLAUDE.md |
| 全局个人偏好 | ~/.claude/CLAUDE.md |
~/.copilot/copilot-instructions.md |
两者分别维护,内容不同(下文说明) |
全局个人配置:各自有侧重¶
这两份全局文件不能共享,但写法应该互补而非重复:
🧩 Skills:共用一套工作流¶
共享目录结构¶
把所有 Skill 放在 .claude/skills/,两个工具都会自动加载:
个人级全局 Skill 放在 ~/.claude/skills/,同样两者共享。
Frontmatter 写法:核心字段通用,高级字段各自处理¶
两者的 SKILL.md 格式高度兼容,name 和 description 是通用字段:
| .claude/skills/code-review/SKILL.md | |
|---|---|
disable-model-invocation、model、effort、context: fork 等 Claude Code 专有字段,Copilot CLI 会忽略但不报错,不影响使用。
🪝 Hooks:共用 settings.json¶
写在 .claude/settings.json,两者均读¶
.claude/settings.json 中的 hooks 字段被两个工具共同识别。推荐使用 Claude Code 的嵌套 matcher/hooks 格式——较新版本的 Copilot CLI 已完全兼容(具体版本以官方文档为准):
Hook 配置分层¶
| 位置 | 作用范围 | 提交 Git | 适合内容 |
|---|---|---|---|
.claude/settings.json 的 hooks 字段 |
项目级,两工具共享 | ✅ | 格式化、Lint、安全校验 |
.github/hooks/*.json |
项目级,Copilot CLI 专用 | ✅ | Copilot 特有的审计、通知 |
~/.claude/settings.json 的 hooks 字段 |
个人全局,两工具共享 | ❌ | 个人通知偏好 |
⚠️ 不要在
.claude/settings.json和.github/hooks/中写同一个逻辑,会触发两次。
🔌 MCP:共用 .mcp.json¶
项目级 MCP:写一份,两者共用¶
.mcp.json(项目根目录)是两个工具的共同 MCP 配置文件:
| .mcp.json | |
|---|---|
全局 MCP:分别配置¶
| 工具 | 全局 MCP 配置文件 | 说明 |
|---|---|---|
| Claude Code | ~/.claude.json 中的 mcpServers |
支持 HTTP / SSE / stdio |
| Copilot CLI | ~/.copilot/mcp-config.json |
支持 stdio |
需要某个 MCP 服务器只在一个工具中使用时,放到对应的全局配置中,不要放进 .mcp.json。
🔐 密钥与凭证的边界¶
.mcp.json 会提交 Git,是最容易翻车的地方,值得单独关注:
.mcp.json中只能出现${ENV_VAR}形式的占位符,真实值写在本地.env或操作系统 keychain。团队共用密钥用 1Password / Vault 等工具下发,绝不提交 Git——哪怕是"临时测试"。
推荐在仓库根目录放 .env.example 示范环境变量命名,新人 clone 后复制为 .env 填入实际值即可:
| .mcp.json(正确写法) | |
|---|---|
🗂️ 推荐共享策略总结¶
根据以上各节的分析,最终推荐三条落地原则:
-
项目指令文件:选定一份,符号链接另一份 以
CLAUDE.md或AGENTS.md二选一作为事实源(推荐CLAUDE.md,Claude Code 和 Copilot CLI 均自动识别),另一侧用ln -s指向它。新团队成员无论用哪个工具都能读到统一规范。 -
MCP 配置集中管理 把团队共用的 MCP 服务器(GitHub、文件系统、数据库等通用工具)统一放在项目根目录的
.mcp.json并提交 Git。工具专有或含密钥的 MCP 单独放在各自的全局配置中(~/.claude.json/~/.copilot/mcp-config.json),通过环境变量引用 API key,不硬编码。 -
全局个人偏好各自维护,内容互补而非重复
~/.claude/CLAUDE.md侧重 Claude Code 专有特性(角色定义、Sub-agents 触发词、会话持续规则);~/.copilot/copilot-instructions.md侧重 Copilot CLI 特有约定。两份文件不求一致,但不要相互复制导致语义冗余。
🎯 任务分工:选对工具事半功倍¶
真正决定工具选择的核心因素是**任务的可中断性**:
| 任务可中断性 | 推荐 | 典型场景 |
|---|---|---|
| 高(每步想看结果) | Copilot CLI Interactive | 关键变更审批、操作 GitHub Issue / PR / CI |
| 低(一口气跑完几十分钟) | Claude Code Autopilot | 复杂多文件重构、架构级任务、CI/CD 集成 |
| 不确定 | 从 Copilot CLI 起步,复杂后切 Claude Code | 探索性任务 |
场景速查
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 操作 GitHub Issue / PR / CI | Copilot CLI | 内置 GitHub MCP,零配置即可查询 PR、Issue、Workflow |
| 复杂多文件重构、架构级任务 | Claude Code | Sub-agents 并行 + 百万 token 上下文 |
| 需要每步审批的关键变更 | Copilot CLI | Interactive 模式,人类决策每一步 |
| 长时间自动化任务 | Claude Code | Autopilot + Sub-agents,自主性更强 |
| 快速问答、查文档 | 两者均可 | 用当前打开的工具即可 |
| 跨平台 CI/CD 脚本生成 | Claude Code | 非交互模式(claude -p)更方便集成 |
🏗️ Monorepo / 多仓库场景:分层上下文管理¶
多仓库场景下,AI 工具面临一个三角矛盾:需要全局视野来协调跨项目任务,又需要局部细节来干活,还不能每次把所有文档都塞进上下文。解决方案是把文档像代码一样做模块化——分层加载 + 按需引用。
推荐目录结构¶
Claude Code 的分层加载特性¶
Claude Code 会**自动向上递归查找 CLAUDE.md**——当你在 apps/web-frontend/ 下工作时,它同时加载:
apps/web-frontend/CLAUDE.md(局部,覆盖优先)workspace/CLAUDE.md(根级,全局规则)
利用这个机制,根级写全局规则,子项目级写特殊规则,自然形成局部覆盖全局的层叠效果。
根级 CLAUDE.md:只当"调度台"¶
根目录的 CLAUDE.md 不写实现细节,只做三件事——列项目地图、写跨项目规则、引用共享文档:
子项目 CLAUDE.md:聚焦局部¶
子项目 CLAUDE.md 只写这个项目自己的事——技术栈、特定约定、常用命令、与其他项目的关系:
Copilot CLI 的适配¶
Copilot CLI 的 .github/copilot-instructions.md **不会**像 Claude Code 那样自动分层加载,需要手动处理:
| 方案 | 做法 | 优劣 |
|---|---|---|
| 方案 A | 只在根目录放一份,列清项目地图,让 Copilot 按需读对应目录 | 简单但上下文精准度差 |
| 方案 B | 每个子项目也放 .github/copilot-instructions.md |
精准但冗余,维护成本高 |
Claude Code 在多仓库场景的原生支持明显更强——这也是它更适合跨项目复杂任务的原因之一。
四条防冗余硬规则¶
规则一:README.md 永远不写 AI 指令 子项目 README 就是给人看的——介绍这个模块做什么、怎么跑起来。AI 指令统一走 CLAUDE.md。
规则二:全局信息只在根 docs/ 写一次
"用什么数据库"、"服务怎么部署"这类跨项目事实,只在 docs/ARCHITECTURE.md 写。子项目 CLAUDE.md 里引用:完整架构见 @../../docs/ARCHITECTURE.md。
规则三:局部信息只在子项目写 前端用什么 UI 库,不要污染根 CLAUDE.md。根 CLAUDE.md 只负责"告诉 AI 去哪找",不负责"AI 该知道什么"。
规则四:跨项目契约单独放一处,代码即文档
前后端共享的 API schema、事件格式、错误码——最容易两边各写一份造成漂移。正确做法是放 packages/shared-types 或 OpenAPI 文件里,两边 CLAUDE.md 都指向它。
上下文预算¶
AI 工具的上下文窗口再大也是有限的,尤其在大 monorepo 里。给 CLAUDE.md 设个硬性预算:
- 根 CLAUDE.md:不超过 100 行 — 只做路由和全局规则
- 子项目 CLAUDE.md:不超过 200 行 — 聚焦本项目
- 超出就拆到
docs/下,按需用@引用
这样无论 AI 在哪个子目录工作,加载的上下文都是精准的、不冗余的。
决策树:一条信息该放哪里?¶
面对一条新内容,问三个问题:
🚫 防冗余检查清单¶
在添加新配置前,先过一遍这个清单。建议把下方脚本挂到 pre-commit 或 CI,比人工勾选可靠得多:
人工检查清单
指令类
- 我是否同时维护了
CLAUDE.md和.github/copilot-instructions.md?→ 只保留CLAUDE.md - 我是否在多个层级(全局、项目、子目录)写了重复的规则?→ 合并到最高覆盖层级
- 路径特定规范是否已从
CLAUDE.md拆到.github/instructions/*.instructions.md?→ 减少两者的固定上下文占用
Skills 类
- Skills 是放在
.github/skills/还是.claude/skills/?→ 统一放.claude/skills/(两者共享) - 是否有两个 Skill 做同一件事?→ 合并为一个,
description覆盖两个触发场景
Hooks 类
- 同一逻辑是否同时出现在
settings.json和.github/hooks/中?→ 删掉其中一份 - Hook 脚本是否产生了大量 stdout?→ 重定向到文件,避免污染上下文
MCP 类
- 团队共用的 MCP 是否放在
.mcp.json并提交了 Git?→ 应该放在此处 - 含 API Key 的 MCP 是否误提交了 Git?→ 放到各自工具的全局配置中,或用环境变量替代
⚠️ 什么情况下不要共享¶
共享配置在大多数项目中利大于弊,但以下场景**共享反而是负担**,直接用默认路径即可:
| 场景 | 建议 |
|---|---|
| 个人实验项目 | 直接用工具默认路径,共享机制带来的学习成本高于收益 |
| 安全敏感仓库 | 提交到 Git 的 .mcp.json 即使只写服务器名,也暴露了工具链情报,应按内部安全政策评估 |
| 短期项目(< 1 个月) | 配置维护成本大于协同收益,不值得投入 |
不要过度工程化——只在团队协作的、长期维护的项目中引入完整共享体系。