AI agent 到底幫我做了什麼?用一個純文字檔做一個看得見的工作台

請 AI agent 幫你做完一件事,過兩天想找那份檔案,你只記得「它好像存在某個地方」。這是我這半年最常卡住的地方,而且每次卡住的都不是 agent 不夠強。

真正的原因很單純:你看不到它在做什麼、東西放在哪。Ben’s Bites 的作者 Ben Tossell 也遇到同一件事,他的解法不是再買一個待辦 App,而是做了一個「他和他的 agent 共用」的看板。

這篇除了拆解他的做法,我還在 Windows 上用 Node 重做了一個可以跑的版本,並附上三個瀏覽器引擎的實測截圖。


為什麼「agent 做了什麼」會變成一個問題?

單一 agent 還好。當你同時跑三個、五個——一個寫文章、一個回信、一個顧資料——事情會變成這樣:

  • 東西散在各處:這個 agent 存 E:\文章\,那個存 ~\Downloads\,第三個存在對話裡。
  • 你不知道進度:它說「處理中」,但處理到哪、要不要你決定,你看不出來。
  • 回頭查不到:兩週後你想知道「那張圖誰做的、放哪」,只能翻對話紀錄。

Ben 的說法很直白:他需要看得見才能理解。他原本是把一堆語音備忘丟給他的幕僚 agent,請它重新整理資料夾、把工作整併到一個地方,然後補了一句:

「就算這些東西存在你的對話記憶裡,我還是想要有一個地方,可以去看我的 to-do、可以自己打勾。」

他先做的是這件最小的事:一個他自己和 agent 都能看的待辦清單。

他做的是什麼?為什麼不是又一個待辦 App?

重點其實不在「清單」這個形式,而在人跟 agent 看著同一份資料。

一般待辦 App(Todoist、Notion)的問題是:agent 要能讀寫它,你得先接 API、處理權限、處理格式。Ben 的選擇是把它反過來——資料放在一個純文字檔裡,那個檔案你的 agent 本來就會讀寫。

他的成品叫 board,內容包含 to-do、email、CRM、網域,全部收在一個地方。有幾個設計細節很值得抄:

  • 狀態是用標籤寫在每一行尾端,不是另一個欄位:#today #in-progress #due:2026-10-30
  • 改狀態只是加標籤,永遠不會把那一行搬去別的段落
  • 有一頁「地圖」(map.md)說明每個領域的東西放哪、誰負責
  • 有一份「工作紀錄」,每個 agent 做出重要東西就加一行——那份不是給人讀的,是給 agent 回頭查「誰做的、放哪、什麼時候」

為什麼「檔案才是本體」這件事很重要?

這是整套設計的核心,也是最容易被做歪的地方:很多人的第一版會讓網頁自己也存一份資料,然後就開始處理同步衝突。

Ben 的原則是:網頁不保有任何自己的東西。

你打開網頁、勾一個待辦,實際發生的事情是:那個 Markdown 檔的那一行,從 - [ ] 變成 - [x]。反過來,你在檔案裡加一行,網頁過幾秒就會出現那一項。

這樣設計換到三個好處:

資料放檔案,換到三個好處
① 沒有同步問題
只有一份資料,不會出現「網頁上的跟檔案裡的不一樣」
② agent 不用學新格式
它本來就會編輯 Markdown,不需要接 API、不用處理權限
③ 備份=備份一個檔案
你的整個工作台就是一個 .md,要搬走、要版本控制都簡單

我在 Windows 上做了一個,怎麼做的?

原始做法有幾個綁 macOS 或綁他家服務的地方,我照樣移植不過來,所以我改成 Windows 能跑的版本。差異我列清楚:

他的做法我的 Windows 版
用 launchd 每 10 分鐘同步用 Node 本機服務,每次請求重新讀檔(不需要等同步)
用 here.now 託管+資料庫+email 驗證先做本機 localhost,託管列為之後的事
他自己的一套 agent 工具鏈就是這份 server.js + board.html

我的整份程式碼只有三個檔案:server.js(Node,只用標準函式庫)、board.html(介面)、todos.md(資料)。沒有資料庫、沒有框架、沒有安裝任何套件。

我自己在 Windows 上做的 agent 工作台:三個區塊、勾選框、標籤與截止日
這套系統只有三種東西
todos.md ← 唯一的資料
你的代辦、狀態、截止日,全在這一個檔案裡
board.html ← 只是個視圖
不儲存任何東西;關掉它,資料一行都沒少
server.js ← 翻譯蒟蒻
把檔案的每一行翻譯成畫面;勾選就回頭改那一行

實測結果:三件事真的成立嗎?

我在 Windows 上實際跑起來,用 Chromium、Firefox、WebKit 三個瀏覽器引擎各測一輪(同一份程式、同一份資料)。

