目录

GitHub Copilot CLI 最佳实践

GitHub Copilot CLI 已经不是“在终端里问几句 shell 命令”的小工具。GitHub 官方现在把它定位成 terminal-native AI coding assistant:它可以读代码、写文件、跑命令、管理 PR、调用子 agent、接 MCP/LSP、进入 autopilot,并通过 GitHub.com 或 GitHub Mobile 远程跟进会话。

先明确它适合做什么

Copilot CLI 最适合处理仓库级任务,而不是替代 IDE 里的行内补全。

适合 CLI 的任务:

  • 理解陌生仓库或模块
  • 制定实现计划
  • 小到中等规模的跨文件修改
  • 补测试、跑测试、修 lint
  • 代码审查和 PR 修复
  • 自动生成报告、摘要、文档
  • 把明确任务委托给后台 agent

不适合 CLI 的任务:

  • 精确到一两行的即时编辑
  • 没有边界的“帮我重构整个系统”
  • 生产环境直接操作
  • 需要人工持续判断方向的探索
  • 你不愿意 review diff 的改动

把它当成“能操作终端的工程同事”,而不是“无需监督的自动开发者”,使用体验会稳定很多。

安装和认证:先更新旧认知

官方文档当前给出的安装前提是:

  • 有可用的 GitHub Copilot 订阅或计划
  • 如果由组织或企业提供 Copilot,管理员没有禁用 Copilot CLI policy
  • 使用 npm 安装时需要 Node.js 22 或更高版本
  • Windows 使用时需要 PowerShell v6 或更高版本

常见安装方式:

# npm,跨平台
npm install -g @github/copilot

# macOS / Linux
brew install copilot-cli

# Windows
winget install GitHub.Copilot

# macOS / Linux install script
curl -fsSL https://gh.io/copilot-install | bash

常用维护命令:

copilot login
copilot version
copilot update
copilot logout

第一次在仓库目录里启动时:

copilot

CLI 会要求你确认是否信任当前目录。这个提示不要当形式:在一次 CLI 会话中,Copilot 可能读取、修改并执行当前目录及其子目录里的文件。只在你信任的仓库里启动它。

第一件事:生成并维护自定义指令

Copilot CLI 支持多种 custom instructions。最实用的是仓库级指令:

copilot init

或在交互会话里:

/init

它会分析仓库并创建或更新 .github/copilot-instructions.md。这个文件应该记录 Copilot 很难从代码里稳定推断、但每次都应该遵守的信息。

建议写:

# Build and validation
- Run `pnpm test` after TypeScript logic changes.
- Run `pnpm lint` before finishing.
- Run `pnpm prisma generate` after schema changes.

# Constraints
- Do not change public API response shapes without approval.
- Do not add production dependencies unless requested.
- Do not push to remote branches unless explicitly asked.

# Patterns
- Follow `src/orders/validation.ts` for request validation.
- Follow `src/jobs/send-digest.ts` for background jobs.

官方支持的几类指令大致是:

文件 用途
.github/copilot-instructions.md 仓库级通用指令
.github/instructions/**/*.instructions.md 路径级或模块级指令
AGENTS.md agent 共享指令,可在仓库根目录、当前目录或 COPILOT_CUSTOM_INSTRUCTIONS_DIRS 指定目录中使用
~/.copilot/copilot-instructions.md 本机全局指令

经验上,指令文件不要写成公司制度汇编。写命令、边界、目录职责和参考模式;少写“保持高质量”“遵循最佳实践”这类空话。

权限控制:两层开关要分清

Copilot CLI 能执行 shell、读写文件、搜索代码、访问网页、调用 MCP 和启动子 agent。只读操作通常可以自动执行;会修改系统、写文件、访问 URL 或执行破坏性命令的操作需要授权。

权限控制分两层:

  1. 工具可见性:模型知不知道某类工具存在
  2. 工具授权:模型选择了工具后,能不能直接执行

限制工具集:

# 禁止 web search / web fetch
copilot --excluded-tools='web_fetch, web_search'

# 只允许常见本地代码工具
copilot --available-tools='bash,edit,view,grep,glob'

