Reference
Slash commands & escape hatches.
How a line is routed
Understanding routing is the key to the shell — most lines never touch the model.
:command— a REPL meta-command. Handled by the shell itself.- Direct execution — if the first word is an alias,
cd/exit, or an executable on yourPATH, the line runs directly. No model, no latency, no permission prompt. - The model — anything else (including shell machinery like
|,>,$, globs, and English that merely starts with a command word) goes to the agent. - Escape hatches —
!lineforces direct execution;?lineforces the model.
Ctrl-C aborts the current turn. During a TTY hand-off (vim, ssh) it interrupts the foreground child. → / Ctrl-F accept inline history ghost-text.
REPL meta-commands
Type a bare : to see the live-filtered palette of these.
:allow— List / revoke always-allowed tools & dir grants:attach— Watch + steer a coordinator, orgoalto watch the goal:backend— Switch backend (claude|grok|local):batch— Background batch mode (on|off|status):close— Remove the attached (or named) coordinator from the worker list + Shift-Tab rotation:compact— Compact history, offload to memory:context— Show context-window usage:detach— Stop watching the attached coordinator:dispatch— Launch a background coordinator:dispatch-stats— Background-job dispatch efficiency report:forget— Remove an exited worker:goal— Pursue a goal in the background (see below):help— Show command help:hooks— List lifecycle hooks + provenance:jobs— List background jobs:kill— Kill a background job:loop— Re-run a prompt N times inline:mcp— Manage MCP servers:memories— Stored memories / organize:mode— Set confirmation level (paranoid|careful|normal|yolo):model— Switch model (opus|sonnet|haiku| id):model-detect— Pick the best local model for this machine:new— Clear conversation history:output— Stream coordinators' activity:plugin— Plugin provenance:quit— Exit aish (alsoCtrl-D/exit):reasoning— Show reasoning-quality telemetry (escalate vs guess):rename— Rename this session:restart— Reload aish with the same command it started with:result— View a finished job's result:rewrite— AI-rewrite intent into a command:schedule— Run a task later/recurring (cron orin 5 min …):skill— Manage skills (add|search|list|remove):stop— Stand down an in-flight coordinator — harsher than:tell:suggest— AI-suggest the next command from context:tell— Message an in-flight coordinator:update— Upgrade aish to the latest release:version— Show aish version + backend:workers— List this session's coordinators:yolo— Toggle yolo mode
Goals
A goal is a durable, multi-session objective — a persistent tree of goal → milestones → tasks plus the blockers holding it up. While active, its state is injected into every turn.
:goal new <text>— Create a new goal and make it active:goal show— Show the full tree (milestones, tasks, blockers):goal status— Progress rollup, phase, and elapsed time:goal link <task>— Attach a task/coordinator run to the active goal:goal milestone <text>— Add a milestone under the active goal:goal block <text>— Record a blocker that's holding it up:goal unblock <id>— Clear a resolved blocker:goal complete— Mark the active goal done
Only one goal is active at a time; :goal new supersedes the previous one (past goals stay on record). Shift-Tab cycles straight into the active goal's loop.
Scripting
aish <file> runs a script non-interactively, then exits with the status of its last line:
$ aish deploy.aish # run the file's lines, then exitEach line is handled as if typed at the prompt. Blank lines and # comments are skipped, and the !/? route prefixes work. Because the leading #! line is a comment, a script can carry a shebang and run as a program directly:
#!/usr/bin/env aish
# back up the project, then summarize what changed
tar czf /backups/proj.tgz .
summarize what just got archived and flag anything unexpected