Skip to content

Getting Started with AOF

AOF orchestrates teams of agents the way you would orchestrate teams of people — with org charts, enforced workflows, shared memory, and collaborative task management. It works for any domain: software engineering, RevOps, operations, sales and marketing, research, or any process that needs governance across multiple agents.

This guide walks you through installing AOF, defining your first agent team, and watching the platform orchestrate work across your agents. By the end, you will have a running AOF daemon that automatically routes, assigns, and dispatches tasks through your team.


Prerequisites

Before you begin, make sure you have:

  • Node.js >= 22.0.0 (LTS recommended)
  • An OpenClaw gateway running on your machine

AOF ships as two pieces:

  • aof-daemon — a user-level service (launchd on macOS, systemd on Linux) that owns the task store, scheduler, and IPC authority. One daemon per install.
  • OpenClaw plugin — a thin bridge that runs inside the OpenClaw gateway and connects to the daemon over a Unix-domain socket at ~/.aof/data/daemon.sock. It exposes AOF tools to agent sessions and handles agent spawns back to the daemon on demand.

The daemon and plugin trust boundary is the invoking user’s Unix uid; the socket is created with mode 0600. AOF is single-machine per install.

Tip: Check your Node version with node --version. If you need to upgrade, use nvm or your system’s package manager.


Installation

Install AOF using the one-line installer:

Terminal window
curl -fsSL https://raw.githubusercontent.com/d0labs/aof/main/scripts/install.sh | sh

The installer will:

  1. Download the latest AOF release tarball
  2. Extract it to ~/.aof/ (code) and scaffold ~/.aof/data/ (user data)
  3. Install Node.js dependencies
  4. Run aof setup --auto to complete configuration
  5. Install and start the aof-daemon user service (Migration 007)

You can also specify a custom install path or version:

Terminal window
sh install.sh --prefix /custom/path --version 1.15.0

First-time Setup

After installation, AOF runs aof setup automatically. If you need to re-run it:

Terminal window
aof setup

The setup command does the following:

  1. Wizard (interactive) — Asks about your data directory, org chart location, and OpenClaw integration preferences. Use --auto to accept all defaults.
  2. Directory scaffolding — Creates the AOF data directory structure (tasks, events, views, memory).
  3. Migrations — Runs pending packaging migrations. Migration 007 installs the aof-daemon service if it is not already present.
  4. OpenClaw plugin wiring — Registers AOF in your openclaw.json gateway config. If OpenClaw is not detected, setup continues with a warning.
Terminal window
# Non-interactive setup with defaults
aof setup --auto --template minimal

Create Your Org Chart

The org chart is a YAML file that defines your agents, teams, and routing rules. It is the single source of truth for “who can do what” in your organization.

Create a file called org-chart.yaml in your AOF data directory:

schemaVersion: 1
agents:
- id: main
name: Main Agent
description: General-purpose agent for all tasks
capabilities:
tags: [general]
concurrency: 1
comms:
preferred: send
fallbacks: [spawn, cli]
active: true
teams:
- id: default
name: Default Team
lead: main
routing: []

Key fields

FieldTypeDescription
schemaVersion1 (literal)Schema version, always 1
agentsarrayList of agent definitions
agents[].idstringUnique agent identifier (must match OpenClaw agent ID)
agents[].namestringHuman-readable display name
agents[].capabilities.tagsstring[]Capability tags used for routing
agents[].capabilities.concurrencynumberMaximum concurrent tasks (default: 1)
agents[].comms.preferredspawn | send | cliPreferred dispatch method (default: send)
agents[].activebooleanWhether the dispatcher considers this agent (default: true)
teamsarrayTeam definitions for grouping agents
routingarrayTag/priority-based routing rules

For a complete schema reference, see the Configuration Reference.


Initialize AOF

Once your org chart is ready, initialize AOF:

Terminal window
aof init

The init command:

  • Validates your org chart against the schema
  • Sets up OpenClaw integration (plugin registration, memory module, skill definition)
  • Creates required directory structures

Use --yes for non-interactive mode or --skip-openclaw to skip OpenClaw integration:

Terminal window
aof init --yes

The Daemon

The aof-daemon is installed and started by the installer (Migration 007 via aof setup). It runs under launchd on macOS and systemd user services on Linux, so it restarts automatically on crash and survives reboot.

Check daemon status

Terminal window
aof daemon status

