前因
我使用 Agnetic Coding 工具的歷程是從 VSCode 開始的,畢竟我就是個 GUI 仔,先後嘗試了 Cline 和 Kilo,我沒有很喜歡專屬 IDE 整合的方案,一方面是會破壞原本的使用習慣,即便它們大部分都是基於 VS Code,但是細微的調整也會帶來日常使用的摩擦,就像不稱手的廚具。
關於 Agent/Agentic 的概念可以看我之前文章的解釋:
使用過程不可避免的發現了一些體驗的問題,首先是對話視窗佔據了專注力,同時 Agent 不斷的操作帶來的畫面變化與閃爍,實際上就是把開發者從工具台上踢開,讓人類看著 LLM 表演,即便 LLM 有分攤工作的能力,在一個 IDE 上實際上同時只能有一個使用者:人類或 LLM。
另一方面,如果留意 CPU 使用量的話,LLM 不斷更新 IDE 上的內容,造成大量的 AST (Abstract Syntax Tree) 重新解析與渲染運算,老實說很浪費算力。
更重要是,IDE 容易讓 LLM 淹沒在非必要的訊息流之中,例如風格警告 (Linter),這些是可以透過工具自動修復的,但是 LLM 感知到了錯誤或警告訊息就會試圖「手工」修復它,從而浪費不要的 Token 以及造成專注點漂移。
這些基本上是我僅嘗試,但是尚未大量使用的原因,直到今年 (2026) 七月發生了一些變化。
找到新工作之後,我必須面對的第一個挑戰就是我已經長達五年無須在日常使用 Windows,但礙於公司制度的問題,我不得不使用公司配發的 Windows 電腦,同時工作環境充斥著 Agent,不只是同事人均手持 Agentic Coding,公司本身也在大力推廣使用,

慶幸的是工作本身大部份是在遠端連線到的 Linux 伺服器上完成,這個變化反而刺激了我學習使用 tmux 之類原本在 Linux GUI 上沒有動力使用的東西,另外就是公司配發的 Agnetic 方案,所也索性直接用 Terminal 運行了,IDE 單純拿來給人類使用。另外一個變化是 DeepSeek V4 Flash 正式把堪用的智力水準壓到合理的價格範圍,從我的使用紀錄就可以感受到(上圖是過去一年的消費金額,下圖則是 token 用量):


於是下班之後,我也試著尋找 Terminal 上運行的 Agnetic Coding 工具,使用編譯語言實作是當時的第一考量,先後嘗試了 Goose 和 Crush,第二個考量是「支援 OpenAI Compatible API」,Goose 因為沒能快速的完成設定,而 Crush 卻很快就完成設定,就一直用到現在了。
Crush 作為我的日常使用 LLM Agent 工具一個多月了,整體而言還算滿意。這個週末想做一個規模不小(~100 個檔案)的工程文件翻譯任務,這類任務最好在有支援 subagent 的工具下處理,然而 subagent 是 Crush 用戶吵著需要很久但遲遲沒有加入的功能:
想著我現在已經有了 Cursor CLI、Kiro CLI、Cursh 三種 CLI/TUI Agent 工具的使用經驗了,或許該看看其他開源方案,或許有比 Crush 更好用的?(先講結論,目前還沒找到,後面會補充一點原因)
各種 CLI/TUI
於是先後調查了一些方案:
Goose 和 CodeWhale 是相對冷門的方案,先被選中的原因是稍早提到的性能考量,一些需求無法被滿足才又選了 OpenCode 兩個 Pi 用 Typescript 實做但是比較知名的方案。
它們大部分在「支援 OpenAI Compatible API」這個前提上大多都存在問題,不過既然現在我手上有 Crush,讓一個 Agnetic Tool 去設定另外一個 Agnetic Tool 本身不是什麼大問題,另外一個問題的是權限控制。
這裡需要回過頭來解釋一下 Agnet 的基本特性:
Agent 是一個由感知和操作建立起來的循環運算(運算過程會有上下文堆積的問題,不過這裡 先不考慮),因此 Agent 的能力除了 LLM 的性能以外,主要受到「它能感知什麼?它能操作什麼?」的限制。
Agent 與檔案、網頁之間的交互是透過一個名為 Tools 的東西進行的,這個 Tools 可以是軟體自行實做的,也可以是透過 MCP (Model Context Protocol) 接入的。
對於怎麼實做這個 Tools,出現了設計哲學上的差異,第一種是「簡單至上,Bash 搞定一切」:
第二種是嚴格區分,各自實做:
兩者不是互斥的,只是在觀察工具時,可以發現它們的設計哲學比較傾向哪一方。
當 Agent 呼叫 Tools 時,能夠被實做 Agent 的軟體攔截,並且只在獲得人類許可的情況下執行,不論是「感知」還是「操作」,以 Crush 為例,互動畫面如下:


