# Todo View

[← Docs index](./README.md)

Todo View is an experimental dashboard surface for personal/project todo lists that can feed directly into Fusion planning and task workflows.

## Overview

Todo View lets you:

- Create multiple todo lists per project
- Add, edit, complete, delete, and reorder todo items
- Start Planning Mode from any todo item (💡)
- Create a triage task from a todo item
- Create and immediately assign a task to an agent from a todo item

The feature is implemented in `TodoView.tsx` with data/state orchestration in `useTodoLists.ts` and backend routes in `packages/dashboard/src/todo-routes.ts`.

## Enablement (`experimentalFeatures.todoView`)

Todo View is hidden unless the global experimental flag is enabled:

```json
{
  "experimentalFeatures": {
    "todoView": true
  }
}
```

Behavior when disabled:

- Todo navigation entry is hidden from dashboard navigation menus
- If a user is currently on Todo View and the flag is turned off, the app redirects back to board view

## Accessing Todo View

When enabled:

- Desktop: header overflow menu (**More views**) → **Todos** (the only desktop Todos navigation entry)
- Mobile: **More** sheet in the mobile nav bar → **Todos**

## List management

In the left sidebar:

- **Create list**: plus button or empty-state action
- **Rename list**: pencil action
- **Delete list**: trash action (with confirm dialog)
- **Select active list**: clicking a list switches the main panel

Validation/API constraints:

- `title` is required
- `title` is trimmed
- `title` max length is 200 characters

## Item management

Within the selected list:

- **Add item** using input + Add button (or Enter)
- **Edit item text** inline
- **Toggle completion** via checkbox
- **Move up/down** to reorder items
- **Delete item** via trash action

Validation/API constraints:

- `text` is required
- `text` is trimmed
- `text` max length is 2000 characters
- Completion toggling uses `PATCH /api/todos/items/:id` with `completed: boolean` (no separate toggle endpoint)

## Planning integration

Each item has a planning action (💡):

- Opens Planning Mode with todo text as the initial plan
- Starts a planning interview flow
- Does not create a task until you complete planning and explicitly create one

See also: [Task Management → Todo item → Plan Mode](./task-management.md#3-todo-item--plan-mode).

## Task creation and agent delegation actions

Each item also has task actions:

- **Create task** (`+`): creates a new task in `triage` with todo text as description
- **Assign to agent** (bot icon): loads agents, then creates a new task in `triage` with `assignedAgentId`

Both actions use dashboard task creation APIs and preserve project scoping when a project is selected.

## API reference (current implementation)

Base prefix: `/api/todos`

### Lists

- `GET /api/todos` — list lists with embedded items
- `POST /api/todos` — create list (`{ title }`)
- `PATCH /api/todos/:id` — update list title (`{ title }`)
- `DELETE /api/todos/:id` — delete list

### Items

- `POST /api/todos/:id/items` — create item in list (`{ text }`)
- `PATCH /api/todos/items/:id` — update item (`{ text?; completed? }`)
- `DELETE /api/todos/items/:id` — delete item
- `POST /api/todos/:id/items/reorder` — reorder full list (`{ itemIds: string[] }`)

### Project scoping

`projectId` may be provided:

- Query parameter (for reads and route calls that include query string)
- Request body (supported by route resolver for mutating calls)

When omitted, Todo APIs operate against the default/local project scope (`""` project ID in TodoStore).

## Storage linkage

Todo data is persisted in the project SQLite database (`.fusion/fusion.db`) via:

- `todo_lists`
- `todo_items`

See [Storage](./storage.md) for the broader database/storage model.

## Related source-of-truth files

- `packages/dashboard/app/components/TodoView.tsx`
- `packages/dashboard/app/hooks/useTodoLists.ts`
- `packages/dashboard/src/todo-routes.ts`
- `packages/core/src/todo-store.ts`
- `packages/dashboard/src/__tests__/todo-routes.test.ts`
- `packages/dashboard/app/components/__tests__/TodoView.test.tsx`
