从 Claude Code 到 Copilot:我的 AI 编码工具选型与深度配置指南

本人使用过很多智能体开发工具,Claude Code、Codex、Cursor、Google Studio、Coze,其实千篇一律,大同小异。各厂商对 Agent 的 Prompt 设定与思考逻辑等略有差异,例如 Claude Code、Codex 等都有内置的系统提示词,作为开箱即用的 Coding 工具,专门针对编码、测试等开发流程进行了优化,使大家使用起来觉得非常高效(以 Claude Code 为例,感兴趣的可以参考 Claude Code 的系统提示词及智能体的设定);后来出现了 Skills、MCP 等、Plan Agent、SubAgent 等新特性,使得编码效率更高效。

那么以上这些能力,Copilot 其实也是可以实现的。Copilot 的优势在于可视化界面以及极具竞争力的价格,对于新手或轻度开发人员十分友好。今天就来总结 Copilot 的核心特性及使用方式,以及如何配置出像 Claude Code 一样强大的智能体。


一、Copilot 核心特性速览:为什么选它?

1.1 会话管理:多线程并行开发

Copilot 支持并行运行多个智能体会话,每个会话专注于不同任务。会话视图位于聊天面板中,为你提供了一个集中位置来监控所有活跃会话,无论这些会话是在本地运行、在后台运行还是在云端运行。你可以查看每个会话的状态、在会话之间切换、查看文件更改,以及从上次中断的地方继续操作。

在这里插入图片描述

1.2 多环境运行:本地/后台/云端无缝切换

智能体可以在三种环境中灵活运行:

运行环境 适用场景 特点
VS Code 本地 交互式开发、实时调试 即时响应,适合迭代开发
机器后台 长时间运行的自主任务 不占用编辑器,可执行批量操作
云端 团队协作、PR 自动化 通过拉取请求实现协作,支持多成员参与

你还可以使用来自 Anthropic 和 OpenAI 等提供商的第三方智能体。在任何时候,你都可以将任务从一种类型的智能体移交给另一种类型的智能体,并且完整的对话历史会随之转移。

在这里插入图片描述

1.3 Plan 智能体:先规划,后执行

使用内置的计划智能体,在编写任何代码之前将任务分解为结构化的实施计划。计划智能体会分析你的代码库,提出澄清问题,并生成逐步计划。当计划看起来合适时,将其交给实施智能体执行,可在本地、后台或云端进行。

1.4 核心编码能力一览

功能 快捷键/触发方式 说明
智能补全 (Tab) 自动触发或 Tab 从单行补全到完整函数实现
行内对话 Ctrl + I 在编辑器中直接打开聊天提示,原位建议编辑
智能操作 右键菜单 / 快捷键 生成提交信息、解决合并冲突、实现 TODO 注释等
代码审查 右键 → 审查 内联显示审阅评论
语义搜索 搜索视图 找到语义上相关的结果,即使文本不完全匹配

二、高级配置:打造 Claude Code 级别的智能体

如果想要 Copilot 像 Claude Code 那样强大,除了以上基础功能,我们可以为自己的工作流定义人工智能:智能体在理解你项目的规范、拥有合适的工具并使用适合任务的模型时,能发挥最佳作用。VS Code 为你提供了多种方法来定制人工智能,使其从一开始就能生成符合你代码库的代码,而无需事后进行手动修正。

2.1 自定义指令:让 Copilot 懂你的项目

自定义指令允许你定义通用的指导方针和规则,这些规则会自动影响人工智能生成代码和处理其他开发任务的方式。无需在每个聊天提示中手动添加上下文,只需在 Markdown 文件中指定自定义指令,就能确保人工智能的响应符合你的编码规范和项目要求,保持一致性。你可以配置自定义指令,使其自动应用于所有聊天请求,或者仅应用于特定文件。此外,你也可以手动将自定义指令附加到特定的聊天提示中。

2.1.1 三种指令文件类型对比
特性 .github/copilot-instructions.md AGENTS.md .instructions.md
核心定位 项目级「全局通用指令文件」 Copilot Agent 专属「任务配置文件」 细粒度「文件 / 目录级指令文件」
生效范围 整个代码仓库(所有文件、所有目录) 仅作用于 Copilot Agent 功能(全局 / 指定范围) 仅作用于当前文件所在目录 / 工作区(局部)
作用目标 所有 Copilot 基础能力(补全、注释、解释) 仅 Copilot Agent 进阶功能(自动化复杂任务) 所有 Copilot 基础能力(但仅限局部范围)
触发逻辑 被动生效(Copilot 自动读取,无需手动触发) 主动触发(需手动调用「Run Agent」功能) 被动生效(Copilot 自动读取,仅限局部)
内容风格 偏「项目级规则 / 背景」(编码规范、技术栈、业务逻辑) 偏「任务级指令 / 步骤」(明确 Agent 要完成的具体任务、执行流程) 偏「局部场景规则」(当前目录的特殊规范、文件专属逻辑)
存放路径要求 强制:仓库根目录 /.github/(大小写敏感) 无强制路径(建议放 .github/ 或根目录) 无强制路径(放在需要生效的目录下即可,如 src/utils/)
优先级 高于全局配置,低于 .instructions.md 独立优先级(仅作用于 Agent 功能,不与其他两者冲突) 最高(局部规则覆盖项目级规则)
典型使用场景 定义全仓库统一的编码规范、技术栈要求 自动化代码重构、漏洞扫描、批量生成文档 为特定目录定制规则(如 src/api/ 目录要求接口命名加前缀)

