# Plan tasks with todos

Keep complex jobs on the rails with Gemini CLI's built-in task planning. In this
guide, you'll learn how to ask for a plan, execute it step-by-step, and monitor
progress with the todo list.

## Prerequisites

- Gemini CLI installed and authenticated.
- A complex task in mind (for example, a multi-file refactor or new feature).

## Why use task planning?

Standard LLMs have a limited context window and can "forget" the original goal
after 10 turns of code generation. Task planning provides:

1.  **Visibility:** You see exactly what the agent plans to do _before_ it
    starts.
2.  **Focus:** The agent knows exactly which step it's working on right now.
3.  **Resilience:** If the agent gets stuck, the plan helps it get back on
    track.

## How to ask for a plan

The best way to trigger task planning is to explicitly ask for it.

**Prompt:**
`I want to migrate this project from JavaScript to TypeScript. Please make a plan first.`

Gemini will analyze your codebase and use the `write_todos` tool to generate a
structured list.

**Example Plan:**

1.  [ ] Create `tsconfig.json`.
2.  [ ] Rename `.js` files to `.ts`.
3.  [ ] Fix type errors in `utils.js`.
4.  [ ] Fix type errors in `server.js`.
5.  [ ] Verify build passes.

## How to review and iterate

Once the plan is generated, it appears in your CLI. Review it.

- **Missing steps?** Tell the agent: "You forgot to add a step for installing
  `@types/node`."
- **Wrong order?** Tell the agent: "Let's verify the build _after_ each file,
  not just at the end."

The agent will update the todo list dynamically.

## How to execute the plan

Tell the agent to proceed.

**Prompt:** `Looks good. Start with the first step.`

As the agent works, you'll see the todo list update in real-time above the input
box.

- **Current focus:** The active task is highlighted (for example,
  `[IN_PROGRESS] Create tsconfig.json`).
- **Progress:** Completed tasks are marked as done.

## How to monitor progress (`Ctrl+T`)

For a long-running task, the full todo list might be hidden to save space. You
can toggle the full view at any time.

**Action:** Press **Ctrl+T**.

This shows the complete list, including pending, in-progress, and completed
items. It's a great way to check "how much is left?" without scrolling back up.

## How to handle unexpected changes

Plans change. Maybe you discover a library is incompatible halfway through.

**Prompt:**
`Actually, let's skip the 'server.js' refactor for now. It's too risky.`

The agent will mark that task as `cancelled` or remove it, and move to the next
item. This dynamic adjustment is what makes the todo system powerful—it's a
living document, not a static text block.

## Next steps

- Explore [Session management](session-management.md) to save your plan and
  finish it tomorrow.
- See the [Todo tool reference](../../tools/todos.md) for technical schema
  details.
- Learn about [Memory management](memory-management.md) to persist planning
  preferences (for example, "Always create a test plan first").
