Refinex DevHubRefinex DevHub
DocsBlogProjectsSitesChangelogAbout
Assistant
你好,我可以基于当前页面内容回答问题、提炼重点,或者告诉你下一步应该继续读什么。
  1. Blog›
  2. Copilot CLI 深度上手指南
Copilot CLI 深度上手指南
我把 Claude Code 的一场打包事故,做成了 Refinex-Code
Harness Engineering:Agent First 时代的软件工程控制面
使用 GPT-5.4 设计令人愉悦的前端
领域驱动设计(DDD):从核心概念到 Spring Cloud 标准落地
  1. Blog›
  2. Copilot CLI 深度上手指南

Copilot CLI 深度上手指南

VibeCodingCopilotCLI
Apr 8, 2026 · 39 min read

阅读指引

本文解决什么问题: 消除 "Copilot CLI 只是个命令行聊天框" 的认知偏差,帮助读者建立以 Agent 模式为核心的使用心智,并掌握 Custom Instructions、Skills、MCP、Hooks 等机制将 Copilot CLI 深度融入团队工作流的具体方法。

阅读前置条件:

  • 了解 GitHub Actions 基础概念
  • 对 MCP(Model Context Protocol)有基本认知
  • 能在终端中熟练操作 git、npm/brew/winget

版本基准: GitHub Copilot CLI v1.0.20

阅读时长: 约 35 分钟

一、定位与选型决策

1.1 Copilot CLI 不是 gh copilot suggest 的升级版

2024 年以前,gh copilot 插件的职责是将自然语言转换为 shell 命令。Copilot CLI(@github/copilot)是完全不同的产品:它是一个 terminal-native agentic coding assistant,具备独立的 context window、工具调用审批机制、session 持久化,以及 subagent 并发执行能力(/fleet)。

  • 旧工具的职责:自然语言 → 单条命令
  • 新工具的职责:自然语言 → 多轮规划 → 并发子 Agent 执行 → PR

如果你的场景仅是偶尔翻查一个 git 命令,gh copilot suggest 更轻量。选择 Copilot CLI 的条件是:需要跨多个文件、跨多个仓库或跨多个工具执行复杂任务。

官方网站:

GitHub Copilot CLI

1.2 与 IDE 插件的边界

场景推荐工具理由
当前文件内的 inline 补全IDE Copilot 插件延迟 < 200ms,无需审批
跨文件重构、新功能实现Copilot CLIAgent 可读取整个项目树,IDE 插件受限于打开的文件
CI/CD 流水线中 AI 辅助Copilot CLI(-p flag)支持非交互模式,可集成到 GitHub Actions
多仓库协同变更Copilot CLI(/add-dir)IDE 插件无跨仓库能力

二、安装

2.1 安装方式对比与选择

安装方式适用平台是否推荐说明
brew install copilot-climacOS(ARM/x64)✅ 推荐Homebrew 负责更新管理,无需手动维护版本
npm install -g @github/copilot全平台✅ 推荐(CI/CD 场景)Node.js 22+ 为前提;npm 全平台一致
curl -fsSL https://gh.io/copilot-installbashbashmacOS / Linux可用
winget install GitHub.CopilotWindows✅ Windows 推荐PowerShell v6+ 前提

macOS ARM(Apple Silicon)环境下 Homebrew 是首选:brew 管理的二进制为 arm64 原生,避免 Rosetta 转译带来的启动延迟。npm 方式在 macOS 上同样可用,但需要额外管理 Node.js 版本。

Bash
# macOS ARM — 首选路径
brew install copilot-cli
​
# 验证
copilot --version
Bash
# 全平台 npm 方式(Node.js 22+ 为前提)
npm install -g @github/copilot
​
# 若 ~/.npmrc 中存在 ignore-scripts=true,必须显式开启 scripts
npm_config_ignore_scripts=false npm install -g @github/copilot
注意
ignore-scripts=true 是部分企业内网 npm 配置的安全约束。如果不显式覆盖,Copilot CLI 的 postinstall 步骤会被跳过,导致二进制缺失,copilot 命令无法找到。
Powershell
# Windows — WinGet
winget install GitHub.Copilot
# 前提:PowerShell v6+,低于此版本需先升级

如果你成功安装,通过版本验证会看到如下内容:

Bash
% copilot --version
GitHub Copilot CLI/
Run 'copilot update' to check for updates.
​
# 建议执行一次 copilot update 更新到最新版

2.2 通过 GitHub CLI 安装(2026-01 新增)

自 2026 年 1 月起,已安装 GitHub CLI(gh)的用户可以直接运行 gh copilot 来安装和启动 Copilot CLI,无需单独安装:

Bash
# 首次运行会提示安装 Copilot CLI
gh copilot
​
# 后续所有 args 和 flags 会自动转发给 copilot 命令
gh copilot -sp "YOUR PROMPT HERE"
提示
这是 GitHub 弃用旧版 gh copilot CLI 扩展后的替代方案。新的 gh copilot 命令本质上是 Copilot CLI 的薄封装,功能完全一致。

三、认证机制

3.1 三种认证方式及优先级

Copilot CLI 检索凭证的顺序(高优先级会静默覆盖低优先级):

Mermaid
正在渲染 Mermaid 图表…
注意
如果你的机器上为其他工具设置了 GH_TOKEN(例如 GitHub Actions runner 本地调试),该变量会静默覆盖通过 /login 存储的 OAuth token。症状是明明 /login 成功,但每次请求返回 401。排查命令:echo $GH_TOKEN。

3.2 交互式认证(本地开发标准路径)

打开你的中断,输入如下命令进行启动和登录认证:

Bash
copilot          # 启动 CLI
/login           # 在 CLI 内执行,触发 OAuth device flow

OAuth device flow 会:

  1. 生成一次性码并自动复制到剪贴板
  2. 自动打开浏览器至 https://github.com/login/device
  3. 认证完成后 token 存入系统 keychain(macOS: Keychain Access,Windows: Credential Manager)

Classic PAT(ghp_ 前缀)不被支持。必须使用 Fine-grained PAT 并开启 Copilot Requests 权限。

3.3 多账号管理

Bash
/user list      # 列出已认证的账号
/user switch    # 切换账号
/logout         # 移除本地 token(不撤销 GitHub 侧授权)

3.4 常见认证错误速查

错误根本原因修复
No authentication information found无任何凭证执行 copilot login
401 UnauthorizedToken 已撤销或权限不足重新生成 Fine-grained PAT,确认有 Copilot Requests 权限
Token (classic) rejectedghp_ 前缀 Classic PAT改用 Fine-grained PAT
403 Forbidden组织策略禁用了 Copilot CLI联系管理员在 Organization Settings → Copilot → CLI 中启用
Keychain 不可用(Linux 无头服务器)libsecret 未安装sudo apt install libsecret-1-0 gnome-keyring,或接受明文存储提示

四、核心使用模式

4.1 交互式 Agent 模式(主力场景)

Bash
cd /path/to/your-project
copilot
# CLI 会询问是否信任当前目录,选择 "Yes, and remember" 避免重复确认

关键快捷键:

快捷键作用
Shift+Tab循环切换三种模式:Interactive(默认,每步审批)→ Plan(规划后确认)→ Autopilot(全自动执行,无需逐步审批)
Ctrl+T显示 / 隐藏模型推理过程
Ctrl+C取消当前思考,清空输入,或退出
Esc取消正在执行的操作
@路径将指定文件内容注入 prompt context
/显示所有 slash commands
?显示分页帮助面板
Ctrl+L清屏(保留 session 和 context)
↑ / ↓浏览命令历史

4.2 三种工作模式:Interactive / Plan / Autopilot

Shift+Tab 在三种模式间循环切换:

模式行为适用场景
Interactive(默认)每步工具调用需你审批对安全性要求高的变更、初次探索项目
Plan先生成实现计划,确认后再执行复杂重构、新功能实现(推荐复杂任务必用)
AutopilotCopilot 全自动执行,无需逐步审批,直到任务完成或遇到问题信任度高的任务、Plan 确认后的执行阶段
推荐工作流
复杂任务先 Shift+Tab 切到 Plan Mode 规划,确认计划后再 Shift+Tab 切到 Autopilot 让 Copilot 全自动执行。这是效率最高的组合拳。

Plan Mode 详解

Plan Mode 下,所有 prompt 会触发规划流程而不是直接执行:

  1. Copilot 分析请求和代码库结构
  2. 主动提问以明确需求歧义(这是与直接 prompt 执行最大的差异)
  3. 生成带 checkbox 的实现计划,保存到 ~/.copilot/session-state/{id}/plan.md
  4. 等待你的确认,再进入执行阶段
Bash
# 案例 使用 Plan Mode:将 refinex-ai 服务从 Spring MVC 迁移到 WebFlux,并保留所有现有的测试覆盖率
/plan Migrate refinex-ai service from Spring MVC to WebFlux, keeping all existing test coverage
注意
Plan Mode 中 Copilot 生成的计划保存在本地 session 文件夹,不会自动提交到仓库。如果需要将计划作为 ADR 记录,需要手动 cp ~/.copilot/session-state/{id}/plan.md ./docs/adr/。

何时必须使用 Plan Mode:

场景用 Plan Mode理由
跨 5 个以上文件的重构✅ 必须防止 Copilot 中途发现依赖关系变化导致回滚
新功能实现(超过 200 行)✅ 必须计划确认后执行,减少无效 token 消耗
单文件 bug 修复❌ 不需要直接 prompt 更快
简单 git 操作❌ 不需要!git rebase origin/main 直接执行更直接

4.3 Session 管理与无限上下文

Copilot CLI 支持 infinite sessions:当 context 接近 95% token 上限时,自动压缩历史(compaction),不打断当前工作。

Bash
/session               # 查看当前 session 信息
/session checkpoints   # 列出压缩检查点
/context               # 可视化当前 token 使用分布
/compact               # 手动触发压缩(通常不需要手动执行)
/clear                 # 开始新对话(保留工具配置,清除对话历史)

Session 状态存储在:

Text
~/.copilot/session-state/{session-id}/
├── events.jsonl     # 完整 session 历史
├── workspace.yaml   # 元数据
├── plan.md          # 实现计划(如果生成了)
└── checkpoints/     # 压缩历史快照
提示
在不相关的任务之间使用 /clear 或 /new 重置 context。保持 session 聚焦(单一任务领域)比无限追加更能保证响应质量,因为 compaction 摘要不可避免地会丢失细节。

五、模型选择策略

