Automation

Supported agents

Every coding agent diri ships a manifest for, what each supports for status, resume, fork and MCP, and how to add your own agent with a custom manifest.

diri knows how to launch and read 20 terminal coding agents, plus a plain shell. Each one is described by a JSON manifest that says how to start it, how to resume it, and how to tell from its screen whether it is working, idle or waiting for you.

Agent catalog

AgentCommandStatus fromResumeForkQuick approvediri MCPHooks
Claude CodeclaudeHooksExact conversationYesYesAutoYes
CodexcodexScreenExact conversationYesYesAutoTurn-complete notify
Cursorcursor-agentScreenExact conversationNoYesAutoYes
GeminigeminiScreenExact conversationNoYesNoNo
AideraiderScreenLatest in folderNoNoNoNo
AmpampScreenNoNoNoNoNo
AntigravityagyScreenLatest in folderNoNoNoNo
Cline CLIclineScreenNoNoYesNoNo
Copilot CLIcopilotScreenLatest in folderNoYesNoNo
DevindevinScreenLatest in folderNoNoNoNo
DroiddroidScreenLatest in folderNoNoNoNo
GrokgrokScreenLatest in folderNoYesNoNo
HermeshermesScreenLatest in folderNoNoNoNo
Kilo CodekiloScreenLatest in folderNoNoNoNo
KimikimiScreenLatest in folderNoYesNoNo
Kirokiro-cliScreenLatest in folderNoNoNoNo
MakimakiScreenLatest in folderNoYesNoNo
OpenCodeopencodeScreenLatest in folderNoYesNoNo
PipiScreenPer sessionNoNoNoNo
Qoder CLIqodercliScreenLatest in folderNoNoNoNo
Shellyour login shellProcess onlyNoNoNoNoNo

What the columns mean:

ColumnMeaning
Status fromHooks: the agent reports its own lifecycle events. Screen: diri reads the terminal with manifest rules. Process only: diri knows only whether the process is alive.
ResumeExact conversation: diri knows the conversation id and reopens that one. Per session: diri gives the agent its own storage folder per session, so "continue" picks the right one. Latest in folder: the agent's own "continue the most recent session" flag, which can pick a different conversation if you ran the agent elsewhere in the same folder.
ForkStart a new conversation that branches from this one.
Quick approveThe manifest defines a safe one-key answer for permission prompts.
diri MCPdiri's MCP server is added to the agent at launch, so it can start and coordinate other agents. Any other agent can be connected by hand.
Hooksdiri installs the agent's hook or notify callback for more accurate status.

Install and detect agents

diri does not bundle any agent. It finds the CLIs already on your machine.

Open Settings → Agents:

ControlWhat it does
Execution targetPick your Mac or a remote host. Each has its own agent list.
RefreshRescan for installed agents.
Add…Point an agent that was not found at its executable. Shown as Change once an agent is found.
InstallFor agents with a published one-line installer, shows the full command in a confirmation sheet. Only after you confirm does diri type it into a Terminal session in your home folder. Offered for this Mac only.
QuickInclude the agent in quick-create menus.

On your Mac, diri looks for agents on the PATH from your login shell, then in common user install folders such as pnpm, Bun, Cargo, mise and Volta. A path you choose with Add… wins over PATH. Missing agents stay listed in Settings but are hidden from quick-create menus.

Add your own agent

You can add an agent diri does not ship, or replace a built-in manifest, without building diri.

  1. Write a JSON manifest. The filename, top-level id and agent.id must match, for example my-agent.json with "id": "my-agent".
  2. Put it in the overrides folder:
PlatformOverrides folder
macOS~/Library/Application Support/Dirijor/manifests/overrides/
Linux~/.config/diri/manifests/overrides/
  1. Restart the Engine. The catalog is read once when the Engine starts. Quitting diri with no running sessions stops the Engine, and opening diri starts it again.

A file with the same id as a built-in manifest replaces it. A new id adds an agent. A malformed file is skipped and the rest of the catalog still loads.

A minimal manifest

This screen-driven manifest is enough for most terminal agents:

JSON
{
  "schemaVersion": 2,
  "id": "my-agent",
  "version": "2026.10.01.1",
  "statusModel": "full",
  "agent": {
    "id": "my-agent",
    "displayName": "My Agent",
    "shortLabel": "my-agent",
    "aliases": ["myagent"],
    "firstClass": true,
    "statusAuthority": "screen",
    "binary": "my-agent",
    "returnToLoginShell": true,
    "approve": { "text": "y", "submit": true }
  },
  "rules": [
    {
      "id": "permission",
      "state": "blockedPermission",
      "priority": 1000,
      "region": "bottom_non_empty_lines",
      "regionLines": 8,
      "when": { "contains": "allow this command?" }
    },
    {
      "id": "working",
      "state": "working",
      "priority": 900,
      "region": "bottom_non_empty_lines",
      "regionLines": 3,
      "when": { "contains": "esc to cancel" }
    },
    {
      "id": "idle",
      "state": "idle",
      "priority": 500,
      "region": "bottom_non_empty_lines",
      "regionLines": 1,
      "when": { "lineRegex": "^>\\s*$" }
    }
  ]
}

Essentials

FieldWhat it does
binaryThe command to run. diri runs it directly, never through a shell string.
statusModelfull for rule-driven status, processOnly for liveness only.
returnToLoginShellWhen the agent exits, leave a login shell in the tab instead of closing it.
approve, denyText typed for quick approve or deny. Omit approve when no answer is always safe.
conversationArgument lists for fresh, resumed and forked conversations, using {id}, {newId} and {sessionDir}.
rulesChecked from highest to lowest priority. The first match sets the status.

Rule states are working, idle, blockedPermission, blockedQuestion and skip. Predicates are contains, regex, lineRegex, progress, and any, all and not to combine them. Regexes use Rust's regex syntax, which has no lookaround or backreferences.

Put blockers around priority 1000, working around 900 and idle around 500, so a permission form beats a spinner still visible behind it. Match several literal strings the agent really draws rather than one broad regex.

Validate it

  • Start the agent from diri and walk it through idle, working and a permission prompt.
  • If a state is wrong, open Session Inspector → Info → Why Diri thinks this and use Copy status debug info to see which rule matched.
  • When contributing a manifest to diri, run the engine tests, which decode every bundled manifest and reject unsupported regexes:
Terminal
cd diri
cargo test -p diri-engine

The full schema, regions, capture settings and safe fixture capture are in docs/AGENT-MANIFESTS.md.