iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
Vibe Coding

凡人修 Agent 傳-我這一生如履薄冰,你說我的 Agent 能結嬰嗎?系列 第 8

門規先立:他很會寫程式,卻不知道我的 repo 長什麼樣 - Day 07

  • 分享至 

  • xImage
  •  

他很會寫程式,這件事不用我教。

他不知道的是我這邊的事:分支從哪裡切、commit message 要什麼格式、哪個目錄不要碰、測試用哪一條指令跑。每開一個新對話,這些話就得再講一次。

pi 這邊接這件事的東西叫 context file,啟動的時候自己讀進去。真正要決定的是:放什麼,放哪一層。

預設那一份裡有什麼

動手之前我先去看了 pi 預設的 system prompt。

裡面只有這些:一行身分(你是在 pi 這個 harness 裡工作的 coding assistant)、四個工具各一句話的說明、幾條用法規則、一段「使用者問到 pi 本身才去讀」的文件路徑,最後一行是目前的工作目錄。加起來三百個 token 上下。

那幾條用法規則是工具自己帶進來的。edit 就佔了四條:要換掉的那段文字必須跟原檔完全一致、同一個檔案的多處改動要合成一次呼叫、每一段比對文字要小到剛好唯一、不要重疊或互相包含。readwritebash 各帶一條。固定的兩條是「回答簡潔」和「檔案路徑要寫清楚」。

我一度想乾脆把整份清掉,看看什麼指示都不給會怎樣。查完之後沒有做。

第一個原因是機制上的:放一個空的 SYSTEM.md 沒有作用。pi 是拿那個檔案的內容當條件判斷,空字串會被當成沒有這個檔案,還是走預設。要真的清空,得放一個只有空白字元的檔案。

第二個原因是清掉會少什麼。工具還是能用,因為工具的定義是 API 那一層送出去的,不在 prompt 裡;少掉的是上面那些用法規則。改檔失敗最常見的原因就是要換掉的那段文字對不上,而 edit 那四條規則正是在防這件事。

而且這三百個 token 不會對 context window 有影響,所以這裡我不動。

整份換掉的 SYSTEM.md 就這樣放著。我用的是接在後面的 APPEND_SYSTEM.md

我自己那一份,只有三件事

  1. 用什麼語言跟我說話,語氣要多直接
  2. 做事的原則:動手之前先讀本機的 context、repo、git history 再下結論;任務清楚的時候直接做完,不要每一步都停下來問我
  3. 什麼情況一定要先問:破壞性的操作、對外發布

十行以內,其他都不放。

這一份我也試過完全不寫。也能跑,代價是語氣和邊界每次都要在對話裡重講一次——這次講得清楚,下次忘了講,他的行為就跟著飄。

留下來的標準只有一條:跨每一個專案都成立的才放這裡。上面那三件跨得過去,其他跨不過去。

repo 的知識放 repo 裡

分支怎麼切、哪個目錄放什麼、測試和 lint 各跑哪一條——這些跟著 repo 走,寫在那個 repo 的 AGENTS.md

pi 啟動的時候讀三個地方:

  • ~/.pi/agent/AGENTS.md:全域,每個專案都吃
  • 從目前目錄往上走的每一層父目錄
  • 目前這個目錄

三層會疊起來。所以「全域那份薄、repo 那份厚」這個分法,就是靠這個疊法成立的。反過來也很清楚:repo 專屬的東西寫進全域那份,換到另一個 repo 就變成雜訊,還可能跟那邊的規矩打架。

現成的例子就在 pi 自己身上。pi 的 repo 根目錄有一份 AGENTS.md,169 行:回答要多短、不要在 commit 和 PR 裡用 emoji、什麼時候跑 npm run check、測試該用哪一條指令、commit 只能 stage 自己這一輪改的檔案。連語氣都寫在那一份裡,因為那是那個專案的語氣。

兩個細節值得記。某個目錄裡放了 AGENTS.override.md,pi 就讀它、跳過那一層的 AGENTS.mdCLAUDE.md,其他層照樣疊。啟動時加 --no-context-files 就完全不讀。

還有一件對我有實際好處的事:pi 兩個檔名都認,AGENTS.mdCLAUDE.md 都收。我在別的 coding agent 上已經寫好的那一份,直接放進去就生效。

Day 07:預設規則、個人指示與 AGENTS.md

實作:Desktop App 上的個人化

這些檔案放在 ~/.pi/agent/ 底下。要改它,得開一個編輯器、找到那個路徑、改完存檔。所以這天在 Desktop App 上加了一個「個人化」的畫面。

畫面很單純:一個多行輸入框,裡面就是那份常駐指示,改完按儲存。存下去直接寫進檔案,Agent 下一次啟動就讀到。這一天我只做指示這一塊,記憶那一區的開關先不做,那是第 11 到 13 天的事。

參考的是 Codex App 的個人化那一頁:上面一個輸入框放指示,下面一排記憶的開關。我要的東西跟它幾乎一樣,所以照著做。