更详细解析见 【Copilot 配置】—— copilot-instructions.md vs AGENTS.md vs .instructions.md 三种指令文件解析与配置

2.1.2 创建指令文件的方法

在聊天视图中,选择配置聊天(齿轮图标)> 聊天指令,然后选择新建指令文件

在这里插入图片描述

选择创建说明文件的位置:

  • 工作区:在工作区的 .github/instructions 文件夹中创建说明文件,以便仅在该工作区内使用。
  • 用户配置文件:在当前配置文件文件夹中创建指令文件,以便在所有工作区中使用。
2.1.3 为工作区生成自定义指令 AGENTS.md

VS Code 可以分析你的工作区,并生成符合你的编码习惯和项目结构的持续有效的自定义指令。这些指令随后会自动应用于工作区中的所有聊天请求。

用自定义指令快速设置工作区的方法是在聊天输入框中输入 /init 斜线命令,Agent 会自动分析你的项目结构和编码模式,生成全面工作区说明 AGENTS.md

2.1.4 编写有效指令的技巧
  • 请保持你的指令简短且完整。每条指令都应是一个单一、简单的陈述。如果你需要提供多条信息,请使用多条指令。
  • 包含规则背后的推理。当指示解释某种惯例存在的原因时,人工智能在边缘情况下能做出更好的决策。
  • 通过具体的代码示例展示推荐的模式和应避免的模式。人工智能对示例的反应比对抽象规则的反应更有效。
  • 专注于不明显的规则。跳过标准代码检查工具或格式化工具已经强制执行的约定。
  • 对于特定任务或语言的指令,请每个主题使用多个 *.instructions.md 文件,并通过 applyTo 属性有选择地应用它们。

2.2 智能体技能(Agent Skills):复用能力的利器

与 Claude Code 类似,Copilot 也可以配置 Agent Skills。关于 Agent Skills 的介绍可以参考 【AI开发】—— AI 开发基础之 LLM、Agent、MCP、Skill 这篇文章。

2.2.1 主要功能
特性 说明
定制 Copilot 为特定领域任务定制功能,无需重复上下文
减少重复 创建一次,即可在所有对话中自动使用
组合功能 结合多项技能构建复杂工作流
高效加载 仅在需要时将相关内容加载到上下文中
2.2.2 智能体与自定义指令核心差异
特性 智能体技能(Agent Skills) 自定义指令(Instructions)
目的 教授专业能力和工作流程 定义编码标准和指南
便携性 适用于 VS Code、Copilot CLI 和 Copilot 编码智能体 仅适用于 VS Code 和 GitHub.com
内容 说明、脚本、示例和资源 仅指令
范围 特定任务,按需加载 始终适用(或通过通配符模式)
标准 开放标准(agentskills.io) 特定于 VS Code
2.2.3 创建智能体技能

类型

  • 项目级技能.github/skills/
  • 全局配置~/.copilot/skills/

创建方法

  1. 在你的工作区中创建一个 .github/skills 目录。
  2. 为你的技能创建一个子目录。每个技能都应该有自己的目录(例如,.github/skills/webapp-testing)。
  3. 在技能目录中创建一个 SKILL.md 文件。

SKILL.md 结构示例

---
name: webapp-testing
description: Guide for testing web applications using Playwright. Use this when asked to create or run browser-based tests.
---

# 使用 Playwright 进行 Web 应用程序测试

本技能助力您运用 Playwright 为 Web 应用程序创建并运行基于浏览器的测试。

## 何时使用本技能

当您需要以下操作时,使用本技能:

- 为 Web 应用程序创建新的 Playwright 测试
- 调试失败的浏览器测试
- 为新项目搭建测试基础设施

## 创建测试

1. 查看[测试模板](./test-template.js),了解标准测试结构
2. 确定要测试的用户流程
3. 在`tests/`目录中创建一个新的测试文件
4. 使用 Playwright 的定位器查找元素(优先选用基于角色的选择器)
5. 添加断言以验证预期行为

格式要求