授权或禁止具体工具:

# 允许所有 git 命令,但禁止 push
copilot --allow-tool='shell(git:*)' --deny-tool='shell(git push)'

# 允许读文件,只允许写一个指令文件
copilot --allow-tool='read, write(.github/copilot-instructions.md)'

# 禁止写文件
copilot --deny-tool=write

重要规则:--deny-tool 优先于 --allow-tool,即使你开了 --allow-all

谨慎使用:

copilot --allow-all-tools
copilot --allow-all
copilot --yolo

官方明确建议:这些全开权限只应在隔离环境里使用,不要做成默认 alias。我的默认策略是:允许读和测试,允许本地 git 查看,禁止 git push,涉及联网、写敏感路径、删除文件、安装依赖时手动确认。

会话中途如果授权太多,可以重置:

/reset-allowed-tools

Prompt 要写成可执行任务

Copilot CLI 对清楚任务的响应明显更稳定。一个好 prompt 包含四块:

  • Goal:要完成什么
  • Context:相关文件、报错、issue、PR、参考实现
  • Constraints:不要改什么,必须遵守什么
  • Done when:测试、lint、diff、PR 状态或人工验收标准

弱 prompt:

fix checkout

更好的 prompt:

Goal:
Reduce duplicate payment validation in src/checkout/.

Context:
- Follow the pattern in src/orders/validation.ts.
- The failing test is checkout-expired-card.test.ts.

Constraints:
- Do not change public API response shapes.
- Do not add production dependencies.

Done when:
- Checkout unit tests pass.
- Final answer lists changed files and remaining risks.

这类结构化 prompt 的核心价值不是“礼貌”,而是减少模型猜测和后续审查成本。

Plan 模式:复杂任务默认先计划

官方最佳实践强调 Plan mode:先生成结构化实现计划,确认后再写代码。

进入方式:

/plan Add OAuth2 authentication with Google and GitHub providers

或在交互界面按 Shift+Tab 切换到 plan mode。计划会保存到当前 session 的 plan.md,你还可以按 Ctrl+Y 用默认 Markdown 编辑器修改计划。

适合先 Plan 的任务:

  • 新功能
  • 多文件重构
  • 数据库迁移
  • 权限、支付、鉴权、审计逻辑
  • CI/CD 或部署脚本改动
  • 你自己也还没完全想清楚的需求

推荐流程:

  1. Read the relevant files. Do not edit yet.
  2. /plan ...
  3. 审计划,指出遗漏和边界
  4. 批准后实现
  5. 跑测试和 lint
  6. /review 审 diff

不要把 Plan 模式当成形式。它真正有用的地方,是把“方向错了”的发现提前到写代码之前。

Autopilot:只交给边界清楚的任务

Autopilot 会让 Copilot 在给定初始指令后持续执行多步任务,直到任务完成、遇到阻塞、被你中止,或达到 --max-autopilot-continues 上限。

适合:

  • 按已确认计划实现
  • 补测试
  • 修 CI failure
  • 批量格式化和简单重构
  • 明确输入输出的脚本任务

不适合:

  • 开放式探索
  • 需求模糊的新功能
  • 需要你持续判断取舍的设计
  • 高风险生产操作

程序化调用时可以这样限制 runaway loop:

copilot --autopilot --max-autopilot-continues 10 \
  --allow-tool='shell(npm:*), shell(git:*), write' \
  --deny-tool='shell(git push)' \
  -p "Run the test suite, fix failures in src/auth/, and summarize the diff."

不要把 Autopilot 和 --allow-all 混为一谈。Autopilot 是“持续推进任务”的行为模式;--allow-all 是“权限全开”的安全选择。两者可以一起用,但风险也会叠加。

/fleet:只并行真正独立的工作

/fleet 会让主 agent 分析任务,把可拆分的部分交给并行子 agent,并由主 agent 协调依赖。

适合:

  • 给多个独立模块补测试
  • 并行审查不同目录
  • 多个互不依赖的文档更新
  • 多方案探索,然后人工选择