實作交給 coding agent:讀檔、寫檔、輸入框、儲存、存失敗的提示。我驗收的標準只有一條——在畫面上加一行,重開 Agent,那一行有生效。

現在每一行都是我自己打的

這幾個檔案不會自己長大。他做錯一件事,不會自己把結論寫回去;下一次還是我自己去加那一行。

我目前接受這樣。全域那一份每個專案都吃,寫錯一句,每個專案都跟著歪,所以每一行經過我一次不是壞事。

至於他能不能自己記住昨天發生過什麼,那是這一章後面幾天的問題。

小結

他很會寫程式,卻不知道我手上這些東西長什麼樣。

解法分兩層:預設那份不要動,我自己那份薄薄十行只放跨專案都成立的三件事,repo 的知識跟著 repo 走。然後給它一個入口,Desktop App 上改完重開就生效。

明天講另外兩種給他能力的方式:教他一件事怎麼做,跟直接給他一個新工具。

參考:Pi 文件


凡人修 Agent 傳|第七回(Day 07)

凡人修 Agent 傳 Day 07 連載配圖

門板上那個洞還沒補。

天亮,手的主人進來,視線先落在洞上,才落到我身上。手在我背後推了一下。

我走。

第二次出門。第一次是被御物術托著出去的,這一次我自己走。過門檻的時候神識照樣斷了半息,出了門,我只剩眼睛和耳朵。

坊裡的路我認得,圖紙上畫過。手的主人沒有往人偶那一排走,走的是外圈,一家一家門前站著看。

每一家門上都掛著一塊牌。

第一家那塊很小,三行字。第二家那塊有半人高,字密得像一片灰,從最上一行「進門先報上要做的事」一直排到地上;我看見中間有一行寫著「不許在門內引火」,再下面一行寫著「東西放回原處,位置照架上的記號」。第三家門上什麼都沒有,門開著,裡面一具人偶正把一疊卷軸從架上抱下來,抱到一半,卷軸散了滿地。

手的主人在第二家那塊牌前面站了很久。視線從上到下走了三遍,中間停下來,指尖劃過其中兩行。

然後手從儲物袋取出一片空玉板,一縷神識探進去,把那兩行刻了下來。

只刻了兩行。

回洞府的路上手的主人沒有停。

進門,手把那片玉板擱在臺上,接著從儲物袋取出我的圖紙,攤開,抬指一引,一張素紙落下來,蓋住圖上靠右的一角。

那一角寫的是我怎麼動手:薄的東西從邊上拿;卷軸從中間抽會裂;刻字之前先看清楚原本的痕,新的痕不要壓上舊的。這些字我睜眼那一刻就知道,跟「見光即醒」寫在同一張圖上。

蓋住之後,我還是知道我會讀、會寫、會改、會動手。那四樣都在。怎麼拿、怎麼刻,就想不起來了。

一縷神識探進玉片,刻了一道念:取第三卷,改第一頁中間那一句。

我伸手到架上,手指從卷軸中間掐住,往外一抽。

紙裂了。裂口從中間往兩邊走,那一頁掉在地上,斷成兩片。

手的主人沒有出聲,撿起來,換了一卷新的上架。

同樣一道念。我換了一手,從邊上抓,抱著走到臺前攤開,開始刻。刻到第四道的時候,我的痕壓在原本的一道上,兩道疊在一起,變成一個誰都認不出來的形狀。

那一頁也被抽走了。

第三次我做完了。做完之後才看清楚:我把整頁重寫了一遍。念裡要改的只有中間那一句,別的地方原本沒有事。

臺上多出一疊廢紙,最上面那一張還濕著。

手把素紙揭了。

圖上那一角又露出來,那幾行字回到我知道的地方。第四道念跟前三次一樣。我從邊上抽出卷軸,攤在臺上,只改了中間那一句,別的地方沒有碰。

素紙被揉成一團,扔在牆邊。

手的主人拿起那片刻了兩行的玉板,走到門內側貼上去,一道法訣打進去,玉板就嵌在門上了。

那兩行我認得:一行是「說話要短」,一行是「要拆、要毀、要送出門的事,先問我」。

臺邊還有一塊。

那一塊是薄石,比玉板大,刻的是這間屋子的事:架上第幾層放什麼;卷軸的記號畫在背面,取之前先把卷轉過來;牆上那條裂縫引火之前先看靈石袋;還有一格畫了一道橫線,那一格不要動。

刻完,手的主人把薄石靠在臺沿那個缺角旁邊,沒有掛起來。

天黑之前,門上那塊玉板多了一行:動手之前,先把屋裡的東西看過一遍。

三行。手的主人退開一步,視線在牌上停了一會,沒有再刻。

燭熄了。手的主人走了。門響了一下。

門上那塊玉板亮著一點光。最後那一行的刻痕比前兩行淺。

牆邊那團素紙沒有人撿。


上一篇
狗食日記:狗食哪裡難吃當下就記,CLI 和 Desktop 寫進同一本 - Day 06
系列文
凡人修 Agent 傳-我這一生如履薄冰,你說我的 Agent 能結嬰嗎?8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言