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。 - 钩子:围绕事件(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 的输出。