leonardoaguiar.com coder-leo
语言

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 卸载。

你还需要一个模型服务器,以及一个支持工具调用的模型:

开始

在项目里打开终端,运行 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 分支。

和它一起工作

工具

模型通过这些工具工作,名字和 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 让窗口始终可用:

权限

四种模式: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/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 的输出。