Commands
Type / in the TUI input box to open the command palette. A leading slash command is also recognized in --print, SDK stream mode, and ACP. Command names use exact ASCII-insensitive matching. Unknown and unavailable slash-prefixed text is rejected with an error instead of becoming a prompt. Prefix a literal message that starts with / with another slash to send it as text: //lmao sends /lmao. Text sent programmatically (maki.session.prompt, subagent chat) is not parsed as a command. A known available command with invalid arguments returns an error instead of becoming a prompt.
The active registry combines built-ins, custom Markdown commands, MCP prompts, and Lua commands. Lua commands have the highest collision priority, followed by MCP prompts, custom commands, and built-ins. Each frontend advertises its capabilities, and the registry omits commands that require unavailable capabilities. Registrations can change when plugins reload or MCP servers reconnect. The palette and protocol command lists show the current target-scoped winners. Root CLI subcommands such as maki auth are separate from slash commands.
Built-in commands
| Command | Description | Mode | Arguments | Frontends |
|---|---|---|---|---|
/tasks | Browse and search tasks | none | TUI only | |
/compact | Summarize and compact conversation history | raw (optional) | all | |
/new | Start a new session | none | TUI only | |
/clear | Alias for /new | none | TUI only | |
/help | Show keybindings | none | TUI only | |
/queue | Remove items from queue | none | TUI only | |
/model | Switch model | typed | all | |
/theme | Switch color theme | typed | TUI only | |
/mcp | Configure MCP servers | none | TUI only | |
/login | Authenticate with an LLM provider | none | TUI only | |
/cd | Change working directory. Quote paths containing spaces. | typed | [path] | all |
/btw | Ask a quick question (no tools, no history pollution) | raw (required) | all | |
/yolo | Toggle YOLO mode (skip all permission prompts) | none | all | |
/fast | Toggle fast mode (Anthropic Opus or Codex subscription models) | none | all | |
/workflow | Toggle workflow mode (task callable inside code_execution) | none | all | |
/exit | Exit the application | none | TUI only | |
/reload | Reload plugins and config | none | TUI only | |
/trust | Trust this folder and load its shared project config | none | TUI only |
The portable built-ins are /compact, /model, /cd, /btw, /yolo, /fast, and /workflow. ACP advertises these built-ins plus custom, MCP, and portable Lua commands. ACP hides /new and /clear. The ACP client owns session creation through session/new. A typed /new or /clear resolves locally and returns guidance to use session/new; it does not invoke model inference or reset model history. Commands that require TUI capabilities are omitted from ACP. Invoking an unavailable command returns an error; to send it as a literal prompt, escape the leading slash (//help sends /help).
Bundled plugin commands
Bundled Lua plugins register these commands at startup. Plugin commands have higher collision priority than built-ins, so a bundled plugin can replace a built-in implementation for the targets it supports.
| Command | Description | Mode | Arguments | Frontends |
|---|---|---|---|---|
/automode | Toggle bash auto mode (classifier gates every bash command) | none | all | |
/build | Switch to build mode (full tool access) | none | all | |
/memory | View, edit, and delete memory files | none | TUI only | |
/options | Browse and change session options | none | TUI only | |
/plan | Switch to plan mode (analyse and write only the plan file) | none | all | |
/rename | Rename the current session | raw (required) | TUI only | |
/sessions | Browse and switch sessions | typed | [query] | TUI only |
/splash | Preview and select a splash renderer | typed | [splash] | TUI only |
/splash-fps | Toggle the splash fps overlay: live fps and per-frame render time. | none | TUI only | |
/thinking | Set thinking effort (bare opens a selector) | typed | [effort] | TUI only |
/usage | Show provider quota and focused-session token usage | none | TUI only |
Command arguments
Lua commands declare their arguments with arguments. Use arguments = { raw = true } for an optional unparsed argument string, or add required = true to reject empty input. Provide a dense array of typed positional descriptors for decoded values. Each typed argument has a name and one of string, integer, enum, file, or directory types. Set optional = true only after required arguments, and set variadic = true only on the final argument.
Typed command input uses shell-like single or double quotes to keep spaces in one value. Quotes are removed before validation; double-quoted values only escape \" and \\. Integers are signed decimal values from -9007199254740991 through 9007199254740991. Handlers receive the original text in opts.args, decoded tokens in opts.fargs, and typed values in opts.values keyed by argument name.
Completion callbacks receive the typed argument name as ctx.argument, its type as ctx.type, and successfully parsed preceding values as ctx.values. Raw commands receive the original argument text.
/model and /theme also accept an argument. While you type it, the palette lists the possible values (model specs, theme names), and submitting resolves the argument without opening the picker:
/model <spec>: a fullprovider/idspec is used as-is, even if it is not in the discovered list. A fragment is fuzzy-matched against the discovered specs, and a unique match switches to it. Zero or multiple matches flash a note and keep the current model./theme <name>: the exact name is applied and persisted. A fragment that matches one theme name (liketokyfortokyonight) is resolved the same way; unknown or ambiguous names flash a note and leave the current theme. With no argument, the picker opens and previews each theme as you navigate.
Sessions
Sessions run concurrently. /new starts a fresh session while the old one keeps working in the background, and /sessions shows the live status of each (working, needs input, idle) so you can jump between them. The picker lists this directory's sessions; a session open in another terminal is greyed out and cannot be opened from here. When a background session finishes or needs input, Makima flashes a note in the status bar. /rename renames the current session; in the session picker, Ctrl+N / Ctrl+R / Ctrl+D create, rename, and delete.
Modes and toggles
/yolo: skip permission prompts for this session (deny rules still apply). Config:always_yolo = true./thinking: bare opens the selector; an optional setting applies and persists the default. Completion lists the finite options supplied by the host. Positive numeric token budgets are accepted as arguments but are not suggested. Config:always_thinking./fast: faster responses on Anthropic Opus, and on eligible Codex models when you sign in with a ChatGPT subscription. OpenAI API keys and every other model ignore it. Config:always_fast = true./workflow: letcode_executioncall thetasktool (and other workflow-only tools) from inside the Python sandbox. Config:always_workflow = true.- Plan / build: not a slash command. Press
Tabin the input to toggle plan mode (plan-file writes only). /reload: rebuild plugins and config without leaving the app./btw: one-shot side question with no tools and no history pollution./memory: open the memory file picker (view / edit / delete). See thememorytool under Tools.
Custom commands
You can define your own slash commands as Markdown files. Empty files are skipped.
Discovery and priority
Later sources override earlier ones when the command name matches (the stem of the file, or name in frontmatter):
- User config:
~/.config/makima/commands/(and legacy~/.makima/commands/if present) - User third-party:
~/.claude/commands/ - Project dirs, walking from the current working directory up to the nearest
.gitroot. At each level:.makima/commands/, then.claude/commands/
Because the walk goes cwd → … → git root, a command at the repository root overrides the same name found only under a nested cwd. Project commands override user commands. Palette names are /project:<name> or /user:<name> depending on which scope won.
Skip all of the above with --no-commands (see CLI).
Metadata
You can add optional metadata at the top of the file between --- lines to set name, description, and argument-hint:
---
description: Review code for issues
argument-hint: <file>
---
Review $ARGUMENTS and suggest improvements.Arguments
Use $ARGUMENTS in the command body. It gets replaced with whatever you type after the command name. The command is treated as accepting args if the body contains $ARGUMENTS or you set argument-hint.
For example, /project:review main.rs replaces $ARGUMENTS with main.rs.
Aliasing commands
Prefer a different name for a command? maki.api.run_command runs any slash command exactly as typing it would, so an alias is a one-line handler in your init.lua instead of a reimplementation.
-- ~/.config/makima/init.lua
local aliases = {
{ name = "/clear", target = "/new", description = "Alias for /new" },
{ name = "/resume", target = "/sessions", description = "Alias for /sessions" },
}
for _, alias in ipairs(aliases) do
maki.api.register_command({
name = alias.name,
description = alias.description,
handler = function()
local ok, err = maki.api.run_command(alias.target)
if not ok then
maki.ui.flash("could not run " .. alias.target .. ": " .. err)
end
end,
})
end
Both names stay in the palette: aliasing adds a name, it does not rename or hide the original. It works for any command listed above, plus plugin commands and MCP prompts. See maki.api.run_command for matching and error handling, or maki.ui.action to bind a key instead of a name.
Related: CLI for shell flags and subcommands, Skills for on-demand playbooks.