SKILL.md 文件是一个带有 YAML 前置内容的 Markdown 文件,用于定义技能的元数据和行为。包括:

  • Header 标题:标题格式为 YAML 前置元数据
  • Body 正文:技能主体包含 Copilot 在使用该技能时应遵循的指示、指南和示例

元数据字段说明

字段 必填 描述
name 技能的唯一标识符。必须为小写,使用连字符代替空格
description 对该技能的功能以及何时使用该技能的描述
argument-hint 当该技能作为斜杠命令调用时,聊天输入框中显示的提示文本
user-invokable 控制该技能是否在聊天菜单中以斜杠命令的形式显示
disable-model-invocation 控制智能体是否可以根据相关性自动加载技能

配置选项组合

配置 斜杠命令 由 Copilot 自动加载 用例
默认(两个属性均省略) 通用技能
user-invokable: false 模型在相关时加载的背景知识技能
disable-model-invocation: true 仅希望按需运行的技能
两者都设置 已禁用技能
2.2.4 使用技能

技能可作为聊天中的斜杠命令使用。在聊天输入框中输入 /,即可查看可用技能和提示的列表,并选择一个技能来调用它。

你可以在斜杠命令后添加额外的上下文。例如,/webapp-testing for the login page/github-actions-debugging PR #42

更详细的 Agent Skills 原理见 【AI 开发】—— Agent Skills 详解及 Copilot 进阶玩法

2.2.5 添加外部技能

从 GitHub 仓库寻找可用技能,例如 Claude Code 官方技能库

2.3 自定义智能体(Custom Agents)

如果说自定义指令和 Agent Skills 是 Copilot 的「知识库」,那么自定义智能体就是为特定开发角色量身定制的「专业顾问」。通过 .agent.md 文件,你可以配置 AI 采用不同的角色身份,专注于特定的开发任务——比如让某个智能体专门负责代码审查,另一个专注于架构规划。

2.3.1 创建自定义智能体

自定义智能体通过 .agent.md Markdown 文件定义,使用 YAML 前置元数据配置元信息:

存放位置

  • 工作区级.github/agents/ —— 仅当前工作区可用
  • 用户配置:用户配置文件夹 —— 跨工作区共享

文件结构示例

---
name: code-reviewer
description: Specialized agent for thorough code reviews focusing on security, performance, and maintainability
tools:
  - readFile
  - runTests
model: gpt-4o
user-invokable: true
---

# 代码审查专家

你是一个经验丰富的代码审查专家,专注于以下维度:

## 审查维度

1. **安全性**:检查潜在的 SQL 注入、XSS、敏感信息泄露等安全风险
2. **性能**:识别 N+1 查询、内存泄漏、不必要的计算等性能瓶颈
3. **可维护性**:评估代码可读性、函数复杂度、命名规范等
4. **测试覆盖**:检查是否包含充分的单元测试和集成测试

## 输出格式

请按以下结构输出审查结果:

- **严重问题**(阻塞合并):...
- **建议优化**(可选):...
- **亮点**:...

