照著這篇做完,你會有一個終端機窗格在跑 Claude Code,另一個在跑 Codex,旁邊還有幾個聊天和代理同時進行。osFoundry 的一張看板就能列出全部。當 Claude Code 停在「Do you want to make this edit?」時,它的卡片會在一秒內移到 Needs you(需要你)欄。點一下就會打開停在那個提示的窗格。你回答之後,卡片就回到 Running(執行中)。
誰負責什麼
| Claude Code | osFoundry 桌面應用程式 | |
|---|---|---|
| 登入 | 用它自己的 Claude 登入,在它自己的行程裡 | 完全不經手。對它自己啟動的代理,會移除繼承來的 ANTHROPIC_API_KEY,避免用訂閱跑的工作被當成 API 計費 |
| 在哪裡執行 | Terminal 畫面裡的真實 PTY,位於你的專案資料夾 | 擁有這個 PTY,並保留一份模擬出來的畫面副本 |
| 誰來核准 | 你,在 Claude Code 自己的權限提示裡 | 從不替你回答。只會移動卡片、打開窗格 |
| 怎麼得知狀態 | Claude Code 照常繪製它的介面 | 每 700 ms 依照公開的規則讀取畫面;若代理是它啟動的,也會接收 hook 回報 |
| 資料留在哪裡 | 你的檔案、你的終端機 | 畫面文字只留在你 Mac 上的應用程式記憶體裡。結束代理 session 時,會把摘要寫進你的知識檔案 |
設定
- 打開 Terminal 畫面(側邊欄 Main → Terminal,
/terminal),照平常的方式啟動代理。每個窗格都是獨立的 PTY。
~/code/shop-api (fix/checkout-retry) $ claude
~/code/shop-web $ codex
osFoundry 會依據占用終端機的程式認出 Claude Code;如果你是透過包裝腳本啟動的,就從它的畫面來判斷。不需要任何設定。
- 打開 Sessions(側邊欄 Main → Sessions,
/sessions)。每個聊天、單一代理、團隊、迴圈和終端機 session 都是一張卡片。欄位依序是 Running、Needs you、Paused(已暫停)、Idle(閒置)、Done(完成)和 Failed(失敗)。你不能把卡片拖進某一欄來設定它的狀態;卡片在哪一欄,取決於 runtime 回報的狀態。
- 點 Filter(套用篩選後會顯示 Filtered),勾選 Needs me only(只看需要我的)。種類(Chat、Agent、Team、Loop、Terminal)和時間範圍維持原樣。
剩下兩張卡片:一個提出問題的聊天,以及 shop-api 裡的 Claude Code 終端機。
聊天的最新訊息如果以一個還在等回答的問題結尾,就會出現在這裡。終端機則是在狀態為 blocked 時出現在這裡,也就是下一步要看到的畫面。
- 點
shop-api卡片。Terminal 畫面會在那個窗格打開,提示還停在上面。左側的 rail 把 Claude Code 標示為「Needs you · shop-api」,Codex 標示為「Working · shop-web」。
開了好幾個窗格時,Mod+.(Mac 上是 ⌘.)會跳到下一個需要你的代理。狀態列上也寫著:「⌘. to jump to what needs you」。
- 像在任何地方一樣,直接在窗格裡回答:在
1. Yes上按 Enter。Claude Code 會繼續工作,下一次掃描時,rail 和看板就會重新顯示為 Working / Running。
- 代理 session 做完、停在 Idle 時,把它的卡片拖到 Done。應用程式會先詢問。
按下確認會先寫好摘要,再結束 session。如果摘要失敗,session 會留在原處。執行中的 session 根本無法放到 Done:「This session is still running. Pause it first, then end it.」(要先暫停,再結束)。
實際跑一次
範例。以下是截圖裡的那個窗格,以及 osFoundry 對每個畫面做出的判斷。這些判斷來自 Claude Code 的規則檔 claude.toml,它隨應用程式一起提供,也放在 osfoundry.io/agent-detection/claude.toml。
~/code/shop-api (fix/checkout-retry) $ claude
● Retry now reuses the first charge. Updating the payment code.
Edit file src/payments/charge.ts
41 - const intent = await stripe.paymentIntents.create(params)
41 + const intent = await stripe.paymentIntents.create(params, {
42 + idempotencyKey: `charge-${order.id}`,
43 + })
Do you want to make this edit to charge.ts?
❯ 1. Yes
2. Yes, allow all edits during this session
3. No, and tell Claude what to do differently
畫面 state 符合的規則 卡片
spinner、"esc to interrupt" working esc to interrupt Running
上面的提示 blocked Do you want to (proceed|continue|make this edit|create) Needs you
... 你在 "1. Yes" 上按 Enter
又出現 spinner working esc to interrupt Running
● Update(src/payments/charge.ts)
⎿ Updated src/payments/charge.ts with 3 additions and 1 removal
● Bash(npm test -- payments)
⎿ Tests: 42 passed, 42 total
● Fixed. A second press of Pay now reuses the first charge.
blocked 規則刻意放在 working 規則之上。提示出現時,Claude Code 的頁尾仍可能顯示「esc to interrupt」,而第一條符合的規則會勝出。
界線在哪裡
osFoundry 從不替你回答提示。其他代理可以透過應用程式的 runtime_send 工具在窗格裡輸入,但它會拒絕正在等待決定的窗格。回答要經過另一個名稱不同的工具 runtime_answer,而且每一次回答都由你確認。這項檢查是在輸入的當下重新讀取畫面,而不是看上一次掃描的結果,所以前一刻才跳出的提示,不會吃掉原本要當成一般文字輸入的按鍵。
osFoundry 讀不懂的畫面會回報為 Idle,絕不會是 Needs you。detect.rs 裡的註解說明了原因:只要誤報一次,大家就不再相信這個徽章,之後連真正的提醒也白費了。所以當規則沒有把握時,應用程式寧可少報,也不多報。
規則是資料,不是程式碼。下載的規則檔只能改變哪些模式會符合,除此之外什麼都不能改,也無法改變要執行哪個程式。你自己的覆寫設定放在 ~/.osfoundry/agent-detection/claude.toml。
終端機文字留在桌面應用程式的記憶體裡。只有你結束的 session 會在窗格之外留下痕跡:它的摘要會寫進你的知識檔案,而且是在任何東西被歸檔之前寫入。
下一步
在另一個資料夾再啟動一個 Claude Code,給兩者各一個需要修改程式的任務,然後把 Sessions 看板篩選成 Needs me only,再去做別的事。如果你還沒有桌面應用程式,可以到下載頁面取得。






Top comments (0)