Slash commands

Inside a chat you can type /<name> to run a command instead of sending a message. There are two kinds:

  1. Built-ins — REPL/chat controls baked into eVi (/help, /model, /context, …).
  2. User & plugin commands — markdown prompt templates you drop in ~/.evi/commands/ (or that a plugin ships), fired as /<name> with arguments.

Type /help (or /?) at any time to list everything available in the current session; press Tab in the CLI REPL to complete command names.

Built-in commands (CLI REPL)

The full set, from evi chat / evi sessions resume:

CommandWhat it does
/help, /?Show the command list (built-ins + your user/plugin commands).
/resetClear the conversation history (start fresh, same session).
/exit, /quitLeave the REPL.
/toolsList the currently active tools.
/model [id]Show the active model, or switch to id (persisted to config).
`/goal [text\clear]`Set / clear / show the ongoing goal (prepended to each turn).
/plan [task]Run the next turn in plan-only mode (no tools); optional inline task.
`/auto [on\off]`Auto-approve every tool call for this session (no on/off = show state).
/compactSummarise older history into one note to free context.
/context, /ctxShow where the context window is being spent (per-bucket breakdown).
/recent [n]List recent sessions (resume via evi sessions resume).
/image <path>Attach an image to the next turn (vision/VLM models).
`/effort [low\medium\high\max]`Set reasoning effort for subsequent turns.
`/fast [on\off\<model-id>]`Toggle fast mode (swap to a smaller model).
/json <prompt>Force JSON-object output for the next turn.
/schema <file> [prompt]Constrain the next turn to a JSON Schema (file path).
/notools <prompt>Answer the next turn without using any tools.
/forcetool <name> <prompt>Force the model to call a specific tool.
/reloadRe-read config.toml without restarting.
/audio <path>Transcribe an audio file and send the text as the next turn.
/audioraw <path> [prompt]Attach raw audio (omni models) / auto-transcribe otherwise.
`/speak [on\off]`Auto-speak assistant replies sentence-by-sentence (TTS).
`/predict <text\file <p>\clear>`Set a speculative-decoding hint for the next turn.

Aliases: /? = /help, /ctx = /context, /img = /image, /quit = /exit.

Many of these have a GUI equivalent in the web/desktop app — the model picker chip (/model), the usage-chip popover (/context), the auto/plan chips, the 📎 attach button (/image, /audio), the speak toggle (/speak). See cli-parity.md for the full mapping.

Built-ins in the web / desktop chat

The web chat understands a subset of the built-ins (the ones that make sense without a terminal), plus all your user/plugin commands:

/help · /reset · /tools · /model [id] · /goal [text|clear] · /plan [task] · /auto [on|off] · /compact · /reload

The remaining built-ins (/context, /recent, /image, /effort, /fast, /json, /schema, /notools, /forcetool, /audio*, /speak, /predict, /exit) are CLI-only — in the web/desktop app their job is done by GUI controls or per-turn API parameters instead.

User-defined commands

Drop a markdown file at ~/.evi/commands/<name>.md; typing /<name> in the REPL or the web chat sends its expanded content as the next user message. This is modelled on Claude Code's custom commands (evi/commands.py).

evi command list           # your + plugin commands (what /help shows in chat)
evi command new <name>     # scaffold ~/.evi/commands/<name>.md (ns:name → subdir)

(REPL keybindings have the same treatment: evi keybindings list shows the effective bindings from ~/.evi/keybindings.toml.)

File format

---
description: Draft a conventional-commit message
argument-hint: [scope]
model: qwen2.5-coder:14b-instruct-q4_K_M
---

Write a conventional-commit message for the staged changes.
Scope: $1
Full request: $ARGUMENTS
Here is the diff:
@<(git diff --cached)

No shell execution. Unlike some tools, eVi does not run !bash blocks when expanding a command — auto-running shell on expansion is too sharp an edge for eVi's permission model. If you need triggering metadata or tool gating, write a skill instead.

Plugin commands

Installed plugins can ship a commands/ directory; those appear as /<plugin>:<command> alongside your own. See plugins.md.

Usage

/help                     # list built-ins + user/plugin commands
/model qwen2.5:7b         # switch model (persisted)
/context                  # see the context-window breakdown
/auto on                  # auto-approve tools for this session
/commit fix(web)          # run ~/.evi/commands/commit.md with $1="fix(web)"
/git:commit               # a namespaced command from commands/git/commit.md

Anything that isn't a built-in and isn't a known user/plugin command prints unknown command: /<name> (try /help).

Examples

Example 1 — install the bundled /commit command

The repo ships one example command:

mkdir -p ~/.evi/commands
cp examples/commands/commit.md ~/.evi/commands/

Now /commit in any chat runs git diff and proposes a conventional-commit message. Pass a scope: /commit web.

Example 2 — a namespaced review command

mkdir -p ~/.evi/commands/pr
cat > ~/.evi/commands/pr/describe.md <<'EOF'
---
description: Draft a PR description from the branch diff
argument-hint: [ticket]
---
Write a concise PR description for ticket $1.
Summarise the change, call out risks, and list manual test steps.
Diff:
@<(git diff main...HEAD)
EOF

Fire it with /pr:describe ABC-123.

Notes / limits

Edit on GitHub ↗