#tool:readFile
#tool:runTests
2.3.2 智能体配置参数详解
参数 必填 说明
name 智能体唯一标识符,小写,使用连字符代替空格
description 功能描述,Copilot 根据此描述决定何时加载该智能体
tools 允许使用的工具列表,限制智能体的操作范围
agents 可委托的子智能体列表,实现分层协作
model 指定使用的模型(如 gpt-4oclaude-3.5-sonnet
handoffs 定义工作流交接点,实现多智能体协作流程
user-invokable 是否允许用户手动调用(默认 true
2.3.3 工作流交接(Handoffs)

工作流交接是自定义智能体的高级特性,允许你创建引导式顺序工作流,在不同智能体之间传递任务。这对复杂的多阶段开发任务特别有用——比如「架构设计 → 代码实现 → 代码审查」的流水线。

配置示例

---
name: planning-agent
description: Creates detailed implementation plans before coding
tools:
  - readFile
  - search
handoffs:
  - label: "Execute this plan"
    agent: implementation-agent
    prompt: "Implement the following plan..."
    send: true
---

典型使用场景

  1. 规划智能体(只读工具):分析需求、调研代码库、生成实施计划
  2. 实施智能体(编辑工具):按计划执行代码修改
  3. 审查智能体(测试工具):验证实现结果、运行测试

通过工作流交接,你可以确保复杂任务按既定流程推进,每个阶段由最适合的智能体负责,避免单一智能体在复杂任务中「迷失方向」。

2.3.4 创建第一个自定义智能体

让我们通过实际案例来理解如何创建和使用自定义智能体。假设我们需要一个专门负责 API 接口开发的智能体:

步骤 1:创建智能体文件

.github/agents/api-developer.agent.md 创建文件:

---
name: api-developer
description: Specialized agent for API development with NestJS. Use this when creating RESTful APIs, defining DTOs, or implementing controllers and services.
tools:
  - readFile
  - editFile
  - createFile
  - runTerminalCommand
model: gpt-4o
user-invokable: true
---

# API 开发专家

你是一个专注于 NestJS 后端开发的专家,擅长设计 RESTful API、数据验证和业务逻辑实现。

## 开发规范

### 1. DTO 设计原则
- 使用 `class-validator` 进行属性验证
- 必填字段使用 `@IsNotEmpty()` 或 `@IsDefined()`
- 可选字段使用 `@IsOptional()`
- 枚举类型使用 `@IsEnum()`
- 使用 `ApiProperty` 添加 Swagger 文档

### 2. Controller 设计原则
- 使用 RESTful 命名规范
- 统一响应格式:`{ code: number, data: T, message: string }`
- 使用装饰器进行权限控制 (`@Roles`, `@Permissions`)
- 使用 `@ApiTags` 分组接口文档

### 3. Service 设计原则
- 业务逻辑封装在 Service 层
- 使用 Repository 模式进行数据库操作
- 异常处理使用自定义异常类
- 日志记录使用 Winston 或 NestJS 内置 Logger

## 文件组织

src/modules/{module-name}/
├── dto/
│ ├── create-{entity}.dto.ts
│ ├── update-{entity}.dto.ts
│ └── {operation}-{entity}.dto.ts
├── entities/
│ └── {entity}.entity.ts
├── {entity}.controller.ts
├── {entity}.service.ts
└── {entity}.module.ts


## 代码示例

### 创建 DTO

```typescript
import { IsNotEmpty, IsString, IsOptional, IsEnum, IsNumber } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';

export class CreateUserDto {
  @ApiProperty({ description: '用户名' })
  @IsNotEmpty({ message: '用户名不能为空' })
  @IsString()
  username: string;

  @ApiProperty({ description: '邮箱' })
  @IsNotEmpty({ message: '邮箱不能为空' })
  @IsEmail()
  email: string;

  @ApiPropertyOptional({ description: '年龄' })
  @IsOptional()
  @IsNumber()
  age?: number;
}

创建 Controller

import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';

@ApiTags('用户管理')
@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  @ApiOperation({ summary: '创建用户' })
  @ApiResponse({ status: 201, description: '创建成功' })
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @Get()
  @ApiOperation({ summary: '查询用户列表' })
  findAll(@Query() query: QueryUserDto) {
    return this.userService.findAll(query);
  }
}

工具使用

#tool:readFile
#tool:editFile
#tool:createFile
#tool:runTerminalCommand


**步骤 2:使用智能体**

创建完成后,你可以在 Copilot 聊天中直接调用这个智能体:

1. **通过斜杠命令**:输入 `/api-developer` 然后描述你的需求
   - 例如:`/api-developer 为用户模块创建 CRUD 接口`

2. **自动触发**:当你在聊天中提到 API 相关任务时,Copilot 会根据描述自动加载该智能体

3. **手动指定**:使用 `@` 符号选择智能体,例如 `@api-developer 帮我优化这个 controller`

智能体会根据你定义的规范生成符合项目标准的代码,确保一致性和最佳实践。

### 2.3.5 智能体的最佳实践

**1. 角色边界清晰**
每个智能体应该专注于一个明确的领域或任务。避免创建「全能型」智能体,这样会导致决策模糊和执行效率低下。

✅ **推荐**:
- `database-designer` —— 专注于数据库建模
- `api-developer` —— 专注于 RESTful API 开发
- `test-engineer` —— 专注于测试用例编写

❌ **避免**:
- `backend-expert` —— 范围太广,什么都做意味着什么都做不精

**2. 工具权限最小化**
根据智能体的职责严格限制其可用工具。只读类智能体(如规划、审查)不应授予文件编辑权限。

| 智能体类型 | 推荐工具 | 禁止工具 |
|-----------|---------|---------|
| 规划/审查 | `readFile`, `search`, `runTests` | `editFile`, `createFile` |
| 开发/重构 | `readFile`, `editFile`, `createFile`, `runTerminalCommand` | - |
| 部署/运维 | `readFile`, `runTerminalCommand` | `editFile`(除非必要) |

**3. 指令具体可执行**
智能体的指令部分应该包含具体的、可操作的规范,而不是泛泛而谈的原则。

✅ **具体**:
```markdown
### DTO 验证规则
- 必填字段使用 `@IsNotEmpty()`,并附带中文错误消息
- 可选字段必须显式使用 `@IsOptional()`
- 所有字段必须添加 `@ApiProperty()` 或 `@ApiPropertyOptional()`

模糊

### 编码规范
- 代码要清晰易读
- 遵循最佳实践

4. 工作流合理拆分
对于复杂的多阶段任务,利用工作流交接(Handoffs)将任务分解为清晰的阶段。

典型的工作流设计:

[需求分析智能体]
    ↓ handoff: "开始设计方案"
[架构设计智能体]
    ↓ handoff: "开始编码实现"
[开发实现智能体]
    ↓ handoff: "开始代码审查"
[代码审查智能体]
    ↓ handoff: "合并并部署"
[部署发布智能体]

每个阶段完成后,智能体将上下文和成果交接给下一个智能体,确保任务按既定流程推进,同时保持上下文的连续性。

5. 持续迭代优化
智能体的配置不是一劳永逸的,应该根据实际使用效果持续优化。

优化建议:

  • 收集反馈:记录智能体生成代码的采纳率、修改频率
  • 分析边界案例:当智能体输出不符合预期时,检查是指令不明确还是场景超出设计范围
  • 定期更新:随着项目技术栈和规范的演进,同步更新智能体的指令
  • 版本管理:将 .agent.md 文件纳入版本控制,记录迭代历史

通过以上最佳实践,你可以构建出一支「各专其职、协作高效」的 AI 智能体团队,让 Copilot 真正成为你项目的「专属开发团队」。

2.4 钩子(Hooks):自动化工作流的瑞士军刀

Hooks 是 Copilot 中一个强大的高级特性,它允许你在智能体会话的关键生命周期节点执行自定义 shell 命令。你可以把它理解为 CI/CD 中的钩子(pre-commit、post-build 等),只不过这里的「流水线」是 AI 辅助的编码会话。

通过 Hooks,你可以自动化工作流、强制执行安全策略、验证操作合规性,以及与外部工具集成——所有这些都可以在 AI 执行任务的特定时机自动触发。

2.4.1 生命周期事件类型

Copilot 支持八种生命周期事件,覆盖智能体会话的完整流程:

事件类型 触发时机 典型用途
SessionStart 用户提交新会话的第一个提示时 注入项目元数据、加载环境信息
UserPromptSubmit 用户提交提示(包括后续追问) 记录审计日志、内容过滤
PreToolUse Agent 调用任何工具之前 权限控制、危险操作拦截
PostToolUse 工具执行完成之后 自动格式化、触发测试、发送通知
PreCompact 上下文压缩(trim)之前 保存完整对话历史
SubagentStart 启动子智能体时 传递父级上下文、初始化资源
SubagentStop 子智能体完成时 收集结果、清理资源
Stop 会话结束时 生成总结报告、归档会话
2.4.2 钩子配置方式

Hooks 通过 JSON 文件配置,Copilot 会在以下位置搜索配置:

作用域 路径 优先级
项目级 .github/hooks/*.json 最高
用户级 ~/.vscode/hooks/*.json 或 macOS ~/Library/Application Support/Code/hooks/ 较低

当同一事件在项目级和用户级都有配置时,项目级配置优先

配置文件格式

{
  "hooks": {
    "SessionStart": [
      {
        "type": "command",
        "command": "node",
        "args": ["./scripts/get-project-info.js"],
        "cwd": "${workspaceFolder}",
        "env": {
          "NODE_ENV": "development"
        },
        "timeout": 30000
      }
    ],
    "PreToolUse": [
      {
        "type": "command",
        "command": "python",
        "args": ["security-check.py"],
        "windows": {
          "command": "python.exe"
        },
        "linux": {
          "command": "/usr/bin/python3"
        }
      }
    ]
  }
}

配置字段说明

字段 类型 必填 说明
type string 钩子类型,目前仅支持 "command"
command string 要执行的命令
args array 命令参数列表
cwd string 工作目录,可使用 ${workspaceFolder} 变量
env object 环境变量
timeout number 超时时间(毫秒),默认 30000
windows/linux/osx object 平台特定的命令覆盖
2.4.3 钩子输入输出协议

Hooks 通过标准输入(stdin)接收 JSON 格式的输入,通过标准输出(stdout)返回 JSON 格式的输出。

输入格式示例(PreToolUse)

{
  "timestamp": "2024-01-15T09:30:00Z",
  "cwd": "/home/user/project",
  "sessionId": "sess_abc123",
  "hookEventName": "PreToolUse",
  "toolName": "editFile",
  "toolInput": {
    "path": "src/config/database.ts",
    "content": "..."
  }
}

通用输入字段

字段 类型 说明
timestamp string ISO 8601 格式的时间戳
cwd string 当前工作目录
sessionId string 会话唯一标识
hookEventName string 触发的事件类型

输出格式示例(PreToolUse 拦截危险操作)

{
  "continue": false,
  "stopReason": "Potential destructive operation detected",
  "systemMessage": "⚠️ 检测到可能危险的操作:正在尝试修改数据库配置文件。请确认此操作是经过授权的。",
  "hookSpecificOutput": {
    "permissionDecision": "deny",
    "updatedInput": null,
    "additionalContext": "This operation was blocked by security policy"
  }
}

通用输出字段

字段 类型 说明
continue boolean 是否继续执行(false 会中断操作)
stopReason string 停止原因(当 continuefalse 时必填)
systemMessage string 显示给用户的系统消息

PreToolUse 专属输出字段(在 hookSpecificOutput 中):

字段 类型 说明
permissionDecision string 权限决策:"allow""deny""ask"
updatedInput object 修改后的工具输入参数
additionalContext string 提供给模型的额外上下文

权限决策优先级:当多个钩子运行时,采用最严格的决策 —— deny > ask > allow

退出码含义

退出码 含义 行为
0 成功 正常继续
2 阻止错误 中断操作并显示错误信息
其他 非阻塞警告 记录警告但继续执行
2.4.4 典型使用场景

场景 1:拦截危险命令

使用 PreToolUse 钩子阻止破坏性操作:

{
  "hooks": {
    "PreToolUse": [
      {
        "type": "command",
        "command": "python",
        "args": ["scripts/security-guard.py"]
      }
    ]
  }
}

security-guard.py 示例逻辑:

import json
import sys
import re

# 从 stdin 读取输入
input_data = json.load(sys.stdin)

tool_name = input_data.get("toolName")
tool_input = input_data.get("toolInput", {})

# 危险命令黑名单
DANGEROUS_PATTERNS = [
    (r"rm\s+-rf\s+/", "Attempting to delete system files"),
    (r"DROP\s+TABLE", "Database table drop operation"),
    (r">\s*/etc/", "System file modification"),
]

# 检查危险操作
for pattern, reason in DANGEROUS_PATTERNS:
    if re.search(pattern, str(tool_input), re.IGNORECASE):
        output = {
            "continue": False,
            "stopReason": f"Blocked dangerous operation: {reason}",
            "systemMessage": f"⚠️ 检测到危险操作:{reason}。此操作已被安全策略阻止。",
            "hookSpecificOutput": {
                "permissionDecision": "deny"
            }
        }
        print(json.dumps(output))
        sys.exit(2)

# 安全,允许继续
output = {
    "continue": True,
    "systemMessage": "",
    "hookSpecificOutput": {
        "permissionDecision": "allow"
    }
}
print(json.dumps(output))

场景 2:自动格式化代码

使用 PostToolUse 在文件修改后自动运行 Prettier:

{
  "hooks": {
    "PostToolUse": [
      {
        "type": "command",
        "command": "node",
        "args": ["scripts/auto-format.js"]
      }
    ]
  }
}

场景 3:审计日志记录

使用 PreToolUsePostToolUse 组合记录所有工具调用:

{
  "hooks": {
    "PreToolUse": [
      {
        "type": "command",
        "command": "node",
        "args": ["scripts/audit-log.js", "start"]
      }
    ],
    "PostToolUse": [
      {
        "type": "command",
        "command": "node",
        "args": ["scripts/audit-log.js", "end"]
      }
    ]
  }
}

场景 4:注入会话上下文

使用 SessionStart 在会话开始时提供项目元数据:

{
  "hooks": {
    "SessionStart": [
      {
        "type": "command",
        "command": "bash",
        "args": ["-c", "echo '{\"project\": \"'$(basename $(git rev-parse --show-toplevel))'\", \"branch\": \"'$(git branch --show-current)'\", \"nodeVersion\": \"'$(node -v)'\"}'"]
      }
    ]
  }
}
2.4.5 安全与排错

安全注意事项

  1. 权限控制:Hooks 以 VS Code 相同的权限执行 shell 命令,谨慎使用来自不受信任来源的钩子配置
  2. 最小权限原则:限制钩子脚本的权限范围,避免授予不必要的系统访问权限
  3. 输入验证:验证所有输入参数,防止注入攻击
  4. 密钥管理:切勿在钩子脚本中硬编码敏感信息(密码、API 密钥等),使用环境变量或密钥管理服务

故障排查

查看诊断信息:

  1. 在 Chat 视图中右键 → Diagnostics(诊断)
  2. 在 Output 面板中选择 GitHub Copilot Chat Hooks 查看钩子输出

常见问题及解决方案:

问题 可能原因 解决方案
钩子不执行 文件位置错误 确认文件在 .github/hooks/ 目录且扩展名为 .json
权限被拒绝 脚本没有执行权限 运行 chmod +x script.sh 授予执行权限
超时错误 脚本执行时间过长 在配置中增加 timeout 值(毫秒)
JSON 解析错误 脚本输出格式不正确 验证脚本输出有效的 JSON 格式
钩子被执行多次 项目级和用户级配置冲突 检查并清理重复配置

通过合理使用 Hooks,你可以将 Copilot 从一个「智能编码助手」升级为「自动化开发工作流引擎」,实现安全策略强制执行、代码质量自动保障、以及与现有开发工具链的深度集成。

2.5 模型上下文协议(MCP):连接外部世界的桥梁

如果说自定义指令和 Agent Skills 是 Copilot 的「内功」,那么 MCP(Model Context Protocol,模型上下文协议) 就是它的「外功」—— 让 Copilot 能够连接到外部工具、服务和数据源,打破「孤岛」限制,真正实现与整个开发工具链的深度融合。

MCP 是一个开放标准,由 Anthropic 提出,旨在为 AI 模型与外部世界提供统一的连接协议。在 VS Code 中,MCP 服务器可以为 Copilot 提供工具(Tools)、资源(Resources)、提示(Prompts)甚至交互式应用(Apps),让 Copilot 的能力边界大大扩展。

2.5.1 MCP 能做什么?

在 VS Code 中,MCP 服务器可以提供以下四种能力:

能力类型 说明 典型应用场景
Tools 函数调用能力,执行文件操作、调用 API、查询数据库等 文件读写、HTTP 请求、SQL 查询、执行测试
Resources 提供上下文数据,如文件内容、数据库表、API 响应 读取配置文件、获取数据库 Schema、查询外部数据源
Prompts 预配置的提示模板,通过 /<server>.<prompt> 调用 标准化常用操作、封装复杂指令、团队共享提示
MCP Apps 交互式 UI 组件,在聊天面板中渲染 表单输入、数据可视化、交互式配置界面

这些能力让 Copilot 不再局限于「读取当前文件、编辑代码」,而是可以:

  • 直接查询你的数据库 Schema 来生成更准确的 ORM 代码
  • 调用 Playwright 进行端到端测试并返回结果
  • 读取外部 API 文档来生成接口调用代码
  • 在团队内共享标准化的提示模板
2.5.2 配置 MCP 服务器

在 VS Code 中,MCP 服务器通过 mcp.json 文件配置,支持两种配置位置:

作用域 路径 适用场景
工作区级 .vscode/mcp.json 当前项目专用的 MCP 服务器
用户级 用户配置目录 跨项目共享的 MCP 服务器

配置方式

  1. 通过命令面板MCP: Add Server 命令
  2. 通过 Extensions 视图:搜索 @mcp 标签查看可用服务器
  3. 通过 CLIcode --add-mcp <server-config>
  4. 手动编辑:直接创建/修改 mcp.json 文件

配置文件结构

{
  "servers": {
    "github": {
      "type": "http",
      "url": "https://api.githubcopilot.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:GITHUB_TOKEN}"
      }
    },
    "playwright": {
      "type": "command",
      "command": "npx",
      "args": ["-y", "@microsoft/mcp-server-playwright"],
      "env": {
        "PLAYWRIGHT_BROWSERS_PATH": "0"
      }
    },
    "sqlite": {
      "type": "command",
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "./data/app.db"]
    },
    "fetch": {
      "type": "http",
      "url": "https://api.example.com/mcp/fetch",
      "timeout": 30000
    }
  }
}

