# Task Manager for AI Agents
The task manager is a dependency-aware issue tracker inspired by beads. It uses:
- **Storage**: SQLite database (`~/.cache/omni/tasks/tasks.db`)
- **Dependencies**: Tasks can block other tasks
- **Ready work detection**: Automatically finds unblocked tasks
**IMPORTANT**: You MUST use `task` for ALL issue tracking. NEVER use markdown TODOs, todo_write, task lists, or any other tracking methods.
## Human Setup vs Agent Usage
**If you see "database not found" or similar errors:**
```bash
task init --quiet # Non-interactive, auto-setup, no prompts
```
**Why `--quiet`?** The regular `task init` may have interactive prompts. The `--quiet` flag makes it fully non-interactive and safe for agent-driven setup.
**If `task init --quiet` fails:** Ask the human to run `task init` manually, then continue.
## Create a Task
```bash
task create "
" [--type=] [--parent=] [--deps=] [--dep-type=] [--discovered-from=] [--namespace=]
```
Examples:
```bash
# Create an epic (container for tasks)
task create "User Authentication System" --type=epic
# Create a task within an epic
task create "Design auth API" --parent=t-abc123
# Create a task with blocking dependency
task create "Write tests" --deps=t-a1b2c3 --dep-type=blocks
# Create work discovered during implementation (shortcut)
task create "Fix memory leak" --discovered-from=t-abc123
# Create related work (doesn't block)
task create "Update documentation" --deps=t-abc123 --dep-type=related
# Associate with a namespace
task create "Fix type errors" --namespace="Omni/Task"
```
**Task Types:**
- `epic` - Container for related tasks
- `task` - Individual work item (default)
- `human` - Task specifically for human operators (excluded from agent work queues)
**Dependency Types:**
- `blocks` - Hard dependency, blocks ready work queue (default)
- `discovered-from` - Work discovered during other work, doesn't block
- `parent-child` - Epic/subtask relationship, blocks ready work
- `related` - Soft relationship, doesn't block
The `--namespace` option associates the task with a specific namespace in the monorepo (e.g., `Omni/Task`, `Biz/Cloud`). This helps organize tasks by the code they relate to.
## List Tasks
```bash
task list [options] # Flags can be in any order
```
Examples:
```bash
task list # All tasks
task list --type=epic # All epics
task list --parent=t-abc123 # All tasks in an epic
task list --status=open # All open tasks
task list --status=done # All completed tasks
task list --namespace="Omni/Task" # All tasks for a namespace
task list --parent=t-abc123 --status=open # Combine filters: open tasks in epic
```
## Get Ready Work
```bash
task ready
```
Shows all tasks that are:
- Not closed
- Not blocked by incomplete dependencies
## Update Task Status
```bash
task update
```
Status values: `open`, `in-progress`, `done`
Examples:
```bash
task update t-20241108120000 in-progress
task update t-20241108120000 done
```
**Note**: Task updates are immediately saved to the SQLite database.
## View Dependencies
```bash
task deps
```
Shows the dependency tree for a task.
## View Task Tree
```bash
task tree []
```
Shows task hierarchy with visual status indicators:
- `[ ]` - Open
- `[~]` - In Progress
- `[✓]` - Done
Examples:
```bash
task tree # Show all epics with their children
task tree t-abc123 # Show specific epic/task with its children
```
## Export Tasks
```bash
task export [-o ]
```
Exports tasks to JSONL format (stdout by default, or to a file with `-o`).
## Import Tasks
```bash
task import -i
```
Imports tasks from a JSONL file, merging with existing tasks. Newer tasks (based on `updatedAt` timestamp) take precedence.
Examples:
```bash
task import -i /path/to/backup.jsonl
```
## Initialize (First Time)
```bash
task init
```
Creates the SQLite database at `~/.cache/omni/tasks/tasks.db`.
## Common Workflows
### Starting New Work
1. **Find what's ready to work on:**
```bash
task ready
```
2. **Pick a task and mark it in progress:**
```bash
task update t-20241108120000 in-progress
```
3. **When done, mark it complete:**
```bash
task update t-20241108120000 done
```
### Creating Dependent Tasks
When you discover work that depends on other work:
```bash
# Create the blocking task first
task create "Design API" --type=task
# Note the ID (e.g., t-20241108120000)
# Create dependent task with blocking dependency
task create "Implement API client" --deps=t-20241108120000 --dep-type=blocks
```
The dependent task won't show up in `task ready` until the blocker is marked `done`.
### Discovered Work Pattern
When you find work during implementation, use the `--discovered-from` flag:
```bash
# While working on t-abc123, you discover a bug
task create "Fix memory leak in parser" --discovered-from=t-abc123
# This is equivalent to:
task create "Fix memory leak in parser" --deps=t-abc123 --dep-type=discovered-from
```
The `discovered-from` dependency type maintains context but **doesn't block** the ready work queue. This allows AI agents to track what work was found during other work while still being able to work on it immediately.
### Working with Epics
```bash
# Create an epic for a larger feature
task create "User Authentication System" --type=epic
# Note ID: t-abc123
# Create child tasks within the epic
task create "Design login flow" --parent=t-abc123
task create "Implement OAuth" --parent=t-abc123
task create "Add password reset" --parent=t-abc123
# List all tasks in an epic
task list --parent=t-abc123
# List all epics
task list --type=epic
```
## Agent Best Practices
### 1. ALWAYS Check Ready Work First
Before asking what to do, you MUST check `task ready --json` to see unblocked tasks.
### 2. ALWAYS Create Tasks for Discovered Work
When you encounter work during implementation, you MUST create linked tasks:
```bash
task create "Fix type error in auth module" --discovered-from=t-abc123 --json
task create "Add missing test coverage" --discovered-from=t-abc123 --json
```
**Bug Discovery Pattern**
When you discover a bug or unexpected behavior:
```bash
# CORRECT: Immediately file a task
task create "Command X fails when Y" --discovered-from= --json
# WRONG: Ignoring it and moving on
# WRONG: Leaving a TODO comment
# WRONG: Mentioning it but not filing a task
```
**Examples of bugs you MUST file:**
- "Expected `--flag value` to work but only `--flag=value` works"
- "Documentation says X but actual behavior is Y"
- "Combining two flags causes parsing error"
- "Feature is missing that would be useful"
**CRITICAL: File bugs immediately when you discover them:**
- If a command doesn't work as documented → create a task
- If a command doesn't work as you expected → create a task
- If behavior is inconsistent or confusing → create a task
- If documentation is wrong or misleading → create a task
- If you find yourself working around a limitation → create a task
**NEVER leave TODO comments in code.** Create a task instead.
**NEVER ignore bugs or unexpected behavior.** File a task for it immediately.
### 3. Forbidden Patterns
**Markdown checklist (NEVER do this):**
```markdown
❌ Wrong:
- [ ] Refactor auth module
- [ ] Add tests
- [ ] Update docs
✅ Correct:
task create "Refactor auth module" -p 2 --json
task create "Add tests for auth" -p 2 --json
task create "Update auth docs" -p 3 --json
```
**todo_write tool (NEVER do this):**
```
❌ Wrong: todo_write({todos: [{content: "Fix bug", ...}]})
✅ Correct: task create "Fix bug in parser" -p 1 --json
```
**Inline code comments (NEVER do this):**
```python
❌ Wrong:
# TODO: write tests for this function
# FIXME: handle edge case
✅ Correct:
# Create task instead:
task create "Write tests for parse_config" -p 2 --namespace="Omni/Config" --json
task create "Handle edge case in parser" -p 1 --discovered-from= --json
```
### 4. Track Dependencies
If work depends on other work, use `--deps`:
```bash
# Can't write tests until implementation is done
task create "Test auth flow" --deps=t-20241108120000 --dep-type=blocks --json
```
### 5. Use Descriptive Titles
Good: `"Add JWT token validation to auth middleware"`
Bad: `"Fix auth"`
### 6. Use Epics for Organization
Organize related work using epics:
- Create an epic for larger features: `task create "Feature Name" --type=epic --json`
- Add tasks to the epic using `--parent=`
- Use `--discovered-from` to track work found during implementation
### 7. ALWAYS Store AI Planning Docs in `_/llm` Directory
AI assistants often create planning and design documents during development:
- PLAN.md, DESIGN.md, TESTING_GUIDE.md, tmp, and similar files
- **You MUST use a dedicated directory for these ephemeral files**
- Store ALL AI-generated planning/design docs in `_/llm`
- The `_` directory is ignored by git and all of our temporary files related to the omnirepo go there
- NEVER commit planning docs to the repo root
## Dependency Rules
- A task is **blocked** if any of its dependencies are not `done`
- A task is **ready** if all its dependencies are `done` (or it has no dependencies)
- `task ready` only shows tasks with status `open` or `in-progress` that are not blocked
## Storage
Tasks are stored in a SQLite database at `~/.cache/omni/tasks/tasks.db`. This is a local database, not git-tracked.
To back up or transfer tasks, use `task export` and `task import`.
## Testing and Development
**CRITICAL**: When manually testing task functionality, use the test database:
```bash
# Set test mode to protect production database
export TASK_TEST_MODE=1
# Now all task operations use _/tmp/tasks-test.db
task create "Test task" --type=task
task list
task tree
# Unset when done
unset TASK_TEST_MODE
```
**The test suite automatically uses test mode** - you don't need to set it manually when running `task test` or `bild --test Omni/Task.hs`.
## Troubleshooting
### "Task not found"
- Check the task ID is correct with `task list`
- Ensure you've run `task init`
### "Database not initialized"
Run: `task init`
### Dependencies not working
- Verify dependency IDs exist: `task list`
- Check dependency tree: `task deps `
## Reinforcement: Critical Rules
Remember these non-negotiable rules:
- ✅ Use `task` for ALL task tracking (with `--json` flag)
- ✅ Link discovered work with `--discovered-from` dependencies
- ✅ File bugs IMMEDIATELY when you discover unexpected behavior
- ✅ Check `task ready --json` before asking "what should I work on?"
- ✅ Store AI planning docs in `_/llm` directory
- ❌ NEVER use `todo_write` tool
- ❌ NEVER create markdown TODO lists or task checklists
- ❌ NEVER put TODOs or FIXMEs in code comments
- ❌ NEVER use external issue trackers
- ❌ NEVER duplicate tracking systems
- ❌ NEVER clutter repo root with planning documents
**If you find yourself about to use todo_write or create a markdown checklist, STOP and use `task create` instead.**