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

CommandEffect
/helpList the commands, the installed skills, and the prompt templates
/infoThe 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
/nameShow the current session's name
/name <name>Name the session, so revolve <name> resumes it later
/roleList 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
/agentsList 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
/backgroundList 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

CommandEffect
/modelOpen 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

CommandEffect
/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
/compactSummarize 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
/clearDrop the history and start a new session
/quit, /exitExit

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

CommandEffect
/refineHave the model rewrite its persistent memory from what happened in this session
/refine historyList the recorded refinements, with the sentence the model wrote about each file it changed
/refine undoPut 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

CommandEffect
/goalShow 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 resumeTake the goal out of the prompt without forgetting it, and put it back
/goal doneConfirm 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 clearDrop the goal

Only /goal done ends a goal. The model can propose that it is met; it cannot decide it.

Working unattended

CommandEffect
/heartbeat <interval>Take a turn on the clock every 45s, 10m, 2h; a bare number means minutes
/heartbeatSay when the next heartbeat is due
/heartbeat offStop the clock
/gate <command>Add a command that has to pass between the turns of an autonomous run
/gate list, /gate clearShow 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 offShow 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

CommandEffect
/skillsShow 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 historyList the generated skills, with what each run wrote
/skill undoTake the last generated skill back
/reloadRead 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
/onboardRewrite 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.

PlaceholderStands 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.