第 5 篇 大師 · 第 14 章
多代理、平行工作流與委派協作
前面幾章你學的是怎麼「一對一」帶 Copilot CLI 做事;這一章要教你怎麼當「工頭」——手上不是一個助手,是一整組隨傳隨到的專職班底,你只負責分工、審核、決定哪些活外包出去,其餘的交給它們自己協調。
篇導讀(第 5 篇 大師)
適合對象——已經會用 -p 跑非互動任務(第 10 章)、懂三種工作模式與核可機制(第 7 章)、讀過 Skills/Custom Agents/Hooks 的基礎全貌(第 12 章)、也知道怎麼寫一份 .agent.md(第 13 章)的你,準備把「單線作戰」升級成「一整條會自己跑的生產線」。
閱讀方式——本章刻意不重抄前面章節已經講過的基礎(三種模式、.agent.md 完整欄位表、Hooks 七八個常見事件),只補「怎麼把它們接成多代理平行編排」這一層。前面章節沒讀過的地方,本章會用連結標出去,建議先補讀再回來。
本篇做完你會——分清楚 Copilot CLI 內建的四個專職 subagent 跟自訂 agent 怎麼互相委派、學會用 /fleet 平行拆解任務、懂遞迴保險絲怎麼防指數爆炸、把 Hooks 的完整 14 個生命週期事件摸熟、清楚「本機平行」跟「委派雲端」是兩種完全不同的執行環境,最後老實看一次多代理系統的安全風險。
涵蓋哪幾章——第 13 章(進階 prompt 工程與指示檔案心法)、第 14 章(本章,多代理、平行工作流與委派協作)、第 15 章(MCP 深度整合、效能與成本調校)。
打個比方:前面的章節教你怎麼跟一位很能幹的工程師講清楚一件事、怎麼給他留一本工作守則。這一章開始,你會發現這位工程師其實從來不是一個人——他背後隨時候著一組專職班底:一個專門讀程式碼、一個專門跑測試、一個專門排計畫、一個專門審 code。你不需要每次都自己去分派這幾位,主管(也就是你正在對話的那個 Copilot)會自己判斷什麼時候該叫誰。而當任務夠大、能拆成好幾塊互不相干的子工作,你甚至可以喊一句 /fleet,讓主管自己當協調者,把活分給好幾個分身同時做;如果任務乾脆整個大到你想直接丟出去、不佔你自己電腦資源,還能一句話委派給雲端的另一個完全獨立產品線。
「Work performed by a custom agent is carried out using a subagent, which is a temporary agent spun up to complete the task.」
(自訂 agent 的實際工作是透過 subagent 完成的——subagent 是為了完成任務而臨時生出來的代理。)
這句官方逐字,是整章的地基:custom agent 是「定義」,subagent 是「執行實體」,關係像「類別」跟「實例」。搞懂這一句,後面 14.2、14.3 兩節會清楚很多。
版本漂移提醒
GitHub Copilot CLI 幾乎每天一個版號(本章查證當下穩定版 1.0.71,2026-07-16 發布;搶先版 1.0.72-1 隔天就出)。多代理與 /fleet 是相對新的功能,旗標名稱、預設值都可能在你讀到這裡時已經調整。本章標 [待確認] 或標明來源是社群整理的地方,動手前一律以 copilot --help、/settings、/agent,或官方文件最新頁為準,不要照抄寫死。
14.1 先建立心智地圖:Copilot 的四種「分身」
(料源:community/practice——下面「四種類型」是研究者整理的分類架構,不是 GitHub 官方逐字給出的分類名詞;但每一格描述的行為,都各自有官方文件可以個別佐證,可以放心借用這個架構理解,只是別寫成「官方稱之為」。)
多代理讀起來容易被術語繞暈,先用一張表把「Copilot CLI 到底能開出幾種分身」釘住:
| 類型 | 執行位置 | 特性 |
|---|---|---|
| Local(互動 session) | 你的終端機前景 | 一般用法,你打字它回應,就是第 4 章、第 7 章教的那個 Copilot |
| Background(本機背景委派) | 本機,但脫離目前的互動 session | 可平行開多個、能撐過終端機重啟 |
| Cloud(Copilot coding agent) | GitHub 雲端(跟 Copilot CLI 本體是不同產品線,但可互相委派) | & 前綴或 /delegate 觸發,建分支、開 draft PR,完全在雲端跑,不佔本機資源(14.9) |
| Sub-agent | 單一 session 內部 | 臨時生成、有獨立 context window、做完就收掉(14.2、14.3、14.4) |
本章重點放在後面兩種:Sub-agent(怎麼觸發、怎麼平行編排)跟 Cloud(怎麼委派、跟本機平行有什麼本質差異)。
14.2 內建四個專職 subagent:Explore/Task/Plan/Code-review
(料源:official,來源:GitHub Copilot CLI: Enhanced agents, context management, and new ways to install)
Copilot CLI 內建四個專職角色,不用你自己定義:
| Agent | 官方定位 |
|---|---|
| Explore | 快速程式碼分析,可單獨問問題不佔用主 context |
| Task | 跑測試、build 等指令,成功給簡短摘要,失敗給完整輸出 |
| Plan | 分析依賴與結構,產出實作計畫 |
| Code-review | 高訊噪比審查改動,只浮現真正的問題 |
觸發方式有兩種:
- 自動委派——你問「這段程式在幹嘛」,Copilot 自動叫 Explore;你要求跑測試,自動叫 Task。你完全不用點名。
- 手動指定——用
/agent指令手動挑一個角色。
多個 agent 可以平行跑,不需要你一個一個排隊等。
小技巧
這四個內建角色不用寫任何設定檔,開箱即用——跟 14.3 要講的「自訂 agent」不一樣,自訂 agent 得先寫一份 .agent.md(第 13 章已經教過完整欄位表)。先摸熟這四個免設定的內建角色,再決定要不要投資寫自訂 agent。
14.3 委派自訂 agent 成 subagent 的四種方式
(料源:official)
第 13 章教過 .agent.md 的完整 frontmatter 欄位(description 必填、tools/model/disable-model-invocation 等選填)。寫好一份自訂 agent 之後,官方給了四種讓它被實際「叫起來執行」的方式:
/agent互動選單挑選——打開選單直接選。-
明確指令:
Use the security-auditor agent on all files in the /src/app directory - 推論觸發——你描述的內容符合 agent profile 裡定義的觸發詞(例如你自訂的 "seccheck" 這類關鍵字),Copilot 自動叫用,不用你明講 agent 名字。這一步能不能發生,取決於
.agent.md裡disable-model-invocation有沒有被設成true(第 13 章提過這個欄位,預設false=允許自動推論)。 -
程式化:
適合寫進腳本,跳過互動介面直接指定要用哪個自訂 agent 執行單一任務。
copilot --agent security-auditor --prompt "Check /src/app/validator.go"
補充資訊
四種方式的共通點:不管你怎麼觸發,實際跑起來的都是一個臨時生成的 subagent(本章開頭那句官方逐字引用)——.agent.md 只是範本,subagent 才是那個真正動手做事、做完就收掉的執行單元。
14.4 /fleet:平行編排的核心指令
(料源:official,來源:Fleet mode、Run multiple agents at once with fleet in Copilot CLI)
第 7 章已經點過 /fleet 這個名字,說它是「Copilot CLI 自己的多代理輕量版本」,這一節把完整玩法攤開。
觸發方式
- 互動輸入
/fleet。 - 或者先走 Plan 模式,計畫產出後選「Accept plan and build on autopilot + /fleet」——這個選項等於把 14.6 的 Autopilot、本節的 Fleet 三合一啟動。
/fleet 把這個大重構拆成幾個獨立子任務平行跑
運作原理
主 agent 收到 prompt 後先判斷能不能拆成獨立小任務。能拆,它就自己當協調者(orchestrator)——官方逐字:「managing the workflow and dependencies between the subtasks」(管理子任務之間的工作流程與依賴關係)——把可平行的部分分給多個 subagent,「run the subagents in parallel, allowing the whole task to be completed more quickly」(讓 subagent 平行跑,整個任務因此完成得更快)。
模型選擇:subagent 預設用低成本模型跑,但你可以指定特定模型、或指名一個自訂 agent(例如 @test-writer)去執行特定子任務。
各 subagent 有獨立 context window——彼此看不到對方在做什麼,除非協調者主動彙整結果回報給你。
官方誠實給的限制(很重要,別無腦每次都上 /fleet)
「If your request is inherently sequential, using the /fleet slash command mode may not provide any benefit.」
(如果你的請求本質上是循序的,用/fleet模式未必有好處。)
再加一句更值得記住的成本警語:拆得太細,可能導致更多次 LLM 互動,成本反而比讓主 agent 直接做還高。這不是猜測,是官方明講的取捨——平行化本身不是免費的,拆分、協調、彙整都要吃 token。
重要提醒
/fleet 適用場景,官方建議:大型或複雜任務、多個獨立步驟、本質可平行的工作。反過來說,一步接一步、後面依賴前面結果的任務(例如「先讀懂這段邏輯,再照這個邏輯改另一段」),硬套 /fleet 很可能只是多花錢、沒省時間。14.11 會再展開這一點。
14.5 併發控制與遞迴保險絲:depth 與 concurrency
多代理最怕的事,是「代理委派代理、代理又再委派代理」失控增生,Copilot CLI 用兩個維度管住這件事:
- Depth(巢狀深度):agent 裡面再生 agent 的層數,達上限後最內層的 agent 不能再生 subagent。
- Concurrency(併發數):整個 session tree 裡同時在跑的 subagent 數,達上限後新請求會被拒絕,直到有一個先跑完騰出位置。
v1.0.66+:usage-based billing 使用者可以直接在 /settings 裡調整這兩個值。
subagents.maxDepth:預設從 6 降到 4(v1.0.71 起)。官方 changelog 給的理由逐字精神是「curb runaway recursive sub-agent delegation」(遏止失控的遞迴子代理委派)。usage-based billing 使用者可以調到最高 128,數值會被 clamp 在 1~256 之間。
COPILOT_SUBAGENT_MAX_CONCURRENT:環境變數,啟動 CLI 前設定,用來覆寫併發上限。
COPILOT_SUBAGENT_MAX_CONCURRENT=3 copilot
待確認:確切可調範圍語法
subagents.maxDepth 從 6 砍到 4 這件事,GitHub 官方 changelog 有明確提及調整動機;但確切的設定鍵語法、128 上限與 1~256 clamp 範圍主要來自社群二手整理(devleader.ca、winbuzzer.com 等),信心:中。動手調整前,先用 /settings 或 copilot --help 實機確認你這版的鍵名長怎樣。
跨單元對照:跟 Codex CLI 比,誰比較保守
| Codex CLI | GitHub Copilot CLI | |
|---|---|---|
| 保險絲鍵名 | agents.max_depth(config.toml [agents] 段) | subagents.maxDepth(/settings 或設定檔) |
| 預設值 | 1——主 → 子一層封頂,完全鎖死孫代理 | 4(v1.0.71 起,從舊預設 6 砍下來) |
| 放大公式 | 官方語意上,深度每加一層,最壞並行數以 max_threads ^ depth 指數放大 | 同類指數放大邏輯,但預設容許的深度比 Codex 寬 |
| 設計動機 | 語意上是「防指數爆炸」的保守優先設計,未見官方逐字說明理由 | 官方 changelog 明講是為了 curb runaway recursive delegation |
兩邊都用「遞迴深度保險絲」防同一個問題(多代理指數爆炸),但保守程度的拿捏不同——Codex CLI 直接鎖死到「不准孫代理」,Copilot CLI 給了更寬的深度但仍是從 6 主動砍下來的收斂結果。這組對照的完整版本,見章末「對照另一套教學」卡片。
14.6 Autopilot 進階:接進自動化管線的程式化旗標
(料源:official)
第 7 章已經教過 Autopilot 的四種停止條件、--max-autopilot-continues N、「Enable all permissions」的官方原句警告(「這等於授權 CLI 可以做任何它認為完成任務所必要的改動,包含修改與刪除檔案」),這裡不重複,只補程式化、接進自動化管線這一層。
把互動時按 Shift+Tab 循環進 Autopilot 的動作,換成一行可以寫進腳本的指令:
copilot --autopilot --yolo --max-autopilot-continues 10 -p "PROMPT"
跟單純 --allow-all 的差異:--allow-all 仍是標準互動流程(逐步跑,但不用逐次核可);Autopilot 是多步自主——Copilot 不等你輸入,自己連續跑完多個步驟,性質不同,別把兩者當同義詞混用。
建議流程:先用 Plan 模式把計畫討論出來、確認方向 → 選「Accept plan and build on autopilot + /fleet」,等於 Plan + Autopilot + Fleet 三合一:先把風險最高的「決定方向」這一步做完看過,剩下機械式的平行執行才放手交出去。
適合場景:目標明確的大型任務(寫測試、重構、修 CI 失敗)、批次/CI 場景——跟 14.11 談的「循序任務別硬拆」剛好是一組互補判斷:任務夠明確、夠大、能自動判定完成與否,才適合 Autopilot;任務含糊、需要你邊看邊引導,兩者都不適合。
14.7 -p 非互動模式的自動化補完:--no-ask-user、--secret-env-vars
(料源:official,來源:GitHub Copilot CLI for beginners: interactive v. non-interactive mode)
第 10 章已經整章教過 -p/-s 的權限旗標家族、排程、--model 跨供應商切換。這裡只補兩個跟「多代理/CI 自動化」場景特別相關、第 10 章沒細講的旗標:
| 旗標 | 說明 |
|---|---|
--no-ask-user | 自動化執行中不准暫停問你問題。只在 prompt 已把安全失敗方式寫清楚時使用;否則任務可能在需要判斷時硬猜。 |
--secret-env-vars | 指定要在輸出中被自動遮蔽(redact)的環境變數;GITHUB_TOKEN、COPILOT_GITHUB_TOKEN 預設就會被遮蔽。它是避免日誌外洩,不是存取控制。 |
copilot -p "只跑全部測試並回報結果;不要部署、不要讀取或修改憑證" --no-ask-user
headless 環境的認證順序:依序檢查 COPILOT_GITHUB_TOKEN → GH_TOKEN → GITHUB_TOKEN,找到第一個有值的就用。
小技巧
只注入這個任務確實需要的最小權限憑證。--secret-env-vars 只遮蔽輸出,並不阻止 agent、子程序或 MCP 讀取該變數;不需要部署時,絕不可把部署權杖帶進 runner。需要分享輸出前,仍應人工確認沒有敏感內容。
14.8 Hooks:把生命週期掛鉤補完整
(料源:official,來源:Hooks reference)
第 12 章已經介紹過 Hooks 的基本概念跟七八個常見事件。這一節把完整的 14 個生命週期事件、三種 hook 類型、載入路徑優先序、輸入輸出契約、跟一個容易忽略的「fail-open/fail-closed」細節,一次補完。
14 個事件
| 事件 | 觸發時機 | 能 Deny/Block? |
|---|---|---|
sessionStart | 新建/恢復 session | 否,可注入上下文 |
sessionEnd | session 終止 | 否 |
userPromptSubmitted | 使用者送出 prompt | 否 |
userPromptTransformed | 執行期轉換 prompt 後 | 否,可重寫內容 |
preToolUse | 工具執行前 | 是 |
postToolUse | 工具成功完成後 | 否,可修改結果 |
postToolUseFailure | 工具失敗後 | 否,可提供恢復指導 |
permissionRequest | 需要核可時(CLI only) | 是 |
preCompact | 壓縮前 | 否,通知 |
agentStop | 主 agent 完成回合 | 可 block 強迫繼續 |
subagentStart | 子 agent 生成前 | 否,可注入上下文 |
subagentStop | 子 agent 完成 | 可 block 強迫繼續 |
errorOccurred | 執行期發生錯誤 | 否 |
notification | CLI 發系統通知 | 否,可注入上下文 |
小技巧
subagentStart / subagentStop 讓你能在每個分身生/死的瞬間掛邏輯——記帳、注入額外 context、寫 audit log。這是把本章 14.2~14.5 的多代理跟 Hooks 串起來的核心接點,跟 Codex CLI 的 SubagentStart/SubagentStop 是同一種設計思路(Codex CLI 那邊的完整多代理對照,見章末「對照另一套教學」卡片)。
三種 hook 類型
command:本機指令,設定裡分開含bash/powershell/command跨平台欄位——同一支 hook 要在不同作業系統上跑,得各自準備對應腳本(第 12 章已經點過這個「一個 hook 兩份腳本」的硬性規定)。http:遠端 webhook,僅允許 HTTPS,除非目標是 localhost。prompt:CLI only,送一句 prompt 或 slash 指令觸發新的一輪互動。
{
"preToolUse": [
{
"type": "command",
"bash": "./hooks/pre-tool-check.sh",
"powershell": "./hooks/pre-tool-check.ps1"
}
]
}
載入位置(依優先序)
- 策略級:
/etc/github-copilot/policy.d/*.json(Linux/macOS)、C:\ProgramData\GitHub\Copilot\policy.d\*.json(Windows)——企業可強制下發,使用者關不掉,跟 Codex CLI 的「Managed hooks」概念一致。 - 使用者級:
~/.copilot/hooks/ - 專案級:
.github/hooks/*.json - 設定檔內嵌:
.github/copilot/settings.json、~/.copilot/settings.json、.claude/settings.json(跨工具相容) - 外掛提供:各外掛自己的
hooks.json
停用所有 hooks:設定檔頂層 "disableAllHooks": true。
輸入輸出契約:exit code 決定生死,但有一個例外要記牢
preToolUse 的輸出可以回 permissionDecision: "allow"|"deny"|"ask",決定這次工具呼叫是否放行。
exit code 的完整規則(這裡是最容易被誤解的地方,官方分得比表面看起來細):
| exit code | 意義 |
|---|---|
0 | 成功,Copilot 解析你 stdout 印出的 JSON |
2 | 警告——preToolUse/permissionRequest 視為 deny;postToolUseFailure 視為附加上下文,不是阻擋 |
| 其他非零(一般事件) | fail-open——hook 腳本本身壞掉、跑錯,不阻擋原本的流程繼續 |
其他非零(唯獨 preToolUse) | 例外,fail-closed——這是核心攔截點,腳本壞了也不能悄悄放行 |
| 逾時 | 一律 fail-open——官方明講:一個慢或連不上的 hook,不該悄悄擋住所有工具呼叫 |
重要提醒
上面這張表最重要的一格是「其他非零(唯獨 preToolUse)」——大部分事件的 hook 腳本壞掉,Copilot 會選擇讓流程繼續跑(fail-open,避免一支寫壞的 hook 癱瘓整個工具鏈);但 preToolUse 是唯一的例外,腳本壞掉時反而 fail-closed(擋下來)。這跟 Codex CLI「用 PreToolUse 把口頭守則升級成機械閘門」的設計精神完全一致:核心攔截點不能因為腳本本身出包就悄悄放行。寫 PreToolUse 類 hook 時,這個不對稱行為要納入你的測試案例,別只測「hook 正常跑」的那條路徑。
跨工具相容彩蛋:官方明講相容 Claude 的 matcher 語意
官方文件明講支援 PascalCase 事件名相容格式(例如把 preToolUse 寫成 PreToolUse),並且「apply Claude's matcher semantics」——*、**、空字串 matcher 對每個工具都會觸發。這代表你如果已經幫 Claude Code 寫過 hooks,理論上有機會直接沿用(規則語意層面相容),不用整套重寫。
雲代理(Copilot coding agent)的執行環境差異
委派給 14.9 要講的雲端 coding agent 時,Hooks 的行為會縮水:
- sandbox 非互動、網路受限、job 結束即銷毀。
- 只有
bash欄位被採用(powershell被忽略——雲端執行環境本來就是 Linux)。 permissionRequest/notification/prompt三種類型不觸發,因為雲端是非互動環境,工具都已經預先核可過,沒有「等你回應」這回事。
14.9 委派給雲端 Copilot coding agent:& 前綴與 /delegate
(料源:official,來源:Delegate tasks to Copilot coding agent)
任何 prompt 前面加一個 &,就等同背景委派給雲端 coding agent——終端機立即釋放,不用等。這等同 /delegate 指令的簡寫。
&幫我把 README 裡過時的安裝說明更新一下
運作方式:Copilot 在 GitHub 雲端建立分支、開 draft PR,完全在背景跑,回你一個 PR 連結 + agent session 連結。
在往下講「跟 /fleet 差在哪」之前,先把最根本的問題講清楚——這件事到底解決了你的什麼痛點,這是本章最值得放慢腳步理解的一段。
傳統的開發工作方式,本質上是單執行緒人力:你手上同時間只能真正推進一件事,一個任務沒做完,下一件事就只能排在後面等;就算你想「同時」處理兩件事,實際上做的也只是不斷手動切換 context——先把手上這一件卡在哪一步、下一步要幹嘛,硬記在自己腦子裡,切過去做另一件,等一下又要切回來,重新把前一輪的狀態喚回腦子裡。這個「切換」本身不是免費的:你切得越頻繁,花在「回想自己剛才做到哪」的時間佔比就越高,真正往前推進的產出反而更少。
雲端委派把這個限制直接拆掉。你不再被綁在「一次只能顧一件事」的單執行緒裡:改一段過時的 README、修一個小 bug、幫你去探勘另一個你還沒空看的子系統——這幾件事可以各自加一個 & 同時派出去,每一個都在 GitHub 雲端獨立跑,佔用的是 GitHub 的運算資源,不是你的注意力,也不需要你守在終端機前等它做完。你的角色從「一個人把每件事從頭做到尾」,變成「派工,然後回頭驗收」——終端機立刻釋放,你可以繼續手上正在做的事,或是接著派下一個任務;等雲端那幾個做完了,你拿到的是可以直接看、直接核可或打回去要求修改的 PR 連結,不是一堆你得自己從頭拼湊上下文才看得懂的半成品。
這正是本章一開頭「工頭帶一整組班底」那個比方裡最實在的一塊:光是班底自己會做事還不夠,真正的改變是你因此不再被「一次只能顧一件」卡住——手上這件事還在做,另外幾件已經在雲端動起來了。
重要提醒:跟 /fleet 是完全不同的執行環境
& / /delegate 委派的雲端 coding agent,跟 14.4 講的本機 /fleet 平行子任務,容易被誤認成同一件事——都是「叫幾個分身幫你做事」。但兩者的執行環境天差地別:/fleet 的 subagent 仍在你自己的電腦上跑、共用同一份工作目錄、由主 agent 彙整結果;& 委派的雲端 agent 完全在 GitHub 雲端跑,佔用的是 GitHub 的運算資源,不是你的電腦,做完直接是一個獨立分支加一個 draft PR,不會自動彙整回你正在跑的這個互動 session。這是「本機互動 → 意識到任務值得完整自主權跟一個 PR → 平滑升級到雲端」的典型路徑,跟本機 /fleet 平行子任務不是同一條路。
14.10 三選一:/fleet vs & 雲端委派 vs 手動指定單一 agent
把前面幾節收斂成一張決策表:
| 你的需求 | 用哪個 | 為什麼 |
|---|---|---|
| 一個任務能拆成幾塊互不相干的子任務,想快一點、還想留在同一個 session 裡看彙整結果 | /fleet(14.4) | 主 agent 當協調者,subagent 平行跑,結果彙整回同一輪對話 |
| 任務夠大、值得開一個獨立分支跟 PR,不想佔用本機資源,也不急著等結果 | & / /delegate(14.9) | 完全在雲端跑,終端機立即釋放,回你 PR 連結 |
| 只是想讓某個特定角色(內建四個之一,或你自己寫的自訂 agent)處理單一任務,不是要平行 | /agent 手動指定 或 --agent 旗標(14.2、14.3) | 不需要協調者拆分任務,單純換一個更適合的角色做這件事 |
14.11 現實檢查:拆太細,比不拆更貴
14.4 已經引過官方那句誠實警告:「循序任務用 /fleet 未必有好處」,這裡把這個判斷整理成可操作的心法。
多代理平行編排的成本,不是只有你分派出去的那幾個子任務各自的 token——協調者本身判斷怎麼拆、拆完怎麼彙整,也是要吃 LLM 呼叫次數的。任務拆得越細,協調開銷佔比越高;如果每塊子任務本來就很小、彼此又有先後依賴(後面的子任務得等前面的結果才能開始),拆分本身的協調成本很可能超過「平行帶來的時間節省」,結果變成又貴又沒真的比較快。
小技巧
動手 /fleet 之前,先問自己一句:這幾塊子任務,如果拿掉平行,改成我自己依序一句一句叫 Copilot 做,會不會反而更快、更省? 如果答案是「會」,代表這個任務本質偏循序,硬套 /fleet 大概率只是把「協調」這件事外包給模型自己做一遍,多付一次協調的錢,卻不一定拿到真正的時間節省。反過來,如果子任務彼此完全獨立(例如「幫我平行探勘三個不同子系統的程式碼」),/fleet 才會真的划算。
14.12 安全警語:多代理與自動化不是無風險
(料源:community/security-research——本節引用的具體漏洞案例來自 2026 上半年多篇第三方安全研究,不是 GitHub 官方逐字立場,但對「大師篇」讀者有實質警示價值,值得誠實收在這裡。)
多代理、Autopilot、雲端委派把「Copilot 自己判斷、自己動手」的範圍越開越大,安全風險自然也跟著放大。下面幾個是第三方安全研究揭露的案例,動手前務必知道:
- PromptArmor(2026)「GitHub Copilot CLI Downloads and Executes Malware」:indirect prompt injection(間接提示注入)經由被污染的 README 觸發惡意指令。研究指出,
env指令在唯讀白名單裡會被自動核可,攻擊者利用env curl ... | sh這類寫法繞過「外部 URL 存取」的驗證邏輯——因為驗證器沒把curl/sh識別成env的子指令。 - RoguePilot(Orca Security):另一組獨立揭露的漏洞鏈。
- Git hook/執行檔搜尋順序劫持:Windows 上部分 AI agentic 工具,在資料夾信任提示跳出之前就先執行了 workspace 裡的
git.exe;Windows 預設搜尋順序會先查工作目錄再查系統路徑,攻擊者只要在該路徑放一個惡意同名執行檔就能劫持——這是重演 2020 年 Git Credential Manager Core 曾出過的同一種攻擊手法。 - MCP server 自動執行:多款 agentic CLI(含 Copilot CLI)在使用者按下「信任這個資料夾」的瞬間,就會執行該專案定義的 MCP server——一鍵接受資料夾信任,等於一鍵讓惡意 repo 定義的 MCP server 在無沙箱環境跑起來。
- 官方側的對照:
github/copilot-cliissue #1076「Secure or Untrusted mode」,社群訴求「唯讀/不受信任模式」的討論串截至研究當下仍開放中——代表這塊防護還在補強,不是已解決的問題。
重要提醒
這些案例都不是「危言聳聽的假設」,而是有具體漏洞鏈或公開討論串佐證的真實風險,尤其跟本章教的「委派」「自動化」「Autopilot 全權限」疊在一起時風險更高——你授權的範圍越大,一旦被注入惡意指令,能造成的破壞也越大。clone 別人的 repo、對來路不明的 README/AGENTS.md/copilot-instructions.md 提高警覺,不要對不熟悉的專案按「全部信任」或直接開 Autopilot 全權限模式。 這些漏洞公開揭露後是否已被修補,[待確認]——動手前建議查一下對應 CVE 或 GitHub 官方安全公告的最新狀態。
本章小結
這一章你把 Copilot CLI 從「一對一帶」升級成「帶一整組班底」:內建的 Explore/Task/Plan/Code-review 四個專職 subagent 可以自動委派也可以用 /agent 手動指定;自訂 agent(.agent.md)透過四種方式被委派成真正執行的 subagent;/fleet 讓主 agent 當協調者,把可平行的任務拆給多個 subagent 同時跑,但官方誠實警告「循序任務用了未必划算、拆太細反而更貴」;subagents.maxDepth 從 6 砍到 4 這道遞迴保險絲,跟 Codex CLI max_depth=1 是同一種防指數爆炸的設計思路,只是保守程度不同;Autopilot 跟 -p 都補上了程式化旗標,讓多代理接進真正的自動化管線;Hooks 的完整 14 個生命週期事件、三種類型、preToolUse 的 fail-closed 例外規則、以及跟 Claude 相容的 PascalCase matcher 語意,都摸過一輪;& 前綴//delegate 委派給雲端 coding agent,跟本機 /fleet 是完全不同的執行環境,不要混為一談。最後你也老實看了一次多代理與自動化系統的真實安全風險——授權範圍越大,一旦被注入,代價也越大。
動手試試
- 在你已經在用 Copilot CLI 的專案裡輸入
/fleet,挑一個真的能拆成兩三個獨立子任務的工作(例如「同時探勘 A、B 兩個不相干的子系統」),觀察它怎麼分派、怎麼彙整結果。 - 跑
/agent,看看你的個人層或專案層有沒有已經定義的自訂 agent;如果有,用「Use the XXX agent on YYY」這種明確指令句觸發一次,感受跟自動推論觸發的差別。 - (進階) 在
/settings或你版本對應的設定檔裡查一下目前的subagents.maxDepth是多少,跟本章提到「6 砍到 4」的官方調整對照一下,你這版是不是已經是新預設。 - (進階) 照 14.8 的表格,寫一支簡單的
preToolUsecommand hook,故意讓腳本本身壞掉(例如打錯字讓它直接 exit 1),實測看看是不是真的 fail-closed(擋下來),跟一支非preToolUse事件的壞掉 hook 做對照。 - (安全意識練習) 挑一個你 clone 過、來源不太熟的 repo,看看它的
AGENTS.md/.github/copilot-instructions.md/README 裡,有沒有你以前沒特別注意過、讀起來比較像「指令」而不是「說明」的可疑段落。
本章官方文件參考
- Fleet mode:https://docs.github.com/en/copilot/concepts/agents/copilot-cli/fleet
- Run multiple agents at once with fleet in Copilot CLI(官方部落格):https://github.blog/ai-and-ml/github-copilot/run-multiple-agents-at-once-with-fleet-in-copilot-cli/
- Autopilot:https://docs.github.com/en/copilot/concepts/agents/copilot-cli/autopilot
- Hooks reference:https://docs.github.com/en/copilot/reference/hooks-reference
- Delegate tasks to Copilot coding agent:https://docs.github.com/en/copilot/how-tos/copilot-cli/use-copilot-cli/delegate-tasks-to-cca
- Interactive v. non-interactive mode(官方部落格):https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-interactive-v-non-interactive-mode/
- Enhanced agents, context management, and new ways to install(v1 changelog,四個內建 subagent 出處):https://github.blog/changelog/2026-01-14-github-copilot-cli-enhanced-agents-context-management-and-new-ways-to-install/
- Custom agents configuration reference(
.agent.md完整欄位,第 13 章對應出處):https://docs.github.com/en/copilot/reference/custom-agents-configuration - PromptArmor 安全研究(非官方,14.12 案例出處):https://www.promptarmor.com/resources/github-copilot-cli-downloads-and-executes-malware
- Orca Security「RoguePilot」(非官方,14.12 案例出處):https://orca.security/resources/blog/roguepilot-github-copilot-vulnerability/
github/copilot-cliissue #1076「Secure or Untrusted mode」(官方 repo 內社群討論串,仍開放中):https://github.com/github/copilot-cli/issues/1076
版本時效提醒
本章查證日為 2026-07-18,對照版本 GitHub Copilot CLI 1.0.71(2026-07-16)。多代理與 /fleet 是相對新的功能,subagents.maxDepth 確切可調範圍語法、四種 agent 類型分類框架(14.1,非官方逐字分類)、14.12 引用的安全漏洞是否已被修補,皆標記 [待確認]——動手前請以 copilot --help、/settings、/agent 或官方文件最新頁為準,不要把本章任何具體數字或旗標拼法當成不會變的最終真相。