三個引擎都通過
① 在網頁勾選,檔案真的被改
勾選前 - [ ] … #in-progress → 勾選後 - [x] … #done
② 改檔案,網頁自己跟著變
從外部程式把一行寫進 todos.md,網頁幾秒後就出現那一項
③ 狀態是標籤,不是欄位
勾選時把 #in-progress 換成 #done,那一行位置完全沒動

三個引擎的實測紀錄(原始輸出):

引擎勾選前勾選後檔案真的變
Chromium- [ ] … #in-progress- [x] … #done✅
Firefox- [ ] … #waiting- [x] … #done✅
WebKit- [ ] … #next- [x] … #done✅
實測:在網頁勾選待辦,todos.md 那一行同步變成已完成
實測:從外部把一行寫進 todos.md,網頁自動出現新項目

誠實標註:以上是我在 Windows 上用 Node 重做的版本。Ben 的原始版本跑在 macOS(用 launchd)並託管在 here.now,我沒有用他那套,所以他的建置數據(例如他提到某次改版用了 189、215、367 次工具呼叫)是他的,不是我的。

怎麼讓你的 agent 也遵守規則?

系統做好之後,真正的關鍵是「agent 要照規矩來」,不然它還是會把東西亂存。Ben 的做法是在 agent 的規則檔(AGENTS.md)裡寫清楚:

寫進 agent 規則檔的三條規矩
① 開始做某件事
把那一項在 todos.md 標成進行中(加 #in-progress)
② 做完
打勾,並在 worklog.md 加一行(誰、做了什麼、放在哪)
③ 要新增工作到看板上
先問過你,不要自己塞新任務進來

這一段的價值比程式本身高。真正的問題是:agent 會失控,通常是因為沒有出口規則,不是因為它能力不夠。它產出的東西如果沒有指定的落地位置和紀錄,它就會自己找地方丟。

工作台裡的「地圖」那一頁,就是把「東西放哪、誰負責」寫成一份可以隨時查的表:

工作台的地圖頁:每個領域的東西放哪、誰負責

還有一份「工作紀錄」,每次 agent 做出重要東西就加一行。這份不是給人讀的,是給 agent 回頭查的:

工作紀錄頁:agent 每次做出東西就加一行,方便日後回頭追

如果你也在意「AI 產出怎麼管」,這兩篇可以接著看的方向不同:〈AI 省了寫的時間,卻花了讀的時間:1 個框架讓你的 AI 產出第一次就對〉講的是產出品質,跟這篇講的產出流向是兩件事。

想自己做一個?最小可行版 3 步

不用一開始就做全套。順序是這樣:

  1. 先只做一個檔案。 開一個 todos.md,用 - [ ] 事項 #area/分類 #next 的格式寫進去。先讓你的 agent 習慣讀寫它。
  2. 再讓它能看。 加一支最小的本機服務(我用 Node 標準函式庫,約 150 行),把檔案畫成網頁、把勾選寫回檔案。關鍵:網頁不可以有自己的資料庫。
  3. 最後才加規則。 把「什麼時候要更新待辦、什麼時候要寫工作紀錄」寫進 agent 的規則檔。沒有這一步,前兩步會慢慢爛掉。

常見問題 FAQ

這跟 Notion 或 Todoist 有什麼不同?
差在資料放在哪。那些工具資料在雲端、要用 API 接;這套的資料就是你電腦上的一個 .md 檔,你的 agent 本來就會讀寫,不需要額外整合。

Agent 真的要能改我的檔案嗎?
這正是它有用的原因,也是風險。實務上建議:給它一個獨立的工作資料夾,並且每一項重要產出都要在 worklog.md 留一行,這樣你回頭查得到「誰做的、放哪」。

我不想自己寫程式,可以嗎?
可以只做第一步(純檔案)。但少了「看得見」這一層,你還是得靠翻對話紀錄來找東西。那正是這篇想解決的問題。

為什麼不直接在網頁上編輯,還要回頭改檔案?
因為那就變成兩份資料了。一旦網頁有自己的儲存,你就會遇到同步衝突,而那正是這套設計刻意避開的東西。

我可以用手機看嗎?
Ben 的版本有(他用 email 白名單控管存取)。我的 Windows 版目前只在本機 localhost,要上網得再處理權限,而這件事我還沒做,所以不亂說可以。


延伸閱讀


結語

Ben 那套系統最聰明的地方,不是他用了多強的模型,而是把資料放在一個最笨的地方——一個純文字檔。

檔案笨,但因為笨,人和 agent 才都能碰、都能懂、都不用學新東西。真正需要設計的是「規則」,不是「架構」。

如果你手上也同時跑著幾個 agent,我建議從最小的一步開始:先開一個 todos.md,請你的 agent 把待辦寫進去,其他都先不要做。光是這一步,你就會開始「看得見」——因為你終於有一個地方,可以確認它到底做了什麼。

(本文的原始案例來源:Ben’s Bites — How I built my ‘everything’ app 與完整實作說明;程式與截圖為我在 Windows 上的實測版本。)