OmO
Oh My OpenAgentv4.7.5

Task System

File-based task persistence with dependencies and parallel execution. Survives session restarts.

OmO replaces TodoWrite/TodoRead with a real task system when experimental.task_system: true (default since v3.14). Tasks live in .sisyphus/tasks/ as JSON files, support dependencies, and survive session restarts.

Tools

ToolPurpose
task_createCreate a task with auto-generated ID T-{uuid}.
task_getRetrieve a task by ID.
task_listList all active tasks (or filter by status).
task_updateUpdate status, owner, dependencies, metadata.

Schema

interface Task {
  id: string;                                          // T-{uuid}
  subject: string;                                     // Imperative: "Run tests"
  description: string;
  status: "pending" | "in_progress" | "completed" | "deleted";
  activeForm?: string;                                  // Present continuous: "Running tests"
  blocks: string[];                                    // Tasks this blocks
  blockedBy: string[];                                 // Tasks blocking this
  owner?: string;                                      // Agent name
  metadata?: Record<string, unknown>;
  threadID: string;                                    // Session ID (auto-set)
}

Dependencies + parallel execution

[Build Frontend]    ──┐
                      ├──→ [Integration Tests] ──→ [Deploy]
[Build Backend]     ──┘

Tasks with empty blockedBy run in parallel. Dependent tasks wait until blockers complete.

Vs TodoWrite

FeatureTodoWriteTask System
StorageSession memory.sisyphus/tasks/ (JSON files)
PersistenceLost on closeSurvives restart
DependenciesNoneblocks / blockedBy
Parallel executionManualAutomatic

When to use

Multi-step work with dependencies, multi-agent collaboration, or anything that should survive a session restart. Trivial single-step tasks stay on TodoWrite.

Source Notes

Aligned with upstream docs/reference/features.md#task-management-tools. The hook that swaps TodoWrite/TodoRead for task_* is tasks-todowrite-disabler. Storage path is configurable via sisyphus.tasks.storage_path in Configuration.

On this page