不适合:

  • 多个 agent 同时改同一批文件
  • 任务之间有强顺序依赖
  • 共享抽象还没定,就让多个子任务依赖它

示例:

/fleet Write unit tests for src/users, src/orders, and src/payments.
Each subtask owns only its directory. Do not edit shared test helpers.
Run the relevant test command for each module and summarize failures.

使用 /fleet 的关键是写清“谁拥有哪个目录”和“哪些文件不能碰”。否则并行会把速度优势变成合并成本。

/review 和 /pr:把审查接进日常流

Copilot CLI 内置 code-review agent,可以用 /review 审查当前分支或指定 diff:

/review the changes on this branch compared to main.
Focus on correctness, security, regression risk, and missing tests.
Do not comment on style unless it hides a bug.

PR 工作流可以用:

/pr
/pr create
/pr fix feedback
/pr fix conflicts
/pr fix ci
/pr auto

官方文档说明 /pr fix feedback/pr fix conflicts/pr fix ci/pr auto 可能提交并 push,因此仍应让权限策略保留最后确认。

我的建议:

  • 本地先 /review
  • CI 后再 /pr fix ci
  • git push 保持手动确认
  • 对自动修改的 review feedback 再看一次 diff

MCP、LSP、Skills:只接能提高命中率的工具

Copilot CLI 支持多种扩展能力,但不要一上来全装。

MCP:接外部工具和上下文

MCP 可以给 CLI 接外部工具、数据源和服务。GitHub MCP server 已经内置;其他 MCP 可以用 /mcp add 或配置文件添加。

适合接 MCP 的场景:

  • issue/PR/CI 状态在 GitHub
  • 需求在 Linear/Jira
  • 运行环境信息在内部服务
  • 文档在外部知识库
  • 需要真实调用工具,而不是复制一段文本

判断标准:这个上下文是否经常变、是否会重复使用、是否比粘贴到 prompt 更可靠。

LSP:让重构和跳转更准

LSP server 能给 CLI 提供定义跳转、引用查找、hover、rename、document symbols、workspace symbols 等结构化能力。对于大型 TypeScript、Go、Python、Java 项目,它比纯文本搜索更稳。

如果你经常让 Copilot CLI 做跨文件重命名、查引用、理解类型关系,优先配置 LSP。

Skills 和 custom agents

Skills 适合沉淀重复方法,比如:

  • PR review checklist
  • release notes 草稿
  • migration plan
  • incident summary
  • dependency upgrade review

Custom agents 适合明确角色,比如 test-writer、security-reviewer、docs-maintainer。不要为每个临时偏好都做 agent;先把稳定流程写进指令文件,重复三次以上再技能化。

模型选择:不要写死旧列表

GitHub Copilot 支持的模型变化很快。官方模型页会按 client 和 plan 列出可用模型;Auto model selection 也会随策略、区域、企业限制和 model policy 调整。

实践建议:

  • 默认用 Auto 或当前 CLI 默认模型
  • 复杂重构、调试、架构判断再手动切更强模型
  • 快速搜索、摘要、简单文档用轻量模型
  • 在脚本和 CI 里显式设置 --model,保证输出稳定
  • /model 查看当前可选模型和 premium request multiplier

如果要接自有模型供应商,官方 BYOK 文档要求模型支持 tool calling/function calling 和 streaming;最佳效果建议至少 128k context window。配置通过 COPILOT_PROVIDER_BASE_URLCOPILOT_PROVIDER_TYPECOPILOT_PROVIDER_API_KEYCOPILOT_MODEL 这类环境变量完成。

注意安全规则:文章和仓库里只写变量名,不写真实 key。

Rubber Duck:实验性的第二意见

GitHub Blog 在 2026-04-06 介绍了 Copilot CLI 的 Rubber Duck 实验功能。它会用另一个模型家族作为独立 reviewer,在高价值节点批评主 agent 的计划、实现或测试。

适合使用:

  • 复杂重构
  • 高风险架构改动
  • 测试覆盖是否充分
  • 你怀疑当前方案有盲点

