简介
Copilot CLI 是一个基于终端的 AI 代理,可以代您回答问题、规划工作并完成任务。它设计为高度可扩展,您可以通过多种方式自定义其行为并扩展其功能。
本文解释了以下内容之间的区别
-
自定义指令
这些指示 Copilot 一般如何行为。例如,确保 Copilot 编写的任何代码符合您的编码标准。了解更多。
-
技能
这些指示 Copilot 如何处理特定类型的任务。例如,在处理特定类型的任务时使用特定工具。了解更多。
-
工具
这些 提供能力。例如,用于查找和修改文件,或与 GitHub 的某些部分交互。了解更多。
-
MCP 服务器
这些 添加工具集合,使 Copilot 能够与外部服务交互。了解更多。
-
Hook
这些让您在 特定生命周期时刻运行自己的逻辑。例如,您可以在每次 CLI 会话开始或结束时运行特定脚本。了解更多。
-
子代理
这些是 委派的代理进程,与主代理关联,用于在与主代理进程分离的情况下执行特定任务。它们拥有自己的上下文窗口,可在不影响主代理上下文的情况下填充。了解更多。
-
自定义代理
这些是 专门能力的定义,旨在执行特定任务。主 CLI 代理可以使用自定义代理配置将任务委派给子代理,以在任务中应用专门知识和特定方法。例如,自定义代理可以担任 React 评审员、文档编写者、安全审计员或测试生成器的角色。了解更多。
-
插件
这些是 软件包,可以交付预配置的自定义功能,如技能、钩子、自定义代理和 MCP 服务器。了解更多。
自定义指令
什么是自定义指令?
自定义指令是持久化的指导信息,Copilot CLI 在会话开始时从指令文件中加载。
Copilot 会在仓库的多个默认位置查找并加载指令文件,例如 AGENTS.md 和 .github/copilot-instructions.md,或从主目录的 $HOME/.copilot/copilot-instructions.md 加载。
您可以使用 --no-custom-instructions 标志来跳过加载这些指令。
自定义指令解决了什么问题?
自定义指令帮助您
- 让 Copilot 与您的编码约定和偏好保持一致。
- 一致地应用团队或组织的标准。
- 避免在每个提示中一次又一次地向 Copilot 包含重复的提醒。
何时应使用自定义指令?
使用自定义指令来处理
-
风格和质量规则
示例:“倾向于小的 PR,编写测试,且在未讨论的情况下避免更改公共 API”。
-
仓库约定
示例:“使用
pnpm,在CHANGELOG.md中保留 changelog 条目,提交前运行pnpm test”。 -
沟通偏好
示例:“简要说明权衡,然后提供推荐的选择”。
何时不应使用自定义指令?
在以下情况下请避免或保持最小化
- 您只想在单个工作流中使用该行为(请改用 技能)。
- 您的指令过大/过于具体,以至于分散 Copilot 对当前任务的注意力(请改用 技能 或 自定义代理)。
了解更多关于自定义指令
参见 为 GitHub Copilot CLI 添加自定义指令。
技能
什么是技能?
技能最基本的形式是一个 Markdown 文件,里面包含 Copilot 可在特定上下文中执行任务的指令。名称和技能描述让 Copilot 判断是否应在给定任务中使用该技能。如果决定使用,它会加载指令并遵循它们完成任务。
技能可以可选地引用存放在技能目录中的其他文件。这些文件可以包括在使用技能时 Copilot 能运行的脚本。
技能解决了什么问题?
技能帮助您
- 标准化 Copilot 在特定上下文中执行任务的方式(例如,进行代码审查时)。
- 提供 “按需” 指令,而无需永久更改 Copilot 的行为。
- 避免用与当前任务无关的指令填满 Copilot 的上下文窗口。
如何访问技能?
您可以使用斜杠命令手动调用技能。例如,/Markdown-Checker check README.md。使用 /skills list 列出可用技能。
Copilot CLI 会在检测到与当前任务相关的技能时自动调用它们。
何时应使用技能?
在需要以下情况时使用技能
-
可重复使用的一组指令或功能,以供某类任务使用。
示例:在前端代码更改时检查面向用户的文档是否同步更新的文档检查技能。
-
一致的输出格式。
示例:确保 Copilot 使用模板创建发布说明的 “发布说明草稿” 技能。
-
偶尔需要但并非始终需要的工作流。
示例:仅在迁移期间启用的 “深度重构” 技能。
何时不应使用技能?
在以下情况下避免使用技能
- 指导应 适用于您所做的一切(请改用 自定义指令)。
- 您需要新功能(可能需要 MCP 服务器 来添加工具,或 自定义代理 来实现专门化)。
了解更多关于代理技能
参见 关于代理技能。
工具
什么是工具?
工具是 Copilot 用来完成某件事的能力——例如搜索文件、查看文件内容、编辑、运行任务或调用技能。部分工具是内置的,其他工具可以通过 MCP 服务器添加。
工具解决了什么问题?
工具让 CLI 能够
- 收集准确的上下文(使用读取/搜索工具)。
- 安全地进行更改(使用编辑工具)。
- 执行命令并验证结果(可能使用子代理)。
何时应使用工具?
通常无需直接调用工具——Copilot 会根据需要自行决定使用工具。您可以在特定任务、当前会话或所有 Copilot CLI 会话中允许或拒绝使用工具。
当您看到 Copilot 使用工具时,表示您
- 请求 Copilot 在仓库中搜索某些内容、更新文件或运行测试。
- 调用技能——这会触发
skill工具。 - 让 Copilot 执行需要 MCP 服务器提供的工具的任务。
- 指示 Copilot 完成复杂任务,而它决定委派给子代理——这会触发
task工具。
了解更多关于允许或拒绝工具
MCP 服务器
什么是 MCP 服务器?
MCP 服务器是一项服务,允许 AI 应用(如 Copilot CLI)连接到外部数据源和工具。
将 MCP 服务器添加到 Copilot CLI 可提供额外能力,使您能够使用该 MCP 服务器提供的工具。例如,您可以添加一个能够与在线日历应用或支持工单系统交互的 MCP 服务器。
MCP 服务器解决了什么问题?
MCP 服务器在内置工具不足时提供帮助。它们可以
- 将 Copilot CLI 连接到外部系统。
- 添加专用工具(例如,用于 API、数据库或图像生成的工具)。
- 为非仓库资源标准化安全访问模式。
何时应使用 MCP 服务器?
在需要以下情况时使用 MCP 服务器
-
与外部数据或系统的集成。
示例:
本月有多少个针对产品 X 的支持工单被打开? -
您希望 CLI 代表您执行的特定领域操作。
示例:
向 bug-watch 频道发送信息:本月仅有 2 条针对产品 X 的支持工单。
何时不应使用 MCP 服务器?
在以下情况下避免添加 MCP 服务器
- 内置工具已能满足您的需求。
了解更多关于 MCP 服务器
参见 关于模型上下文协议 (MCP)。
钩子
什么是钩子?
钩子允许您指定在会话生命周期的特定点,Copilot CLI 将执行您定义的 shell 命令。
| 钩子 | 何时运行 |
|---|---|
preToolUse / postToolUse | 工具运行前/后。 |
userPromptSubmitted | 用户提交提示时。 |
sessionStart / sessionEnd | 会话开始/结束时。 |
errorOccurred | 发生错误时。 |
agentStop | 主代理在无错误情况下停止时。 |
subagentStop | 子代理完成时。 |
钩子解决了什么问题?
钩子在您希望对 Copilot CLI 行为进行 可编程控制或可观测性 时很有帮助,例如
- 强制执行防护栏——在某些工具运行前阻止或警告。
- 添加日志/遥测。
- 在可恢复错误上自定义重试/中止行为。
- 添加“策略”检查——例如,防止对受保护路径进行编辑。
- 拦截子代理完成的时刻——在结果返回给父代理之前。
当您需要的控制超过技能或自定义指令能提供的范围时,钩子非常有用。技能和指令通过提示引导 Copilot 的行为,而钩子确保您定义的操作在特定时刻执行,例如阻止工具运行或在会话结束时记录活动。
何时应使用钩子?
在需要以下情况时使用钩子
-
工具防护栏
- 示例:在
bash运行前,要求特定命令匹配白名单。 - 示例:在
edit运行前,除非提供工单 ID,否则阻止对infra/下的更改。
- 示例:在
-
会话生命周期自动化
- 示例:当代理停止时,将会话记录归档到存储位置。
-
错误处理策略
- 示例:在速率限制错误时,自动选择 “重试”,并限制重试次数。
-
子代理工作流控制
- 示例:子代理完成后,在将结果返回给主代理前验证其输出。
何时不应使用钩子?
在以下情况下避免使用钩子
- 您只需要一致的提示或工作流指令(使用 技能)。
- 您想要持久的偏好和标准(使用 自定义指令)。
- 您需要新的外部能力(使用 MCP 服务器 和工具)。
- 维护可能影响每个会话的配置对您来说可能成问题。
了解更多关于钩子
子代理
什么是子代理?
子代理是由 Copilot CLI 会话的主代理启动的、用于执行特定工作片段的独立 AI 代理的执行实例。
当主代理认为将工作块委派给单独的代理是完成用户请求的最佳方式时,Copilot CLI 会使用子代理。
子代理解决了什么问题?
子代理帮助 Copilot
- 通过将工作块卸载到独立代理,保持 CLI 会话中主代理的上下文窗口专注。
- 在必要时并行化工作,通过在后台运行某些任务。
- 将自定义代理与主代理分离执行,以不同的方法完成专门工作。
何时使用子代理?
Copilot 可能在以下情况下使用子代理
-
代码库探索
示例:列出 API 中的所有端点。
-
复杂任务的命令执行
示例:运行测试套件,或构建大型项目并分析结果。
-
审查更改
示例:审查已暂存的更改并识别潜在的安全问题。
-
复杂的多步工作
示例:实现包含多个更改的功能。
-
用于自定义代理的情况
如果您已定义自定义代理且其符合推理条件(
infer未设置为false),Copilot 可能会选择通过启动带有该自定义代理配置的子代理来将工作委派给它。
自定义代理
什么是自定义代理?
自定义代理为 Copilot 提供特定主题的专门知识,并定义 Copilot 在该领域工作时应采用的特定方法。您可以将自定义代理视为 Copilot 在处理某些任务时可以采用的 “角色”。
Copilot CLI 内置了多个自定义代理,例如 explore、task、research、code-review 与 general-purpose 代理。您也可以自行定义自定义代理,以满足特定需求。
您在包含 YAML 前置块的 Markdown 文件中定义自定义代理。该文件包含
- 代理角色和专长的描述
- 允许使用的工具列表(或全部工具)
- 可选的 MCP 服务器连接
- 可选的
infer设置——启用后,Copilot 会在检测到匹配该代理专长的任务时自动委派给此代理。
自定义代理解决了什么问题?
当您需要以下情况时,自定义代理非常有帮助
- 在特定上下文中一致地应用专门知识。
- 为不同工作定义不同的工具权限,如自定义代理配置中所示。
- 让主代理的上下文窗口专注于主要任务,而自定义代理拥有自己的上下文窗口用于其专门工作。
何时应使用自定义代理?
在需要以下情况时使用自定义代理
-
专门的审阅员或助手
示例:创建一个专注于 React 模式的 “react-reviewer” 自定义代理。
-
更安全的权限
示例:只能
view/grep/glob(只读)用于审计的自定义代理。 -
可选的自动委派
示例:在自定义代理配置中设置
infer: true,使 Copilot 在合适时自动使用该代理。
何时不应使用自定义代理?
在以下情况下避免使用自定义代理
- 您只需要指导文本(技能 可以是更轻量的解决方案)。
- 您不需要专门化,默认代理已能很好地完成任务。
了解更多关于自定义代理
参见 自定义代理配置。
Plugins
什么是插件?
插件是可安装的软件包,能够为 Copilot 提供功能捆绑。插件可以包含其他自定义功能的任意组合,例如技能、自定义代理、钩子以及 MCP 服务器配置。
Copilot 包含插件管理命令(install、update、list、uninstall),并支持从 Marketplace 或直接从 GitHub 仓库安装。
插件解决了什么问题?
插件帮助您
- 无需手动配置每个组件,即可轻松为 Copilot 添加功能捆绑。
- 将自定义配置(可能是技能、自定义代理、钩子和 MCP 服务器的组合)打包并分发给团队或公开。
- 在不需要手动复制文件到目录的情况下改变可用功能。
何时应使用插件?
在以下情况下使用插件
-
您想要全团队统一的功能捆绑
示例:包含以下内容的公司范围工程插件
- 用于事故响应的技能。
- 用于代码审查的自定义代理。
- 用于内部服务的 MCP 服务器。
-
您希望简易的安装和更新
示例:首次安装插件后,可使用
/plugin update PLUGIN-NAME定期更新。
何时不应使用插件?
在以下情况下避免使用插件
- 您在本地进行实验且不需要分发(使用本地技能、自定义指令或自定义代理)。
- 您只需要一个小的一次性工作流。单个技能文件可能更简单。
综合使用:选择正确的选项
| 需求 | 最佳选项 |
|---|---|
| 我希望 Copilot 始终遵循我们的仓库约定。 | 自定义指令 |
| 我希望有一个可按需调用的可重复工作流。 | 技能 |
| 我希望 Copilot 在我的仓库中回答问题并执行工作。 | Copilot 请求使用相应的 工具 的权限。 |
| 我需要在工具使用和会话事件周围设置防护栏、策略或自动化。 | Hook |
| 我需要 Copilot 能使用外部服务提供的工具。 | MCP 服务器 |
| 在处理特定任务时,我希望 Copilot 以受限工具集的专家身份工作。 | 自定义代理 |
| 我希望 Copilot 代表我完成复杂任务。 | Copilot 在适当时会自动使用 子代理。 |
| 我想向 Copilot CLI 添加功能包,而无需手动自行配置。 | 插件 |