From "could you…" to merged
🧑🔬Pick the right specialist
@agent is the roster: eight of them, each with its tools, its step cap and what it returns. Run any one with @<name>. They are Markdown files, so the list is yours to change.
❯ @agent agents (8): served by claude-sonnet-5 @ai 19 tools · 6 steps General assistant — concise Markdown answers, with commands to review. @coder 25 tools · 8 skills · 24 steps Senior engineer + orchestrator — explores, makes the smallest correct edit, verifies, delegates. skills concise · planning · orchestration · code-review · testing · verification · debugging · git @explorer 7 tools · 1 skill · 12 steps Fast read-only scout — maps the relevant code and reports back tightly. skills concise @planner 7 tools · 4 skills · 10 steps Turns a goal into a short plan with acceptance criteria — reads, never writes. skills concise · planning · research · orchestration @researcher 12 tools · 3 skills · 16 steps Finds sources, reads them, and reports what they actually say — with links. skills concise · research · writing @reviewer 7 tools · 5 skills · 12 steps Read-only code review — correctness, security, tests, design. skills concise · code-review · security-review · verification · writing @tester 13 tools · 4 skills · 18 steps Writes and runs tests; reproduces a failure, then fixes it. skills concise · verification · testing · debugging @writer 10 tools · 2 skills · 14 steps Writes documentation and reports for the person who will read them — and saves the file. skills concise · writing one in full: @agent <name> · run one: @<name> "<task>"
🧩Describe it. Get a workflow.
You do not have to already have the right flow. Name none and one is written for the goal — out of the agents you actually have — then checked before it spends a token. It lives in the run's own record, so you can read exactly what was made for you, and @flow still lists only the five you meant to have.
❯ @flow explain how the export command works ◈ no flow named — building a graph for this goal ◈ built a 3-node graph: read the code, write it up, check every claim · @flow show 1785371201-90257 3 nodes · 3 agents · 24 tools · 8 skills · 4 at a time · slowest path read→draft→check ╭────────────────────────────────╮ ╭────────────────────────────────╮ ╭────────────────────────────────╮ │ ⠼ read ⚙6 │ │ ○ draft │ │ ○ check │ │ @explorer · claude-sonnet-5 │───▸│ @writer · claude-sonnet-5 │───▸│ @reviewer · claude-sonnet-5 │ │ ⚙ fs.read src/export.rs │ │ │ │ │ ╰────────────────────────────────╯ ╰────────────────────────────────╯ ╰────────────────────────────────╯ ⠋ read · @explorer · claude-sonnet-5 running · 6 tool calls ⚙ fs.search "export" · 14ms · 6 results ⚙ fs.read src/export.rs · 9ms · 8.2KB ⚙ fs.read src/cli.rs · 7ms · 6.0KB 0/3 done · 1 running
🚢Ship a small feature, end to end
The build graph plans it, maps the code and your conventions in parallel, edits, runs your tests — and if they fail, loops back through a fixer up to three times before giving up.
❯ @flow build "add a --json flag to the export command" ▸ build · add a --json flag to the export command 8 nodes · 6 agents · 69 tools · 24 skills · 4 at a time · slowest path plan→explore→apply→verify→review→summary ╭────────────────╮ ╭────────────────╮ ╭────────────────╮ ╭────────────────╮ ╭────────────────╮ ╭────────────────╮ │ ✓ plan ⚙3 │ │ ✓ explore ⚙12 │ │ ⠼ apply ⚙4 │ │ ○ verify │ │ ○ fix │ │ ○ summary │ │ @planner │───▸│ @explorer │───▸│ @coder │───▸│ @tester │───▸│ @coder │╌╎ ▸│ @writer │ │ 4.2s · 3.1k │ ││ 8.1s · 9.4k │ ││ ⚙ fs.edit src… │ ╎ │ │ ││ when verify.o… │ ╎ ││ │ ╰────────────────╯ │╰────────────────╯ │╰────────────────╯ ╎ ╰────────────────╯ │╰────────────────╯ ╎ │╰────────────────╯ │ │ ╎ │ ╎ │ │╭────────────────╮ │ ╎ │╭────────────────╮ ╎ │ ││ ✓ conventions │ │ ╎ ││ ○ review │ ╎ │ ▸│ @explorer │───┘ ╎ ▸│ @reviewer │───┘ │ 7.6s · 8.8k │ ╎ │ when verify.o… │ ╎ ╰────────────────╯ ╎ ╰────────────────╯ ╎ ╎ ╎ ╎╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ ⠋ apply · @coder · claude-sonnet-5 running · 4 tool calls · needs explore, conventions ⚙ fs.read src/export.rs · 9ms · 8.2KB ⚙ fs.edit src/export.rs · 12ms · 1 replaced ⚙ fs.edit src/cli.rs · 11ms · 1 replaced 3/8 done · 1 running · 21.3k tokens · 24.6s
🔴Make CI green while you make coffee
@loop iterates until your test command exits 0 — the model never grades its own work.
❯ @loop "fix the flaky auth tests" --check "npm test -- auth" --bg ▶ background job 1753113020-5127 ❯ @job log last -f
🧪Reproduce → test → fix
@tester writes the failing test first, then makes it pass.
❯ @tester "totals drift when qty is 0 — reproduce and fix" ⚙ fs.write tests/totals.rs · 4ms · 1.1KB ⚙ sys.run cargo test totals · 2.9s · 31 lines Reproduced: rounding applied before the zero-check …
🧹Refactor with a budget
Cap tokens so an ambitious refactor can't run away — the loop stops honestly at the budget.
❯ @loop "extract retry logic into one helper" --check "cargo test" --budget 60000 🔁 loop 'coder' — up to 5 iteration(s) ✓ goal reached after 3 iteration(s)
✍️Commit messages that write themselves
Grounded on the actual staged diff in your session — review, edit, commit.
❯ git diff --staged --stat ❯ @ai write a conventional commit message for this ❯ press Enter to run (or edit) ❯ git commit -m "fix(parser): keep the final line without a trailing newline"
⬆️Dependency bumps that prove themselves
Bump, build, test — looped until everything passes, or stopped honestly.
❯ @loop "bump tokio to 1.40 and fix what breaks" --check "cargo test --workspace" ▶ iteration 1/5 … check: exit=1 · E0308 in net.rs ▶ iteration 2/5 … check: exit=0 ✓ goal reached after 2 iteration(s)
📝Release notes as a background job
Fire it, forget it, read the markdown log later — the job survives closing the window.
❯ @job write release notes from the last 20 commits --bg ▶ background job 1753114100-6001 ❯ @job ✓ 1753114100-6001 done write release notes … (3m ago · 41s)
🚦Gate your push on a green loop
Every AI command exits honestly (0/1/2/130) — so loops compose with && and CI.
❯ @loop "make clippy clean" --check "cargo clippy -- -D warnings" && git push ✓ goal reached after 2 iteration(s) → push runs only because the loop exited 0
🧬Write your own graph in ten lines
A flow is a TOML file in ai/flows/. needs draws the edges; a run node is a plain command that costs no tokens.
# ~/.aiTerminal/ai/flows/ship.toml [[node]] id = "build" agent = "coder" prompt = "Implement: {{input}}" [[node]] id = "verify" run = "npm test" needs = ["build"] ❯ @flow check ship ← proved before it spends a token ❯ @flow ship "add rate limiting to the login route"
🔎Answer a question properly, with sources
The research graph splits the question into sub-questions, researches each at the same time, then reports what the sources actually say — including where they disagree and what it could not establish.
❯ @flow "Research LLM memory techniques" ▸ research — the goal asks for sources and a comparison, not a code change 4 nodes · 3 agents · 24 tools · 6 skills · 4 at a time · slowest path plan→gather→compare→report ╭───────────────────────────╮ ╭───────────────────────────╮ ╭───────────────────────────╮ ╭───────────────────────────╮ │ ✓ plan ⚙2 │ │ ⠼ gather ⚙5 │ │ ○ compare │ │ ○ report │ │ @planner │───▸│ @researcher │───▸│ @researcher │───▸│ @writer · claude-sonnet-5 │ │ 3.1s · 1.2k │ │ ⚙ web.search "LLM memory… │ │ │ │ │ ╰───────────────────────────╯ ╰───────────────────────────╯ ╰───────────────────────────╯ ╰───────────────────────────╯ ⠋ gather · @researcher · claude-sonnet-5 running · 5 tool calls · needs plan ⚙ web.search "LLM memory architectures" · 480ms · 8 results ⚙ web.read arxiv.org/abs/2404.… · 1.2s · 44KB ⚙ web.read arxiv.org/abs/2405.… · 940ms · 31KB 1/4 done · 1 running · 1.2k tokens · 12.0s
🔬Find out what one node actually did
A run you can only read as a whole is a run you cannot debug. Every node's model, cost and transcript is written the moment it lands — so you can open one, follow a detached run from another pane, or run a single node again and take its downstream with it.
❯ @flow nodes last ✓ plan done @planner · claude-sonnet-5 · 4.2s · 9000 tokens · 3 tool call(s) ✗ apply failed @coder · claude-opus-5 · ×2 · 12.3s · 4 tool call(s) ❯ @flow node last apply ← its edges, its cost, and what it said ❯ @flow watch last ← follow a --bg run from any pane ❯ @flow retry last apply ← and everything built on it
🩺Fix the bug somebody just reported
Reproduce first — a fix for a bug you never reproduced is a guess with a commit message — then find the cause, patch it, and re-run the same check until it is genuinely gone.
❯ @flow fix "CSV export drops the last row when the file has no trailing newline" ✓ reproduce @tester made it fail on purpose ✓ locate @explorer writer.rs:212 — the flush is skipped ✓ patch @coder + a regression test ✓ verify @tester VERDICT: PASS
📚Documentation that is actually true
The document graph writes the file, then a reviewer checks every claim against the source and sends it back until nothing is wrong. The loop turns on the file on disk, so each pass sees the last one's edits.
❯ @flow document "the plugin system — write docs/plugins.md" ✓ read @explorer ✓ draft @writer wrote docs/plugins.md ✗ check @reviewer VERDICT: FAIL — 2 claims contradict the code ✓ revise @writer fixed both ✓ check @reviewer VERDICT: PASS
🏗Scaffold with your conventions, not the internet's
Your ~/.aiTerminal/aiTerminal.md and folder memories teach it the house style once — every run after follows it.
❯ @coder "add a new /health endpoint following our handler pattern" ∴ recalling: handlers live in api/handlers, one file per route, table-driven tests… ⚙ fs.write api/handlers/health.rs · 5ms · 890B
Read code like you wrote it
🗺Learn a codebase you just cloned
@explorer is read-only and fast — pipe the map straight into a file.
❯ git clone github.com/org/service && cd service ❯ @explorer "map the request lifecycle from route to DB" > MAP.md ✓ 22s · 9 tools · 18k in / 1.2k out (16.2k cached, 90%)
Nine tool calls, and the prompt behind them was paid for once: the first turn writes the cache, every turn after reads it.
👀Pre-merge review without leaving the repo
The review graph maps the code once, then runs three reviewers at the same time — correctness, security, design — and merges what they found.
❯ @flow review "the changes on this branch vs main" ✓ map · ✓ correctness · ✓ security · ✓ design · ✓ report 1. parser.rs:88 — CRLF input splits wrong … 2. cache.rs:41 — eviction races the reader …
🔐Security audit sweep
A read-only reviewer with a security skill — it can look, it cannot touch.
❯ @reviewer "audit the auth module: injection, secrets, unsafe patterns" ⚙ fs.search "password" · 12ms · 9 results 1. login.rs:52 — the SQL string is concatenated …
📄Spec vs implementation
Attach the PDF and the source file; get a compliance diff in plain language.
❯ @reviewer does the parser match the spec? @rfc.pdf @src/parser.rs Mostly — §3.2 requires CRLF tolerance; parser.rs:88 only splits on \n. §4.1 limits are enforced. …
🖼Debug from a screenshot
Attach images with @path — vision models read them inline.
❯ @ai why does the layout break like this? @shots/bug.png The sidebar's flex container is missing min-width:0 — the table forces it wider than its track …
🏛Git archaeology
"Why does this line exist?" — the session context carries the blame output into the question.
❯ git log -S "retry_after" --oneline | head -3 ❯ @ai summarize why this was introduced and what depends on it Added in a1c2f3 after the 429-storm incident: the backoff…
🎓Explain before you run
Paste-from-the-internet safety: ask what it does first — and the guard still checks it after.
❯ @ai explain: curl -fsSL get.example.sh | sh Downloads a script and pipes it straight to your shell — you're executing unreviewed remote code. … ⚠ curl | sh is confirm-tier by default
📎Attach the log, not a paste
Any @<path> text file inlines into the prompt (≤48 KB, redacted first).
❯ @ai why did this build fail? @build.log The linker error at line 214 comes from two versions of zlib — your Makefile pins one, pkg-config found the other…
🐙One agent, parallel scouts
@coder delegates read-only sub-agents with task.run — parallel exploration, bounded and safe.
❯ @coder "compare how auth works in api/ vs legacy/" └ task.run → 2 sub-agent(s): @explorer @explorer Both wrap JWTs, but legacy/ refreshes in middleware while api/ refreshes at the client — that's your drift.
📚Docs from the code that's actually there
An agent that reads the real functions writes docs that don't lie.
❯ @job document the public API of src/client.rs into docs/client.md --bg ▶ background job 1753115400-7210 monitor: @job · @job log last -f
Production, without the panic
🚨Incident response, 2 a.m.
Ask in plain words; run what you can read. "It" resolves to the crashing pod you just saw.
❯ kubectl get pods | grep -v Running api-7d4b… CrashLoopBackOff ❯ @ai show me the last 50 log lines of it, previous container ❯ kubectl logs api-7d4b… --previous --tail=50
🔎Log forensics without awk golf
Describe the slice you need; review the pipeline it builds.
❯ @ai count 5xx by endpoint in access.log for the last hour ❯ press Enter to run (or edit) ❯ awk -v d="$(date -v-1H +%H)" '$4~d && $9~/^5/ {c[$7]++} END {for (k in c) print c[k], k}' access.log | sort -rn
🐳Container hygiene, safely
In manual mode (the default) every AI-proposed command preloads for review — nothing runs until you press Enter.
❯ @ai clean everything unused ❯ press Enter to run (or edit) ❯ docker system prune -af --volumes
📊Babysit a long migration
Split the window: migration left, a watcher right — one glance, whole picture.
# pane 1 ❯ ./migrate --all # pane 2 ❯ @ai watch the error rate in api.log every 10s ❯ watch -n10 "grep -c ERROR api.log"
🌍SSH without losing your bearings
OSC-7 keeps the status bar showing the remote host and path; the switcher finds the tab by "prod".
❯ ssh deploy@prod # status bar: 📁 /var/www · deploy@prod # ⌘P "prod" → jump straight back here
🔏Cert & expiry checks on demand
Nobody remembers the openssl incantation. Nobody has to.
❯ @ai when does the TLS cert on api.example.com expire? ❯ echo | openssl s_client -connect api.example.com:443 2>/dev/null | openssl x509 -noout -enddate notAfter=Oct 12 08:21:44 2026 GMT
🧯Your own guard rules
The three tiers are config: add a [[guard.command]] table with rule = "confirm" and it binds you and every agent.
# config.toml: confirm_commands = ["reset --hard"] ❯ @ai roll back to the previous release tag ⚠ review before running — matches a confirm rule /reset --hard/ ❯ git reset --hard v2.4.1
✈️Fully local, fully private
Point the pool at Ollama or LM Studio and nothing ever leaves your machine — @ai works on a plane.
# [[ai.model]] provider = "ollama"; id = "llama3" ❯ @ai summarize the failing tests in @test.log ∴ local model · no network egress
🛟AI that fails over
Set strategy = "failover" — cloud first, local fallback — and a provider outage doesn't stop your run (it tries the next candidate before any output, with transient errors retried + backoff first).
# [ai.balance] strategy = "failover" # then anthropic, then ollama (order = fallback order) ❯ @coder "fix the flaky retry test" provider timeout → failing over to llama3 (local) ✓ 34s · 5 tools — the run finished anyway
⚡Hands-free read-only ops
[ai] mode = "auto": safe-listed inspection commands run immediately; anything mutating still stops for you.
❯ @ai how far is this branch behind main? ❯ git rev-list --count HEAD..origin/main ← ran (read-only git is safe-listed) 14
📟Vitals at a glance
The sysinfo plugin keeps load and battery in the status bar; a dashboard when you want more.
❯ sysinfo
cpu 12% · mem 9.2/32 GB · disk 412/994 GB
load 2.1 1.8 1.6 · battery 84% (charging)
Your terminal, from your phone
🤝Pair once — a stranger gets nothing
The six-digit code prints in your terminal. Until someone types it, an unknown chat gets no reply at all — not even a hint the bot is live.
❯ @gate telegram start ⬤ telegram gate live · @mourad_term_bot pair from the chat: /pair 418-207 (nothing runs until you do) ▸ unknown chat 8814… — no reply sent (not paired)
🚂Answer Claude Code from the train
Start an interactive CLI in the gated shell and the gate attaches: the chat becomes its screen — one message, edited in place — and its numbered question becomes buttons.
You ▸ claude Bot ◂ ▶ attached to claude — send text to type into it. You ▸ add a --json flag to export Bot ◂ Do you want to make this edit? ❯ 1. Yes 2. Yes, and don't ask again [ 1 · Yes ] [ 2 · Yes, and… ] [ 3 · No, tell… ]
🛡The guard still applies remotely
A remote command meets the same guard as an AI suggestion — denied outright, or held until you reply /yes.
You ▸ rm -rf / Bot ◂ ✗ blocked by guard — matches a denied pattern. You ▸ git push --force Bot ◂ ⚠ confirm — reply /yes to run it. You ▸ /yes
🙈Secrets never reach the chat
Your [[guard.secret]] rules apply to everything leaving the machine — both scopes, because a chat app is off-machine either way. Your screen still shows the real thing, and a command you send back carrying a placeholder runs here with the real value in it.
You ▸ cat .env Bot ◂ AWS_ACCESS_KEY_ID=«redacted» ANTHROPIC_«redacted» LOG_LEVEL=debug ◂ sent 3 lines to telegram · 2 redacted
🌙Check the long build from bed
A long command sends progress notes and always finishes with its real exit status — never abandoned part-way. /status says what's happening right now.
You ▸ cargo build --release Bot ◂ ⏳ still running — 2m elapsed. Bot ◂ ❯ cargo build --release · ✓ 0 · 2m41s You ▸ /status Bot ◂ gate · idle host mourad-mbp completion detection: exact
🔑The password prompt, handled
When a command goes quiet waiting for input, the gate sends what it has and routes your next message to its stdin instead of starting a new command.
You ▸ sudo dscacheutil -flushcache Bot ◂ ⌨ sudo is waiting for input: Password: Bot ◂ Your next message goes to it, not to a new command. ▸ Mourad sent 8 characters to stdin
🪟Run something while vim owns the shell
/run is refused rather than fired unattended minutes later. /sh runs out-of-band in its own shell; /shot gets you the screen in colour.
You ▸ /run git diff Bot ◂ vim is using the terminal — there is no shell to run that in. Try /sh git diff. You ▸ /sh git diff --stat Bot ◂ ❯ git diff --stat · ✓ 0 · 0.2s
🧠Your terminal's own AI, from the chat
/ai reaches the same models, memory and redaction as @ai at the keyboard — no second account, no second config.
You ▸ /ai why is the release build so slow? Bot ◂ lto = "fat" and codegen-units = 1 trade build time for runtime speed. Try lto = "thin".
🔒Close it from either side
@gate stop from any pane, /stop from the chat, exit in the pane, or idle_timeout_minutes. Stopping always restores the terminal.
❯ @gate status telegram gate-8f2a pid 40118 · Mourad ❯ @gate stop ⬤ gate closed — raw mode off, cursor back
Jobs do it while you don't
📦Multi-repo sweeps
Read-only agents shine at boring audits — fan them out as background jobs.
❯ for r in api web infra; do (cd $r && @job list GPL deps with versions --agent reviewer --bg) done ❯ @job # three jobs running, three logs
🧾Data wrangling without man pages
Stop googling awk syntax. Review the one-liner, then run it.
❯ @ai sum column 3 of sales.csv grouped by column 1 ❯ awk -F, '{s[$1]+=$3} END {for (k in s) print k, s[k]}' sales.csv
🗂Batch renames, reviewed first
The command is printed before anything moves — edit it, then commit.
❯ @ai rename all *.jpeg here to *.jpg ❯ press Enter to run (or edit) ❯ for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done
🗓The Friday report, from git
Your week, summarized from what actually merged — as a job, into a file.
❯ @job summarize this week's merged PRs into WEEK.md --bg ▶ background job 1753116000-8104 ✓ done · 38s — WEEK.md written
⏰Say when, in plain English
End a task with a natural time and it is scheduled — it runs later, in the folder where you typed it.
❯ @job back up the db in 2 minutes ⧖ scheduled job 1753112100-4310 — fires in 2m ❯ @job post the standup summary at 09:00 ❯ @job cancel 1753112100-4310
🪵Watch a job like a log file
Every job is a folder: job.toml for what to run, when, and how the last run went, plus runs/<n>.md — one log per occurrence. Closing the terminal never kills it.
❯ @job audit the deps --agent reviewer --bg ▶ background job 1753112000-4242 ❯ @job log 4242 -f ❯ @job clear # prune everything finished
🔤Convert anything, hash anything
The encode plugin: base64, hex, URL, JSON, SHA, UUID — no web tools, nothing leaves your machine.
❯ b64 "user:pass" # dXNlcjpwYXNz ❯ sha release.tar.gz # 9f86d08…a4c2 ❯ uuid # 8f4e…-…-c21a
🔌Plug your company tools in — MCP
Declare a Model-Context-Protocol server under ai/mcp/; its tools join the catalog as mcp.<server>.<tool>.
# ~/.aiTerminal/ai/mcp/jira.toml ❯ @coder "what's assigned to me this sprint?" ⚙ mcp.jira.search {"assignee":"me"} · 240ms · 1.8KB Three tickets: API-231 (rate limits), API-238, INFRA-12.
🌐Translate your terminal's strings
i18n as data: hand the catalog to an agent, get a locale back.
❯ @job translate i18n/en.toml to German into i18n/de.toml --bg ✓ done — 41 keys, same structure, CI parity holds
The thousand little wins
⏳Never wonder what it is doing
A model call is the only thing here that takes seconds, and every one of them says what it is for rather than leaving a dead terminal. Work that finishes at once shows nothing at all — and while you wait, one dim line teaches you something.
❯ @job summarise yesterday's logs tomorrow at 9 ⠹ reading when to run this… ⧖ every day at 09:00 — summarise yesterday's logs fires in 14h · it survives this terminal ⠹ thinking… · @flow retry <node> re-runs it and everything built on it
🩺When it breaks, it says so
A run that hits its step budget still hands back what it found. A node that fails shows why on its card, everything behind it reads ⊘ blocked, and the tally counts every state — so a finished run never looks like one still going.
3 nodes · 3 agents · 24 tools · 8 skills · 4 at a time · slowest path read→draft→check ╭────────────────────────────────╮ ╭────────────────────────────────╮ ╭────────────────────────────────╮ │ ✗ read ⚙16 │ │ ⊘ draft │ │ ⊘ check │ │ @explorer · claude-sonnet-5 │───▸│ @writer · claude-sonnet-5 │───▸│ @reviewer · claude-sonnet-5 │ │ the step budget of 12 ran out │ │ something it needed failed │ │ something it needed failed │ ╰────────────────────────────────╯ ╰────────────────────────────────╯ ╰────────────────────────────────╯ ✗ read · @explorer · claude-sonnet-5 failed · 11.5s · 30.0k tokens · 16 tool calls ⚙ fs.search "export" · 14ms · 6 results ⚙ fs.read src/export.rs · 9ms · 8.2KB ⚙ fs.read src/format.rs · 8ms · 4.1KB 0/3 done · 1 failed · 2 blocked · 30.0k tokens · 11.6s
🏝Work / personal / ops identities
Profiles switch theme, AI models, plugins and the whole saved workspace in one command.
❯ @profile work switched to profile 'work' — applies within a second # Opus for work, local Ollama for personal — different pools per profile
🧠A terminal that remembers
Agents curate a BM25-ranked markdown memory (memory.* tools) — recalled automatically in every future run.
❯ @coder "remember: deploys go through make ship, never push main directly" ⚙ memory.add decision · 3ms · 96B recalled automatically in future runs — plain markdown, no database
✂️Edit the command like a text field
⌥/⌘ arrows jump by word or line ends; add ⇧ to select. Type to replace, ⌫ deletes, Esc cancels, ⌘C copies — pure zsh, the lineedit plugin.
❯ cargo test --workspace # ⇧⌥← selected the flag ❯ cargo test --doc # typed over it — replaced in place # a light band, your syntax colors stay on top · Enter on a mouse selection copies it
🗜Extract anything, jump anywhere
x handles 15+ archive formats; jump learns your directories by frecency.
❯ x release.tar.zst # extracted → ./release/ ❯ j terminal # → ~/Data/Projects/the-terminal
📝Notes at the prompt
Capture the thought without leaving the flow — notes lists them back.
❯ note "rotate the staging certs before Friday" ❯ note "bump MSRV after 1.96 lands" ❯ notes # 2 notes
🔎Search 19 engines without a browser tab first
Google, Stack Overflow, GitHub, MDN, crates.io, PyPI — straight from the prompt.
❯ so "borrow checker E0502 split at mut" ❯ crates "toml parser no_std"
📖Read a README without leaving the shell
@md render pretty-prints Markdown with diagrams drawn natively; @md edit is a live split — source left, rendered preview right.
❯ @md render README.md ❯ @md edit notes.md ┌ notes.md ● (42L) ──────┬────────────────┐ │ 1 # Release plan │ Release plan │ │ 3 - cut the branch │ • cut the br… │
⌨️Bind it the way your hands expect
Keymaps are TOML too. Modifier names are forgiving (cmd/super, alt/opt), and a number binding still fires on a layout where the digit needs Shift.
# ~/.aiTerminal/keymaps/mine.toml
[[keybinding]]
key = "cmd+shift+d"
action = "split_down"
🎨Make the 20th theme yours
@theme export prints the full normalized TOML — the perfect starting point.
❯ @theme export midnight > ~/.aiTerminal/themes/mine.toml ❯ vim ~/.aiTerminal/themes/mine.toml # change accent, done ❯ @theme mine theme 'mine' applied to profile 'default' — a running window restyles within a second
📦Write an agent, share the file
An agent is one Markdown file: front-matter picks its tools, the body is its system prompt. Drop it in and @<name> works.
❯ cat ~/.aiTerminal/ai/agents/api-reviewer.md --- tools = ["fs.read", "fs.search", "sys.run"] skills = ["code-review"] max_steps = 12 --- You review changes against our API conventions… ❯ @api-reviewer check my changes against our API rules
🤝Onboard the new teammate
Point them at the repo with aiTerminal installed — the codebase explains itself.
❯ @ai where do I add a new API route in this project? Routes live in api/routes.rs; each handler is a file in api/handlers/. Register it in ROUTES, add a table test…
None of this needs a repo
A terminal is just a place to type. Everything below works on a folder of documents, a question you have, or a file somebody sent you — and every one of them is a command you can copy and run today. Where something needs more than a model key, it says so.
📄Read the long PDF for me
Any @<path> that names a real file rides along with your question. PDFs and images go as-is; text files are inlined.
❯ @ai summarise @~/Downloads/tenancy-agreement.pdf — what am I agreeing to, in 10 bullets ✦ claude-opus-4-8 · 1 document 1. Twelve-month fixed term, then rolling monthly … needs a model with document support, or the file is skipped (images: vision)
🔎Get a real answer, with real sources
The research flow splits your question into parts, looks each one up in parallel, then reports what the sources say — and where they disagree.
❯ @flow "what is a landlord actually required to fix, and how fast" ▸ research — asks for sources and a comparison ✓ plan @planner → 5 sub-questions ✓ gather @researcher × 5, at once ✓ report @writer search is keyless — no extra account, just [ai] network = true
🧺Tidy this folder — but let me look first
@ai proposes one command and preloads it for review. You read it, edit it, press Enter — or don't. Nothing runs behind your back.
❯ @ai move every screenshot on my Desktop into ~/Pictures/Screenshots, in folders by month ❯ press Enter to run (or edit) ❯ for f in ~/Desktop/Screen*.png; do d=~/Pictures/Screenshots/$(date -r "$f" +%Y-%m); mkdir -p "$d"; mv "$f" "$d"/; done
🗂Rename a pile of photos sensibly
Same review-first path. Ask in your own words; read the command before it touches anything.
❯ @ai rename the photos in ~/Pictures/trip to trip-01.jpg, trip-02.jpg … in date order ❯ press Enter to run (or edit) ❯ i=1; ls -tr ~/Pictures/trip/*.jpg | while read f; do mv "$f" "$(dirname "$f")/trip-$(printf %02d $i).jpg"; i=$((i+1)); done
🧾Make this export readable
A .csv, .txt or .md attachment is inlined straight into the question — no tool call, no setup.
❯ @ai turn @sales-q3.csv into a markdown table and tell me the three biggest movers | region | q2 | q3 | change | |---|---|---|---| | north | 41 | 58 | +41% | Biggest movers: north, then iberia; apac fell 12% …
📰Read a long page without the browser
@researcher can fetch and read. (@ai cannot — it has no tools; it answers or proposes a command.)
❯ @researcher "what does this actually say — https://example.org/policy-update" ⚙ web.read https://example.org/policy-update · 1.1s · 22KB Three changes matter to you, one takes effect in March … every claim carries its source; what it couldn't confirm is listed
✍️Draft it, and save the file
@writer writes to disk rather than printing at you — and marks anything it could not verify instead of smoothing over it.
❯ @writer "turn @notes.md into a one-page brief at brief.md" ⚙ fs.read notes.md · 4ms · 3.9KB ⚙ fs.write brief.md · 6ms · 2.1KB Wrote brief.md — the decision first. Two claims marked unverified.
✂️Hold it under the word count
@loop needs a command whose exit status decides — and that does not have to be a test suite. wc and test are enough.
❯ @loop "cut the intro in intro.md under 200 words without losing the point" \ --agent writer --check "test $(wc -w < intro.md) -lt 200" ▶ iteration 1/5 … check: exit=1 ▶ iteration 2/5 … check: exit=0 ✓ goal reached after 2 iteration(s)
🗓A weekly digest, in plain English
Say when in your own words. The AI reads the schedule once and stores it as cron — every run after that is arithmetic, and a missed one catches up.
❯ @job "every Monday at 9, summarise what landed in ~/Documents/inbox into weekly.md" ⧖ every Monday at 09:00 — summarise what landed … · job 1753112060-4302 cron 0 9 * * 1 · fires in 3d · cancel: @job cancel 1753112060-4302
📖Write and see it at the same time
@md edit is a split: your Markdown on the left, the rendered page on the right — diagrams and tables drawn in the terminal. No model, no network.
❯ @md edit letter.md ┌─ letter.md ────────┬─ preview ──────────┐ │ # Dear board │ Dear board │ │ - point one │ • point one │ └────────────────────┴────────────────────┘
📱Ask it from the bus stop
Pair a chat app to this pane and type at it from your phone. The same guard applies, and your secrets are redacted before anything leaves.
❯ @gate telegram start ⬤ telegram gate live · @your_term_bot pair from the chat: /pair 418-207 (nothing runs until you do) then, from the bus stop: "did the weekly digest run?"
🎨Make it yours in one command
19 themes, live — the whole window restyles within a second. No settings window anywhere in this product.
❯ @theme themes in ~/.aiTerminal/themes (19): ○ alpine ○ coral ○ cosmic-orange ○ deep-purple ○ gold ○ graphite ○ lavender ○ light-gold ● midnight ○ mist-blue ○ nebula ○ pink ○ product-red ○ sage ○ sky-blue ○ solar-flare ○ starlight ○ sunset ○ titanium ❯ @theme sunset theme 'sunset' applied to profile 'default' — a running window restyles within a second