Skip to main content

比较 GitHub Copilot CLI 自定义功能

了解自定义 Copilot 的各种方法,它们的作用以及何时使用它们。

谁可以使用此功能?

GitHub Copilot 命令行界面 与所有 Copilot 计划兼容。 如果从组织收到 Copilot,则必须在组织的“Settings”中启用 Copilot 命令行界面(CLI) 策略。

介绍

Copilot 命令行界面(CLI) 是一款基于终端的 AI 智能体,可以代表你回答问题、计划工作和完成任务。 它设计为高度可扩展,可通过多种方式自定义其行为并扩展其功能。

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

  •         **自定义指令**
    

    这些说明告诉 Copilot 其一般行为方式。 例如,为了确保 Copilot 编写的任何代码均符合编码标准。 了解详细信息

  •         **技能**
    

    这些技能告诉 Copilot 如何处理特定类型的任务。 例如,在处理特定类型的任务时使用特定工具。 了解详细信息

  •         **工具**
    

    这些 提供能力。 例如,用于查找和修改文件,或者用于与 GitHub部分进行交互。 了解详细信息

  •         **MCP 服务器**
    

    这些服务器会添加工具集合以允许 Copilot 与外部服务交互。 了解详细信息

  •         **挂钩**
    

    通过这些方法,可以在 特定的生命周期时刻运行自己的逻辑。 例如,每次 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 中保留更改日志条目,提交之前运行 pnpm test。”

  • 通信首选项

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

何时不应使用自定义说明?

当应避免或尽量减少时:

  • 你只需要一个工作流中的行为(改用 技能 )。
  • 这些指令非常详细/具体,会分散 Copilot 执行即时任务的注意力(最好使用技能自定义智能体)。

详细了解自定义说明

请参阅“为GitHub Copilot 命令行界面添加自定义指令”。

Skills

什么是技能?

技能至少是一个 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 工具。

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

请参阅“关于 GitHub Copilot CLI”。

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)”。

挂钩

什么是挂钩?

          **挂钩**允许你指定 Copilot 命令行界面(CLI) 将在会话生命周期的特定点执行你定义的 Shell 命令。
挂钩运行时
preToolUse / postToolUse工具运行之前/之后。
userPromptSubmitted当用户提交提示时。
sessionStart / sessionEnd在会话的开始/结束时。
errorOccurred发生错误时。
agentStop当主代理停止而不出错时。
subagentStop在子代理完成时。

挂钩可以解决什么问题?

当你希望为 Copilot 命令行界面(CLI) 的行为提供可编程控制或可观测性时,挂钩会有所帮助,例如:

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

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

何时应使用钩子?

如果需要,请使用挂钩:

  •         **工具防护措施**
    
    • 示例:在运行之前 bash ,要求特定命令与允许列表匹配。
    • 示例:在 edit 运行之前,除非存在票证 ID,否则阻止 infra/ 下面的更改。
  •         **会话生命周期自动化**
    
    • 示例:代理停止时,将会话的脚本存档到存储位置。
  •         **错误处理策略**
    
    • 示例:在遇到速率限制错误时,自动选择“重试”,并设定重试次数的上限。
  •         **子代理工作流控件**
    
    • 示例:子代理完成后,在将结果传递回主代理之前验证其输出。

何时不应使用挂钩?

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

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

了解有关挂钩的详细信息

请参阅“将钩子与 GitHub Copilot 命令行界面 配合使用”。

子代理

什么是子代理?

子智能体是 Copilot 命令行界面(CLI) 会话的主智能体为执行一项特定工作而启动的独立 AI 智能体。

当主智能体认为将一大堆工作委托给单独的智能体是完成用户请求的最佳方式时,Copilot 命令行界面(CLI) 就会使用子智能体。

子代理可以解决什么问题?

子智能体可帮助 Copilot:

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

何时使用子代理?

Copilot 可能会对以下项使用子代理:

  • 代码库浏览

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

  • 复杂任务的命令执行

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

  • 查看更改

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

  • 复杂的多步骤工作

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

  • 来使用自定义智能体

    如果你已定义自定义智能体并且它适合进行推理(infer 未设置为 false),则 Copilot 可以选择使用自定义智能体配置启动子智能体,以将工作委派给该自定义智能体。

自定义智能体

什么是自定义代理?

          **自定义智能体**是一种可以向 Copilot 提供有关特定主题的专家知识的方法,并且可以确定在该领域工作时希望 Copilot 使用的特定方法。 你可以将自定义智能体视为 Copilot 在处理某些任务时可以采用的“角色”。

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

  • 代理的角色和专业知识的说明
  • 允许的工具列表(或所有工具)
  • 可选 MCP 服务器连接
  • 可选的 infer 设置 - 启用此设置后,Copilot 在检测到与智能体专长匹配的任务时,会自动将任务委派给该智能体。

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

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

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

何时应使用自定义代理?

如果需要,请使用自定义代理:

  • 专业审阅者或助手

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

  • 更安全的权限

    示例:一个只能 view/grep/glob(只读)以进行审核的自定义智能体。

  • 可选自动委派

    示例:在自定义智能体配置中设置 infer: true,以便 Copilot 可在适当时自动使用此自定义智能体。

何时不应使用自定义代理?

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

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

详细了解自定义代理

请参阅“自定义代理配置”。

插件

什么是插件?

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

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

插件可以解决什么问题?

插件可帮助你:

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

何时应使用插件?

在以下情况下使用插件:

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

    示例:公司范围的工程插件,其中包括:

    • 事件响应技能。
    • 代码评审的自定义代理。
    • 内部服务的 MCP 服务器。
  • 你想要轻松安装和更新

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

何时不应使用插件?

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

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

综合考虑:选择合适的方案

Requirement最佳选项
我希望 Copilot 始终遵循存储库约定。
          **自定义指令** |

| 我需要一个可重复的工作流,我可以按需调用。 | 技能 | | 我希望 Copilot 能在我的存储库中回答问题并执行工作。 | Copilot 会请求使用相应工具的权限 | | 我希望围绕工具使用和会话事件进行防护、策略或自动化。 | 钩子 | | 我需要 Copilot 以便能够使用外部服务提供的工具。 | MCP 服务器 | | 处理特定任务时,我希望 Copilot 以专家身份使用受限工具集运行。 | 自定义代理 | | 我希望 Copilot 为我执行复杂任务。 | Copilot 在适当时自动使用 子代理。 | | 我希望向 Copilot 命令行界面(CLI) 添加一个功能包,而不自己手动配置它。 | ** **插件 |