This queries the daemon’s health endpoint on the Unix socket and displays:

  • Whether the daemon is running
  • Last poll time and duration
  • Task counts by status
  • Active leases
Terminal window
# JSON output for scripting
aof daemon status --json

Other daemon commands

Terminal window
aof daemon stop # Stop the daemon gracefully
aof daemon install # Install or refresh the OS service file (idempotent)
aof daemon uninstall # Stop and remove the OS service file

You rarely need to run aof daemon install manually on a fresh install — the installer handles it. Run it if you moved the install directory, reset the service file, or need to re-register after an OS user reset.


Create Your First Task

Tasks in AOF are Markdown files with YAML frontmatter. You can create them via the CLI.

First, check which agents are available in your org chart:

Terminal window
aof org show

Then create a task routed to one of your agents:

Terminal window
aof task create "Implement user authentication" --priority high --agent <your-agent-id>

This creates a task file with the following structure:

---
schemaVersion: 1
id: TASK-2026-02-27-001
project: _inbox
title: Implement user authentication
status: ready
priority: high
routing:
agent: <your-agent-id>
tags: []
createdAt: 2026-02-27T12:00:00Z
updatedAt: 2026-02-27T12:00:00Z
lastTransitionAt: 2026-02-27T12:00:00Z
createdBy: cli
dependsOn: []
---

Task ID format

Task IDs follow the pattern TASK-YYYY-MM-DD-NNN (e.g., TASK-2026-02-27-001). They are generated automatically and are globally unique within a project.

Task statuses

StatusDescription
backlogCreated, not yet triaged
readyReady to be picked up by the scheduler
in-progressAgent is actively working (has a lease)
blockedWaiting on an external dependency
reviewWork complete, awaiting review
doneSuccessfully completed
cancelledCancelled by user or system
deadletterFailed dispatch 3 times, requires manual intervention

CLI options for task creation

Terminal window
aof task create <title> [options]
Options:
-p, --priority <priority> Priority: low, normal, high, critical (default: normal)
-t, --team <team> Target team for routing
-a, --agent <agent> Target agent (bypasses routing)
--tags <tags> Comma-separated capability tags
--project <id> Project ID (default: _inbox)

Watch It Dispatch

Once the daemon is running and you have a task in ready status, the scheduler will:

  1. Scan for ready tasks on each poll cycle
  2. Match tasks to agents using routing rules and capability tags
  3. Acquire a lease on the matched task (preventing double-dispatch)
  4. Dispatch the task to the agent — via the attached OpenClaw plugin (long-poll callback over daemon.sock) when one is connected, or via the standalone HTTP gateway adapter otherwise
  5. Track the task through in-progress, review, and done states

Monitor progress

Terminal window
# List all tasks with their current status
aof scan
# Display a Kanban board view
aof board
# View recent events (task transitions, dispatches, lease operations)
aof scan --recent

Example: watching a task flow

$ aof scan
STATUS COUNT
─────────────────────
ready 1
in-progress 0
done 0
$ aof daemon status
Daemon: running (PID 12345)
Last poll: 2s ago (42ms)
Tasks: 1 ready, 0 in-progress, 0 done
# After the scheduler dispatches your task:
$ aof scan
STATUS COUNT
─────────────────────
ready 0
in-progress 1
done 0
# After the agent completes the task:
$ aof scan
STATUS COUNT
─────────────────────
ready 0
in-progress 0
done 1

Next Steps

Now that you have AOF running with a dispatched task, explore these topics:


Troubleshooting

Daemon won’t start

Terminal window
# Check current state
aof daemon status
# Check for stale PID file
ls ~/.aof/data/daemon.pid
# Force stop and restart
aof daemon stop --force
aof daemon install

If the socket file ~/.aof/data/daemon.sock is stale, aof daemon install will unlink and recreate it at mode 0600 on the next start.

Task stuck in ready

  • Verify the daemon is running: aof daemon status
  • Check that the target agent exists in your org chart and is active: true
  • Ensure the agent’s capabilities.tags match the task’s routing.tags
  • Check for dispatch errors in the event log: aof scan --recent
  • If you see no-plugin-attached warnings in the daemon log, the OpenClaw plugin is not currently connected. The task is held in ready/ (not deadlettered) and will dispatch once the plugin reconnects.

OpenClaw integration issues

  • Verify OpenClaw is running: openclaw gateway status
  • Check plugin registration: look for "aof" in ~/.openclaw/openclaw.json under plugins
  • Re-run integration: aof init