coder-leo
終端機裡的程式設計代理,用本機模型執行。它讀取、撰寫並修改程式碼,執行指令,搜尋專案,維護任務清單,背後的模型透過 Ollama 或任何具備 OpenAI 聊天 API 的伺服器(LM Studio、llama-server、vLLM、mlx)在你自己的機器上執行。它的工作方式和 Claude Code 一樣,而且是為小小的脈絡視窗設計的:測量視窗,讓每個工具結果都在預算內,清掉舊結果,必要時分段摘要對話,並給模型一套不必全部讀完也找得到東西的工具。
安裝
macOS,使用 Homebrew,兩行指令,只需一次:
brew tap leonardoaguiar/coder-leo https://leonardoaguiar.com/apps/coder-leo/tap.git
brew install leonardoaguiar/coder-leo/coder-leo
brew upgrade 會帶來新版本,coder-leo update 也可以。
Linux(任何發行版,x86_64 或 ARM)、Termux 中的 Android,以及 WSL 中的 Windows:
curl -fsSL https://leonardoaguiar.com/apps/coder-leo/install.sh | sh
它會為這台機器挑選建置版本,核對已發布的 SHA-256,再把執行檔、手冊頁和 shell 補完安裝到 /usr/local(需要時會請求 sudo)、~/.local 或 Termux 自己的資料夾。再執行一次即可更新;sh -s -- --uninstall 移除。
你還需要一個模型伺服器,以及一個支援工具呼叫的模型:
- Ollama(預設):
ollama pull qwen2.5-coder:14b,或qwen3、devstral、gpt-oss、llama3.1、mistral。coder-leo 會連線127.0.0.1:11434,或OLLAMA_HOST。 - LM Studio、llama-server、vLLM、mlx-lm 或任何相容 OpenAI 的伺服器:
coder-leo --api openai --host http://127.0.0.1:1234。
開始
在專案裡打開終端機,執行 coder-leo。第一次會請你從清單中挑一個模型,之後會記住。輸入你想要的;/help 列出所有指令。
coder-leo 在這個目錄開始一段工作階段
coder-leo "add tests for parser" 帶一則起始提示開始工作階段
coder-leo -p "explain main.go" 回答一次就結束(也讀取 stdin)
coder-leo -c 接續這裡最近的一段工作階段
coder-leo --sessions 挑一段更早的工作階段
coder-leo --list 已安裝的模型
歡迎框顯示模型、脈絡視窗、權限模式和目錄。提示符號下方那一行顯示模式、模型、脈絡用了多少,以及 git 分支。
與它一起工作
- 請它做修改,而不是給建議。它會自己修改檔案、執行建置或測試,從不把程式碼貼給你要你自己套用。
- @路徑 把一個檔案或目錄附加到訊息裡(Tab 補完,支援模糊比對)。對視窗來說太大的檔案會以大綱形式放入,模型再去讀需要的部分。
- !指令 執行一行 shell 指令,輸出留在對話裡。
- #文字 把一則筆記存進專案的
CLAUDE.md。 - Esc 或 Ctrl+C 停止回覆。這段時間輸入的內容會等在下一個提示符號。
- Shift+Tab 切換權限模式;Ctrl+O 切換完整的工具輸出;Ctrl+T 顯示任務清單;Esc Esc 倒回;Ctrl+R 搜尋歷史;Ctrl+J 插入換行;大段貼上會折疊成一個佔位符。
- 提示裡的 think、think hard 和 ultrathink 會在當輪提高會推理模型的推理強度。
工具
模型透過這些工具工作,名稱與 Claude Code 相同(它也認得其他代理使用的名稱,例如 read_file 或 run_command):
| 工具 | 功能 |
|---|---|
| Read | 讀一個檔案,附行號,支援 offset 與 limit;視覺模型可讀圖片;透過 pdftotext 讀 PDF;notebook 依儲存格讀取。整個讀一個大檔案會回傳它的大綱和開頭 |
| Write, Edit | 建立檔案;替換一段精確的片段(容許複製進來的行號與縮排差異) |
| LS, Glob, Grep | 列出目錄、依樣式尋找檔案、用正規表示式搜尋內容(內容、檔名或計數,可附脈絡) |
| Search | 對一個白話問題最相關的檔案與行,依識別字裡的詞排序 |
| Outline, RepoMap | 一個檔案的函式與型別;儲存庫地圖,依程式碼對每個檔案的引用程度排序 |
| Bash, BashOutput, KillShell | 帶逾時執行指令;長指令放到背景 |
| WebFetch, WebSearch | 把網頁變成可讀文字;網路搜尋 |
| TodoWrite | 任務清單,隨變化顯示 |
| Task | 擁有全新脈絡視窗的子代理(explore、plan、general、review,或你自訂的),只回傳它的報告 |
| Recall | 搜尋整段對話,包括已被摘要掉的部分 |
| AskUserQuestion, ExitPlanMode, Skill | 向你提問;呈現計畫;載入技能 |
| mcp__server__tool | 你的 MCP 伺服器提供的工具 |
脈絡視窗
本機模型的視窗很小(16 GB 的機器上常見 8k 到 32k 個 token),而每一輪重新讀一遍長提示要花上好幾秒。coder-leo 讓視窗始終可用:
- 大小:依模型上限和機器記憶體決定(
/ctx顯示,/ctx 32k或/ctx auto修改)。計數是估算值,會依伺服器回報的數字校正。 - 穩定前綴:系統提示在工作階段期間不變,伺服器可以重用快取,而不必重新評估一切。
- 結果在預算內:每個工具結果都裁到放得下的程度;完整輸出存成一個檔案,模型拿到它的路徑,可以分段 Read 或 Grep。
- 清理,在 70% 時:舊的工具結果變成一行的存根(最近幾個保持完整)。
- 摘要,在 85% 時,或用
/compact [要保留什麼]:一份結構化的交接摘要取代對話,最近幾輪原樣保留;太長而無法一次摘要的對話會分段摘要再合併。完整紀錄留在磁碟上,Recall 可以搜尋它。 - 儲存庫地圖:被引用最多的檔案和它們的符號會在有餘裕時放進系統提示,讓模型不必讀就知道東西在哪裡。
- /context 顯示什麼在占用視窗:系統提示、工具結構描述、訊息、結果、已清理的結果、剩餘空間。
權限
四種模式:default 在編輯與執行指令前詢問;acceptEdits 放行專案內的編輯,指令仍會詢問;plan 只讀,模型會呈現一份計畫供核准;yolo 什麼都不問直接執行,和最早的版本一樣,而且除非你的設定另有規定,這就是預設值。破壞性指令(刪除大範圍目錄、丟棄 git 工作、強制推送、sudo、刪除資料表)在 yolo 模式下仍會詢問;設定裡的 "guard": false 可以關掉。
設定裡的規則優先於模式:"allow": ["Bash(git *)", "Read"]、"deny": ["Bash(rm *)"]、"ask": ["Write"]。在權限詢問時回答 a,會在這個工作階段放行該工具;回答一段文字,則會當作指示送給模型。
工作階段
每段工作階段都在進行時儲存到 ~/.config/coder-leo/sessions/<專案>/。coder-leo -c 接續最近的一段,--resume <id> 或 /resume 挑一段,/rename 命名,/export 匯出成 Markdown。每次編輯前檔案都會存一個檢查點:/rewind(或 Esc Esc)倒回更早的一輪,還原此後更動過的檔案,並在那裡截斷對話。
指示、指令、技能、代理
- 專案裡(以及上層目錄、
~/.config/coder-leo/和~/.claude/)的 CLAUDE.md 或 AGENTS.md 會進入系統提示:慣例、建置指令、要避免的事。檔案裡的@路徑行會匯入其他檔案。/init請模型寫一份。/memory列出已載入的內容。 - 自訂指令:
.coder-leo/commands/(或.claude/commands/,專案或家目錄)裡的 Markdown 檔案,以/名稱 參數執行。$ARGUMENTS、$1、`!指令和@檔案會被展開;front matter 可以設定description、argument-hint、allowed-tools和model`。 - 技能:
.coder-leo/skills/<名稱>/SKILL.md(或.claude/skills/),連同描述一起列給模型;任務相符時它用 Skill 工具載入,或者你執行/名稱。 - 子代理:
.coder-leo/agents/<名稱>.md(或.claude/agents/),front matter 裡是name、description、tools和model,內文是系統提示;由 Task 工具執行。內建:explore、plan、general、review。 - Hook:圍繞事件(SessionStart、UserPromptSubmit、PreToolUse、PostToolUse、Stop、SubagentStop、PreCompact、SessionEnd)執行的 shell 指令,事件以 JSON 從 stdin 傳入;結束碼 2 表示阻止並附上原因,JSON 回覆可以允許、拒絕或補充脈絡。協定與 Claude Code 相同。
- MCP:來自
.mcp.json(專案或家目錄)或設定裡mcpServers的伺服器,透過 stdio 或 HTTP;它們的工具以mcp__server__tool出現,提示則成為指令。/mcp列出它們。
設定
~/.config/coder-leo/settings.json,接著是專案裡的 .coder-leo/settings.json 和 .coder-leo/settings.local.json,後者覆蓋前者;最後是環境變數(CODER_MODEL、CODER_API、CODER_HOST 或 OLLAMA_HOST、CODER_API_KEY)。
{
"model": "qwen2.5-coder:14b",
"api": "ollama",
"numCtx": 16384,
"think": "low",
"permissions": { "mode": "default", "allow": ["Bash(git *)"], "guard": true },
"compact": { "micro": 0.7, "full": 0.85, "keepRecent": 6 },
"repoMap": { "enabled": true, "budget": 3000 },
"tools": { "minimal": false, "disabled": ["WebSearch"] },
"hooks": { "PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "./check.sh" }] }] },
"mcpServers": { "fs": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "."] } },
"statusLine": { "command": "~/.config/coder-leo/status.sh" },
"notify": "bell"
}
/config 顯示目前生效的設定與來源;/doctor 檢查伺服器、模型、記憶體和整體設定。
無終端機模式
coder-leo -p "提示" 回答一次:回覆寫到 stdout,其餘全部寫到 stderr。--output-format json 輸出一個物件,含結果、工作階段 id 和 token 計數;--output-format stream-json 在事情發生時每行輸出一個 JSON 事件。--max-turns、--allowedTools、--disallowedTools、--system-prompt、--append-system-prompt 和 --mode 決定執行方式;-c 或 --resume 接續一段工作階段。
隱私
一切都在你的機器上執行:模型、檔案、對話。程式只在三種情況下連網:模型為你的任務呼叫 WebFetch 或 WebSearch 時(yolo 模式之外會先請求權限)、你設定了會對外連線的 MCP 伺服器時,以及你執行 coder-leo update 時。沒有帳號,沒有遙測,不會把任何東西送到任何地方。
更新
coder-leo update 會到網站查看是否有更新的版本並安裝(Homebrew 裝的副本透過 Homebrew 更新);coder-leo update --check 只告訴你結果。程式從不自行檢查。
協助與問題回報
問題和想法:coder-leo 頁面末尾的支援信箱。請附上模型、伺服器、coder-leo version 和 /doctor 的輸出。