Repo runbooks are in Free and Pro. Explain a failed command is Pro. See Editions.

When a tab’s folder is inside a repository, Termorq looks for the tasks the repository already defines and puts them one key away. It only reads files on your disk. There is no network call, and nothing runs until you choose a task.

After cd into a repository, a strip lists six detected runbooks with keys 1 to 6
After cd into a repository, the strip shows what it found. 1–6 run a task, Tab puts it in the prompt to edit first, Esc dismisses.

Where the tasks come from

The repository root is the nearest folder with .git, or the tab’s folder when it has one of the files below.

SourceWhat becomes a task
package.jsonEach script, in file order. Lifecycle scripts (install, prepare, …) and pre/post hooks are skipped. The package manager comes from the lockfile: pnpm-lock.yaml, yarn.lock, bun.lock/bun.lockb, then package-lock.json. Without a lockfile, the packageManager field decides, else npm
Cargo.tomlcargo build, cargo test, cargo clippy, cargo run (the only binary or default-run), and cargo run --bin <name> for each binary when there are several. Also read from Cargo.toml one folder down, such as src-tauri/, when the root is not a workspace
.termorq/Runbooks you write for the repository (format below), and Markdown runbooks in .termorq/runbooks/*.md, which open with @md
MakefileTargets, with the ## description after the target or the comment above it. Pattern rules, special targets and variables are skipped
justfileRecipes, with their doc comment or [doc("…")]. Private recipes (_name or [private]) are skipped. A recipe that takes arguments goes into the prompt for you to finish

Detection runs in the background, so typing never waits on it. The result is cached by the files’ sizes and change times and refreshed when you change folder, when a command finishes, and when the window gets focus. A file that cannot be read shows on its chip with ⚠ and the reason, and the other files still work.

@run and the repo chip

Type @run (or @runbooks) to open the list with a filter. @run test starts filtered. The runbooks chip in the status strip opens the same list.

The @run palette with a filter, a pinned runbook first and two marked destructive
@run opens the list with a filter. A pinned runbook sorts first; destructive ones are marked.

KeyDoes
1–9Run that task (when the filter is empty)
EnterRun the selected task
TabPut the selected task in the prompt to edit first
ArrowsMove through the cards
EscClose

☆ pins a task for this repository, and pinned tasks come first. Pins stay on this computer.

The strip after cd appears once per repository per session, when the tab moves into a different repository with tasks. While the prompt is empty, the same keys work; typing anything else dismisses it.

Running a task

A task is typed into the prompt and submitted, like any command, so it shows in the scrollback and history. It runs in this tab when the tab is idle in the task’s folder on this computer. An SSH remote path is not that folder. A tab whose terminal is taken over does not run the task here. Otherwise it opens a new tab there, so your tab never changes folder behind you.

Termorq asks first:

  • the first time you run a task in a repository;
  • for anything that looks destructive, such as clean, reset, deploy, publish, rm -rf, git push, docker volume rm or terraform apply;
  • for anything its file marks confirm: true (or a just recipe marked [confirm]).

Edit first puts the line in the prompt instead.

The confirm dialog for a destructive runbook marked confirm: true
A destructive runbook always asks, and says why.

The .termorq format

Put runbooks in .termorq/runbooks.yml, .termorq/runbooks.yaml or .termorq/runbooks.toml, or one file per topic in .termorq/runbooks/. Commit them so the whole team gets the same list.

# .termorq/runbooks.yml
runbooks:
  - name: Docs preview
    description: Hugo with drafts
    run: hugo server -D
    cwd: docs/learn
  - name: Release smoke
    description: Build, sign and launch the bundle
    steps:
      - pnpm tauri build
      - ./scripts/smoke.sh
    confirm: true
  - name: Reset local data
    run: ./scripts/reset-local.sh
    destructive: true
# .termorq/runbooks.toml
[[runbooks]]
name = "Seed the database"
description = "Load the sample data"
run = "pnpm db:seed"
confirm = true
FieldMeaning
nameRequired. The card’s title
runThe command line. Use run or steps, not both
stepsSeveral one-line commands, joined with && so it stops at the first failure
descriptionOptional second line
cwdOptional folder inside the repository to run in
confirmtrue asks before every run
destructivetrue marks it destructive (it always asks)

A YAML file may also be a bare list of entries. Unknown keys, a missing name or command, a cwd outside the repository, and duplicate names are reported on the source chip, and only that entry is skipped.

Explain a failed command

Pro — Explain a failed command is a Pro feature.

When a command exits non-zero (Ctrl+C does not count), its line gets ✦ Explain. Click it to open the Explain panel under the output. It sends the command, its exit code and the last 40 lines of output to your own AI connection. Termorq masks secrets and tokens before anything is sent, then says how many values it masked. The model is asked for the likely cause and one fix.

For a persistent shell, those lines are the combined terminal text in the order it was received, with that command’s exit status, folder, and shell. The text is not labelled as stderr. Later app output is not included. Put in prompt only fills the prompt.

The Explain panel under a failed docker compose command, with a suggested fix
Explain under a failed command: the cause, a suggested fix, and what was sent.

The suggested fix has Put in prompt and Copy. It never runs by itself. Press Enter when you are happy with it.

Explain uses the tab’s AI connection when it has one (from @openai), else asks you to pick one. It is the same panel and masking as Explain failure for CI jobs. In Free, the chip and panel show the Pro badge and what Pro adds, and nothing is sent.