用 Tmux 與 Tailscale 打造 Copilot 控制平面
我最近一直在嘗試一個看起來很簡單、但意外很有力量的想法:讓 Copilot CLI 繼續負責實際執行工作,但把控制介面搬到別的地方。
我不是坐在筆電前面盯著每一個任務,而是讓 agent 在桌機裡的 tmux 工作階段中執行,再用一個小型 Web App 包住它,並透過 Tailscale 連回來操作。最後得到的不是一套完全自主的 coding system,也不是傳統的本機終端機工作流程,而是介於兩者之間的東西:一個屬於我自己的 coding task 控制平面。
這正是我想要的中間地帶。
Table of contents
Open Table of contents
為什麼我要做這個
我日常的工作流程一直有個固定模式。我通常很清楚下一步該做什麼,但不想在整個過程裡一直被綁在機器前面。一次重構可能要 15 分鐘。修一個測試可能要 20 分鐘。如果我希望 agent 巡過多個檔案,文件整理甚至可能更久。
以前的流程大概是這樣:
- 打開筆電。
- 啟動 CLI。
- 等待。
- 監看進度。
- 重複。
這樣當然能運作,但它把我綁在單一裝置與單一地點,也會製造一種錯覺:好像任務進行的每一分鐘,我都必須在場。
我真正想要的是:
- 不論身在何處都能排入任務。
- 讓 agent 在我的桌機上執行。
- 用手機或平板查看進度。
- 只有在需要決策時才重新介入。
這就是我做這個 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。
我最喜歡的地方就在這裡:這套系統現在已經實用,但它仍然保有很大的開放性。
我不是想把人類從迴圈中移除,而是想讓這個迴圈更容易長期維持。
到目前為止,這已經足夠讓這個專案變得非常有趣。