讓 T3 Code 住進 Dev Container
tags: T3 Code, Dev Container, WSL2, AI
category: AI
description: 讓 T3 Code 住進 Dev Container
created_at: 2026/10/05 16:00:00

前言
現在開發幾乎都是讓 AI Agent 去實作,一個專案丟出去之後就是等,等的時候當然不會乖乖看著它跑,會一邊做著其他事情,可能是再開第二個專案、第三個專案...,然後就變成同時開著 5 個甚至更多的 VS Code 視窗,一個螢幕只有一個是放大視窗,其他都堆疊上來,看到所有專案的狀態,然後切來切去,切到最後根本忘記哪個視窗在等我回覆,搞得很累。然後電腦的 。RAM 也很快就被吃光了...
於是就開始找有沒有工具可以把多個專案的 Agent 集中在同一個畫面管理。
另外還有一個次要的需求:我想試試看用手機遠端操作 Agent 繼續開發。先前出門在外想讓 Agent 繼續做事,都要很克難地用遠端桌面連回電腦,在手機的小螢幕上操作整個桌面,非常不方便。
不過我有一個前提:只要是認真要開發的專案,我的 Agent 都是跑在 Dev Container 裡面的(隨手試東西的那種就不一定),畢竟我是個很不喜歡汙染宿主環境的人(上一篇也提過),也不太放心讓 Agent 直接在宿主環境到處跑。
而我最後選的 T3 Code 並沒有直接支援 Dev Container,所以就有了這篇文章,以及這次實驗的三個產物:
- 一個
Dev Container Feature:devcontainer-t3code - 一支放在
WSL的小工具t3-dev(在同一個repo裡) - 一份繁體中文版的
T3 Code文件
先說在前面,這篇從頭到尾都還在「實驗」階段,我還沒有拿它正式開發過專案(現在才要開始嘗試),所以好不好用、穩不穩,等之後用久了有心得再來補(?)
事前準備
如果你想跟著玩,需要:
Windows+WSL2,且Docker是裝在WSL2裡面VS Code與Dev Containers擴充功能T3 Code桌面版(本文測試時是0.0.45)- 一個
Claude或其他Provider的訂閱
這篇的環境比較特定,如果你是
macOS或是直接在Linux上開發,Feature本身還是能用,但t3-dev這支小工具是針對「Docker在WSL、T3 Code在Windows」寫的;等有空再拿起Mac來做實驗補充。
為什麼不是 herdr
在找工具的時候,其實有兩個候選:herdr 和 T3 Code。
其實 herdr 也能解決我的主要問題:一樣可以同時開很多個專案,每個 Agent 現在的狀態也是一目了然。
單就主要需求來說,兩個都做得到,差別在於 herdr 是 TUI,T3 Code 是 GUI。
所謂工欲善其事,必先利其器,但「利」不代表一定要選比較硬派的那個(?)。除非 TUI 更能解決我的需求,或是這件事只有在終端機才做得到,不然有 GUI 能解決需求、操作又簡單,我覺得也算是符合 KISS 原則(?),像是看 diff 這種事情我還是習慣有個畫面。
所以最後選了 T3 Code。
補充:
herdr我只看過官方文件,並沒有實際使用,所以這段比較的只是「工具的型態」,不是在評論它好不好。
T3 Code 是什麼
T3 Code 簡單說就是一個幫你管理多個 Coding Agent 的 GUI,它本身不是 Agent,而是去操作你已經安裝好的 CLI(例如 Claude Code、Codex),所以用的是你自己的訂閱。
它的功能其實不少,這裡列一些我在文件和實驗中看到的(有些我只有稍微試一下,有些只看過文件):
- 多個專案、多個
Thread在同一個視窗,哪個在跑、哪個在等你一目了然 Queue與Steer:Agent還在跑的時候可以先排下一句話,或是直接插話修正方向Worktree:同一個專案開多條線同時做,互不干擾Diff面板:可以看工作目錄的變更、整個分支的變更,或是只看最近一輪對話改了什麼- 多種
Provider:同一個介面可以切換不同家的Agent - 遠端:除了本機之外,也可以連到別台機器上的環境,方式包含
SSH、區域網路配對、Tailscale,以及官方提供的T3 Connect - 手機:有原生的
App,可以用手機連回電腦看進度、回覆Agent - 其他像是
PR相關的操作、用量頁面、排程任務等等
題外話:興沖沖地想裝手機
App的時候才發現它要求iOS 18,而我的手機還是iPhone 8 Plus(iOS 16),直接被擋在門外。不過看起來還有其他方式可以從手機連回去,這部分之後再來實驗。
至於架構上,它分成兩個部分:
┌───────────────┐ ┌────────────────────────┐
│ 桌面程式(GUI) │ ───────► │ server + 你的 Agent CLI │
└───────────────┘ └────────────────────────┘
↑ 這一包叫做 environment
桌面程式負責畫面,真正去跑 Agent 的是一支叫做 server 的程式,而 server 所在的地方就稱為一個 environment。
平常你只裝桌面版的話,它會在背景自己跑一個 server,那就是「本機」這個 environment;而所謂的遠端,其實就是在另一個地方再跑一個同樣的 server,然後讓桌面程式連過去。
換句話說,只要想辦法讓 server 跑在 Dev Container 裡面,Agent 就會乖乖待在容器裡了。
聽起來很簡單對吧
用之前,先看了一下安全性
畢竟這類工具需要登入自己的 Agent 帳號,又會碰到我的專案,而我自己也算是比較在意資安的人,所以在安裝之前,先請 AI 幫忙把整個 codebase 掃過一輪,做了一點調查。
而且我連「掃 codebase」這件事都不太敢直接來,因為用 VS Code 打開一個不熟的專案然後按下信任,本身就有點風險,更何況還要放 Agent 進去讀。
所以我的做法是:程式碼從頭到尾都不落在宿主環境,把專案只在 Dev Container 開起來,Agent 也只在這個容器裡面讀,這樣不管 repo 裡有什麼,都被隔在容器內。
至於調查的結果,先講結論:
在我的
Agent看的範圍內,沒有看到惡意行為,也沒有看到主動把prompt或程式碼上傳的程式。
不過還是有幾點是我自己使用時會留意的,這裡保守地提一下,並不是要說它不好:
- 預設權限偏寬鬆:新的
Thread預設是Full access,建議自己改成比較保守的模式。 T3 Connect:這是官方提供的遠端連線服務,很方便,但連線會經過官方的基礎設施,似乎並不是端對端加密,等於需要多信任一方。它預設是關閉的,不登入就不會啟用,所以我目前選擇先不用,有遠端需求的話會先考慮其他方式。Agent碰得到的範圍:Agent能讀寫的範圍,基本上就是server所在的那個環境。直接用本機的話,那就是我在電腦上碰得到的所有東西;而把server放進容器之後,範圍就只剩那個容器,而且每個專案各自有一個server,彼此也是分開的。這也是我想讓它住進Dev Container的主要原因。
另外要強調幾件事:
- 這只是請
AI讀原始碼的靜態檢查,沒有實際做攻擊測試,我也不是資安專家。 T3 Code還在非常早期的Alpha版本,變動很快,上面這些很可能過一陣子就不一樣了。
所以請把這段當成「我自己的使用筆記」就好。能這樣把原始碼攤開來讓人看,本身就是開源專案最好的地方,也希望它之後越來越好。
踩坑紀錄
如果你只想知道怎麼用,可以直接跳到下一段。
第一版:每個容器開一個 Port
最直覺的做法:在容器裡把 server 跑起來,把 port 發布出來,然後在 T3 Code 用配對連結加進去。
兩個專案的時候看起來很美好,直到某一次連不上。
查了一下抓到兇手:VS Code 會自己去佔用它覺得需要轉發的 port,連別的視窗的容器的 port 也一起佔,而且視窗關掉、容器停掉之後還繼續佔著。
這大概也只有在
Windows+WSL2這種組合才會遇到,中間多轉了一手,Windows 雷就是特別多 XD
再加上每個專案都要自己記一個 port、每個容器都要配對一次,專案一多肯定會亂掉,所以這條路就放棄了。
第二版:改用 SSH
T3 Code 有另一個連線方式是 SSH,它會自己連進去、自己把 server 裝好跑起來。
但我的容器又沒有開 SSH,而且我也不想為了這個在每個容器裡跑一個 sshd、再去管金鑰。
後來想到一件事:既然我本來就能 docker exec 進容器,那 SSH 的連線直接走 docker exec 的標準輸入輸出就好了:
Host t3-myproject
User vscode
ProxyCommand wsl.exe -d Ubuntu -- docker exec -i -u root <container> <啟動一次性的 sshd>
這樣容器不用開任何 port,也沒有常駐的 sshd,更不需要金鑰 —— 畢竟能 docker exec 的人本來就已經能對容器為所欲為了,再加一把金鑰也擋不住誰。
第三版:Diff 面板是空的
SSH 連上了,Agent 也會動了,結果 Diff 面板顯示沒有變更,但 git status 明明就有。
這裡的主角是前面提到的 server(容器裡的那一個,不是桌面版在本機背景跑的那個):它只會提供「自己啟動時所在目錄」底下的 diff。
而 T3 Code 透過 SSH 幫你啟動 server 時,是從家目錄啟動的,但 Dev Container 的專案通常不會放在家目錄底下(以 VS Code 來說預設是掛在 /workspaces),於是就看不到了。
好在 T3 Code 連進去時,如果發現已經有 server 在跑就會直接沿用,所以解法就是:在容器啟動時,先自己從 / 把 server 跑起來,這樣不管專案放在容器的哪裡都涵蓋得到。
看到「從根目錄啟動」可能會有點怕,這裡稍微解釋一下:
- 啟動目錄影響的只是
server願意提供diff的範圍,並不會改變Agent的工作目錄,每個專案還是在自己的資料夾裡做事。 server一樣是用容器裡的一般使用者身分執行,不是root,權限沒有變大。- 這個
/是「容器的」根目錄,範圍還是在容器裡面,而容器裡的東西Agent本來就都讀得到。
所以實際上並沒有多開放什麼,只是讓 Diff 面板能正常運作。
到這裡東西已經多到不適合再用腳本複製貼上了,於是就決定包成 Dev Container Feature。
最後的做法
整理一下最後長這樣:
Windows WSL2 Dev Container
┌──────────┐ ssh.exe ┌──────────┐ docker exec ┌──────────────────────┐
│ T3 Code │ ────────► │ t3-dev │ ────────────► │ t3 server + Agent │
└──────────┘ └──────────┘ │ (只聽 127.0.0.1) │
└──────────────────────┘
Feature(t3-server):裝在每個Dev Container裡,負責安裝server、容器啟動時把它跑起來t3-dev:裝在WSL,負責把每個容器登記成Windows看得到的SSH主機
1. 專案加上 Feature
在專案的 devcontainer.json 加上:
"features": {
"ghcr.io/laijunbin/devcontainer-t3code/t3-server:0": {}
}
這個 Feature 只負責 T3 Code 的 server,並不會幫你裝 Agent 的 CLI,因為不是每個人都用同一家,要裝哪個應該由專案自己決定。
以我用的 Claude Code 來說,官方已經有現成的 Feature,加在一起就好:
"features": {
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {},
"ghcr.io/laijunbin/devcontainer-t3code/t3-server:0": {}
}
2. 在 WSL 安裝 t3-dev
只需要做一次:
curl -fsSLO https://github.com/laijunbin/devcontainer-t3code/releases/latest/download/t3-dev
bash t3-dev setup && rm t3-dev
它會在 Windows 的 .ssh/config 加上一行 Include(原本的檔案會先備份),並且裝一個背景服務,之後容器啟動、停止時清單都會自動更新。
3. 在 T3 Code 加入
重建容器之後,到 T3 Code 的 Settings → Connections → Add environment → SSH,下拉選單裡就會出現 t3-<資料夾名稱>,選下去就好了。
想知道目前有哪些容器可以連:
$ t3-dev list
HOST T3 CODE NAME STATE CONTAINER FOLDER
t3-my-blog t3-my-blog running 2cf4fc878917 /home/user/my-blog
t3-my-api t3-my-api running 613da7c37803 /home/user/my-api
每個專案都自動套用
如果你跟我一樣懶得每個專案都去改 devcontainer.json,可以直接寫在 VS Code 的使用者設定:
"dev.containers.defaultFeatures": {
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {},
"ghcr.io/laijunbin/devcontainer-t3code/t3-server:0": { "strict": false }
}
strict: false 的意思是遇到不支援的映像(例如 Alpine)就跳過,而不是讓整個容器建置失敗。
其他的選項、相容性與疑難排解都寫在 README 裡了,有中文版。
懶人包:之後我打算怎麼用
上面的設定都做完之後(t3-dev 裝一次、VS Code 的預設 Feature 設一次),之後開新專案的流程預計會是這樣:
$ wsl
$ cd ~
$ mkdir my-project
$ code my-project
- 在
WSL2的原生檔案系統建立專案資料夾,用VS Code打開(理由請看上一篇)。 - 加上
devcontainer.json,然後Reopen in Container。因為有設定預設Feature,這一步就會順便把Agent的CLI和T3 Code的server都裝好。 - 第一次進容器時,在終端機登入
Agent(例如執行claude)。 - 打開
T3 Code,Add environment → SSH,選t3-my-project。 - 進到這個環境的設定,把新
Thread的預設權限改成自己放心的模式。 - 在
T3 Code裡Add project,選容器裡的專案資料夾,然後就可以開始丟工作了。
之後同一個專案只要容器有在跑,打開 T3 Code 就能直接接著用。
第 3 步的登入預設是存在容器裡的,重建容器就要重新登入。如果不想每次都登入,需要自己把登入資料放到
volume,這部分跟T3 Code無關,就不在這篇展開了,實際上也可以自己包一個專門的Feature一樣掛在使用者設定裡,就可以無痛地保留登入狀態,我自己有包,可是畢竟比較敏感,就不特別公開了,雖然只是單純的掛 volume..。
那 VS Code 的 Agents 視窗呢
其實很早就知道 VS Code 偷偷在上面放了一個 Open in Agents 的按鈕可以打開 Agents 視窗,定位看起來跟我的需求很像,只是一直沒有認真去試,這次就順便試了一下。
首先是 Dev Container 的部分,它在 Agents 視窗裡目前還是實驗性的功能,我這邊也確實遇到了一些問題,像是它找不到容器、或是容器起不來,試了好幾次、換了幾種開啟方式,最後才總算成功跑起來,也能在裡面跟 Claude 對話。
不過跑起來之後才發現更大的問題:它的 Claude 是個有點奇怪的版本,預設情況下請求是經過 Copilot 轉送的,計費也是算在 Copilot 那邊,而不是我自己的 Claude 訂閱。
後來查到 VS Code 那邊也有人回報一樣的狀況,並且後續有對應的修正,看說明是可以改成直接使用自己的憑證,但需要額外設定,而且似乎還有些問題QQ..
所以至少在我寫這篇的當下,它還不太符合我「在 Dev Container 裡、直接用自己的訂閱」的需求,就先放著,搞不好過幾個月這段就過時了。
當時參考到的資料:
- Use the Agents window
- Choose and use an agent harness
- Allow Claude Agent to run through Anthropic subscription instead of Copilot quota (microsoft/vscode #314952)
- Claude agent native transport (microsoft/vscode #323037)
順便翻譯了文件
起初為了快速搞懂 T3 Code 到底在做什麼,我也請 AI 把官方 repo 裡的文件全部翻成了繁體中文,總共 78 篇。
除了翻譯之外,也針對新手補充了一些範例和名詞解釋,而這些補充的地方都有特別標示出來,不會跟原文混在一起,避免看的人分不清楚哪些是官方說的、哪些是我們加的。
網站在這裡:T3 Code 中文文件(非官方),原始碼放在 t3code-docs-zh-tw。
要特別提醒的是,這份文件是非官方的,而且是由
AI翻譯與補充、沒有逐頁人工校對過,所以可能有錯,也可能已經跟不上官方的更新,有疑問時請以英文原文為準(每一頁下方都有原文連結)。
結論
最後的成果其實就是兩行設定加上一行安裝指令,但中間繞的路比想像中多。
包成 Feature 之後,「要不要用這個工具」就變成一行設定的事,不喜歡拿掉就好,不會在宿主環境留下一堆東西
至於 T3 Code 本身,畢竟還在很早期的版本,未來會不會直接支援 Dev Container 也不知道,到時候這個 Feature 可能就功成身退了,那樣其實最好。
接下來就是實際拿它來開發專案了,用一陣子之後有什麼心得有餘力再來分享。
後記
這篇是第一次嘗試請 AI 先依照我的風格產生初稿再修改的文章,產出的速度變快了,但希望品質沒有變質,最終還是要靠自己把關。