An opinionated harness for running autonomous agents. Spawn opencode sessions with a prompt and let them work to completion, or connect to prog for automatic task scheduling.
+---------------+ +------------------+
| aetherflow | attach | opencode server |
af spawn ------>| (daemon) |---------->| (shared) |
af daemon ----->| af / aetherd |<----------| plugin events |
+---------------+ +------------------+
^ |
| poll (auto mode) | sessions
+-----------+ +------------+
| prog | | agent |
| task db | | processes |
+-----------+ +------------+
All agent sessions connect to a shared opencode server (opencode serve). The daemon starts and supervises this server automatically. A plugin on the server forwards session events (tool calls, messages, lifecycle) back to the daemon over its Unix socket, providing real-time observability without log files.
prog is a local task management CLI -- create, prioritize, track tasks, and capture learnings. opencode is an agent runtime that runs LLM sessions with tool access. aetherflow bridges them: spawn agents with a prompt (af spawn), or let the daemon auto-schedule from prog (--spawn-policy=auto).
brew install baiirun/tap/aetherflowRequires Go 1.25+.
go install github.com/baiirun/aetherflow/cmd/af@latestgit clone https://github.com/baiirun/aetherflow.git
cd aetherflow
go build -o af ./cmd/afaetherflow requires prog and opencode on PATH:
brew install baiirun/tap/prog
brew install opencode # or: curl -fsSL https://opencode.ai/install | bash# Install agent skills and review definitions
af install
# Spawn a one-off agent with a freeform prompt
af spawn "refactor the auth module to use JWT"
# Or in the background
af spawn "add rate limiting to /api/users" -dThe agent works in an isolated git worktree, implements the prompt, and creates a PR (or merges to main in --solo mode). No daemon or task tracker required -- the prompt is the spec, the PR is the deliverable.
# Start the daemon with prog integration
af daemon start --project myapp --spawn-policy auto
# Watch the swarm
af status -w
# Or launch the interactive TUI
af tuiIn auto mode, the daemon polls prog for ready tasks, spawns opencode agents in isolated git worktrees, and monitors their lifecycle. Each agent follows a structured protocol: orient, implement, verify, review, fix, land.
The daemon auto-starts a managed opencode server on http://127.0.0.1:4096. All agents connect to this shared server via opencode run --attach. The aetherflow plugin on the server streams session events back to the daemon for real-time observability.
Every agent session runs on a shared opencode server. You can attach to any running session to watch it work, send it messages, or intervene — then detach and the agent continues autonomously.
# List active sessions
af sessions
# Attach to a session interactively
af session attach <session-id>
# Inside the opencode TUI:
# - Watch the agent work in real-time
# - Send messages to guide or correct it
# - Quit the TUI (ctrl-c / q) to detachWhen you detach, the agent process keeps running — it's a separate process connected to the server. Your attach session is just a view into the same opencode session. This works for both af spawn agents and daemon pool agents.
You can also monitor without attaching interactively:
# Stream an agent's events
af logs <agent-name> -f
# One-shot status with tool calls
af status <agent-name>prog manages tasks. aetherflow consumes them.
# You (or another agent) create tasks in prog
prog add "Implement user auth endpoint" -p myapp --priority 1
prog add "Add rate limiting middleware" -p myapp --priority 2
# aetherflow polls prog, picks up ready tasks, and spawns agents
af daemon start -p myapp --spawn-policy auto
# Agents work autonomously:
# - Set up git worktree
# - Read task context from prog (description, logs, learnings)
# - Implement, test, review
# - Push branch + create PR (or merge to main in solo mode)
# - Log progress back to prog throughout
# You monitor from the TUI or CLI
af status -w
af logs worker-ts-a1b2c3 -f
af tui -p myappprog ready --> aetherflow picks up --> agent spawned --> work happens
|
prog log <----------+
prog log <----------+
prog done <---------+
- Tasks are created in prog (
prog add ...) - The daemon polls
prog ready -p <project>on an interval - For each ready task, an opencode session is spawned with a structured prompt
- The agent works in an isolated git worktree (
.aetherflow/worktrees/<task-id>) - Progress is logged back to prog (
prog log <id> "message") - On completion, the agent either creates a PR or merges to main
aetherflow uses prog's status system to coordinate the full task lifecycle:
| Status | Who sets it | What it means |
|---|---|---|
open |
You or planner | Task exists but hasn't been picked up |
in_progress |
Daemon (via prog start) |
An agent is actively working on it |
reviewing |
Agent (via prog review) |
Work is complete, PR created, awaiting merge (normal mode only) |
done |
Agent or reconciler | Branch merged, task complete |
blocked |
Agent (via prog block) |
Agent hit a wall -- needs human or re-planning |
draft |
Agent (via prog draft) |
Task needs planning -- agent may set to draft if the task is not defined well-enough |
canceled |
You | Task is no longer needed |
The daemon only picks up tasks in open status that have no unmet dependencies (prog ready handles this). Once claimed, the task moves through in_progress -> reviewing -> done (normal mode) or in_progress -> done (solo mode).
Agents use prog's context engine to avoid rediscovering what previous agents already learned:
# Before starting work, agents read task context
prog show ts-a1b2c3 # Task details, logs, deps
prog context -c auth -p myapp # Relevant learnings from past agents
# After finishing, agents capture what they learned
prog learn "Rate limiter needs Redis for distributed deploys" -c infra -p myappThis creates a flywheel: each agent session makes the next one smarter. Learnings are categorized by concept and project so agents can query for relevant knowledge before starting work.
Every worker agent follows a fixed state machine. The daemon renders a role prompt (embedded in the binary or overridden from disk) and passes it to opencode run as the first message. The agent then works autonomously.
orient -> feedback loop -> implement -> verify -> review -> fix -> land
Read the task, understand what to build, fill knowledge gaps.
The agent starts by reading the task from prog (prog show <task-id>), which includes the description (why/context) and definition of done (what done looks like). It checks for relevant learnings from past agents via prog context, reads any handoff notes left by a previous agent that crashed or yielded, and sets up a git worktree at .aetherflow/worktrees/<task-id>.
If the task mentions unfamiliar technologies, the agent researches them before writing any code. The research checklist is: project learnings (prog context), project docs, existing codebase patterns, Context7 docs, and web fetch. The gate is: "What exactly am I building, where does it go, and how will I verify it works?" If the agent can't answer all three, it either researches more or yields.
Establish verification before writing any code.
If the definition of done includes a verification command, the agent runs it now to see the current state (it should fail -- that's the red-to-green signal). If not, the agent creates one: a test, a curl command, a smoke test. The point is to have a fast feedback loop before implementation starts. Tests use the project's test framework and go where tests live in the project.
Write the code. Run the feedback loop frequently -- after every meaningful change, not just at the end. Fast inner loop: edit -> verify -> adjust.
Agents checkpoint aggressively. Context windows are finite, and if the session compacts, the next continuation only knows what's in git and prog. Agents commit after every logical unit of work and log progress to prog (prog log <id> "..."). The bar is: if you lost all memory right now, could you reconstruct where you are from git log + prog logs + file state?
Full verification pass: the DoD's verification command, full test suite, lint, build.
The agent checks that artifacts match code -- changed behavior means updated help text, added features mean current docs, new code means tests written. Failures in code the agent changed go to the fix cycle. Pre-existing failures that exist on main get filed as new tasks (prog add) and are not the agent's problem.
The agent loads the review-auto skill, which spawns parallel review subagents on the diff. Each reviewer gets a fresh context (no sunk cost in the implementation) and returns prioritized findings. See Bundled Skills for details on which reviewers run.
Address all review findings. The agent deduplicates across reviewers (multiple reviewers often flag the same issue, keeping the highest severity), discards failed reviews, and fixes every P1, P2, and P3 before landing. After fixes, the agent returns to verify. If there are no actionable findings, proceed to land.
Final verification, then ship, then compound knowledge.
In normal mode: push the branch, create a PR, clean up the worktree, call prog review <task-id>. The daemon's reconciler will detect when the branch is merged to main and automatically call prog done.
In solo mode: pull latest main, merge the branch with --no-ff, push main, clean up branch and worktree, call prog done <task-id>. If merge conflicts can't be resolved cleanly, the agent aborts and yields with prog block.
After landing, the agent loads the compound-auto skill to capture solution documentation, update the feature matrix, log learnings, and write a handoff summary.
Agents monitor their own progress. They're stuck if:
- Same approach tried 3 times with similar edits and the same test keeps failing
- In the fix cycle more than 5 times without the review getting cleaner
- Can't figure out how to verify the DoD
- The task description doesn't match the codebase (references code/APIs that don't exist)
- Unsure whether they're building the right thing
When stuck:
- Log everything tried and why it didn't work:
prog log <id> "Tried X, Y, Z -- all failed because..." - Yield the task:
prog block <id> "<reason>"-- the daemon will respawn a fresh agent with the notes - Stop. Don't keep thrashing.
When the task itself is the problem (DoD is really multiple tasks, or needs re-planning):
- Log the scope issue:
prog log <id> "Scope issue: <what's wrong>" - Send it back to draft:
prog draft <id>-- a planner can re-break it
The handoff protocol ensures that when a new agent picks up a yielded task, it inherits everything the previous agent learned -- including what didn't work. This is persisted in prog logs (prog show <id> includes all logs), not in the git worktree, so it survives agent crashes.
Used at: session end, blocked/escalation, task yield, task completion.
Agents write handoff summaries to the task log (not the task description, which is the original specification):
prog log <task-id> "Handoff: <full summary>"Handoffs include:
- What was done
- What is currently being worked on
- Which files are being modified
- What needs to be done next
- What was tried and didn't work, and why
- Key constraints or decisions that should persist
The task description (prog desc) is the original specification. Overwriting it destroys context that future agents need. The log is append-only and the next agent reads it via prog show.
Agents push a branch (af/<task-id>) and create a PR. The agent calls prog review to signal work is complete. The daemon's reconciler runs on a timer (--reconcile-interval, default 30s), fetches main from origin, and checks if the branch is an ancestor of main. When it is (or the branch no longer exists), the reconciler calls prog done to close the task.
agent finishes -> prog review -> PR created -> someone merges PR
|
reconciler detects merge <------+
prog done (auto)
Agents merge to main directly and call prog done themselves. No PR, no reconciler. Use for single-agent workflows or when you want autonomous end-to-end delivery.
agent finishes -> merge to main -> prog done
If the merge has conflicts the agent can't resolve, it aborts and yields with prog block.
Two persistent processes: the aetherflow daemon and a shared opencode server. Everything else (agents, tasks, learnings) is ephemeral or lives in prog.
daemon opencode server
(process supervisor) (shared, managed)
| |
af spawn --------> spawn registry plugin events
prog ready ------> poll -> pool -> spawn ------> agent sessions
reap -> respawn <--- session.event RPC
event buffer <--- tool calls, lifecycle
reconcile (reviewing->done)
reclaim (orphaned tasks)
All agents connect to a shared opencode server via opencode run --attach <url>. The daemon starts this server automatically on startup and supervises it (restarting if it crashes). The server URL defaults to http://127.0.0.1:4096 and is configurable via --server-url or server_url in the config file.
The AETHERFLOW_SOCKET env var is set on the server process so the aetherflow plugin knows where to send events. Each agent process gets AETHERFLOW_AGENT_ID set to its unique name for session correlation.
Observability flows through a plugin on the opencode server, not through log files. The aetherflow plugin (~/.config/opencode/plugins/aetherflow-events.ts) intercepts session lifecycle events and forwards them to the daemon over its Unix socket via the session.event RPC.
Event buffer (eventbuf.go) -- a session-keyed ring buffer storing up to 10K events per session. Idle sessions are evicted after 48 hours so overnight runs are reviewable the next day. The buffer is the single source of truth for af logs, af status <agent>, and the TUI.
Session claiming -- when a session.created event arrives, the daemon matches the AETHERFLOW_AGENT_ID from the event to an unclaimed pool agent or spawn registry entry. This correlates the opencode session ID to the aetherflow agent, enabling event routing.
Backfill -- on daemon startup, existing sessions are fetched from the opencode server's REST API (/session) and pushed into the event buffer. This covers agents that started before the daemon (re)started.
The global session registry tracks the mapping between aetherflow agents and opencode sessions. It persists to disk so session metadata survives daemon restarts.
Location: ~/.config/aetherflow/sessions/sessions.json (override with session_dir in config)
Schema (v1):
{
"schema_version": 1,
"records": [
{
"server_ref": "http://127.0.0.1:4096",
"session_id": "abc123",
"directory": "/path/to/project",
"project": "myapp",
"origin_type": "spawn",
"work_ref": "task-id-or-prompt-hash",
"agent_id": "worker-ts-a1b2c3",
"status": "active",
"created_at": "2026-02-19T12:00:00Z",
"last_seen_at": "2026-02-19T12:05:00Z",
"updated_at": "2026-02-19T12:05:00Z"
}
]
}Fields:
| Field | Description |
|---|---|
server_ref |
Opencode server URL this session belongs to |
session_id |
Opencode session ID (from session.created event) |
origin_type |
How the session was created: pool (auto-scheduled), spawn (af spawn), manual |
agent_id |
Aetherflow agent name (e.g., worker-ts-a1b2c3) |
work_ref |
Task ID (pool/spawn) or prompt reference |
status |
active, idle, terminated, stale |
Concurrency: The registry uses flock(2) file locking for safe concurrent access from multiple daemon processes. Writes use atomic rename (write to temp file, rename into place) to prevent corruption.
Troubleshooting:
- Stale entries: If
af sessionsshows sessions that no longer exist on the server, they'll be markedstaleon the next status check. This is harmless -- stale entries are ignored by the daemon. - Corrupt registry: Delete
~/.config/aetherflow/sessions/sessions.jsonand restart the daemon. It rebuilds from live server state on startup. - Permission errors: The sessions directory uses
0700and files use0600. Check ownership if you see permission denied errors.
The daemon runs several concurrent loops. In --spawn-policy=manual (the default), auto task lifecycle loops are disabled (poll/reclaim/reconcile). Manual mode handles af spawn agents and their observability.
Poller (auto mode only) -- calls prog ready -p <project> on an interval to discover unblocked tasks. Returns a list of task IDs and titles. The poller runs in its own goroutine and sends batches to the pool via a channel.
Pool (auto mode only) -- manages a fixed number of agent slots (--pool-size, default 3). When a batch of ready tasks arrives from the poller, the pool assigns them to free slots. Each slot runs one opencode session. The pool tracks agents by task ID, not by process, so it knows which task each agent is working on.
Spawn registry -- tracks agents spawned via af spawn (outside the pool). Registration is best-effort via the spawn.register RPC. Entries transition from running to exited when the agent process dies, and are kept for 1 hour after exit so af status <agent> works post-mortem. A periodic sweep checks PID liveness and removes stale entries.
Spawn sequence: For each task, the pool:
- Fetches task metadata from prog (
prog show --json) to infer the agent role - Renders the role prompt template, replacing
{{task_id}}and landing instructions - Claims the task in prog (
prog start <id>) - Launches an opencode session via
opencode run --attach <server-url>with the rendered prompt
All fallible prep (1-2) happens before claiming (3) so a failure doesn't orphan the task in in_progress with no agent.
Reaper -- each spawned agent gets a background goroutine that calls Wait() on the process. When the process exits:
- Clean exit (code 0): slot is freed, retry count cleared
- Crash (non-zero): retry counter incremented. If under
--max-retries, the agent is respawned on the same task (it's alreadyin_progressin prog, soprog startis skipped). If over the limit, the slot is freed and the task is left inin_progressfor manual recovery.
Sweep -- a safety net that runs every 30s. Checks PID liveness via kill(pid, 0) for every tracked agent. If a PID is gone but the reap goroutine is stuck on Wait() (observed with Setsid session leaders), the sweep force-removes the dead agent from the pool.
Reclaim (auto mode only) -- on daemon startup, finds tasks that are in_progress in prog but have no running agent. These are orphans from a previous daemon session that crashed. The daemon respawns agents for these tasks (up to pool capacity), using the same respawn path as crash recovery.
Reconciler (auto mode, normal landing only) -- periodically checks if reviewing tasks have been merged to main. Fetches main from origin (git fetch origin main), then for each reviewing task checks git merge-base --is-ancestor af/<id> main. If the branch is merged (or already deleted), calls prog done. This closes the loop between an agent calling prog review and the task reaching its terminal state.
Each agent runs in an isolated git worktree at .aetherflow/worktrees/<task-id>. This means:
- Concurrent agents don't clobber each other's files
- Each agent has its own branch (
af/<task-id>) - The project root stays on main (agents can read it for reference but all edits go in the worktree)
- Worktrees persist across agent crashes, so a respawned agent can continue where the last one left off
Agents run as child processes of the daemon (pool agents) or the af spawn CLI process. Each gets:
- Its own process group (
Setsid: true) so terminal signals don't propagate AETHERFLOW_AGENT_IDenvironment variable for session correlation- Observability via the plugin event pipeline (no log files)
- stderr passed through to the parent's stderr
The spawn command is configurable (--spawn-cmd, default opencode run --attach http://127.0.0.1:4096 --format json). If the command doesn't include --attach, the daemon automatically appends it with the configured server URL. The rendered prompt is appended as the final argument.
Each agent gets a memorable name (e.g., worker-ts-a1b2c3) generated by the protocol package. Names are unique within a daemon session and released back to the pool when the agent exits.
The interactive terminal dashboard (af tui) provides a k9s-style interface for monitoring the swarm. Built with Bubble Tea.
The main screen shows:
- Header: pool utilization (e.g.,
2/3 active), pool mode ([draining]/[paused]), project name - Agent panes: one bordered pane per running agent, showing agent name, task ID, task title, uptime, role, and a table of recent tool calls (age, tool name, input summary, duration)
- Queue: pending tasks with IDs, priorities, and titles
- Footer: keybinding help
Navigate with j/k, press enter to drill into an agent.
A two-column detail view for a single agent:
Left column (stacked panes):
- Agent metadata: name, PID, role, uptime, spawn time, opencode session ID
- Tool calls: scrollable table of all tool invocations with timestamps, durations, and input summaries
- Prog logs: all
prog logentries for this task, timestamped
Right column:
- Task info: full task detail from
prog show-- title, description, definition of done, status, priority, labels, dependencies
Cycle focus between panes with tab/shift+tab. Scroll the focused pane with j/k. Press l to enter the full-screen log stream.
Full-screen event log viewer that reads from the daemon's event buffer. Auto-scrolls to follow new output ([follow] indicator). Disable auto-scroll by scrolling up; re-enable with G (jump to bottom). Press g to jump to top.
| Screen | Key | Action |
|---|---|---|
| Dashboard | j/k |
Navigate agent panes |
| Dashboard | enter |
Open agent panel |
| Dashboard | q/esc |
Quit |
| Panel | tab/shift+tab |
Cycle pane focus |
| Panel | j/k |
Scroll focused pane |
| Panel | l |
Open log stream |
| Panel | q/esc |
Back to dashboard |
| Log Stream | j/k |
Scroll |
| Log Stream | g |
Jump to top |
| Log Stream | G |
Jump to bottom + follow |
| Log Stream | q/esc |
Back to panel |
af install copies bundled skills, agent definitions, and plugins into your opencode config directory (~/.config/opencode/). These are the tools and infrastructure agents use during their work.
Installed to ~/.config/opencode/plugins/aetherflow-events.ts. This is the event pipeline plugin that streams opencode session events to the aetherflow daemon.
How it works: The plugin hooks into opencode's event system and forwards every event (tool calls, messages, session lifecycle) to the daemon's Unix socket via the session.event RPC. Events are keyed by opencode session ID; the daemon correlates sessions to agents internally.
Configuration: The plugin is controlled entirely by environment variables set automatically by the daemon:
| Variable | Set on | Purpose |
|---|---|---|
AETHERFLOW_SOCKET |
opencode server process | Unix socket path for event delivery. When absent, the plugin is completely inert. |
AETHERFLOW_AGENT_ID |
agent processes | Agent name for session correlation (used by daemon, not the plugin). |
No manual configuration is needed. af install places the file, and the daemon sets the env vars when it starts the opencode server. If the daemon isn't running, the plugin does nothing.
review-auto -- Autonomous code review using parallel subagent reviewers. Spawned during the review phase of the worker protocol. Gathers the diff, launches 6 reviewer agents in parallel, collects and deduplicates their findings, and returns a prioritized list (P1/P2/P3). Each reviewer gets a fresh context with no knowledge of the implementation, so they review the code with fresh eyes.
compound-auto -- Knowledge compounding at task completion. Spawned during the land phase. Analyzes the work session, extracts and documents non-trivial solutions (to docs/solutions/), updates the feature matrix if one exists, logs genuine learnings for future agents, and writes a handoff summary.
The review skill spawns these 6 agents in parallel:
| Agent | Focus |
|---|---|
| code-reviewer | Bugs, correctness, logic errors. Strict on existing code modifications, pragmatic on new isolated code. Focuses on clarity, testability, maintainability. |
| code-simplicity-reviewer | Unnecessary complexity and simplification opportunities. YAGNI violations, over-abstraction, dead code. |
| security-sentinel | Security vulnerabilities. Input validation, authentication, authorization, injection, secrets exposure. |
| architecture-strategist | Coupling, cohesion, boundary compliance. Evaluates whether the change fits the system's architecture. |
| grug-brain-reviewer | Overengineering and debuggability. Expression simplicity, logging adequacy, API ergonomics, testing philosophy. Speaks in grug voice. |
| tigerstyle-reviewer | Safety, assertion density, explicit limits, control flow. NASA Power of Ten rules, assertion-driven design. |
Two additional agents are installed but not part of the default review suite:
| Agent | Focus |
|---|---|
| performance-oracle | Algorithmic complexity, cache efficiency, scalability, hot paths. |
| agent-native-reviewer | Ensures features are agent-native -- any user action has an agent equivalent with full context parity. |
The pool has three modes that control scheduling behavior:
| Command | Mode | Scheduling | Crash Respawns | Use When |
|---|---|---|---|---|
| (default) | active |
Yes | Yes | Normal operation |
af drain |
draining |
No | Yes | Finishing current work, no new tasks |
af pause |
paused |
No | No | Full stop -- existing agents run but won't be restarted |
af resume |
active |
Yes | Yes | Return to normal after drain/pause |
Drain allows crash respawns because those tasks are already claimed in prog -- leaving them without an agent would orphan them. Pause stops everything, including respawns.
Tasks that arrive during drain or pause are not lost -- they stay in the prog queue and will be picked up on the next poll cycle after af resume.
Create .aetherflow.yaml in the project directory:
project: myapp
# poll_interval: 10s
# pool_size: 3
# spawn_cmd: opencode run --attach http://127.0.0.1:4096 --format json
# server_url: http://127.0.0.1:4096
# spawn_policy: manual # manual | auto (auto = poll prog and auto-schedule)
# max_retries: 3
# solo: false
# reconcile_interval: 30s
# Config-file-only settings (no CLI flag):
# prompt_dir: "" # Override embedded prompts with files from this directoryCLI flags override config file values. Config file overrides defaults.
| Flag | Default | Description |
|---|---|---|
--project |
(required for auto) | Prog project to watch for tasks |
--poll-interval |
10s |
How often to poll prog for tasks |
--pool-size |
3 |
Maximum concurrent agent slots |
--spawn-cmd |
opencode run --attach <server-url> --format json |
Command to launch agent sessions |
--server-url |
http://127.0.0.1:4096 |
Opencode server URL for server-first launches |
--spawn-policy |
manual |
manual is spawn-only, auto polls/schedules from prog |
--max-retries |
3 |
Max crash respawns per task |
--solo |
false |
Agents merge to main directly instead of creating PRs (applies to both af spawn and af daemon start) |
--reconcile-interval |
30s |
How often to check if reviewing tasks are merged |
-d / --detach |
false |
Run in background |
Socket paths are derived automatically from the project name. Each project gets an isolated socket so multiple daemons can run side-by-side. Custom socket paths are not user-configurable.
--project is required when --spawn-policy=auto, and optional when --spawn-policy=manual.
Manual mode without a project uses the global default socket path. Starting a second daemon on the same socket fails fast.
| Command | Description |
|---|---|
af spawn "<prompt>" |
Spawn a one-off agent with a freeform prompt |
af spawn "<prompt>" -d |
Spawn in background (detached) |
af spawn "<prompt>" --solo |
Agent merges to main instead of creating a PR |
af spawn "<prompt>" --json |
Output spawn metadata as JSON |
| Command | Description |
|---|---|
af daemon start |
Start the daemon (manages opencode server, RPC socket, event pipeline) |
af daemon start --solo |
All pool agents merge to main instead of creating PRs |
af daemon start --spawn-policy auto |
Enable automatic task scheduling from prog |
af daemon stop |
Stop the daemon |
af daemon |
Quick status check (running/not running) |
| Command | Description |
|---|---|
af status |
Swarm overview -- pool utilization, active agents, queue |
af status <agent> |
Agent detail -- task info, uptime, recent tool calls |
af status -w |
Watch mode -- continuous refresh |
af status --json |
Machine-readable output |
af logs <agent> -f |
Tail an agent's event stream (from daemon's event buffer) |
af logs <agent> --raw |
Raw events instead of formatted output |
af sessions |
List known opencode sessions from the global registry |
af sessions --json |
Machine-readable session list |
af session attach <id> |
Attach interactively to a session |
af tui |
Interactive terminal dashboard (k9s-style) |
| Command | Description |
|---|---|
af drain |
Stop scheduling new tasks, let current work finish |
af pause |
Freeze pool -- no scheduling or respawns |
af resume |
Resume normal scheduling |
| Command | Description |
|---|---|
af install |
Install bundled skills, agents, and plugins to opencode config |
af install --dry-run |
Preview what would be installed |
af install --check |
Exit 0 if up-to-date, 1 if install needed |
af install --json |
Structured JSON output for automation |
Custom task sources. The daemon currently requires prog as the task backend. A plugin interface for task sources would let you swap in Linear, GitHub Issues, Jira, or a simple JSON file -- anything that can answer "what's ready?" and "mark this as started."
External triggers. Spawn agents from Slack, Linear, Discord, or any webhook. A lightweight API layer that accepts a prompt and queues it into the pool.
Remote sandboxes. Run agents in isolated cloud environments instead of local processes. Sprites and similar sandboxing runtimes would let you scale beyond your machine and provide stronger isolation between concurrent agents.
MIT