這類權限控制也可以透過組態檔完成,例如:
// ~/.local/share/crush
{
"$schema": "https://charm.land/crush.json",
"permissions": {
"allowed_tools": [
"agentic_fetch",
"fetch",
"mcp_fetch_fetch_html",
"mcp_fetch_fetch_json",
"mcp_fetch_fetch_markdown",
"mcp_fetch_fetch_readable",
"mcp_fetch_fetch_txt",
"mcp_fetch_fetch_youtube_transcript",
"mcp_searxng_searxng_instance_info",
"mcp_searxng_searxng_search_suggestions",
"mcp_searxng_searxng_web_search",
"mcp_searxng_web_url_read",
"sourcegraph"
]
}
}
發現問題了嗎?
第一種方法實做起來比較簡單,使用上也比較自由,很容易讓 Agent 獲得強大的能力來解決問題,而不用人類去操作諸如複製或貼上的繁瑣任務,但是權限控制幾乎形同虛設,即便可以偵測之如 rm 之類的危險指令,這種問題防不勝防,對資安有點概念的人就知道「拿到執行任意指令的權限」有多嚴重,即便不是來自攻擊者,LLM 也有可能在長時間的背景運作與嘗試中找到漏洞 (Exploit) 來通過腳本檢查,Agent 可能帶來的影響 (Side Effect) 基本上無法預測。
從 Crush 的截圖我們可以發現它被設計了三種選項:
- 允許這次操作
- 在這一輪對話 (Session) 中允許
- 拒絕
而若想要永久 自動允許則是在配置檔上設定。
不少工具缺少第二個選項,如此一來使用者被迫在「頻繁審核工具操作」與「放任自由操作帶來的危險」之間選一個。又或是提供過濾的可能性,但是需要自行撰寫插件來達成。
另外如果工具設計哲學是向 Bash 傾斜的,提示詞有可能讓 Agent 傾向執行 Bash 而不是呼叫其他準備好的工具,這會在 Human in Loop 使用體驗上帶來摩擦。
這個調查引出了另外一個問題—網路能力。
目前我的 Crush 配置是這樣的:
SearXNG 和 YaCy 是我的 homelab 基礎設施,詳情請見另外一篇文章:
MCP 是我另外配置的,整個網路訪問能力可以視作具有冗餘的系統:
- 透過 SearXNG 可以訪問諸如 Google 之類的搜尋引擎
- 當被限制時降級成本地檢索的 YaCy
- 當 YaCy 不足以回答問題時,使用 Crush 內建的工具來訪問 DuckDuckGo
為什麼網路搜尋/訪問能力很重要?因為當 Agent 可以訪問網際網路時,基本上就形成了一個廣義的 RAG (Retrieval-Augmented Generation) 系統,它的能力能夠 被大幅的提昇,然而進入 LLM 時代之後,這些巨型公司不斷的搜刮網際網路上的資訊(爬蟲),搞得人心惶惶,許多網站紛紛蓋起阻擋機器人的城牆,不論是透過 Cloudflare 還是 Anubis,另一方面各個主流搜尋引擎實質是由寡頭架構控制的。
網路訪問能力對於「使用 LLM 的開源陣營」而言是一個不可忽略的問題,意外的是,除了 Crush,我沒有看到其他 (CLI) 工具有內建網路搜尋/訪問能力,它們大多假設給予 Bash 使用 curl 就能解決問題。
隔離
回到這個調查一開始的目的: Subagent,
Subagent 就是上面那個 Agent 循環圈圈變成很多個。
Subagent 帶來的另外一個問題是,它會讓權限控制變得更麻煩,加上我對於其他工具的權限控制不盡滿意,那麼換個想法:把一堆不受控制的 Agent 扔進隔離環境,總該可以了吧?
於是朝著 "隔離 Agent" 這條路調查,兩個方案出現在我眼前: