用 Tmux 與 Tailscale 打造 Copilot 控制平面

Published: at 08:32 PM

我最近一直在嘗試一個看起來很簡單、但意外很有力量的想法:讓 Copilot CLI 繼續負責實際執行工作,但把控制介面搬到別的地方。

我不是坐在筆電前面盯著每一個任務,而是讓 agent 在桌機裡的 tmux 工作階段中執行,再用一個小型 Web App 包住它,並透過 Tailscale 連回來操作。最後得到的不是一套完全自主的 coding system,也不是傳統的本機終端機工作流程,而是介於兩者之間的東西:一個屬於我自己的 coding task 控制平面。

這正是我想要的中間地帶。

Table of contents

Open Table of contents

為什麼我要做這個

我日常的工作流程一直有個固定模式。我通常很清楚下一步該做什麼,但不想在整個過程裡一直被綁在機器前面。一次重構可能要 15 分鐘。修一個測試可能要 20 分鐘。如果我希望 agent 巡過多個檔案,文件整理甚至可能更久。

以前的流程大概是這樣:

  1. 打開筆電。
  2. 啟動 CLI。
  3. 等待。
  4. 監看進度。
  5. 重複。

這樣當然能運作,但它把我綁在單一裝置與單一地點,也會製造一種錯覺:好像任務進行的每一分鐘,我都必須在場。

我真正想要的是:

  1. 不論身在何處都能排入任務。
  2. 讓 agent 在我的桌機上執行。
  3. 用手機或平板查看進度。
  4. 只有在需要決策時才重新介入。

這就是我做這個 Web App 的原因。

用白話文說明整體架構

這套系統的設計刻意很樸素:

  • tmux 讓終端機工作階段在我斷線後仍然活著。
  • 我的桌機負責執行 agent 與它需要的 shell 環境。
  • 一個小型 Web App 充當任務管理介面。
  • Tailscale 提供私有網路存取能力,不需要直接把這台機器暴露到公開網際網路上。

從概念上看,大概長這樣:

Phone / Tablet / Laptop
        |
     Tailscale
        |
   Desktop Web App
        |
      tmux
        |
   Copilot CLI session

真正做重活的是桌機,瀏覽器只是控制面板。

這種分離很重要。當 agent 綁在我眼前同一個 terminal window 上時,我很容易把它當成互動式聊天工具;但當它跑在一個小型 dashboard 背後時,它開始更像一個工作佇列系統。

為什麼 tmux 是低調但關鍵的角色

tmux 一點也不花俏,但它確實解決了一個真實問題:連線一斷,terminal session 往往也跟著消失。如果我關掉 shell,或 SSH 連線中斷,我不希望任務也一起不見。

有了 tmux,我可以從工作階段中 detach、離開、晚點再回來。這讓它非常適合長時間執行的 coding 工作,例如:

  • 執行需要時間的測試
  • 套用跨多個檔案的重構
  • 檢查 log 或指令輸出
  • 等待 agent 完成一整串編輯

tmux 也提供了一個乾淨的邊界。每個任務都有自己的 session,所以我可以把一次重構和另一次修改彼此隔開。這點比我原本預期還有用:它降低了互相干擾的機率,也讓我事後更容易回頭檢視到底發生了什麼事。

為什麼 Tailscale 讓整體感覺更安全

我不想把這個 Web App 直接暴露在公開網際網路上。對一個個人專案來說,那會帶來比我想處理更多的安全工作。

Tailscale 給了我一個更簡單的模型:這個 App 只會在我的私有網路裡被存取。這代表即使我離開桌前,仍然可以用手機打開 dashboard,但我不需要為了驅動自己的 coding workflow,就先公開一個對外服務。

對於個人的控制平面來說,這正好是理想甜蜜點。

它在心理上也很有幫助。我知道這個 App 只有我的裝置能碰到,讓我更願意把它拿來做真實工作,而不是把它當成玩具。

這正是我想要的平衡

我一直把這套做法想成是在兩個極端之間找平衡。

一端是完全手動的 Copilot CLI 工作流程:我坐在機器前面、下指令,然後在任務執行時守在旁邊。這樣控制感最高,但也最消耗注意力。

另一端則是完全自主的 agent 願景:我只交付目標,系統就用極少監督自行往前跑。這當然令人興奮,但對於那些我仍希望一路調整方向的任務來說,自主程度有時又太高了。

我的控制平面就坐落在這中間。

它讓我能委派,但不會徹底消失。我可以查看進度、在看起來不對勁時中斷、也可以換一台裝置稍後再繼續。我依然要思考、審查與做決策,但我不再需要在整個過程中的每一分鐘都實際守在鍵盤前面。

以現在這些工具的成熟度來說,這正是我想要的抽象層級。

我的工作流程有了哪些改變

最大的改變不是速度,而是距離。

我離任務的機械細節更遠了,但反而更接近整個工作流程本身。我花更少時間盯著 terminal,花更多時間思考下一步應該發生什麼。

這個轉變會以一些很細小的方式出現:

  • 我在桌前開始工作,之後改用手機繼續。
  • 我讓 agent 處理例行性的編輯,同時自己去做別的事。
  • 我回到某個 session 時,看到的是足以審查的上下文,而不是一大堆讓人迷失的雜訊。
  • 我開始用任務與結果來思考,而不是用 shell 視窗來思考。

這是最讓我意外的部分。一旦控制平面存在,筆電就不再像宇宙中心。它只是多個 client 之一。

為什麼我覺得這是個好方向

我不認為每個開發者都需要自己做一個 agent dashboard。有些人會很滿足於只待在 terminal 裡,另一些人則會偏好自動化程度更高、由產品完整代管的解法。

但對喜歡自己動手調整的人來說,這層中間層非常有吸引力。它輕量、個人化,而且很容易繼續演進。我可以依照實際使用經驗,再加上佇列、任務標籤、session 歷史、更好的摘要,或更結構化的 prompts。

我最喜歡的地方就在這裡:這套系統現在已經實用,但它仍然保有很大的開放性。

我不是想把人類從迴圈中移除,而是想讓這個迴圈更容易長期維持。

到目前為止,這已經足夠讓這個專案變得非常有趣。