传输类型

类型 配置方式 适用场景
HTTP "type": "http", "url": "..." 远程 MCP 服务器、团队共享服务
本地命令 "type": "command", "command": "..." 本地安装的 CLI 工具、Node/Python 脚本

配置字段说明

字段 类型 必填 说明
type string 传输类型:"http""command"
url string HTTP 必填 HTTP 服务器的 URL
command string Command 必填 要执行的命令
args array 命令参数列表
env object 环境变量
headers object HTTP 请求头
timeout number 超时时间(毫秒)
2.5.3 使用 MCP 服务器

配置完成后,MCP 服务器提供的工具会自动出现在 Copilot 的工具列表中,你可以像使用内置工具一样使用它们。

工具调用

当你在聊天中描述需要执行的操作时,Copilot 会自动选择合适的 MCP 工具:

User: 帮我查询一下用户表中有多少条记录
Copilot: 我来帮你查询数据库。 [调用 mcp-sqlite/query 工具]
Result: 用户表共有 1,234 条记录

Prompt 调用

MCP 服务器提供的预配置提示可以通过 /<server>.<prompt> 语法调用:

User: /github.create-pull-request 修复登录页面的样式问题
Copilot: [使用 GitHub MCP 的 create-pull-request 模板] 我来帮你创建 PR...

