Chat commands
A line starting with / is a command to the program. Everything else goes to the model.
Commands work in every front end, not only in the terminal: a line sent over the JSON-lines protocol or piped in is read the same way. The one exception is a message that arrives from another agent, which is always text and never a command.
/execute <program> [arguments] runs a program through the same permission rules and pipeline as the model's Exec tool — a | b is a list of stages, each resolved separately, and a denied stage cancels the whole pipeline. There is no ! prefix.
Knowing where you are
| Command | Effect |
|---|---|
/help | List the commands, the installed skills, and the prompt templates |
/info | The runtime report: model, the models you configured, working directory, session name and file, token usage |
/task [wait <when>] <text> | Write a task file into the project's task folder under the config directory, its name made from the first words of the text, prefixed with this session's lane and stamped with its creator. A leading wait 3d or wait 2026-09-01 defers it |
/tasks [own|all] [deferred] | List the project's open tasks. own is this session's lane, all ignores the lane, and deferred also shows the ones not yet due |
/name | Show the current session's name |
/name <name> | Name the session, so revolve <name> resumes it later |
/role | List the roles this project offers, each with the first line of what it is for, and the files the role in force holds |
/role <name> | Put subagents/<name>.md into this session's own system prompt from now on, the way --role does at startup. It holds for every turn and survives a compaction, which a first message would not. The model reaches the same thing through the Role tool, which is how a coordinator moves an agent that has drifted from its briefing |
/agents | List the sessions running on this machine and open one in a tab. Alt+T is the same list from the keyboard, and revolve agents prints it at the shell |
/background | List the background children with the models they run on; /background stop <name> ends one and /background stop on its own ends every one of them |
Choosing a model
| Command | Effect |
|---|---|
/model | Open a searchable list of the configured models. Type to filter, Enter picks, Esc leaves |
/model <name> | Switch straight to it when the name is unambiguous — the full name (deepseek:deepseek-v4-pro) or a bare model id. Anything else opens the list filtered by what you typed |
/effort [off|minimal|low|medium|high] | Show or change how much the running model thinks before it answers. On the OpenAI wire it travels as reasoning_effort; on Anthropic it decides the thinking budget, where minimal is 1024 tokens and off is none at all |
/login [provider] | Sign in with the browser OAuth flow, so calls bill against a subscription rather than an API key. Without an argument it signs in to the provider of the model you are running on; a provider with no public flow explains which environment variable its API key belongs in instead of opening a browser tab against the wrong account. revolve login does the same before a session exists, defaulting to anthropic |
The switch takes effect on the next turn and the conversation is kept. Which models exist comes from your configuration.
Managing the conversation
| Command | Effect |
|---|---|
/attach <path> | Read an image and send it with your next message. PNG, JPEG, GIF and WebP are what both wire formats accept, and the kind is read from the bytes rather than from the name. A model the catalog knows to be text-only is refused by name before anything is sent, and a model the catalog does not know is let through |
/compact | Summarize the history so far into working notes and continue in a fresh session file |
/branch [n] | Continue in a new session file that keeps the conversation up to an earlier point. Without an argument the cut is your last user message, so you can say it differently; with a number it drops that many messages from the end and moves the cut back to the turn that contains it, since a history split between a tool call and its result cannot be sent. The new file names the file and the message index it grew out of, and takes the next free name — chat branches into chat-2 — so the original session stays on disk and stays resumable. revolve --list shows the origin beside the branch. |
/export [path] | Write the session as one self-contained HTML file — no stylesheet, font or script beside it — with the user and the assistant apart, tool calls and thinking folded into <details> elements, and code fences kept as <pre>. Everything from the session is escaped, so a message containing markup reads as text. Without a path the file is named from the session and lands in the working directory, the only place the file layer may write. A compacted session exports what it holds now, which is the summary; the messages it was built from stay in the earlier session file. An attached image is embedded as a data: URL, so a session that sent one exports large |
/resume [name] | Switch this window to another session of this directory without leaving the program. The conversation you are in is written out first, the named session file is read back, and the history on screen is replaced by a replay of it — the same replay revolve --resume shows at startup — with the token totals of that session restored with it. Without a name it offers the sessions of this directory, most recent first, as a list to pick from; the running model is not changed, so a session started on another model continues on this one until /model says otherwise |
/clear | Drop the history and start a new session |
/quit, /exit | Exit |
Compaction also happens on its own when the context window is nearly full. It splits the history at a turn boundary, never between a tool call and its result, and what is dropped is replaced by notes. The standing goal survives it, because the goal lives in the system prompt rather than in the history.
Memory
| Command | Effect |
|---|---|
/refine | Have the model rewrite its persistent memory from what happened in this session |
/refine history | List the recorded refinements, with the sentence the model wrote about each file it changed |
/refine undo | Put the memory back the way it was before the last refinement that is still standing |
See Sessions, memory, goals for what is stored and how the undo history walks backwards.
Standing goals
| Command | Effect |
|---|---|
/goal | Show the standing goal, its progress notes, and any proposal that it is met |
/goal <text> | Set an objective that is carried in the system prompt across turns |
/goal pause, /goal resume | Take the goal out of the prompt without forgetting it, and put it back |
/goal done | Confirm that the objective is reached, which ends it |
/goal edit <text> | Reword the objective and keep its progress notes, which /goal <text> throws away |
/goal clear | Drop the goal |
Only /goal done ends a goal. The model can propose that it is met; it cannot decide it.
Working unattended
| Command | Effect |
|---|---|
/heartbeat <interval> | Take a turn on the clock every 45s, 10m, 2h; a bare number means minutes |
/heartbeat | Say when the next heartbeat is due |
/heartbeat off | Stop the clock |
/gate <command> | Add a command that has to pass between the turns of an autonomous run |
/gate list, /gate clear | Show the gates, or drop them |
/autonomous [<spec>] | Keep taking turns toward the standing goal under a run budget, using the same keys as --budget |
/autonomous status, /autonomous off | Show what is left of the run, or stop it |
All of it is described under Working unattended.
There are three rhythms and no fourth. A heartbeat is a fixed interval inside a running
session. An autonomous run takes turns back to back under a budget until the goal is proposed
met, a gate fails or you send a message. Work that has to happen when no session is running is a
cron line, written by StartAgent with an every argument or by
revolve schedule. A rhythm the model varies for itself is deliberately missing: a
session that decides when to wake itself is scheduling turns in the window you are typing in,
and a schedule worth having survives the process, which is what cron is for.
Skills
| Command | Effect |
|---|---|
/skills | Show where the installed skills come from, how large each is, and what is wrong with them |
/skill [about what] | Write a skill for this project out of the workflow that repeated in this session |
/skill global [about what] | Write it into the global skills directory instead of the project's |
/skill history | List the generated skills, with what each run wrote |
/skill undo | Take the last generated skill back |
/reload | Read the skills, the prompt templates and the project CLAUDE.md from disk again, at the cost of the prompt cache. It says whether the context actually changed |
/onboard | Rewrite the skills imported from Claude Code so they describe this program's tools |
Commands you added yourself
Two kinds of command are not in the table above because they come from your own files.
Every installed skill is a command. /<skill-name> puts that skill's full text in front of the model, and anything you write after the name is appended as your message. The program tells you how many characters it sent, since a large skill is a real cost per turn.
Every prompt template is a command. A markdown file in ~/.config/task-agent/prompts/ named review.md becomes /review. The file's front matter may carry a description and an argument-hint, both shown in /help; the body is the message, with the words you typed after the command substituted into it. The
directory moves with --config, the way the skills and packages directories do.
/skill prompt <about what> writes one out of what repeated in the session, the
way /skill writes a skill, and it is reversible the same way: /skill prompt
undo takes the newest one back and /skill prompt history lists them.
A generated template carries a generated: line naming the session it came from,
/help marks it, and deleting that line adopts it as yours.
| Placeholder | Stands for |
|---|---|
$ARGUMENTS, $@ | Everything you typed after the command |
$1, $2, … | One argument by position; missing ones become nothing |
${@:2}, ${@:2:3} | The arguments from the second on, optionally at most three of them |
Arguments are split on whitespace, and double quotes group several words into one. A $ that starts none of these is left alone.
An unknown command says so rather than being sent to the model, and names the closest skill or template it knows.