v0.5.0
Lua packages
You can now install plugins from git instead of pasting code into init.lua:
maki.pack.add({
"https://github.com/example/maki-goal",
{ src = "https://github.com/example/maki-review", version = "v1.2.0" },
})Maki prompts once for new packages, pins the commit in pack-lock.json, and asks for permissions per package. /packupdate updates them (with a review of what changed), /packdel removes ones you no longer declare. Packages laid out on disk Neovim-style (start/opt, maki.packadd) work too. Packages can also declare a minimum Maki version. See Lua packages.
Thanks @laudney.
Tool hooks
Every tool now fires tool.<name>.input and tool.<name>.output slots. A plugin can rewrite a tool call before it runs, or block it with a reason the model reads. No more denying the call and paying a round trip just to steer the model. Works for builtins, MCP tools and ACP client tools alike. See Hooks.
Lua jobs
Full job API: jobstart with argv, jobinfo, joblist, jobfind by name, jobattach with exit replay, stream redirection to files. owner = "session" keeps a job alive across /reload, so a monitor written in Lua can outlive its own code. SessionEnd now fires on every teardown and says why and how long. Plugin callbacks can suspend. See the job API.
Thanks @lu-zero.
Performance
- Transcript resize on a 600-message session: 546 ms -> 12 ms (highlighted code is cached).
- Text wrapping: 35 ms -> 3.3 ms for 7800 lines.
Other features
- MCP tools, ACP client tools and
tool_searchare callable fromcode_executionpython scripts. - Queued messages are delivered together in one turn. Typing three follow-ups while the agent works now costs one request, not three.
- Themes can name terminal colors (
blue,light-gray,0-255) instead of hex, so nested tmux over ssh stops mangling them. Helix themes load unchanged. Thanks @untitaker. net.allowed_private_hostslets you pointwebfetchat your own Ollama or SearxNG.- New provider: Regolo. Usage modal now breaks costs down per model. Thanks @lu-zero.
- MCP servers and provider configs expand env vars in custom headers. Thanks @Firaenix.
- Codex reasoning effort is sent to the API. Thanks @cybershape.
/yolosurvives session resume and/new. Thanks @lu-zero.- Window title support with a Lua binding. Thanks @lu-zero.
maki.toast, action keys in list pickers,defer_fn, and turn-boundary events for supervision plugins. Thanks @Firaenix.ModelChangedautocmd. Tasks picker rewritten in Lua, running subagents first.
Fixes
- Two
editcalls on the same file in onebatchorgathersilently lost one of them. Every file mutation now goes through one per-file lock. editpreserves the line endings a file came with.- Codex overloads retry instead of failing the run.
- OpenRouter bills from the cost the response reports. Thanks @pynappo.
- DeepSeek peak surcharge no longer applied on weekends.
- Terminal cursor sits where the input box drew it, and the hardware cursor stops doubling up.
- The bell rings for prompts even when the terminal has focus.
- Code blocks keep their last line when the closing fence is on it.
- The btw model styles thinking like the main transcript. Thanks @kalebo.
Breaking
--no-rtkis gone. Usemaki.setup({ agent = { rtk = false } }). Scripts passing the flag will fail on startup.edit_linesis on by default. Turn it off withplugins.edit = { edit_lines = false }. Onlyinsert_linesstays opt-in.- MCP tools are allowed in plan mode. Plan mode only blocks writes outside the plan file now; everything else follows normal permission rules. Thanks @espetro.
- Plugin tools declaring
permission = "fs_write"must declaremutable_path. Registration is refused otherwise. - Notifications changed: a prompt waiting on you always notifies. Turn-complete is skipped only when Maki can tell you're watching (focus events, or a keypress in the last 30s).