在智能体中使用

你也可以在 .agent.md 文件中显式声明使用 MCP 工具:

---
name: database-admin
description: Database administration and query tasks
tools:
  - readFile
  - mcp-sqlite/query
  - mcp-sqlite/schema
---
2.5.4 MCP 与 Hooks 的协同

MCP 和 Hooks 虽然解决的问题不同,但可以形成强大的协同效应:

能力 MCP Hooks
核心定位 扩展 Copilot 的能力边界(连接外部世界) 在特定时机执行自定义逻辑(流程控制)
执行方式 AI 主动调用工具 事件触发执行命令
典型用途 数据库查询、API 调用、文件操作 安全检查、日志记录、格式化

协同示例:数据操作的安全审查

User: 删除数据库中状态为 'inactive' 的所有用户

流程:
1. [Copilot] 识别需要操作数据库
2. [MCP] 调用 mcp-sqlite/delete 工具
3. [Hooks - PreToolUse] 触发安全审查钩子
   - 检查 SQL 是否包含危险操作 (DELETE without WHERE, DROP TABLE 等)
   - 如果是批量删除,要求额外确认
4. [Hooks] 返回 "ask" 决策,Copilot 询问用户确认
5. [User] 确认执行
6. [MCP] 执行实际的删除操作
7. [Hooks - PostToolUse] 记录审计日志

这种组合让你既能利用 MCP 的强大功能扩展能力边界,又能通过 Hooks 确保操作的安全性和合规性。

2.5.5 常用 MCP 服务器推荐

社区已经有很多现成的 MCP 服务器可以直接使用:

服务器 安装命令 功能描述
Playwright npx -y @microsoft/mcp-server-playwright 浏览器自动化测试
SQLite uvx mcp-server-sqlite --db-path ./app.db SQLite 数据库操作
GitHub HTTP 方式配置 GitHub API 操作
Brave Search npx -y @modelcontextprotocol/server-brave-search 网络搜索能力
Filesystem npx -y @modelcontextprotocol/server-filesystem 文件系统操作

更多 MCP 服务器可以在 MCP 官方文档社区服务器列表 中找到。

2.5.6 安全与最佳实践

安全注意事项

  1. 信任审查:VS Code 会在首次启动 MCP 服务器前提示信任确认。仔细审查配置,尤其是来自不受信任来源的配置。
  2. 代码执行风险:本地 MCP 服务器可以执行任意代码,只使用可信来源的服务器。
  3. 最小权限原则:为 MCP 服务器配置最小必要的权限,避免过度授权。
  4. 密钥管理:不要在 mcp.json 中硬编码敏感信息,使用环境变量引用(如 ${env:API_KEY})。

最佳实践

  1. 按需启用:不要一次性启用过多 MCP 服务器,只启用当前项目需要的,避免工具列表过于庞杂。
  2. 命名规范:为 MCP 服务器使用清晰的命名,便于在工具列表中识别。
  3. 环境隔离:区分开发、测试、生产环境的 MCP 配置,避免误操作生产环境。
  4. 定期审计:定期检查 MCP 服务器的使用情况,移除不再需要的服务器。

重置信任状态:如需重新审查已信任的 MCP 服务器,使用命令 MCP: Reset Trust

通过合理配置 MCP 服务器,你可以将 Copilot 从一个「代码补全工具」升级为「全栈开发助手」,让它能够与你的整个开发和运维工具链无缝协作,真正实现「一句话完成复杂任务」的愿景。

三、实战场景:Copilot 能帮你做什么?

3.1 端到端功能开发

用自然语言描述一项功能,智能体就会搭建项目架构、在多个文件中实现逻辑,并运行测试以验证结果。

3.2 调试并修复失败的测试

将智能体指向失败的测试,它会读取错误信息,在你的代码库中追踪根本原因,应用修复方案,并重新运行测试以确认。

3.3 重构或迁移代码库

让智能体规划一次迁移,例如从一个框架迁移到另一个框架,它会在文件间应用协调的更改,同时通过构建进行验证。

3.4 通过拉取请求进行协作

将任务委派给云智能体,它会创建分支、实施更改并打开拉取请求供团队审核。


四、总结:从"能用"到"好用"的关键配置

通过本文的介绍,相信你已经对 Copilot 的核心特性和高级配置有了全面的了解。要让 Copilot 真正成为你的"专属项目管家",关键在以下几点:

  1. 基础能力用好:熟练掌握 Tab 补全、行内对话(Ctrl+I)、智能操作等日常功能,提升编码流畅度。

  2. 指令文件配好:根据项目规模选择合适的配置策略:

    • 小型项目:一个 .github/copilot-instructions.md 足够
    • 中大型项目:全局指令 + 局部指令(.instructions.md)结合
    • 复杂自动化任务:用 AGENTS.md 定义任务流程
  3. 技能体系建好:将重复性的工作流抽象为 Agent Skills,通过 SKILL.md 固化经验,实现团队内的能力复用。

  4. 持续迭代优化:定期回顾指令文件的效果,根据实际使用反馈调整规则,让 Copilot 越用越顺手。

其实无论是 Claude Code、Cursor 还是 Copilot,工具只是手段,提升开发效率和代码质量才是目的。选择最适合你团队工作流的工具,搭配合理的配置,才能真正发挥 AI 辅助开发的威力。

后续我会继续分享 Copilot 结合具体业务场景的实战案例,比如用 Agent 自动生成接口文档、智能重构遗留代码等,感兴趣的同学可以持续关注,或在评论区留言交流你在使用 Copilot 过程中遇到的问题和心得~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