Ollama 的網頁前端,單一 HTML 檔 —— 不需要建置、不需要 Node.js、不吃任何 CDN。
它不只是聊天介面:接上工作區之後,模型會自己讀檔、寫檔、建環境、跑測試, 全程在你自己的機器上,可以關進沙盒,每一次改檔案都留得住還原點。
python serve.py --ollama http://192.168.1.20:11434Python 3.8+,只用標準函式庫,不用 pip install 任何東西。瀏覽器會自己打開。
想直接按兩下 zackllmgui.html 也可以,只是 Ollama 那台要設 OLLAMA_ORIGINS,
而且解析 PDF / Word 與本機工具用不了。兩種方式的差別見使用手冊。
Linux 與 Windows 11 都已實機驗證;macOS 路徑已實作但尚未實機驗證:
| 狀態 | |
|---|---|
| Linux | ✅ 實測。工具、沙盒(bubblewrap)、C/C++ 那四條回饋線、python -m sandbox 全部跑過 |
| Windows 11 | ✅ 實測。本機工具、cmd 程序管理、CPU/RAM/NVIDIA GPU 資訊、Docker Desktop 沙盒與容器 GPU 全部跑過。MSVC/MinGW 的實際編譯還沒跑過(那台沒有 C++ 工具鏈) |
| macOS | 🛠️ 寫好了沒驗。seatbelt 後端走系統內建的 sandbox-exec |
| C# | 🛠️ 三條回饋線寫好了,但沒有 .NET 的機器跑過。符號抽取拿手寫的 .cs 驗過,dotnet test 那條是用假的 dotnet 驗的 |
會踩到平台差異的是本機工具那一塊:沙盒挑哪個後端、run_shell 走哪個 shell、
編譯器怎麼呼叫、危險指令怎麼寫。純聊天(不開工作區、不開工具)跑得動 Python 就行。
每個平台各走各的,不互相影響。 危險指令的規則、程序樹怎麼收、CPU/RAM 從哪裡讀、
compile_commands.json 怎麼拆,都是照這台的作業系統挑一套,不是兩套疊著跑 ——
所以 Windows 的 del /s 規則不會在 Linux 上把 python3 -c "del cache[k]" 判成危險。
沒驗過的那幾條刻意寫成失敗就退回沒有,不會退回亂報:認不出來的編譯器直接
跳過語法檢查,挑不出沙盒後端就告訴你這台該裝什麼,缺工具鏈就跳出來問你。
到那台機器上先跑一次 python -m sandbox —— 它會實際執行一遍逐項驗證,
不是讀設定檔猜的。要幫忙補驗的話,
tech.md 有一份逐條的清單。
| 思考模式 | 控制項依模型能力自動變形:gpt-oss 給四段、qwen3 給開關、沒有的整組停用並完全不送 think 欄位 |
| 本機工具 | 讀檔、寫檔、列目錄、搜尋、run_shell、run_tests、setup_env、git、連網瀏覽、看圖 |
| 它看得到瀏覽器的錯 | 頁面丟出的 JS 例外、沒接住的 promise、console.error 會送回 serve.py,模型用 read_console 讀。改壞前端最常見的樣子是「頁面照樣載入、某顆按鈕不動」——那種錯原本只留在 F12 裡。讀完就清空,所以重新整理再讀一次,還有東西就是沒修好 |
| 改前端不必手動重整 | frontend/ 一改,頁面自己重新整理(serve.py 沒變就不重啟,重啟會殺掉正在跑的工具)。改 → 重載 → 壞了就回報 → 模型讀得到,這一圈自己會轉 |
| 它看得到圖 | view_image 把工作區裡的 png/jpg 放進模型的 context —— 截圖、設計稿、測試產出的圖表都算。沒有內建的截圖工具是刻意的:讓它自己寫腳本、run_shell 跑出一張圖,再用這支看結果,你手上有 selenium 還是 scrot 它就用哪個。模型沒有 vision 就不送這支工具 |
| 語言支援(Linux 完整實測) | Python 與 C/C++ 有完整的一套(專案地圖的符號、寫檔後語法檢查、驗證指令預填、測試辨識);JS/TS 有地圖與 eslint。Windows 的一般工具流程已驗,MSVC/MinGW 的完整 C/C++ 流程尚未實測。其他語言用 run_shell 一樣做得完,只是少了這幾條回饋 |
| 塞不進 context 的輸出不會消失 | 跑壞的測試、大 diff、裝套件的錯誤動輒好幾萬字。截掉就丟的話最該細看的那些永遠找不回來 —— 所以全文落地成 .zackllmgui-out/ 底下的檔案,只把頭尾與路徑給模型,它自己 search_files 去挖。那個資料夾會寫進 .git/info/exclude,不會變成你 git status 上的雜訊 |
| 長指令丟背景 | npm install、cargo build 這種跑幾分鐘的加 background,模型先去做別的再回來收;關掉分頁它還在跑 |
| 沙盒 | Linux 用 bubblewrap、macOS 用 sandbox-exec、Windows 用 Docker Desktop 容器;Linux 與 Windows 11 已實測。預設關,按鈕開。bwrap 自動接 GPU,容器要明確加 --sandbox-gpu |
| 權限規則 | 確認卡上的「以後都放行」把這次的判斷寫成一條規則,不用每天重新點。allow / ask / deny 寫成檔案,專案與全域兩份都讀,deny 由 serve.py 強制 |
| 專案地圖 | 開工作區時就算好「有哪些檔案、每個檔案裡有什麼」放進系統提示。模型不必再花三五輪 list_dir/search_files 猜檔名 —— 而每一輪的成本是重吃一次整份 context |
| 上一則對話學到的,這一則還記得 | remember 把「測試要先 source .venv」「gen/ 是產生出來的別改」這種讀原始碼看不出來的事寫進 <工作區>/.zackllmgui-notes.md,下一則對話開頭自己讀進去。AGENTS.md 是你寫給它看的,只進不出 —— 少了這一份,每開一則新對話它就重新學一次同樣的東西。純文字,你自己編輯或整份刪掉都可以 |
| 改完自動檢查 | 模型寫完 .py/.js 自動跑 linter,錯誤直接回灌給它。不用設定、沒有開關 |
| 檢查換成你自己那套 | 內建的 linter 只認 ruff/eslint/-fsyntax-only。.zackllmgui-hooks.json 裡寫一行就能改掛 mypy、shellcheck、clippy、gofmt -l,輸出走跟內建同一條回灌路徑。專案與全域兩份都讀。不過 shell —— 那個檔跟著專案走,要管道就自己包成腳本再掛上來 |
| 收工前攔一次 | 寫了測試卻沒跑過就說「做完了」?推回去讓它跑完再收工 |
| 收尾要驗過才算 | 設一條驗證指令(pytest、npm test…),模型說做完時自動跑一次,沒過就把輸出丟回去讓它接著修。兩次沒過交還給你,並且留一顆「退回這一輪」 |
| 做到了沒不由它自己說 | 收尾複查(預設關,選單開):模型說做完時,另外開一次乾淨的呼叫,只給它原始要求與這一輪的 git diff,不給它自己的推理過程。沒做到就把具體漏了什麼丟回去 |
| 型別檢查排在測試前面 | 有 tsconfig.json 就預填 npx tsc --noEmit && npm test:jest 多半不做型別檢查,而「改了簽名沒改呼叫端」正是自主改多檔最常犯的錯。專案自己設了 mypy 也會加上去 |
| 子代理可以用別的模型 | 選單裡選一個「子代理模型」,或在 agents/*.md 裡指定。只 load 得動一個模型的機器維持預設(跟主模型一樣)就好 |
| 中斷可以續跑 | 按停止之後一鍵接著跑,從斷掉的字接下去,不是重講一遍 |
| 排一串放著跑一晚 | 輸入框裡用單獨一行 --- 隔開就是一串任務:第一件立刻送,其餘的等前一件真的做完(含收尾驗證與複查)才送。跟「跑到一半可以插話」是兩回事 —— 插話會併進正在跑的那一輪,任務各自是完整的一輪,各自有還原點。佇列存在對話上,頁面重整還在 |
| 沒有人在的時候它會自己接著跑 | 全自動模式下停在輪數上限、或停在「收尾驗證沒過」,它自己按「繼續」,最多三次 —— 而且每次都要先講一句「還差什麼」。使用者按停止不算:那是明確的指令 |
| 問了沒人答不會卡死 | 自動模式下 ask_user_question 等三分鐘就讓模型自己判斷繼續,並要它交代假設了什麼。放著跑一整晚,一張沒人按的卡原本等於整輪靜靜地掛著 |
| 它知道自己在哪個分支 | 分支與未 commit 的檔案數寫進系統提示。不講的話它會直接 commit 到 main,或把你原本就沒 commit 的改動算成自己的成果 |
| 跑到一半可以插話 | 打字按 Enter 排進佇列,不中斷正在跑的工具,下一輪跟工具結果一起送過去 |
| 看得出它在幹嘛 | 進度條顯示已跑多久(秒數自己走)、背景有幾條在跑、「現在:<第一個未完成的待辦>」;一輪跑完在對話裡留下總計 |
| 跑了多久留得住 | 沒東西在跑的時候那一條顯示「這則對話累計 18 分 4 秒 · 42 輪 · 96 次工具」。數字存在訊息上,關掉瀏覽器再開還在 |
| 放著跑就跑到完 | 本機模型沒有時間與用量上限;只有 200 輪的失控煞車,撞到也是留一顆「繼續」。外部 API 按量計費,所以那邊有 token 上限 |
| 模型知道還剩幾輪 | 剩五輪以內開始提醒,剩兩輪叫它收尾 —— 不然它會把時間花在探索,最後停在一半 |
| 改待辦不用打斷它 | 待辦清單同時是工作區裡的一份 markdown,跑的時候直接編輯,下一輪就同步進去 |
檔案:行號 可點 |
模型寫的 wafer_counter.py:42 點一下就跳到檔案分頁那一行並亮起來 |
| 待辦有相依 | 可以標「要等 #2」,卡住的與可以做的分開算,不會看起來像五件事都沒動 |
| 連不上會重試 | 三次退避重試並倒數,連不上時送出鍵也不再是灰的 |
| 改了就自己重開 | 動過 serve.py 的程式碼,它會自己重啟、網頁跟著重整 —— 不會出現「改好了卻沒生效」 |
| 每個分頁各做各的 | 工作區、修改權限、自動模式、待辦、計畫、MCP 連線都跟著分頁走 —— 兩個分頁開兩個專案不會互相蓋掉 |
| 重開接回設定 | 那些狀態住在 serve.py 的行程裡,重啟就沒了;開頁面時自動接回來並告訴你接了哪幾項 |
| 側欄可拖寬 | 左右兩側都能拖,雙擊還原,寬度記住 |
| 還原點 | 一輪一個:每則提示送出前照一張 git shadow commit,那一輪動過的檔案掛在底下(含 run_shell 改的)。commit 只記變更數,不寫提示、對話 id 或本機絕對路徑。點一列會先跳到你當時說的那句話再問,只動檔案不動對話。沒改到東西的那一輪不會多長一列,那一列會改名成新的那句話 |
| 子代理 | 把一段查找丟給另一個 context 去做,只把結論帶回來。型別是 agents/*.md 裡的檔案,加一種不必改程式;工具清單由 serve.py 強制,唯讀的就是唯讀的。會改檔案的跑在自己的 git worktree 裡(.venv 用讀的借、node_modules 用連的借,不必重建環境),所以可以平行跑 |
| 子代理停得住、收得回來 | 每張卡片一顆「中斷」,或打 /agents 挑一個,連後代與背景指令一起停。改完自動 commit 到自己的分支,回報時附上 git diff --stat 與一句可以直接貼的 git merge;serve.py 重啟過也不會留下「沒人認得的資料夾」 |
| 對話存 IndexedDB | 不再卡在 localStorage 的 5MB;一則對話一筆,只寫改動的那一則。資料不出這台瀏覽器,伺服器只出算力 |
| skills | 對話框打 / 叫出,也可以讓模型自己判斷要不要載入。正文寫 !`git status` 就能帶著現場狀態載入;用不到的(工作區唯讀而它要改檔案)不會列給模型看 |
| 新增資料夾 | 檔案分頁上的「+資料夾」,打 src/utils 一次開好幾層。跟檔案工具同一道邊界,但不必勾「允許修改檔案」——那道開關管的是模型 |
@ 提檔案 |
打 @ 列出工作區檔案或資料夾;選資料夾會一次附整包(有上限,超過會講清楚少了幾個) |
| context 管理 | 用量條、到 80% 先瘦身工具輸出、壓縮後告訴你省了幾 K;過 75% 在背景先把摘要算好,放著跑到 85% 就自己壓 —— context 滿了不會報錯,是默默把最前面的訊息丟掉 |
| 附加檔案 | 純文字、程式碼、PDF、Word、圖片(vision 模型);貼上大段文字自動收成附件 |
| 多模型比較 | 同一個問題同時送給多個模型,並排看 |
| 模型管理 | 拉取、刪除、看 Modelfile,帶進度條 |
| 外部 API | 同一個介面也能接 OpenAI 相容端點,工具也能用(勾「送出工具定義」) |
上面每一個開關都在網頁裡按,不用重開 serve.py,也不用去改設定檔。
python serve.py 起來之後,工具、連網、沙盒、自動模式、允許規則
全部在這個選單裡調 —— 指令列的旗標只是「開機就是這個狀態」的預設值。
四道關卡,由外而內:
- 子代理的工具清單決定「這一個子代理能叫哪幾支」—— 寫在
agents/*.md, 由serve.py的agent_guard()強制。explore就算吐出write_file這個字串 (模型幻覺、提示詞注入)也會被拒絕。網頁那端的過濾只是「不給它看到」,不算關卡。 (只對子代理生效;主代理沒有這一層。) - 自動模式決定「要不要問你」——五檔,每一檔的名字就是它多放行的東西:
每次都問/唯讀自動/改檔案自動/跑指令自動/工作區內全自動。
平常待在「改檔案自動」:改檔案有還原點,跑指令沒有。
最後那一檔連
rm、mv、chmod也不問,但只限路徑全都在工作區裡的 (serve.py的ws_scoped()判,動到工作區外、sudo、裝套件照樣問)—— 放著讓它自己跑測試用的。沙盒開著時它會放行全部 ⚠ 級指令,因為那時候 「動不動得到工作區外」不必再從指令去猜。它管的是問不問,不是能不能做。 - 權限規則的
deny決定「能不能做」—— 在serve.py裡強制,網頁怎麼點都繞不過。 - 沙盒決定「做了會影響到哪」—— 工作區以外唯讀、憑證目錄蓋掉、斷網。
改檔案前一律備份到 <工作區>/.zackllmgui-backup/,run_shell 的高風險指令直接擋下來。
這支程式會在你的專案裡動的只有三樣,都是它自己的東西:那份備份、塞不進 context
的工具輸出落地用的 <工作區>/.zackllmgui-out/,以及模型自己的筆記
<工作區>/.zackllmgui-notes.md(三個都寫進 .git/info/exclude,不會出現在你的
git status 上;.gitignore 是你的檔案,這支程式不動它)。
.zackllmgui-hooks.json 與 .zackllmgui-rules.json 是你的設定檔,只讀不寫。
另外,只有這支服務自己開出來的那一頁叫得動它、也才讀得到它 —— 你開著它的時候
逛到的別的網頁不行(same_site();沒有這一道的話,一張跨站的表單就能跳過上面每一格,
而網域指回 127.0.0.1 的那種把戲連 GET 都繞得過去)。
擋得住什麼、擋不住什麼寫在 safety/README.md,別跳過那份。
順帶一提:沙盒裡裝得動套件,也吃得到 GPU。Linux bwrap 實測
torch.cuda.is_available() 是 True;Windows 11 的 Docker Desktop 容器也已透過
--sandbox-gpu 看到 RTX 3080。bwrap 不換掉檔案系統,宿主機的 pytest、gcc、node、
CUDA 驅動本來就在那裡;容器則必須自行準備映像檔內的工具鏈與 CUDA runtime。
細節見 sandbox/README.md。
| 專案地圖的符號 | 寫檔後語法檢查 | 驗證指令預填 | 測試辨識 | |
|---|---|---|---|---|
| Python | ast |
ruff,沒裝退回 ast |
pytest -q |
✅ |
| C / C++ | 正規表示式 | -fsyntax-only(需 compile_commands.json;MSVC 走 /Zs,沒驗過) |
ctest / make test |
✅ |
| C# | 正規表示式 | ❌(見下) | dotnet test |
✅ |
| JS / TS | 正規表示式 | eslint(沒裝就跳過) |
npm test |
✅ |
| 其他 | 只列檔名 | — | — | — |
沒列到的語言照樣做得完——run_shell 不限語言,收尾驗證指令是你自己填的字串。
少的只是上面那幾條回饋,模型得多花幾輪自己補。
工具鏈不在就先問你。 開了一個 C# 專案但這台沒裝 .NET SDK(或 C/C++ 專案沒有
編譯器),介面會跳一次確認告訴你要裝什麼、要不要開下載頁。只提醒,不代裝 ——
裝 SDK 是你的決定,而且沙盒裡本來就沒有網路。裝好之後重新整理,
dotnet test 的預填與 C# 的操作規則就自己出現了。
C/C++ 專案裡 run_tests 與 setup_env 不會出現在工具清單上:那兩支是 pytest
與 .venv 專用的,送出去只會讓模型拿去跑一個沒有 pytest 的專案。編譯測試用
run_shell 跑 cmake / ctest,這件事會寫在送給模型的規則裡。
沙盒沒有網路,所以
FetchContent、vcpkg、conan 一定失敗。 相依套件要先在 沙盒外準備好(apt install libgtest-dev,或先跑一次cmake讓它下載完)。 Python 那邊有setup_env當唯一的連網入口,C/C++ 刻意不開第二個 —— 每一個連得出去的入口都是安全邊界上的洞。
C# 少的是「寫檔後語法檢查」那一格。 C 有翻譯單元,所以
gcc -fsyntax-only a.c成立;C# 的一個class拆在幾個檔案裡是常態,csc單獨編一個檔會對每個寫在 別處的型別噴 CS0246 —— 那不是缺-I能補的,是語言本身沒有這個概念。 整包dotnet build每寫一個檔跑一次撐不住,所以這一格留白。其餘三格都在。
compile_commands.json 會在這幾個地方找:專案根目錄、build/、
cmake-build-*/(CLion)、out/build/(Visual Studio 的開啟資料夾模式)。
沒有就跳過 —— CMake 加 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 就會生一份。
上面這一整套是在 Linux 上驗的:bubblewrap 沙盒裡 cmake configure → build →
ctest 全過,edit_file 拿掉一個分號馬上回語法錯誤,gcc/g++/nvcc 與
顯示卡在沙盒裡都看得到。
Windows 11 的服務、本機工具、系統資訊與 Docker 沙盒已實測;MSVC/MinGW 的完整 C/C++ 流程與 macOS 尚未實機驗證。 編譯器辨識支援 MSVC(
cl.exe走/Zs)、 MinGW 與 Clang,交叉編譯器與版號(arm-none-eabi-gcc、clang++-18)也算。 Windows 沙盒走容器,預設映像檔沒有編譯器,用--sandbox-image gcc:14換掉; NVIDIA GPU 再加--sandbox-gpu(需要 NVIDIA Container Toolkit)。 認不出來的編譯器一律跳過不做檢查,所以最壞的情況是少一條回饋,不是一排誤報。
模型寫完 .py 或 .js,馬上跑一次 linter,錯誤接在工具結果後面回灌給它 ——
下一輪它自己就修掉了,不用等你發現。
已寫入 wafer_counter.py(412 字元)
[ruff] 這是剛剛寫入的檔案的檢查結果,請修掉:
wafer_counter.py:3:8: F401 [*] `os` imported but unused
沒有設定檔,也沒有開關。 裝了 ruff 就用 ruff、eslint 就用 eslint,
兩個都沒有的話 .py 還是會用標準函式庫的 ast 檢查語法 —— 模型最常寫壞的就是那個。
什麼都沒裝就安靜跳過,不會變成噪音。
C/C++ 走 -fsyntax-only,但編譯旗標一定要是真的:
已修改 calc.c(1 處)
[語法檢查] 這個檔案編不過,請修:
calc.c:2:37: error: expected ';' before '}' token
旗標從 compile_commands.json 讀(CMake 開 CMAKE_EXPORT_COMPILE_COMMANDS=ON
就會生,clangd/clang-tidy 也吃它)。沒有那個檔就跳過 —— 直接 gcc -fsyntax-only
在任何有自訂 include 路徑的專案上都會噴「找不到標頭檔」,那是缺 -I 不是程式碼有錯,
而誤報比沒有更糟。
只跑唯讀的檢查,不跑
black/prettier這種會改檔案的。 在模型背後改掉檔案,它手上的內容就過期了,下一次edit_file的比對會對不上。 這是 aider 的--auto-lint(預設開)那一套 —— 不用設定就有。 要換成 mypy/shellcheck/clippy 才需要寫那一行.zackllmgui-hooks.json, 而且那條也一樣只該掛唯讀的檢查。
上面那些湊起來實際長什麼樣。工作區裡只有一批標注資料:12 個 labelme 標注檔。沒有程式、沒有 README、沒有任何說明。 跑指令自動 + 沙盒開啟,丟一句話進去:
讀
N_wafer_json/底下的 labelme 標注檔(每個 shapes 元素是一片 wafer),算出這批資料 總共標了幾片。寫成wafer_counter.py,附上 pytest 測試,最後跑一次測試確認會過。
然後就沒有再按過任何確認:
11 輪、12 次工具呼叫。 它做的事情按順序是:
| 工具 | 做了什麼 |
|---|---|
load_skill |
自己決定要載入 run-pytest 這份技能,沒有人叫它載 |
list_dir |
先看資料夾裡有什麼 |
run_shell ×2 |
開一個 JSON 出來看格式,再掃過全部確認,沒有用猜的 |
write_file |
寫 wafer_counter.py |
write_file/edit_file ×2 |
寫 test_wafer_counter.py,再自己改兩版 |
setup_env |
在沙盒裡建 .venv、pip install pytest |
run_tests |
5 passed in 0.01s |
run_shell |
真的跑一次程式,答案是 380 片 |
從第一個檔案落地(10:11:52)到測試變綠(10:14:24),2 分 32 秒。
值得看的是它沒有猜資料格式:先用 run_shell 開一個檔案出來確認 shapes 長什麼樣,
才動手寫程式。測試也是它自己想的五個案例,其中一個是拿真實的那 12 個檔案做整合檢查 ——
不是只測會過的路徑。
這個任務先前用另一個模型跑過一次,答案一樣是 380。 那一輪的完整痕跡比對(怎麼從硬碟上反推它確實在沙盒裡跑完)在使用手冊。
產出的檔案就在右邊的檔案分頁裡,點一下直接看:
這個例子錄的是單一代理跑完一件事。後來加的子代理、worktree、自動壓縮不在裡面 —— 那些在上面的功能一覽。裡面每一支工具現在跑起來都還是一樣。
venv 還是沙盒?兩個都是。 沙盒是箱子,venv 是箱子裡的環境:
setup_env在沙盒裡建.venv,run_tests再用那個.venv的 python 跑,全程沒有離開箱子。
| 文件 | 回答什麼問題 |
|---|---|
| README.md(這份) | 這是什麼、能做到什麼 |
| manual.md | 每個功能怎麼用、快捷鍵、資料存在哪、專案結構。功能分成八組,段首有目錄 |
| tech.md | 為什麼這樣做 —— 看程式碼之前先看這份。分七組,開頭有「這份文件怎麼讀」 |
| safety/README.md | 安全邊界:擋得住什麼、擋不住什麼 |
| sandbox/README.md | 各平台的沙盒支援到什麼程度,以及 GPU 哪些驗過哪些沒有 |
| skills/README.md | 內建 skills,以及怎麼寫自己的 |
| agents/README.md | 子代理型別怎麼寫,哪幾支工具永遠不給 |
| docs/shots/README.md | 上面那幾張截圖怎麼來的、要重截的話怎麼跑 |
| plan-agent.md | 還沒做的,與為什麼是這個順序 |
「這裡為什麼不能做某件事」有三個答案,分別在三個地方 —— 它們的下一步不一樣, 所以刻意不寫在一起:
| 問題 | 去哪找 |
|---|---|
| 知道有更完整的做法,但目前這樣就夠 | tech.md〈刻意的簡化(ponytail 紀錄)〉,每條都寫了天花板與升級路徑 |
| 做不到或不打算做 | tech.md〈已知限制〉 |
| 還沒做,但可能要做 | plan-agent.md 第 2 節(做完就從那裡刪掉,所以那份永遠只有待辦) |
下一輪要動的是體感那三項 —— 不是做不到,是同一件事要多按幾下:
| 現在 | 想要 | |
|---|---|---|
| 切換自動模式 | 扳手 → 自動模式 → 選一項 | Shift+Tab 循環,輸入框旁邊一直看得到在哪一檔 |
| 中斷 | 滑鼠移到右下角點停止 | Esc 就停 |
| 還原 | 只倒得回檔案 | 連對話一起倒回去 |
能力上還缺的兩項都卡在「值不值得」而不是「怎麼做」:
子代理的改動要人自己下最後那句 git merge(自動合撞到衝突會把工作區弄成
一半合完的狀態,比自己 merge 更難收拾),以及子代理是同步的
(要「跑完再通知」得把整個工具迴圈從瀏覽器搬進 serve.py)。
向量檢索(RAG) 也還沒有 —— 附加檔案是整份塞進 context,沒有切塊也沒有向量庫。
它卡在一個還不存在的答案:找程式碼時 search_files(grep)幾乎都贏過向量檢索,
RAG 真正的價值在文件,所以要先知道使用者到底都丟什麼進來。
(「模型找不到東西」那一半已經不歸它管了 —— 專案地圖把那件事變成了固定成本。)
每一項的成本、做完長什麼樣、卡在哪,見 plan-agent.md。
圖片生成 —— Ollama 的 API 沒有影像輸出,vision 指的是「看得懂圖片」不是「畫得出圖片」。
VS Code 擴充套件 —— 那是另一個專案(TypeScript、擴充 API、打包發佈),
跟這份單一 HTML 檔的設計完全相反。
語意索引取代 search_files —— 找函式名要的是精確比對。
其餘的(LSP、跨對話 memory 工具、MCP 的 HTTP 傳輸)與理由見
plan-agent.md 第 5 節。
python tests/test_serve.py # 後端 122 項
python tests/test_core.py # core/ 各模組的介面 13 項
node tests/test_gui.js # 網頁 83 項兩支 Python 測試只用專案本身與標準函式庫,三支都不需要 Ollama 在跑;網頁測試需要 Node.js。
另外兩支是不同用途,不在這條線上:tests/test_skills.py 驗 skills/ 的格式,
tests/test_agent.py 需要 Ollama —— 它讓真的模型修好一個壞掉的專案,
也是拿來量東西的(--no-rules 量系統提示值多少、--tools=a,b 量工具定義值多少)。



