昨天講到把工作交給 Antigravity CLI 去跑。今天講第一個實際撞到的牆。
這類工具平常是互動式的:它要讀某個檔案、要執行某個指令的時候,會跳出來問你「可以嗎?」,你按同意它才做。這是很合理的設計——有人在旁邊看著,就讓那個人決定。
但我的用法是「在背景跑,跑完把結果給我」。這種模式下沒有人在螢幕前面,那它要問誰?
答案是:它誰也不問,直接拒絕。
我請它去讀一個網頁,內容公開、任務唯讀、什麼都不會改。結果它回給我一句話,大意是:
有個工具需要「讀取網址」的權限,而背景模式沒辦法詢問,所以自動拒絕了。
任務完全沒開始就結束了。
寫這篇之前我重跑了一次,確認現在還是一樣:九秒就結束,什麼都沒讀。
這裡有個容易誤會的地方:它不是「做失敗」,是根本沒做。而且從外面看,它是正常結束的——程式回報的狀態跟真的做完一模一樣。如果是交給另一支程式去判斷「跑完了沒」,它會以為一切順利;如果沒有人仔細看那行訊息,很容易以為是任務太難或工具壞了。

解法一:整包全開。
有一個參數的意思是「自動同意所有工具請求」。加上去,任務就會跑了。
這是最快的解法——快到那行錯誤訊息自己就把它列成選項之一:要嘛去設定檔加規則,要嘛加上這個參數全部放行。但它的意思是,在這次執行裡,它想做什麼都可以。讀檔、寫檔、刪檔、執行任何指令。
對一個「只是去讀個網頁」的任務來說,這個授權範圍大得誇張。
解法二:只開需要的那一項。
錯誤訊息的另一個選項,是在設定檔裡加一條規則,明確允許某一類操作。
照理說,這樣它能做的就只有你允許的那件事,其他照樣被擋——不過下面會看到,「其他照樣被擋」並不完全成立。
兩種解法的差別,跟「給人家你家鑰匙」和「幫他開那扇門」一樣大。
寫這篇的時候我發現,解法二我其實從來沒用過。所以這次補測了:
這部分跟預期一樣。但有三個地方跟我想的不同:
一、「那扇門」比想像的大。 我寫的是一個網址,結果同一個網站底下的其他頁面也一起放行了。它到底怎麼比對網址,我查不到官方說明。
二、指令的規則又反過來,精確到幾乎不會再用到。 設定檔裡本來就累積了 116 條允許執行的指令,大多是過去某個任務裡的一整行指令原文。我原本以為裡面有幾條放得很寬——例如只寫了「powershell」的那條——就等於什麼都能跑。實測之後發現不是:清單上原樣有的指令會過,但同樣是 powershell 開頭、後面多了參數的就被擋。要一字不差才放行。
三、寫檔根本沒被擋。 這是最意外的一個。我一直以為不加全開參數,它什麼都得先問;實測卻是:讀網頁會被擋,建立檔案卻不用問,而且連工作資料夾以外的地方都寫得進去。原因是設定檔裡有一個「允許存取工作資料夾以外的位置」的開關,我的是開著的。把它關掉再測,工作資料夾裡照樣能寫,外面的就被擋了。但只要加了全開參數,這個開關關不關都沒差。
所以同一份設定檔裡,網址規則比我以為的寬,指令規則比我以為的窄,寫檔則是我以為有擋、其實沒擋。這三件事我在寫這篇之前都說錯過。
老實說,到今天為止我日常用的都是解法一。
一開始是因為快,想先確認整件事跑得起來。後來知道該換,也一直沒換。補測之後我比較清楚卡在哪裡了:規則要在任務開始之前就寫好。 而我交出去的工作,每次要讀的網站、要跑的指令都不一樣;指令規則又要一字不差,事先根本寫不出來。
危險的不是某一次全開,是全開變成預設——而我自己就卡在這裡。
目前的補救有兩層:交代任務時明講「這次只能讀,不准改任何檔案」;跑完之後自己查一次有沒有檔案被動過。第一層只是拜託它,它照不照做我管不著;真正靠得住的是第二層——它擋不住什麼,但至少讓我知道發生了什麼。
我也試過工具另外提供的兩個選項:「沙盒模式」和「先規劃再執行」的模式。加上全開參數之後,兩個都沒擋住寫檔——沙盒只管執行指令,寫檔不歸它管;規劃模式在背景跑時,寫完計畫就在同一輪直接執行了,沒有停下來等誰確認。
比較實際的折衷,是把「允許存取工作資料夾以外」那個開關關掉、不加全開參數。補測完的當天我就改了,平常交派工作也不再加全開參數。
改完再測一次,又多知道一件事:關掉之後,連讀工作資料夾以外的檔案都會被擋;但有另一個參數可以把指定的資料夾「借」給它,借來的只能讀、不能寫。所以現在的做法是:產出寫在一個專用的空資料夾,原始資料用借的。
(2026-10-07 更正:後來再測才發現,「借來的只能讀」只在那個資料夾不在工具的信任範圍內時才成立;我的信任範圍包含整個使用者資料夾,所以實際上借出去的資料夾寫得進去。現在的做法改成:原始資料先複製一份再借給它,事後比對有沒有被改。)
代價也很清楚:要跑指令的任務會被擋,而且第一個被擋的動作就會讓整個任務停下來;網頁只能讀事先寫進規則的網站,那份清單我還沒建。
不管權限收得多緊,我都會做一件事:確認它有沒有動到不該動的東西。
方法很土:任務開始前記下時間,跑完之後查一次「哪些檔案在這段時間內被改過」。如果出現我沒預期的檔案,就知道有問題。
這個檢查花不到一分鐘,但它讓我可以放心把任務交出去——因為就算它做了不該做的事,我也會知道。
這幾個都是實際卡過才知道的,寫出來給遇到同樣狀況的人:
一、任務內容不能用管線傳進去,只能當參數給。有些工具接受把文字「倒」進去,這個不行。
二、參數要用等號的寫法(-p="內容"),不然它會用奇怪的方式解讀。
三、其他設定要放在任務內容前面。 如果放後面,會被當成任務內容的一部分——然後你會得到一個完全莫名其妙的結果,因為它把你的設定當成指示在讀。
第三點我卡了一陣子,因為它不會報錯,只是結果很奇怪。
權限這件事,在「有人看著」的時候是使用體驗問題,在「沒人看著」的時候是安全設計問題。
而最省事的那條路,工具自己就擺在你面前。擺在面前,不代表適合拿來天天用。 我自己就是把它當預設用了好一陣子,到寫這篇才回頭補測另一條路。
Day 22:它說「完美」,但錯的不只是它。