# 比较 GitHub Copilot CLI 自定义功能

了解可以自定义 Copilot的各种方法：它们执行的操作，以及何时使用它们。

## 介绍

Copilot CLI 是基于终端的 AI 代理，可以代表你回答问题、计划工作和完成任务。 它设计为高度可扩展，可通过多种方式自定义其行为并扩展其功能。

本文介绍以下两者之间的差异：

* **自定义指令**

  这些指示Copilot一般的**行为准则**。 例如，为了确保编写的任何代码 Copilot 都符合编码标准。
  [了解详细信息](#custom-instructions)。

* **技能**

  这些说明 Copilot**如何处理特定类型的任务**。 例如，在处理特定类型的任务时使用特定工具。
  [了解详细信息](#skills)。

* **工具**

  这些 **提供能力**。 例如，用于查找和修改文件，或者用于与部分 GitHub文件进行交互。
  [了解详细信息](#tools)。

* **MCP 服务器**

  这些**添加了工具集**，允许 Copilot 与外部服务交互。
  [了解详细信息](#mcp-servers)。

* **挂钩**

  通过这些方法，可以在 **特定的生命周期时刻运行自己的逻辑**。 例如，每次 CLI 会话启动或结束时，都可以运行特定的脚本。
  [了解详细信息](#hooks)。

* **子代理**

  这些是 **委托代理进程**，绑定到主代理，用于独立于主代理进程执行特定任务。 它们有自己的上下文窗口，无需影响主代理的上下文即可填充这些窗口。
  [了解详细信息](#subagents)。

* **自定义代理**

  这些是 **专用功能的定义**，旨在执行特定任务。 主 CLI 代理可以使用自定义代理配置文件将任务委托给子代理，以将专家知识和特定方法应用于任务。 例如，自定义代理可以执行 React 审阅者、文档编写者、安全审核员或测试生成器的角色。
  [了解详细信息](#custom-agents)。

* **插件**

  这些 **包** 可以提供预配置的自定义，例如技能、挂钩、自定义代理和 MCP 服务器。
  [了解详细信息](#plugins)。

## 自定义指令

### 什么是自定义说明？

**自定义指令**是 Copilot CLI 在会话开始时从指令文件加载的持久化指导。

Copilot 将从存储库中的多个默认位置（如 `AGENTS.md` 和 `.github/copilot-instructions.md`），或者从主目录中的 `$HOME/.copilot/copilot-instructions.md` 查找并加载指令文件。

可以使用标志 `--no-custom-instructions` 来避免加载这些说明。

### 自定义指令可以解决哪些问题？

自定义说明可帮助你：

* 让 Copilot 符合你的编码规范和偏好。
* 一致地应用团队或组织标准。
* 避免在每个提示中都包含对 Copilot 的重复提醒。

### 何时应使用自定义说明？

使用自定义说明以实现以下目的：

* 样式和质量规则

  示例：“首选小型 PR、编写测试，并避免在不讨论的情况下更改公共 API。

* 存储库约定

  示例：“使用 `pnpm`，在 `CHANGELOG.md` 中保留更改日志条目，提交之前运行 `pnpm test`。”

* 通信首选项

  示例：“简要说明权衡，然后提供建议的选择。

### 何时不应使用自定义说明？

当应避免或尽量减少时：

* 你只需要一个工作流中的行为（改用 **技能** ）。
* 说明内容太详尽或具体，以至于让你无法集中于眼前的任务（建议使用Copilot或**自定义代理**）。

### 详细了解自定义说明

请参阅“[为 GitHub Copilot CLI 添加自定义说明](/zh/copilot/how-tos/copilot-cli/customize-copilot/add-custom-instructions)”。

## 技能

### 什么是技能？

**技能**至少是一个 Markdown 文件，其中包含可以用来在特定上下文中执行任务的说明Copilot。 名称和技能说明允许 Copilot 确定它是否应将技能用于给定的任务。 如果决定使用技能，它将加载说明并按照说明完成任务。

技能可以选择引用存储在技能目录中的其他文件。 这些可包含 Copilot 使用该技能时可运行的脚本。

### 技能可以解决什么问题？

技能可帮助你：

* 标准化 Copilot 在特定上下文中执行任务的方式（例如，执行代码审查时）。
* 提供“实时”指令，而无需永久更改 Copilot'行为。
* 避免将与当前任务无关的说明重载到Copilot的上下文窗口。

### 如何访问技能？

可以使用斜杠命令手动调用技能。 例如，`/Markdown-Checker check README.md`。 用于 `/skills list` 列出可用的技能。

Copilot CLI 当检测到与当前任务相关的技能时，会自动调用技能。

### 何时应使用技能？

如果需要，请使用技能：

* 一组可用于某个类型的任务的可重复指令或功能。

  示例：一种文档技能，用于检查前端代码更改时是否更新了面向用户的文档。

* 一致的输出格式。

  示例：一个“发行说明草稿”技能，确保 Copilot 使用模板创建发行说明。

* 一个有时需要但并非总是需要的工作流。

  示例：仅在迁移期间启用的“深度重构”技能。

### 何时不应使用技能？

以下情况下避免使用技能：

* 本指南应适用于你所做的 **一切** （改用 **自定义说明** ）。
* 需要新功能（可能需要 **MCP 服务器** 来添加工具或用于专用的 **自定义代理** ）。

### 详细了解代理技能

请参阅“[关于代理技能](/zh/copilot/concepts/agents/about-agent-skills)”。

## 工具

### 什么是工具？

**工具**可用于Copilot完成某些操作，例如搜索文件、查看文件内容、编辑、运行任务或调用技能。 某些工具内置，其他工具可通过 MCP 服务器添加。

### 工具可以解决什么问题？

工具允许 CLI：

* 收集准确的上下文（使用读取/搜索工具）。
* 安全地进行更改（使用编辑工具）。
* 执行命令并验证结果（可能使用子代理）。

### 何时应使用工具？

通常不会直接调用工具，Copilot 决定根据需要使用工具。 可以允许或拒绝对特定任务、当前会话或所有 Copilot CLI 会话使用工具。

在以下情况下，你将看到 Copilot 使用工具：

* 要求 Copilot 搜索存储库中的内容、更新文件或运行测试。
* 调用某个技能以触发`skill`工具。
* 要求 Copilot 执行要求其使用 MCP 服务器提供的工具的任务。
* 指派 Copilot 完成复杂任务，它会决定委托给子智能体 — 这会触发 `task` 工具。

### 详细了解如何允许或拒绝工具

请参阅“[关于 GitHub Copilot CLI](/zh/copilot/concepts/agents/copilot-cli/about-copilot-cli#allowed-tools)”。

## MCP 服务器

### 什么是 MCP 服务器？

**MCP 服务器**是一项允许 AI 应用程序（例如Copilot CLI）连接到外部数据源和工具的服务。

通过添加 MCP 服务器来 Copilot CLI 提供其他功能，允许你使用该 MCP 服务器提供的工具。 例如，可以添加 MCP 服务器，该服务器提供用于与联机日历应用程序交互的工具，或支持票证系统。

### MCP 服务器可以解决什么问题？

当内置工具不够时，MCP 服务器会有所帮助。 他们可以：

* 将 Copilot CLI 连接到外部系统。
* 添加专用工具（例如，用于处理 API、数据库或映像生成）。
* 标准化非存储库资源的安全访问模式。

### 何时应使用 MCP 服务器？

如果需要，请使用 MCP 服务器：

* 与外部数据或系统集成。

  示例： `How many support tickets have been opened this month for Product X?`

* 希望 CLI 代表你执行的特定于域的操作。

  示例： `Message the bug-watch channel: Only 2 support tickets raised this month for Product X.`

### 何时不应使用 MCP 服务器？

避免在以下情况下添加MCP服务器：

* 内置工具已满足你的需求。

### 了解有关 MCP 服务器的详细信息

请参阅“[关于模型上下文协议 (MCP)](/zh/copilot/concepts/context/mcp)”。

## 挂钩

### 什么是挂钩？

**挂钩** 允许你指定，在会话生命周期的给定点， Copilot CLI 将执行你定义的 shell 命令。

| 挂钩                            | 运行时          |
| ----------------------------- | ------------ |
| `preToolUse` / `postToolUse`  | 工具运行之前/之后。   |
| `userPromptSubmitted`         | 当用户提交提示时。    |
| `sessionStart` / `sessionEnd` | 在会话的开始/结束时。  |
| `errorOccurred`               | 发生错误时。       |
| `agentStop`                   | 当主代理停止而不出错时。 |
| `subagentStop`                | 在子代理完成时。     |

### 挂钩可以解决什么问题？

在需要**可编程控制或行为可观测性**Copilot CLI的情况下，挂钩可以提供帮助，例如：

* **强制实施防护措施** - 在运行某些工具之前阻止或发出警告。
* **添加日志记录/遥测**
* **自定义可恢复错误的重试/中止行为**
* **添加“策略”检查**，例如，阻止对受保护路径的编辑。
* **截获子代理完成任务的时刻**—在结果返回给父代理之前。

当你需要比技能或自定义指令提供的更多控制时，挂钩非常有用。 虽然技能和说明通过提示指导 Copilot其行为，但挂钩可确保在特定时刻执行定义的操作，例如，阻止工具运行，或在会话结束时记录活动。

### 何时应使用钩子？

如果需要，请使用挂钩：

* **工具防护措施**

  * 示例：在运行之前 `bash` ，要求特定命令与允许列表匹配。
  * 示例：在 `edit` 运行之前，除非存在票证 ID，否则阻止 `infra/` 下面的更改。

* **会话生命周期自动化**

  * 示例：代理停止时，将会话的脚本存档到存储位置。

* **错误处理策略**

  * 示例：在遇到速率限制错误时，自动选择“重试”，并设定重试次数的上限。

* **子代理工作流控件**

  * 示例：子代理完成后，在将结果传递回主代理之前验证其输出。

### 何时不应使用挂钩？

以下情况下避免使用挂钩：

* 只需一致的提示或工作流说明（使用 **技能**）。
* 需要持久性首选项和标准（使用 **自定义说明**）。
* 你需要新的外部功能（使用 **MCP 服务器** 和工具）。
* 维护可能影响每个会话的配置可能会给你造成问题。

### 了解有关挂钩的详细信息

See:

* [与 GitHub Copilot CLI 一起使用挂钩](/zh/copilot/how-tos/copilot-cli/customize-copilot/use-hooks)
* [GitHub Copilot 挂钩参考](/zh/copilot/reference/hooks-reference)

## 子代理

### 什么是子代理？

**子代理**是会话中主代理执行的一项操作，其中主代理启动一个单独的 AI 代理以完成特定任务。

Copilot CLI 当主代理决定将工作块委派给单独的代理时，使用子代理是完成用户请求的最佳方式。

### 子代理可以解决什么问题？

子代理帮助 Copilot：

* 通过将一大堆工作卸载到单独的智能体，使 CLI 会话中主智能体的上下文窗口被聚焦。
* 根据需要，通过在后台运行某些任务来并行化工作。
* 让自定义代理独立于主代理运行，并采用与主代理不同的方法来执行专门的任务。

### 何时使用子代理？

Copilot 可能将子代理用于以下事项：

* 代码库浏览

  例如，列出 API 中的所有终结点。

* 复杂任务的命令执行

  例如，运行测试套件或生成大型项目并分析结果。

* 查看更改

  例如，查看暂存的更改并确定潜在的安全问题。

* 复杂的多步骤工作

  例如，通过多个更改实现功能。

* 来使用自定义智能体

  如果您已定义一个自定义代理，并且它符合推理资格（`infer` 未设置为 `false`），那么 Copilot 可能会选择通过启动一个配置为该自定义代理的子代理来委派任务。

## 自定义代理

### 什么是自定义代理？

**自定义代理** 提供有关 Copilot 特定主题的专家知识，并定义在该区域工作时应使用的特定方法 Copilot 。 可以将自定义代理视为在处理某些任务时可以采用的“角色”。Copilot

Copilot CLI 具有多个内置自定义代理。 例如，`explore`、`task`、`research`、`code-review`和`rubber-duck``general-purpose`代理。 还可以定义自己的自定义代理，以满足你的特定需求。

使用 YAML frontmatter 在 Markdown 文件中定义自定义代理。 该文件包含：

* 代理的角色和专业知识的说明
* 允许的工具列表（或所有工具）
* 可选 MCP 服务器连接
* 可选 `infer` 设置 - 启用后，当检测到与代理的特殊性匹配的任务时， Copilot 将自动委托给此代理。

### 自定义代理可以解决哪些问题？

定制代理可在需要时提供帮助：

* 在特定上下文中一致地应用专家知识。
* 为不同工作定义的工具的权限分配，均在自定义代理配置中规定。
* 为了使主代理的上下文窗口能够专注于主任务，自定义代理的上下文窗口用于其执行的专业工作。

### 何时应使用自定义代理？

如果需要，请使用自定义代理：

* 专业审阅者或助手

  示例：创建一个“react-reviewer”自定义代理，该代理侧重于涉及 React 模式的工作。

* 更安全的权限

  示例：一个只能 `view/grep/glob`（只读）以进行审核的自定义智能体。

* 可选自动委派

  示例：在自定义代理配置中设置 `infer: true` ， Copilot 以便在适当时自动使用此自定义代理。

### 何时不应使用自定义代理？

避免在以下情况下使用自定义代理：

* 你只需要指导性文本（**技能** 可以是更轻量的解决方案）。
* 不需要专用化，默认代理执行任务良好。

### 详细了解自定义代理

请参阅“[自定义代理配置](/zh/copilot/reference/custom-agents-configuration)”。

## 插件

### 什么是插件？

**插件**是一个可安装包，可将功能捆绑到 Copilot。 插件可以包含其他自定义功能的任意组合。 例如，技能、自定义代理、挂钩和 MCP 服务器配置。

Copilot包括插件管理命令（安装、更新、列出、卸载），并支持从市场或直接从GitHub存储库进行安装。

### 插件可以解决什么问题？

插件可帮助你：

* 轻松将一系列功能添加到Copilot，而无需手动配置每个组件。
* 打包和分发自定义配置（可能是技能、自定义代理、挂钩和 MCP 服务器的组合）到团队或公众。
* 更改可用功能，而无需手动将文件复制到目录中。

### 何时应使用插件？

在以下情况下使用插件：

* 你想要团队范围的捆绑包

  示例：公司范围的工程插件，其中包括：

  * 事件响应技能。
  * 代码评审的自定义代理。
  * 内部服务的 MCP 服务器。

* 你想要轻松安装和更新

  示例：最初安装插件，然后使用 `/plugin update PLUGIN-NAME` 定期更新。

### 何时不应使用插件？

避免使用插件在以下情况：

* 你在本地进行试验，不需要分发（使用本地技能、自定义说明或自定义代理）。
* 你只需一个小型的一次性工作流。 单个技能文件可能更简单。

## 综合考虑：选择合适的方案

| Requirement                         | 最佳选项 |
| ----------------------------------- | ---- |
| 我希望Copilot始终遵循我们的存储库约定。             |      |
| **自定义指令**                           |      |
| 我需要一个可重复的工作流，我可以按需调用。               |      |
| **技能**                              |      |
| 我希望 Copilot 在我的存储库中解答问题并执行工作。       |      |
| Copilot请求使用相应**工具**的权限              |      |
| 我希望围绕工具使用和会话事件进行防护、策略或自动化。          |      |
| **挂钩**                              |      |
| Copilot我需要能够使用外部服务提供的工具。            |      |
| **MCP 服务器**                         |      |
| 处理特定任务时，我想 Copilot 以具有受限工具集的专家身份运行。 |      |
| **自定义代理**                           |      |
| 我想Copilot代表我执行一个复杂的任务。              |      |
| Copilot 在适当情况下自动使用 **子代理** 。        |      |
| 我想在 Copilot CLI 上添加一个功能包，而不需要我手动配置。 |      |
| \*\*                                |      |
| \*\*插件                              |      |

## 延伸阅读

* [GitHub Copilot CLI](/zh/copilot/how-tos/copilot-cli)