使用前提:

  • 这是 experimental mode
  • 需要在 CLI 内使用 /experimental
  • 当前 GitHub 描述中,Claude family orchestrator 可搭配 GPT-5.4 作为 Rubber Duck;实际可用性仍受模型访问权限影响

它不是魔法。Rubber Duck 的价值是增加一个不同视角,不能替代测试、CI 和人工 review。

非交互式和 GitHub Actions

Copilot CLI 可以直接用 -p 或管道运行,不进入交互界面:

copilot -p "Explain this file: ./complex.ts"

echo "Explain this file: ./complex.ts" | copilot

脚本里常用参数:

参数 用途
-p, --prompt 直接传入 prompt
-s, --silent 输出更干净,便于脚本捕获
--no-ask-user 禁止交互式追问
--model 固定模型
--allow-tool 最小授权
--allow-url 最小 URL 访问授权
--output-format=json 输出 JSONL

示例:

copilot -p '/review the changes on this branch compared to main. Focus on bugs and security issues.' \
  -s --allow-tool='shell(git:*)'

GitHub Actions 中可以安装 CLI、设置 COPILOT_GITHUB_TOKEN,再用 copilot -p ... 执行。官方示例使用带 “Copilot Requests” 权限的 fine-grained PAT 存为 Actions secret。

自动化任务要更保守:

  • prompt 要精确
  • 权限要最小
  • 加 timeout
  • 输出写到 artifact 或 step summary
  • 不要让模糊 prompt 自动改代码并 push

远程会话:适合长任务监控

Remote access 允许你从 GitHub.com 或 GitHub Mobile 查看并控制正在本机运行的 CLI 会话,适合长任务中途离开电脑时监控进度、回应追问或批准权限请求。

常用方式:

/remote

或启动时:

copilot --remote

注意它目前是 public preview。官方还说明:会话必须仍在本机终端里运行,机器要在线,工作目录要是 GitHub.com 上的 Git 仓库。长任务最好配合 /keep-alive,避免机器睡眠。

一个稳定的日常工作流

我建议把 Copilot CLI 用成这套节奏:

  1. copilot init 生成并维护仓库指令。
  2. 为当前任务写清目标、上下文、约束和完成条件。
  3. 复杂任务先 /plan,不要直接开改。
  4. 确认计划后再实现,必要时切 Autopilot。
  5. 可并行任务才用 /fleet
  6. 完成后跑测试、lint、type check。
  7. /review 做第一轮审查。
  8. /pr 管理 PR,但对 commit/push 保持确认。
  9. 重复出现的问题写回 .github/copilot-instructions.mdAGENTS.md 或 skill。

常见反模式

反模式 1:默认 yolo

copilot --yolo 做成 alias 是高风险行为。它让 Copilot 在每个仓库里默认拥有过大权限。

反模式 2:没有指令文件

每次 prompt 里重复解释构建命令、lint 命令、commit 规范,就是应该写进 .github/copilot-instructions.md 的信号。

反模式 3:模糊任务进 Autopilot

Autopilot 适合执行清楚计划,不适合帮你发现需求本身。

反模式 4:并行修改同一块代码

/fleet 的前提是任务之间写入范围独立。否则最后会变成合并和回滚成本。

反模式 5:脚本里全开权限

CI 里应使用 --no-ask-user 和最小 --allow-tool,而不是为了省事直接 --allow-all

反模式 6:把模型列表写死

模型可用性和计费会变。文章、文档和团队规范里应该写选择原则,而不是把某个时间点的完整列表当永久事实。

结论

Copilot CLI 的核心价值不是“问命令”,而是把终端、GitHub、仓库上下文、子 agent、MCP/LSP、代码审查和自动化连成一个可监督的 agent workflow。

最有效的用法也不是追求最大权限或最长自主执行,而是:

  • 用指令文件沉淀团队规则
  • 用 Plan mode 降低方向错误
  • 用最小权限控制风险
  • 用 LSP/MCP 提升上下文质量
  • /review 和测试闭环验收结果
  • 只把边界清楚的任务交给 Autopilot 或 /fleet

这样用,Copilot CLI 才会从“很会猜的终端聊天工具”,变成真正能接进日常工程流的 coding agent。

参考资源