Text
/model    # 在 CLI 内切换模型
模型适用场景Premium Request 消耗是否推荐
Claude Opus 4.6(默认)复杂架构设计、难以复现的 bug、跨模块重构高✅ 复杂任务
Claude Sonnet 4.6日常编码、单功能实现、测试补全中✅ 日常首选
GPT-5.4代码生成、code review(作为第二意见)中专项使用

5.1 Premium Request 配额与乘数机制

不同模型消耗的高级请求配额(Premium Request)不同,通过**乘数(Multiplier)**计算:

模型乘数每次消耗配额说明
Claude Opus 4.63×3 次重型推理,慎用
Claude Sonnet 4.61×1 次性价比最优
GPT-5.41×1 次OpenAI 旗舰
GPT-5 mini / GPT-4.10×0 次(免费)不消耗配额,随订阅附赠

Copilot Pro 用户每月 300 次高级请求配额(Pro+ 1500 次)。Business / Enterprise 订阅超出部分按量计费($0.04/次)。

切换逻辑: 在 session 内,任务复杂度降低时应主动 /model 切换到 Sonnet 4.6 或免费模型,避免将 Opus 的 3× 乘数消耗在简单任务上。

5.2 Auto 模式:IDE 的智能调度器

注意

CLI 不支持 Auto 模式。 Auto 模式当前仅在 VS Code 和 JetBrains IDE 的 Copilot Chat 中可用(CLI 的 Feature Request #1801 已提交,尚未实现)。CLI 用户需通过 /model 手动切换。以下 Auto 模式说明适用于你在 IDE 中使用 Copilot Chat 的场景。

为什么推荐在 IDE 中使用 Auto 模式:

  • 自动智能匹配:Copilot 根据任务类型、上下文和复杂度,自动在多个模型(Claude Sonnet 4.6、GPT-5.4、GPT-4.1 等)中选择最优解。简单补全走快速模型,复杂架构设计调用强模型,效率与效果自动平衡。
  • 10% 配额折扣:使用 Auto 模式时,所有模型的乘数自动 ×0.9。手动选 Claude Sonnet 4.6(乘数 1.0)消耗 1 次配额,Auto 模式选中同一模型只消耗 0.9 次。长期累积,节省可观。
  • 官方核心推荐:GitHub 官方定位 Auto 为「大多数用户的最佳模型选择」,是 VS Code 和 JetBrains 中的默认选项。

Auto 模式的当前局限:

  • 优先保障服务稳定性:当前 Auto 的首要设计目标是管理服务端计算容量,根据模型可用性进行调度的优先级高于根据任务复杂度。换言之,它更像一个负载均衡器,而非真正的「任务感知调度器」。
  • 未来方向:GitHub 已明确表示正在改进,目标是让 Auto 模式根据任务复杂度动态切换,实现更智能的调度。

5.3 CLI 用户的模型策略建议

由于 CLI 暂不支持 Auto 模式,推荐以下手动策略:

  • 日常首选 Sonnet 4.6:1× 乘数,性能足够覆盖 90% 日常编码、重构、测试补全
  • 复杂任务切 Opus 4.6:仅在跨模块架构设计、疑难 bug 排查时使用,用完立即切回
  • 简单查询用免费模型:/model 切到 GPT-5 mini 或 GPT-4.1(0× 乘数),不消耗配额
  • IDE 中用 Auto:在 VS Code / JetBrains 中使用 Copilot Chat 时,保持 Auto 模式享受 10% 折扣

完整支持的 AI 模型可以查阅官方文档:

Supported AI models in GitHub Copilot - GitHub Docs

💎 IDE 插件 vs CLI:软件工程师该用哪个?

结论:两者并用,按任务类型切换。 它们不是竞争关系,而是覆盖不同工作场景的互补工具。

维度IDE 插件(VS Code / JetBrains)Copilot CLI胜出方
逐行编码(补全、inline 建议)延迟 < 200ms,无感融入编辑流不支持 inline 补全IDE ✅
Auto 模型调度 + 10% 折扣支持,自动选模型并省配额不支持,需手动 /model 切换IDE ✅
跨文件 Agent 任务(重构、新功能)Agent Mode 可用,但无 session 持久化(见下方「上下文窗口说明」)读取整个项目树 + infinite sessions + 跨仓库CLI ✅
多仓库协同变更不支持/add-dir 跨仓库操作CLI ✅
深度定制(Skills / Hooks / Plugins)有限完整的 Skills + Hooks + Plugins + Custom Agents 体系CLI ✅
Diff 预览 & 代码审查体验IDE 内 inline diff,视觉直观终端文本 diffIDE ✅
Session 持久化 & 无限上下文可查看聊天历史并继续对话,但无 /resume 级别的 session 恢复Infinite sessions + compaction + /resume 跨终端恢复CLI ✅

推荐工作流组合:

  1. 日常编码在 IDE:inline 补全 + Auto 模式省配额 + Diff 可视化。这是你 80% 时间的主力工具。
  2. 复杂任务切 CLI:跨文件重构、多仓库变更、需要 Plan → Autopilot 全自动执行的场景。CLI 的 Agent 能力、Session 持久化和深度定制(Skills/Hooks/Plugins)是 IDE 无法替代的。
  3. CLI 中 /plan → /IDE 衔接:在 CLI 中用 Plan Mode 规划方案,然后 /IDE 命令直接在 VS Code 中打开工作目录精调代码。两个工具之间无缝切换。
一句话总结
把 IDE 插件当作你的「日常搭档」,把 CLI 当作你的「重型武器」。不需要二选一,按任务复杂度切换即可。
  • 📊 上下文窗口说明:IDE vs CLI 的真实区别

    IDE 和 CLI 的上下文窗口大小相同——都取决于所选模型的 token 限制(如 Claude Sonnet 4.6 约 160K,GPT-5.4 约 192K)。两者共享同一个 Copilot 服务端路由层,max_prompt_tokens 由 GitHub 服务端统一配置,用户无法直接修改。真正的差异在于上下文管理机制和文件访问范围:

    维度IDE(VS Code / JetBrains)Copilot CLI影响
    单次窗口大小约 128–192K tokens(已从 128K 提升)约 128–192K tokens(相同)无差异
    Session 持久化可查看聊天历史并继续对话,但无 /resume 级别的跨终端恢复Infinite sessions + /resume 跨终端恢复CLI 胜出:跨终端长任务不断
    自动 Compaction支持(达到窗口限制时触发)支持(达 95% 时触发,+ /compact 手动)机制相同
    Context 可视化VS Code 状态栏显示 token 用量/context 命令详细分析两者都支持
    文件访问范围限于当前 workspace 中的文件启动目录 + /add-dir 添加的所有目录CLI 胜出:跨仓库
    是否可修改窗口大小不可,服务端控制不可,服务端控制两者都无法调整

    关键结论: 「受限于 workspace」的本质不是上下文窗口更小,而是 IDE Agent Mode 只能访问当前 workspace 中的文件,且缺少 CLI 级别的跨终端 session 恢复能力。CLI 的优势在于:文件访问范围更广(跨仓库)、session 可持久化(/resume)、以及更丰富的上下文管理工具(/context、/compact)。

六、自定义指令(Custom Instructions)

这是将 Copilot CLI 从通用工具变成项目专属工具的核心机制。

快速初始化: 对于还没有配置自定义指令的仓库,在 CLI 中执行 /init 即可一键初始化:

Bash
/init              # Copilot 分析当前仓库结构,自动生成 .github/copilot-instructions.md
/init suppress     # 如果不需要,抑制后续的 init 建议提示

Copilot 会扫描你的代码库结构(技术栈、构建工具、目录布局等),自动生成一份包含构建命令、测试命令、代码规范等内容的 .github/copilot-instructions.md 文件。生成后建议审查并根据团队实际规范调整。

6.1 指令加载优先级

Mermaid
正在渲染 Mermaid 图表…

图示说明
多个指令文件同时存在时,Copilot CLI 全部合并使用,不存在 "后者覆盖前者" 的逻辑。但 AGENTS.md 中的 primary 指令对模型的权重更高,相当于 system prompt 中更靠前的位置。路径级指令(*.instructions.md)只在 Copilot 处理匹配路径下的文件时注入,避免无关上下文污染。
最令人振奋的是, AGENTS.md 和 CLAUDE.md 是同等级别的,Copilot 也会给出高权重,Claude Code 党狂喜。

6.2 仓库级指令示例(Java 项目)

Markdown
# .github/copilot-instructions.md
​
## 构建与测试命令
- 构建:`./mvnw clean package -DskipTests`
- 单元测试:`./mvnw test`
- 集成测试:`./mvnw verify -Pintegration`
- 代码检查:`./mvnw checkstyle:check`
​
## 技术栈约束
- Java 21,Spring Boot 3.5.x,Spring Cloud 2025.0.x
- MVC 模块(CRUD)与 WebFlux 模块(AI 流式)严格分离,禁止在同一 service 模块混用
- ORM 使用 MyBatis-Plus,禁止在 Mapper 层写 SQL 以外的业务逻辑
- 分布式事务使用 Seata AT 模式,跨服务写操作必须标注 @GlobalTransactional
​
## 代码规范
- 所有 public API 方法必须有 Javadoc,说明参数含义和异常情况
- 异常处理:业务异常继承 BizException,禁止直接抛出 RuntimeException
- 每个 PR 必须包含对应的单元测试,覆盖率不低于 80%
​
## 提交规范
- 遵循 Conventional Commits:feat/fix/docs/refactor/test/chore
- 每次提交前执行 `./mvnw checkstyle:check && ./mvnw test`

6.3 路径级指令(针对特定模块)

Markdown
---
applyTo: "refinex-ai/src/**/*.java"
---
​
## refinex-ai 模块专属约束
- 所有 AI 接口使用 WebFlux(返回 Flux<T> 或 Mono<T>),禁止返回同步类型
- SSE 端点必须在 ResponseEntity<Flux<ServerSentEvent<String>>> 上声明 produces = TEXT_EVENT_STREAM_VALUE
- ChatClient 实例必须通过 Spring 注入,禁止在方法内 new ChatClient.Builder()
- Reactor Context 传递用户身份,禁止通过 ThreadLocal(WebFlux 不保证线程绑定)

6.4 根目录 Agent 指令(AGENTS.md / CLAUDE.md)

AGENTS.md 是优先级最高的指令文件,相当于 system prompt 中权重最高的位置。适合放置:

  • 跨所有模块通用的约束(不宜放在单个仓库的 .github/copilot-instructions.md 中重复)
  • 全局工具使用策略(如何使用 MCP、何时触发 Plan Mode)
  • 跨仓库协作规范(多仓库工作流中父目录的共享规则)
与仓库级指令的职责分工
AGENTS.md 写项目全局的、不因模块而异的规则;.github/copilot-instructions.md 写单个仓库特有的构建命令和技术约束。两者同时存在时 Copilot 全部合并使用,AGENTS.md 权重更高。
Markdown
# AGENTS.md(例如放在 ~/projects/refinex/ 父目录,或单仓库根目录)
​
## 项目概览
Refinex-Cloud 是基于 Spring Boot 3.5.x + Spring Cloud 2025.0.x 的微服务平台。
主要服务:refinex-gateway / refinex-ai / refinex-auth / refinex-system。
​
## 全局技术约束
- Java 21,禁止使用 Java 8 / 11 语法(var 可用,records 优先于 POJO)
- MVC 与 WebFlux 严格分离:CRUD 服务用 MVC,AI 流式服务用 WebFlux,禁止混用
- 所有跨服务调用通过 OpenFeign,禁止直接使用 RestTemplate 或 WebClient 在业务层
- 分布式事务必须用 Seata AT 模式,@GlobalTransactional 注解不可省略
​
## 构建与验证
- 修改代码后必须运行:`./mvnw checkstyle:check && ./mvnw test`
- 禁止提交 checkstyle 不通过的代码
- 集成测试:`./mvnw verify -Pintegration`(仅在完整功能变更后执行)
​
## 提交规范
- 遵循 Conventional Commits:feat / fix / docs / refactor / test / chore
- commit message 格式:`type(scope): description`,scope 使用服务名(如 `feat(refinex-ai): ...`)
- 每个 PR 必须包含对应测试,覆盖率不低于 80%
​
## AI / MCP 工具使用策略
- 涉及 5 个以上文件的变更必须先使用 Plan Mode(Shift+Tab)
- 需要查询 API 文档时,优先使用 Context7 MCP(而非凭记忆生成)
- 生成代码前,先用只读分析确认现有结构,再执行修改
- 禁止在未经审批的情况下执行 git push(已在 hooks 中拦截)
​
## 异常处理规范
- 业务异常统一继承 BizException(不要直接抛 RuntimeException)
- 所有 public API 方法必须有 Javadoc,说明参数、返回值和异常
- WebFlux 链中的错误使用 .onErrorResume() 处理,禁止 try-catch 包裹响应式调用
​
## 安全规范
- 所有接口默认需鉴权,@SaIgnore 豁免必须有注释说明原因
- 禁止在代码中硬编码密钥、密码、Token(使用 Nacos 配置中心或环境变量)
- MyBatis-Plus Wrapper 中禁止拼接未经校验的外部输入(SQL 注入风险)
注意
AGENTS.md、CLAUDE.md 和 GEMINI.md 文件名固定(区分大小写),必须放在项目根目录(不是 .github/ 子目录)。Copilot CLI 会识别这三个文件名,三者内容等价、选其一即可,或分别放置(Copilot 会合并读取)。此外,可通过 COPILOT_CUSTOM_INSTRUCTIONS_DIRS 环境变量指定额外的指令搜索目录(逗号分隔的路径列表)。使用 --no-custom-instructions 标志可在启动时跳过所有自定义指令加载。

6.5 全局个人指令

~/.copilot/copilot-instructions.md 全局个人指令写一些通用的即可,例如我个人的如下:

Markdown
# Unified Personal Agent Rules
​
- Reply to my questions in Chinese, unless the code context is in English
- Use Chinese for code comments
- Provide concise, data-driven explanations
- When reviewing code, prioritize: **security > correctness > performance > readability**
- Always show reasoning before the conclusion
- Prefer showing **diffs** over full file rewrites
- Prefer functional programming style
- Follow standard Git conventions for commands and write commit messages in Chinese
- Always use Context7 MCP when I need library/API documentation, code generation, setup or configuration steps without me having to explicitly ask.

中文版本:

Markdown
# 统一个人代理规则
​
- 除非代码上下文为英文,否则请用中文回复我的问题。
- 使用中文编写代码注释。
- 提供简洁、数据驱动的解释。
- 代码审查时,优先考虑:**安全性 > 正确性 > 性能 > 可读性**。
- 始终在得出结论之前展示推理过程。
- 优先展示**差异**,而不是整个文件重写。
- 优先采用函数式编程风格。
- 遵循标准的 Git 命令规范,并使用中文编写提交信息。
- 当我需要库/API 文档、代码生成、设置或配置步骤时,始终使用 Context7 MCP,而无需我明确提出要求。

6.6 VS Code GitLens + Copilot:AI 生成 Git 消息自定义指令

如果你在 VS Code 中同时安装了 GitHub Copilot 和 GitLens 插件,GitLens 会调用 Copilot 作为 AI Provider 生成 commit 消息、PR 标题等内容。你可以在 VS Code 设置中配置每一项的自定义指令,让生成结果符合你的团队规范。

配置路径: VS Code Settings → 搜索 Gitlens › Ai › Generate → 找到对应项填入以下内容(直接复制粘贴):

Gitlens › Ai › Generate Changelog: Custom Instructions

JSX
使用中文生成 changelog。按 Conventional Commits 类型分组:
- 🚀 新功能(feat)
- 🐛 修复(fix)
- ⚡ 性能优化(perf)
- 🛠 重构(refactor)
- 📝 文档(docs)
- 🧪 测试(test)
每条格式:- 中文描述(scope)
省略 chore/ci/style 等无用户感知的变更。如果有 Breaking Changes,单独列出并用 ⚠️ 标记。

Gitlens › Ai › Generate Commit Message: Custom Instructions

Text
使用中文生成 commit 消息。严格遵循 Conventional Commits 规范:
- 格式:<type>(<scope>): <中文描述>
- type 只能是:feat / fix / docs / refactor / test / chore / perf / ci / style / build
- scope 使用模块名或文件名(如 auth、gateway、pom)
- 描述用中文,动词开头,不加句号
- 单行不超过 72 字符
- 示例:feat(refinex-ai): 新增 DeepSeek 模型接入支持

Gitlens › Ai › Generate Commits: Custom Instructions

Text
使用中文生成 commit 内容。将变更拆分为原子化的逻辑单元,每个 commit 只做一件事。
- 每个 commit 消息严格遵循 Conventional Commits:<type>(<scope>): <中文描述>
- 按逻辑顺序排列:底层依赖先于上层调用
- 测试文件与实现代码合并在同一 commit
- 配置文件变更单独一个 commit

Gitlens › Ai › Generate Stash Message: Custom Instructions

Text
使用中文生成 stash 消息。格式:WIP: <当前正在做的事情>。简洁明了,一句话说明保存现场的原因。
示例:WIP: 重构 ToolCallService 的参数校验逻辑,等待 API 确认

Gitlens › Ai › Generate Create Cloud Patch: Custom Instructions

Text
Generate a concise title and description in English for the cloud patch.
- Title: imperative mood, max 72 chars, summarize the change
- Description: explain what changed and why in 2-3 sentences, mention affected modules

Gitlens › Ai › Generate Create Code Suggest: Custom Instructions

Text
Generate a clear title and description in English for the code suggestion.
- Title: imperative mood, max 72 chars, describe the improvement
- Description: explain the problem being addressed, the proposed solution, and any trade-offs in 2-3 sentences

Gitlens › Ai › Generate Create Pull Request: Custom Instructions

Text
使用中文生成 PR 标题和描述。
标题格式:<type>(<scope>): <中文摘要>,与 Conventional Commits 保持一致。
描述包含:
1. ✅ 变更概述(这个 PR 做了什么)
2. 📌 变更动机(为什么要这样做)
3. 📝 关键变更列表(用无序列表列出主要修改点)
4. 🧪 测试说明(如何验证此变更)
提示
Cloud Patch 和 Code Suggest 使用英文是因为这两个功能通常用于跨团队协作,英文更通用。Commit、Stash 和 PR 使用中文是因为它们主要是团队内部消费,中文可读性更高。

6.7 JetBrains IDEA + Copilot:Git Commit Instructions

如果你在 IntelliJ IDEA(或其他 JetBrains IDE)中安装了 GitHub Copilot 插件,同样可以配置全局的 Git Commit 消息生成指令。

配置路径: Settings → Tools → GitHub Copilot → Customizations → Git Commit Instructions → 点击 Global 按钮

这会打开文件 ~/.config/github-copilot/intellij/global-git-commit-instructions.md,将以下内容粘贴进去:

Markdown
# Git Commit Message 生成规范
​
## 语言
使用中文生成 commit 消息。
​
## 格式
严格遵循 Conventional Commits 规范:
<type>(<scope>): <中文描述>
​
### type 枚举
- `feat`:新功能
- `fix`:修复 Bug
- `docs`:文档变更
- `refactor`:重构(无功能变化)
- `test`:测试相关
- `chore`:构建/依赖/配置
- `perf`:性能优化
- `ci`:CI/CD 变更
- `style`:代码格式调整
- `build`:构建系统变更
​
### scope
使用模块名或文件名,如 `auth`、`gateway`、`pom`、`refinex-ai`。
​
### 描述规则
- 中文动词开头,如「新增」「修复」「移除」「重构」
- 不加句号
- 单行不超过 72 字符
- 如果需要 body,空一行后用中文简述变更动机和影响
​
## 示例
​
feat(refinex-ai): 新增 DeepSeek 模型接入支持
fix(gateway): 修复路由配置未生效导致 404 的问题
refactor(auth): 抽取 Token 校验逻辑到独立工具类
chore(pom): 升级 Spring Boot 到 3.5.2
提示
JetBrains Copilot 插件的 Git Commit Instructions 只支持一个全局文件,不像 GitLens 那样有多个细分项(changelog、stash、PR 等)。但这个单一文件已经足处覆盖日常 90% 的 commit 消息生成场景。建议使用 Global 而非 Workspace,这样所有项目都能自动应用相同规范。

七、Skills:跨工具的 Agent 能力标准

Agent Skills 是一套跨编码工具的开放标准(agentskills.io),由 Anthropic 和 OpenAI 联合推动。它不是 Copilot CLI 独有的概念——同一套 Skills 可以在 Claude Code、Copilot CLI、Codex CLI、Cursor、OpenCode 等所有兼容工具中通用。

Skill 的本质是一个包含 SKILL.md 的目录,定义了 Agent 在特定任务场景下的「专家行为」:操作流程、约束条件、输出格式、可调用的脚本。当 Agent 检测到任务与某个 Skill 的描述匹配时,会自动将该 Skill 的指令注入当前上下文。

7.1 Skills vs Custom Instructions

Tip
Instructions 在每次交互时注入,Skills 在相关任务时才注入。前者是全局规则,后者是按需加载的专项能力。
场景推荐理由示例
项目编码规范、构建命令Custom Instructions每次任务都需要,应始终在 context 中.github/copilot-instructions.md
特定类型任务的深度指南(>200词)Skill只在相关任务时加载,避免无关 context 污染安全审计、WebFlux 迁移
模块专属约束路径级 Instructions按文件路径匹配注入,不需要手动触发refinex-ai/**/*.java

选择依据: 指令内容超过 200 词且仅在特定任务类型下有用 → 用 Skill。

7.2 存储位置

Skills 有项目级和个人级两种存放位置,均被 Copilot 自动识别:

JSX
# 项目级(仅当前仓库有效)
.github/skills/
└── spring-security-audit/
    ├── SKILL.md          ← 必须,文件名大小写敏感
    └── scripts/
        └── check-auth-bypass.sh
​
# 项目级(.claude 约定,等价)
.claude/skills/
└── spring-security-audit/
    └── SKILL.md
​
# 项目级(.agents 约定,等价)
.agents/skills/
└── spring-security-audit/
    └── SKILL.md
​
# 个人级(跨所有项目有效)
~/.copilot/skills/
└── spring-security-audit/
    └── SKILL.md
​
# 个人级(.claude 约定,等价)
~/.claude/skills/
└── spring-security-audit/
    └── SKILL.md
​
# 个人级(.agents 约定,等价)
~/.agents/skills/
└── spring-security-audit/
    └── SKILL.md
注意
文件必须命名为 SKILL.md(全大写)。子目录名建议与 SKILL.md 中的 name 字段保持一致,使用小写 + 连字符,例如 spring-security-audit。

7.3 SKILL.md 文件结构

SKILL.md 是带 YAML frontmatter 的 Markdown 文件,结构分三部分:

Markdown
---
name: spring-security-audit
description: >
  Spring Security 安全审计指南。当被要求进行安全审查、检查认证绕过风险、
  审计 Sa-Token 配置,或用户使用关键词 seccheck 时使用此 Skill。
license: MIT
---
​
## 审计流程
​
1. 检查所有 @RequestMapping 端点是否在 SecurityConfig 的 `permitAll()` 列表之外
2. 验证 Sa-Token 的 `isLogin()` 检查是否存在于所有需要认证的 Controller 路径
3. 扫描是否存在 `@SaIgnore` 注解,逐一确认豁免理由
4. 运行 `./scripts/check-auth-bypass.sh`,输出潜在风险点
​
## 风险等级定义
- HIGH:未认证可直接访问涉及用户数据的接口
- MEDIUM:存在 JWT 伪造风险(未验证 alg 字段)
- LOW:调试端点未在生产环境禁用

YAML frontmatter 字段速查:

字段是否必填说明
name✅ 必填唯一标识符,必须小写 + 连字符(如 spring-security-audit)。用于 /skill-name 显式调用。
description✅ 必填最关键字段:描述 Skill 的用途和触发场景。Copilot 靠这段描述决定是否自动加载,写得越精准、包含的触发关键词越多,自动匹配效果越好。
license— 可选许可证标识符,团队共享时填写。
注意
description 的质量直接决定 Skill 是否能在你预期的场景下被自动触发。描述应该包含:Skill 的用途 + 明确的触发条件("当被要求做 X 时使用")+ 用户可能使用的关键词。模糊描述会导致 Copilot 在该用时不用、或在不该用时用。

7.4 Skill 管理命令全览

Bash
/skills list                            # 列出当前所有已加载的 skills 及其来源
/skills                                 # 交互式开关面板(↑↓ 键选择,空格键切换启用/禁用)
/skills info                            # 查看 skill 详情,包括文件路径和来源 plugin
/skills add                             # 添加自定义 skills 目录(持久化到配置)
/skills reload                          # 热加载:session 内新增 skill 后无需重启 CLI
/skills remove spring-security-audit    # 移除直接添加的 skill(SPEC 是子目录名)
                                        # 注意:Plugin 安装的 skill 需通过 plugin 管理
注意
/skills remove 的参数是子目录名(即文件夹名),不是 SKILL.md 中的 name 字段值。两者通常相同,但如果有差异,以目录名为准。通过 Plugin 安装的 Skill 不能用此命令移除,必须卸载对应 Plugin。

7.5 使用 Skill

方式一:自动触发(推荐)

Copilot 根据你的 prompt 内容与 description 的语义匹配,自动决定是否加载 Skill。无需任何额外操作:

Bash
# Copilot 自动识别这是安全审计任务,加载 spring-security-audit skill
Audit the authentication logic in refinex-auth module for potential bypass risks

方式二:显式调用(强制指定)

在 prompt 中用 /skill-name 语法强制使用特定 Skill:

Bash
# 强制使用指定 skill(/ 后接 name 字段值)
Use the /spring-security-audit skill to audit all controllers in refinex-auth module
​
# 在 CLI 内键入 / 可以看到所有可用 skill 的补全列表

7.6 一个完整的实战 Skill:GitHub Actions 调试

这是官方文档中的标准示例,展示了 Skill 与 MCP 工具配合的最佳实践:

Text
.github/skills/
└── actions-failure-debugging/
    └── SKILL.md
Markdown
---
name: github-actions-failure-debugging
description: >
  Guide for debugging failing GitHub Actions workflows.
  Use this when asked to debug failing GitHub Actions workflows,
  investigate CI failures, or troubleshoot workflow runs.
---
​
To debug failing GitHub Actions workflows in a pull request,
follow this process using tools from the GitHub MCP Server:
​
1. Use `list_workflow_runs` to look up recent workflow runs and their status
2. Use `summarize_job_log_failures` to get an AI summary of failed job logs
   — avoids filling context window with thousands of log lines
3. If more detail is needed, use `get_job_logs` or `get_workflow_run_logs`
4. Try to reproduce the failure in your own environment
5. Fix the failing build. If you reproduced it yourself, verify the fix
   before committing
关键设计点
summarize_job_log_failures 这一步说明了 Skill 的核心价值——不只是约束规则,而是完整的操作流程,包括「用哪个工具、为什么这样用、什么情况下进一步深入」。这种深度操作指南放在 Instructions 里会污染所有任务的 context,放在 Skill 里只在调试 CI 时才加载。

7.7 获取 Skills:推荐使用官方仓库(而非手写)

不建议手写 Skill。 Anthropic 和 OpenAI 都维护了高质量的官方 Skills 仓库,由专业团队编写和维护,覆盖了绝大多数通用场景。直接下载使用远比自己从头编写更高效、更专业。

官方 Skills 仓库:

来源仓库地址说明
Anthropicgithub.com/anthropics/skillsClaude Code 官方 Skills 集,同样适用于所有兼容工具
OpenAIgithub.com/openai/skillsOpenAI Codex 官方 Skills 集,遵循相同的 Agent Skills 标准

安装方式(推荐放在 ~/.agents/skills/,跨所有项目生效):

Bash
# 方式一:克隆 Anthropic 官方仓库,将 skills 目录复制到个人级目录
git clone https://github.com/anthropics/skills.git /tmp/anthropic-skills
cp -r /tmp/anthropic-skills/skills/* ~/.agents/skills/
​
# 方式二:克隆 OpenAI 官方仓库
git clone https://github.com/openai/skills.git /tmp/openai-skills
cp -r /tmp/openai-skills/skills/* ~/.agents/skills/
​
# 验证安装(在 CLI 内)
/skills list
提示
~/.agents/skills/ 是跨工具通用的个人级 Skills 目录——Claude Code、Copilot CLI、Codex CLI 等所有兼容 Agent Skills 标准的工具都会自动识别此路径。放在这里一次安装,所有工具受益。

7.8 使用 Skill Creator 创建自定义 Skill

如果官方仓库中没有覆盖你的特定场景(例如团队内部的 Spring 安全审计流程),推荐使用 Skill Creator 自动生成,而非手动编排 SKILL.md:

Skill Creator说明
anthropics/skills/skill-creatorAnthropic 提供的 Skill 生成器,描述需求后自动生成规范的 SKILL.md
openai/skills/.system/skill-creatorOpenAI 提供的 Skill 生成器,功能等价

使用流程:

  1. 将 skill-creator Skill 下载到你的 Skills 目录
  2. 在 CLI 中描述你需要的 Skill 场景(如「创建一个 Spring Security + Sa-Token 安全审计 Skill」)
  3. Agent 会自动生成完整的 SKILL.md 文件,包含规范的 YAML frontmatter、操作流程和约束条件
  4. 审查生成结果,按需微调后保存到 ~/.agents/skills/ 或项目的 .github/skills/
Bash
# 安装 skill-creator(以 Anthropic 版为例)
cp -r /tmp/anthropic-skills/skills/skill-creator ~/.agents/skills/
​
# 然后在 CLI 中直接描述你的需求,skill-creator 会自动触发
Create a skill for auditing Spring Security + Sa-Token authentication bypass risks in Java projects
注意
Skill Creator 生成的内容质量取决于你对需求的描述精度。描述越具体(包含技术栈、触发场景、输出格式要求),生成的 Skill 越实用。生成后务必人工审查。

八、MCP 服务器集成

MCP(Model Context Protocol)允许 Copilot CLI 调用外部工具。GitHub MCP server 已内置,无需配置。

8.1 添加 MCP 服务器

交互式添加:

Bash
# 在 CLI 内
/mcp add
# 按 Tab 切换字段,Ctrl+S 保存

直接编辑配置文件(推荐,适合批量配置和团队共享):

不建议安装太多 MCP,如下几个基本够用了:

JSON
// ~/.copilot/mcp-config.json
{
  "mcpServers": {
    "context7": {
      "type": "http",
      "url": "https://mcp.context7.com/mcp",
      "headers": {
        "CONTEXT7_API_KEY": "YOUR-API-KEY"
      },
      "tools": ["*"]
    },
    "chrome-devtools": {
      "type": "stdio",
      "command": "npx",
      "args": ["chrome-devtools-mcp@latest"],
      "tools": ["*"]
    },
    "shadcn": {
      "type": "stdio",
      "command": "npx",
      "args": ["shadcn@latest", "mcp"],
      "tools": ["*"]
    },
    "playwright": {
      "type": "local",
      "command": "npx",
      "args": ["@playwright/mcp@latest", "--headless"],
      "tools": ["*"]
    }
  }
}
`tools` 字段的精确配置原则
不要无脑使用 "tools": ["*"]。

8.2 MCP 服务器管理命令

Bash
/mcp show                    # 列出所有已配置 MCP server 及状态
/mcp show context7           # 查看 playwright server 的工具列表
/mcp disable context7        # 临时禁用(配置保留)
/mcp enable context7         # 重新启用
/mcp delete context7         # 永久删除配置

8.3 上手安装一个 MCP

这里我们以比较常用的 Content7 MCP 为例。Context7 MCP 能够直接从源头提取最新的、特定版本的文档和代码示例,并将它们直接放入你的提示符中。

你只需要在 AI Prompt 或者上面的规则中补充约束,AI 就会视情况调用,或者根据你的明确指示主动使用。

如果你想要主动明确使用 Content7 MCP,可以参考下面的示例:

Bash
# 示例1
Create a Next.js middleware that checks for a valid JWT in cookies
and redirects unauthenticated users to `/login`. use context7
​
# 示例2
Configure a Cloudflare Worker script to cache
JSON API responses for five minutes. use context7

Context7 会将最新的代码示例和文档直接导入到你的LLM 上下文中。无需切换标签页,无需使用不存在的虚假 API,也无需生成过时的代码。

如果你想要让 AI 决定是否使用,可以将其补充在 AGENTS.md 或者 CLAUDE.md 中,例如:

Markdown
Always use Context7 MCP when I need library/API documentation, code generation, setup or configuration steps without me having to explicitly ask.

下面看看如何安装,首先编辑 ~/.copilot/mcp-config.json,写入下述内容:

JSON
{
  "mcpServers": {
    "context7": {
      "type": "http",
      "url": "https://mcp.context7.com/mcp",
      "headers": {
        "CONTEXT7_API_KEY": "YOUR_API_KEY"
      },
      "tools": ["query-docs", "resolve-library-id"]
    }
  }
}

其中的 YOUR_API_KEY 你可以在下面的网站获取:

Context7 - Up-to-date documentation for LLMs and AI code editors

Tip
如果你想要在其他编程工具或者 CLI 安装 Content7 可以参考官方网站:https://context7.com/docs/resources/all-clients#copilot-cli。目前支持 Claude Code、Cursor、Opencode、OpenAI Codex、Google Antigravity、VS Code、Kiro、Kilo Code、Roo Code、Windsurf、Claude Desktop、ChatGPT (Web)、ChatGPT (Desktop)、Trae、Cline、Augment Code、Gemini CLI、Using Bun or Deno、Copilot Coding Agent、Copilot CLI、Amazon Q Developer CLI、Warp、Amp、Zed、Smithery、JetBrains AI Assistant、Qwen Code、Windows … 可以说是全方位支持了。

九、Hooks:执行生命周期钩子

Hooks 允许在 Copilot CLI Agent 执行的关键节点插入自定义 shell 脚本,实现安全拦截、合规审计、质量卡点等能力。核心价值在于 preToolUse hook 可以主动拒绝工具执行,这是其他机制做不到的。

9.1 六种 Hook 类型与触发时机

官方文档参考
Quickstart for hooks · Pre-tool use · Post-tool use · User prompt submitted · Session lifecycle · Error handling
Mermaid
正在渲染 Mermaid 图表…
图示说明
六种 hook 中只有 preToolUse 的输出会影响执行流程——脚本可通过 stdout 输出 JSON 来拒绝(deny)、放行(allow)或要求用户确认(ask)工具调用。postToolUse 可以转换工具结果。其余 hook 的输出用于副作用(日志、通知等)。preToolUse 和 postToolUse 在每次工具调用前后各触发一次,一个 session 内可能触发数十次,脚本必须轻量。

六种 Hook 类型速查:

Hook 类型触发时机输入关键字段输出能力典型用途
onSessionStartsession 开始时timestamp、cwd可注入 additionalContext添加上下文、配置 session、环境检查
onUserPromptSubmitted用户每次提交 prompttimestamp、cwd、prompt可修改 prompt、添加上下文Prompt 过滤、审计日志、关键词告警
onPreToolUse工具执行前timestamp、cwd、toolName、toolArgs✅ allow / deny / ask • 可修改参数、添加上下文、抑制输出安全拦截、参数校验、权限控制
onPostToolUse工具执行后timestamp、cwd、toolName、toolArgs、toolResult可转换结果、添加上下文、抑制输出结果过滤、代码质量检查、审计日志
onErrorOccurred执行出错时timestamp、cwd、error(消息)、errorContext(model_call/tool_execution/system/user_input)、recoverable自定义错误处理错误告警、错误模式跟踪、上报监控
onSessionEndsession 结束时timestamp、cwd清理资源清理临时文件、统计分析、记录结束状态

9.2 配置文件结构

Hooks 配置文件默认查找路径:.github/hooks/hooks.json 或 hooks/hooks.json(相对于项目根目录)。

JSON
// .github/hooks/hooks.json
{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "./scripts/session-start.sh",
        "powershell": "./scripts/session-start.ps1",
        "cwd": ".",
        "timeoutSec": 30,
        "comment": "记录 session 开始"
      }
    ],
    "preToolUse": [
      {
        "type": "command",
        "bash": "./scripts/security-check.sh",
        "comment": "安全检查 — 最先执行"
      },
      {
        "type": "command",
        "bash": "./scripts/audit-log.sh",
        "comment": "审计日志 — 第二执行"
      }
    ],
    "postToolUse": [
      {
        "type": "command",
        "bash": "./scripts/quality-check.sh",
        "timeoutSec": 30
      }
    ],
    "sessionEnd": [
      {
        "type": "command",
        "bash": "echo \"[$(date)] Session ended\" >> ~/.copilot/session-audit.log",
        "powershell": "Add-Content -Path \"$HOME\\.copilot\\session-audit.log\" -Value \"[$(Get-Date)] Session ended\"",
        "timeoutSec": 5
      }
    ]
  }
}
注意
同一 hook 类型可以定义多个命令(数组),按声明顺序依次执行。preToolUse 多个 hook 中,任意一个返回 deny 都会阻止工具执行,后续 hook 不再执行。

9.3 Hook 脚本的输入输出规范

所有 hook 脚本通过 stdin 接收 JSON,通过 stdout 返回 JSON(仅 preToolUse 有效)。

读取输入(Bash):

Bash
#!/bin/bash
# 所有字段通过 stdin 的 JSON 传入,jq 是必备依赖
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.toolName')
TOOL_ARGS=$(echo "$INPUT" | jq -r '.toolArgs')

读取输入(PowerShell):

Powershell
$input = [Console]::In.ReadToEnd() | ConvertFrom-Json
$toolName = $input.toolName
$toolArgs = $input.toolArgs

preToolUse 拒绝输出(Bash):

Bash
# 使用 jq -n 构造 JSON,避免手写字符串引号问题
REASON="Production deployment requires manual approval"
jq -n --arg reason "$REASON" '{permissionDecision: "deny", permissionDecisionReason: $reason}'

preToolUse 拒绝输出(PowerShell):

Powershell
@{ permissionDecision = "deny"; permissionDecisionReason = "Security policy violation" } | ConvertTo-Json -Compress

preToolUse 支持三种权限决策和额外能力(官方文档确认):

决策 / 字段行为说明
permissionDecision: "allow"工具正常执行显式放行(推荐,比不输出更清晰)
permissionDecision: "deny"工具被阻止permissionDecisionReason 展示给用户
permissionDecision: "ask"提示用户手动确认交互模式下弹出审批提示
modifiedArgs修改工具参数在放行的同时替换原始参数(如添加 timeout)
additionalContext注入额外上下文向对话中添加补充信息
suppressOutput抑制工具输出工具仍执行,但结果不进入对话(减少 context 占用)
注意
返回 null 或不输出任何内容等同于 allow——工具被允许执行。脚本退出码不影响决策逻辑,只有 stdout 的 JSON 内容有效。

9.4 实战脚本模板

安全拦截:阻止危险命令

Bash
#!/bin/bash
# .github/hooks/scripts/security-check.sh
# preToolUse hook:拦截破坏性操作
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.toolName')
​
# 只检查 bash 工具,其他工具放行
[ "$TOOL_NAME" != "bash" ] && exit 0
​
COMMAND=$(echo "$INPUT" | jq -r '.toolArgs' | jq -r '.command // empty')
​
# 拦截已知危险命令模式
if echo "$COMMAND" | grep -qE 'rm -rf /|DROP TABLE|format [A-Z]:|sudo rm'; then
  jq -n '{permissionDecision: "deny", permissionDecisionReason: "Dangerous destructive command detected"}'
  exit 0
fi
​
# 拦截 git push(防止未经审批推送)
if echo "$COMMAND" | grep -qE '^git push'; then
  jq -n '{permissionDecision: "deny", permissionDecisionReason: "git push requires manual execution — run it yourself after reviewing changes"}'
  exit 0
fi

代码质量卡点:编辑后自动 lint

Bash
#!/bin/bash
# postToolUse hook:文件变更后运行 checkstyle
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.toolName')
​
# 只在文件编辑或创建后触发
[[ "$TOOL_NAME" != "edit" && "$TOOL_NAME" != "create" ]] && exit 0
​
# 运行检查,仅输出末尾 5 行避免日志污染
./mvnw checkstyle:check -q 2>&1 | tail -5
Powershell
# postToolUse hook(Windows 版本)
$input = [Console]::In.ReadToEnd() | ConvertFrom-Json
if ($input.toolName -notmatch 'edit|create') { exit 0 }
./mvnw checkstyle:check -q 2>&1 | Select-Object -Last 5

合规审计:记录完整操作链路

JSON
// hooks.json — 全链路审计配置
{
  "version": 1,
  "hooks": {
    "sessionStart":        [{"type": "command", "bash": "./audit/log-session-start.sh"}],
    "userPromptSubmitted": [{"type": "command", "bash": "./audit/log-prompt.sh"}],
    "preToolUse":          [{"type": "command", "bash": "./audit/log-tool-use.sh"}],
    "postToolUse":         [{"type": "command", "bash": "./audit/log-tool-result.sh"}],
    "sessionEnd":          [{"type": "command", "bash": "./audit/log-session-end.sh"}]
  }
}
Bash
#!/bin/bash
# audit/log-tool-use.sh — JSON Lines 格式结构化日志
INPUT=$(cat)
jq -n \
  --arg ts   "$(echo "$INPUT" | jq -r '.timestamp')" \
  --arg tool "$(echo "$INPUT" | jq -r '.toolName')" \
  --arg user "${USER:-unknown}" \
  '{timestamp: $ts, user: $user, tool: $tool}' >> logs/audit.jsonl

关键词告警:生产相关 prompt 发送通知

Bash
#!/bin/bash
# userPromptSubmitted hook
INPUT=$(cat)
PROMPT=$(echo "$INPUT" | jq -r '.prompt')
​
# 如果 prompt 包含 production/prod/线上 等关键词,发送告警
if echo "$PROMPT" | grep -iqE 'production|prod|线上|生产'; then
  # 发送 Slack 告警(替换为你的 Webhook URL)
  curl -s -X POST "$SLACK_WEBHOOK_URL" \
    -H 'Content-Type: application/json' \
    -d "{\"text\":\"⚠️ Copilot CLI 正在处理生产相关操作:$PROMPT\"}"
fi

9.5 超时与性能规范

场景建议 timeoutSec说明
日志写入、统计5I/O 操作,不应超过 2 秒
代码 lint(checkstyle)30(默认值)超过 30 秒说明项目有问题,需先修复 lint 性能
编译验证60–120仅在 sessionEnd 中执行,不要放在 postToolUse
外部 API 调用(Slack、监控)10网络请求必须设置超时,避免阻塞
注意
preToolUse 和 postToolUse 中的超时直接阻塞 Agent 执行流程。慢 hook 会让每次文件读写都延迟,严重影响体验。将耗时操作(编译、测试)移到 sessionEnd hook 中,或改用后台异步执行(./slow-script.sh &)。

9.6 调试技巧

Bash
# 1. 手动测试 hook 脚本(模拟 CLI 传入的 JSON)
echo '{"toolName":"bash","toolArgs":"{\"command\":\"rm -rf /tmp\"}","timestamp":1704614600000,"cwd":"."}' \
  | bash .github/hooks/scripts/security-check.sh
​
# 2. 检查 hook 脚本是否有执行权限
ls -la .github/hooks/scripts/
chmod +x .github/hooks/scripts/*.sh
​
# 3. jq 未安装时的报错排查
which jq || (echo 'jq not found'; brew install jq)  # macOS
which jq || (echo 'jq not found'; sudo apt install jq)  # Linux
​
# 4. 验证 JSON 输出格式正确(single line)
echo '{"permissionDecision":"deny","permissionDecisionReason":"test"}' | jq -c .
注意
hook 脚本依赖 jq 解析 JSON。macOS 不预装 jq,需 brew install jq。Windows 需要手动安装或使用 PowerShell 的 ConvertFrom-Json。团队共享 hooks 时,在 README 中注明依赖,避免脚本在新成员机器上静默失败(jq 未找到时脚本直接报错退出,hook 不会触发,也不会有错误提示)。

十、Plugins:可分发的能力包

Plugin 是 Skills + Agents + Hooks + MCP 配置的打包形式,适合团队内部共享或跨项目复用。

官方文档参考
CLI plugin reference · Creating a plugin · Creating a plugin marketplace

10.1 Plugin 命令全览

插件管理命令:

命令说明
copilot plugin install SPEC安装插件
copilot plugin uninstall NAME卸载插件
copilot plugin list列出已安装插件
copilot plugin update NAME更新指定插件
copilot plugin marketplace add SPEC注册 marketplace
copilot plugin marketplace list列出已注册 marketplace
copilot plugin marketplace browse NAME浏览 marketplace 中的插件
copilot plugin marketplace remove NAME注销 marketplace

安装来源格式(install 命令的 SPEC 参数):

格式示例说明
Marketplaceplugin@marketplace从已注册的 marketplace 安装
GitHub 根目录OWNER/REPOGitHub 仓库根目录
GitHub 子目录OWNER/REPO:PATH/TO/PLUGIN仓库中的指定子目录
Git URLhttps://github.com/o/r.git任意 Git 仓库 URL
本地路径./my-plugin 或 /abs/path本地目录

10.2 安装插件

Bash
# 从官方 marketplace 安装
copilot plugin install database-data-management@awesome-copilot
​
# 直接从 GitHub 仓库安装(根目录)
copilot plugin install owner/repo
​
# 安装仓库子目录中的插件(如 monorepo 中的某个插件)
copilot plugin install anthropics/claude-code:plugins/frontend-design
​
# 从本地路径安装(开发调试阶段)
copilot plugin install ./my-team-plugin
​
# 更新插件
copilot plugin update my-team-plugin
​
# 查看已安装插件
copilot plugin list
提示
本地安装的 plugin 不会自动感知文件变更。每次修改 plugin 内容后,需要重新执行 copilot plugin install ./my-team-plugin 使变更生效,而不是重启 CLI。

10.2 创建团队内部 Plugin

一个完整 Plugin 的结构如下:(Skills + Agents + Hooks + MCP 组合拳)

Text
my-team-plugin/
├── plugin.json                    # 必须
├── agents/                        # 自定义 agents (选)
│   └── code-reviewer.agent.md    
├── skills/                        # Skills (选)
│   └── spring-migration/
│       └── SKILL.md
├── hooks.json                     # Hook 配置 (选)
└── .mcp.json                      # MCP 服务配置 (可选)

plugin.json 文件内容示例,其中只有 name 是必填的:

JSON
// plugin.json
{
  "name": "refinex-dev-tools",
  "description": "Refinex 项目 Copilot 能力包:包含代码审查 Agent、Spring 迁移 Skill 和 MCP 数据库配置",
  "version": "1.0.0",
  "author": {
    "name": "Refinex Team"
  },
  "license": "MIT",
  "agents": "agents/",
  "skills": ["skills/"],
  "hooks": "hooks.json",
  "mcpServers": ".mcp.json"
}

10.3 plugin.json 字段说明

必填字段:

字段类型说明
namestringKebab-case 插件名称(仅支持字母、数字、连字符)。最大 64 字符。

可选元数据字段:

字段类型说明
descriptionstring简要描述。最大 1024 字符。
versionstring语义化版本号(如1.0.0)。
authorobjectname(必填),email(可选),url(可选)。
homepagestring插件主页 URL。
repositorystring源代码仓库 URL。
licensestring许可证标识符(如MIT)。
keywordsstring[]搜索关键词数组。
categorystring插件分类。
tagsstring[]附加标签数组。

组件路径字段:这些字段告诉 CLI 在哪里找到插件的各个组件。所有字段均为可选,省略时 CLI 使用默认约定。

字段类型默认值说明
agentsstringstring[]agents/
skillsstringstring[]skills/
commandsstringstring[]—
hooksstringobject—
mcpServersstringobject—
lspServersstringobject—
延伸阅读
完整字段说明见官方文档 CLI plugin reference - plugin.json

10.4 marketplace.json:发布团队内部 Plugin 市场

将团队所有插件收归一个 marketplace,成员只需 copilot plugin marketplace add org/repo 即可获得所有能力,不需要逐个安装。marketplace.json 存放在仓库的 .github/plugin/ 或 .claude-plugin/ 目录下。

JSON
// .github/plugin/marketplace.json
{
  "name": "refinex-plugins",
  "owner": {
    "name": "Refinex Team",
    "email": "dev@refinex.com"
  },
  "metadata": {
    "description": "Refinex 工程团队专属 Copilot CLI 插件集",
    "version": "1.0.0"
  },
  "plugins": [
    {
      "name": "refinex-dev-tools",
      "description": "代码审查 Agent + Spring 迁移 Skill + MCP 数据库配置",
      "version": "1.0.0",
      "source": "./plugins/refinex-dev-tools"
    },
    {
      "name": "security-auditor",
      "description": "Sa-Token + Spring Security 安全审计能力包",
      "version": "1.0.0",
      "source": "./plugins/security-auditor"
    }
  ]
}

marketplace.json 顶级字段:

字段类型必填说明
namestring✅Kebab-case marketplace 名称,最大 64 字符
ownerobject✅{ name, email? }
pluginsarray✅插件条目列表
metadataobject—{ description?, version?, pluginRoot? }

插件条目(plugins 数组中的对象)关键字段:

字段类型必填说明
namestring✅Kebab-case 插件名
sourcestring \object✅插件位置(相对路径、GitHub、URL)
descriptionstring—插件描述,最大 1024 字符
strictboolean—默认 true(严格 schema 校验);false 启用宽松校验,适合老版本插件
注意
source 的值是相对于仓库根目录的路径。"./plugins/refinex-dev-tools" 与 "plugins/refinex-dev-tools" 等价,不必加 ./ 前缀。

注册和使用 marketplace:

Bash
# 团队成员执行一次,注册整个 marketplace
copilot plugin marketplace add refinex-org/copilot-plugins
​
# 浏览可用插件
copilot plugin marketplace browse refinex-plugins
​
# 安装指定插件
copilot plugin install refinex-dev-tools@refinex-plugins
​
# 注销(会阻止继续安装,但已安装插件不受影响,除非加 --force)
copilot plugin marketplace remove refinex-plugins

10.5 文件位置速查

内容路径
Marketplace 安装的插件~/.copilot/installed-plugins/MARKETPLACE/PLUGIN-NAME/
直接安装的插件~/.copilot/installed-plugins/_direct/SOURCE-ID/
Marketplace 缓存~/.cache/copilot/marketplaces/(Linux)、~/Library/Caches/copilot/marketplaces/(macOS),可通过 COPILOT_CACHE_HOME 覆盖
插件 manifest(按顺序查找).plugin/plugin.json → plugin.json → .github/plugin/plugin.json → .claude-plugin/plugin.json
Marketplace manifest(按顺序查找)marketplace.json → .plugin/marketplace.json → .github/plugin/marketplace.json → .claude-plugin/marketplace.json
MCP 配置.mcp.json、.vscode/mcp.json、.devcontainer/devcontainer.json、.github/mcp.json
LSP 配置lsp.json 或 .github/lsp.json

10.6 加载顺序与优先级规则

多个插件或配置来源之间存在冲突时,CLI 按以下规则决定使用哪个组件:

Mermaid
正在渲染 Mermaid 图表…
图示说明
Agents 和 Skills 采用「先加载优先」——项目级配置(.github/agents/)始终比 Plugin 中的同名组件优先,Plugin 无法覆盖项目本地配置。MCP Servers 采用「后加载优先」——Plugin 的 MCP 配置会覆盖 ~/.copilot/mcp-config.json 中的同名 server,若需最终覆盖可用 --additional-mcp-config flag。

Agent / Skill 完整加载顺序(越靠前优先级越高):

Text
Agent 加载顺序(first-wins):
1. ~/.copilot/agents/              用户个人(.copilot 约定)
2. <project>/.github/agents/      项目级
3. <parents>/.github/agents/      继承(monorepo)
4. ~/.claude/agents/               用户个人(.claude 约定)
5. <project>/.claude/agents/      项目级(.claude 约定)
6. Plugin: agents/ 目录            按安装顺序
7. 远程组织/企业 agents            via API

Skill 加载顺序(first-wins):
1. <project>/.github/skills/
2. <project>/.claude/skills/
3. <parents>/.github/skills/ 等   继承
4. ~/.copilot/skills/              用户个人
5. ~/.claude/skills/
6. Plugin: skills/ 目录            按安装顺序
7. COPILOT_SKILLS_DIRS env 指定的目录

MCP Server 加载顺序(last-wins):
1. ~/.copilot/mcp-config.json      最低优先级
2. .vscode/mcp.json                workspace 级
3. Plugin: MCP 配置                按安装顺序
4. --additional-mcp-config flag    最高优先级

关键冲突场景及处理方式:

冲突场景胜出方说明
Plugin agent 与 .github/agents/ 同名项目级 agentPlugin 被静默忽略,无警告
Plugin skill 与 ~/.copilot/skills/ 同名个人 skillPlugin 被静默忽略
两个 Plugin 定义同名 MCP server后安装的 Pluginlast-wins
Plugin MCP server 与 mcp-config.json 同名PluginPlugin 覆盖全局配置
内置 agent(explore/task/code-review)与任何用户定义同名内置内置不可被覆盖

十一、Custom Agents:专项子 Agent

Custom Agents 是拥有独立 context window 的子 Agent,以 .agent.md 文件定义。Copilot 在判断任务与某个 agent 的描述匹配时自动派发,或由你显式指定。

官方文档参考
About custom agents · Creating custom agents for CLI · Customization cheat sheet

与 Skills 的关键区别在于:Skills 是注入到当前 Agent 上下文的指令集,Custom Agents 是独立运行的子 Agent——它有自己的 context 空间,不会污染主 Agent 的 context window。

11.1 子 Agent 的运行机制

Mermaid
正在渲染 Mermaid 图表…
图示说明
子 Agent 的 context window 独立于主 Agent。主 Agent 无需加载与安全审计相关的所有背景知识——这些知识只存在于子 Agent 的 context 中。对于复杂的多步骤任务,这种隔离机制可以显著减少主 Agent 的 context 消耗,让主 Agent 专注于更高层次的规划和协调。

11.2 存储位置与优先级

类型位置作用范围优先级
用户级~/.copilot/agents/所有项目最高(覆盖同名仓库级)
仓库级.github/agents/当前仓库中
仓库级(.claude 约定).claude/agents/当前仓库中(与 .github 等价)
组织级组织 .github-private 仓库的 /agents/组织所有项目低
注意
用户级 agent 的优先级高于仓库级。~/.copilot/agents/ 中有同名文件会静默覆盖团队仓库的 .github/agents/ 中的同名 agent,不会有任何警告。团队协作前,先确认个人 agents 目录中没有意外冲突的文件。

11.3 创建 Custom Agent

方式一:交互式创建(推荐,让 Copilot 生成 agent 文件)

在 CLI 内执行:

Bash
/agent
# 从列表中选择 "Create new agent"
# 选择让 Copilot 生成(Option 1)或手动填写(Option 2)

选择 Option 1(Copilot 生成) 时,输入对 agent 的描述,Copilot 会生成完整的 agent 文件。描述示例:

Text
I am a security expert. I check code files thoroughly for potential security issues.
Use me whenever a security review/check/audit is requested for one or more code files,
or when the word "seccheck" is used in a prompt in reference to code files.

I will identify potential problems, such as code that:
- Exposes secrets or credentials
- Allows cross-site scripting or SQL injection
- Contains vulnerable dependencies
- Allows authentication to be bypassed

If any problems are identified, create a single GitHub issue with full details,
including risk level and recommended fix.

Copilot 生成后会显示三个选项:

  • Continue — 直接使用生成的内容
  • Review content — 在默认编辑器中打开文件,修改后再继续
  • Try again — 重新生成

选择 Option 2(手动填写) 时,CLI 会依次提示你输入:

  1. Agent 名称(security-expert → 文件名 security-expert.agent.md)
  2. 描述(expertise + 何时使用)
  3. 行为指令(约束、输出格式、操作步骤等)

最后选择保存位置:

  • Project → .github/agents/(仓库级)
  • User → ~/.copilot/agents/(个人级)

方式二:直接手动创建文件

Bash
# 创建仓库级 agent
mkdir -p .github/agents
vim .github/agents/security-auditor.agent.md
​
# 或创建个人级 agent
mkdir -p ~/.copilot/agents
vim ~/.copilot/agents/security-auditor.agent.md

创建完成后,重启 CLI 以加载新 agent(与 Skills 不同,Agent 没有热加载命令)。

注意
文件扩展名必须是 .agent.md(全小写),不是 .md。文件名(去掉 .agent.md 后缀的部分)会成为 --agent 命令行参数中使用的 agent ID。名称建议使用全小写 + 连字符,方便命令行调用时不需要转义。

11.4 agent.md 文件结构

Markdown
---
name: security-auditor
description: >
  Spring 安全审计专家。当被要求进行安全审查、检查 Sa-Token 配置、
  审计接口权限,或用户在 prompt 中使用关键词 seccheck 时使用。
tools: ["bash", "view"]
infer: true
---
​
你是一位专注于 Spring Security + Sa-Token 体系的安全审计专家。
​
## 审计范围
仅审计以下风险类别:
1. 未鉴权接口(@SaIgnore 滥用)
2. JWT/Token 伪造风险(alg 未验证、弱 secret)
3. SQL 注入(MyBatis-Plus 原生 SQL 拼接)
4. SSRF(内部服务调用未做 URL 白名单)
​
## 输出格式
以 JSON 数组输出,每个发现包含:
- file: 文件路径
- line: 行号
- severity: HIGH / MEDIUM / LOW
- description: 风险描述
- recommendation: 修复建议
​
## 约束
- 不修改任何代码文件(工具集限定为只读:bash + view)
- 不输出未经验证的猜测;不确定的发现标记 severity 为 LOW 并说明不确定原因

YAML frontmatter 字段:

字段必填说明
name推荐显示名称,用于 /agent 列表中展示。建议与文件名保持一致(小写 + 连字符)。
description关键描述 agent 的专长和触发场景。Copilot 靠这段描述做自动匹配推断。越精准、触发关键词越多,自动识别效果越好。
tools可选限制 agent 可使用的工具列表(如 ["bash", "view"])。省略则默认拥有所有工具权限。 只读 agent 务必显式限制,防止意外修改文件。
注意
tools 字段是安全边界的关键控制点。只读审计类 agent(如安全审查)应显式声明 tools: ["bash", "view"],阻止 agent 写入文件。不限制工具的 agent 在自动派发时可能执行写操作,存在风险。

11.5 四种使用方式

方式一:命令行直接指定(程序化调用,CI/CD 场景)

Bash
# --agent 后接文件名(去掉 .agent.md 后缀)
copilot --agent security-auditor --prompt "Audit all controllers in refinex-auth/src"
​
# 非交互模式(-s 只输出结果)
RESULT=$(copilot --agent security-auditor -sp "Check @src/app/validator.go for SQL injection")
echo "$RESULT" | jq .

方式二:Prompt 推断(自动匹配)

Bash
# Copilot 根据 prompt 语义与 description 匹配,自动选择 agent
Check all TypeScript files in or under the src directory for potential security problems
​
# 触发关键词(在 description 中定义)
seccheck @refinex-auth/src/main/java/com/refinex/auth/controller/

方式三:显式指令

Bash
# 直接告诉 Copilot 使用哪个 agent
Use the security-auditor agent on all files in the /src/app directory

方式四:/agent 斜杠命令(交互式选择)

Bash
# 在 CLI 内
/agent
# ↑↓ 键选择 agent,回车确认
# 然后输入要传给该 agent 的 prompt
Tip
/agent 列表中只显示自定义 agent,不包含 CLI 内置的默认 agent(如 explore、task、research、code-review、general-purpose)。

11.6 Custom Agent vs Skill 决策

维度Custom AgentSkill说明
运行方式独立子 Agent(独立 context window)注入主 Agent contextAgent 不污染主 Agent 的上下文
触发机制自动派发或显式指定自动加载或显式调用两者都支持自动和显式两种触发方式
工具访问可独立限制工具集使用主 Agent 的工具集Agent 可设置比主 Agent 更严格的工具限制
适合场景需要专注 context 的重型任务轻量级专项指令安全审计 → Agent;lint 检查流程 → Skill
文件名约定name.agent.mdSKILL.mdAgent 用文件名作 ID,Skill 用 frontmatter 的 name

实践判断原则:

  • 任务需要独立的长 context(大量文件扫描、复杂分析)→ Custom Agent
  • 只是给主 Agent 补充操作规范(「遇到 X 时应该 Y」)→ Skill
  • 需要限制工具权限(防止写文件)→ Custom Agent(可通过 tools 字段控制)

11.7 为项目设计 Agent 矩阵

Text
.github/agents/
├── security-auditor.agent.md    # Sa-Token + Spring Security 安全审计
├── api-doc-writer.agent.md      # 从 Controller 自动生成 API 文档
└── test-generator.agent.md      # 为 Service 层生成单元测试

Agent 一:API 文档生成器

Markdown
---
name: api-doc-writer
description: >
  API 文档生成专家。当被要求生成 API 文档、为 Controller 补充 Swagger 注解、
  或输出接口规范文档时使用。触发关键词:api-doc、generate docs、接口文档。
tools: ["bash", "view", "edit"]
---
​
你是一位专注于 Spring Boot REST API 文档的专家。
​
## 工作流程
​
1. 读取指定 Controller 文件(`view` 工具)
2. 分析所有 `@RequestMapping` / `@GetMapping` / `@PostMapping` 端点
3. 为每个端点补充 Springdoc/Swagger 注解:
   - `@Operation(summary = "...", description = "...")`
   - `@Parameter` 描述所有请求参数
   - `@ApiResponse` 描述成功和错误响应
4. 输出修改后的文件
​
## 约束
- 只修改 Controller 文件,不改动 Service 和 Mapper 层
- 注解描述使用中文,符合团队文档规范
- 不改变任何业务逻辑和方法签名

Agent 二:单元测试生成器

Markdown
---
name: test-generator
description: >
  单元测试生成专家。当被要求为 Service 层方法生成单元测试、
  补充测试覆盖率不足的代码时使用。触发关键词:generate tests、写单测。
tools: ["bash", "view", "edit"]
---
​
你是一位专注于 Spring Boot + JUnit 5 + Mockito 单元测试的专家。
​
## 工作流程
​
1. 读取目标 Service 文件,分析所有 public 方法
2. 识别外部依赖(注入的 Mapper、其他 Service)
3. 为每个方法生成测试:
   - 正常路径(happy path)
   - 边界条件(空值、空列表、null 参数)
   - 异常路径(BizException 触发条件)
4. 测试文件放在对应的 `src/test/java` 路径下
​
## 技术约束
- 测试框架:JUnit 5 + Mockito
- 使用 `@ExtendWith(MockitoExtension.class)`,禁止 Spring 容器(太慢)
- WebFlux 方法的测试使用 `StepVerifier` 而非 `.block()`
- 每个测试方法名格式:`methodName_scenario_expectedResult`

十二、多仓库工作流

12.1 问题背景:为什么需要多仓库工作流

微服务架构下,一个功能变更往往横跨多个仓库。例如,新增一个 AI Tool Call 接口需要同时触碰:

Text
refinex-gateway    → 新增路由规则
refinex-ai         → 实现接口
refinex-auth       → 确认鉴权配置
refinex-frontend   → 更新 API 调用

没有多仓库工作流时的痛点:

Mermaid
正在渲染 Mermaid 图表…
痛点核心
IDE 插件的 context 只有当前打开的文件。切换仓库意味着重新建立上下文,依赖关系需要人脑维护,遗漏和不一致是必然的。

Copilot CLI 多仓库工作流解决后:

Mermaid
正在渲染 Mermaid 图表…

12.2 目录授权机制

Copilot CLI 的安全模型要求:Agent 只能访问被明确授信的目录。默认情况下只能访问启动时的工作目录及其子目录。

Mermaid
正在渲染 Mermaid 图表…

授权命令:

Bash
# 方式一:从父目录启动(推荐,一次授信所有子目录)
cd ~/projects/refinex
copilot
# refinex-gateway、refinex-ai、refinex-auth 等所有子目录自动可访问
​
# 方式二:运行时动态添加(跨磁盘路径、独立克隆的仓库)
/add-dir /Users/me/projects/refinex-frontend     # 必须绝对路径
/list-dirs                                       # 查看当前已授信目录列表
注意
/add-dir 的参数必须是绝对路径。相对路径不被支持。如果 frontend 仓库克隆在不同的磁盘分区或用户目录下,必须用方式二动态添加,不能通过 cd 方式自动获得权限。

12.3 典型跨仓库任务:新增 Tool Call 接口

Mermaid
正在渲染 Mermaid 图表…

实际 Prompt 写法:

Bash
# 第一步:分析,不修改任何文件
我需要在 refinex-ai 中添加一个新的 Tool Call 接口(POST /api/ai/v2/tools/execute),
同时更新 refinex-gateway 的路由配置,
并在 @/Users/me/projects/refinex-frontend 中更新对应的 API 调用。
​
首先分析四个仓库中与 Tool Call 相关的现有代码结构,**不要修改任何文件**。
找到以下信息:
1. refinex-ai 中现有 Tool 相关的 Controller 和 Service
2. refinex-gateway 中路由规则的配置方式和文件位置
3. refinex-frontend 中 AI 接口的调用层结构
​
# 第二步:确认分析结果后,再进入 Plan Mode 执行
/plan 按照上述分析,实现 Tool Call 接口的跨仓库变更
建议
对于跨仓库变更,务必先用「只读分析」确认 Copilot 正确理解了各仓库结构,再进入 Plan Mode 执行。Copilot 在不熟悉项目结构时,可能会在错误的文件位置创建路由配置。先分析后执行,比直接 Plan 执行的返工概率更低。

12.4 多仓库场景下的指令配置建议

多仓库工作流中,各仓库的 .github/copilot-instructions.md 彼此独立。Copilot CLI 加载的指令取决于它正在操作哪个仓库的文件。跨仓库任务时,多份指令文件同时生效。

推荐实践:

Bash
~/projects/refinex/
├── refinex-gateway/
│   └── .github/copilot-instructions.md   # 路由规则约定、限流配置规范
├── refinex-ai/
│   └── .github/copilot-instructions.md   # WebFlux 约束、SSE 端点规范
├── refinex-auth/
│   └── .github/copilot-instructions.md   # Sa-Token 配置、鉴权约束
└── refinex-frontend/
    └── .github/copilot-instructions.md   # TypeScript 规范、API 调用层约定

各仓库的指令文件应包含该仓库特有的约束,公共规范(Java 版本、Conventional Commits 等)可以提取到父目录的 AGENTS.md 中,避免在每个仓库重复。

十三、权限控制与安全边界

13.1 工具审批机制

Copilot CLI 要求对可能修改或执行文件的操作进行审批:

Bash
# 在启动时预批准特定工具(避免重复审批)
copilot --allow-tool 'shell(git:*)' --deny-tool 'shell(git push)'
# 允许所有 git 子命令,但禁止 git push(防止 Copilot 未经确认推送代码)
​
# 允许文件写入但禁止 rm
copilot --allow-tool 'write' --deny-tool 'shell(rm)'
​
# 禁用所有工具审批(仅在完全信任场景下使用)
copilot --allow-all
# 等价于 --allow-all-tools --allow-all-paths --allow-all-urls
# 或在交互式会话中:/yolo
禁止
在生产服务器或包含敏感数据的目录中使用 --yolo / --allow-all。该标志允许 Copilot 在无任何审批的情况下执行 rm -rf、git push --force 等破坏性操作。

13.2 路径权限配置

默认情况下,Copilot CLI 只能访问当前工作目录及其子目录和系统 temp 目录。路径检测基于启发式解析,存在以下已知盲点:

  • 自定义环境变量(如 $MY_PROJECT_DIR)不会被展开,路径验证可能失败
  • 复杂 shell 构造(管道、子 shell)中的路径可能无法被识别
  • 创建新文件时,symlink 不会被解析

十四、高效工作流示例

14.1 从 Issue 到 PR 的完整流程

Mermaid
正在渲染 Mermaid 图表…
图示说明
Plan Mode 中的 "提问" 环节是最关键的设计点——Copilot 不会假设歧义答案直接执行,而是等待人工确认。省略这一步(直接使用 prompt 而非 Plan Mode)会导致 Copilot 在遇到 OpenAI vs. 自定义 provider 接口分歧时做出错误选择,产生需要大量返工的代码。

14.2 遗留代码库 Onboarding

Text
# 在不写任何代码的情况下,全面了解项目
Give me an overview of this project's architecture, focusing on:
1. Module dependencies and their responsibilities
2. How requests flow from the gateway to the AI service
3. Any non-obvious design decisions you can infer from the code
4. Areas that look like technical debt worth addressing

Do not modify any files.

14.3 跨模型 Code Review

Text
/review Use Opus 4.5 and Codex 5.2 to review the changes in the current branch against main.
Focus on:
1. Potential NPE risks in the WebFlux chain
2. Missing error handling in Reactor operators
3. Thread-safety issues (especially ThreadLocal usage in WebFlux context)
Output issues as a structured list with severity and file:line reference.

十五、参考文档

  • GitHub Copilot CLI 官方文档
  • GitHub MCP Registry
  • https://github.com/github/awesome-copilot
  • openai/agents.md 规范
下一篇 →
阅读指引一、定位与选型决策1.1 Copilot CLI 不是 gh copilot suggest 的升级版1.2 与 IDE 插件的边界二、安装2.1 安装方式对比与选择2.2 通过 GitHub CLI 安装(2026-01 新增)三、认证机制3.1 三种认证方式及优先级3.2 交互式认证(本地开发标准路径)3.3 多账号管理3.4 常见认证错误速查四、核心使用模式4.1 交互式 Agent 模式(主力场景)4.2 三种工作模式:Interactive / Plan / Autopilot4.3 Session 管理与无限上下文五、模型选择策略5.1 Premium Request 配额与乘数机制5.2 Auto 模式:IDE 的智能调度器5.3 CLI 用户的模型策略建议💎 IDE 插件 vs CLI:软件工程师该用哪个?六、自定义指令(Custom Instructions)6.1 指令加载优先级6.2 仓库级指令示例(Java 项目)构建与测试命令技术栈约束代码规范提交规范6.3 路径级指令(针对特定模块)refinex-ai 模块专属约束6.4 根目录 Agent 指令(AGENTS.md / CLAUDE.md)项目概览全局技术约束构建与验证提交规范AI / MCP 工具使用策略异常处理规范安全规范6.5 全局个人指令6.6 VS Code GitLens + Copilot:AI 生成 Git 消息自定义指令6.7 JetBrains IDEA + Copilot:Git Commit Instructions语言格式type 枚举scope描述规则示例七、Skills:跨工具的 Agent 能力标准7.1 Skills vs Custom Instructions7.2 存储位置7.3 SKILL.md 文件结构审计流程风险等级定义7.4 Skill 管理命令全览7.5 使用 Skill7.6 一个完整的实战 Skill:GitHub Actions 调试7.7 获取 Skills:推荐使用官方仓库(而非手写)7.8 使用 Skill Creator 创建自定义 Skill八、MCP 服务器集成8.1 添加 MCP 服务器8.2 MCP 服务器管理命令8.3 上手安装一个 MCP九、Hooks:执行生命周期钩子9.1 六种 Hook 类型与触发时机9.2 配置文件结构9.3 Hook 脚本的输入输出规范9.4 实战脚本模板9.5 超时与性能规范9.6 调试技巧十、Plugins:可分发的能力包10.1 Plugin 命令全览10.2 安装插件10.2 创建团队内部 Plugin10.3 plugin.json 字段说明10.4 marketplace.json:发布团队内部 Plugin 市场10.5 文件位置速查10.6 加载顺序与优先级规则十一、Custom Agents:专项子 Agent11.1 子 Agent 的运行机制11.2 存储位置与优先级11.3 创建 Custom Agent11.4 agent.md 文件结构审计范围输出格式约束11.5 四种使用方式11.6 Custom Agent vs Skill 决策11.7 为项目设计 Agent 矩阵工作流程约束工作流程技术约束十二、多仓库工作流12.1 问题背景:为什么需要多仓库工作流12.2 目录授权机制12.3 典型跨仓库任务:新增 Tool Call 接口12.4 多仓库场景下的指令配置建议十三、权限控制与安全边界13.1 工具审批机制13.2 路径权限配置十四、高效工作流示例14.1 从 Issue 到 PR 的完整流程14.2 遗留代码库 Onboarding14.3 跨模型 Code Review十五、参考文档